aboutsummaryrefslogtreecommitdiff
path: root/c++-libbu++/src/gatsstream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'c++-libbu++/src/gatsstream.cpp')
-rw-r--r--c++-libbu++/src/gatsstream.cpp165
1 files changed, 86 insertions, 79 deletions
diff --git a/c++-libbu++/src/gatsstream.cpp b/c++-libbu++/src/gatsstream.cpp
index d5e3f82..05fbd84 100644
--- a/c++-libbu++/src/gatsstream.cpp
+++ b/c++-libbu++/src/gatsstream.cpp
@@ -1,3 +1,10 @@
1/*
2 * Copyright (C) 2007-2012 Xagasoft, All rights reserved.
3 *
4 * This file is part of the libgats library and is released under the
5 * terms of the license contained in the file LICENSE.
6 */
7
1#include "gats/gatsstream.h" 8#include "gats/gatsstream.h"
2#include "gats/object.h" 9#include "gats/object.h"
3 10
@@ -6,7 +13,7 @@
6// using namespace Bu; 13// using namespace Bu;
7 14
8Gats::GatsStream::GatsStream( Bu::Stream &rStream ) : 15Gats::GatsStream::GatsStream( Bu::Stream &rStream ) :
9 rStream( rStream ) 16 rStream( rStream )
10{ 17{
11} 18}
12 19
@@ -16,93 +23,93 @@ Gats::GatsStream::~GatsStream()
16 23
17Gats::Object *Gats::GatsStream::readObject() 24Gats::Object *Gats::GatsStream::readObject()
18{ 25{
19 char buf[1500]; 26 char buf[1500];
20 27
21 // sio << "Gats::GatsStream::readObject(): Scanning for object header." << sio.nl; 28 // sio << "Gats::GatsStream::readObject(): Scanning for object header." << sio.nl;
22 do 29 do
23 { 30 {
24 if( qbRead.getSize() < 5 ) 31 if( qbRead.getSize() < 5 )
25 { 32 {
26 // sio << "Gats::GatsStream::readObject(): reading header data, need 5b, have " << qbRead.getSize() << "b." << sio.nl; 33 // sio << "Gats::GatsStream::readObject(): reading header data, need 5b, have " << qbRead.getSize() << "b." << sio.nl;
27 int iRead = rStream.read( buf, 5-qbRead.getSize() ); 34 int iRead = rStream.read( buf, 5-qbRead.getSize() );
28 qbRead.write( buf, iRead ); 35 qbRead.write( buf, iRead );
29 36
30 if( qbRead.getSize() < 5 ) 37 if( qbRead.getSize() < 5 )
31 return NULL; 38 return NULL;
32 } 39 }
33 } while( !skipReadNulls() ); 40 } while( !skipReadNulls() );
34 41
35 uint8_t uVer; 42 uint8_t uVer;
36 qbRead.peek( &uVer, 1 ); 43 qbRead.peek( &uVer, 1 );
37 // sio << "Gats::GatsStream::readObject(): Packet version: " << (int)uVer << sio.nl; 44 // sio << "Gats::GatsStream::readObject(): Packet version: " << (int)uVer << sio.nl;
38 45
39 int32_t iSize; 46 int32_t iSize;
40 qbRead.peek( &iSize, 4, 1 ); 47 qbRead.peek( &iSize, 4, 1 );
41 iSize = be32toh( iSize ); 48 iSize = be32toh( iSize );
42 // sio << "Gats::GatsStream::readObject(): Header read, looking for " << iSize << "b, we have " << qbRead.getSize() << "b." << sio.nl; 49 // sio << "Gats::GatsStream::readObject(): Header read, looking for " << iSize << "b, we have " << qbRead.getSize() << "b." << sio.nl;
43 while( qbRead.getSize() < iSize ) 50 while( qbRead.getSize() < iSize )
44 { 51 {
45 int32_t iRead = iSize - qbRead.getSize(); 52 int32_t iRead = iSize - qbRead.getSize();
46 if( iRead > 1500 ) 53 if( iRead > 1500 )
47 iRead = 1500; 54 iRead = 1500;
48 // sio << "Gats::GatsStream::readObject(): Attempting to read " << iRead << "b." << sio.nl; 55 // sio << "Gats::GatsStream::readObject(): Attempting to read " << iRead << "b." << sio.nl;
49 int32_t iReal = rStream.read( buf, iRead ); 56 int32_t iReal = rStream.read( buf, iRead );
50 // sio << "Gats::GatsStream::readObject(): Read " << iReal << "b." << sio.nl; 57 // sio << "Gats::GatsStream::readObject(): Read " << iReal << "b." << sio.nl;
51 qbRead.write( buf, iReal ); 58 qbRead.write( buf, iReal );
52 if( iReal < iRead ) 59 if( iReal < iRead )
53 { 60 {
54 // sio << "Gats::GatsStream::readObject(): Insufficient data read in block, bailing on read." << sio.nl; 61 // sio << "Gats::GatsStream::readObject(): Insufficient data read in block, bailing on read." << sio.nl;
55 return NULL; 62 return NULL;
56 } 63 }
57 } 64 }
58 65
59 if( qbRead.getSize() < iSize ) 66 if( qbRead.getSize() < iSize )
60 { 67 {
61 // sio << "Gats::GatsStream::readObject(): Somehow, we still don't have enough data, bailing." << sio.nl; 68 // sio << "Gats::GatsStream::readObject(): Somehow, we still don't have enough data, bailing." << sio.nl;
62 return NULL; 69 return NULL;
63 } 70 }
64 71
65 // sio << "Gats::GatsStream::readObject(): We have " << qbRead.getSize() << "b of " << iSize << "b, time to read the object." << sio.nl; 72 // sio << "Gats::GatsStream::readObject(): We have " << qbRead.getSize() << "b of " << iSize << "b, time to read the object." << sio.nl;
66 73
67 qbRead.seek( 5 ); 74 qbRead.seek( 5 );
68 Gats::Object *pObj = Gats::Object::read( qbRead ); 75 Gats::Object *pObj = Gats::Object::read( qbRead );
69 76
70 // sio << "Gats::GatsStream::readObject(): Read completed, there are " << qbRead.getSize() << "b left in the buffer." << sio.nl; 77 // sio << "Gats::GatsStream::readObject(): Read completed, there are " << qbRead.getSize() << "b left in the buffer." << sio.nl;
71 return pObj; 78 return pObj;
72} 79}
73 80
74void Gats::GatsStream::writeObject( Gats::Object *pObject ) 81void Gats::GatsStream::writeObject( Gats::Object *pObject )
75{ 82{
76 Bu::NullStream ns; 83 Bu::NullStream ns;
77 pObject->write( ns ); 84 pObject->write( ns );
78 85
79 uint8_t uBuf = 1; 86 uint8_t uBuf = 1;
80 int32_t iSize = htobe32( ns.tell()+5 ); 87 int32_t iSize = htobe32( ns.tell()+5 );
81 rStream.write( &uBuf, 1 ); 88 rStream.write( &uBuf, 1 );
82 rStream.write( &iSize, 4 ); 89 rStream.write( &iSize, 4 );
83 pObject->write( rStream ); 90 pObject->write( rStream );
84 91
85 // sio << "Object consumed " << ns.tell() << "b." << sio.nl; 92 // sio << "Object consumed " << ns.tell() << "b." << sio.nl;
86} 93}
87 94
88bool Gats::GatsStream::skipReadNulls() 95bool Gats::GatsStream::skipReadNulls()
89{ 96{
90 char buf; 97 char buf;
91 98
92 // sio << "Gats::GatsStream::skipReadNulls(): Scanning for nulls, " << qbRead.getSize() << "b." << sio.nl; 99 // sio << "Gats::GatsStream::skipReadNulls(): Scanning for nulls, " << qbRead.getSize() << "b." << sio.nl;
93 bool bHaveSeeked = false; 100 bool bHaveSeeked = false;
94 for(;;) 101 for(;;)
95 { 102 {
96 if( qbRead.peek( &buf, 1 ) == 0 ) 103 if( qbRead.peek( &buf, 1 ) == 0 )
97 return false; 104 return false;
98 if( buf != 0 ) 105 if( buf != 0 )
99 return !bHaveSeeked; //true; 106 return !bHaveSeeked; //true;
100 else 107 else
101 { 108 {
102 // sio << "Gats::GatsStream::skipReadNulls(): Null byte read, not header yet..." << sio.nl; 109 // sio << "Gats::GatsStream::skipReadNulls(): Null byte read, not header yet..." << sio.nl;
103 qbRead.seek( 1 ); 110 qbRead.seek( 1 );
104 bHaveSeeked = true; 111 bHaveSeeked = true;
105 } 112 }
106 } 113 }
107} 114}
108 115