Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Letwory <nathan@letworyinteractive.com>2004-04-16 19:55:16 +0400
committerNathan Letwory <nathan@letworyinteractive.com>2004-04-16 19:55:16 +0400
commit39a8c014c4572f7f5f9ca099482929b67fe4273e (patch)
tree84224067db57aaa5717930d2c5703f7ab70f14f8 /source/blender/readblenfile/intern
parent2cc124cf3b1281488c726b71090c1d2640e8078d (diff)
This commit removes the glue from Blender, and with it
the directories decrypt, deflate, encrypt, inflate, readstreamglue, sign, writeblenfile and writestreamglue. Sirdude was so kind to modify the makefiles, so SCons and Make are ready to build with the new Blender. Visual Studio workspaces, solutions and projectfiles still need to be updated (I'll do the .vcprojs and .sln myself after this commit). Runtimes created with the Blender Publisher are not anymore recognised - if you want these available, you'll have to convert them first to .blends with the Publisher.
Diffstat (limited to 'source/blender/readblenfile/intern')
-rw-r--r--source/blender/readblenfile/intern/BLO_readblenfile.c555
1 files changed, 8 insertions, 547 deletions
diff --git a/source/blender/readblenfile/intern/BLO_readblenfile.c b/source/blender/readblenfile/intern/BLO_readblenfile.c
index 902066fbbeb..698fed79842 100644
--- a/source/blender/readblenfile/intern/BLO_readblenfile.c
+++ b/source/blender/readblenfile/intern/BLO_readblenfile.c
@@ -50,14 +50,12 @@
#include <unistd.h> // read
#endif
-#include "BLO_readStreamGlue.h"
-
#include "BLO_readfile.h"
#include "BLO_readblenfile.h"
#include "BKE_blender.h"
-#define CACHESIZE 100000
+#include "BLI_blenlib.h"
/** Magic number for the file header */
char *headerMagic = "BLENDFI";
@@ -94,470 +92,7 @@ void BLO_setcurrentversionnumber(char array[4])
#define O_BINARY 0
#endif
-/**
- * Defines the data struct for the .blend file
- */
-struct BLO_readblenfileStruct {
- struct readStreamGlueStruct *streamGlue;
- int fileDes;
- unsigned int cacheSize;
- unsigned int inCache;
- unsigned int leftToRead;
- unsigned int Seek;
-
- int (*read)(struct BLO_readblenfileStruct *readblenfileStruct, void *buffer, int size);
-
- char *readCache;
- char *fromBuffer;
- int fromBufferSize;
- char crInBuffer;
- char removeCR;
-};
-
-// declare static functions
-
-static int readfromfilehandle(
- struct BLO_readblenfileStruct *readblenfileStruct,
- void *buffer,
- int size);
-
-static int readfrommemory(
- struct BLO_readblenfileStruct *readblenfileStruct,
- void *buffer,
- int size);
-
-static int fillcache(
- struct BLO_readblenfileStruct *readblenfileStruct);
-
-static unsigned int readfromcache(
- struct BLO_readblenfileStruct *readblenfileStruct,
- void * buffer,
- unsigned int size);
-
-static BlendFileData *readblenfilegeneric(
- struct BLO_readblenfileStruct *readblenfileStruct,
- BlendReadError *error_r);
-
-// implementation of static functions
-
-/**
- * \brief Reads data from the already opened file.
- * Given the file structure a buffer and the size of the block
- * the function will read from the file if it is open.
- * If not it will return -1 indicating an unopened file.
- *
- * \return Returns the size of the file read, or -1.
- */
-static int readfromfilehandle(
- struct BLO_readblenfileStruct *readblenfileStruct,
- void *buffer,
- int size)
-{
- int readsize = -1;
-
- if (readblenfileStruct->fileDes != -1) {
- readsize = read(readblenfileStruct->fileDes, buffer, size);
- }
-
- return(readsize);
-}
-
-/**
- * \brief Reads and erases from readblenfileStruct->fromBuffer
- *
- * Copies information from the from the fromBuffer to the buffer, then
- * decrements the size of the fromBuffer, and moves the pointer along
- * thereby effectively removing the data forever.
- *
- * \return Returns the size of the read from memory
- */
-static int readfrommemory(
- struct BLO_readblenfileStruct *readblenfileStruct,
- void *buffer,
- int size)
-{
- int readsize = -1;
-
- if (readblenfileStruct->fromBuffer) {
- if (size > readblenfileStruct->fromBufferSize) {
- size = readblenfileStruct->fromBufferSize;
- }
-
- memcpy(buffer, readblenfileStruct->fromBuffer, size);
- readblenfileStruct->fromBufferSize -= size;
- readblenfileStruct->fromBuffer += size;
-
- readsize = size;
- }
-
- return(readsize);
-}
-
-/**
- * Read in data from the file into a cache.
- *
- * \return Returns the size of the read.
- *
- * \attention Note: there is some code missing to return CR if the
- * structure indicates it.
-*/
-static int fillcache(
- struct BLO_readblenfileStruct *readblenfileStruct)
-{
- int readsize;
- int toread;
-
- // how many bytes can we read ?
-
- toread = readblenfileStruct->leftToRead;
-
- if (toread > readblenfileStruct->cacheSize) {
- toread = readblenfileStruct->cacheSize;
- }
-
- readsize = readblenfileStruct->read(readblenfileStruct, readblenfileStruct->readCache, toread);
- if (readsize > 0) {
- if (readblenfileStruct->removeCR) {
- // do some stuff here
- }
- readblenfileStruct->inCache = readsize;
- readblenfileStruct->leftToRead -= readsize;
- }
-
- return (readsize);
-}
-
-/**
- * \brief Read data from the cache into a buffer.
- * Marks the last read location with a seek value.
- *
- * \return Returns the size of the read from the cache.
- *
- * \attention Note: missing some handling code if the location is
- * \attention outside of the cache.
- */
-static unsigned int readfromcache(
- struct BLO_readblenfileStruct *readblenfileStruct,
- void * buffer,
- unsigned int size)
-{
- unsigned int readsize = 0;
-
- if (readblenfileStruct->inCache - readblenfileStruct->Seek > size) {
- memcpy(buffer, readblenfileStruct->readCache + readblenfileStruct->Seek, size);
- readblenfileStruct->Seek += size;
- readsize = size;
- } else {
- // handle me
- }
-
- return(readsize);
-}
-
-/**
- * \brief Converts from BRS error code to BRE error code.
- *
- * Error conversion method to convert from
- * the BRS type errors and return a BRE
- * type error code.
- * Decodes based on the function, the generic,
- * and the specific portions of the error.
- */
-static BlendReadError brs_to_bre(int err)
-{
- int errFunction = BRS_GETFUNCTION(err);
- int errGeneric = BRS_GETGENERR(err);
- int errSpecific = BRS_GETSPECERR(err);
-
- if (errGeneric) {
- switch (errGeneric) {
- case BRS_MALLOC:
- return BRE_OUT_OF_MEMORY;
- case BRS_NULL:
- return BRE_INTERNAL_ERROR;
- case BRS_MAGIC:
- return BRE_NOT_A_BLEND;
- case BRS_CRCHEADER:
- case BRS_CRCDATA:
- return BRE_CORRUPT;
- case BRS_DATALEN:
- return BRE_INCOMPLETE;
- case BRS_STUB:
- return BRE_NOT_A_BLEND;
- }
- } else if (errSpecific) {
- switch (errFunction) {
- case BRS_READSTREAMGLUE:
- switch (errSpecific) {
- case BRS_UNKNOWN:
- return BRE_INTERNAL_ERROR;
- }
- break;
- case BRS_READSTREAMFILE:
- switch (errSpecific) {
- case BRS_NOTABLEND:
- return BRE_NOT_A_BLEND;
- case BRS_READERROR:
- return BRE_UNABLE_TO_READ;
- }
- break;
- case BRS_INFLATE:
- switch (errSpecific) {
- case BRS_INFLATEERROR:
- return BRE_CORRUPT;
- }
- break;
- case BRS_DECRYPT:
- switch (errSpecific) {
- case BRS_RSANEWERROR:
- return BRE_INTERNAL_ERROR;
- case BRS_DECRYPTERROR:
- return BRE_INTERNAL_ERROR;
- case BRS_NOTOURPUBKEY:
- return BRE_NOT_ALLOWED;
- }
- break;
- case BRS_VERIFY:
- switch (errSpecific) {
- case BRS_RSANEWERROR:
- return BRE_INTERNAL_ERROR;
- case BRS_SIGFAILED:
- return BRE_INTERNAL_ERROR;
- }
- break;
- }
- }
-
- return BRE_INVALID;
-}
-
-static BlendFileData *readblenfilegeneric(
- struct BLO_readblenfileStruct *readblenfileStruct,
- BlendReadError *error_r)
-{
- BlendFileData *bfd= NULL;
- unsigned char reserved[BLO_RESERVEDSIZE];
- uint8_t minversion[4];
- uint8_t myversion[4];
- uint8_t version[4];
- uint8_t flags[4];
- void *parms[2];
- int filesize;
-
- parms[0]= &bfd;
- parms[1]= error_r;
-
- BLO_setcurrentversionnumber(myversion);
-
- readblenfileStruct->cacheSize = CACHESIZE;
- readblenfileStruct->readCache = malloc(readblenfileStruct->cacheSize);
-
- if (fillcache(readblenfileStruct) <= 0) {
- *error_r = BRE_UNABLE_TO_READ;
- } else if (readfromcache(readblenfileStruct, minversion, sizeof(minversion)) != sizeof(minversion)) {
- *error_r = BRE_UNABLE_TO_READ;
- } else if (memcmp(minversion, myversion, sizeof(minversion)) > 0) {
- *error_r = BRE_TOO_NEW;
- } else if (readfromcache(readblenfileStruct, version, sizeof(version)) != sizeof(version)) {
- *error_r = BRE_UNABLE_TO_READ;
- } else if (readfromcache(readblenfileStruct, flags, sizeof(flags)) != sizeof(flags)) {
- *error_r = BRE_UNABLE_TO_READ;
- } else if (readfromcache(readblenfileStruct, &filesize, sizeof(filesize)) != sizeof(filesize)) {
- *error_r = BRE_UNABLE_TO_READ;
- } else if (readfromcache(readblenfileStruct, reserved, sizeof(reserved)) != sizeof(reserved)) {
- *error_r = BRE_UNABLE_TO_READ;
- } else {
- filesize = ntohl(filesize);
-
- // substract number of bytes we've
- // been handling outside readfromcache()
- filesize -= strlen(headerMagic);
- filesize--;
-
- if (filesize < readblenfileStruct->inCache) {
- // we've allready read more than we're supposed to
- readblenfileStruct->inCache = filesize;
- readblenfileStruct->leftToRead = 0;
- } else {
- //
- readblenfileStruct->leftToRead = filesize - readblenfileStruct->inCache;
- }
-
- do {
- int err;
-
- *error_r = BRE_NONE;
- err = readStreamGlue(
- parms,
- &(readblenfileStruct->streamGlue),
- readblenfileStruct->readCache + readblenfileStruct->Seek,
- readblenfileStruct->inCache - readblenfileStruct->Seek);
-
- readblenfileStruct->inCache = 0;
- readblenfileStruct->Seek = 0;
-
- if (err) {
- bfd = NULL;
-
- /* If *error_r != BRE_NONE then it is
- * blo_readstreamfile_end signaling an error
- * in the loading code. Otherwise it is some
- * other part of the streamglue system signalling
- * and error so we convert the BRS error into
- * a BRE error.
- *
- * Does this have to be so convoluted? No.
- */
- if (*error_r == BRE_NONE) {
- *error_r = brs_to_bre(err);
- }
-
- break;
- }
- } while (fillcache(readblenfileStruct) > 0);
- }
-
- free(readblenfileStruct->readCache);
- readblenfileStruct->readCache = 0;
-
- return bfd;
-}
-
-// implementation of exported functions
-
-BlendFileData *
-BLO_readblenfilememory(
- char *fromBuffer,
- int fromBufferSize,
- BlendReadError *error_r)
-{
- int magiclen = strlen(headerMagic);
- BlendFileData *bfd = NULL;
-
- if (!fromBuffer) {
- *error_r = BRE_UNABLE_TO_OPEN;
- } else if (fromBufferSize < magiclen) {
- *error_r = BRE_UNABLE_TO_READ;
- } else if (strncmp(fromBuffer, headerMagic, magiclen) != 0) {
- *error_r = BRE_NOT_A_BLEND;
- } else if (fromBufferSize < magiclen+1) {
- *error_r = BRE_UNABLE_TO_READ;
- } else if (fromBuffer[magiclen] != '\r' && fromBuffer[magiclen] != '\n') {
- *error_r = BRE_NOT_A_BLEND;
- } else {
- int crnl;
-
- fromBuffer+= magiclen;
- fromBufferSize-= magiclen;
- crnl = (fromBuffer[0] == '\r');
- fromBuffer++;
- fromBufferSize--;
-
- if (crnl && fromBufferSize<1) {
- *error_r = BRE_UNABLE_TO_READ;
- } else {
- struct BLO_readblenfileStruct *readblenfileStruct = NULL;
-
- /* skip carriage return if necessary */
- if (crnl) {
- fromBuffer++;
- fromBufferSize--;
- }
-
- // Allocate all the stuff we need
- readblenfileStruct = calloc(sizeof(struct BLO_readblenfileStruct), 1);
- readblenfileStruct->fileDes = -1;
- readblenfileStruct->fromBuffer = fromBuffer;
- readblenfileStruct->fromBufferSize = fromBufferSize;
- readblenfileStruct->read = readfrommemory;
-
- readblenfileStruct->removeCR = crnl;
- // fake filesize for now until we've
- // actually read in the filesize from the header
- // make sure we don't read more bytes than there
- // are left to handle accoding to fromBufferSize
- readblenfileStruct->leftToRead = readblenfileStruct->fromBufferSize;
-
- bfd = readblenfilegeneric(readblenfileStruct, error_r);
-
- free(readblenfileStruct);
- readblenfileStruct = 0;
- }
- }
-
- return bfd;
-}
-
-
-BlendFileData *
-BLO_readblenfilehandle(
- int fd,
- BlendReadError *error_r)
-{
- int magiclen = strlen(headerMagic);
- BlendFileData *bfd = NULL;
- char tempbuffer[256];
-
- if (fd==-1) {
- *error_r = BRE_UNABLE_TO_OPEN;
- } else if (read(fd, tempbuffer, magiclen) != magiclen) {
- *error_r = BRE_UNABLE_TO_READ;
- } else if (strncmp(tempbuffer, headerMagic, magiclen) != 0 ) {
- *error_r = BRE_NOT_A_BLEND;
- } else if (read(fd, tempbuffer, 1) != 1) {
- *error_r = BRE_UNABLE_TO_READ;
- } else if (tempbuffer[0] != '\r' && tempbuffer[0] != '\n') {
- *error_r = BRE_NOT_A_BLEND;
- } else {
- int crnl = (tempbuffer[0] == '\r');
-
- if (crnl && read(fd, tempbuffer, 1)!=1) {
- *error_r = BRE_UNABLE_TO_READ;
- } else {
- struct BLO_readblenfileStruct *readblenfileStruct;
-
- // Allocate all the stuff we need
- readblenfileStruct = calloc(sizeof(struct BLO_readblenfileStruct), 1);
- readblenfileStruct->fileDes = fd;
- readblenfileStruct->read = readfromfilehandle;
-
- readblenfileStruct->removeCR = crnl;
- // fake filesize for now until we've
- // actually read in the filesize from the header
- readblenfileStruct->leftToRead = CACHESIZE;
-
- bfd = readblenfilegeneric(readblenfileStruct, error_r);
-
- free(readblenfileStruct);
- readblenfileStruct = 0;
- }
- }
-
- return bfd;
-}
-
-BlendFileData *
-BLO_readblenfilename(
- char *fileName,
- BlendReadError *error_r)
-{
- BlendFileData *bfd = NULL;
- int fd;
-
- fd = open(fileName, O_RDONLY | O_BINARY);
- if (fd==-1) {
- *error_r= BRE_UNABLE_TO_OPEN;
- } else {
- bfd = BLO_readblenfilehandle(fd, error_r);
- }
-
- if (fd!=-1)
- close(fd);
-
- return bfd;
-}
-
- /* Runtime reading */
+/* Runtime reading */
static int handle_read_msb_int(int handle) {
unsigned char buf[4];
@@ -601,7 +136,8 @@ blo_read_runtime(
BlendReadError *error_r)
{
BlendFileData *bfd= NULL;
- int fd, datastart;
+ void *filedata= NULL;
+ int fd, actualsize, datastart;
char buf[8];
fd= open(path, O_BINARY|O_RDONLY, 0);
@@ -609,6 +145,8 @@ blo_read_runtime(
*error_r= BRE_UNABLE_TO_OPEN;
goto cleanup;
}
+
+ actualsize= BLI_filesize(fd);
lseek(fd, -12, SEEK_END);
@@ -623,8 +161,9 @@ blo_read_runtime(
*error_r= BRE_NOT_A_BLEND;
goto cleanup;
} else {
+ printf("starting to read runtime from %s at datastart %d\n", path, datastart);
lseek(fd, datastart, SEEK_SET);
- bfd= BLO_readblenfilehandle(fd, error_r);
+ bfd = blo_read_blendafterruntime(fd, actualsize-datastart, error_r);
}
cleanup:
@@ -634,81 +173,3 @@ cleanup:
return bfd;
}
-#if 0
-static char *brs_error_to_string(int err) {
- int errFunction = BRS_GETFUNCTION(err);
- int errGeneric = BRS_GETGENERR(err);
- int errSpecific = BRS_GETSPECERR(err);
- char *errFunctionStrings[] = {
- "",
- "The read stream",
- "The read stream loopback",
- "The key store",
- "The file reading",
- "Decompressing the file",
- "Decrypting the file",
- "Verifying the signature"};
- char *errGenericStrings[] = {
- "",
- "generated an out of memory error",
- "bumped on an internal programming error",
- "did not recognize this as a blend file",
- "failed a blend file check",
- "bumped on corrupted data",
- "needed the rest of the blend file",
- "is not allowed in this version"};
- char *errReadStreamGlueStrings[] = {
- "",
- "does not know how to proceed"};
- char *errReadStreamFileStrings[] = {
- "",
- "did not recognize this as a blend file",
- "was busted on a read error"};
- char *errInflateStrings[] = {
- "",
- "bumped on a decompress error"};
- char *errDecryptStrings[] = {
- "",
- "could not make a new key",
- "bumped on a decrypt error",
- "was not allowed. This blend file is not made by you."};
- char *errVerifyStrings[] = {
- "",
- "could not make a new key",
- "failed"};
- char *errFunctionString= errFunctionStrings[errFunction];
- char *errExtraString= "";
- char *errString;
-
- if (errGeneric) {
- errExtraString= errGenericStrings[errGeneric];
- } else if (errSpecific) {
- switch (errFunction) {
- case BRS_READSTREAMGLUE:
- errExtraString= errReadStreamGlueStrings[errSpecific];
- break;
- case BRS_READSTREAMFILE:
- errExtraString= errReadStreamFileStrings[errSpecific];
- break;
- case BRS_INFLATE:
- errExtraString= errInflateStrings[errSpecific];
- break;
- case BRS_DECRYPT:
- errExtraString= errDecryptStrings[errSpecific];
- break;
- case BRS_VERIFY:
- errExtraString= errVerifyStrings[errSpecific];
- break;
- default:
- break;
- }
- }
-
- errString= MEM_mallocN(strlen(errFunctionString) + 1 + strlen(errExtraString) + 1);
- sprintf(errString, "%s %s", errFunctionString, errExtraString);
-
- return errString;
-}
-#endif
-
-