00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <xercesc/util/XMLUniDefs.hpp>
00019 #include <xercesc/sax2/Attributes.hpp>
00020 #include "load_xml_handle.h"
00021
00022 #define _CRT_SECURE_NO_DEPRECATE 1
00023
00024 gld_loadHndl::gld_loadHndl() : fFormatter("LATIN1", 0, this, XMLFormatter::NoEscapes, (const XMLFormatter::UnRepFlags) 0),
00025 fExpandNS ( false ){
00026 depth = 0;
00027 first = last = -1;
00028 stack_state = EMPTY;
00029
00030 load_state = false;
00031 module_name[0] = 0;
00032 obj = NULL;
00033 stack_ptr = NULL;
00034 object_count = 0;
00035 class_count = 0;
00036 }
00037
00038 gld_loadHndl::gld_loadHndl(const char* const encodingName, const XMLFormatter::UnRepFlags unRepFlags, const bool expandNamespaces)
00039 : fFormatter(encodingName, 0, this, XMLFormatter::NoEscapes, unRepFlags),
00040 fExpandNS ( expandNamespaces ){
00041 depth = 0;
00042 first = last = -1;
00043 obj = NULL;
00044 stack_state = EMPTY;
00045
00046 load_state = false;
00047 module_name[0] = 0;
00048 stack_ptr = NULL;
00049 object_count = 0;
00050 class_count = 0;
00051 }
00052
00053 gld_loadHndl::~gld_loadHndl(){
00054 ;
00055 }
00056
00057 void gld_loadHndl::setDocumentLocator(const Locator *const loc){
00058 this->locator = loc;
00059 }
00060
00061 void gld_loadHndl::writeChars(const XMLByte* const toWrite){
00062 ;
00063 }
00064
00065 void gld_loadHndl::writeChars(const XMLByte* const toWrite, const unsigned int count, XMLFormatter* const formatter){
00066
00067 ;
00068 }
00069
00070 void gld_loadHndl::error(const SAXParseException& e){
00071 output_error("XML_Load: %ls(%i:char %i)\n Message: %ls", (char *)e.getSystemId(), e.getLineNumber(), e.getColumnNumber(), (char *)e.getMessage());
00072 load_state = false;
00073 }
00074
00075 void gld_loadHndl::fatalError(const SAXParseException& e){
00076 output_error("XML_Load: %ls(%i:char %i)\n Message: %ls", (char *)e.getSystemId(), e.getLineNumber(), e.getColumnNumber(), (char *)e.getMessage());
00077 load_state = false;
00078 }
00079
00080 void gld_loadHndl::warning(const SAXParseException& e){
00081 output_warning("XML_Load: %ls(%i:char %i)\n Message: %ls", (char *)e.getSystemId(), e.getLineNumber(), e.getColumnNumber(), (char *)e.getMessage());
00082
00083 }
00084
00085
00086 void gld_loadHndl::notationDecl(const XMLCh* const name, const XMLCh* const publicId, const XMLCh* const systemId){
00087 ;
00088 }
00089
00092 void gld_loadHndl::parse_property(char *buffer){
00093 ;
00094 }
00095
00096 char *gld_loadHndl::read_module_prop(char *buffer, size_t len){
00097
00098 if(strcmp(propname, "major") == 0){
00099 char temp[8];
00100 int major_in = atoi(buffer);
00101 int major = 0;
00102 module_getvar(this->module, "major", temp, 8);
00103 major = atoi(temp);
00104 if(major == 0)
00105 return NULL;
00106 if(major == major_in){
00107 return NULL;
00108 } else if(major > major_in){
00109 output_warning("The input file was built using an older major version of the module.");
00110 return NULL;
00111 } else if(major < major_in){
00112 output_warning("The file was built using a newer major version of the module loading it!");
00113 return NULL;
00114 }
00115 } else if(strcmp(propname, "minor") == 0){
00116 char temp[8];
00117 int minor_in = atoi(buffer);
00118 int minor = 0;
00119 int major = 0;
00120 module_getvar(this->module, "major", temp, 8);
00121 major = atoi(temp);
00122 module_getvar(this->module, "minor", temp, 8);
00123 minor = atoi(temp);
00124 if(major == 0)
00125 return NULL;
00126 if(minor == minor_in){
00127 return NULL;
00128 } else if(minor > minor_in){
00129 output_warning("XML::read_module_prop(): The input file was built using an older minor version of the module.");
00130 } else if(minor < minor_in){
00131 output_warning("XML::read_module_prop(): The file was built using a newer minor version of the module loading it!");
00132 }
00133 } else {
00134 global_setvar(propname, buffer);
00135 }
00136 return NULL;
00137 }
00138
00139 char *gld_loadHndl::read_global_prop(char *buffer, size_t len){
00140 return 0;
00141 }
00142
00143 char *gld_loadHndl::read_clock_prop(char* buffer, size_t len){
00144 TIMESTAMP tsval = 0;
00145 if(strcmp(propname, "tick") == 0){
00146 ;
00147 } else if(strcmp(propname, "timezone") == 0){
00148 if (timestamp_set_tz(buffer)==NULL){
00149 sprintf(errmsg, "timezone %s is not defined", timezone);
00150 return errmsg;
00151 }
00152 } else if(strcmp(propname, "timestamp") == 0){
00153 if(time_value_datetime(buffer, &tsval)){
00154 global_clock = tsval;
00155 } else {
00156 sprintf(errmsg, "timestamp \"%s\" could not be resolved", buffer);
00157 return errmsg;
00158 }
00159 } else {
00160 sprintf(errmsg, "Unrecognized keyword in start_element_clock(%s)", buffer);
00161 return errmsg;
00162 }
00163 return NULL;
00164 }
00165
00166 char *gld_loadHndl::read_object_prop(char *buffer, size_t len){
00167
00168
00169 char *rand_ptr = NULL;
00170 char *rand_mode_ptr = NULL;
00171 char *unit_ptr = NULL;
00172 double realval = 0.0;
00173 UNIT *unit=NULL;
00174 SAXParseException *e = NULL;
00175 void *addr = object_get_addr(obj, propname);
00176 if(this->obj == NULL){
00177 sprintf(errmsg, "Null object pointer in read_object_prop(%s)", buffer);
00178 return errmsg;
00179 }
00180 if(this->prop == NULL){
00181 if (strcmp(propname, "parent")==0){
00182 if (strcmp(propname, "root")==0){
00183 obj->parent = NULL;
00184 } else {
00185 add_unresolved(obj,PT_object,(void*)&obj->parent,oclass,buffer,"XML",42,UR_RANKS);
00186 }
00187 } else if (strcmp(propname, "rank")==0){
00188 obj->rank = atoi(buffer);
00189 } else if (strcmp(propname, "clock")==0){
00190 obj->clock = atoi64(buffer);
00191 } else if (strcmp(propname, "latitude")==0){
00192 obj->latitude = load_latitude(buffer);
00193 } else if (strcmp(propname, "longitude")==0){
00194 obj->longitude = load_longitude(buffer);
00195 } else if (strcmp(propname, "in")==0){
00196 obj->in_svc = convert_to_timestamp(buffer);
00197 } else if (strcmp(propname, "out")==0){
00198 obj->out_svc = convert_to_timestamp(buffer);
00199 } else {
00200 sprintf(errmsg, "Null property pointer in read_object_prop(%s)", buffer);
00201 return errmsg;
00202 }
00203 return NULL;
00204 }
00205
00206 switch(prop->ptype){
00207 case PT_double:
00208
00209 if(strncmp("random.", buffer, 7) == 0){
00210 char temp[256];
00211 char *modep = NULL;
00212 double first = 0.0, second = 0.0;
00213 RANDOMTYPE rt;
00214 strncpy(temp, buffer, 256);
00215 modep = strtok(temp+7, "(");
00216 if(modep == NULL){
00217
00218 load_state = false;
00219 sprintf(errmsg, "Misformed random() value in read_object_prop(%s)", buffer);
00220 return errmsg;
00221 }
00222 rt = random_type(modep);
00223 if(rt == 0){
00224
00225 load_state = false;
00226 sprintf(errmsg, "Invalid random distribution in read_object_prop(%s)", buffer);
00227 return errmsg;
00228 } else {
00229 first = atof(strtok(NULL, ","));
00230 second = atof(strtok(NULL, ")"));
00231 realval = random_value(rt, first, second);
00232 }
00233 if(strlen(strchr(buffer, ')')+1) > 0){
00234 unit = unit_find(strchr(buffer, ')') + 2);
00235 if (unit!=NULL && prop->unit!=NULL && unit_convert_ex(unit,prop->unit,&realval)==0){
00236 sprintf(errmsg, "Cannot convert units from %s to %s in read_object_prop(%s)", unit->name,prop->unit->name, buffer);
00237 load_state = false;
00238 return errmsg;
00239 }
00240 }
00241 } else {
00242 unit_ptr = NULL;
00243 realval = strtod(buffer, &unit_ptr);
00244 if(unit_ptr != NULL){
00245 while(*unit_ptr == ' ') ++unit_ptr;
00246 unit = unit_find(unit_ptr);
00247 if(strlen(unit_ptr) > 0){
00248 if (unit!=NULL && prop->unit!=NULL && unit_convert_ex(unit,prop->unit,&realval)==0){
00249 sprintf(errmsg, "Cannot convert units from %s to %s in read_object_prop(%s)", unit->name,prop->unit->name, buffer);
00250 load_state = false;
00251 return errmsg;
00252 }
00253 }
00254 }
00255 }
00256
00257 if(object_set_double_by_name(obj, propname, realval) == 0){
00258 sprintf(errmsg, "Could not set \"%s\" to %f in read_object_prop(%s)", propname, realval, buffer);
00259 load_state = false;
00260 return errmsg;
00261 } else {
00262 return NULL;
00263 }
00264 break;
00265 case PT_object:
00266 if(add_unresolved(obj,PT_object,(void*)addr,oclass,buffer,"XML",42,UR_NONE) == NULL){
00267 sprintf(errmsg, "Failure with add_unresolved() in read_object_prop(%s)", buffer);
00268 return errmsg;
00269 }
00270 break;
00271 default:
00272 if(prop->ptype < _PT_LAST){
00273 if (object_set_value_by_name(obj, propname, buffer)==0) {
00274
00275 sprintf(errmsg, "Property %s of %s:%i could not be set to \"%s\" in read_object_prop()", propname, obj->oclass->name, obj->id, buffer);
00276 load_state = false;
00277 return errmsg;
00278 } else {
00279 ;
00280 }
00281 } else {
00282 sprintf(errmsg, "Invalid property id = %i in read_object_prop(%s)", prop->ptype, buffer);
00283 return errmsg;
00284 }
00285 }
00286 return 0;
00287 }
00288
00291 void gld_loadHndl::characters(const XMLCh* const chars, const unsigned int length){
00292 char buffer[1024];
00293 char tbuff[1024];
00294 wchar_t wbuff[1024];
00295 SAXParseException *e = NULL;
00296 char *unit_ptr = NULL;
00297 unsigned int i = 0;
00298 size_t len = 0;
00299 char *retval = NULL;
00300 switch(stack_state){
00301 case MODULE_PROP:
00302 case GLOBAL_PROP:
00303 case OBJECT_PROP:
00304 case CLOCK_PROP:
00305
00306 if((len = wcslen((const wchar_t *)chars)) < 1){
00307 sprintf(tbuff, "Unable to get length of characters in characters()");
00308 mbstowcs(wbuff, tbuff, 1024);
00309 e = new SAXParseException((const XMLCh *)wbuff, *(this->locator));
00310 error(*e);
00311 delete e;
00312 return;
00313 }
00314 if(len != wcstombs(buffer, (const wchar_t *)chars, 1024)){
00315 sprintf(tbuff, "Unable to convert wcs to char in characters()");
00316 mbstowcs(wbuff, tbuff, 1024);
00317 e = new SAXParseException((const XMLCh *)wbuff, *(this->locator));
00318 error(*e);
00319 delete e;
00320 return;
00321 }
00322 break;
00323 default:
00324 return;
00325 }
00326 switch(stack_state){
00327 case MODULE_PROP:
00328 retval = this->read_module_prop(buffer, len);
00329 break;
00330 case GLOBAL_PROP:
00331 retval = this->read_global_prop(buffer, len);
00332 break;
00333 case OBJECT_PROP:
00334 retval = this->read_object_prop(buffer, len);
00335
00336 break;
00337 case CLOCK_PROP:
00338 retval = this->read_clock_prop(buffer, len);
00339 }
00340 if(retval != NULL){
00341 stack_state = EMPTY;
00342 output_error("Error reading the XML file");
00343 mbstowcs(wbuff, errmsg, 1024);
00344 e = new SAXParseException((const XMLCh *)wbuff, *(this->locator));
00345 error(*e);
00346 delete e;
00347 load_state = 0;
00348 }
00349
00350 }
00351
00354 void gld_loadHndl::endDocument(){
00355 OBJECT *tempobj = object_get_first();
00356
00357
00358 if(load_resolve_all() == FAILED){
00359 output_error("XML_Load: unable to resolve object linkings!");
00360 load_state = false;
00361 }
00362
00363
00364 for (; obj!=NULL; obj=obj->next)
00365 object_set_parent(obj,obj->parent);
00366 output_verbose("XML_Load: %d object%s loaded.", object_get_count(), object_get_count() > 0 ? "s" : "");
00367 if(object_count > 0)
00368 if(object_get_count() != this->object_count)
00369 output_warning("XML_Load: we expected %i objects instead!", this->object_count);
00370 output_verbose("XML_Load: %d class%s loaded.", class_get_count(), class_get_count() > 0 ? "es" : "");
00371 if(class_count > 0)
00372 if(class_get_count() != this->class_count)
00373 output_warning("XML_Load: we expected %i classes instead!", this->class_count);
00374 }
00375
00376 char *gld_loadHndl::end_element_empty(char *buffer, size_t len){
00377 return NULL;
00378 }
00379
00380 char *gld_loadHndl::end_element_load(char *buffer, size_t len){
00381 if(strcmp("load", buffer) == 0)
00382 stack_state = EMPTY;
00383 return NULL;
00384 }
00385
00386 char *gld_loadHndl::end_element_module(char *buffer, size_t len){
00387 if(strcmp("module", buffer) == 0)
00388 stack_state = LOAD;
00389 return NULL;
00390 }
00391
00392 char *gld_loadHndl::end_element_module_prop(char *buffer, size_t len){
00393 if(strcmp("properties", buffer) == 0){
00394 memset(propname, 0, len);
00395 stack_state = MODULE_STATE;
00396 }
00397 return NULL;
00398 }
00399
00400 char *gld_loadHndl::end_element_object(char *buffer, size_t len){
00401 if(strcmp("object", buffer) == 0)
00402 stack_state = MODULE_STATE;
00403 return NULL;
00404 }
00405
00406 char *gld_loadHndl::end_element_object_prop(char *buffer, size_t len){
00407 if(strcmp(propname, buffer) == 0){
00408 memset(propname, 0, len);
00409 stack_state = OBJECT_STATE;
00410 }
00411 return NULL;
00412 }
00413
00414 char *gld_loadHndl::end_element_global(char *buffer, size_t len){
00415 if(strcmp("global", buffer) == 0)
00416 stack_state = LOAD;
00417 return NULL;
00418 }
00419
00420 char *gld_loadHndl::end_element_global_prop(char *buffer, size_t len){
00421 if(strcmp(propname, buffer) == 0){
00422 memset(propname, 0, len);
00423 stack_state = GLOBAL_STATE;
00424 }
00425 return NULL;
00426 }
00427
00428 char *gld_loadHndl::end_element_clock_prop(char *buffer, size_t len){
00429 if(strcmp(propname, buffer) == 0){
00430 memset(propname, 0, len);
00431 stack_state = CLOCK_STATE;
00432 }
00433 return NULL;
00434 }
00435
00436 char *gld_loadHndl::end_element_clock(char *buffer, size_t len){
00437 if(strcmp("clock", buffer) == 0)
00438 stack_state = LOAD;
00439 return NULL;
00440 }
00441
00444 void gld_loadHndl::endElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname){
00445 char buffer[128];
00446 int i = 0;
00447 size_t len = 0;
00448 gldStack *temp_stack = NULL;
00449 char *retval = NULL;
00450
00451 --depth;
00452
00453 len = wcslen((const wchar_t *)qname);
00454 wcstombs(buffer, (const wchar_t *)qname, 128);
00455
00456 switch(stack_state){
00457 case EMPTY:
00458 retval = end_element_empty(buffer, len);
00459 break;
00460 case LOAD:
00461 retval = end_element_load(buffer, len);
00462 break;
00463 case MODULE_STATE:
00464 retval = end_element_module(buffer, len);
00465 break;
00466 case MODULE_PROP:
00467 retval = end_element_module_prop(buffer, len);
00468 break;
00469 case OBJECT_STATE:
00470 retval = end_element_object(buffer, len);
00471 break;
00472 case OBJECT_PROP:
00473 retval = end_element_object_prop(buffer, len);
00474 break;
00475 case GLOBAL_STATE:
00476 retval = end_element_global(buffer, len);
00477 break;
00478 case GLOBAL_PROP:
00479 retval = end_element_global_prop(buffer, len);
00480 break;
00481 case CLOCK_STATE:
00482 retval = end_element_clock(buffer, len);
00483 break;
00484 case CLOCK_PROP:
00485 retval = end_element_clock_prop(buffer, len);
00486 break;
00487 }
00488 }
00489
00490
00491 void gld_loadHndl::ignorableWhitespace(const XMLCh* const chars, const unsigned int length){
00492 output_verbose("XML_Load: ignored: %i spaces.", length);
00493 }
00494
00495
00496 void gld_loadHndl::processingInstruction(const XMLCh* const target, const XMLCh* const data){
00497
00498 return;
00499 }
00500
00503 void gld_loadHndl::startDocument(){
00504 depth = 0;
00505 module_name[0] = 0;
00506 load_state = true;
00507 }
00508
00509 char *gld_loadHndl::start_element_empty(char *buffer, size_t len, const Attributes& attributes){
00510 if(strcmp(buffer, "load") == 0){
00511 stack_state = LOAD;
00512 }
00513 return NULL;
00514 }
00515
00516 char *gld_loadHndl::start_element_load(char *buffer, size_t len, const Attributes& attributes){
00517 static wchar_t wcs_type[5], wcs_minor[6], wcs_major[6];
00518 static size_t wcs_type_len = mbstowcs(wcs_type, "type", 5);
00519 static size_t wcs_major_len = mbstowcs(wcs_major, "major", 6);
00520 static size_t wcs_minor_len = mbstowcs(wcs_minor, "minor", 6);
00521 XMLCh *_major = NULL, *_minor = NULL;
00522 long int major = 0, minor = 0;
00523 if(strcmp(buffer, "global") == 0){
00524 stack_state = GLOBAL_STATE;
00525 } else if(strcmp(buffer, "module") == 0){
00526 wcstombs(module_name, (const wchar_t *)attributes.getValue((const XMLCh *)wcs_type), 1024);
00527 _major = (XMLCh *)attributes.getValue((const XMLCh *)wcs_major);
00528 _minor = (XMLCh *)attributes.getValue((const XMLCh *)wcs_minor);
00529 if(_major != NULL)
00530 major = wcstol((const wchar_t *)_major, NULL, 10);
00531 if(_minor != NULL)
00532 minor = wcstol((const wchar_t *)_minor, NULL, 10);
00533
00534 if((module = module_load(module_name, 0, NULL)) == NULL){
00535 sprintf(errmsg, "Unable to load module \"%s\" in start_element_load()", module_name);
00536 return errmsg;
00537 } else {
00538 strcpy(module_name, buffer);
00539 stack_state = MODULE_STATE;
00540 if(major != 0){
00541 char temp[8];
00542 module_getvar(this->module, "major", temp, 8);
00543 int major_in = atoi(temp);
00544 module_getvar(this->module, "minor", temp, 8);
00545 int minor_in = atoi(temp);
00546 if(major < major_in){
00547 output_warning("XML::read_module_prop(): The input file was built using an older major version of the module.");
00548 return NULL;
00549 }
00550 if(minor == minor_in){
00551 return NULL;
00552 } else if(minor > minor_in){
00553 output_warning("XML::read_module_prop(): The input file was built using an older minor version of the module.");
00554 } else if(minor < minor_in){
00555 output_warning("XML::read_module_prop(): The file was built using a newer minor version of the module loading it!");
00556 }
00557 }
00558 }
00559 } else if(strcmp(buffer, "clock") == 0){
00560 stack_state = CLOCK_STATE;
00561 } else {
00562 sprintf(errmsg, "Unrecognized keyword in start_element_load(%s)", buffer);
00563 return errmsg;
00564 }
00565 return NULL;
00566 }
00567
00568 char *gld_loadHndl::start_element_module_build_object(const Attributes &attributes){
00569 static wchar_t str_id[3],
00570 str_name[5],
00571 str_type[5];
00572 static size_t str_id_len = mbstowcs(str_id, "id", 3),
00573 str_name_len = mbstowcs(str_name, "name", 5),
00574 str_type_len = mbstowcs(str_type, "type", 5);
00575 char object_type[64],
00576 object_id[64],
00577 object_name[64];
00578 char *temp = NULL;
00579 char *retval = NULL;
00580 int first = -1,
00581 last = -1;
00582 if(attributes.getIndex((const XMLCh *) str_type) < 0){
00583 sprintf(errmsg, "object tag without a type in start_element_module_build_object()");
00584 return errmsg;
00585 } else {
00586 wcstombs(object_type, (const wchar_t *)attributes.getValue((const XMLCh *) str_type), 64);
00587 oclass = class_get_class_from_classname_in_module(object_type, module);
00588 if(oclass == NULL){
00589 sprintf(errmsg, "Class \"%s\" for module \"%s\"is not recognized in start_element_module_build_object()", object_type, module->name);
00590 return errmsg;
00591 } else {
00592 ;
00593 }
00594 }
00595 if(attributes.getIndex((const XMLCh *) str_id) < 0){
00596
00597 last = first = -1;
00598 } else {
00599 wcstombs(object_id, (wchar_t *)attributes.getValue((const XMLCh *) str_id), 64);
00600 temp = strchr(object_id, '.');
00601 if(temp == NULL){
00602 first = strtol(object_id, NULL, 10);
00603 if(first < 0){
00604 sprintf(errmsg, "Invalid object id of %i in start_element_module_build_object()", first);
00605 return errmsg;
00606 } else {
00607 last = first;
00608 }
00609 } else {
00610 if(temp[0] == temp[1]){
00611 if(temp == object_id){
00612 last = strtol(object_id+2, NULL, 10);
00613 if(last < 1){
00614 sprintf(errmsg, "Invalid object id of %i in start_element_module_build_object()", first);
00615 return errmsg;
00616 } else {
00617 first = -1;
00618 }
00619 } else {
00620 *temp = 0;
00621 first = strtol(object_id, NULL, 10);
00622 last = strtol(temp+2, NULL, 10);
00623 *temp = '.';
00624 if(first < 0){
00625 output_error("XML_Load: first ID < 0 !");
00626 sprintf(errmsg, "Invalid object id of %i in start_element_module_build_object()", first);
00627 return errmsg;
00628 }
00629 if(last < 1){
00630 output_error("XML_Load: last ID < 1 !");
00631 sprintf(errmsg, "Invalid object id of %i in start_element_module_build_object()", first);
00632 return errmsg;
00633 }
00634 if(first >= last){
00635 output_error("XML_Load: first id >= last id!");
00636 sprintf(errmsg, "Invalid object id of %i in start_element_module_build_object()", first);
00637 return errmsg;
00638 }
00639 }
00640 } else {
00641 sprintf(errmsg, "Invalid ID format in start_element_module_build_object()");
00642 return errmsg;
00643 }
00644 }
00645 }
00646 if((retval = build_object_vect(first, last)) != 0){
00647 sprintf(errmsg, "Unable to create objects in start_element_module_build_object()");
00648 return errmsg;
00649 } else {
00650 ;
00651 }
00652 if(attributes.getIndex((const XMLCh *) str_name) < 0){
00653 strcpy(object_name, "(none)");
00654 } else {
00655 wcstombs(object_name, (wchar_t *)attributes.getValue((const XMLCh *) str_name), 64);
00656 object_set_name(obj, object_name);
00657 }
00658
00659 stack_state = OBJECT_STATE;
00660 return NULL;
00661 }
00662
00663 char *gld_loadHndl::start_element_module(char *buffer, size_t len, const Attributes& attributes){
00664
00665 if(0 == strcmp(buffer, "object")){
00666 strcpy(propname, "object");
00667 return start_element_module_build_object(attributes);
00668 }
00669
00670
00671
00672
00673
00674 else if(0 == strcmp(buffer, "properties")){
00675 strcpy(propname, buffer);
00676 stack_state = MODULE_PROP;
00677 } else {
00678 sprintf(errmsg, "Unrecognized keyword in start_element_module(%s)", buffer);
00679 return errmsg;
00680 }
00681 return NULL;
00682 }
00683
00684 char *gld_loadHndl::start_element_module_prop(char *buffer, size_t len, const Attributes& attributes){
00685 char pname[323];
00686 sprintf(pname, "%s::%s", this->module->name, buffer);
00687 if(global_find(pname)){
00688 strcpy(propname, pname);
00689 } else {
00690 output_warning("XML: start_element_module_prop: property \"\" not found, initializing");
00691 strcpy(propname, pname);
00692 }
00693 return NULL;
00694 }
00695
00696 char *gld_loadHndl::start_element_object(char *buffer, size_t len, const Attributes& attributes){
00697
00698 if(0 == strcmp(buffer, "parent")){
00699 strcpy(propname, "parent");
00700 stack_state = OBJECT_PROP;
00701 } else if(0 == strcmp(buffer, "root")){
00702 strcpy(propname, "root");
00703 stack_state = OBJECT_PROP;
00704 } else if(0 == strcmp(buffer, "rank")){
00705 strcpy(propname, "rank");
00706 stack_state = OBJECT_PROP;
00707 } else if(0 == strcmp(buffer, "clock")){
00708 strcpy(propname, "clock");
00709 stack_state = OBJECT_PROP;
00710 } else if(0 == strcmp(buffer, "latitude")){
00711 strcpy(propname, "latitude");
00712 stack_state = OBJECT_PROP;
00713 } else if(0 == strcmp(buffer, "longitude")){
00714 strcpy(propname, "longitude");
00715 stack_state = OBJECT_PROP;
00716 } else if(0 == strcmp(buffer, "in")){
00717 strcpy(propname, "in");
00718 stack_state = OBJECT_PROP;
00719 } else if(0 == strcmp(buffer, "out")){
00720 strcpy(propname, "out");
00721 stack_state = OBJECT_PROP;
00722 } else if(0 == strcmp(buffer, "library")){
00723 strcpy(propname, "library");
00724 stack_state = OBJECT_PROP;
00725 }
00726 else if((prop = class_find_property(oclass, buffer)) != NULL){
00727 strcpy(propname, buffer);
00728 stack_state = OBJECT_PROP;
00729 } else {
00730 sprintf(errmsg, "Unrecognized property in start_element_object(%s)", buffer);
00731 return errmsg;
00732 }
00733 prop = class_find_property(obj->oclass, buffer);
00734 return NULL;
00735 }
00736
00737 char *gld_loadHndl::start_element_object_prop(char *buffer, size_t len, const Attributes& attributes){
00738
00739 return NULL;
00740 }
00741
00742 char *gld_loadHndl::start_element_global(char *buffer, size_t len, const Attributes& attributes){
00743
00744 if(0 == strcmp(buffer, "version_major")){
00745 strcpy(propname, "version_major");
00746 stack_state = GLOBAL_PROP;
00747 } else if(0 == strcmp(buffer, "version_minor")){
00748 strcpy(propname, "version_minor");
00749 stack_state = GLOBAL_PROP;
00750 } else if(0 == strcmp(buffer, "savefilename")){
00751 strcpy(propname, "savefilename");
00752 stack_state = GLOBAL_PROP;
00753 } else if(0 == strcmp(buffer, "class_count")){
00754 strcpy(propname, "class_count");
00755 stack_state = GLOBAL_PROP;
00756 } else if(0 == strcmp(buffer, "object_count")){
00757 strcpy(propname, "object_count");
00758 stack_state = GLOBAL_PROP;
00759 } else if(0 == strcmp(buffer, "property")){
00760 strcpy(propname, "property");
00761 stack_state = GLOBAL_PROP;
00762 }
00763
00764 return NULL;
00765 }
00766
00767 char *gld_loadHndl::start_element_global_prop(char *buffer, size_t len, const Attributes& attributes){
00768
00769 return NULL;
00770 }
00771
00772 char *gld_loadHndl::start_element_clock(char *buffer, size_t len, const Attributes& attributes){
00773 if(strcmp(buffer, "tick") == 0){
00774 stack_state = CLOCK_PROP;
00775 strcpy(propname, "tick");
00776 } else if(strcmp(buffer, "timezone") == 0){
00777 stack_state = CLOCK_PROP;
00778 strcpy(propname, "timezone");
00779 } else if(strcmp(buffer, "timestamp") == 0){
00780 stack_state = CLOCK_PROP;
00781 strcpy(propname, "timestamp");
00782 } else {
00783 sprintf(errmsg, "Unrecognized keyword in start_element_clock(%s)", buffer);
00784 return errmsg;
00785 }
00786 return NULL;
00787 }
00788
00789 char *gld_loadHndl::start_element_clock_prop(char *buffer, size_t len, const Attributes& attributes){
00790 return NULL;
00791 }
00792
00793 #define ADD_KEYWORD(A) stack_ptr = new gldStack(); \
00794 strcpy(stack_ptr->object_type, "module"); \
00795 strcpy(stack_ptr->keyword, (A)); \
00796
00797 void gld_loadHndl::startElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname,
00798 const Attributes& attributes){
00799 char buffer[128];
00800 char *temp = NULL;
00801 unsigned int i = 0;
00802 size_t len = 0;
00803 char *retval = 0;
00804 gldStack *currStack = NULL;
00805 wchar_t str_id[3],
00806 str_name[5],
00807 str_type[5];
00808
00809 mbstowcs(str_id, "id", 3);
00810 mbstowcs(str_name, "name", 5);
00811 mbstowcs(str_type, "type", 5);
00812
00813 if((len = wcslen((const wchar_t *)qname)) < 1){
00814 output_error("startElement: Unable to parse element tag length!");
00815 load_state = 0;
00816 return;
00817 }
00818 if(wcstombs(buffer, (const wchar_t *)qname, 128) < 1){
00819 output_error("startElement: Unable to convert element tag name from wchar to char!");
00820 load_state = 0;
00821 return;
00822 }
00823 switch(this->stack_state){
00824 case EMPTY:
00825 retval = start_element_empty(buffer, len, attributes);
00826 break;
00827 case LOAD:
00828 retval = start_element_load(buffer, len, attributes);
00829 break;
00830 case MODULE_STATE:
00831 retval = start_element_module(buffer, len, attributes);
00832 break;
00833 case MODULE_PROP:
00834 retval = start_element_module_prop(buffer, len, attributes);
00835 break;
00836 case OBJECT_STATE:
00837 retval = start_element_object(buffer, len, attributes);
00838 break;
00839 case OBJECT_PROP:
00840 retval = start_element_object_prop(buffer, len, attributes);
00841 break;
00842 case GLOBAL_STATE:
00843 retval = start_element_global(buffer, len, attributes);
00844 break;
00845 case GLOBAL_PROP:
00846 retval = start_element_global_prop(buffer, len, attributes);
00847 break;
00848 case CLOCK_STATE:
00849 retval = start_element_clock(buffer, len, attributes);
00850 break;
00851 case CLOCK_PROP:
00852 retval = start_element_clock_prop(buffer, len, attributes);
00853 break;
00854 }
00855 if(retval != NULL){
00856 char tbuff[256];
00857 wchar_t wbuff[256];
00858 SAXParseException *e = NULL;
00859 sprintf(tbuff, "Error in start_element with tag \"%s\": %s", buffer, retval);
00860 mbstowcs(wbuff, tbuff, 1024);
00861 e = new SAXParseException((const XMLCh *)wbuff, *(this->locator));
00862 error(*e);
00863 delete e;
00864 }
00865 }
00866
00867 #undef ADD_KEYWORD
00868
00874 char *gld_loadHndl::build_object_vect(int start, int end){
00875 int count = 0, i = 0;
00876 obj_vect.clear();
00877 if(start == end){
00878 if((*oclass->create)(&obj, NULL) == 0){
00879
00880 sprintf(errmsg, "Unable to create a lone object with ID = %i in build_object_vect(%i, %i)", start, start, end);
00881 load_state = false;
00882 return errmsg;
00883 }
00884 if(start != -1){
00885 if(load_set_index(obj, (OBJECTNUM)end) == 0){
00886 sprintf(errmsg, "Unable to index an item in build_object_vect(%i, %i)", start, end);
00887 load_state = false;
00888 return errmsg;
00889 } else {
00890 ;
00891 }
00892 }
00893
00894 return NULL;
00895 }
00896 if(start == -1){
00897 count = end;
00898 } else {
00899 if(last > first){
00900 count = last - first + 1;
00901 } else {
00902 sprintf(errmsg, "last < first, aborting build_object_vect(%i, %i)", start, end);
00903 load_state = false;
00904 return errmsg;
00905 }
00906 }
00907 obj_vect.reserve(count);
00908 for(i = (start == -1) ? 0 : start; i <= last; ++i){
00909 if((*oclass->create)((obj_vect[i]), NULL) != 0){
00910 if(start != -1){
00911 if(load_set_index(obj_vect[i], (OBJECTNUM)i) == 0){
00912 sprintf(errmsg, "Unable to index a batch item in build_object_vect(%i, %i)", start, end);
00913 load_state = false;
00914
00915 return errmsg;
00916 }
00917 }
00918 } else {
00919 sprintf(errmsg, "Unable to create an object in build_object_vect(%i, %i)", start, end);
00920 load_state = false;
00921
00922 return errmsg;
00923 }
00924 }
00925 return NULL;
00926 }
00927
00928 #undef _CRT_SECURE_NO_DEPRECATE
00929
00930