/************* test.c */
#include
#include
#define KEY_MISSED_CALL "/user/gpephone/share/voc/missedcall"
int setting = 0;
static void
callback_test (int setting, int id, const char *key, type_t type, action_t action, void * user_data)
{
int missedcall_count;
setting_get_int(setting, key, &missedcall_count);
printf("\n*********test count is\n");
GtkWidget *window;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_widget_set_size_request(window, 120, 180);
gtk_widget_show_all(window);
}
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
int notify_id = 0;
int missed_call_count = 0;
error_t error_missedcall;
setting = setting_open ();
if( setting_entry_exist (setting, KEY_MISSED_CALL) )
{
printf("\nKEY_MISSED_CALL has existed\n");
}
error_missedcall = setting_set_int (setting, KEY_MISSED_CALL, atoi(argv[1]));
if(error_missedcall != SETTING_ERROR_SUCCESS)
{
printf("set missed call fail\n");
}
setting_notify_add (setting, KEY_MISSED_CALL, callback_test, NULL, ¬ify_id);
gtk_main();
return FALSE;
}
使用libsettings时,我们无须关心该key的节点是否存在,或者是该key是否已被注册,libsettings以封好。
1 gconf相当于windows中的注册表机制,但比注册表工能要强大很多。比如,它有键植改变之后自动通知所有关心该键植的功能。
2、我们在系统中使用gconf作为注册表机制。但是没有直接使用,而是在gconf的基础上封状了一套命名为setting的机制
3、setting机制的每一个功能都是直接对应于gconf的相应功能的。它具有以下这些功能
3.1 设置或者获得某个键值的值的功能,可以被设置或者获取的值的类别只能是:boolean, int,string三个类型.
对应的函数:
error_t setting_set_boolean (int setting, const char *key, boolean value)
error_t setting_set_int (int setting, const char *key, int value)
error_t setting_set_string (int setting, const char *key, const char * value)
error_t setting_get_boolean (int setting, const char * key, boolean *value)
error_t setting_get_int (int setting, const char * key, int *value)
error_t setting_get_string (int setting, const char * key, char ** value)
3.2 判断某个键值是否存在的功能
boolean setting_entry_exist (int setting, const char * key)
3.3 得到某个键值对应的类型的工能
error_t setting_entry_get_type (int setting, const char *key, type_t *type)
3.4 设置某个键值发生变化时,对应的回调函数的功能
error_t setting_notify_add (int setting, const char *key, SettingNotifyFunc func, void *user_data, int *id)
3.5删除已经注册的回调函数的功能
void setting_notify_remove (int setting, int id)
//gconf_client_notify_remove (client, id);
需要指出的是,setting机制中对gconf回调函数机制作出了改进。
在gconf机制中,我们注册一个回调函数,用下面的方法实现:
int cnid = gconf_client_notify_add (client, key, gconf_client_notify_func, (gpointer) user_data, NULL, &error);
client---是gconf的客户端
key---是被关联的键值
gconf_client_notify_func --- 我们的回调函数
user_data---回调函数的参数
error --- 注册回调函数返回的错误码
我们最应该关注的是,这个函数的返回值
cnid --- 回调函数对应的索引值
我们在改进后的setting机制中,支持同一个应用程序中创建多个gconf的客户端的功能。所以我们引入了3个hash表,分别管理gconf 的客户端;管理回调函数和回调函数注册值的的对应关系;管理gconf客户端索引值和回调函数注册值的对应关系。
3.6 setting中的错误码有自己的一套,不过是和gconf一一对应的。
阅读(1180) | 评论(0) | 转发(0) |