EvEmu  0.8.4
11 September 2021
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
UnmarshalStream Class Reference

Class which turns marshal bytecode into Python object. More...

#include "EVEUnmarshal.h"

Collaboration diagram for UnmarshalStream:

Public Member Functions

 UnmarshalStream ()
 
 ~UnmarshalStream ()
 
PyRepLoad (const Buffer &data)
 Loads Python object from given bytecode. More...
 

Protected Member Functions

template<typename T >
const T & Peek () const
 
template<typename T >
Buffer::const_iterator< T > Peek (size_t count) const
 
template<typename T >
const T & Read ()
 
template<typename T >
Buffer::const_iterator< T > Read (size_t count)
 
uint32 ReadSizeEx ()
 
PyRepLoadStream (size_t streamLength)
 
PyRepLoadRep ()
 
void CreateObjectStore (size_t streamLength, uint32 saveCount)
 Initializes object store. More...
 
void DestroyObjectStore ()
 Destroys object store. More...
 
uint32 GetStorageIndex ()
 Obtains storage index for StoreObject. More...
 
PyRepGetStoredObject (uint32 index)
 Obtains previously stored object. More...
 
void StoreObject (uint32 index, PyRep *object)
 Stores object. More...
 

Private Member Functions

PyRepLoadNone ()
 
PyRepLoadBoolTrue ()
 
PyRepLoadBoolFalse ()
 
PyRepLoadIntegerLongLong ()
 
PyRepLoadIntegerLong ()
 
PyRepLoadIntegerSignedShort ()
 
PyRepLoadIntegerByte ()
 
PyRepLoadIntegerVar ()
 
PyRepLoadIntegerMinusOne ()
 
PyRepLoadIntegerZero ()
 
PyRepLoadIntegerOne ()
 
PyRepLoadReal ()
 
PyRepLoadRealZero ()
 
PyRepLoadStringEmpty ()
 
PyRepLoadStringChar ()
 
PyRepLoadStringShort ()
 
PyRepLoadStringLong ()
 
PyRepLoadStringTable ()
 
PyRepLoadWStringEmpty ()
 
PyRepLoadWStringUCS2Char ()
 
PyRepLoadWStringUCS2 ()
 
PyRepLoadWStringUTF8 ()
 
PyRepLoadToken ()
 
PyRepLoadBuffer ()
 
PyRepLoadTupleEmpty ()
 
PyRepLoadTuple ()
 
PyRepLoadTupleOne ()
 
PyRepLoadTupleTwo ()
 
PyRepLoadListEmpty ()
 
PyRepLoadList ()
 
PyRepLoadListOne ()
 
PyRepLoadDict ()
 
PyRepLoadObject ()
 
PyRepLoadObjectEx1 ()
 
PyRepLoadObjectEx2 ()
 
PyRepLoadSubStream ()
 
PyRepLoadSubStruct ()
 
PyRepLoadChecksumedStream ()
 
PyRepLoadPackedRow ()
 
PyRepLoadError ()
 
PyRepLoadSavedStreamElement ()
 
PyObjectExLoadObjectEx (bool is_type_2)
 
bool LoadRLE (Buffer &out)
 

Private Attributes

Buffer::const_iterator< uint8mInItr
 
Buffer::const_iterator< uint32mStoreIndexItr
 
PyListmStoredObjects
 

Static Private Attributes

static PyRep
*(UnmarshalStream::*const 
s_mLoadMap [])()
 

Detailed Description

Class which turns marshal bytecode into Python object.

Author
Zhur, Bloody.Rabbit

Definition at line 54 of file EVEUnmarshal.h.

Constructor & Destructor Documentation

UnmarshalStream::UnmarshalStream ( )
inline

Definition at line 57 of file EVEUnmarshal.h.

58  : mStoredObjects( nullptr )
59  {
60  }
PyList * mStoredObjects
Definition: EVEUnmarshal.h:252
UnmarshalStream::~UnmarshalStream ( )

Definition at line 58 of file EVEUnmarshal.cpp.

59 {
60  //PySafeDecRef(mStoredObjects);
61 }

Member Function Documentation

void UnmarshalStream::CreateObjectStore ( size_t  streamLength,
uint32  saveCount 
)
protected

Initializes object store.

Parameters
[in]streamLengthLength of stream.
[in]saveCountNumber of saved objects within the stream.

Definition at line 181 of file EVEUnmarshal.cpp.

References DestroyObjectStore(), mInItr, mStoredObjects, and mStoreIndexItr.

Referenced by LoadStream().

182 {
184 
185  if( 0 < saveCount )
186  {
187  mStoreIndexItr = ( ( mInItr + streamLength ).As<uint32>() - saveCount );
188  mStoredObjects = new PyList( saveCount );
189  }
190 }
Buffer::const_iterator< uint8 > mInItr
Definition: EVEUnmarshal.h:247
PyList * mStoredObjects
Definition: EVEUnmarshal.h:252
Buffer::const_iterator< uint32 > mStoreIndexItr
Definition: EVEUnmarshal.h:250
void DestroyObjectStore()
Destroys object store.
Python list.
Definition: PyRep.h:639

Here is the call graph for this function:

Here is the caller graph for this function:

void UnmarshalStream::DestroyObjectStore ( )
protected

Destroys object store.

Definition at line 192 of file EVEUnmarshal.cpp.

References mStoredObjects, mStoreIndexItr, and PySafeDecRef.

Referenced by CreateObjectStore(), and LoadStream().

193 {
196 }
PyList * mStoredObjects
Definition: EVEUnmarshal.h:252
Buffer::const_iterator< uint32 > mStoreIndexItr
Definition: EVEUnmarshal.h:250
#define PySafeDecRef(op)
Definition: PyRep.h:61

Here is the caller graph for this function:

uint32 UnmarshalStream::GetStorageIndex ( )
inlineprotected

Obtains storage index for StoreObject.

Returns
Storage index.

Definition at line 126 of file EVEUnmarshal.h.

References mStoreIndexItr.

Referenced by LoadRep().

126 { return *mStoreIndexItr++; }
Buffer::const_iterator< uint32 > mStoreIndexItr
Definition: EVEUnmarshal.h:250

Here is the caller graph for this function:

PyRep * UnmarshalStream::GetStoredObject ( uint32  index)
protected

Obtains previously stored object.

Parameters
[in]indexIndex of stored object.
Returns
The stored object.

Definition at line 198 of file EVEUnmarshal.cpp.

References PyList::GetItem(), and mStoredObjects.

Referenced by LoadSavedStreamElement().

199 {
200  if( 0 < index )
201  return mStoredObjects->GetItem( --index );
202  return nullptr;
203 }
PyList * mStoredObjects
Definition: EVEUnmarshal.h:252
PyRep * GetItem(size_t index) const
Returns Python object.
Definition: PyRep.h:674

Here is the call graph for this function:

Here is the caller graph for this function:

PyRep * UnmarshalStream::Load ( const Buffer data)

Loads Python object from given bytecode.

Parameters
[in]dataBuffer containing marshal bytecode.
Returns
Loaded Python object.

Definition at line 134 of file EVEUnmarshal.cpp.

References Buffer::begin(), LoadStream(), mInItr, and Buffer::size().

Referenced by Unmarshal().

135 {
136  mInItr = data.begin<uint8>();
137  PyRep* res = LoadStream( data.size() );
139 
140  return res;
141 }
Base Python wire object.
Definition: PyRep.h:66
unsigned __int8 uint8
Definition: eve-compat.h:46
Buffer::const_iterator< uint8 > mInItr
Definition: EVEUnmarshal.h:247
iterator< T > begin()
Definition: Buffer.h:381
size_type size() const
Definition: Buffer.h:610
PyRep * LoadStream(size_t streamLength)

Here is the call graph for this function:

Here is the caller graph for this function:

PyRep* UnmarshalStream::LoadBoolFalse ( )
inlineprivate

Loads false boolean from stream.

Definition at line 150 of file EVEUnmarshal.h.

References PyStatic.

150 { return PyStatic.NewFalse(); }
#define PyStatic
Definition: PyRep.h:1209
PyRep* UnmarshalStream::LoadBoolTrue ( )
inlineprivate

Loads true boolean from stream.

Definition at line 148 of file EVEUnmarshal.h.

References PyStatic.

148 { return PyStatic.NewTrue(); }
#define PyStatic
Definition: PyRep.h:1209
PyRep * UnmarshalStream::LoadBuffer ( )
private

Loads buffer from stream.

Definition at line 328 of file EVEUnmarshal.cpp.

References ReadSizeEx().

329 {
330  const uint32 len = ReadSizeEx();
331  const Buffer::const_iterator<uint8> data = Read<uint8>( len );
332 
333  return new PyBuffer( data, data + len );
334 }
unsigned __int32 uint32
Definition: eve-compat.h:50
Python buffer.
Definition: PyRep.h:382
uint32 ReadSizeEx()
Definition: EVEUnmarshal.h:94

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadChecksumedStream ( )
private

Loads checksumed stream from stream.

Definition at line 495 of file EVEUnmarshal.cpp.

References LoadRep().

496 {
497  const uint32 sum = Read<uint32>();
498 
499  PyRep* ss = LoadRep();
500  if( NULL == ss )
501  return nullptr;
502 
503  return new PyChecksumedStream( ss, sum );
504 }
Base Python wire object.
Definition: PyRep.h:66
unsigned __int32 uint32
Definition: eve-compat.h:50

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadDict ( )
private

Loads dict from stream.

Definition at line 418 of file EVEUnmarshal.cpp.

References key(), LoadRep(), PyDecRef, ReadSizeEx(), and PyDict::SetItem().

419 {
420  const uint32 count = ReadSizeEx();
421  PyDict* dict = new PyDict;
422 
423  for ( uint32 i(0); i < count; i++ )
424  {
425  PyRep* value = LoadRep();
426  if( NULL == value )
427  return nullptr;
428 
429  PyRep* key = LoadRep();
430  if( NULL == key )
431  {
432  PyDecRef( value );
433  return nullptr;
434  }
435 
436  dict->SetItem( key, value );
437  }
438 
439  return dict;
440 }
Base Python wire object.
Definition: PyRep.h:66
Python's dictionary.
Definition: PyRep.h:719
#define PyDecRef(op)
Definition: PyRep.h:57
unsigned __int32 uint32
Definition: eve-compat.h:50
typeID Spawn an NPC with the specified type text Search for items matching the specified query() type() key(value)-Send an OnRemoteMessage" ) COMMAND( setbpattr
void SetItem(PyRep *key, PyRep *value)
SetItem adds or sets a database entry.
Definition: PyRep.cpp:713
uint32 ReadSizeEx()
Definition: EVEUnmarshal.h:94

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadError ( )
private

Prints error and returns NULL.

Definition at line 692 of file EVEUnmarshal.cpp.

References sLog.

693 {
694  sLog.Error( "Unmarshal", "Invalid opcode encountered." );
695 
696  return nullptr;
697 }
#define sLog
Evaluates to a NewLog instance.
Definition: LogNew.h:250
PyRep* UnmarshalStream::LoadIntegerByte ( )
inlineprivate

Loads byte integer from stream.

Definition at line 159 of file EVEUnmarshal.h.

159 { return new PyInt( Read<int8>() ); }
Python integer.
Definition: PyRep.h:231
PyRep* UnmarshalStream::LoadIntegerLong ( )
inlineprivate

Loads long integer from stream.

Definition at line 155 of file EVEUnmarshal.h.

155 { return new PyInt( Read<int32>() ); }
Python integer.
Definition: PyRep.h:231
PyRep* UnmarshalStream::LoadIntegerLongLong ( )
inlineprivate

Loads long long integer from stream.

Definition at line 153 of file EVEUnmarshal.h.

153 { return new PyLong( Read<int64>() ); }
Python long integer.
Definition: PyRep.h:261
PyRep* UnmarshalStream::LoadIntegerMinusOne ( )
inlineprivate

Loads minus one integer from stream.

Definition at line 163 of file EVEUnmarshal.h.

163 { return new PyInt( -1 ); }
Python integer.
Definition: PyRep.h:231
PyRep* UnmarshalStream::LoadIntegerOne ( )
inlineprivate

Loads one integer from stream.

Definition at line 167 of file EVEUnmarshal.h.

167 { return new PyInt( 1 ); }
Python integer.
Definition: PyRep.h:231
PyRep* UnmarshalStream::LoadIntegerSignedShort ( )
inlineprivate

Loads signed short from stream.

Definition at line 157 of file EVEUnmarshal.h.

157 { return new PyInt( Read<int16>() ); }
Python integer.
Definition: PyRep.h:231
PyRep * UnmarshalStream::LoadIntegerVar ( )
private

Loads variable length integer from stream.

Definition at line 214 of file EVEUnmarshal.cpp.

References ReadSizeEx().

215 {
216  /* this is one of the stranger fields I have found, it seems to be a variable
217  * length integer field (somewhat of a 'bigint' style data type), but it gets
218  * used at times for integers which would fit into the other primitive data
219  * types.... I would really like to see the criteria they use to determine
220  * what gets marshaled as what...
221  */
222 
223  const uint32 len = ReadSizeEx();
224  const Buffer::const_iterator<uint8> data = Read<uint8>( len );
225 
226  if( sizeof( int32 ) >= len )
227  {
228  int32 intval(0);
229  memcpy( &intval, &*data, len );
230 
231  return new PyInt( intval );
232  }
233  else if( sizeof( int64 ) >= len )
234  {
235  int64 intval(0);
236  memcpy( &intval, &*data, len );
237 
238  return new PyLong( intval );
239  }
240  else
241  {
242  //int64 is not big enough
243  //just pass it up to the application layer as a buffer...
244  return new PyBuffer( data, data + len );
245  }
246 }
signed __int32 int32
Definition: eve-compat.h:49
Python integer.
Definition: PyRep.h:231
unsigned __int32 uint32
Definition: eve-compat.h:50
signed __int64 int64
Definition: eve-compat.h:51
Python buffer.
Definition: PyRep.h:382
uint32 ReadSizeEx()
Definition: EVEUnmarshal.h:94
Python long integer.
Definition: PyRep.h:261

Here is the call graph for this function:

PyRep* UnmarshalStream::LoadIntegerZero ( )
inlineprivate

Loads zero integer from stream.

Definition at line 165 of file EVEUnmarshal.h.

165 { return new PyInt( 0 ); }
Python integer.
Definition: PyRep.h:231
PyRep * UnmarshalStream::LoadList ( )
private

Loads list from stream.

Definition at line 386 of file EVEUnmarshal.cpp.

References LoadRep(), PyDecRef, ReadSizeEx(), and PyList::SetItem().

387 {
388  const uint32 count = ReadSizeEx();
389  PyList* list = new PyList( count );
390 
391  for ( uint32 i(0); i < count; i++ )
392  {
393  PyRep* rep = LoadRep();
394  if (rep == nullptr)
395  {
396  PyDecRef( list );
397  return nullptr;
398  }
399 
400  list->SetItem( i, rep );
401  }
402 
403  return list;
404 }
Base Python wire object.
Definition: PyRep.h:66
void SetItem(size_t index, PyRep *object)
Stores Python object.
Definition: PyRep.h:682
#define PyDecRef(op)
Definition: PyRep.h:57
unsigned __int32 uint32
Definition: eve-compat.h:50
Python list.
Definition: PyRep.h:639
uint32 ReadSizeEx()
Definition: EVEUnmarshal.h:94

Here is the call graph for this function:

PyRep* UnmarshalStream::LoadListEmpty ( )
inlineprivate

Loads empty list from stream.

Definition at line 210 of file EVEUnmarshal.h.

210 { return new PyList( 0 ); }
Python list.
Definition: PyRep.h:639
PyRep * UnmarshalStream::LoadListOne ( )
private

Loads one-element list from stream.

Definition at line 406 of file EVEUnmarshal.cpp.

References PyList::AddItem(), and LoadRep().

407 {
408  PyRep* i = LoadRep();
409  if( NULL == i )
410  return nullptr;
411 
412  PyList* list = new PyList();
413  list->AddItem( i );
414 
415  return list;
416 }
Base Python wire object.
Definition: PyRep.h:66
void AddItem(PyRep *i)
Definition: PyRep.h:701
Python list.
Definition: PyRep.h:639

Here is the call graph for this function:

PyRep* UnmarshalStream::LoadNone ( )
inlineprivate

Loads none from stream.

Definition at line 145 of file EVEUnmarshal.h.

References PyStatic.

145 { return PyStatic.NewNone(); }
#define PyStatic
Definition: PyRep.h:1209
PyRep * UnmarshalStream::LoadObject ( )
private

Loads object from stream.

Definition at line 442 of file EVEUnmarshal.cpp.

References PyRep::AsString(), PyRep::IsString(), LoadRep(), PyDecRef, sLog, and PyRep::TypeString().

443 {
444  PyRep* type = LoadRep();
445  if( NULL == type )
446  return nullptr;
447 
448  if( !type->IsString() )
449  {
450  sLog.Error( "Unmarshal", "Object: Expected 'String' as type, got '%s'.", type->TypeString() );
451 
452  PyDecRef( type );
453  return nullptr;
454  }
455 
456  PyRep* arguments = LoadRep();
457  if( NULL == arguments )
458  {
459  PyDecRef( type );
460  return nullptr;
461  }
462 
463  return new PyObject( type->AsString(), arguments );
464 }
Base Python wire object.
Definition: PyRep.h:66
bool IsString() const
Definition: PyRep.h:105
#define sLog
Evaluates to a NewLog instance.
Definition: LogNew.h:250
Python object.
Definition: PyRep.h:826
PyString * AsString()
Definition: PyRep.h:132
#define PyDecRef(op)
Definition: PyRep.h:57
const char * TypeString() const
Definition: PyRep.cpp:76

Here is the call graph for this function:

PyObjectEx * UnmarshalStream::LoadObjectEx ( bool  is_type_2)
private

Helper; loads extended object from stream.

Definition at line 713 of file EVEUnmarshal.cpp.

References PyList::AddItem(), PyObjectEx::dict(), key(), PyObjectEx::list(), LoadRep(), Op_PackedTerminator, PyDecRef, and PyDict::SetItem().

Referenced by LoadObjectEx1(), and LoadObjectEx2().

714 {
715  PyRep* header = LoadRep();
716  if( NULL == header )
717  return nullptr;
718 
719  PyObjectEx* obj = new PyObjectEx( is_type_2, header );
720 
721  while( Op_PackedTerminator != Peek<uint8>() )
722  {
723  PyRep* el = LoadRep();
724  if( NULL == el )
725  {
726  PyDecRef( obj );
727  return nullptr;
728  }
729 
730  obj->list().AddItem( el );
731  }
732  //skip Op_PackedTerminator
733  Read<uint8>();
734 
735  while( Op_PackedTerminator != Peek<uint8>() )
736  {
737  PyRep* key = LoadRep();
738  if( NULL == key )
739  {
740  PyDecRef( obj );
741  return nullptr;
742  }
743 
744  PyRep* value = LoadRep();
745  if( NULL == value )
746  {
747  PyDecRef( key );
748  PyDecRef( obj );
749  return nullptr;
750  }
751 
752  obj->dict().SetItem( key, value );
753  }
754  //skip Op_PackedTerminator
755  Read<uint8>();
756 
757  return obj;
758 }
Base Python wire object.
Definition: PyRep.h:66
list_type & list()
Definition: PyRep.h:889
void AddItem(PyRep *i)
Definition: PyRep.h:701
Python extended object.
Definition: PyRep.h:861
dict_type & dict()
Definition: PyRep.h:892
#define PyDecRef(op)
Definition: PyRep.h:57
typeID Spawn an NPC with the specified type text Search for items matching the specified query() type() key(value)-Send an OnRemoteMessage" ) COMMAND( setbpattr
void SetItem(PyRep *key, PyRep *value)
SetItem adds or sets a database entry.
Definition: PyRep.cpp:713

Here is the call graph for this function:

Here is the caller graph for this function:

PyRep * UnmarshalStream::LoadObjectEx1 ( )
private

Loads extended object of type 1 from stream.

Definition at line 466 of file EVEUnmarshal.cpp.

References LoadObjectEx().

467 {
468  return LoadObjectEx( false );
469 }
PyObjectEx * LoadObjectEx(bool is_type_2)

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadObjectEx2 ( )
private

Loads extended object of type 2 from stream.

Definition at line 471 of file EVEUnmarshal.cpp.

References LoadObjectEx().

472 {
473  return LoadObjectEx( true );
474 }
PyObjectEx * LoadObjectEx(bool is_type_2)

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadPackedRow ( )
private

Loads packed row from stream.

Definition at line 506 of file EVEUnmarshal.cpp.

References Buffer::const_iterator< T >::As(), Buffer::begin(), DBRowDescriptor::ColumnCount(), DBTYPE_BOOL, DBTYPE_BYTES, DBTYPE_CY, DBTYPE_EMPTY, DBTYPE_ERROR, DBTYPE_FILETIME, DBTYPE_GetSizeBits(), DBTYPE_I1, DBTYPE_I2, DBTYPE_I4, DBTYPE_I8, DBTYPE_R4, DBTYPE_R8, DBTYPE_STR, DBTYPE_UI1, DBTYPE_UI2, DBTYPE_UI4, DBTYPE_UI8, DBTYPE_WSTR, DBRowDescriptor::GetColumnType(), PyPackedRow::header(), LoadRep(), LoadRLE(), PyDecRef, and PyPackedRow::SetField().

507 {
508  // PyPackedRows are just a packed form of blue.DBRow
509  // these take a DBRowDescriptor and the column data in different formats
510  PyRep* header_element = LoadRep();
511  if( NULL == header_element )
512  return nullptr;
513 
514  // create the base packed row to be filled with data
515  PyPackedRow* row = new PyPackedRow( (DBRowDescriptor*)header_element );
516 
517  // create the sizemap and sort it by bitsize, the value of the map indicates the index of the column
518  // this can be used to identify things easily
519  std::multimap< uint8, uint32, std::greater< uint8 > > sizeMap;
520  std::map<uint8,uint8> booleanColumns;
521 
522  uint32 columnCount = row->header()->ColumnCount();
523  size_t byteDataBitLength = 0;
524  size_t booleansBitLength = 0;
525  size_t nullsBitLength = 0;
526 
527  for (uint32 i(0); i < columnCount; i++ )
528  {
529  DBTYPE columnType = row->header()->GetColumnType (i);
530  uint8_t size = DBTYPE_GetSizeBits (columnType);
531 
532  // count booleans
533  if (columnType == DBTYPE_BOOL)
534  {
535  booleanColumns.insert (std::make_pair (i, booleansBitLength));
536  booleansBitLength++;
537  }
538 
539  // count all columns as possible nulls
540  nullsBitLength ++;
541 
542  // increase the bytedata length only if a column is longer than 7 bits
543  // this is used as an indicator of what is written in the first, second or third part
544  if (size >= 8)
545  byteDataBitLength += size;
546 
547  // add the column to the list
548  sizeMap.insert (std::make_pair (size, i));
549  }
550 
551  size_t expectedByteSize = (byteDataBitLength >> 3) + ((booleansBitLength + nullsBitLength) >> 3) + 1;
552 
553  // reserve enough space for the buffer
554  Buffer unpacked (expectedByteSize, 0);
555 
556  if( !LoadRLE(unpacked) )
557  {
558  PyDecRef( header_element );
559  return nullptr;
560  }
561 
562  Buffer::const_iterator<uint8> unpackedItr = unpacked.begin<uint8>();
563  Buffer::const_iterator<uint8> bitIterator = unpacked.begin<uint8>();
564 
565  std::multimap< uint8, uint32, std::greater< uint8 > >::iterator cur, end;
566  cur = sizeMap.begin();
567  end = sizeMap.end();
568  for (; cur != end; ++cur)
569  {
570  const uint32 index = cur->second;
571  const DBTYPE columnType = row->header ()->GetColumnType (index);
572 
573  unsigned long nullBit = byteDataBitLength + booleansBitLength + cur->second;
574  unsigned long nullByte = nullBit >> 3;
575  // setup the iterator to the proper byte
576  // first check for nulls
577  bitIterator = unpacked.begin<uint8>() + nullByte;
578 
579  if ((*bitIterator & (1 << (nullBit & 0x7))) == (1 << (nullBit & 0x7)))
580  {
581  // PyNone value found! override it and increase the original iterator the required steps
582  unpackedItr += DBTYPE_GetSizeBits (columnType) >> 3;
583  row->SetField (index, new PyNone ());
584 
585  // continue should only be performed if the columns are not normal marshal objects
586  if (columnType != DBTYPE_BYTES && columnType != DBTYPE_STR && columnType != DBTYPE_WSTR)
587  continue;
588  }
589 
590  switch (columnType)
591  {
592  case DBTYPE_I8:
593  case DBTYPE_CY:
594  case DBTYPE_UI8:
595  case DBTYPE_FILETIME:
596  {
597  Buffer::const_iterator<int64> v = unpackedItr.As<int64>();
598  row->SetField( index, new PyLong( *v++ ) );
599  unpackedItr = v.As<uint8>();
600  } break;
601 
602  case DBTYPE_I4:
603  {
604  Buffer::const_iterator<int32> v = unpackedItr.As<int32>();
605  row->SetField( index, new PyInt( *v++ ) );
606  unpackedItr = v.As<uint8>();
607  } break;
608  case DBTYPE_UI4:
609  {
610  Buffer::const_iterator<uint32> v = unpackedItr.As<uint32>();
611  row->SetField( index, new PyInt( *v++ ) );
612  unpackedItr = v.As<uint8>();
613  } break;
614 
615  case DBTYPE_I2:
616  {
617  Buffer::const_iterator<int16> v = unpackedItr.As<int16>();
618  row->SetField( index, new PyInt( *v++ ) );
619  unpackedItr = v.As<uint8>();
620  } break;
621  case DBTYPE_UI2:
622  {
623  Buffer::const_iterator<uint16> v = unpackedItr.As<uint16>();
624  row->SetField( index, new PyInt( *v++ ) );
625  unpackedItr = v.As<uint8>();
626  } break;
627 
628  case DBTYPE_I1:
629  {
630  Buffer::const_iterator<int8> v = unpackedItr.As<int8>();
631  row->SetField( index, new PyInt( *v++ ) );
632  unpackedItr = v.As<uint8>();
633  } break;
634 
635  case DBTYPE_UI1:
636  {
637  Buffer::const_iterator<uint8> v = unpackedItr.As<uint8>();
638  row->SetField( index, new PyInt( *v++ ) );
639  unpackedItr = v.As<uint8>();
640  } break;
641 
642  case DBTYPE_R8:
643  {
644  Buffer::const_iterator<double> v = unpackedItr.As<double>();
645  row->SetField( index, new PyFloat( *v++ ) );
646  unpackedItr = v.As<uint8>();
647  } break;
648 
649  case DBTYPE_R4:
650  {
651  Buffer::const_iterator<float> v = unpackedItr.As<float>();
652  row->SetField( index, new PyFloat( *v++ ) );
653  unpackedItr = v.As<uint8>();
654  } break;
655 
656  case DBTYPE_BOOL:
657  {
658  // get the bit this boolean should be read from
659  unsigned long boolBit = byteDataBitLength + booleanColumns.find (index)->second;
660  unsigned long boolByte = boolBit >> 3;
661  // setup the iterator to the proper byte
662  bitIterator = unpacked.begin<uint8>() + boolByte;
663 
664  row->SetField (index, new PyBool ((*bitIterator & (1 << (boolBit & 0x7))) == (1 << (boolBit & 0x7))));
665  } break;
666 
667  // these objects are read directly from the end of the PyPackedRow
668  // so they can be kept
669  case DBTYPE_BYTES:
670  case DBTYPE_STR:
671  case DBTYPE_WSTR:
672  {
673  PyRep* el = LoadRep();
674  if( NULL == el )
675  {
676  PyDecRef( row );
677  return nullptr;
678  }
679 
680  row->SetField( index, el );
681  } break;
682 
683  case DBTYPE_EMPTY:
684  case DBTYPE_ERROR:
685  return nullptr;
686  }
687  }
688 
689  return row;
690 }
Base Python wire object.
Definition: PyRep.h:66
unsigned __int8 uint8
Definition: eve-compat.h:46
DBRowDescriptor * header() const
Definition: PyRep.h:983
Python floating point number.
Definition: PyRep.h:292
const_iterator< T2 > As() const
Converts const_iterator to another const_iterator with different type.
Definition: Buffer.h:108
signed __int8 int8
Definition: eve-compat.h:45
signed __int32 int32
Definition: eve-compat.h:49
Python boolean.
Definition: PyRep.h:323
DBTYPE GetColumnType(uint32 index) const
Definition: PyDatabase.cpp:70
Generic class for buffers.
Definition: Buffer.h:40
Python object "blue.DBRowDescriptor".
Definition: PyDatabase.h:41
uint32 ColumnCount() const
Definition: PyDatabase.cpp:60
Python's "none".
Definition: PyRep.h:352
DBTYPE
Definition: dbtype.h:67
Python integer.
Definition: PyRep.h:231
#define PyDecRef(op)
Definition: PyRep.h:57
unsigned __int32 uint32
Definition: eve-compat.h:50
uint8 DBTYPE_GetSizeBits(DBTYPE type)
Definition: dbtype.cpp:30
signed __int64 int64
Definition: eve-compat.h:51
bool SetField(uint32 index, PyRep *value)
Definition: PyRep.cpp:1031
signed __int16 int16
Definition: eve-compat.h:47
Packed row.
Definition: PyRep.h:961
bool LoadRLE(Buffer &out)
unsigned __int16 uint16
Definition: eve-compat.h:48
Python long integer.
Definition: PyRep.h:261

Here is the call graph for this function:

PyRep* UnmarshalStream::LoadReal ( )
inlineprivate

Loads real from stream.

Definition at line 170 of file EVEUnmarshal.h.

170 { return new PyFloat( Read<double>() ); }
Python floating point number.
Definition: PyRep.h:292
PyRep* UnmarshalStream::LoadRealZero ( )
inlineprivate

Loads zero real from stream.

Definition at line 172 of file EVEUnmarshal.h.

172 { return new PyFloat( 0.0 ); }
Python floating point number.
Definition: PyRep.h:292
PyRep * UnmarshalStream::LoadRep ( )
protected

Loads rep from stream.

Definition at line 160 of file EVEUnmarshal.cpp.

References GetStorageIndex(), PyRepOpcodeMask, PyRepSaveMask, PyRepUnknownMask, s_mLoadMap, sLog, and StoreObject().

Referenced by LoadChecksumedStream(), LoadDict(), LoadList(), LoadListOne(), LoadObject(), LoadObjectEx(), LoadPackedRow(), LoadStream(), LoadSubStruct(), LoadTuple(), LoadTupleOne(), and LoadTupleTwo().

161 {
162  const uint8 header = Read<uint8>();
163 
164  const bool flagUnknown = ( header & PyRepUnknownMask ) != 0;
165  const bool flagSave = ( header & PyRepSaveMask ) != 0;
166  const uint8 opcode = ( header & PyRepOpcodeMask );
167 
168  if( flagUnknown )
169  sLog.Warning( "Unmarshal", "Encountered flagUnknown in header 0x%X.", header );
170 
171  const uint32 storageIndex = ( flagSave ? GetStorageIndex() : 0 );
172 
173  PyRep* rep = ( this->*s_mLoadMap[ opcode ] )();
174 
175  if( 0 != storageIndex )
176  StoreObject( storageIndex, rep );
177 
178  return rep;
179 }
Base Python wire object.
Definition: PyRep.h:66
unsigned __int8 uint8
Definition: eve-compat.h:46
void StoreObject(uint32 index, PyRep *object)
Stores object.
uint32 GetStorageIndex()
Obtains storage index for StoreObject.
Definition: EVEUnmarshal.h:126
static const uint8 PyRepSaveMask
static const uint8 PyRepUnknownMask
#define sLog
Evaluates to a NewLog instance.
Definition: LogNew.h:250
unsigned __int32 uint32
Definition: eve-compat.h:50
static PyRep *(UnmarshalStream::*const s_mLoadMap[])()
Definition: EVEUnmarshal.h:255

Here is the call graph for this function:

Here is the caller graph for this function:

bool UnmarshalStream::LoadRLE ( Buffer out)
private

Helper; loads zero-compressed buffer from stream.

Definition at line 760 of file EVEUnmarshal.cpp.

References ReadSizeEx(), and Buffer::size().

Referenced by LoadPackedRow().

761 {
762  const uint32 in_size = ReadSizeEx();
763 
765  cur = Read<uint8>(in_size );
766  end = cur + in_size;
767  Buffer::const_iterator<uint8> in_ix = cur;
768  int out_ix = 0;
769  int count;
770  int run = 0;
771  int nibble = 0;
772 
773  while(in_ix < end)
774  {
775  nibble = !nibble;
776  if(nibble)
777  {
778  run = (unsigned char)*in_ix++;
779  count = (run & 0x0f) - 8;
780  }
781  else
782  count = (run >> 4) - 8;
783 
784  if(count >= 0)
785  {
786  if (out_ix + count + 1 > out.size())
787  return false;
788 
789  while(count-- >= 0)
790  out[out_ix++] = 0;
791  }
792  else
793  {
794  if (out_ix - count > out.size())
795  return false;
796 
797  while(count++ && in_ix < end)
798  out[out_ix++] = *in_ix++;
799  }
800  }
801 
802  // no need to set the rest of the buffer to zero as the output is already
803  // set to 0
804  // while(out_ix < out.size())
805  // out[out_ix++] = 0;
806 
807  return true;
808 }
unsigned __int32 uint32
Definition: eve-compat.h:50
size_type size() const
Definition: Buffer.h:610
uint32 ReadSizeEx()
Definition: EVEUnmarshal.h:94

Here is the call graph for this function:

Here is the caller graph for this function:

PyRep * UnmarshalStream::LoadSavedStreamElement ( )
private

Loads saved stream element from stream.

Definition at line 699 of file EVEUnmarshal.cpp.

References PyRep::Clone(), GetStoredObject(), ReadSizeEx(), and sLog.

700 {
701  const uint32 index = ReadSizeEx();
702 
703  PyRep* obj = GetStoredObject( index );
704  if( NULL == obj )
705  {
706  sLog.Error( "Unmarshal", "SavedStreamElement: Got invalid stored object." );
707  return nullptr;
708  }
709 
710  return obj->Clone();
711 }
Base Python wire object.
Definition: PyRep.h:66
virtual PyRep * Clone() const =0
Clones object.
PyRep * GetStoredObject(uint32 index)
Obtains previously stored object.
#define sLog
Evaluates to a NewLog instance.
Definition: LogNew.h:250
unsigned __int32 uint32
Definition: eve-compat.h:50
uint32 ReadSizeEx()
Definition: EVEUnmarshal.h:94

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadStream ( size_t  streamLength)
protected

Initializes loading and loads rep from stream.

Definition at line 143 of file EVEUnmarshal.cpp.

References CreateObjectStore(), DestroyObjectStore(), LoadRep(), MarshalHeaderByte, and sLog.

Referenced by Load().

144 {
145  const uint8 header = Read<uint8>();
146  if (MarshalHeaderByte != header) {
147  sLog.Error( "Unmarshal", "Invalid stream received (header byte 0x%X).", header );
148  return nullptr;
149  }
150 
151  const uint32 saveCount = Read<uint32>();
152  CreateObjectStore( streamLength - sizeof( uint8 ) - sizeof( uint32 ), saveCount );
153 
154  PyRep* rep = LoadRep();
155 
157  return rep;
158 }
Base Python wire object.
Definition: PyRep.h:66
unsigned __int8 uint8
Definition: eve-compat.h:46
#define sLog
Evaluates to a NewLog instance.
Definition: LogNew.h:250
unsigned __int32 uint32
Definition: eve-compat.h:50
static const uint8 MarshalHeaderByte
void CreateObjectStore(size_t streamLength, uint32 saveCount)
Initializes object store.
void DestroyObjectStore()
Destroys object store.

Here is the call graph for this function:

Here is the caller graph for this function:

PyRep * UnmarshalStream::LoadStringChar ( )
private

Loads single character string from stream.

Definition at line 248 of file EVEUnmarshal.cpp.

249 {
250  const Buffer::const_iterator<char> str = Read<char>( 1 );
251 
252  return new PyString( str, str + 1 );
253 }
Python string.
Definition: PyRep.h:430
Buffer's const iterator.
Definition: Buffer.h:52
PyRep* UnmarshalStream::LoadStringEmpty ( )
inlineprivate

Loads empty string from stream.

Definition at line 175 of file EVEUnmarshal.h.

175 { return new PyString( "" ); }
Python string.
Definition: PyRep.h:430
PyRep * UnmarshalStream::LoadStringLong ( )
private

Loads long (no limit) string from stream.

Definition at line 263 of file EVEUnmarshal.cpp.

References ReadSizeEx().

264 {
265  const uint32 len = ReadSizeEx();
266  const Buffer::const_iterator<char> str = Read<char>( len );
267 
268  return new PyString( str, str + len );
269 }
Python string.
Definition: PyRep.h:430
unsigned __int32 uint32
Definition: eve-compat.h:50
Buffer's const iterator.
Definition: Buffer.h:52
uint32 ReadSizeEx()
Definition: EVEUnmarshal.h:94

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadStringShort ( )
private

Loads short (up to 255 chars) string from stream.

Definition at line 255 of file EVEUnmarshal.cpp.

256 {
257  const uint8 len = Read<uint8>();
258  const Buffer::const_iterator<char> str = Read<char>( len );
259 
260  return new PyString( str, str + len );
261 }
unsigned __int8 uint8
Definition: eve-compat.h:46
Python string.
Definition: PyRep.h:430
Buffer's const iterator.
Definition: Buffer.h:52
PyRep * UnmarshalStream::LoadStringTable ( )
private

Loads table string from stream.

Definition at line 271 of file EVEUnmarshal.cpp.

References sLog, sMarshalStringTable, and snprintf.

272 {
273  const uint8 index = Read<uint8>();
274 
275  const char* str = sMarshalStringTable.LookupString( index );
276  if( NULL == str )
277  {
278  assert( false );
279  sLog.Error( "Unmarshal", "String Table Item %u is out of range!", index );
280 
281  char ebuf[64];
282  snprintf( ebuf, 64, "Invalid String Table Item %u", index );
283  return new PyString( ebuf );
284  }
285  else
286  return new PyString( str );
287 }
unsigned __int8 uint8
Definition: eve-compat.h:46
Python string.
Definition: PyRep.h:430
#define sMarshalStringTable
#define sLog
Evaluates to a NewLog instance.
Definition: LogNew.h:250
#define snprintf
Definition: eve-compat.h:184
PyRep * UnmarshalStream::LoadSubStream ( )
private

Loads sub stream from stream.

Definition at line 476 of file EVEUnmarshal.cpp.

References ReadSizeEx().

477 {
478  const uint32 len = ReadSizeEx();
479  const Buffer::const_iterator<uint8> data = Read<uint8>( len );
480 
481  return new PySubStream( new PyBuffer( data, data + len ) );
482 }
unsigned __int32 uint32
Definition: eve-compat.h:50
Python buffer.
Definition: PyRep.h:382
uint32 ReadSizeEx()
Definition: EVEUnmarshal.h:94

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadSubStruct ( )
private

Loads sub struct from stream.

Definition at line 484 of file EVEUnmarshal.cpp.

References LoadRep().

485 {
486  // This is actually a remote object specification
487 
488  PyRep* ss = LoadRep();
489  if( NULL == ss )
490  return nullptr;
491 
492  return new PySubStruct( ss );
493 }
Base Python wire object.
Definition: PyRep.h:66

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadToken ( )
private

Loads token from stream.

Definition at line 320 of file EVEUnmarshal.cpp.

321 {
322  const uint8 len = Read<uint8>();
323  const Buffer::const_iterator<char> str = Read<char>( len );
324 
325  return new PyToken( str, str + len );
326 }
unsigned __int8 uint8
Definition: eve-compat.h:46
Python token (eg. class name).
Definition: PyRep.h:522
Buffer's const iterator.
Definition: Buffer.h:52
PyRep * UnmarshalStream::LoadTuple ( )
private

Loads tuple from stream.

Definition at line 336 of file EVEUnmarshal.cpp.

References LoadRep(), PyDecRef, ReadSizeEx(), and PyTuple::SetItem().

337 {
338  const uint32 count = ReadSizeEx();
339  PyTuple* tuple = new PyTuple( count );
340 
341  for ( uint32 i(0); i < count; ++i ) {
342  PyRep* rep = LoadRep();
343  if (rep == nullptr) {
344  PyDecRef( tuple );
345  return nullptr;
346  }
347 
348  tuple->SetItem( i, rep );
349  }
350 
351  return tuple;
352 }
Base Python wire object.
Definition: PyRep.h:66
Python tuple.
Definition: PyRep.h:567
void SetItem(size_t index, PyRep *object)
Stores Python object.
Definition: PyRep.h:610
#define PyDecRef(op)
Definition: PyRep.h:57
unsigned __int32 uint32
Definition: eve-compat.h:50
uint32 ReadSizeEx()
Definition: EVEUnmarshal.h:94

Here is the call graph for this function:

PyRep* UnmarshalStream::LoadTupleEmpty ( )
inlineprivate

Loads empty tuple from stream.

Definition at line 201 of file EVEUnmarshal.h.

201 { return new PyTuple( 0 ); }
Python tuple.
Definition: PyRep.h:567
PyRep * UnmarshalStream::LoadTupleOne ( )
private

Loads one-element tuple from stream.

Definition at line 354 of file EVEUnmarshal.cpp.

References LoadRep(), and PyTuple::SetItem().

355 {
356  PyRep* i = LoadRep();
357  if( NULL == i )
358  return nullptr;
359 
360  PyTuple* tuple = new PyTuple( 1 );
361  tuple->SetItem( 0, i );
362 
363  return tuple;
364 }
Base Python wire object.
Definition: PyRep.h:66
Python tuple.
Definition: PyRep.h:567
void SetItem(size_t index, PyRep *object)
Stores Python object.
Definition: PyRep.h:610

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadTupleTwo ( )
private

Loads two-element tuple from stream.

Definition at line 366 of file EVEUnmarshal.cpp.

References LoadRep(), PyDecRef, and PyTuple::SetItem().

367 {
368  PyRep* i = LoadRep();
369  if( NULL == i )
370  return nullptr;
371 
372  PyRep* j = LoadRep();
373  if( NULL == j )
374  {
375  PyDecRef( i );
376  return nullptr;
377  }
378 
379  PyTuple *tuple = new PyTuple( 2 );
380  tuple->SetItem( 0, i );
381  tuple->SetItem( 1, j );
382 
383  return tuple;
384 }
Base Python wire object.
Definition: PyRep.h:66
Python tuple.
Definition: PyRep.h:567
void SetItem(size_t index, PyRep *object)
Stores Python object.
Definition: PyRep.h:610
#define PyDecRef(op)
Definition: PyRep.h:57

Here is the call graph for this function:

PyRep* UnmarshalStream::LoadWStringEmpty ( )
inlineprivate

Loads empty wide string from stream.

Definition at line 186 of file EVEUnmarshal.h.

186 { return new PyWString( "", 0 ); }
Python wide string.
Definition: PyRep.h:475
PyRep * UnmarshalStream::LoadWStringUCS2 ( )
private

Loads UCS-2 string from stream.

Definition at line 300 of file EVEUnmarshal.cpp.

References ReadSizeEx(), and utf16to8().

301 {
302  const uint32 len = ReadSizeEx();
303  const Buffer::const_iterator<uint16> wstr = Read<uint16>( len );
304 
305  // convert to UTF-8
306  std::string str;
307  utf8::utf16to8( wstr, wstr + len, std::back_inserter( str ) );
308 
309  return new PyWString( str );
310 }
Python wide string.
Definition: PyRep.h:475
unsigned __int32 uint32
Definition: eve-compat.h:50
std::string utf16to8(std::u16string &str)
Definition: utfUtils.cpp:309
Buffer's const iterator.
Definition: Buffer.h:52
uint32 ReadSizeEx()
Definition: EVEUnmarshal.h:94

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadWStringUCS2Char ( )
private

Loads single UCS-2 character string from stream.

Definition at line 289 of file EVEUnmarshal.cpp.

References utf16to8().

290 {
291  const Buffer::const_iterator<uint16> wstr = Read<uint16>( 1 );
292 
293  // convert to UTF-8
294  std::string str;
295  utf8::utf16to8( wstr, wstr + 1, std::back_inserter( str ) );
296 
297  return new PyWString( str );
298 }
Python wide string.
Definition: PyRep.h:475
std::string utf16to8(std::u16string &str)
Definition: utfUtils.cpp:309
Buffer's const iterator.
Definition: Buffer.h:52

Here is the call graph for this function:

PyRep * UnmarshalStream::LoadWStringUTF8 ( )
private

Loads UTF-8 string from stream.

Definition at line 312 of file EVEUnmarshal.cpp.

References ReadSizeEx().

313 {
314  const uint32 len = ReadSizeEx();
315  const Buffer::const_iterator<char> wstr = Read<char>( len );
316 
317  return new PyWString( wstr, wstr + len );
318 }
Python wide string.
Definition: PyRep.h:475
unsigned __int32 uint32
Definition: eve-compat.h:50
Buffer's const iterator.
Definition: Buffer.h:52
uint32 ReadSizeEx()
Definition: EVEUnmarshal.h:94

Here is the call graph for this function:

template<typename T >
const T& UnmarshalStream::Peek ( ) const
inlineprotected

Peeks element from stream.

Definition at line 76 of file EVEUnmarshal.h.

76 { return *Peek<T>( 1 ); }
template<typename T >
Buffer::const_iterator<T> UnmarshalStream::Peek ( size_t  count) const
inlineprotected

Peeks elements from stream.

Definition at line 79 of file EVEUnmarshal.h.

References Buffer::const_iterator< T >::As(), and mInItr.

79 { return mInItr.As<T>(); }
Buffer::const_iterator< uint8 > mInItr
Definition: EVEUnmarshal.h:247
const_iterator< T2 > As() const
Converts const_iterator to another const_iterator with different type.
Definition: Buffer.h:108

Here is the call graph for this function:

template<typename T >
const T& UnmarshalStream::Read ( )
inlineprotected

Reads element from stream.

Definition at line 83 of file EVEUnmarshal.h.

83 { return *Read<T>( 1 ); }
template<typename T >
Buffer::const_iterator<T> UnmarshalStream::Read ( size_t  count)
inlineprotected

Reads elements from stream.

Definition at line 86 of file EVEUnmarshal.h.

References mInItr.

87  {
88  Buffer::const_iterator<T> res = Peek<T>( count );
89  mInItr = ( res + count ).template As<uint8>();
90  return res;
91  }
Buffer::const_iterator< uint8 > mInItr
Definition: EVEUnmarshal.h:247
Buffer's const iterator.
Definition: Buffer.h:52
uint32 UnmarshalStream::ReadSizeEx ( )
inlineprotected

Reads extended size from stream.

Definition at line 94 of file EVEUnmarshal.h.

Referenced by LoadBuffer(), LoadDict(), LoadIntegerVar(), LoadList(), LoadRLE(), LoadSavedStreamElement(), LoadStringLong(), LoadSubStream(), LoadTuple(), LoadWStringUCS2(), and LoadWStringUTF8().

95  {
96  uint32 size = Read<uint8>();
97  if( 0xFF == size )
98  size = Read<uint32>();
99 
100  return size;
101  }
unsigned __int32 uint32
Definition: eve-compat.h:50

Here is the caller graph for this function:

void UnmarshalStream::StoreObject ( uint32  index,
PyRep object 
)
protected

Stores object.

Parameters
[in]indexIndex of object.
[in]objectThe object to be stored.

Definition at line 205 of file EVEUnmarshal.cpp.

References mStoredObjects, PyIncRef, and PyList::SetItem().

Referenced by LoadRep().

206 {
207  if( 0 < index )
208  {
209  PyIncRef( object );
210  mStoredObjects->SetItem( --index, object );
211  }
212 }
PyList * mStoredObjects
Definition: EVEUnmarshal.h:252
void SetItem(size_t index, PyRep *object)
Stores Python object.
Definition: PyRep.h:682
#define PyIncRef(op)
Definition: PyRep.h:56

Here is the call graph for this function:

Here is the caller graph for this function:

Member Data Documentation

Buffer::const_iterator<uint8> UnmarshalStream::mInItr
private

Buffer iterator we are processing.

Definition at line 247 of file EVEUnmarshal.h.

Referenced by CreateObjectStore(), Load(), Peek(), and Read().

PyList* UnmarshalStream::mStoredObjects
private

Referenced objects within the buffer.

Definition at line 252 of file EVEUnmarshal.h.

Referenced by CreateObjectStore(), DestroyObjectStore(), GetStoredObject(), and StoreObject().

Buffer::const_iterator<uint32> UnmarshalStream::mStoreIndexItr
private

Next store index for referencing in the buffer.

Definition at line 250 of file EVEUnmarshal.h.

Referenced by CreateObjectStore(), DestroyObjectStore(), and GetStorageIndex().

PyRep*( UnmarshalStream::* const UnmarshalStream::s_mLoadMap[])()
staticprivate

Load function map.

Definition at line 255 of file EVEUnmarshal.h.

Referenced by LoadRep().


The documentation for this class was generated from the following files: