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

Reply via email to