Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

keyinfo.cc

Go to the documentation of this file.
00001 //**************************************************************************
00002 #include "dataserver.h"
00003 //**************************************************************************
00004 int packStruct(KeyTable *T, unsigned char **dataptr, int &totsize)
00005 {
00006 static KeyInfo d;
00007 totsize = sizeof(T->n) + T->n*(sizeof(d.id) + sizeof(d.key) + sizeof(d.description) + sizeof(d.type) + sizeof(d.elem_size) + sizeof(d.num_elems) + sizeof(d.vartype) + sizeof(d.is_locked) + sizeof(d.value) + sizeof(d.perm));
00008 unsigned char *data;
00009 ALLOC1D(&data, totsize);
00010 *dataptr = data;
00011 int ptr = 0;
00012 
00013 PACK_VARIABLE(T->n, data, &ptr);
00014 
00015 for (int i = 0; i < T->n; i++)
00016         {
00017          PACK_VARIABLE(T->key[i].id, data, &ptr);
00018          PACK_VARIABLE(T->key[i].elem_size, data, &ptr);
00019          PACK_VARIABLE(T->key[i].num_elems, data, &ptr);
00020          PACK_VARIABLE(T->key[i].vartype, data, &ptr);
00021          PACK_VARIABLE(T->key[i].is_locked, data, &ptr);
00022          PACK_VARIABLE(T->key[i].perm, data, &ptr);
00023          PACK_VARIABLE(T->key[i].description, data, &ptr);
00024          PACK_1D_ARRAY(T->key[i].key, data, &ptr);
00025          PACK_1D_ARRAY(T->key[i].type, data, &ptr);
00026          PACK_1D_ARRAY(T->key[i].value, data, &ptr);
00027         }
00028 
00029 return ptr;
00030 }
00031 //**************************************************************************
00032 int unpackStruct(KeyTable *T, unsigned char *data, int size)
00033 {
00034 int ptr = 0;
00035 
00036 UNPACK_VARIABLE(&(T->n), data, &ptr);
00037 
00038 if (T->key.size())
00039         {
00040          T->key.clear();
00041         }
00042 
00043 for (int i = 0; i < T->n; i++)
00044         {
00045          T->Add();
00046          UNPACK_VARIABLE(&(T->key[i].id), data, &ptr);
00047          UNPACK_VARIABLE(&(T->key[i].elem_size), data, &ptr);
00048          UNPACK_VARIABLE(&(T->key[i].num_elems), data, &ptr);
00049          UNPACK_VARIABLE(&(T->key[i].vartype), data, &ptr);
00050          UNPACK_VARIABLE(&(T->key[i].is_locked), data, &ptr);
00051          UNPACK_VARIABLE(&(T->key[i].perm), data, &ptr);
00052          UNPACK_VARIABLE(&(T->key[i].description), data, &ptr);
00053          UNPACK_1D_ARRAY(T->key[i].key, data, &ptr);
00054          UNPACK_1D_ARRAY(T->key[i].type, data, &ptr);
00055          UNPACK_1D_ARRAY(T->key[i].value, data, &ptr);
00056         }
00057 
00058 return ptr;
00059 }
00060 //**************************************************************************
00061 KeyTable::KeyTable()
00062 {
00063 n = 0;
00064 }
00065 //**************************************************************************
00066 KeyTable::~KeyTable()
00067 {
00068 for (int i = 0; i < key.size(); i++)
00069         delete key[i].sem;
00070 
00071 key.clear();
00072 }
00073 //**************************************************************************
00074 int KeyTable::Add()
00075 {
00076 static KeyInfo dummy;
00077 dummy.ptr = NULL;
00078 dummy.callback = NULL;
00079 key.push_back(dummy);
00080 
00081 return key.size();
00082 }
00083 //**************************************************************************
00084 int KeyTable::getKeyHandle(char *keyword)
00085 {
00086 int i;
00087 for (i = 0; i < key.size(); i++)
00088         {
00089          if (strcmp(key[i].key, keyword) == 0)
00090                 break;
00091         }
00092 return i;
00093 }
00094 //**************************************************************************
00095 bool KeyTable::isVar(int i)
00096 {
00097 return (key[i].description == VARIABLE);
00098 }
00099 //**************************************************************************
00100 bool KeyTable::isVar(char *keyword)
00101 {
00102 int i = getKeyHandle(keyword);
00103 if (i < n)
00104         return isVar(i);
00105 return false;
00106 }
00107 //**************************************************************************
00108 bool KeyTable::isCharArray(int i)
00109 {
00110 return (key[i].description == STATIC_1D_ARRAY && key[i].vartype == CHAR);
00111 }
00112 //**************************************************************************
00113 bool KeyTable::isCharArray(char *keyword)
00114 {
00115 int i = getKeyHandle(keyword);
00116 if (i < n)
00117         return isCharArray(i);
00118 
00119 return false;
00120 }
00121 //**************************************************************************
00122 bool KeyTable::isValidKeyword(char *keyword)
00123 {
00124 return (getKeyHandle(keyword) < n);
00125 }
00126 //**************************************************************************
00127 bool KeyTable::isViewableVar(int i)
00128 {
00129 return (isVar(i) || isCharArray(i));
00130 }
00131 //**************************************************************************
00132 bool KeyTable::isViewableVar(char *keyword)
00133 {
00134 int i = getKeyHandle(keyword);
00135 if (i < n)
00136         return isViewableVar(i);
00137 
00138 return false;
00139 }
00140 //**************************************************************************
00141 void KeyTable::List()
00142 {
00143 cout << "==============================================================================" << endl << "\r";
00144 cout << "Keyword\t\tDescription\t\tType\tElem Size (bytes)  # elements" << endl << "\r";
00145 cout << "==============================================================================" << endl << "\r";
00146 for (int i = 0; i < key.size(); i++)
00147         {
00148          char desc[24];
00149          int keylen = strlen(key[i].key);
00150          cout << key[i].key;
00151          if (key[i].is_locked)
00152                 {
00153                  cout << "*";
00154                  ++keylen;
00155                 }
00156          cout << "\t"; 
00157          if (keylen <= 7) cout << "\t";
00158 
00159          if (strlen(Description(i)) > 23)
00160                 {
00161                  strncpy(desc, Description(i), 23);
00162                  desc[23] = '\0';
00163                  cout << desc << " ";
00164                 }
00165          else
00166                 cout << Description(i) << "\t";
00167          if (strlen(Description(i)) <= 15) cout << "\t";
00168 
00169          cout << key[i].type << "\t";
00170          if (strlen(key[i].type) < 9) cout << "\t";
00171 
00172          cout << key[i].elem_size << "\t\t"
00173                 << key[i].num_elems << endl << "\r";
00174         }
00175 cout << "==============================================================================" << endl << "\r";
00176 cout.flush();
00177 }
00178 //**************************************************************************
00179 void KeyTable::ListValues()
00180 {
00181 int i;
00182 
00183 cout << "==============================================================================" << endl << "\r";
00184 int max = 0;
00185 for (i = 0; i < n; i++)
00186         {
00187          if (!isViewableVar(i))
00188                 continue;
00189          if (max < strlen(key[i].key))
00190                 max = strlen(key[i].key);
00191         }
00192 
00193 for (i = 0; i < n; i++)
00194         {
00195          if (!isViewableVar(i))
00196                 continue;
00197          cout << key[i].key;
00198          for (int j = 0; j < max-strlen(key[i].key); j++)
00199                 cout << " ";
00200          cout << " = " << key[i].value << endl << "\r" << flush;
00201         }
00202 cout << "==============================================================================" << endl << "\r";
00203 }
00204 //**************************************************************************
00205 bool KeyTable::isWritable(int i)
00206 {
00207 return (key[i].perm == KEY_READ_WRITE);
00208 }
00209 //**************************************************************************
00210 bool KeyTable::isWritable(char *keyword)
00211 {
00212 int i = getKeyHandle(keyword);
00213 if (i < n)
00214         return isWritable(i);
00215 
00216 return false;
00217 }
00218 //**************************************************************************
00219 bool KeyTable::isArray(int i)
00220 {
00221 return (strstr(Description(i), "Array") != NULL);
00222 }
00223 //**************************************************************************
00224 bool KeyTable::isArray(char *keyword)
00225 {
00226 int i = getKeyHandle(keyword);
00227 if (i < n)
00228         return isArray(i);
00229 
00230 return false;
00231 }
00232 //**************************************************************************
00233 bool KeyTable::isStaticArray(int i)
00234 {
00235 return (strstr(Description(i), "Static") != NULL);
00236 }
00237 //**************************************************************************
00238 bool KeyTable::isStaticArray(char *keyword)
00239 {
00240 int i = getKeyHandle(keyword);
00241 if (i < n)
00242         return isStaticArray(i);
00243 
00244 return false;
00245 }
00246 //**************************************************************************
00247 void KeyTable::RegisterCallback(char *keyword, void (*cb)(void*), void *data)
00248 {
00249 int i = getKeyHandle(keyword);
00250 if (i == n)
00251         {
00252          cerr << "KeyTable::RegisterCallback: Error! Invalid keyword \"" << keyword << "\"!!" << endl << flush;
00253          return;
00254         }
00255 if (!isWritable(i))
00256         {
00257          cerr << "KeyTable::RegisterCallback: Error! Keyword \"" << keyword << "\" points to read-only data!!" << endl << flush;
00258          return;
00259         }
00260 
00261 key[i].callback = cb;
00262 key[i].callbackdata = data;
00263 }
00264 //**************************************************************************
00265 bool KeyTable::hasCallback(int i)
00266 {
00267 return (key[i].callback != NULL);
00268 }
00269 //**************************************************************************
00270 bool KeyTable::hasCallback(char *keyword)
00271 {
00272 int i = getKeyHandle(keyword);
00273 if (i < n)
00274         return hasCallback(i);
00275 
00276 return false;
00277 }
00278 //**************************************************************************
00279 void KeyTable::Callback(int i)
00280 {
00281 key[i].callback(key[i].callbackdata);
00282 }
00283 //**************************************************************************
00284 void KeyTable::Callback(char *keyword)
00285 {
00286 int i = getKeyHandle(keyword);
00287 if (i < n)
00288         Callback(i);
00289 }
00290 //**************************************************************************

Generated on Sun Jun 16 17:36:49 2002 for POSSE: Portable Object-oriented Scientific Steering Environment by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001