libnative-utilities/include/raknet/CloudCommon.hpp
2024-08-15 18:40:30 +08:00

151 lines
5.0 KiB
C++

/*
* 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.hpp"
#if _RAKNET_SUPPORT_CloudClient==1 || _RAKNET_SUPPORT_CloudServer==1
#ifndef __CLOUD_COMMON_H
#define __CLOUD_COMMON_H
#include "RakNetTypes.hpp"
#include "RakString.hpp"
namespace RakNet
{
class BitStream;
struct CloudQueryRow;
/// Allocates CloudQueryRow and the row data. Override to use derived classes or different allocators
/// \ingroup CLOUD_GROUP
class RAK_DLL_EXPORT CloudAllocator
{
public:
CloudAllocator() {}
virtual ~CloudAllocator() {}
/// \brief Allocate a row
virtual CloudQueryRow* AllocateCloudQueryRow(void);
/// \brief Free a row
virtual void DeallocateCloudQueryRow(CloudQueryRow *row);
/// \brief Allocate CloudQueryRow::data
virtual unsigned char *AllocateRowData(uint32_t bytesNeededForData);
/// \brief Free CloudQueryRow::data
virtual void DeallocateRowData(void *data);
};
/// Serves as a key to identify data uploaded to or queried from the server.
/// \ingroup CLOUD_GROUP
struct RAK_DLL_EXPORT CloudKey
{
CloudKey() {}
CloudKey(RakNet::RakString _primaryKey, uint32_t _secondaryKey) : primaryKey(_primaryKey), secondaryKey(_secondaryKey) {}
~CloudKey() {}
/// Identifies the primary key. This is intended to be a major category, such as the name of the application
/// Must be non-empty
RakNet::RakString primaryKey;
/// Identifies the secondary key. This is intended to be a subcategory enumeration, such as PLAYER_LIST or RUNNING_SCORES
uint32_t secondaryKey;
/// \internal
void Serialize(bool writeToBitstream, BitStream *bitStream);
};
/// \internal
int CloudKeyComp(const CloudKey &key, const CloudKey &data);
/// Data members used to query the cloud
/// \ingroup CLOUD_GROUP
struct RAK_DLL_EXPORT CloudQuery
{
CloudQuery() {startingRowIndex=0; maxRowsToReturn=0; subscribeToResults=false;}
/// List of keys to query. Must be at least of length 1.
/// This query is run on uploads from all clients, and those that match the combination of primaryKey and secondaryKey are potentially returned
/// If you pass more than one key at a time, the results are concatenated so if you need to differentiate between queries then send two different queries
DataStructures::List<CloudKey> keys;
/// If limiting the number of rows to return, this is the starting offset into the list. Has no effect unless maxRowsToReturn is > 0
uint32_t startingRowIndex;
/// Maximum number of rows to return. Actual number may still be less than this. Pass 0 to mean no-limit.
uint32_t maxRowsToReturn;
/// If true, automatically get updates as the results returned to you change. Unsubscribe with CloudMemoryClient::Unsubscribe()
bool subscribeToResults;
/// \internal
void Serialize(bool writeToBitstream, BitStream *bitStream);
};
/// \ingroup CLOUD_GROUP
struct RAK_DLL_EXPORT CloudQueryRow
{
/// Key used to identify this data
CloudKey key;
/// Data uploaded
unsigned char *data;
/// Length of data uploaded
uint32_t length;
/// System address of server that is holding this data, and the client is connected to
SystemAddress serverSystemAddress;
/// System address of client that uploaded this data
SystemAddress clientSystemAddress;
/// RakNetGUID of server that is holding this data, and the client is connected to
RakNetGUID serverGUID;
/// RakNetGUID of client that uploaded this data
RakNetGUID clientGUID;
/// \internal
void Serialize(bool writeToBitstream, BitStream *bitStream, CloudAllocator *allocator);
};
/// \ingroup CLOUD_GROUP
struct RAK_DLL_EXPORT CloudQueryResult
{
/// Query originally passed to Download()
CloudQuery cloudQuery;
/// Results returned from query. If there were multiple keys in CloudQuery::keys then see resultKeyIndices
DataStructures::List<CloudQueryRow*> rowsReturned;
/// If there were multiple keys in CloudQuery::keys, then each key is processed in order and the result concatenated to rowsReturned
/// The starting index of each query is written to resultKeyIndices
/// For example, if CloudQuery::keys had 4 keys, returning 3 rows, 0, rows, 5 rows, and 12 rows then
/// resultKeyIndices would be 0, 3, 3, 8
DataStructures::List<uint32_t> resultKeyIndices;
/// Whatever was passed to CloudClient::Get() as CloudQuery::subscribeToResults
bool subscribeToResults;
/// \internal
void Serialize(bool writeToBitstream, BitStream *bitStream, CloudAllocator *allocator);
/// \internal
void SerializeHeader(bool writeToBitstream, BitStream *bitStream);
/// \internal
void SerializeNumRows(bool writeToBitstream, uint32_t &numRows, BitStream *bitStream);
/// \internal
void SerializeCloudQueryRows(bool writeToBitstream, uint32_t &numRows, BitStream *bitStream, CloudAllocator *allocator);
};
} // Namespace RakNet
#endif // __CLOUD_COMMON_H
#endif // #if _RAKNET_SUPPORT_CloudClient==1 || _RAKNET_SUPPORT_CloudServer==1