Передача сообщений из расширения Firefox в приложение Mac

У меня есть приложение для Mac, которое получает широковещательные распределенные уведомления с кодом

            NSDistributedNotificationCenter.defaultCenter().addObserver(sender, selector: "testaction:", name: "myNoti", object: nil)

я также разработал расширение Firefox, используя Addon SDK

Я знаю, что это javascript - Objc bridge

в котором мы можем импортировать системные фреймворки и писать объективный код c в коде javascript расширения Firefox.

но я попытался добавить

 Components.utils.import("/path/to/macosx.js");

тогда

  include("macosx.js")

и т. д., но у меня ничего не сработало, прикреплена ссылка на код: drive.google.com/file/d/0B9ioid0ZPVpaaHBqRzdEV2tGUjg/view?usp=sharing

Может кто-нибудь знает, как я могу передать сообщение из расширения firefox в приложение Mac, используя что-нибудь

DistributedNotification кажется хорошим и подходит для меня, используя macosx.js, но у меня это не работает

Спасибо


person Mohammad Sadiq Shaikh    schedule 25.02.2015    source источник
comment
Я получил комментарий по своей сути, спасибо. Я думаю, ты делаешь потрясающую работу. Ваш код с открытым исходным кодом? Можешь загрузить на гитхаб? Я хотел бы сыграть главную роль. Я бы посмотрел, как ты его используешь. Особенно NSDictionary.   -  person Noitidart    schedule 26.02.2015
comment
Привет, @sadiqxs, я сам пытаюсь сделать IPC, для Mac я могу использовать postNotification, но как это сделать в Windows? Есть ли уведомление/наблюдатель в WinAPI? Спасибо за помощь! :)   -  person Noitidart    schedule 23.03.2015


Ответы (1)


Добавлен тег js-ctypes. Присоединяйтесь к moz irc js-ctypes для получения дополнительной помощи, я действительно хотел бы поговорить с вами об этом, присоединяйтесь здесь: https://client00.chat.mibbit.com/?url=irc%3A%2F%2Firc.mozilla.org%2F%23jsctypes или здесь irc://moznet/jsctypes. Удивительная работа, которую вы делаете здесь.

Я не собираюсь делать это с ObjC Bridge, потому что у него ТОННА абстракций. Вы не поймете основы, необходимые для запуска этого. Так что начните с отсутствия абстракции, а затем вы можете перейти к абстракции, если хотите, иначе устранение неполадок станет головной болью.

Вот как вы публикуете сообщение с postNotification:object, попробуйте этот код, я проверил его, он заработал без ошибок, но я не настраивал наблюдатель, поэтому не проверял, работает ли он на самом деле. Он просто не вылетает :P

Cu.import('resource://gre/modules/ctypes.jsm');

var objc = ctypes.open(ctypes.libraryName('objc'));

// BASIC TYPES
var BOOL = ctypes.signed_char;
var CHAR = ctypes.char;
var ID = ctypes.voidptr_t;
var SEL = ctypes.voidptr_t;
var VOID = ctypes.void_t;

// CONSTANTS
var NIL_ID = ctypes.cast(ctypes.uint64_t(0), ID);
var YES = BOOL(1);
var NO = BOOL(0);

// COMMON FUNCTIONS
var objc_getClass = objc.declare('objc_getClass', ctypes.default_abi, ID, CHAR.ptr);
var objc_msgSend = objc.declare('objc_msgSend', ctypes.default_abi, ID, ID, SEL, '...');
var sel_registerName = objc.declare('sel_registerName', ctypes.default_abi, SEL, CHAR.ptr);

// COMMON SELECTORS
var alloc = sel_registerName('alloc');
var init = sel_registerName('init');
var release = sel_registerName('release');

var shutdown = function() {
    if (NSString_myNoti) {
        console.log('releasing NSString_myNoti');
        objc_msgSend(NSString_myNoti, release);
    }
    objc.close();

    console.log('succesfully shutdown');
}

// my globals:
var NSString_myNoti;

function main() {

    // default_center = [NSDistributedNotificationCenter defaultCenter];
    var NSDistributedNotificationCenter = objc_getClass('NSDistributedNotificationCenter');
    var defaultCenter = sel_registerName('defaultCenter');
    var default_center = objc_msgSend(NSDistributedNotificationCenter, defaultCenter);
    console.info('default_center:', default_center, default_center.toString(), uneval(default_center), default_center.isNull());

    var NSString = objc_getClass('NSString');
    var initWithUTF8String = sel_registerName('initWithUTF8String:');
    NSString_myNoti = objc_msgSend(objc_msgSend(NSString, alloc), initWithUTF8String, CHAR.array()('myNoti'));
    console.info('NSString_myNoti:', NSString_myNoti, NSString_myNoti.toString(), uneval(NSString_myNoti));

    // postNotificationName:object:userInfo:deliverImmediately:
    var postNotificationNameObject = sel_registerName('postNotificationName:object:');
    var rez_postNotificationName = objc_msgSend(default_center, postNotificationNameObject, NSString_myNoti, NIL_ID); // returns void
    //docs say rez_postNotificationName is VOID
    console.log(postNotificationNameObject.toString(), postNotificationNameObject.toString() == YES.toString()); //its always returning 0x0 which iS NO, but its sending, 0x0 is VOID proabably i dont know, but i guess this matches the documentation
}

try {
    main();
} catch (ex) {
    console.error('Error Occured:', ex);
} finally {
    shutdown();
}

РЕДАКТИРОВАТЬ

проверил, что приведенный выше код работает, я проверил, добавив наблюдателя для myNotif также с jsctypes, код addObserver:selector:name:object связан из README. а также в этом примере я использовал postNotification:notificationName:object:userInfo:deliverImmediatey, так что это показывает, что в качестве дополнительного бонуса: -snippet-ObjC-postNotificationNameObjectUserInfoDeliverImmediately

person Noitidart    schedule 25.02.2015
comment
Отличные новости @MohammadSadiqShaikh! :) Есть ли ваш аддон на addons.mozilla.org? - person Noitidart; 21.04.2016