# curl et callback



## eric210766 (9 Juillet 2011)

Lorsque je lance un curl avec NSTask pour uploader vers la freeboxHD, par exemple, la console envoie des infos que j'aimerais récupérer. J'ai essayé de les récupérer à l'aide de NSPipe, mais rien n'y fait.

Voiçi la portion de code


```
_task = [[NSTask alloc] init];
	[_task setLaunchPath:@"/usr/bin/curl"];
	[args addObject:@"--upload-file"];
	[args addObject:@"/Users/MyAccount/Desktop/aFile.zip"];
	[args addObject:@"--url"];
	[args addObject:@"ftp://freebox:freebox@hd1.freebox.fr/Disque dur/Enregistrements/"];
	[_task setArguments:args];
	[_task setStandardOutput:outPipe];
	[_task setStandardError:errorPipe];
	[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showWhileTransfering:) 
												 name:NSFileHandleDataAvailableNotification 
				 object:[errorPipe fileHandleForReading]];	
	[_task launch];
```

NB: Il semble que standardError soit orientée vers la console.

Quelqu'un aurait-il une idée ?


----------



## eric210766 (15 Juillet 2011)

Beaucoup regarde, sans rien poster !
Dommage.... pour moi !


----------



## Sethii (15 Juillet 2011)

Je ne peux malheureusement pas t'aider.

Je ne comprends même pas le prob, alors pour une solution ...


----------



## eric210766 (16 Juillet 2011)

curl est une commande Unix (pour MacOS X, il s'agit de Darwin, une version propriétaire en open source d'Unix) permettant de lancer une tâche. Cette tâche a pour effet net (en autre) de copier un fichier d'un Mac vers un serveur ftp (uploading). Toutes les box actuelles (Free, SFR, etc) qui dispose d'un disque dur, peuvent se transformer en serveur ftp, car la liaison s'effectue via le réseau éthernet.
Le code plus haut montre comment exécuter une commande Unix à l'aide de Cocoa. C'est simple, la méthode SetLaunchPath précise à la tâche, c'est à dire l'exécutable à lancer, généralement placé dans le répertoire caché du compte utilisateur /usr/bin/
setArguments a besoin de la liste des arguments à fournir à cet exécutable.
Je précise que le code est fonctionnel. Le problème, c'est que je ne parviens pas à récupérer les statistiques que cet exécutable affiche dans la console. C'est tout !

j'espère avoir répondu à tes interrogations.


----------



## Sethii (17 Juillet 2011)

Merci pour ces éclaircissements.

Je relie à ce que je connais. Etant nouveau sur Mac aussi, je ne sais pas à quel point il est proche d'un Unix.

Mais pourquoi ne pas lancer les commandes dans une consol et redirigier stderr (&2 si je me souviens bien) vers un file.

Si même en console ça ne fonctionne pas, aucune chance àmha que ça fonctionne via un script.

Sethy


----------



## eric210766 (18 Juillet 2011)

Je suis parvenu à résoudre mon problème. 
Les stats sont envoyées vers stderr.
La solution est franchement une usine à gaz, pas très Cocoa. Mauvais point pour les ingés d'Apple !
Il faut les détourner vers un flux de sortie classe NSPipe -> NSFileHandle. OK.
Sur le FileHandle, on applique une notification -> OK.
Il faut invoquer la méthode magique waitForDataInBackgroundAndNotify. Pas très logique, mais bon


----------



## Nyx0uf (18 Juillet 2011)

eric210766 a dit:


> Je suis parvenu à résoudre mon problème.
> Les stats sont envoyées vers stderr.
> La solution est franchement une usine à gaz, pas très Cocoa. Mauvais point pour les ingés d'Apple



rofl.

Sérieusement, c'est toi qui bidouille là.

CFNetwork et CFFTPStream ça n'existe pas pour rien.

http://developer.apple.com/library/mac/#samplecode/CFFTPSample/Introduction/Intro.html


----------



## eric210766 (18 Juillet 2011)

> Sérieusement, c'est toi qui bidouille là.



Franchement pas, je vais te dire pourquoi.

1. Je ne comprend pas pourquoi je devrais coder des composants existants et éprouvés depuis des lustres. CURL est une commande très pratique; Elle upload, download et calcule des statistiques sur son activité. Que demander de plus ?

2. Je maintient ce que j'ai écrit. C'est illogique. Pourquoi utiliser stderr ? Il est aurais plus logique d'orienter vers la sortie standard, non ?

3. Si l'on ne met pas waitForDataInBackgroundAndNotify après la notification et dans la méthode invoquée par le déclenchement de la notification, le mécanisme s'arrête. Pourquoi ?

4. Je connais ce code (CFNetwork et CFFTPStream) et, franchement, le code est bien plus simple avec NSTask.

5. J'ai toutefois exagéré sur le terme "usine à gaz", car le code est propre et l'utilisation de la classe NSScanner est impéccable pour le parsing des stats !


----------

