我刚刚开始编写gnome扩展,并且想知道如何获得用户的联系人列表。
我已经找到了一些可能的文件:gnome-shell/js/ui/contactDisplay.js和gnome-shell/src/shell_contact_system.c。
现在我在shell_contact_system.c中注意到以下函数:
/**
* shell_contact_system_get_all:
* @self: A #ShellContactSystem
*
* Returns: (transfer none): All individuals
*/
GeeMap *
shell_contact_system_get_all (ShellContactSystem *self)
{
GeeMap *individuals;
g_return_val_if_fail (SHELL_IS_CONTACT_SYSTEM (self), NULL);
individuals = folks_individual_aggregator_get_individuals (self->priv->aggregator);
return individuals;
}这表明,在javascript接口中,我可以使用函数get_all ( .c文件也有一个shell_contact_system_get_individual,contactDisplay.js演示了Shell.ContactSystem.get_default().get_individual的用法)这一事实强化了我的信念,因此我尝试:
contactSys = Shell.ContactSystem.get_default();
// get contacts
contacts = contactSys.get_all();它起作用了!(我正在Gnome的“外观玻璃”javascript解释器中试用)。
它似乎是一个'Gobject‘,所以我不知道如何处理这个对象,以获取我的联系人的名字。我注意到(从C代码中)这个对象是一个GeeMap *,所以看看Gee.Map文档,我看到我可以这样做:
contacts.size // returns 31, which is the number of contacts I have !
contacts.values // is a Gee.Collection
contacts.keys // is a Gee.Set然后,我尝试查看contacts.values和contacts.key,注意这些方法中的to_array()方法:
contacts.values.to_array()
contacts.keys.to_array()但是,当我这样做时,我会得到一个空数组:contacts.xxx.to_array().size是0,而contacts.size是31?!!
当我试图使用contacts.map_iterator()迭代映射时,也会发生同样的情况;it.get_value()和it.get_key()似乎是空的。
因此,我的问题是:如何访问contacts**?** 的各个元素?
我确实注意到,shell_contact_system_get_all的注释是Returns: (transfer none): ...,而shell_contact_system_get_individual是Returns: (transfer full): ...,后一个函数可以工作(前提是我知道我想要查找的个人的ID,这是我的问题),而前者不是。这与它有关吗?
另外,作为一种解决方法,我目前可以使用contactSearchProvider类来实现这一点(当您输入所有gnome-contacts时,您可以在其中键入联系人的名称,并且它们将出现在概述中)。我基本上是搜索'',它应该返回给我每一个联系人的列表。这似乎是迂回的-我觉得我应该能够使用get_all()方法来获取所有的联系人,而不必搜索空字符串.
const ContactDisplay = imports.ui.contactDisplay;
cds = new ContactDisplay.contactSearchProvider;
res = cds.getInitialResultSet(['']);
// woohoo! res.length is 31, and res[0], res[1], ... are all not null!任何帮助都是非常感谢的(顺便问一句,有关于这方面的任何文档吗?)当我盯着源代码并试图从中推断出所有的文档时,我感到非常不合适!)
发布于 2012-10-04 06:53:46
我相信这是一个bug,您已经找到了它的位置:C方法上的注释应该是Returns: (transfer full):,以便将结果返回给绑定。
下一个逻辑步骤是向他们的bugzilla报告bug和补丁,但我需要注意的是,gnome 3.6中删除了代码,所以我怀疑它是否会被修复。
联系人搜索代码现在位于gnome-contact应用程序中:
http://git.gnome.org/browse/gnome-contacts
https://stackoverflow.com/questions/10151433
复制相似问题