| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- /*
- * Copyright (c) 2014, Oculus VR, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- */
- #include "NativeFeatureIncludes.h"
- #if _RAKNET_SUPPORT_CloudClient==1 || _RAKNET_SUPPORT_CloudServer==1
- #include "CloudCommon.h"
- #include "BitStream.h"
- using namespace RakNet;
- int RakNet::CloudKeyComp(const CloudKey &key, const CloudKey &data)
- {
- if (key.primaryKey < data.primaryKey)
- return -1;
- if (key.primaryKey > data.primaryKey)
- return 1;
- if (key.secondaryKey < data.secondaryKey)
- return -1;
- if (key.secondaryKey > data.secondaryKey)
- return 1;
- return 0;
- }
- CloudQueryRow* CloudAllocator::AllocateCloudQueryRow(void)
- {
- return RakNet::OP_NEW<CloudQueryRow>(_FILE_AND_LINE_);
- }
- void CloudAllocator::DeallocateCloudQueryRow(CloudQueryRow *row)
- {
- RakNet::OP_DELETE(row,_FILE_AND_LINE_);
- }
- unsigned char *CloudAllocator::AllocateRowData(uint32_t bytesNeededForData)
- {
- return (unsigned char*) rakMalloc_Ex(bytesNeededForData,_FILE_AND_LINE_);
- }
- void CloudAllocator::DeallocateRowData(void *data)
- {
- rakFree_Ex(data, _FILE_AND_LINE_);
- }
- void CloudKey::Serialize(bool writeToBitstream, BitStream *bitStream)
- {
- bitStream->Serialize(writeToBitstream, primaryKey);
- bitStream->Serialize(writeToBitstream, secondaryKey);
- }
- void CloudQuery::Serialize(bool writeToBitstream, BitStream *bitStream)
- {
- bool startingRowIndexIsZero=0;
- bool maxRowsToReturnIsZero=0;
- startingRowIndexIsZero=startingRowIndex==0;
- maxRowsToReturnIsZero=maxRowsToReturn==0;
- bitStream->Serialize(writeToBitstream,startingRowIndexIsZero);
- bitStream->Serialize(writeToBitstream,maxRowsToReturnIsZero);
- bitStream->Serialize(writeToBitstream,subscribeToResults);
- if (startingRowIndexIsZero==false)
- bitStream->Serialize(writeToBitstream,startingRowIndex);
- if (maxRowsToReturnIsZero==false)
- bitStream->Serialize(writeToBitstream,maxRowsToReturn);
- RakAssert(keys.Size()<(uint16_t)-1);
- uint16_t numKeys = (uint16_t) keys.Size();
- bitStream->Serialize(writeToBitstream,numKeys);
- if (writeToBitstream)
- {
- for (uint16_t i=0; i < numKeys; i++)
- {
- keys[i].Serialize(true,bitStream);
- }
- }
- else
- {
- CloudKey cmdk;
- for (uint16_t i=0; i < numKeys; i++)
- {
- cmdk.Serialize(false,bitStream);
- keys.Push(cmdk, _FILE_AND_LINE_);
- }
- }
- }
- void CloudQueryRow::Serialize(bool writeToBitstream, BitStream *bitStream, CloudAllocator *allocator)
- {
- key.Serialize(writeToBitstream,bitStream);
- bitStream->Serialize(writeToBitstream,serverSystemAddress);
- bitStream->Serialize(writeToBitstream,clientSystemAddress);
- bitStream->Serialize(writeToBitstream,serverGUID);
- bitStream->Serialize(writeToBitstream,clientGUID);
- bitStream->Serialize(writeToBitstream,length);
- if (writeToBitstream)
- {
- bitStream->WriteAlignedBytes((const unsigned char*) data,length);
- }
- else
- {
- if (length>0)
- {
- data = allocator->AllocateRowData(length);
- if (data)
- {
- bitStream->ReadAlignedBytes((unsigned char *) data,length);
- }
- else
- {
- notifyOutOfMemory(_FILE_AND_LINE_);
- }
- }
- else
- data=0;
- }
- }
- void CloudQueryResult::SerializeHeader(bool writeToBitstream, BitStream *bitStream)
- {
- cloudQuery.Serialize(writeToBitstream,bitStream);
- bitStream->Serialize(writeToBitstream,subscribeToResults);
- }
- void CloudQueryResult::SerializeNumRows(bool writeToBitstream, uint32_t &numRows, BitStream *bitStream)
- {
- bitStream->Serialize(writeToBitstream,numRows);
- }
- void CloudQueryResult::SerializeCloudQueryRows(bool writeToBitstream, uint32_t &numRows, BitStream *bitStream, CloudAllocator *allocator)
- {
- if (writeToBitstream)
- {
- for (uint16_t i=0; i < numRows; i++)
- {
- rowsReturned[i]->Serialize(true,bitStream, allocator);
- }
- }
- else
- {
- CloudQueryRow* cmdr;
- for (uint16_t i=0; i < numRows; i++)
- {
- cmdr = allocator->AllocateCloudQueryRow();
- if (cmdr)
- {
- cmdr->Serialize(false,bitStream,allocator);
- if (cmdr->data==0 && cmdr->length>0)
- {
- allocator->DeallocateCloudQueryRow(cmdr);
- notifyOutOfMemory(_FILE_AND_LINE_);
- numRows=i;
- return;
- }
- rowsReturned.Push(cmdr, _FILE_AND_LINE_);
- }
- else
- {
- notifyOutOfMemory(_FILE_AND_LINE_);
- numRows=i;
- return;
- }
- }
- }
- }
- void CloudQueryResult::Serialize(bool writeToBitstream, BitStream *bitStream, CloudAllocator *allocator)
- {
- SerializeHeader(writeToBitstream, bitStream);
- uint32_t numRows = (uint32_t) rowsReturned.Size();
- SerializeNumRows(writeToBitstream, numRows, bitStream);
- SerializeCloudQueryRows(writeToBitstream, numRows, bitStream, allocator);
- }
- #endif // #if _RAKNET_SUPPORT_CloudMemoryClient==1 || _RAKNET_SUPPORT_CloudMemoryServer==1
|