Créer des objets spéciaux dans le finder (comme iPhoto Library)
FKDEV
Membre
Je voudrais créer un programme (app ou driver ?) permettant de faire apparaà®tre dans le finder des objets spéciaux un peu comme le dossier iPhoto Library.
Ces objets pourraient contenir d'autres objets spéciaux (comme des dossiers). On pourrait déposer des fichiers sur ces objets spéciaux, ce qui déclencherait une action dans l'app gérant le dossier.
Ces objets devrait apparaà®tre dans le finder.
Par exemple un de ces objets pourrait représenter un site FTP distant et on pourrait le déplier pour voir ce qu'il y a sur le site distant, déposer des fichiers dessus pour les uploader, etc
Ce n'est pas exactement ce que je veux faire mais c'est pour vous donner une idée des fonctionnalités requises.
Avez-vous une idée du framework à utiliser ? Et si c'est possible sur Mac, tout simplement ?
Ces objets pourraient contenir d'autres objets spéciaux (comme des dossiers). On pourrait déposer des fichiers sur ces objets spéciaux, ce qui déclencherait une action dans l'app gérant le dossier.
Ces objets devrait apparaà®tre dans le finder.
Par exemple un de ces objets pourrait représenter un site FTP distant et on pourrait le déplier pour voir ce qu'il y a sur le site distant, déposer des fichiers dessus pour les uploader, etc
Ce n'est pas exactement ce que je veux faire mais c'est pour vous donner une idée des fonctionnalités requises.
Avez-vous une idée du framework à utiliser ? Et si c'est possible sur Mac, tout simplement ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pour la première partie de ta question (des objets spéciaux qui contiennent d'autres objets), tu peux regarder du côté des file wrapper. Il ne s'agit pas ici tant de la classe NSFileWrapper de l'AppKit mais de l'utilisation de dossiers avec une extension. De cette manière tu caches son contenu au Finder (si tu définis les bonnes options de type, cf. LSTypeIsPackage) et l'utilisateur le voit comme un simple fichier. Par contre, il suffit d'un simple clique droit -> Afficher le contenu du paquet pour voir ce qu'il contient.
Un des moyens envisageables pour des actions automatiques lors est l'utilisation des AppleScripts mais je crois qu'ils ne sont plus développé depuis un certain temps. Tu peux par contre regarder du côté de Automator qui sont censé les remplacer.
Si c'est un simple conteneur, créer un bundle (aussi appelé "file wrapper") qui est en fait en vrai un dossier, mais représenté dans le Finder comme un fichier unique, peut te convenir. Mais pour interagir avec, il faudra double-cliquer dessus, pour ouvrir l'application associée au bundle (tout comme un double-clic sur un document ouvre l'appli associée) qui va savoir gérer ce type de document.
C'est déjà une première solution, avec une application que tu développerais en faisant en sorte qu'elle se lance rapidement et éventuellement même n'apparaisse pas dans le Dock. Comme ça pour l'utilisateur, un double-clic sur le bundle va lui afficher une fenêtre permettant d'interagir avec ce bundle comme tu l'entends, en vrai ça sera une fenêtre de ton appli mais pour l'utilisateur si ton appli est bien intégrée et masquée du Dock ça semblera venir du Finder.
Si c'est vraiment un pseudo système de fichier, comme un peu l'exemple du FTP dont tu parlais, où tu n'as pas d'interface dédiée et que les fenêtres manipulées sont donc directement celles du Finder, mais que tu veux faire des actions particulières lorsqu'un fichier est créé dans ton bundle, déplacé, supprimé, etc... alors tu as d'autres options :
- Utiliser les FSEvents pour surveiller les events de création/déplacement/suppression/... du FileSystem sur ce dossier en question (voir la doc Apple sur les FSEvents)
- Créer un faux FileSystem, en utilisant des outils du type MacFUSE et en codant toi-même un plugin MacFUSE pour correspondre à tes besoins (mais là ça commence à aller chercher loin)
Cela m'a permis de démarrer mes recherches.
En ce qui concerne le faux filesystem, le mot clé c'est plug-in VFS. Ce sont des kernel extensions donc difficle à faire, même s'il ya plusieurs exemples disponibles.
Une aute solution évoquée dans la doc Apple est le développement d'un serveur NFS local en mode user space. Mais je n'ai pas trouvé d'implementation déjà faite en obective-C.
Je pense que je vais utiliser la solution du bundle associée à une application qui ouvrira une fenêtre ressemblant au finder.
D'où son nom d'ailleurs, FUSE voulant dire "FileSystem in User Space". Du coup ça doit, je suppose, faciliter un peu le développement de drivers ?
Bon en même temps j'ai jamais mis les mains dedans, je sais pas du tout le niveau de complexité que ça requiert de faire un truc du genre.
Effectivement tu as raison, cela permet de créer des FS facilement.
Maintenant il faut plutôt utiliser OSXFUSE car MacFUSE a été abandonné.
Le seul inconvénient c'est que l'utilisateur doit installer OSXFUSE au préalable et qu'on est complètement dépendant du projet notamment pour les mises à jour liées aux nouvelles versions de OSX.
Sinon, cela a l'air assez simple à mettre en oeuvre d'après les exemples :
https://github.com/osxfuse/filesystems/blob/master/filesystems-objc/HelloFS/HelloFuseFileSystem.m
Une autre solution, similaire à la solution du serveur NFS, est la mise en place d'un serveur WEBDAV en local en utilisant CocoaHTTPServer comme base. Le serveur WEBDAV peut être monter directement en utilisant la commande mount_webdav.