Newsgroup: it.comp.macintosh
Titolo: Avvia con un Foundation tool

Ho creato un piccolo Foundation Tool (eseguibile a riga di comando) e
adesso desidero avviarlo al login del mio utente.
L'ho aggiunto alla lista "Elementi login", ma viene aperto con una
finestra di terminale sia che spunti la casella "nascondi" che la lasci
libera.
Come faccio a farlo partire in background senza finestre visibili?
-- 
"Oggi più che a baciare si pensa a smanettare al computer su Internet"
                                                    -- Barbara Alberti

 Come faccio a farlo partire in background senza finestre visibili?
1. prova metterlo dentro come
   programma &
2. fallo diventare uno gnocchissimo .app e settagli via Info.plist di
   partire infognated.
-- 
Uccidete i filosofi e tenetevi riso e bacchette per voi.

    partire infognated.
questo mi garba chiossai.


 questo mi garba chiossai.
Pssst:
<key>LSUIElement</key>
<true/>
tra i <dict>...</dict> di Info.plist.
 - ∞
-- 
http://millenomi.altervista.org/

 questo mi garba chiossai.
Io andrei di questo eh...


 Io andrei di questo eh...
eh pero' la cosa non e' tanto banale :(
Mentre nel Foundation Tool posso creare un server UDP e lasciarlo in
ascolto con un ciclo for (;;) nel main, nell'.app no...


 ascolto con un ciclo for (;;) nel main, nell'.app no...
Lo metti dentro un oggetto. Poi o istanzi questo oggetto nel nib e lo fai
partire dentro un applicationDidFinishLaunching oppure un awakeFromNib.
Comunque... fai una busy wait? Forse usando il sistema asincrono di Cocoa
puoi fare delle cose furbine.
-- 
USB Priests for only 10$

 puoi fare delle cose furbine.
si', e' una busy wait. Il protocollo e' di una semplicita' demenziale,
stateless, il server attende un pacchetto con una recvfrom bloccante, lo
interpreta (ma e' possibile che Cocoa non abbia niente di meno rozzo
degli NSScanner per estrarre tokens da una stringa??) chiama un paio di
metodi ObjC e poi ritorna ad ascoltare.



Il sorgente della tua app è "open"? Nel caso se vuoi vedere come sarebbe
con i FileHandles, te lo farei io.


 con i FileHandles, te lo farei io.
open, wide open ;)
non e' niente di segreto
--->8---
#import <Foundation/Foundation.h>
#import <Growl/Growl.h>
#import "ElisaGrowl.h"
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define ELISA_PORT 31106
int main(int argc, char**argv)
{
  NSAutoreleasePool *pool;
  pool = [[NSAutoreleasePool alloc] init];
  ElisaGrowl *elisa = [[ElisaGrowl alloc] init];
 
  int sockfd,n;
  struct sockaddr_in servaddr,cliaddr;
  socklen_t len;
  char mesg[1000];
 
  sockfd=socket(AF_INET,SOCK_DGRAM,0);
 
  bzero(&servaddr,sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  servaddr.sin_port=htons(ELISA_PORT);
  bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
 
  for (;;)
  {
    len = sizeof(cliaddr);
    n = recvfrom(sockfd,mesg,1000,0,(struct sockaddr *)&cliaddr,&len);
    mesg[n] = 0;
 
    NSString *line, *key, *name, *number;
    NSString *message = [NSString stringWithUTF8String:mesg];
    NSScanner *scanner = [NSScanner scannerWithString:message];
 
    while (![scanner isAtEnd])
    {
      [scanner scanUpToString:@"\r\n" intoString:&line];
      NSScanner *lineScanner = [NSScanner scannerWithString:line];
      [lineScanner scanUpToString:@":" intoString:&key];
      [lineScanner scanString:@":" intoString:NULL];
      if ([key isEqualToString:@"Name"])
      {
        [lineScanner scanUpToString:@"\r\n" intoString:&name];
      }
      else if ([key isEqualToString:@"Number"])
      {
        [lineScanner scanUpToString:@"\r\n" intoString:&number];
      }
      [lineScanner release];
      [scanner scanString:@"\r\n" intoString:NULL];
    }
    [elisa notifyWithName:name number:number];
    [line release];
    [key release];
    [name release];
    [number release];
    [scanner release];
    [message release];        
  }
}
-- 
A volte per ricevere bisogna prima dare fino a non averne piu'.

 non e' niente di segreto
Si... ma vedo che:
1) ho bisogno di Growl/Growl.h (immagino che quello lo trovo facilmente sul
sito di Growl).
2) "ElisaGrowl" direi che è un file tuo...


 2) "ElisaGrowl" direi che è un file tuo...
eccolo:
ElisaGrowl.h
--->8---
#import <Foundation/Foundation.h>
#import <Growl/Growl.h>
@interface ElisaGrowl : NSObject <GrowlApplicationBridgeDelegate> {
        NSDictionary *growlDictionary;
}
- (NSDictionary *) registrationDictionaryForGrowl;
- (NSString *) applicationNameForGrowl;
- (NSData *) applicationIconDataForGrowl;
- (void)notifyWithName:(NSString *)name number:(NSString *)number;
@end
---8<---
ElisaGrowl.m
--->8---
#import "ElisaGrowl.h"
#define APPLICATION_NAME @"Elisa"
#define INCOMING_CALL @"Incoming Call"
@implementation ElisaGrowl
- (id)init
{
  self = [super init];
  growlDictionary = [[NSDictionary dictionaryWithObjectsAndKeys:
    [NSArray arrayWithObjects:
      INCOMING_CALL,
      nil],
    GROWL_NOTIFICATIONS_ALL,
    [NSArray arrayWithObjects:
      INCOMING_CALL,
      nil],
    GROWL_NOTIFICATIONS_DEFAULT,
    nil] retain];
  [GrowlApplicationBridge setGrowlDelegate:self];
  return self;
}
- (void)dealloc
{
  [growlDictionary release];
  [super dealloc];
}
/* Growl delegate methods */
- (NSDictionary *) registrationDictionaryForGrowl
{
  return growlDictionary;
}
- (NSString *) applicationNameForGrowl
{
  return APPLICATION_NAME;
}
- (NSData *) applicationIconDataForGrowl
{
  return [[NSData alloc]
initWithContentsOfFile:@"/Users/Shared/icons/Phone.icns"];
}
- (void)notifyWithName:(NSString *)name number:(NSString *)number
{
  [GrowlApplicationBridge notifyWithTitle:name
                description:number
               notificationName:INCOMING_CALL
                   iconData:[self applicationIconDataForGrowl]
                   priority:0
                   isSticky:NO
                 clickContext:nil];
}
@end
---8<---
Il progetto e' per un sistema distribuito di notifica chiamate
telefoniche sulla rete locale. Un computer collegato al modem inoltra
l'avviso e i client ricevono il messaggio e visualizzano un avviso a
schermo. La versione per Mac fa uso di Growl, quella per PC usa i
classici tooltip a fumetto della tray area.
Giusto per chiarire, si chiama Elisa per via di una mia amica che, come
e' facile immaginare, sta sempre al telefono.


 classici tooltip a fumetto della tray area.
Appena ho un minimo di tempo, ci do un occhio.
Ma il codice che mi hai dato č "compilabile" o avrei bisogno di altro?


 Ma il codice che mi hai dato č "compilabile" o avrei bisogno di altro?
Growl Framework a parte, e' tutto li'.
