手机探索者开发实录--实现设备端的MobileExplorer

来源:互联网 发布:达内 php培训班北 编辑:程序博客网 时间:2024/04/29 00:47
手机探索者开发实录--实现设备端的MobileExplorer

转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>

在broncho手机上实现MobileExplorer接口相对比较容易,大约有2K的代码,其主要包括以下几个部件:

类型管理器MebronchoTypeManager 我们说过在所有接口中,用到的类型信息都是以整数传递的,如果想了解类型更详细的信息,需要调用mobile_explorer_get_type_info来获取。这里所指类型主要是指对象的类型和文件的类型,也可以是任何其它整数到字符串的映射,有点像X Window中的atom。类型管理器用来实现类型信息的注册和查询。

GUI封装类MebronchoGuiHelper 在MobileExplorer中主要有三个函数与GUI有关:设置剪切板数据,获取剪切板数据和提交输入的文本。broncho手机的GUI是GTK+2.6,这三个函数的实现如下:

设置剪切板数据

  1. MeRet mebroncho_gui_helper_clipboard_set_data(MebronchoGuiHelper* thiz, MeData* data)
  2. {
  3.     MeRet ret = ME_RET_FAIL;
  4.     me_return_val_if_fail(thiz != NULL && data != NULL, ME_RET_PARAMS);
  5.     do
  6.     {
  7.         GdkDisplay* display = gdk_screen_get_display(gdk_screen_get_default());
  8.         me_break_if_fail(display != NULL);
  9.         GtkClipboard *clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD);
  10.         me_break_if_fail(clipboard != NULL);
  11.         gtk_clipboard_set_text(clipboard, data->data, data->length);
  12.         ret = ME_RET_OK;
  13.     }while(0);
  14.     return ret;
  15. }

获取剪切板数据

  1. static void clipboard_get_data(GtkClipboard *clipboard, const gchar  *text, gpointer  user_data)
  2. {
  3.     MeData* data = (MeData*)user_data;
  4.     me_return_if_fail(clipboard != NULL && text != NULL && data != NULL);
  5.     data->type = ME_TYPE_TEXT_PLAIN;
  6.     data->data = strdup(text);
  7.     data->length = strlen(text);
  8.     return;
  9. }
  10. MeRet mebroncho_gui_helper_clipboard_get_data(MebronchoGuiHelper* thiz, MeData* data)
  11. {
  12.     MeRet ret = ME_RET_FAIL;
  13.     me_return_val_if_fail(thiz != NULL && data != NULL, ME_RET_PARAMS);
  14.     do
  15.     {
  16.         GdkDisplay* display = gdk_screen_get_display(gdk_screen_get_default());
  17.         me_break_if_fail(display != NULL);
  18.         GtkClipboard *clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD);
  19.         me_break_if_fail(clipboard != NULL);
  20.         gtk_clipboard_request_text(clipboard, clipboard_get_data, data);
  21.         ret = ME_RET_OK;
  22.     }while(0);
  23.     return ret;
  24. }


提交输入的文本(通过SCIM HelperAgent提交)

  1. static const HelperInfo g_helper_info (String ("6a88133e-e114-475b-9fc9-000000000000"),
  2.     "Remote input Helper""""Remote input Helper", SCIM_HELPER_STAND_ALONE | SCIM_HELPER_AUTO_STA
  3. RT);
  4.     thiz->helper_agent = new HelperAgent();
  5.     thiz->helper_agent->open_connection (g_helper_info, ":0.0");
  6. MeRet mebroncho_gui_helper_commit(MebronchoGuiHelper* thiz, const char* text)
  7. {
  8.     me_return_val_if_fail(thiz != NULL && thiz->helper_agent != NULL && text != NULL, ME_RET_PARAMS)
  9. ;
  10.     thiz->helper_agent->commit_string(-1, "", scim::utf8_mbstowcs(text));
  11.     return ME_RET_OK;
  12. }

XObject转换函数 XObject用于传输,它基本上和一张表对应起来,包含有表名和记录ID,以及记录的各个Field,每个Field又包含名称,类型和值。broncho的数据是存放在SQLite中的,不过我们在上面做了面向对象的封装,用DbDataObj代表一条记录。为了在XObject和DbDataObj之间建立一座桥梁,所以需要编写几个转换函数。

公共函数mebroncho_common 只有几个文件和目录操作的函数。

手机探索者接口实现MobileExplorer 这里主要对上述函数和我们的objectdb的包装。每个函数都对参数和权限检查,如果参数不对则返回ME_RET_PARAMS,如果权限不对则返回ME_RET_PERMISSION。

~~end~~
原创粉丝点击