Получение списка контактов с интерфейсом 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).

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

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

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


person mathematical.coffee    schedule 14.04.2012    source источник


Ответы (1)


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

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

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

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

person giallu    schedule 04.10.2012
comment
Да, так и думал (я однажды спросил в #gnome-shell IRC, и в основном поддержка gobject для Folks/Gee была не очень полной - меня не удивляет, что они отказались от нее) - person mathematical.coffee; 05.10.2012