The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

GTypeModule

GTypeModule — Тип загружаемых модулей

Краткое описание


#include <glib-object.h>


                    GTypeModule;
                    GTypeModuleClass;
gboolean            g_type_module_use                   (GTypeModule *module);
void                g_type_module_unuse                 (GTypeModule *module);
void                g_type_module_set_name              (GTypeModule *module,
                                                         const gchar *name);
GType               g_type_module_register_type         (GTypeModule *module,
                                                         GType parent_type,
                                                         const gchar *type_name,
                                                         const GTypeInfo *type_info,
                                                         GTypeFlags flags);
void                g_type_module_add_interface         (GTypeModule *module,
                                                         GType instance_type,
                                                         GType interface_type,
                                                         const GInterfaceInfo *interface_info);
GType               g_type_module_register_enum         (GTypeModule *module,
                                                         const gchar *name,
                                                         const GEnumValue *const _static_values);
GType               g_type_module_register_flags        (GTypeModule *module,
                                                         const gchar *name,
                                                         const GFlagsValue *const _static_values);
#define             G_DEFINE_DYNAMIC_TYPE               (TN, t_n, T_P)
#define             G_DEFINE_DYNAMIC_TYPE_EXTENDED      (TypeName, type_name, TYPE_PARENT, flags, CODE)

Иерархия объектов


  GObject
   +----GTypeModule

Реализуемые интерфейсы

GTypeModule реализует GTypePlugin.

Описание

GTypeModule обеспечивает простую реализацию интерфейса GTypePlugin. Моделью GTypeModule является динамически загружаемый модуль который реализует некоторое количество реализаций типов и интерфейсов. Когда модуль загружен, происходит регистрация его типов и интерфейсов используя g_type_module_register_type() и g_type_module_add_interface(). Пока экземпляры этих типов и интерфейсов используются, модуль остаётся загруженным. Когда типы и интерфейсы больше не нужны, модуль может быть выгружен. Если типы и интерфейсы потребовались снова, модуль перезагружается. Помните что последний сброс ссылки не может произойти в коде модуля, так как это привело бы к выгрузке кода вызываемой программой прежде чем g_object_unref() вернёт значение.

Отслеживание загружен модуль или нет выполняется счётчиком использования - начиная с нуля, всегда когда счётчик больше нуля, модуль загружен. Счётчик использования внутренне поддерживается системой типов, но так же может явно контролироваться с помощью g_type_module_use() и g_type_module_unuse(). Обычно когда загружается модуль для первого типа, g_type_module_use() будет использована чтобы при загрузке могли инициализироваться его типы. Немного позже, когда модуль больше не должен быть загружен кроме как для реализации типа который содержит, вызывается g_type_module_unuse().

GTypeModule фактически не обеспечивает ни загрузки ни выгрузки модуля. Для создания специфичного модуля вы должны унаследовать GTypeModule и реализовать загрузку и выгрузку функций в GTypeModuleClass.

Детали

GTypeModule

typedef struct {
  gchar *name;
} GTypeModule;

Члены сструктуры GTypeModule не имеют непосредственного доступа, исключая поле name.

gchar *name; имя модуля

GTypeModuleClass

typedef struct {
  GObjectClass parent_class;

  gboolean (* load)   (GTypeModule *module);
  void     (* unload) (GTypeModule *module);
} GTypeModuleClass;

Для осуществления динамической загрузки типов основанных на GTypeModule, функции load и unload должны быть реализованы в GTypeModuleClass.

GObjectClass parent_class; родительский класс
load () загружает модуль и регистрирует один тип или больше используя g_type_module_register_type().
unload () выгружает модуль

g_type_module_use ()

gboolean            g_type_module_use                   (GTypeModule *module);

Увеличивает количество использований GTypeModule на единицу. Если количество использований перед этим было 0, модуль будет загружен.

module : GTypeModule
Возвращает : FALSE если необходимая загрузка модуля неудалась.

g_type_module_unuse ()

void                g_type_module_unuse                 (GTypeModule *module);

Уменьшает количество использований GTypeModule на единицу. Если результатом уменьшения будет 0, модуль выгружается. (Однако, GTypeModule не будет освобождена, а регистрация типов связанных с GTypeModule не отменяется. Как только GTypeModule инициализирована, она будет существовать всегда).

module : GTypeModule

g_type_module_set_name ()

void                g_type_module_set_name              (GTypeModule *module,
                                                         const gchar *name);

Устанавливает имя для GTypeModule

module : GTypeModule.
name : Удобное для чтения имя используемое в сообщениях об ошибках.

g_type_module_register_type ()

GType               g_type_module_register_type         (GTypeModule *module,
                                                         GType parent_type,
                                                         const gchar *type_name,
                                                         const GTypeInfo *type_info,
                                                         GTypeFlags flags);

Находит или регистрирует тип который реализуется специфичным типовым модулем. Если тип с именем type_name был предварительно зарегистрирован, возвращается GType идентифицирующий тип, иначе тип вновь регистрируется и возвращается результирующий GType идентификатор.

Когда перерегистрируется тип (обычно потому что модуль выгружен а зтем загружен снова, и переинициализирован), module и parent_type должны быть такими же как предыдущие.

Пока любые экземпляры типа существуют, модуль типа не будет выгружен.

module : GTypeModule
parent_type : тип для родительского класса
type_name : имя для типа
type_info : структура типовой информации
flags : поле флажков обеспечивающих детали о типе
Возвращает : новый или существующий ID типа

g_type_module_add_interface ()

void                g_type_module_add_interface         (GTypeModule *module,
                                                         GType instance_type,
                                                         GType interface_type,
                                                         const GInterfaceInfo *interface_info);

Регистрирует дополнительный интерфейс для типа, у которого уже есть интерфейс в данном типовом модуле. Если интерфейс уже был зарегистрирован для типа в данном модуле, ничего не происходит.

Пока существуют любые интерфейсы типа, типовой модуль не будет выгружен.

module : GTypeModule
instance_type : тип к которому добавляется интерфейс.
interface_type : интерфейсный тип для добавления
interface_info : структура типовой информации

g_type_module_register_enum ()

GType               g_type_module_register_enum         (GTypeModule *module,
                                                         const gchar *name,
                                                         const GEnumValue *const _static_values);

находит или регистрирует перечисление которое реализуется с помощью специфичного типового модуля. Если тип с именем type_name был предварительно зарегистрирован, возвращается GType идентификатор для типа, иначе тип вновь регистрируется и возвращается результирующий GType идентификатор.

Пока существуют любые экземпляры типа, типовой модуль не выгружается.

module : GTypeModule
name : имя для типа
_static_values :
Возвращает : новый или существующий ID типа

Начиная с версии 2.6


g_type_module_register_flags ()

GType               g_type_module_register_flags        (GTypeModule *module,
                                                         const gchar *name,
                                                         const GFlagsValue *const _static_values);

Находит или регистрирует флаги типа который реализован специфичным типовым модулем. Если тип с именем type_name был предварительно зарегистрирован, возвращается GType идентификатор типа, иначе тип вновь регистрируется и возвращается GType идентификатор.

Пока существует любой экземпляр типа, модуль не будет выгружен.

module : GTypeModule
name : имя для типа
_static_values :
Возвращает : новый или существующий ID типа

Начиная с версии 2.6


G_DEFINE_DYNAMIC_TYPE()

#define G_DEFINE_DYNAMIC_TYPE(TN, t_n, T_P)          G_DEFINE_DYNAMIC_TYPE_EXTENDED (TN, t_n, T_P, 0, {})

Удобный макрос для динамической реализации типа, который объявляет функцию инициализации класса, функцию инициализации экземпляра (смотрите GTypeInfo для информации об этом) и статичную переменную с именем t_n_parent_class указывающим на родительский класс. Кроме того, он определяет *_get_type() и статичную функцию *_register_type() для использования в вашей module_init(). Смотрите G_DEFINE_DYNAMIC_TYPE_EXTENDED() для примера.

TN : Имя нового типа, в стиле CamelCase.
t_n : Имя нового типа, в нижнем регистре со словами разделёнными символом '_'.
T_P : GType родительского типа.

Начиная с версии 2.14


G_DEFINE_DYNAMIC_TYPE_EXTENDED()

#define             G_DEFINE_DYNAMIC_TYPE_EXTENDED(TypeName, type_name, TYPE_PARENT, flags, CODE)

Более общая версия G_DEFINE_DYNAMIC_TYPE() которая позволяет определять GTypeFlags и произвольный код.

G_DEFINE_DYNAMIC_TYPE_EXTENDED (GtkGadget,
                                gtk_gadget,
                                GTK_TYPE_THING,
                                0,
                                G_IMPLEMENT_INTERFACE (TYPE_GIZMO,
                                                       gtk_gadget_gizmo_init));
разворачивается до
static void     gtk_gadget_init              (GtkGadget      *self);
static void     gtk_gadget_class_init        (GtkGadgetClass *klass);
static void     gtk_gadget_class_finalize    (GtkGadgetClass *klass);

static gpointer gtk_gadget_parent_class = NULL;
static GType    gtk_gadget_type_id = 0;

static void     gtk_gadget_class_intern_init (gpointer klass)
{
  gtk_gadget_parent_class = g_type_class_peek_parent (klass); 
  gtk_gadget_class_init ((GtkGadgetClass*) klass); 
}

GType
gtk_gadget_get_type (void)
{
  return gtk_gadget_type_id;
}

static void
gtk_gadget_register_type (GTypeModule *type_module)
{
  const GTypeInfo g_define_type_info = {
    sizeof (GtkGadgetClass),
    (GBaseInitFunc) NULL,
    (GBaseFinalizeFunc) NULL,
    (GClassInitFunc) gtk_gadget_class_intern_init,
    (GClassFinalizeFunc) gtk_gadget_class_finalize,
    NULL,   /* class_data */
    sizeof (GtkGadget),
    0,      /* n_preallocs */
    (GInstanceInitFunc) gtk_gadget_init, 
    NULL    /* value_table */
  };
  gtk_gadget_type_id = g_type_module_register_type (type_module,
                                                    GTK_TYPE_THING,
                                                    GtkGadget,
                                                    &g_define_type_info,
                                                    (GTypeFlags) flags);
  {
    const GInterfaceInfo g_implement_interface_info = {
      (GInterfaceInitFunc) gtk_gadget_gizmo_init
    };
    g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info);
  }
}
TypeName : Имя нового типа, в стиле CamelCase.
type_name : Имя нового типа в нижнем регистре, со словами разделёнными символом '_'.
TYPE_PARENT : GType родительского типа.
flags : GTypeFlags помещаемые в g_type_register_static()
CODE : Произвольный код вставляемый в функцию *_get_type().

Начиная с версии 2.14

Смотрите также

GTypePlugin

Интерфейс загрузчика абстрактного типа.

GModule

Портируемый механизм для динамической загрузки модулей.




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру