[Redbutton-devel] SF.net SVN: redbutton: [26] redbutton-browser/trunk
Brought to you by:
skilvington
|
From: <ski...@us...> - 2006-03-25 10:43:26
|
Revision: 26 Author: skilvington Date: 2006-03-25 02:43:15 -0800 (Sat, 25 Mar 2006) ViewCVS: http://svn.sourceforge.net/redbutton/?rev=26&view=rev Log Message: ----------- backend returns file size Modified Paths: -------------- redbutton-browser/trunk/MHEGBackend.c redbutton-download/trunk/command.c Modified: redbutton-browser/trunk/MHEGBackend.c =================================================================== --- redbutton-browser/trunk/MHEGBackend.c 2006-03-21 16:52:10 UTC (rev 25) +++ redbutton-browser/trunk/MHEGBackend.c 2006-03-25 10:43:15 UTC (rev 26) @@ -363,41 +363,46 @@ { char cmd[PATH_MAX]; FILE *sock; - char buf[8 * 1024]; + unsigned int size; size_t nread; - bool success = false; snprintf(cmd, sizeof(cmd), "file %s\n", MHEGEngine_absoluteFilename(name)); if((sock = remote_command(t, cmd)) == NULL) return false; - /* does it exist */ - if(remote_response(sock) == BACKEND_RESPONSE_OK) + /* if it exists, read the file size */ + if(remote_response(sock) != BACKEND_RESPONSE_OK + || fgets(cmd, sizeof(cmd), sock) == NULL + || sscanf(cmd, "Length %u", &size) != 1) { - verbose("Loading '%.*s'", name->size, name->data); - /* read from the socket until EOF */ - while(!feof(sock)) - { -/* TODO */ -/* could read straight into out->data rather than doing memcpy */ - if((nread = fread(buf, 1, sizeof(buf), sock)) > 0) - { - out->data = safe_realloc(out->data, out->size + nread); - memcpy(out->data + out->size, buf, nread); - out->size += nread; - } - } - success = true; + error("Unable to load '%.*s'", name->size, name->data); + fclose(sock); + return false; } - else + + verbose("Loading '%.*s'", name->size, name->data); + + out->size = size; + out->data = safe_malloc(size); + + nread = 0; + while(!feof(sock) && nread < size) + nread += fread(out->data + nread, 1, size - nread, sock); + + fclose(sock); + + /* did we read it all */ + if(nread < size) { error("Unable to load '%.*s'", name->size, name->data); + safe_free(out->data); + out->data = NULL; + out->size = 0; + return false; } - fclose(sock); - - return success; + return true; } /* @@ -410,39 +415,38 @@ { char cmd[PATH_MAX]; FILE *sock; + unsigned int size; char buf[8 * 1024]; size_t nread; - size_t nwritten; - FILE *out = NULL; + FILE *out; snprintf(cmd, sizeof(cmd), "file %s\n", MHEGEngine_absoluteFilename(name)); if((sock = remote_command(t, cmd)) == NULL) return NULL; - /* does it exist */ - if(remote_response(sock) == BACKEND_RESPONSE_OK) + /* if it exists, read the file size */ + if(remote_response(sock) != BACKEND_RESPONSE_OK + || fgets(cmd, sizeof(cmd), sock) == NULL + || sscanf(cmd, "Length %u", &size) != 1) { - /* tmpfile() will delete the file when we fclose() it */ - if((out = tmpfile()) != NULL) + fclose(sock); + return NULL; + } + + /* tmpfile() will delete the file when we fclose() it */ + out = tmpfile(); + while(out != NULL && size > 0) + { + nread = (size < sizeof(buf)) ? size : sizeof(buf); + nread = fread(buf, 1, nread, sock); + if(fwrite(buf, 1, nread, out) != nread) { - /* read from the socket until EOF */ - do - { - if((nread = fread(buf, 1, sizeof(buf), sock)) > 0) - nwritten = fwrite(buf, 1, nread, out); - else - nwritten = 0; - } - while(!feof(sock) && nread == nwritten); - /* could we write the file ok */ - if(nread != nwritten) - { - error("Unable to write to local file"); - fclose(out); - out = NULL; - } + error("Unable to write to local file"); + fclose(out); + out = NULL; } + size -= nread; } fclose(sock); Modified: redbutton-download/trunk/command.c =================================================================== --- redbutton-download/trunk/command.c 2006-03-21 16:52:10 UTC (rev 25) +++ redbutton-download/trunk/command.c 2006-03-25 10:43:15 UTC (rev 26) @@ -367,6 +367,9 @@ { char *filename; FILE *file; + long size; + char hdr[64]; + long left; size_t nread; char buff[1024 * 8]; @@ -384,15 +387,29 @@ return false; } + /* find the file length */ + if(fseek(file, 0, SEEK_END) < 0 + || (size = ftell(file)) < 0) + { + SEND_RESPONSE(500, "Error reading file"); + return false; + } + rewind(file); + SEND_RESPONSE(200, "OK"); + /* send the file length */ + snprintf(hdr, sizeof(hdr), "Length %ld\n", size); + write_string(client_sock, hdr); + /* send the file contents */ - do + left = size; + while(left > 0) { nread = fread(buff, 1, sizeof(buff), file); write_all(client_sock, buff, nread); + left -= nread; } - while(nread == sizeof(buff)); fclose(file); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |