diff options
Diffstat (limited to 'src/nids.cpp')
-rw-r--r-- | src/nids.cpp | 106 |
1 files changed, 93 insertions, 13 deletions
diff --git a/src/nids.cpp b/src/nids.cpp index 41c4dc1..d0cb843 100644 --- a/src/nids.cpp +++ b/src/nids.cpp | |||
@@ -3,9 +3,20 @@ | |||
3 | #include "bu/nidsstream.h" | 3 | #include "bu/nidsstream.h" |
4 | #include <stdio.h> | 4 | #include <stdio.h> |
5 | 5 | ||
6 | #define NIDS_MAGIC_CODE "\xFF\xC3\x99\xBD" | ||
7 | |||
8 | namespace Bu | ||
9 | { | ||
10 | subExceptionDef( NidsException ) | ||
11 | } | ||
12 | |||
6 | Bu::Nids::Nids( Bu::Stream &sStore ) : | 13 | Bu::Nids::Nids( Bu::Stream &sStore ) : |
7 | sStore( sStore ) | 14 | sStore( sStore ), |
15 | iBlockSize( 0 ), | ||
16 | iBlocks( 0 ), | ||
17 | iBlockStart( -1 ) | ||
8 | { | 18 | { |
19 | printf("blockUnused = %u\n", blockUnused ); | ||
9 | printf("Stream caps:\n" | 20 | printf("Stream caps:\n" |
10 | " canRead: %s\n" | 21 | " canRead: %s\n" |
11 | " canWrite: %s\n" | 22 | " canWrite: %s\n" |
@@ -25,19 +36,32 @@ Bu::Nids::Nids( Bu::Stream &sStore ) : | |||
25 | sStore.isOpen()?"yes":"no" | 36 | sStore.isOpen()?"yes":"no" |
26 | ); | 37 | ); |
27 | printf("sizeof(Block) = %db\n", sizeof(Block) ); | 38 | printf("sizeof(Block) = %db\n", sizeof(Block) ); |
39 | |||
40 | |||
28 | } | 41 | } |
29 | 42 | ||
30 | Bu::Nids::~Nids() | 43 | Bu::Nids::~Nids() |
31 | { | 44 | { |
32 | } | 45 | } |
33 | 46 | ||
47 | void Bu::Nids::initialize() | ||
48 | { | ||
49 | char buf[4]; | ||
50 | sStore.read( buf, 4 ); | ||
51 | if( memcmp( buf, NIDS_MAGIC_CODE, 4 ) ) | ||
52 | { | ||
53 | throw NidsException( | ||
54 | "Stream does not appear to be a valid NIDS format."); | ||
55 | } | ||
56 | } | ||
57 | |||
34 | void Bu::Nids::initialize( int iBlockSize, int iPreAllocate ) | 58 | void Bu::Nids::initialize( int iBlockSize, int iPreAllocate ) |
35 | { | 59 | { |
36 | char cBuf = 0; | 60 | char cBuf = 0; |
37 | int iBuf = 0; | 61 | int iBuf = 0; |
38 | 62 | ||
39 | // Magic number | 63 | // Magic number |
40 | sStore.write( "\xFF\xC3\x99\xBD", 4 ); | 64 | sStore.write( NIDS_MAGIC_CODE, 4 ); |
41 | 65 | ||
42 | // Version (0) | 66 | // Version (0) |
43 | sStore.write( &cBuf, 1 ); | 67 | sStore.write( &cBuf, 1 ); |
@@ -59,56 +83,112 @@ void Bu::Nids::initialize( int iBlockSize, int iPreAllocate ) | |||
59 | this->iBlockSize = iBlockSize; | 83 | this->iBlockSize = iBlockSize; |
60 | this->iBlocks = iPreAllocate; | 84 | this->iBlocks = iPreAllocate; |
61 | this->iBlockStart = sStore.tell(); | 85 | this->iBlockStart = sStore.tell(); |
86 | printf("iBlockStart = %d\n", this->iBlockStart ); | ||
62 | bsBlockUsed.setSize( iPreAllocate, true ); | 87 | bsBlockUsed.setSize( iPreAllocate, true ); |
63 | 88 | ||
64 | printf("%d blocks, %db each, %db block offset\n", | 89 | printf("%d blocks, %db each, %db block offset\n", |
65 | iBlocks, iBlockSize, iBlockStart ); | 90 | iBlocks, iBlockSize, iBlockStart ); |
66 | 91 | ||
67 | char *block = new char[iBlockSize]; | 92 | Block *block = (Block *)new char[iBlockSize]; |
68 | memset( block, 0, iBlockSize ); | 93 | memset( block, 0, iBlockSize ); |
94 | block->uFirstBlock = block->uNextBlock = block->uPrevBlock = blockUnused; | ||
69 | for( int j = 0; j < iPreAllocate; j++ ) | 95 | for( int j = 0; j < iPreAllocate; j++ ) |
70 | { | 96 | { |
71 | sStore.write( block, iBlockSize ); | 97 | sStore.write( block, iBlockSize ); |
72 | } | 98 | } |
99 | delete[] (char *)block; | ||
73 | } | 100 | } |
74 | 101 | ||
75 | int Bu::Nids::createStream( int iPreAllocate ) | 102 | uint32_t Bu::Nids::createBlock( uint32_t uFirstBlock, uint32_t uPrevBlock, |
103 | int /*iPreAllocate*/ ) | ||
76 | { | 104 | { |
77 | for( int j = 0; j < iBlocks; j++ ) | 105 | for( int j = 0; j < iBlocks; j++ ) |
78 | { | 106 | { |
79 | if( !bsBlockUsed.getBit( j ) ) | 107 | if( !bsBlockUsed.getBit( j ) ) |
80 | { | 108 | { |
81 | Block b = { j, blockUnused, blockUnused, 0, 0 }; | 109 | Block b = { j, blockUnused, uPrevBlock, 0, 0, { } }; |
110 | if( uFirstBlock != blockUnused ) | ||
111 | b.uFirstBlock = uFirstBlock; | ||
82 | bsBlockUsed.setBit( j ); | 112 | bsBlockUsed.setBit( j ); |
83 | sStore.setPos( iBlockStart+(iBlockSize*j) ); | 113 | sStore.setPos( iBlockStart+(iBlockSize*j) ); |
84 | sStore.write( &b, sizeof(b) ); | 114 | sStore.write( &b, sizeof(b) ); |
115 | return j; | ||
85 | } | 116 | } |
86 | } | 117 | } |
87 | return 0; | 118 | return blockUnused; |
88 | } | 119 | } |
89 | 120 | ||
90 | void Bu::Nids::deleteStream( int iID ) | 121 | int Bu::Nids::createStream( int iPreAllocate ) |
122 | { | ||
123 | return createBlock( blockUnused, blockUnused, iPreAllocate ); | ||
124 | } | ||
125 | |||
126 | void Bu::Nids::deleteStream( int /*iID*/ ) | ||
91 | { | 127 | { |
92 | } | 128 | } |
93 | 129 | ||
94 | Bu::NidsStream Bu::Nids::openStream( int iID ) | 130 | Bu::NidsStream Bu::Nids::openStream( int iID ) |
95 | { | 131 | { |
96 | return NidsStream( *this ); | 132 | if( iBlockStart < 0 ) |
133 | { | ||
134 | initialize(); | ||
135 | } | ||
136 | return NidsStream( *this, iID ); | ||
97 | } | 137 | } |
98 | 138 | ||
99 | void Bu::Nids::extendStream( int iID, int iBlockCount ) | 139 | int Bu::Nids::getBlockSize() |
100 | { | 140 | { |
141 | return iBlockSize; | ||
101 | } | 142 | } |
143 | /* | ||
144 | void Bu::Nids::extendStream( int iID, int iBlockCount ) | ||
145 | { | ||
146 | }*/ | ||
102 | 147 | ||
103 | void Bu::Nids::getBlock( int iIndex, Bu::Nids::Block *pBlock ) | 148 | void Bu::Nids::getBlock( uint32_t uIndex, Bu::Nids::Block *pBlock ) |
104 | { | 149 | { |
105 | sStore.setPos( iBlockStart + (iBlockSize*iIndex) ); | 150 | sStore.setPos( iBlockStart + (iBlockSize*uIndex) ); |
106 | sStore.read( pBlock, iBlockSize ); | 151 | sStore.read( pBlock, iBlockSize ); |
107 | } | 152 | } |
108 | 153 | ||
109 | void Bu::Nids::setBlock( int iIndex, Bu::Nids::Block *pBlock ) | 154 | void Bu::Nids::setBlock( uint32_t uIndex, Bu::Nids::Block *pBlock ) |
110 | { | 155 | { |
111 | sStore.setPos( iBlockStart + (iBlockSize*iIndex) ); | 156 | sStore.setPos( iBlockStart + (iBlockSize*uIndex) ); |
112 | sStore.write( pBlock, iBlockSize ); | 157 | sStore.write( pBlock, iBlockSize ); |
113 | } | 158 | } |
114 | 159 | ||
160 | void Bu::Nids::updateStreamSize( uint32_t uIndex, uint32_t uSize ) | ||
161 | { | ||
162 | sStore.setPos( iBlockStart + (iBlockSize*uIndex)+4*3 ); | ||
163 | sStore.write( &uSize, 4 ); | ||
164 | } | ||
165 | |||
166 | uint32_t Bu::Nids::getNextBlock( uint32_t uIndex, | ||
167 | struct Bu::Nids::Block *pBlock ) | ||
168 | { | ||
169 | uint32_t uNew; | ||
170 | if( pBlock->uNextBlock == blockUnused ) | ||
171 | { | ||
172 | uNew = createBlock( pBlock->uFirstBlock, uIndex ); | ||
173 | sStore.setPos( iBlockStart + (iBlockSize*uIndex)+1*4 ); | ||
174 | sStore.write( &uNew, 4 ); | ||
175 | getBlock( uNew, pBlock ); | ||
176 | } | ||
177 | else | ||
178 | { | ||
179 | uNew = pBlock->uNextBlock; | ||
180 | getBlock( pBlock->uNextBlock, pBlock ); | ||
181 | } | ||
182 | return uNew; | ||
183 | } | ||
184 | |||
185 | Bu::Nids::Block *Bu::Nids::newBlock() | ||
186 | { | ||
187 | return (Block *)new char[iBlockSize]; | ||
188 | } | ||
189 | |||
190 | void Bu::Nids::deleteBlock( Block *pBlock ) | ||
191 | { | ||
192 | delete[] (char *)pBlock; | ||
193 | } | ||
194 | |||