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 ()
 
PyRep * Load (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 ()
 
PyRep * LoadStream (size_t streamLength)
 
PyRep * LoadRep ()
 
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...
 
PyRep * GetStoredObject (uint32 index)
 Obtains previously stored object. More...
 
void StoreObject (uint32 index, PyRep *object)
 Stores object. More...
 

Private Member Functions

PyRep * LoadNone ()
 
PyRep * LoadBoolTrue ()
 
PyRep * LoadBoolFalse ()
 
PyRep * LoadIntegerLongLong ()
 
PyRep * LoadIntegerLong ()
 
PyRep * LoadIntegerSignedShort ()
 
PyRep * LoadIntegerByte ()
 
PyRep * LoadIntegerVar ()
 
PyRep * LoadIntegerMinusOne ()
 
PyRep * LoadIntegerZero ()
 
PyRep * LoadIntegerOne ()
 
PyRep * LoadReal ()
 
PyRep * LoadRealZero ()
 
PyRep * LoadStringEmpty ()
 
PyRep * LoadStringChar ()
 
PyRep * LoadStringShort ()
 
PyRep * LoadStringLong ()
 
PyRep * LoadStringTable ()
 
PyRep * LoadWStringEmpty ()
 
PyRep * LoadWStringUCS2Char ()
 
PyRep * LoadWStringUCS2 ()
 
PyRep * LoadWStringUTF8 ()
 
PyRep * LoadToken ()
 
PyRep * LoadBuffer ()
 
PyRep * LoadTupleEmpty ()
 
PyRep * LoadTuple ()
 
PyRep * LoadTupleOne ()
 
PyRep * LoadTupleTwo ()
 
PyRep * LoadListEmpty ()
 
PyRep * LoadList ()
 
PyRep * LoadListOne ()
 
PyRep * LoadDict ()
 
PyRep * LoadObject ()
 
PyRep * LoadObjectEx1 ()
 
PyRep * LoadObjectEx2 ()
 
PyRep * LoadSubStream ()
 
PyRep * LoadSubStruct ()
 
PyRep * LoadChecksumedStream ()
 
PyRep * LoadPackedRow ()
 
PyRep * LoadError ()
 
PyRep * LoadSavedStreamElement ()
 
PyObjectEx * LoadObjectEx (bool is_type_2)
 
bool LoadRLE (Buffer &out)
 

Private Attributes

Buffer::const_iterator< uint8 > mInItr
 
Buffer::const_iterator< uint32 > mStoreIndexItr
 
PyList * mStoredObjects
 

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: