voici le source C de chemb, retrouvé sur ma machine
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <glib.h>
#include <orbit/orbit.h>
#include "nautilus-metafile-factory.h"
#include "nautilus-metafile-server.h"
#include <bonobo-activation/bonobo-activation.h>
#include <orbit/orbit-types.h>
char* getDirname(char* path);
char* getFilename(char* path);
char* uriencode(char* s);
void GListPrint(GList*l,char*t){
printf("%s : \n",t);
while(l!=NULL){
printf ("%s\n",l->data);
l = g_list_next(l);
}
}
int main(int argc, char** argv){
char* dirname;
char* filename;
struct stat etat;
if(argc<2){
fprintf(stderr, "usage : chemb path [emblem to remove [emblem to add]]\n");
exit (1);
}
if (stat(argv[1],&etat)!=0){
fprintf(stderr,"fichier ou répertoire inexistant\n");
exit(1);
}
char*prefix="file://";
char*uri=(char*)malloc(strlen(prefix)+strlen(argv[1])+1);
Nautilus_MetafileFactory factory=CORBA_OBJECT_NIL;
strcpy(uri,prefix);
strcat(uri,argv[1]);
dirname=uriencode(getDirname(uri));
filename = uriencode(getFilename(uri));
printf("directory=%s\n", dirname);
printf("basename =%s\n",filename);
bonobo_init(&argc, argv);
bonobo_activate();
CORBA_Environment ev;
CORBA_exception_init(&ev);
factory=bonobo_activation_activate_from_id(
METAFILE_FACTORY_IID,0,NULL,&ev
);
if(ev._major != CORBA_NO_EXCEPTION){
fprintf (stderr,"activate: ev._major=%d\n", ev._major);
exit (1);
}
if (factory == CORBA_OBJECT_NIL){
fprintf(stderr,"activate: factory=nIL\n");
exit (1);
}
Nautilus_Metafile metafile;
CORBA_exception_init(&ev);
metafile=Nautilus_MetafileFactory_open(factory,dirname,&ev);
if(ev._major!=CORBA_NO_EXCEPTION){
fprintf (stderr,"open metafile : ev._major=%d\n", ev._major);
exit (1);
}
if (metafile == CORBA_OBJECT_NIL){
fprintf(stderr,"open metafile: metafile=nIL\n");
exit (1);
}
CORBA_exception_init(&ev);
Nautilus_MetadataList * r;
r=Nautilus_Metafile_get_list(
metafile,filename,"keyword","name",&ev
);
if(ev._major!=CORBA_NO_EXCEPTION){
fprintf (stderr,"get_list : ev._major=%d\n", ev._major);
exit (1);
}
if (r == CORBA_OBJECT_NIL){
fprintf(stderr,"get_list: r=nIL\n");
exit (1);
}
CORBA_unsigned_long bufpos;
GList* emblemes = NULL;
for (bufpos=0; bufpos<r->_length; bufpos++){
emblemes=g_list_append(
emblemes,
g_strdup(r->_buffer[bufpos])
);
}
GListPrint(emblemes,"liste initiale");
GCompareFunc funcmp =(GCompareFunc)strcmp;
// retirer de la liste l'élément égal à argv[2]
if(argc>2&& strcmp(argv[2],"")){
GList* p=g_list_find_custom(emblemes,argv[2],funcmp);
emblemes=g_list_delete_link(emblemes,p);
}
// ajouter au bon endroit argv[3]
if(argc>3 && strcmp(argv[3],"")){
emblemes=g_list_insert_sorted(
emblemes,
argv[3],
funcmp
);
}
GListPrint(emblemes,"avant remise en place");
//on remet les choses en place
int len=g_list_length(emblemes);
Nautilus_MetadataList* corba_list=Nautilus_MetadataList__alloc();
corba_list->_maximum=len;
corba_list->_length=len;
corba_list->_buffer=CORBA_sequence_CORBA_string_allocbuf(len);
CORBA_sequence_set_release(corba_list,CORBA_TRUE);
bufpos=0;
GList* listptr=emblemes;
while(listptr!=NULL){
corba_list->_buffer[bufpos]=CORBA_string_dup(listptr->data);
listptr=g_list_next(listptr);
bufpos++;
}
CORBA_exception_init(&ev);
Nautilus_Metafile_set_list(
metafile, filename,"keyword","name",corba_list,&ev
);
if(ev._major!=CORBA_NO_EXCEPTION){
fprintf (stderr,"set_list : ev._major=%d\n", ev._major);
exit (1);
}
exit(0);
}