Pb avec callback de curl

07:17 modifié dans API AppKit #1
Bonjour à  tous

Je souhaite récupérer les informations de la console de l'excution de la commande unix curl (pour uploader dans un premier temps).
J'utilise la classe NSTask et alloue un pipe sur stdout (sur lequel j'initialise une notification). L'excution envoie bien le fichier vers la destination, mais je ne parviens pas à  récupérer les précieuses statistiques de la console.
Comment faire ?

// 1- Preparation de la tache<br />	_task = [[NSTask alloc] init];<br />	[_task setLaunchPath:@&quot;/usr/bin/curl&quot;];<br />	// 2- Construction des parametres<br />	[args addObject:@&quot;--proxy-anyauth&quot;]; // connection anonyme<br />	[args addObject:@&quot;-T&quot;];&nbsp; // initial path<br />	[args addObject:inSrcFullPath];<br />	[args addObject:@&quot;--url&quot;]; // end path<br />	url = [NSString stringWithFormat:@&quot;ftp://%@:%@%@&quot;,_login,_hostAddress,inDirPath];<br />	[args addObject:url];<br />	//[args addObject:@&quot;ftp://freebox:freebox@hd1.freebox.fr/Disque dur/Enregistrements/&quot;];<br />	// 3- Connection avec les flux de sortie<br />	[_task setArguments:args];<br />	[_task setStandardOutput:outPipe];<br />	//[_task setStandardError:errorPipe];<br />	[_center addObserver:self selector:@selector(taskDidNotifyMe:) name:NSFileHandleDataAvailableNotification <br />				&nbsp; object:[outPipe fileHandleForReading]];

Réponses

  • AliGatorAliGator Membre, Modérateur
    07:17 modifié #2
    Ca ne m'étonnerai pas que curl utilise libncurse ou des trucs comme ça pour afficher la progression (un peu comme des trucs comme top ou vi, qui mettent à  jour l'écran du terminal, quoi, en réécrivant à  un endroit X de l'écran déjà  précédemment écrit... au lieu de t'écrire des lignes les unes derrière les autres).
    Ce genre d'affichage ne s'utilise que quand on a un tty (donc un terminal interactif), je ne pense pas que ça utilise stdout ou stderr pour renvoyer ces données.

    Par contre il y a peut-être un mode (cf "man curl") qui existe et est prévu pour te sortir les informations de progression autrement que le mode prévu spécialement pour l'affichage (et qui met à  jour ton terminal dynamiquement), genre un autre mode qui lui sortirait régulièrement sur stdout ou sur stderr une ligne contenant la progression (et si tu utilises ce mode sur un terminal, cela afficherait donc un grand nombre de ligne les unes en dessous des autres dans le terminal au fur et à  mesure de l'avancement, au lieu de mettre à  jour la ligne du terminal qui montre la progression en modifiant l'affichage écran déjà  précédemment écrit)

    Mais au fait, question, si ton but est juste la manipulation d'URLs, pourquoi :
    - ne pas utiliser NSURLConnection plutôt que curl ?
    - et si tu veux vraiment utiliser curl, pourquoi ne pas manipuler la librairie curl directement (libcurl, je suppose), plutôt que piloter la CLI par NSTasks ? (la CLI / l'exécutable "curl" n'était qu'un exécutable qui interprète les paramètres passés en entrée de stdin puis fait appel à  la libcurl)
  • juillet 2011 modifié #3
    Bonjour AliGator

    Effectivement, tu as raison, les données sont expédiées vers la console qui se nomme /dev/ttys000. j'ai constaté que le fait de rediriger la sortie erreur (standardError) comme dans le code ci-dessus, supprimait l'affichage de ces statistiques. Incompréhensible !
    Mon objectif est la création d'une classe permettant toutes les opérations ftp.
    D'ailleurs, je ne sais comment exécuter une commande, par exemple:
    mkdir dossier
    
    Si tu as une idée, n'hésites pas.
  • AliGatorAliGator Membre, Modérateur
    07:17 modifié #4
    dans 1310447220:

    Mon objectif est la création d'une classe permettant toutes les opérations ftp.
    Dans ce cas manipule plutôt directement libcurl (la librairie qu'utilise donc aussi l'exécutable curl), ce qui te permettra de la manipuler directement en C avec des appels de fonction, plutôt que de piloter par NSTask la ligne de commande pour laquelle tu vas galérer pour passer certains paramètres ou surtout récupérer des callbacks.

    Tu trouveras des tas d'exemples sur le site de curl/libcurl lui-même, qui est assez complet, comme justement entre autres faire le code pour utiliser libcurl pour faire un upload FTP, avec gestion d'une callback appellée automatiquement pendant la progression de l'upload.
  • 07:17 modifié #5
    J'avais trouvé ce site mais de refaire du C après plusieurs années, c'est dur. Mais bon...
    J'ai trouvé un code interessant également avec libcurl : https://github.com/nrj/objective-curl/blame/master/README.md
    Merci de ton aide.
  • AliGatorAliGator Membre, Modérateur
    07:17 modifié #6
    dans 1310464507:

    J'avais trouvé ce site mais de refaire du C après plusieurs années, c'est dur. Mais bon...
    J'ai trouvé un code interessant également avec libcurl : https://github.com/nrj/objective-curl/blame/master/README.md
    Merci de ton aide.
    Ah ben voilà , très bien, je ne connais pas cette classe, mais avec ça tu vas pouvoir manipuler libcurl au travers d'une API Objective-C qui encapsule les appels à  libcurl (et non à  l'exécutable curl)

    Piloter l'executable en ligne de commande (CLI) "curl" via des NSTask depuis ton application (exécutable qui lui-même utilise libcurl)... au lieu de piloter libcurl directement, c'est comme si au lieu de te mettre au volant d'une voiture pour la piloter, tu utilisais un robot assis sur le siège conducteur et que tu pilotais ce robot avec une télécommande à  distance pour contrôler la voiture... ^^
  • 07:17 modifié #7
    Pour le téléchargement down/up depuis/vers un serveur en ftp, je n'en demandais pas plus. Si j'avais pu être notifié lorsqu'une statistique était émise, celà  aurais été beaucoup plus simple. Tout ce boulot, pour si peu et surtout de voir l'info sans pouvoir la récupérer , ... mais bon...
    Par contre, pour les commandes de type mkdir, cd etc, je n'ai pas trouvé grand chose !

    Merci.
Connectez-vous ou Inscrivez-vous pour répondre.