Получение списка контактов с интерфейсом Gnome-Shell JS

Я только начал заниматься написанием расширений gnome-shell и хотел бы узнать, как получить список контактов, которые есть у пользователя.

Я отследил некоторые вероятные файлы: 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();

Оно работает! (Я пробую это в интерпретаторе javascript "зеркала" Gnome-shell).

Похоже, что это "объект", поэтому я понятия не имею, что делать с этим объектом, чтобы получить имена моих контактов. Я заметил (из кода 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): ... и последняя функция работает (при условии, что я знаю идентификатор человека, которого я хочу найти, что является моей проблемой), тогда как первая - нет. Может ли это быть как-то связано с этим?

Кроме того, в качестве обходного пути, я могу в настоящее время использовать 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!

Любая помощь будет принята с благодарностью (кстати, есть ли какая-либо документация по этому поводу? Я чувствую себя крайне неадекватно, когда смотрю на источник и пытаюсь вывести из него всю документацию!)

1 ответ

Решение

Я считаю, что это ошибка, и вы уже нашли, где это: аннотация на метод C должен сказать Returns: (transfer full): чтобы вернуть результаты в привязки.

Следующим логическим шагом было бы сообщить об ошибке и патче их bugzilla, но я должен отметить, что код был удален в GNOME 3.6, поэтому я скептически отношусь к тому, что он когда-либо будет исправлен.

Код поиска контактов теперь находится в приложении gnome-contact по адресу:

http://git.gnome.org/browse/gnome-contacts

Другие вопросы по тегам