GDK ESourceRegistry раньше работал, но больше не работает

Я разрабатываю надстройку Thunderbird, которая использует libedataserver.so.

Аддон использует js-ctypes для вызова e_source_registry_new_sync из вышеуказанной библиотеки. См. ниже код:

    var lib = ctypes.open("libedataserver-1.2.so.18");

    var GCancellable = {};
    GCancellable.cls = new ctypes.StructType("GCancellable");
    var GError = {};
    GError.cls = new ctypes.StructType("GError");

    var ESourceRegistry = {};
    ESourceRegistry.cls = new ctypes.StructType("ESourceRegistry");
    ESourceRegistry.e_source_registry_new_sync =
        lib.declare(
            "e_source_registry_new_sync",
            ctypes.default_abi,
            ESourceRegistry.cls.ptr,
            GCancellable.cls.ptr,
            GError.cls.ptr.ptr);

    //below line causes an error
    var sourceRegistry = ESourceRegistry.e_source_registry_new_sync(null, null);

Он отлично работает в Ubuntu, однако в Fedora 21 он печатает ниже вывода и зависает:

(thunderbird:2735): GLib-GObject-WARNING **: cannot register existing type 'EDBusSource'
(thunderbird:2735): GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion 'G_TYPE_IS_INTERFACE (interface_type)' failed
(thunderbird:2735): GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed
(thunderbird:2735): GLib-GObject-WARNING **: invalid cast from 'EDBusSourceProxy' to '<invalid>'

Я использую Fedora 21 с эволюционным сервером данных 3.12.11-1.fc21.

Ubuntu использует сервер эволюции данных 3.12.10.

Я разработал простое приложение на C, которое вызывает e_source_registry_new_sync, и оно прекрасно работает.

Может кто-нибудь подсказать, в чем может быть причина этой проблемы?

@UPDATE: я обнаружил ошибку Fedora. По словам сопровождающих Fedora, проблема вызвана двойной загрузкой libedataserver (мой код и evolution-ews):

Проблема, похоже, заключается в том, что Thunderbird загружает libedataserver-1.2.so.18 сам по себе, в то время как libcamelews.so имеет зависимость во время выполнения от libedataserver-1.2.so, но это (во время выполнения) не удовлетворяется загруженным Thunderbird libedataserver -1.2.so.18, поэтому он загружается снова, что нарушает систему типов GLib.

Пожалуйста, прокомментируйте, если есть что-то, что я могу сделать со стороны аддона.


person Mateusz Balbus    schedule 02.03.2015    source источник
comment
Привет, @Mateusz, это хороший вопрос. Это не привлекло особого внимания, потому что теги не популярны среди пользователей jsctypes. Вставьте тег firefox-addon, и вы получите более быстрый ответ :) Можете ли вы опубликовать свой код, чтобы я мог протестировать его на Ubuntu и Fedora?   -  person Noitidart    schedule 11.03.2015
comment
Спасибо, что поделились своим комментарием от команды Fedora. Я думаю, мы можем это исправить. Знаете ли вы способ проверить, какие библиотеки загружены в Thunderbird? если нет, мы можем узнать, а также мы попробуем найти пути ко всем вашим libedataserver-1.2.so и попробовать со всех этих путей. может быть, Thunderbird уже загрузил эту библиотеку, но с другим путем, поэтому он загружается дважды, пожалуйста, попробуйте попасть на канал #jsctypes, и мы можем выбить это   -  person Noitidart    schedule 06.05.2015


Ответы (1)


Вы спрашиваете об ошибке, возникающей с этой функцией: https://developer.gnome.org/libedataserver/stable/ESourceRegistry.html#e-source-registry-new-sync

В документах указано, что при ошибке возвращается NULL, а GError устанавливается соответствующим образом. Я протестирую код позже и посмотрю, что получилось, но здесь я расскажу вам, как проверить это самостоятельно.

GError не является непрозрачной структурой. Определите это так:

var GQuark = ctypes.uint32_t;
GError.cls = new ctypes.StructType('GError', [
    {'domain': GQuark},
    {'code': ctypes.int},
    {'message': ctypes.char.ptr}
]);

Взято отсюда: https://gist.github.com/Noitidart/dbe54fcd7794c8ddff6f#file-_ff-addon-snippet-gdk_giolaunch-js-L22

Затем настройте свой код для возврата ошибки следующим образом:

var error = GError.cls.ptr(); // can use `null` if we dont care to see error but we want to know what is happening so we can fix it
var sourceRegistry = ESourceRegistry.e_source_registry_new_sync(null, error.address());
if (sourceRegistry.isNull()) {
    console.error('An error occured when calling e_source_registry_new_sync!');
    console.info('ERROR DETAILS', 'Domain:', error.contents.domain.toString(), 'Code:', error.contents.code, 'Message:', error.contents.message.readString());
}

Затем, основываясь на деталях ошибки, найдите этот код и сообщение, и он расскажет вам, что случилось, затем найдите StackOverflow или где-либо еще для ее решения, если это не очевидно.

person Noitidart    schedule 05.05.2015
comment
Спасибо за комментарий. Проблема в том, что sourceRegistry.isNull() никогда не достигается. Код зависает на: ESourceRegistry.e_source_registry_new_sync(null, error.address()); - person Mateusz Balbus; 06.05.2015
comment
@MateuszBalbus, это очень-очень странно, я скопировал и вставил код, и у меня он отлично работал на Ubuntu. Можете ли вы попасть на IRC-канал moz #jsctypes, вы можете использовать этот клиент онлайн-чата: client00.chat.mibbit.com/ мы можем помочь вам это исправить - person Noitidart; 06.05.2015
comment
Как указано в посте: он отлично работает в Ubuntu, однако в Fedora 21 вам нужна Fedora 21 с установленным evolution-ews (должен быть установлен по умолчанию). Удаление evolution-ews решает проблему. - person Mateusz Balbus; 06.05.2015
comment
Ах, я вижу, если вы можете поболтать, я думаю, мы сможем это выяснить. Возможно, нам придется привлечь к разговору еще кого-то, но мы это сделаем. Всякий раз, когда вы доступны - person Noitidart; 06.05.2015