Communication inter-app

elfelf Membre
03:06 modifié dans API AppKit #1
Je suis en train de porgrammer un truc dans le même style que Growl et UpSoft: une système Helper-PrefPane-Framework dont le but resteras secret pour l'instant.

J'ai été fouiller dans les sources de Growl pour voire comment c'est mis en place, et je vois que Growl utilise CoreFundation pour envoyer des notification entre le Helper et le client (app utilisant le framework), voici le bout de code:

void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo) {<br />	CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(),<br />	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  GROWL_NOTIFICATION,<br />	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  /*object*/ NULL,<br />	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  userInfo,<br />	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  /*deliverImmediately*/ false);<br />}<br />


Je me demandais si il n'y avais aps un moyen plus Cocoa-eux car ce truc pue le carbon (CF=Carbon non?)!

En même temps si je veux permettre à  des apps carbon d'utiliser mon truc ça serais mieux que j'utilise la méthode à  Growl?

Ensuite je crois que il y aurrais un moyen en utilisant des NSNotifications, est-ce vrai? Il semblerais que iTunes implémente un truc dans le genre...

Ensuite je sais que Growl est sous licence BSD, si je reprens le système de notification qu'ils utilisent, ça m'obligeras à  être open-source? Ou est-ce que la GNU GPL qui fais ça? Ques'que ça implique que Growl soit BSD?

Voilà  pour aujourd'hui, et merci d'avance,
elf

Réponses

  • fouffouf Membre
    03:06 modifié #2
    Je pense que tu ne sais pas lire les sources de Growl. Growl utilise deux methodes differentes pour la communication inter application : les NSDistributedNotification et les connections (NSConnexion, NSProxi & co).

    L'utilisation de ces deux methodes est consignée dans GrowApplicationBridge et les fichiers qui tournent autour. Je te laisse regarder ...
  • Eddy58Eddy58 Membre
    03:06 modifié #3
    dans 1151054350:

    Je me demandais si il n'y avais aps un moyen plus Cocoa-eux car ce truc pue le carbon (CF=Carbon non?)!

    NSDistributedNotificationCenter

    dans 1151054350:

    En même temps si je veux permettre à  des apps carbon d'utiliser mon truc ça serais mieux que j'utilise la méthode à  Growl?

    Une notification est une notification, qu'elle soit envoyée d'une manière ou d'une autre, c'est le nom que tu lui donnes qui l'identifie, le tout est que l'application réceptrice soit bien configurée pour la recevoir. :o
  • elfelf Membre
    03:06 modifié #4
    oui mais est-ce possible avec les NSDistributedNotification de envoier via une application Carbon vers une application Cocoa, ou vice-versa?

    ensuite fouf, le bout de code que j'ai mis est tout ce que j'ai trouvé dans GrowApplicationBridge qui se rapporte à  des notifications.

    Ensuite j'ai jamais utilisé de NSConnexion / NSProxi, y'a moyen de faire sans?

  • Eddy58Eddy58 Membre
    03:06 modifié #5
    dans 1151065129:

    oui mais est-ce possible avec les NSDistributedNotification de envoier via une application Carbon vers une application Cocoa, ou vice-versa?

    Mais oui, c'est ce que j'essaye de te dire plus haut...:P

    Tu as un exemple de notifications utilisées avec Carbon ici. L'appli sensée utiliser ces notifications est elle en Cocoa.

    dans 1151065129:

    Ensuite j'ai jamais utilisé de NSConnexion / NSProxi, y'a moyen de faire sans?

    Bien sûr, mais tout dépend des types d'informations que tu veux faire transiter.
  • fouffouf Membre
    03:06 modifié #6
    dans 1151065129:

    ensuite fouf, le bout de code que j'ai mis est tout ce que j'ai trouvé dans GrowApplicationBridge qui se rapporte à  des notifications.


    NSConnection *connection = [NSConnection connectionWithRegisteredName:@&quot;GrowlApplicationBridgePathway&quot; host:nil];<br />		if (connection) {<br />			//Post to Growl via GrowlApplicationBridgePathway<br />			NS_DURING<br />				NSDistantObject *theProxy = [connection rootProxy];<br />				[theProxy setProtocolForProxy:@protocol(GrowlNotificationProtocol)];<br />				id&lt;GrowlNotificationProtocol&gt; growlProxy = (id)theProxy;<br />				[growlProxy postNotificationWithDictionary:userInfo];<br />			NS_HANDLER<br />				NSLog(@&quot;GrowlApplicationBridge: exception while sending notification: %@&quot;, localException);<br />			NS_ENDHANDLER<br />		} else {<br />			//Post to Growl via NSDistributedNotificationCenter<br />			//NSLog(@&quot;GrowlApplicationBridge: could not find local GrowlApplicationBridgePathway, falling back to NSDistributedNotificationCenter&quot;);<br />			[[NSDistributedNotificationCenter defaultCenter] postNotificationName:GROWL_NOTIFICATION<br />																		&nbsp;  object:nil<br />																		 userInfo:userInfo<br />															&nbsp;  deliverImmediately:NO];<br />		}<br />
    

    Ce code est dans la méthode +notifyWithDictionary: .

    dans 1151066199:

    dans 1151065129:

    Ensuite j'ai jamais utilisé de NSConnexion / NSProxi, y'a moyen de faire sans?

    Bien sûr, mais tout dépend des types d'informations que tu veux faire transiter.

    Les distributed notifications ne permettent de faire transiter que des NSString alors que via les NSConnexion te permettent de faire appel à  des méthodes à  travers les applications, ce qui peut etre fort pratique, en particulier quand tu veux utiliser une valeur de retour.
    Ensuite - je ne suis pas totalement sûr de ce que je vais dire - les traitement des NSConnection est immediat alors que celui des notifications distribues ne l'est pas.
  • Eddy58Eddy58 Membre
    03:06 modifié #7
    dans 1151070462:

    Les distributed notifications ne permettent de faire transiter que des NSString alors que via les NSConnexion te permettent de faire appel à  des méthodes à  travers les applications, ce qui peut etre fort pratique, en particulier quand tu veux utiliser une valeur de retour.

    A ta notification tu peux joindre un dictionary (userInfo), dans lequel tu peux très bien mettre des objets sérialisés (NSData), donc ça permet de faire transiter pas mal de types d'informations déjà . Mais encore une fois tout dépend de ce que elf veux faire... 

    dans 1151070462:

    Ensuite - je ne suis pas totalement sûr de ce que je vais dire - les traitement des NSConnection est immediat alors que celui des notifications distribues ne l'est pas.

    Toutes les notifications distribuées que j'ai utilisées jusqu'à  maintenant ont été transmises immédiatement, aucun temps de latence a remarquer. :)
  • elfelf Membre
    03:06 modifié #9
    Je pensais utiliser un type d'objet spécifique que je transemtrais entre le client et le helper. Si j'implémente NSCoding et que j'utilise de l'archivage en NSData je pourrais utiliser des notifs pour transmettre ems objets?

    Je vais jeter un oeuil à  vos liens
  • Eddy58Eddy58 Membre
    03:06 modifié #10
    Tu archives tes objets avec la méthode archivedDataWithRootObject, qui te retourne un NSData, ensuite tu mets tes datas dans un dictionary que tu envoies avec ta notification. Une fois celle-ci reçue, tu récupères le dictionary puis tu désarchives tes objets avec la méthode unarchiveObjectWithData. :)
  • elfelf Membre
    03:06 modifié #11
    Ok, juste encore une question: il faut que je mette les headers .h et/ou les implémentations .m dans le code du framework récépteur et de l'application émétrice?
  • Eddy58Eddy58 Membre
    03:06 modifié #12
    Oui. :o
Connectez-vous ou Inscrivez-vous pour répondre.