1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
/*!
* \brief Defines the ArClientArg class.
* \date 05/01/05
* \author K. Cunningham
*
**/
#ifndef ARCLIENTARGUTILS_H
#define ARCLIENTARGUTILS_H
#include "Aria.h"
class ArNetPacket;
class ArConfigArg;
/// Small helper class for sending/receiving an ArConfigArg in an ArNetPacket.
/**
* ArClientArg defines methods for packing/unpacking an ArConfigArg into/from
* an ArNetPacket. (The name of the class is a slight misnomer since it may
* be used both on the server and client sides.)
* <p>
* The structure of the network packet information is as follows:
* <pre>
* string: arg.getName()
* string: arg.getDescription()
* byte: arg.getConfigPriority()
* byte: arg type ('B' == BOOL | 'I' == INT | 'D' == DOUBLE | 'S' == STRING | 'L' == LIST)
* <arg values>
* string: arg.getDisplayHint() -- only if isDisplayHintParsed is set to true
* string: arg.getExtraExplanation() -- only if version >= 2
* byte: arg.getRestartLevel() -- only if version >= 2
*
* <arg values> varies by arg type:
*
* if BOOL, then:
* byte: arg.getBool()
* if INT, then:
* byte4: arg.getInt()
* byte4: arg.getMinInt()
* byte4: arg.getMaxInt()
* if DOUBLE, then:
* byte4: arg.getDouble()
* byte4: arg.getMinDouble()
* byte4: arg.getMaxDouble()
* byte4: arg.getDoublePrecision() -- only if version >= 2
* if STRING, then:
* string: arg.getString()
* if LIST, then:
* byte4: arg.getArgCount()
* <list contents>
*
*
*
* </pre>
* <p>
* ArClientArg also defines methods to send an "abbreviated" ArConfigArg
* (i.e. just value). The short packet structure is as follows:
* <pre>
* <arg value> varies by arg type:
* if BOOL, then:
* byte: arg.getBool()
* if INT, then:
* byte4: arg.getInt()
* if DOUBLE, then:
* byte4: arg.getDouble()
* if STRING, then:
* string: arg.getString()
* if LIST, then:
* <TODO>
* <list contents>
* </pre>
* Lastly, it defines a method to send an "abbreviated" ArConfigArg in a
* text format.
**/
class ArClientArg
{
public:
/// Constructor
AREXPORT ArClientArg(bool isDisplayHintParsed = false,
ArPriority::Priority lastPriority = ArPriority::LAST_PRIORITY,
int version = 1);
/// Destructor
AREXPORT virtual ~ArClientArg();
/// Returns whether the given parameter can be sent in a network packet.
/**
* Currently, a parameter can only be sent if it is of type INT, DOUBLE,
* STRING, BOOL, LIST, or a SEPARATOR.
**/
AREXPORT virtual bool isSendableParamType(const ArConfigArg &arg);
/// Unpacks the given network packet and stores the data in the config arg.
/**
* @param packet the ArNetPacket * from which data is extracted
* @param argOut the ArConfigArg in which to set the data
* @return bool set to true if the data was successfully extracted from
* the packet; false if an error occurred and argOut is invalid
**/
AREXPORT virtual bool createArg(ArNetPacket *packet,
ArConfigArg &argOut);
/// Stores the given config arg into the network packet.
/**
* @param arg the ArConfigArg from which to retrieve the data
* @param packet the ArNetPacket * to which data is added
* @return bool set to true if the data was successfully stored in
* the packet; false if an error occurred and the packet is invalid
**/
AREXPORT virtual bool createPacket(const ArConfigArg &arg,
ArNetPacket *packet);
/// Unpacks the abbreviated arg value and stores the data in the config arg.
/**
* @param packet the ArNetPacket * from which data is extracted
* @param arg the ArConfigArg in which to set the value
* @return bool set to true if the data was successfully extracted from
* the packet; false if an error occurred and arg is invalid
**/
AREXPORT virtual bool bufToArgValue(ArNetPacket *packet,
ArConfigArg &arg);
/// Stores the abbreviated arg value into the network packet.
/**
* @param arg the ArConfigArg from which to retrieve the data
* @param packet the ArNetPacket * to which data is added
* @return bool set to true if the data was successfully stored in
* the packet; false if an error occurred and the packet is invalid
**/
AREXPORT virtual bool argValueToBuf(const ArConfigArg &arg,
ArNetPacket *packet);
/// Stores the arg value into the network packet as a text string.
/**
* The stored text string is suitable for parsing by an ArArgumentBuilder.
*
* @param arg the ArConfigArg from which to retrieve the data
* @param packet the ArNetPacket * to which data is added
* @return bool set to true if the data was successfully stored in
* the packet; false if an error occurred and the packet is invalid
**/
AREXPORT virtual bool argTextToBuf(const ArConfigArg &arg,
ArNetPacket *packet);
AREXPORT virtual bool addArgTextToPacket(const ArConfigArg &arg,
ArNetPacket *packet);
protected:
enum {
BUFFER_LENGTH = 1024
};
bool myIsDisplayHintParsed;
ArPriority::Priority myLastPriority;
int myVersion;
char myBuffer[BUFFER_LENGTH];
char myDisplayBuffer[BUFFER_LENGTH];
char myExtraBuffer[BUFFER_LENGTH];
}; // end class ArClientArgUtils
#endif //ARCLIENTARGUTILS_H
|