diff options
Diffstat (limited to 'src/myriad.cpp')
-rw-r--r-- | src/myriad.cpp | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/src/myriad.cpp b/src/myriad.cpp index f5bc67b..2f5c14f 100644 --- a/src/myriad.cpp +++ b/src/myriad.cpp | |||
@@ -24,13 +24,28 @@ namespace Bu | |||
24 | } | 24 | } |
25 | } | 25 | } |
26 | 26 | ||
27 | Bu::Myriad::Myriad( Bu::Stream &sStore ) : | 27 | Bu::Myriad::Myriad( Bu::Stream &sStore, int iBlockSize, int iPreallocate ) : |
28 | sStore( sStore ), | 28 | sStore( sStore ), |
29 | iBlockSize( 0 ), | 29 | iBlockSize( iBlockSize ), |
30 | iBlocks( 0 ), | 30 | iBlocks( 0 ), |
31 | iUsed( 0 ), | 31 | iUsed( 0 ), |
32 | bHeaderChanged( false ) | 32 | bHeaderChanged( false ) |
33 | { | 33 | { |
34 | try | ||
35 | { | ||
36 | initialize(); | ||
37 | } | ||
38 | catch( Bu::MyriadException &e ) | ||
39 | { | ||
40 | if( e.getErrorCode() == MyriadException::emptyStream ) | ||
41 | { | ||
42 | initialize( iBlockSize, iPreallocate ); | ||
43 | } | ||
44 | else | ||
45 | { | ||
46 | throw; | ||
47 | } | ||
48 | } | ||
34 | } | 49 | } |
35 | 50 | ||
36 | Bu::Myriad::~Myriad() | 51 | Bu::Myriad::~Myriad() |
@@ -69,18 +84,19 @@ void Bu::Myriad::initialize() | |||
69 | 84 | ||
70 | unsigned char buf[4]; | 85 | unsigned char buf[4]; |
71 | if( sStore.read( buf, 4 ) < 4 ) | 86 | if( sStore.read( buf, 4 ) < 4 ) |
72 | throw MyriadException("Input stream appears to be empty."); | 87 | throw MyriadException( MyriadException::emptyStream, |
88 | "Input stream appears to be empty."); | ||
73 | if( memcmp( buf, Myriad_MAGIC_CODE, 4 ) ) | 89 | if( memcmp( buf, Myriad_MAGIC_CODE, 4 ) ) |
74 | { | 90 | { |
75 | throw MyriadException( | 91 | throw MyriadException( MyriadException::invalidFormat, |
76 | "Stream does not appear to be a valid Myriad format."); | 92 | "Stream does not appear to be a valid Myriad format."); |
77 | } | 93 | } |
78 | sStore.read( buf, 2 ); | 94 | sStore.read( buf, 2 ); |
79 | if( buf[0] != 1 ) | 95 | if( buf[0] != 1 ) |
80 | throw MyriadException( | 96 | throw MyriadException( MyriadException::badVersion, |
81 | "We can only handle version 1 for now."); | 97 | "We can only handle version 1 for now."); |
82 | if( buf[1] != 32 ) | 98 | if( buf[1] != 32 ) |
83 | throw MyriadException( | 99 | throw MyriadException( MyriadException::invalidWordSize, |
84 | "We can only handle 32-bit words at the moment."); | 100 | "We can only handle 32-bit words at the moment."); |
85 | sStore.read( &iBlockSize, 4 ); | 101 | sStore.read( &iBlockSize, 4 ); |
86 | int iStreams; | 102 | int iStreams; |
@@ -342,12 +358,16 @@ int Bu::Myriad::findEmptyBlock() | |||
342 | // sio << "Myriad: findEmptyBlock(): No empty blocks, adding new one." << sio.nl; | 358 | // sio << "Myriad: findEmptyBlock(): No empty blocks, adding new one." << sio.nl; |
343 | 359 | ||
344 | bsBlockUsed.setSize( bsBlockUsed.getSize()+1, false ); | 360 | bsBlockUsed.setSize( bsBlockUsed.getSize()+1, false ); |
361 | /* | ||
345 | sStore.setPos( iBlockSize*iBlocks ); | 362 | sStore.setPos( iBlockSize*iBlocks ); |
346 | 363 | ||
347 | char *pBlock = new char[iBlockSize]; | 364 | char *pBlock = new char[iBlockSize]; |
348 | memset( pBlock, 0, iBlockSize ); | 365 | memset( pBlock, 0, iBlockSize ); |
349 | sStore.write( pBlock, iBlockSize ); | 366 | sStore.write( pBlock, iBlockSize ); |
350 | delete[] pBlock; | 367 | delete[] pBlock; |
368 | */ | ||
369 | |||
370 | sStore.setSize( (iBlocks+1)*iBlockSize ); | ||
351 | 371 | ||
352 | return iBlocks++; | 372 | return iBlocks++; |
353 | } | 373 | } |
@@ -400,6 +420,9 @@ Bu::Myriad::Stream *Bu::Myriad::findStream( int iId ) | |||
400 | return *i; | 420 | return *i; |
401 | } | 421 | } |
402 | 422 | ||
423 | throw MyriadException( MyriadException::noSuchStream, | ||
424 | "The requested stream doesn't exist and cannot be opened." ); | ||
425 | |||
403 | return NULL; | 426 | return NULL; |
404 | } | 427 | } |
405 | 428 | ||
@@ -480,3 +503,19 @@ void Bu::Myriad::setStreamSize( Stream *pStream, long iSize ) | |||
480 | } | 503 | } |
481 | } | 504 | } |
482 | 505 | ||
506 | bool Bu::Myriad::isMyriad( Bu::Stream &sStore ) | ||
507 | { | ||
508 | sStore.setPos( 0 ); | ||
509 | |||
510 | unsigned char buf[4]; | ||
511 | if( sStore.read( buf, 4 ) < 4 ) | ||
512 | throw MyriadException( MyriadException::emptyStream, | ||
513 | "Input stream appears to be empty."); | ||
514 | sStore.setPos( 0 ); | ||
515 | if( memcmp( buf, Myriad_MAGIC_CODE, 4 ) ) | ||
516 | { | ||
517 | return false; | ||
518 | } | ||
519 | return true; | ||
520 | } | ||
521 | |||