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