diff options
Diffstat (limited to 'src/nidsstream.cpp')
-rw-r--r-- | src/nidsstream.cpp | 95 |
1 files changed, 86 insertions, 9 deletions
diff --git a/src/nidsstream.cpp b/src/nidsstream.cpp index 2f24d69..740dc1f 100644 --- a/src/nidsstream.cpp +++ b/src/nidsstream.cpp | |||
@@ -1,20 +1,41 @@ | |||
1 | #include "bu/nidsstream.h" | 1 | #include "bu/nidsstream.h" |
2 | 2 | ||
3 | Bu::NidsStream::NidsStream( Nids &rNids ) : | 3 | Bu::NidsStream::NidsStream( Nids &rNids, uint32_t uStream ) : |
4 | rNids( rNids ), | 4 | rNids( rNids ), |
5 | iPos( 0 ) | 5 | uStream( uStream ), |
6 | pCurBlock( NULL ), | ||
7 | uCurBlock( uStream ), | ||
8 | uSize( 0 ), | ||
9 | uBlockSize( rNids.iBlockSize-sizeof(Nids::Block) ), | ||
10 | uPos( 0 ) | ||
6 | { | 11 | { |
12 | printf("NidsStream::allocated\n"); | ||
13 | pCurBlock = rNids.newBlock(); | ||
14 | rNids.getBlock( uStream, pCurBlock ); | ||
15 | uSize = pCurBlock->uBytesUsed; | ||
7 | } | 16 | } |
8 | 17 | ||
18 | /* | ||
9 | Bu::NidsStream::NidsStream( const Bu::NidsStream &rSrc ) : | 19 | Bu::NidsStream::NidsStream( const Bu::NidsStream &rSrc ) : |
20 | Stream( rSrc ), | ||
10 | rNids( rSrc.rNids ), | 21 | rNids( rSrc.rNids ), |
11 | iPos( 0 ) | 22 | uStream( rSrc.uStream ), |
12 | { | 23 | pCurBlock( NULL ), |
13 | 24 | uCurBlock( uStream ), | |
14 | } | 25 | uSize( 0 ), |
26 | uBlockSize( rSrc.uBlockSize ), | ||
27 | iUsable( uBlockSize-sizeof(Nids::Block) ), | ||
28 | uPos( 0 ) | ||
29 | { | ||
30 | printf("NidsStream::copied\n"); | ||
31 | pCurBlock = rNids.newBlock(); | ||
32 | rNids.getBlock( uStream, pCurBlock ); | ||
33 | }*/ | ||
15 | 34 | ||
16 | Bu::NidsStream::~NidsStream() | 35 | Bu::NidsStream::~NidsStream() |
17 | { | 36 | { |
37 | rNids.updateStreamSize( uStream, uSize ); | ||
38 | rNids.deleteBlock( pCurBlock ); | ||
18 | } | 39 | } |
19 | 40 | ||
20 | void Bu::NidsStream::close() | 41 | void Bu::NidsStream::close() |
@@ -23,29 +44,85 @@ void Bu::NidsStream::close() | |||
23 | 44 | ||
24 | size_t Bu::NidsStream::read( void *pBuf, size_t nBytes ) | 45 | size_t Bu::NidsStream::read( void *pBuf, size_t nBytes ) |
25 | { | 46 | { |
47 | if( uPos%uBlockSize+nBytes < uBlockSize ) | ||
48 | { | ||
49 | size_t iRead = nBytes; | ||
50 | if( iRead > pCurBlock->uBytesUsed ) | ||
51 | iRead = pCurBlock->uBytesUsed; | ||
52 | memcpy( pBuf, pCurBlock->pData+(uPos%uBlockSize), iRead ); | ||
53 | uPos += nBytes; | ||
54 | printf("a: block %u = %ub (%ub total)\n", | ||
55 | uCurBlock, pCurBlock->uBytesUsed, uSize ); | ||
56 | return iRead; | ||
57 | } | ||
58 | else | ||
59 | { | ||
60 | //size_t iTotal = 0; | ||
61 | for(;;) | ||
62 | { | ||
63 | |||
64 | } | ||
65 | } | ||
26 | return 0; | 66 | return 0; |
27 | } | 67 | } |
28 | 68 | ||
29 | size_t Bu::NidsStream::write( const void *pBuf, size_t nBytes ) | 69 | size_t Bu::NidsStream::write( const void *pBuf, size_t nBytes ) |
30 | { | 70 | { |
31 | return 0; | 71 | if( uPos%uBlockSize+nBytes < uBlockSize ) |
72 | { | ||
73 | memcpy( pCurBlock->pData+(uPos%uBlockSize), pBuf, nBytes ); | ||
74 | pCurBlock->uBytesUsed += nBytes; | ||
75 | rNids.setBlock( uCurBlock, pCurBlock ); | ||
76 | uPos += nBytes; | ||
77 | uSize += nBytes; | ||
78 | printf("a: block %u = %ub (%ub total)\n", | ||
79 | uCurBlock, pCurBlock->uBytesUsed, uSize ); | ||
80 | return nBytes; | ||
81 | } | ||
82 | else | ||
83 | { | ||
84 | size_t nTotal = 0; | ||
85 | for(;;) | ||
86 | { | ||
87 | uint32_t uNow = uBlockSize-(uPos%uBlockSize); | ||
88 | if( nBytes < uNow ) | ||
89 | uNow = nBytes; | ||
90 | memcpy( pCurBlock->pData+(uPos%uBlockSize), | ||
91 | &((char *)pBuf)[nTotal], uNow ); | ||
92 | pCurBlock->uBytesUsed += uNow; | ||
93 | rNids.setBlock( uCurBlock, pCurBlock ); | ||
94 | uSize += uNow; | ||
95 | uPos += uNow; | ||
96 | nTotal += uNow; | ||
97 | nBytes -= uNow; | ||
98 | printf("b: block %u = %ub (%ub total)\n", | ||
99 | uCurBlock, pCurBlock->uBytesUsed, uSize ); | ||
100 | if( nBytes == 0 ) | ||
101 | return nTotal; | ||
102 | if( pCurBlock->uBytesUsed == uBlockSize ) | ||
103 | uCurBlock = rNids.getNextBlock( uCurBlock, pCurBlock ); | ||
104 | } | ||
105 | } | ||
32 | } | 106 | } |
33 | 107 | ||
34 | long Bu::NidsStream::tell() | 108 | long Bu::NidsStream::tell() |
35 | { | 109 | { |
36 | return 0; | 110 | return uPos; |
37 | } | 111 | } |
38 | 112 | ||
39 | void Bu::NidsStream::seek( long offset ) | 113 | void Bu::NidsStream::seek( long offset ) |
40 | { | 114 | { |
115 | uPos += offset; | ||
41 | } | 116 | } |
42 | 117 | ||
43 | void Bu::NidsStream::setPos( long pos ) | 118 | void Bu::NidsStream::setPos( long pos ) |
44 | { | 119 | { |
120 | uPos = pos; | ||
45 | } | 121 | } |
46 | 122 | ||
47 | void Bu::NidsStream::setPosEnd( long pos ) | 123 | void Bu::NidsStream::setPosEnd( long pos ) |
48 | { | 124 | { |
125 | uPos = uSize-pos-1; | ||
49 | } | 126 | } |
50 | 127 | ||
51 | bool Bu::NidsStream::isEOS() | 128 | bool Bu::NidsStream::isEOS() |
@@ -92,7 +169,7 @@ bool Bu::NidsStream::isBlocking() | |||
92 | return true; | 169 | return true; |
93 | } | 170 | } |
94 | 171 | ||
95 | void Bu::NidsStream::setBlocking( bool bBlocking ) | 172 | void Bu::NidsStream::setBlocking( bool /*bBlocking*/ ) |
96 | { | 173 | { |
97 | } | 174 | } |
98 | 175 | ||