Enlightenment CVS committal Author : lordchaos Project : e17 Module : apps/evfs
Dir : e17/apps/evfs/src/common Modified Files: evfs_cleanup.c evfs_event_helper.c evfs_io.c Log Message: * Added 'evfscat' - similar to unix cat. Allows such cool things as 'evfscat smb://host/filename.mpg | mplayer -cache 8192 -' to play videos from a remote filesystem * Client exposed versions of evfs_open/evfs_close/evfs_read etc * Integer fd support and hash mappings for remoting of file references to client =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/evfs/src/common/evfs_cleanup.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- evfs_cleanup.c 16 Nov 2005 00:49:50 -0000 1.7 +++ evfs_cleanup.c 6 Dec 2005 06:16:58 -0000 1.8 @@ -56,6 +56,11 @@ } } +void evfs_cleanup_file_read_event(evfs_event* event) { + if (event->data.bytes) + free(event->data.bytes); +} + void evfs_cleanup_event(evfs_event* event) { evfs_cleanup_command(&event->resp_command, EVFS_CLEANUP_PRESERVE_COMMAND); @@ -66,6 +71,9 @@ case EVFS_EV_DIR_LIST: evfs_cleanup_file_list_event(event); break; + case EVFS_EV_FILE_READ: + evfs_cleanup_file_read_event(event); + break; } free(event); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/evfs/src/common/evfs_event_helper.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- evfs_event_helper.c 17 Nov 2005 08:01:56 -0000 1.13 +++ evfs_event_helper.c 6 Dec 2005 06:16:58 -0000 1.14 @@ -76,3 +76,27 @@ } + +void evfs_open_event_create(evfs_client* client, evfs_command* command) { + /*Create a reply event for a file mon event, send it , destroy event*/ + + evfs_event* event = NEW(evfs_event); + event->type = EVFS_EV_FILE_OPEN; + evfs_write_event(client, command, event); + + /*Now destroy*/ + evfs_cleanup_event(event); +} + +void evfs_read_event_create(evfs_client* client, evfs_command* command, char* bytes, long size) { + evfs_event* event = NEW(evfs_event); + event->type = EVFS_EV_FILE_READ; + event->data.size = size; + event->data.bytes = bytes; + evfs_write_event(client, command, event); + + + /*Destroy*/ + evfs_cleanup_event(event); +} + =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/evfs/src/common/evfs_io.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -3 -r1.32 -r1.33 --- evfs_io.c 19 Nov 2005 10:51:19 -0000 1.32 +++ evfs_io.c 6 Dec 2005 06:16:58 -0000 1.33 @@ -15,6 +15,7 @@ io_init = 1; + /*File_reference eet*/ _evfs_filereference_edd = eet_data_descriptor_new("evfs_filereference", sizeof(evfs_filereference), (void *(*) (void *))evas_list_next, (void *(*) (void *, void *))evas_list_append, @@ -27,7 +28,10 @@ EET_DATA_DESCRIPTOR_ADD_BASIC(_evfs_filereference_edd, evfs_filereference, "file_type", file_type, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_evfs_filereference_edd, evfs_filereference, "path",path, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(_evfs_filereference_edd, evfs_filereference, "plugin_uri",plugin_uri, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(_evfs_filereference_edd, evfs_filereference, "fd",fd, EET_T_INT); + + /*Progress event eet*/ _evfs_progress_event_edd = eet_data_descriptor_new("evfs_progress_event", sizeof(evfs_event_progress), (void *(*) (void *))evas_list_next, (void *(*) (void *, void *))evas_list_append, @@ -132,6 +136,12 @@ } +void evfs_write_file_read_event(evfs_client* client, evfs_event* event) { + evfs_write_ecore_ipc_client_message(client->client, + ecore_ipc_message_new(EVFS_EV_REPLY,EVFS_EV_PART_DATA, + client->id,0,0,event->data.bytes, event->data.size )); +} + void evfs_write_progress_event(evfs_client* client, evfs_event* event) { int size_ret = 0; @@ -166,6 +176,11 @@ break; case EVFS_EV_FILE_PROGRESS: evfs_write_progress_event(client,event); break; + + case EVFS_EV_FILE_OPEN: printf ("Open event send\n"); break; /*File open has no additional info - fd is in filereference */ + + case EVFS_EV_FILE_READ: evfs_write_file_read_event(client,event); + break; default: printf("Event type not handled in switch\n"); break; @@ -209,6 +224,14 @@ } break; + case EVFS_EV_PART_DATA: { + event->data.size = msg->len; + event->data.bytes = malloc(msg->len); + memcpy(event->data.bytes, msg->data, msg->len); + + } + break; + case EVFS_EV_PART_FILE_REFERENCE: { evfs_filereference* ref; @@ -232,7 +255,9 @@ /*The pieces of the incoming command*/ case EVFS_COMMAND_TYPE: + case EVFS_COMMAND_EXTRA: case EVFS_FILE_REFERENCE: + case EVFS_FILE_REFERENCE_FD: case EVFS_COMMAND_END: evfs_process_incoming_command(NULL, &event->resp_command, msg); break; @@ -242,7 +267,7 @@ //printf("Created new ecore list at %p\n", event->file_list.list); return TRUE; break; - default: printf("Unknown event part received!\n"); + default: printf("Unknown event part received! - %d\n", msg->minor); break; } @@ -284,6 +309,8 @@ case EVFS_CMD_LIST_DIR: case EVFS_CMD_FILE_TEST: case EVFS_CMD_FILE_COPY: + case EVFS_CMD_FILE_OPEN: + case EVFS_CMD_FILE_READ: evfs_write_file_command(conn, command); break; default: @@ -303,6 +330,9 @@ case EVFS_CMD_LIST_DIR: case EVFS_CMD_FILE_TEST: case EVFS_CMD_FILE_COPY: + case EVFS_CMD_FILE_OPEN: + case EVFS_CMD_FILE_READ: + evfs_write_file_command_client(client, command); break; default: @@ -335,6 +365,13 @@ ecore_ipc_message_new(EVFS_COMMAND, EVFS_COMMAND_TYPE, 0,0,0, &command->type, sizeof(evfs_command_type))); + + evfs_write_ecore_ipc_server_message(conn->server, + ecore_ipc_message_new(EVFS_COMMAND, EVFS_COMMAND_EXTRA, 0,0,0, + &command->file_command.extra, sizeof(int))); + + + /*Write the files*/ /*Send them de-parsed to save time*/ for (i=0;i<command->file_command.num_files;i++) { @@ -383,6 +420,10 @@ ecore_ipc_message_new(EVFS_COMMAND, EVFS_FILE_REFERENCE, 0,0,0,uri, sizeof(uri))); + evfs_write_ecore_ipc_server_message(conn->server, + ecore_ipc_message_new(EVFS_COMMAND, + EVFS_FILE_REFERENCE_FD, 0,0,0,&ref->fd, sizeof(int))); + } /*Send a final*/ @@ -394,6 +435,12 @@ void evfs_write_file_command_client(evfs_client* client, evfs_command* command) { int i; char uri[1024]; + char* part; + int it; + Ecore_List* uri_part; + + + bzero(uri, 1024); /*Write the command type structure*/ @@ -401,28 +448,64 @@ ecore_ipc_message_new(EVFS_COMMAND, EVFS_COMMAND_TYPE, client->id,0,0, &command->type, sizeof(evfs_command_type))); + evfs_write_ecore_ipc_client_message(client->client, + ecore_ipc_message_new(EVFS_COMMAND, EVFS_COMMAND_EXTRA, client->id,0,0, + &command->file_command.extra, sizeof(int))); + + /*Write the files*/ /*Send them de-parsed to save time*/ for (i=0;i<command->file_command.num_files;i++) { - if (command->file_command.files[i]->username) { - snprintf(uri, 1024, "%s://%s:[EMAIL PROTECTED]", - command->file_command.files[i]->plugin_uri, - command->file_command.files[i]->username, - command->file_command.files[i]->password, - command->file_command.files[i]->path); - - } else { - snprintf(uri, 1024, "%s://%s", - command->file_command.files[i]->plugin_uri, - command->file_command.files[i]->path); + evfs_filereference* ref = command->file_command.files[i]; + uri_part = ecore_dlist_new(); + + it=0; + do { + if (it) { + ref = ref->parent; + } + + if (ref->username) { + snprintf(uri, 1024, "%s://%s:[EMAIL PROTECTED]", + ref->plugin_uri, + ref->username, + ref->password, + ref->path); + } else { + snprintf(uri, 1024, "%s://%s", + ref->plugin_uri, + ref->path); + } + ecore_dlist_append(uri_part, strdup(uri)); + //printf("Appended URI '%s'\n", uri); + + it++; + } while (ref->parent); + + it = 0; + bzero(uri, 1024); + + ecore_dlist_goto_last(uri_part); + while ( (part = ecore_dlist_previous(uri_part))) { + if (it) strcat(uri, "#"); + strcat(uri, part); + + free(part); + it++; } - + ecore_dlist_destroy(uri_part); + evfs_write_ecore_ipc_client_message(client->client, ecore_ipc_message_new(EVFS_COMMAND, EVFS_FILE_REFERENCE, client->id,0,0,uri, sizeof(uri) + 1)); + evfs_write_ecore_ipc_client_message(client->client, + ecore_ipc_message_new(EVFS_COMMAND, + EVFS_FILE_REFERENCE_FD, client->id,0,0,&ref->fd, sizeof(int))); + + @@ -445,10 +528,11 @@ switch (message->minor) { case EVFS_COMMAND_TYPE: - memcpy(&command->type,message->data,sizeof(evfs_command_type)); + break; - + case EVFS_COMMAND_EXTRA: + memcpy(&command->file_command.extra, message->data, sizeof(int)); break; case EVFS_FILE_REFERENCE: { //printf("Parsing URI: '%s'\n", message->data); @@ -511,6 +595,15 @@ break; + case EVFS_FILE_REFERENCE_FD: + if (command->file_command.num_files) { + command->file_command.files[command->file_command.num_files-1]->fd = *(int*)message->data; + } else { + printf("BAD: Received an FD before a filerefereence!\n"); + } + break; + + case EVFS_COMMAND_END: /*TODO cleanp ref event*/ ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs