Enlightenment CVS committal Author : chaos Project : e17 Module : apps/evfs
Dir : e17/apps/evfs/src/bin Modified Files: evfs_metadata.c Log Message: * First block of file group tagging code =================================================================== RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_metadata.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- evfs_metadata.c 25 Jun 2006 10:18:07 -0000 1.5 +++ evfs_metadata.c 13 Jul 2006 09:02:33 -0000 1.6 @@ -15,8 +15,23 @@ #include <Evas.h> #include <limits.h> +#define EVFS_GROUP_LIST "/evfs/group/list" + +/* + * TODO + * + * * Handle recursive (i.e. nested) files + */ + static int evfs_metadata_state = 0; + static Eet_Data_Descriptor* Evfs_Metadata_String_Edd; +static Eet_Data_Descriptor* Evfs_Metadata_Group_Edd; +static Eet_Data_Descriptor* Evfs_Metadata_File_Groups_Edd; +static Eet_Data_Descriptor* Evfs_Metadata_Root_Edd; + +static evfs_metadata_root* metadata_root; + static char* homedir; static char metadata_file[PATH_MAX]; static Eet_File* _evfs_metadata_eet; @@ -42,42 +57,225 @@ return edd; } +void evfs_metadata_debug_group_list_print() +{ + Evas_List* l; + evfs_metadata_group_header* g; + int ret; + + printf("Printing group list:\n"); + for (l = metadata_root->group_list; l; ) { + g = l->data; + + + printf("Name: %s, Desc: %s\n", g->name, g->description); + + l = l->next; + } + printf("Done..\n"); +} + +void evfs_metadata_debug_file_groups_print(evfs_metadata_file_groups* groups) +{ + Evas_List* l; + evfs_metadata_group_header* g; + int ret; + + printf("Printing group list:\n"); + for (l = groups->groups; l; ) { + g = l->data; + + printf("Name: %s, Desc: %s\n", g->name, g->description); + + l = l->next; + } + printf("Done..\n"); +} + + +void evfs_metadata_group_header_free(evfs_metadata_group_header* g) +{ + if (g->name) free(g->name); + if (g->description) free(g->description); + free(g); +} + +void evfs_metadata_file_groups_free(evfs_metadata_file_groups* groups) { + Evas_List* l; + evfs_metadata_group_header* g; + + for (l = groups->groups; l; ) { + g = l->data; + + evfs_metadata_group_header_free(g); + + l = l->next; + } + +} + +int evfs_metadata_file_groups_group_check(evfs_metadata_file_groups* groups, char* group) { + Evas_List* l; + evfs_metadata_group_header* g; + int ret = 0; + + for (l = groups->groups; l; ) { + g = l->data; + + if (!strncmp(group, g->name, strlen(g->name))) { + ret = 1; + goto JUMP_OUT; + } + + l = l->next; + } + + JUMP_OUT: + return ret; +} + +evfs_metadata_group_header* +evfs_metadata_group_header_new(char* name, char* desc) +{ + evfs_metadata_group_header* group; + + group = calloc(1, sizeof(evfs_metadata_group_header)); + + if (name) group->name = strdup(name); + if (desc) group->description = strdup(desc); + + return group; +} + +int evfs_metadata_group_header_exists(char* group) +{ + Evas_List* l; + evfs_metadata_group_header* g; + int ret; + + ret = 0; + + for (l = metadata_root->group_list; l; ) { + g = l->data; + + if (!strcmp(g->name, group)) { + ret = 1; + goto GROUP_DONE; + } + + l = l->next; + } + + GROUP_DONE: + return ret; +} + void evfs_metadata_initialise() { struct stat config_dir_stat; + Evas_List* group; + char* data; + int size; + int ret; + evfs_filereference ref; + evfs_metadata_file_groups* groups; if (!evfs_metadata_state) { evfs_metadata_state++; } else return; + group = NULL; + printf(". EVFS metadata initialise..\n"); + /*String edd*/ + Evfs_Metadata_String_Edd = _evfs_metadata_edd_create("evfs_metadata_string", sizeof(evfs_metadata_object)); + EET_DATA_DESCRIPTOR_ADD_BASIC(Evfs_Metadata_String_Edd, evfs_metadata_object, + "description", description, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(Evfs_Metadata_String_Edd, evfs_metadata_object, + "key", key, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(Evfs_Metadata_String_Edd, evfs_metadata_object, + "value", value, EET_T_STRING); + + /*Group edd*/ + Evfs_Metadata_Group_Edd = _evfs_metadata_edd_create("evfs_metadata_group_header", sizeof(evfs_metadata_group_header)); + EET_DATA_DESCRIPTOR_ADD_BASIC(Evfs_Metadata_Group_Edd, evfs_metadata_group_header, + "description", description, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(Evfs_Metadata_Group_Edd, evfs_metadata_group_header, + "name", name, EET_T_STRING); + + /*Metadata group root*/ + Evfs_Metadata_Root_Edd = _evfs_metadata_edd_create("evfs_metadata_root", sizeof(evfs_metadata_root)); + EET_DATA_DESCRIPTOR_ADD_LIST(Evfs_Metadata_Root_Edd, evfs_metadata_root, + "group_list", group_list, Evfs_Metadata_Group_Edd); + + /*Metadata group root*/ + Evfs_Metadata_File_Groups_Edd = _evfs_metadata_edd_create("evfs_metadata_file_groups", sizeof(evfs_metadata_file_groups)); + EET_DATA_DESCRIPTOR_ADD_LIST(Evfs_Metadata_File_Groups_Edd, evfs_metadata_file_groups, + "groups", groups, Evfs_Metadata_Group_Edd); + homedir = strdup(getenv("HOME")); snprintf(metadata_file, PATH_MAX, "%s/.e/evfs", homedir); if (stat(metadata_file, &config_dir_stat)) { mkdir(metadata_file, 0700); + } - snprintf(metadata_file, PATH_MAX, "%s/.e/evfs/evfs_metadata.eet", homedir); + snprintf(metadata_file, PATH_MAX, "%s/.e/evfs/evfs_metadata.eet", homedir); + if (stat(metadata_file, &config_dir_stat)) { + printf("Making new metadata file..\n"); + /*Open/close the file*/ _evfs_metadata_eet = eet_open(metadata_file, EET_FILE_MODE_WRITE); + + metadata_root = calloc(1, sizeof(evfs_metadata_root)); + + /*Create a starting 'group' list*/ + metadata_root->group_list = evas_list_append(metadata_root->group_list, + evfs_metadata_group_header_new("Pictures", "Pictures")); + metadata_root->group_list = evas_list_append(metadata_root->group_list, + evfs_metadata_group_header_new("Video", "Video")); + metadata_root->group_list = evas_list_append(metadata_root->group_list, + evfs_metadata_group_header_new("Audio", "Audio")); + + data = eet_data_descriptor_encode(Evfs_Metadata_Root_Edd, metadata_root, &size); + ret = eet_write(_evfs_metadata_eet, EVFS_GROUP_LIST, data, size, 0); + + free(data); + eet_close(_evfs_metadata_eet); + } else { - snprintf(metadata_file, PATH_MAX, "%s/.e/evfs/evfs_metadata.eet", homedir); + printf("Loading pre-existing metadata root..\n"); + + _evfs_metadata_eet = eet_open(metadata_file, EET_FILE_MODE_READ); + data = eet_read(_evfs_metadata_eet, EVFS_GROUP_LIST, &size); + if (data) { + metadata_root = + eet_data_descriptor_decode(Evfs_Metadata_Root_Edd, data, size); + free(data); + + printf("..Loaded group list..\n"); + + evfs_metadata_debug_group_list_print(); + } else { + printf("Error loading group list..\n"); + } + eet_close(_evfs_metadata_eet); } + /*ref.plugin_uri= strdup("file"); + ref.path = strdup("/home/chaos/respite3x3840.jpg"); + evfs_metadata_group_header_file_add(&ref, "Pictures"); + + printf("\n*****\nFile groups are now:\n"); + + groups = evfs_metadata_file_groups_get(&ref); + evfs_metadata_debug_file_groups_print(groups); + evfs_metadata_file_groups_free(groups);*/ - - /*String edd*/ - Evfs_Metadata_String_Edd = _evfs_metadata_edd_create("evfs_metadata_string", sizeof(evfs_metadata_object)); - EET_DATA_DESCRIPTOR_ADD_BASIC(Evfs_Metadata_String_Edd, evfs_metadata_object, - "description", description, EET_T_STRING); - EET_DATA_DESCRIPTOR_ADD_BASIC(Evfs_Metadata_String_Edd, evfs_metadata_object, - "key", key, EET_T_STRING); - EET_DATA_DESCRIPTOR_ADD_BASIC(Evfs_Metadata_String_Edd, evfs_metadata_object, - "value", value, EET_T_STRING); } void evfs_metadata_file_set_key_value_edd(evfs_filereference* ref, char* key, @@ -86,6 +284,97 @@ } +evfs_metadata_file_groups* evfs_metadata_file_groups_get(evfs_filereference* ref) +{ + evfs_metadata_file_groups* groups = NULL; + + char* data; + int size; + int ret = 0; + char path[PATH_MAX]; + + snprintf(path, PATH_MAX, "/%s/%s/groups", ref->plugin_uri, ref->path); + + _evfs_metadata_eet = eet_open(metadata_file, EET_FILE_MODE_READ); + data = eet_read(_evfs_metadata_eet, path, &size); + if (data) { + printf("Found group data for file in eet..\n"); + + groups = eet_data_descriptor_decode(Evfs_Metadata_File_Groups_Edd, data, size); + free(data); + } + + return groups; + +} + +void evfs_metadata_group_header_file_add(evfs_filereference* ref, char* group) +{ + evfs_metadata_file_groups* groups; + char path[PATH_MAX]; + char* data; + int size; + int ret = 0; + evfs_metadata_group_header* header; + + + /*First make sure this group exists*/ + + if (evfs_metadata_group_header_exists(group)) { + printf("Group exists - proceed\n"); + } else { + printf("Alert - group not found\n"); + return; + } + + + /*Add to file groups*/ + snprintf(path, PATH_MAX, "/%s/%s/groups", ref->plugin_uri, ref->path); + + _evfs_metadata_eet = eet_open(metadata_file, EET_FILE_MODE_READ); + data = eet_read(_evfs_metadata_eet, path, &size); + eet_close(_evfs_metadata_eet); + + if (data) { + printf("Found group data for file in eet..\n"); + + groups = eet_data_descriptor_decode(Evfs_Metadata_File_Groups_Edd, data, size); + free(data); + } else { + printf("File is not a member of a group - making new group collection..\n"); + + groups = calloc(1, sizeof(evfs_metadata_file_groups)); + } + + /*Check if we're already in group*/ + if (!evfs_metadata_file_groups_group_check(groups, group)) { + _evfs_metadata_eet = eet_open(metadata_file, EET_FILE_MODE_READ_WRITE); + + /*Add this to file groups*/ + header = evfs_metadata_group_header_new(group, NULL); + groups->groups = evas_list_append(groups->groups, header); + + /*Now write back to eet*/ + data = eet_data_descriptor_encode(Evfs_Metadata_File_Groups_Edd, groups, &size); + + if (data) { + ret = eet_write(_evfs_metadata_eet, path, data, size, 0); + } + if (ret) { + printf("Wrote %d for %s\n", size, path); + } + free(data); + + eet_close(_evfs_metadata_eet); + } else { + printf("File aready in group %s!\n", group); + } + /*Free groups*/ + evfs_metadata_file_groups_free(groups); + + +} + void evfs_metadata_file_set_key_value_string(evfs_filereference* ref, char* key, char* value) { @@ -95,7 +384,8 @@ int size; int ret; - snprintf(path, PATH_MAX, "/%s/%s/string/%s", ref->plugin_uri, ref->path, key); + snprintf(path, PATH_MAX, "/%s/%s/custommeta/string/%s", ref->plugin_uri, ref->path, key); + _evfs_metadata_eet = eet_open(metadata_file, EET_FILE_MODE_READ_WRITE); ret = 0; obj.description = "string"; @@ -104,41 +394,42 @@ data = eet_data_descriptor_encode(Evfs_Metadata_String_Edd, &obj, &size); - _evfs_metadata_eet = eet_open(metadata_file, EET_FILE_MODE_WRITE); if (data) { ret = eet_write(_evfs_metadata_eet, path, data, size, 0); } if (ret) { printf("Wrote %s for %s\n", value, path); } - eet_close(_evfs_metadata_eet); free(data); + + eet_close(_evfs_metadata_eet); } void evfs_metadata_file_get_key_value_string(evfs_filereference* ref, char* key, char* value) { - evfs_metadata_object* obj; + evfs_metadata_object* obj = NULL; char path[PATH_MAX]; char* data; int size; int ret; - snprintf(path, PATH_MAX, "/%s/%s/string/%s", ref->plugin_uri, ref->path, key); - ret = 0; + snprintf(path, PATH_MAX, "/%s/%s/custommeta/string/%s", ref->plugin_uri, ref->path, key); _evfs_metadata_eet = eet_open(metadata_file, EET_FILE_MODE_READ); + ret = 0; + if (_evfs_metadata_eet) { data = eet_read(_evfs_metadata_eet, path, &size); if (data) { obj = eet_data_descriptor_decode(Evfs_Metadata_String_Edd, data, size); } - eet_close(_evfs_metadata_eet); if (obj) { - printf ("Got %s -> %s\n", obj->key, obj->value); + printf ("Got %s -> %s\n", obj->key, (char*)obj->value); free(data); free(obj); } } + eet_close(_evfs_metadata_eet); } ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs