当前位置: 首页 > news >正文

网页兼容性 网站开发成都广告推广策划宣传公司

网页兼容性 网站开发,成都广告推广策划宣传公司,网站开发技术学习,电商是干什么工作的接前一篇文章:QEMU源码全解析24 —— QOM介绍(13) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 本文开始对于…

接前一篇文章:QEMU源码全解析24 —— QOM介绍(13)

本文内容参考:

《趣谈Linux操作系统》 —— 刘超,极客时间

《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社

特此致谢!

本文开始对于属性ObjectProperty进行深入讲解。

ObjectProperty结构在include/qom/object.h中定义,代码如下:

typedef struct ObjectProperty ObjectProperty;……struct ObjectProperty
{char *name;char *type;char *description;ObjectPropertyAccessor *get;ObjectPropertyAccessor *set;ObjectPropertyResolve *resolve;ObjectPropertyRelease *release;ObjectPropertyInit *init;void *opaque;QObject *defval;
};

其中:

  • name:表示名字;
  • type:表示属性的类型。如有的属性是字符串,有的是bool类型,有的是link等其它更复杂的类型;
  • description:表示对于属性的描述;
  • get:对属性进行获取;
  • set:对属性进行设置;
  • resolve:对属性进行操作;
  • release:对属性进行释放;
  • opaque:指向一个具体的属性,如BoolProperty等。

每一种具体的属性都会有一个结构体来描述它。例如:表示布尔类型的属性的BoolProperty、表示字符串类型的属性的StringProperty以及表示link类型的属性的LinkProperty。三者都在qom/object.c中定义(不挨着),定义分别如下:

typedef struct {union {Object **targetp;Object *target; /* if OBJ_PROP_LINK_DIRECT, when holding the pointer  */ptrdiff_t offset; /* if OBJ_PROP_LINK_CLASS */};void (*check)(const Object *, const char *, Object *, Error **);ObjectPropertyLinkFlags flags;
} LinkProperty;……typedef struct StringProperty
{char *(*get)(Object *, Error **);void (*set)(Object *, const char *, Error **);
} StringProperty;……typedef struct BoolProperty
{bool (*get)(Object *, Error **);void (*set)(Object *, bool, Error **);
} BoolProperty;

总结一下Object、ObjectProperty和各个具体属性的关系:

  • Object(struct object)-> GHashTable *properties中存放着属性名到ObjectProperty(struct ObjectProperty)的映射。
  • ObjectProperty -> void *opaque指向一个具体的属性。

下边介绍几个属性的操作接口。属性的添加分为类属性的添加和对象属性的添加。

对于对象属性来说,其属性添加是通过object_property_add接口完成的。object_property_add函数在qom/object.c中,代码如下:

ObjectProperty *
object_property_add(Object *obj, const char *name, const char *type,ObjectPropertyAccessor *get,ObjectPropertyAccessor *set,ObjectPropertyRelease *release,void *opaque)
{return object_property_try_add(obj, name, type, get, set, release,opaque, &error_abort);
}

该函数实际上是object_property_try_add函数的简单封装,object_property_try_add函数就在上边,代码如下:

ObjectProperty *
object_property_try_add(Object *obj, const char *name, const char *type,ObjectPropertyAccessor *get,ObjectPropertyAccessor *set,ObjectPropertyRelease *release,void *opaque, Error **errp)
{ObjectProperty *prop;size_t name_len = strlen(name);if (name_len >= 3 && !memcmp(name + name_len - 3, "[*]", 4)) {int i;ObjectProperty *ret = NULL;char *name_no_array = g_strdup(name);name_no_array[name_len - 3] = '\0';for (i = 0; i < INT16_MAX; ++i) {char *full_name = g_strdup_printf("%s[%d]", name_no_array, i);ret = object_property_try_add(obj, full_name, type, get, set,release, opaque, NULL);g_free(full_name);if (ret) {break;}}g_free(name_no_array);assert(ret);return ret;}if (object_property_find(obj, name) != NULL) {error_setg(errp, "attempt to add duplicate property '%s' to object (type '%s')",name, object_get_typename(obj));return NULL;}prop = g_malloc0(sizeof(*prop));prop->name = g_strdup(name);prop->type = g_strdup(type);prop->get = get;prop->set = set;prop->release = release;prop->opaque = opaque;g_hash_table_insert(obj->properties, prop->name, prop);return prop;
}

先不管通配符的情况,即if (name_len >= 3 && !memcmp(name + name_len - 3, "[*]", 4)) 条件判断中的内容,直接跳过往下看。首先调用object_property_find函数来确认所插入的属性是否已经存在。如果已存在,则报错返回,确保不会添加重复的属性。

随后分配一个ObjectProperty结构并使用函数参数进行初始化。代码片段如下:

    prop = g_malloc0(sizeof(*prop));prop->name = g_strdup(name);prop->type = g_strdup(type);prop->get = get;prop->set = set;prop->release = release;prop->opaque = opaque;

最后,调用以下代码将其插入到对象的properties域中,并返回此prop:

g_hash_table_insert(obj->properties, prop->name, prop);

返回头来,看一下object_property_find函数的具体实现。object_property_find函数在同文件(qom/object.c)中,代码如下:

ObjectProperty *object_property_find(Object *obj, const char *name)
{ObjectProperty *prop;ObjectClass *klass = object_get_class(obj);prop = object_class_property_find(klass, name);if (prop) {return prop;}return g_hash_table_lookup(obj->properties, name);
}​

此函数首先调用object_get_class函数由Object结构对象(的指针)obj得到ObjectClass对象(的指针)kclass。object_get_class函数在qom/object.c中,代码如下:

ObjectClass *object_get_class(Object *obj)
{return obj->class;
}

然后,调用object_class_property_find函数以确认自己所属的类以及所有父类都不存在这个属性。object_class_property_find函数同样在qom/object.c中,代码如下:

ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name)
{ObjectClass *parent_klass;parent_klass = object_class_get_parent(klass);if (parent_klass) {ObjectProperty *prop =object_class_property_find(parent_klass, name);if (prop) {return prop;}}return g_hash_table_lookup(klass->properties, name);
}

最后,在遍历(递归)完所有父类之后,调用g_hash_table_lookup(obj->properties, name);在自己的域中查找。

欲知后事如何,且看下回分解。

http://www.yayakq.cn/news/875922/

相关文章:

  • 事业单位的网站建设费列哪湖南备案网站建设方案书
  • 用笔记本做网站wordpress谷歌网站地图
  • wordpress对网站排名网站备案在哪查
  • 深圳电商网站公司怎么样在网站做产品推广
  • 哪些公司经常做网站商务网页设计与制作实训总结
  • 做网站的都改行做什么了月夜直播下载
  • 商梦建站网站建设及维护服务技术指标
  • 东莞家具网站建设做测算的网站
  • 网络口碑推广公司合肥百度快速排名优化
  • 东莞企业网站排名成都学校网站建
  • 购物网站创业时是如何做宣传的咸阳网站建设联系电话
  • 适合奖励自己的网站免费软文代发平台
  • 网站做视频的软件叫什么新产品推广方案怎么写
  • 淄博建站哪家好网站维护 关站 seo
  • 微信做兼职什么网站好廊坊网站快照优化公司
  • 松江做移动网站网站建设要程序员吗
  • 网站查外链如何让百度搜索到自己的网站
  • 网站服务器部署广告设计专业就业前景好吗
  • 阿里云建站可不可以备案移动端公众号网站开发
  • 微信内部劵网站怎么做人力资源公司如何做推广
  • 宁波外贸seo网站建设地推网站信息怎么做
  • 网站首页幻灯片代码万盛网站建设
  • 河南省建设厅陈华平官方网站山西网站建设
  • 招聘网站的简历可以做几份做网站的基本步骤
  • 广州制作网站公司哪家好可视化网站建设软件
  • 广州seo网站排名腾讯qq
  • go语言可以做网站吗什么网站可以做电影投资
  • 北京网站建设首选小峰官方网站建设投标书
  • 怎么让网站让百度收录做个淘宝客网站怎么做
  • 电商网站建设与运营成本pc 移动端网站建设