property.h
00001 /*
00002  *  Player - One Hell of a Robot Server
00003  *  Copyright (C) 2000
00004  *     Brian Gerkey, Kasper Stoy, Richard Vaughan, & Andrew Howard
00005  *
00006  *
00007  *  This program is free software; you can redistribute it and/or modify
00008  *  it under the terms of the GNU General Public License as published by
00009  *  the Free Software Foundation; either version 2 of the License, or
00010  *  (at your option) any later version.
00011  *
00012  *  This program is distributed in the hope that it will be useful,
00013  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  *  GNU General Public License for more details.
00016  *
00017  *  You should have received a copy of the GNU General Public License
00018  *  along with this program; if not, write to the Free Software
00019  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00020  *
00021  */
00022 /********************************************************************
00023  *
00024  *  This library is free software; you can redistribute it and/or
00025  *  modify it under the terms of the GNU Lesser General Public
00026  *  License as published by the Free Software Foundation; either
00027  *  version 2.1 of the License, or (at your option) any later version.
00028  *
00029  *  This library is distributed in the hope that it will be useful,
00030  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00031  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00032  *  Lesser General Public License for more details.
00033  *
00034  *  You should have received a copy of the GNU Lesser General Public
00035  *  License along with this library; if not, write to the Free Software
00036  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00037  *
00038  ********************************************************************/
00039 
00040 #ifndef __PROPERTY_H
00041 #define __PROPERTY_H
00042 
00043 #if defined (WIN32)
00044   #if defined (PLAYER_STATIC)
00045     #define PLAYERCORE_EXPORT
00046   #elif defined (playercore_EXPORTS)
00047     #define PLAYERCORE_EXPORT    __declspec (dllexport)
00048   #else
00049     #define PLAYERCORE_EXPORT    __declspec (dllimport)
00050   #endif
00051 #else
00052   #define PLAYERCORE_EXPORT
00053 #endif
00054 
00055 class ConfigFile;
00056 class Driver;
00057 
00059 class PLAYERCORE_EXPORT Property
00060 {
00061         public:
00062                 Property (void);
00063                 Property (const char *newKey, bool readOnly);
00064                 virtual ~Property (void);
00065 
00066                 // Accessor functions
00067                 virtual const char* GetKey (void) const         { return key; }
00068                 virtual void SetKey (const char *newKey);
00069                 virtual void GetValueToMessage (void *data) const = 0;
00070                 virtual void SetValueFromMessage (const void *data) = 0;
00071 
00072                 virtual const bool KeyIsEqual (const char *rhs);
00073 
00074                 // Config file read method
00075                 virtual bool ReadConfig (ConfigFile *cf, int section) = 0;
00076 
00077         protected:
00078                 char *key;                      // Key for this property
00079                 bool readonly;          // true if this property is read-only
00080 };
00081 
00084 
00086 class PLAYERCORE_EXPORT BoolProperty : public Property
00087 {
00088         public:
00089                 BoolProperty (const char *newKey, bool newValue, bool readOnly);
00091                 BoolProperty (const char *newKey, bool newValue, bool readOnly, Driver * driver, ConfigFile*cf, int section);
00092 
00093                 bool GetValue (void) const              { return value; }
00094                 void SetValue (bool newValue);
00095                 void GetValueToMessage (void *data) const;
00096                 void SetValueFromMessage (const void *data);
00097 
00098                 // Config file read method
00099                 virtual bool ReadConfig (ConfigFile *cf, int section);
00100 
00101                 // Operators
00102                 operator bool (void)                    { return value; }
00103                 const BoolProperty& operator= (const BoolProperty &rhs);
00104                 bool operator= (bool rhs);
00105 
00106         private:
00107                 bool value;
00108 };
00109 
00112 
00114 class PLAYERCORE_EXPORT IntProperty : public Property
00115 {
00116         public:
00117                 IntProperty (const char *newKey, int newValue, bool readOnly);
00119                 IntProperty (const char *newKey, int newValue, bool readOnly, Driver * driver, ConfigFile*cf, int section);
00120 
00121                 int GetValue (void) const                       { return value; }
00122                 void SetValue (int newValue);
00123                 void GetValueToMessage (void *data) const;
00124                 void SetValueFromMessage (const void *data);
00125 
00126                 // Config file read method
00127                 virtual bool ReadConfig (ConfigFile *cf, int section);
00128 
00129                 // Operators
00130                 operator int (void)                             { return value; }
00131                 const IntProperty& operator= (const IntProperty &rhs);
00132                 int operator= (int rhs);
00133 
00134         private:
00135                 int value;
00136 };
00137 
00140 
00142 class PLAYERCORE_EXPORT DoubleProperty : public Property
00143 {
00144         public:
00145                 DoubleProperty (const char *newKey, double newValue, bool readOnly);
00147                 DoubleProperty (const char *newKey, double newValue, bool readOnly, Driver * driver, ConfigFile*cf, int section);
00148 
00149                 double GetValue (void) const            { return value; }
00150                 void SetValue (double newValue);
00151                 void GetValueToMessage (void *data) const;
00152                 void SetValueFromMessage (const void *data);
00153 
00154                 // Config file read method
00155                 virtual bool ReadConfig (ConfigFile *cf, int section);
00156 
00157                 // Operators
00158                 operator double (void)                          { return value; }
00159                 const DoubleProperty& operator= (const DoubleProperty &rhs);
00160                 double operator= (double rhs);
00161 
00162         private:
00163                 double value;
00164 };
00165 
00168 
00170 class PLAYERCORE_EXPORT StringProperty : public Property
00171 {
00172         public:
00173                 StringProperty (const char *newKey, const char *newValue, bool readOnly);
00175                 StringProperty (const char *newKey, const char *newValue, bool readOnly, Driver * driver, ConfigFile*cf, int section);
00176                 ~StringProperty (void);
00177 
00178                 const char* GetValue (void) const       { return value; }
00179                 void SetValue (const char *newValue);
00180                 void GetValueToMessage (void *data) const;
00181                 void SetValueFromMessage (const void *data);
00182 
00183                 // Config file read method
00184                 virtual bool ReadConfig (ConfigFile *cf, int section);
00185 
00186                 // Operators
00187                 operator const char* (void)                             { return value; }
00188                 const StringProperty& operator= (const StringProperty &rhs);
00189                 const char* operator= (const char* rhs);
00190 
00191         private:
00192                 char *value;
00193 };
00194 
00197 
00199 typedef struct PropertyNode
00200 {
00201         char *key;
00202         Property *property;
00203         struct PropertyNode *next;
00204 } PropertyNode;
00205 
00207 class PLAYERCORE_EXPORT PropertyBag
00208 {
00209         public:
00210                 PropertyBag (void);
00211                 ~PropertyBag (void);
00212 
00213                 bool AddProperty (const char *key, Property *property);
00214                 Property* GetProperty (const char *key);
00215 
00216         private:
00217                 PropertyNode *firstProperty;
00218 };
00219 
00220 #endif // __PROPERTY_H