os/ossrv/glib/tests/gobject/ifacecheck.c
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/* GObject - GLib Type, Object, Parameter and Signal Library
sl@0
     2
 * Copyright (C) 2001, 2003 Red Hat, Inc.
sl@0
     3
 * Portions copyright (c) 2006-2009 Nokia Corporation.  All rights reserved.
sl@0
     4
 * This library is free software; you can redistribute it and/or
sl@0
     5
 * modify it under the terms of the GNU Lesser General Public
sl@0
     6
 * License as published by the Free Software Foundation; either
sl@0
     7
 * version 2 of the License, or (at your option) any later version.
sl@0
     8
 *
sl@0
     9
 * This library is distributed in the hope that it will be useful,
sl@0
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
sl@0
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
sl@0
    12
 * Lesser General Public License for more details.
sl@0
    13
 *
sl@0
    14
 * You should have received a copy of the GNU Lesser General
sl@0
    15
 * Public License along with this library; if not, write to the
sl@0
    16
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
sl@0
    17
 * Boston, MA 02111-1307, USA.
sl@0
    18
 */
sl@0
    19
sl@0
    20
#undef	G_LOG_DOMAIN
sl@0
    21
#define	G_LOG_DOMAIN "TestIfaceCheck"
sl@0
    22
sl@0
    23
#undef G_DISABLE_ASSERT
sl@0
    24
#undef G_DISABLE_CHECKS
sl@0
    25
#undef G_DISABLE_CAST_CHECKS
sl@0
    26
sl@0
    27
#include <string.h>
sl@0
    28
sl@0
    29
#include <glib-object.h>
sl@0
    30
sl@0
    31
#include "testcommon.h"
sl@0
    32
#ifdef __SYMBIAN32__
sl@0
    33
  #include "mrt2_glib2_test.h"
sl@0
    34
#endif /*__SYMBIAN32__*/
sl@0
    35
sl@0
    36
/* This test tests g_type_add_interface_check_func(), which allows
sl@0
    37
 * installing a post-initialization check function.
sl@0
    38
 */
sl@0
    39
sl@0
    40
#define TEST_TYPE_IFACE           (test_iface_get_type ())
sl@0
    41
#define TEST_IFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE, TestIfaceClass))
sl@0
    42
typedef struct _TestIfaceClass  TestIfaceClass;
sl@0
    43
sl@0
    44
struct _TestIfaceClass
sl@0
    45
{
sl@0
    46
  GTypeInterface base_iface;
sl@0
    47
  GString *history;
sl@0
    48
};
sl@0
    49
sl@0
    50
static void
sl@0
    51
test_iface_base_init (TestIfaceClass *iface)
sl@0
    52
{
sl@0
    53
  iface->history = g_string_new (iface->history ? iface->history->str : NULL);
sl@0
    54
}
sl@0
    55
sl@0
    56
static DEFINE_IFACE(TestIface, test_iface, test_iface_base_init, NULL)
sl@0
    57
sl@0
    58
/*
sl@0
    59
 * TestObject1
sl@0
    60
 */
sl@0
    61
#define TEST_TYPE_OBJECT1         (test_object1_get_type ())
sl@0
    62
typedef struct _GObject           TestObject1;
sl@0
    63
typedef struct _GObjectClass      TestObject1Class;
sl@0
    64
sl@0
    65
static DEFINE_TYPE_FULL (TestObject1, test_object1,
sl@0
    66
			 NULL, NULL, NULL,
sl@0
    67
			 G_TYPE_OBJECT,
sl@0
    68
			 INTERFACE (NULL, TEST_TYPE_IFACE))
sl@0
    69
     
sl@0
    70
/*
sl@0
    71
 * TestObject2
sl@0
    72
 */
sl@0
    73
#define TEST_TYPE_OBJECT2         (test_object2_get_type ())
sl@0
    74
typedef struct _GObject           TestObject2;
sl@0
    75
typedef struct _GObjectClass      TestObject2Class;
sl@0
    76
sl@0
    77
static DEFINE_TYPE_FULL (TestObject2, test_object2,
sl@0
    78
			 NULL, NULL, NULL,
sl@0
    79
			 G_TYPE_OBJECT,
sl@0
    80
			 INTERFACE (NULL, TEST_TYPE_IFACE))
sl@0
    81
     
sl@0
    82
/*
sl@0
    83
 * TestObject3
sl@0
    84
 */
sl@0
    85
#define TEST_TYPE_OBJECT3         (test_object3_get_type ())
sl@0
    86
typedef struct _GObject           TestObject3;
sl@0
    87
typedef struct _GObjectClass      TestObject3Class;
sl@0
    88
sl@0
    89
static DEFINE_TYPE_FULL (TestObject3, test_object3,
sl@0
    90
			 NULL, NULL, NULL,
sl@0
    91
			 G_TYPE_OBJECT,
sl@0
    92
			 INTERFACE (NULL, TEST_TYPE_IFACE))
sl@0
    93
     
sl@0
    94
/*
sl@0
    95
 * TestObject4
sl@0
    96
 */
sl@0
    97
#define TEST_TYPE_OBJECT4         (test_object4_get_type ())
sl@0
    98
typedef struct _GObject           TestObject4;
sl@0
    99
typedef struct _GObjectClass      TestObject4Class;
sl@0
   100
sl@0
   101
sl@0
   102
static DEFINE_TYPE_FULL (TestObject4, test_object4,
sl@0
   103
			 NULL, NULL, NULL,
sl@0
   104
			 G_TYPE_OBJECT, {})
sl@0
   105
sl@0
   106
static void
sl@0
   107
check_func (gpointer check_data,
sl@0
   108
	    gpointer g_iface)
sl@0
   109
{
sl@0
   110
  TestIfaceClass *iface = g_iface;
sl@0
   111
sl@0
   112
  g_string_append (iface->history, check_data);
sl@0
   113
}
sl@0
   114
sl@0
   115
int
sl@0
   116
main (int   argc,
sl@0
   117
      char *argv[])
sl@0
   118
{
sl@0
   119
  TestIfaceClass *iface;
sl@0
   120
  GObject *object;
sl@0
   121
  char *string1 = "A";
sl@0
   122
  char *string2 = "B";
sl@0
   123
#ifdef __SYMBIAN32__
sl@0
   124
  g_log_set_handler (NULL,  G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL);
sl@0
   125
  g_set_print_handler(mrtPrintHandler);
sl@0
   126
  #endif /*__SYMBIAN32__*/
sl@0
   127
  g_type_init ();
sl@0
   128
  
sl@0
   129
  /* Basic check of interfaces added before class_init time
sl@0
   130
   */
sl@0
   131
  g_type_add_interface_check (string1, check_func);
sl@0
   132
sl@0
   133
  object = g_object_new (TEST_TYPE_OBJECT1, NULL);
sl@0
   134
  iface = TEST_IFACE_GET_CLASS (object);
sl@0
   135
    g_assert (strcmp (iface->history->str, "A") == 0);
sl@0
   136
  g_object_unref (object);
sl@0
   137
sl@0
   138
  /* Add a second check function
sl@0
   139
   */
sl@0
   140
  g_type_add_interface_check (string2, check_func);
sl@0
   141
sl@0
   142
  object = g_object_new (TEST_TYPE_OBJECT2, NULL);
sl@0
   143
  iface = TEST_IFACE_GET_CLASS (object);
sl@0
   144
  g_assert (strcmp (iface->history->str, "AB") == 0);
sl@0
   145
  g_object_unref (object);
sl@0
   146
sl@0
   147
  /* Remove the first check function
sl@0
   148
   */
sl@0
   149
  g_type_remove_interface_check (string1, check_func);
sl@0
   150
sl@0
   151
  object = g_object_new (TEST_TYPE_OBJECT3, NULL);
sl@0
   152
  iface = TEST_IFACE_GET_CLASS (object);
sl@0
   153
  g_assert (strcmp (iface->history->str, "B") == 0);
sl@0
   154
  g_object_unref (object);
sl@0
   155
sl@0
   156
  /* Test interfaces added after class_init time
sl@0
   157
   */
sl@0
   158
  g_type_class_ref (TEST_TYPE_OBJECT4);
sl@0
   159
  {
sl@0
   160
    static GInterfaceInfo const iface = {
sl@0
   161
      NULL, NULL, NULL
sl@0
   162
    };
sl@0
   163
    
sl@0
   164
    g_type_add_interface_static (TEST_TYPE_OBJECT4, TEST_TYPE_IFACE, &iface);
sl@0
   165
  }
sl@0
   166
  
sl@0
   167
  object = g_object_new (TEST_TYPE_OBJECT4, NULL);
sl@0
   168
  iface = TEST_IFACE_GET_CLASS (object);
sl@0
   169
  g_assert (strcmp (iface->history->str, "B") == 0);
sl@0
   170
  g_object_unref (object);
sl@0
   171
  #ifdef __SYMBIAN32__
sl@0
   172
  testResultXml("ifacecheck");
sl@0
   173
  #endif /*__SYMBIAN32__*/
sl@0
   174
  return 0;
sl@0
   175
}