/*! * \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.) *

* The structure of the network packet information is as follows: *

 *    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>
 *        
 *
 *    
 * 
*

* ArClientArg also defines methods to send an "abbreviated" ArConfigArg * (i.e. just value). The short packet structure is as follows: *

 *    <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:
 *        
 *        <list contents>
 * 
* 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