00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <mxml.h>
00036 #include <string.h>
00037 #include <stdlib.h>
00038 #define _XOPEN_SOURCE 600
00039 #include <stdlib.h>
00040 #ifndef _WIN32
00041 #include "config.h"
00042 #else
00043 #include "winconfig.h"
00044 #endif
00045 #include "include/interpreter_variable_data.h"
00046 #include "include/message.h"
00047 #include "include/xml_parser.h"
00048 #include "include/xml_helper.h"
00049
00050
00051
00052 error_code_t agent_xml_parse(agent_p agent)
00053 {
00054 xml_parser_t xml_parser;
00055 xml_parser.root = agent->datastate->xml_agent_root;
00056 xml_parser.node = xml_parser.root;
00057 agent_xml_parse__mobile_agent(agent, &xml_parser);
00058 return MC_SUCCESS;
00059 }
00060
00061
00062
00063 error_code_t
00064 agent_xml_parse__mobile_agent
00065 (
00066 agent_p agent,
00067 xml_parser_p xml_parser
00068 )
00069 {
00070
00071 if (
00072 strcmp(
00073 (const char*)xml_get_element_name(xml_parser->node),
00074 "MOBILE_AGENT"
00075 )
00076 )
00077 {
00078 return MC_ERR_PARSE;
00079 }
00080
00081 xml_parser->node = (const mxml_node_t*)xml_get_child(
00082 xml_parser->node,
00083 "AGENT_DATA",
00084 1);
00085
00086 return agent_xml_parse__agent_data(agent, xml_parser);
00087 }
00088
00089
00090
00091 error_code_t
00092 agent_xml_parse__agent_data
00093 (
00094 agent_p agent,
00095 xml_parser_p xml_parser
00096 )
00097 {
00098 const mxml_node_t* agent_data_node;
00099 error_code_t err_code;
00100
00101 if (xml_parser->node == NULL) {
00102 return MC_ERR_PARSE;
00103 }
00104
00105 agent_data_node = xml_parser->node;
00106
00107 xml_parser->node = xml_get_child(
00108 agent_data_node,
00109 "NAME",
00110 1
00111 );
00112 if ( (err_code = agent_xml_parse__name(agent, xml_parser)) ) {
00113 return err_code;
00114 }
00115
00116 xml_parser->node = xml_get_child(
00117 agent_data_node,
00118 "OWNER",
00119 1
00120 );
00121 if ( (err_code = agent_xml_parse__owner(agent, xml_parser)) ) {
00122 return err_code;
00123 }
00124
00125 xml_parser->node = xml_get_child(
00126 agent_data_node,
00127 "HOME",
00128 1
00129 );
00130 if ( (err_code = agent_xml_parse__home(agent, xml_parser)) ) {
00131 return err_code;
00132 }
00133
00134 xml_parser->node = xml_get_child(
00135 agent_data_node,
00136 "TASKS",
00137 1
00138 );
00139 if ( (err_code = agent_xml_parse__tasks(agent, xml_parser)) ) {
00140 return err_code;
00141 }
00142 return MC_SUCCESS;
00143 }
00144
00145
00146
00147 error_code_t
00148 agent_xml_parse__name(agent_p agent, xml_parser_p xml_parser)
00149 {
00150 char* text;
00151 const mxml_node_t* name_node;
00152 if (xml_parser->node == NULL) {
00153 return MC_ERR_PARSE;
00154 }
00155 name_node = xml_parser->node;
00156
00157 text = xml_get_text( name_node );
00158 CHECK_NULL(text, return MC_ERR_PARSE;);
00159
00160 agent->name = (char*)malloc(
00161 sizeof(char)*(strlen(text)+1)
00162 );
00163 strcpy(
00164 agent->name,
00165 text
00166 );
00167 free(text);
00168 return MC_SUCCESS;
00169 }
00170
00171
00172
00173 error_code_t
00174 agent_xml_parse__owner(agent_p agent, xml_parser_p xml_parser)
00175 {
00176 char *text;
00177 const mxml_node_t* owner_node;
00178 if (xml_parser->node == NULL) {
00179
00180 agent->owner = NULL;
00181 return MC_SUCCESS;
00182 }
00183 owner_node = xml_parser->node;
00184
00185 text = xml_get_text( owner_node );
00186 CHECK_NULL(text, agent->owner=NULL;return MC_SUCCESS;);
00187 agent->owner = (char*)malloc(
00188 sizeof(char)*(strlen(text)+1)
00189 );
00190 strcpy(
00191 agent->owner,
00192 text
00193 );
00194 free(text);
00195 return MC_SUCCESS;
00196 }
00197
00198
00199
00200 error_code_t
00201 agent_xml_parse__home(agent_p agent, xml_parser_p xml_parser)
00202 {
00203 char *text;
00204 const mxml_node_t* home_node;
00205 if (xml_parser->node == NULL) {
00206
00207 agent->home= NULL;
00208 return MC_SUCCESS;
00209 }
00210 home_node = xml_parser->node;
00211 text = xml_get_text( home_node );
00212 CHECK_NULL(text, agent->home=NULL;return MC_SUCCESS;);
00213 agent->home = (char*)malloc(
00214 sizeof(char)*(strlen(text)+1)
00215 );
00216 strcpy(
00217 agent->home,
00218 text
00219 );
00220 free(text);
00221 return MC_SUCCESS;
00222 }
00223
00224
00225
00226 error_code_t
00227 agent_xml_parse__tasks(agent_p agent, xml_parser_p xml_parser)
00228 {
00229 int i;
00230 int code_num=0;
00231 int err_code;
00232 const char* attribute;
00233 const mxml_node_t* tasks_node;
00234 char buf[20];
00235
00236 tasks_node = xml_parser->node;
00237
00238
00239 attribute = mxmlElementGetAttr(
00240 (mxml_node_t*)tasks_node,
00241 "task"
00242 );
00243 if (attribute == NULL) {
00244 agent->datastate->number_of_tasks = 1;
00245 } else {
00246 agent->datastate->number_of_tasks = atoi((char*)attribute);
00247 }
00248 agent->datastate->tasks = (agent_task_p*)malloc(
00249 sizeof(agent_task_p) * agent->datastate->number_of_tasks
00250 );
00251
00252
00253 attribute = mxmlElementGetAttr(
00254 (mxml_node_t*)tasks_node,
00255 "num"
00256 );
00257 if (attribute == NULL) {
00258 agent->datastate->task_progress = 0;
00259 } else {
00260 agent->datastate->task_progress = atoi((char*)attribute);
00261 }
00262
00263
00264 for(i = 0; i<agent->datastate->number_of_tasks; i++) {
00265 agent->datastate->tasks[i] = agent_task_New();
00266 }
00267
00268
00269 for(i = 0; i < agent->datastate->number_of_tasks; i++) {
00270 sprintf(buf, "%d", i);
00271 xml_parser->node = mxmlFindElement(
00272 tasks_node,
00273 tasks_node,
00274 "TASK",
00275 "num",
00276 buf,
00277 MXML_DESCEND_FIRST );
00278 if(xml_parser->node == NULL) {
00279 fprintf(stderr,
00280 "ERROR: Could not find task num %d! %s:%d\n",
00281 i, __FILE__, __LINE__);
00282 return MC_ERR_PARSE;
00283 }
00284 agent_xml_parse__task(agent, xml_parser, i);
00285 }
00286
00287
00288
00289
00290 xml_parser->node = mxmlFindElement
00291 (
00292 tasks_node,
00293 tasks_node,
00294 "AGENT_CODE",
00295 NULL,
00296 NULL,
00297 MXML_DESCEND
00298 );
00299
00300
00301
00302 while(xml_parser->node != NULL) {
00303 code_num++;
00304 xml_parser->node = mxmlFindElement
00305 (
00306 xml_parser->node,
00307 tasks_node,
00308 "AGENT_CODE",
00309 NULL,
00310 NULL,
00311 MXML_NO_DESCEND
00312 );
00313 }
00314
00315
00316 agent->datastate->agent_code_ids = (char**)malloc
00317 (
00318 (code_num+1) * sizeof(char*)
00319 );
00320 agent->datastate->agent_codes = (char**)malloc
00321 (
00322 (code_num+1) * sizeof(char*)
00323 );
00324
00325 agent->datastate->agent_code_ids[code_num] = NULL;
00326 agent->datastate->agent_codes[code_num] = NULL;
00327
00328
00329 xml_parser->node = mxmlFindElement
00330 (
00331 tasks_node,
00332 tasks_node,
00333 "AGENT_CODE",
00334 NULL,
00335 NULL,
00336 MXML_DESCEND
00337 );
00338 i = 0;
00339 while(xml_parser->node != NULL) {
00340 err_code = agent_xml_parse__agent_code(agent, i, xml_parser);
00341 i++;
00342 xml_parser->node = mxmlFindElement
00343 (
00344 xml_parser->node,
00345 tasks_node,
00346 "AGENT_CODE",
00347 NULL,
00348 NULL,
00349 MXML_NO_DESCEND
00350 );
00351 }
00352
00353 if (agent->datastate->agent_code == NULL) {
00354
00355 fprintf(stderr, "Parse error: Agent code not found. %s:%d\n", __FILE__, __LINE__);
00356 return MC_ERR_PARSE;
00357 }
00358
00359 return 0;
00360 }
00361
00362
00363
00364 error_code_t
00365 agent_xml_parse__task(agent_p agent, xml_parser_p xml_parser, int index)
00366 {
00367 const char* attribute;
00368 const mxml_node_t* task_node;
00369 error_code_t err_code = MC_SUCCESS;
00370 CHECK_NULL(xml_parser->node, return MC_ERR_PARSE;);
00371 task_node = xml_parser->node;
00372
00373
00374 xml_parser->node = mxmlFindElement(
00375 task_node,
00376 task_node,
00377 "DATA",
00378 NULL,
00379 NULL,
00380 MXML_DESCEND_FIRST);
00381 while(xml_parser->node != NULL) {
00382
00383 if ((err_code = agent_xml_parse__data(agent, xml_parser, index)))
00384 {
00385 return err_code;
00386 }
00387 xml_parser->node = mxmlFindElement(
00388 xml_parser->node,
00389 task_node,
00390 "DATA",
00391 NULL,
00392 NULL,
00393 MXML_NO_DESCEND );
00394 }
00395
00396
00397 attribute = mxmlElementGetAttr(
00398 (mxml_node_t*)task_node,
00399 "code_id");
00400 if (attribute != NULL) {
00401 agent->datastate->tasks[index]->code_id = malloc
00402 (
00403 sizeof(char) *
00404 (strlen(attribute) + 1)
00405 );
00406 strcpy(agent->datastate->tasks[index]->code_id, attribute);
00407 } else {
00408 agent->datastate->tasks[index]->code_id = NULL;
00409 }
00410
00411
00412 attribute = mxmlElementGetAttr(
00413 (mxml_node_t*)task_node,
00414 "num"
00415 );
00416 CHECK_NULL(attribute, return MC_ERR_PARSE;);
00417
00418
00419 attribute = mxmlElementGetAttr(
00420 (mxml_node_t*)task_node,
00421 "complete"
00422 );
00423 CHECK_NULL(attribute, return MC_ERR_PARSE;);
00424 agent->datastate->tasks[index]->task_completed =
00425 atoi((char*)attribute);
00426
00427
00428 attribute = mxmlElementGetAttr(
00429 (mxml_node_t*)task_node,
00430 "server"
00431 );
00432 CHECK_NULL(attribute, return MC_ERR_PARSE;);
00433 agent->datastate->tasks[index]->server_name =
00434 (char*)malloc(sizeof(char) * (strlen(attribute)+1) );
00435 strcpy(
00436 agent->datastate->tasks[index]->server_name,
00437 attribute
00438 );
00439
00440
00441 attribute = mxmlElementGetAttr(
00442 (mxml_node_t*)task_node,
00443 "return" );
00444 if (attribute == NULL) {
00445 agent->datastate->tasks[index]->var_name = strdup("no-return");
00446 } else {
00447 agent->datastate->tasks[index]->var_name = strdup(attribute);
00448 }
00449 CHECK_NULL(agent->datastate->tasks[index]->var_name, exit(1););
00450
00451 return err_code;
00452 }
00453
00454
00455
00456 error_code_t
00457 agent_xml_parse__data(agent_p agent, xml_parser_p xml_parser, int index)
00458 {
00459 const char* attribute;
00460 const char* attribute2;
00461 const mxml_node_t *data_node;
00462 int data_type_size;
00463 interpreter_variable_data_t* interp_variable;
00464 if (xml_parser->node == NULL) {
00465 return MC_ERR_PARSE;
00466 }
00467 if (strcmp(
00468 "DATA",
00469 xml_get_element_name(xml_parser->node) )
00470 )
00471 {
00472 return MC_ERR_PARSE;
00473 }
00474 data_node = xml_parser->node;
00475
00476
00477 attribute = mxmlElementGetAttr(
00478 data_node->parent,
00479 "return" );
00480 attribute2 = mxmlElementGetAttr(
00481 data_node,
00482 "name" );
00483 if (attribute != NULL && !strcmp(attribute, attribute2)) {
00484
00485
00486
00487
00488
00489 agent->datastate->tasks[index]->agent_return_data =
00490 interpreter_variable_data_New();
00491 interp_variable = agent->datastate->tasks[index]->agent_return_data;
00492 } else {
00493 interp_variable = interpreter_variable_data_New();
00494 agent_variable_list_Add(
00495 agent->datastate->tasks[index]->agent_variable_list,
00496 interp_variable );
00497 }
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514 attribute = mxmlElementGetAttr(
00515 (mxml_node_t*)xml_parser->node,
00516 "dim"
00517 );
00518 if (attribute != NULL) {
00519 interp_variable->array_dim =
00520 atoi((char*)attribute);
00521 } else {
00522 interp_variable->array_dim =
00523 0;
00524 }
00525
00526
00527 attribute = mxmlElementGetAttr(
00528 (mxml_node_t*)xml_parser->node,
00529 "name"
00530 );
00531 if (attribute != NULL) {
00532 interp_variable->name =
00533 (char*)malloc(sizeof(char)*(strlen(attribute)+1));
00534 strcpy(
00535 interp_variable->name,
00536 attribute
00537 );
00538 }
00539
00540
00541 attribute = mxmlElementGetAttr(
00542 (mxml_node_t*)data_node,
00543 "persistent"
00544 );
00545 if (attribute != NULL) {
00546 agent->datastate->tasks[index]->persistent =
00547 atoi((char*)attribute);
00548 } else {
00549 agent->datastate->tasks[index]->persistent = 0;
00550 }
00551
00552
00553 attribute = mxmlElementGetAttr(
00554 (mxml_node_t*)data_node,
00555 "type"
00556 );
00557 if (attribute != NULL) {
00558 CH_STRING_DATATYPE(
00559 attribute,
00560 interp_variable->data_type
00561 );
00562 CH_DATATYPE_SIZE(
00563 interp_variable->data_type,
00564 data_type_size
00565 );
00566 } else {
00567 interp_variable->data_type =
00568 CH_UNDEFINETYPE;
00569 data_type_size = 0;
00570 }
00571
00572 if (interp_variable->array_dim == 0) {
00573
00574 attribute = mxmlElementGetAttr(
00575 (mxml_node_t*)data_node,
00576 "value" );
00577 if (attribute != NULL && data_type_size != 0) {
00578 interp_variable->data =
00579 malloc(data_type_size);
00580 CH_DATATYPE_STR_TO_VAL(
00581 interp_variable->data_type,
00582 attribute,
00583 interp_variable->data
00584 );
00585 }
00586 } else {
00587
00588 xml_parser->node = xml_get_child(
00589 xml_parser->node,
00590 "ROW",
00591 1
00592 );
00593 agent_xml_parse__row(interp_variable, xml_parser, index);
00594 }
00595 xml_parser->node = data_node;
00596 return MC_SUCCESS;
00597 }
00598
00599
00600
00601 error_code_t
00602 agent_xml_parse__row(interpreter_variable_data_t* interp_variable, xml_parser_p xml_parser, int index)
00603 {
00604 int j;
00605 int data_type_size;
00606 int tmp;
00607 int num_elements;
00608 const mxml_node_t* row_node;
00609
00610 if (xml_parser->node == NULL) {
00611 return MC_SUCCESS;
00612 }
00613
00614 if (strcmp(
00615 xml_get_element_name(xml_parser->node),
00616 "ROW" )
00617 )
00618 {
00619 return MC_SUCCESS;
00620 }
00621 row_node = xml_parser->node;
00622
00623
00624
00625 if (interp_variable->array_dim != 0) {
00626 interp_variable->array_extent = (int*)
00627 malloc
00628 (
00629 sizeof(int) *
00630 interp_variable->array_dim
00631 );
00632 tmp = 0;
00633 agent_xml_parse__fill_row_data(NULL,
00634 interp_variable->data_type,
00635 interp_variable->array_extent,
00636 row_node,
00637 &tmp);
00638 num_elements = 1;
00639 for (j = 0; j<interp_variable->array_dim; j++) {
00640 num_elements *= interp_variable->array_extent[j];
00641 }
00642
00643
00644 CH_DATATYPE_SIZE
00645 (
00646 interp_variable->data_type,
00647 data_type_size
00648 );
00649 interp_variable->data =
00650 malloc(num_elements * data_type_size);
00651
00652
00653 tmp = 0;
00654 agent_xml_parse__fill_row_data(
00655 interp_variable->data,
00656 interp_variable->data_type,
00657 interp_variable->array_extent,
00658 row_node,
00659 &tmp );
00660 } else {
00661 return MC_SUCCESS;
00662 }
00663 return MC_SUCCESS;
00664 }
00665
00666 void agent_xml_parse__fill_row_data(
00667 void *data,
00668 ChType_t type,
00669 int *extent,
00670 const mxml_node_t* node,
00671 int *index)
00672 {
00673 mxml_node_t* tmp_node;
00674 int i=0;
00675 char *buf;
00676 char *tmp;
00677 #ifndef _WIN32
00678 char *saveptr;
00679 #endif
00680 int datasize;
00681
00682
00683
00684 (*extent) = 0;
00685 if (node->child->type == MXML_TEXT) {
00686 node = node->child;
00687
00688 CH_DATATYPE_SIZE(type, datasize);
00689 buf = (char*)malloc(
00690 sizeof(char) +
00691 (strlen(node->value.text.string) + 1));
00692 strcpy(buf, node->value.text.string);
00693
00694 #ifndef _WIN32
00695 tmp = strtok_r(buf, ",", &saveptr);
00696 #else
00697 tmp = strtok(buf, ",");
00698 #endif
00699 while ( tmp != NULL) {
00700 switch(type) {
00701 case CH_CHARTYPE:
00702 if (data != NULL)
00703 ((char*)data)[*index] = *(char*)tmp;
00704 (*index)++;
00705 break;
00706 case CH_INTTYPE:
00707 if (data != NULL)
00708 ((int*)data)[*index] = strtol(tmp, NULL, 0);
00709 (*index)++;
00710 break;
00711 case CH_UINTTYPE:
00712 if (data != NULL)
00713 ((unsigned int*)data)[*index] = strtoul(tmp, NULL, 0);
00714 (*index)++;
00715 break;
00716 case CH_SHORTTYPE:
00717 if (data != NULL)
00718 ((short*)data)[*index] = (short)strtol(tmp, NULL, 0);
00719 (*index)++;
00720 break;
00721 case CH_USHORTTYPE:
00722 if (data != NULL)
00723 ((unsigned short*)data)[*index] = (unsigned short)strtol(tmp, NULL, 0);
00724 (*index)++;
00725 break;
00726 case CH_FLOATTYPE:
00727 if (data != NULL)
00728 #ifndef _WIN32
00729 ((float*)data)[*index] = strtof(tmp, NULL);
00730 #else
00731 ((float*)data)[*index] = (float)strtod(tmp, NULL);
00732 #endif
00733 (*index)++;
00734 break;
00735 case CH_DOUBLETYPE:
00736 if (data != NULL)
00737 ((double*)data)[*index] = strtod(tmp, NULL);
00738 (*index)++;
00739 break;
00740 default:
00741 fprintf(stderr,
00742 "Unsupported data type: %d %s:%d\n",
00743 type, __FILE__, __LINE__);
00744 }
00745 #ifndef _WIN32
00746 tmp = strtok_r(NULL, ",", &saveptr);
00747 #else
00748 tmp = strtok(NULL, ",");
00749 #endif
00750 (*extent)++;
00751 }
00752 free(buf);
00753 } else if (node->type == MXML_ELEMENT) {
00754 buf = (char*)malloc(sizeof(char)*10);
00755 buf[0] = '\0';
00756 sprintf(buf, "%d", i);
00757 tmp_node = mxmlFindElement(
00758 (mxml_node_t*)node,
00759 (mxml_node_t*)node,
00760 "ROW",
00761 "index",
00762 buf,
00763 MXML_DESCEND_FIRST);
00764 while (tmp_node != NULL) {
00765 (*extent)++;
00766 agent_xml_parse__fill_row_data(data, type,(extent+1), tmp_node, index);
00767 i++;
00768 buf[0] = '\0';
00769 sprintf(buf, "%d", i);
00770 tmp_node = mxmlFindElement(
00771 (mxml_node_t*)node,
00772 (mxml_node_t*)node,
00773 "ROW",
00774 "index",
00775 buf,
00776 MXML_DESCEND_FIRST);
00777 }
00778 free(buf);
00779 }
00780 }
00781
00782
00783
00784 error_code_t
00785 agent_xml_parse__agent_code(agent_p agent, int index, xml_parser_p xml_parser)
00786 {
00787 char *attribute;
00788 int cur_task = agent->datastate->task_progress;
00789 if( cur_task == agent->datastate->number_of_tasks )
00790 cur_task--;
00791 agent->datastate->agent_codes[index] =
00792 xml_get_text
00793 (
00794 xml_parser->node
00795 );
00796
00797
00798 attribute = mxmlElementGetAttr
00799 (
00800 (mxml_node_t*)xml_parser->node,
00801 "id"
00802 );
00803 if (attribute) {
00804 agent->datastate->agent_code_ids[index] = malloc
00805 (
00806 sizeof(char) *
00807 (strlen(attribute) + 1)
00808 );
00809 strcpy(agent->datastate->agent_code_ids[index], attribute);
00810 } else {
00811 agent->datastate->agent_code_ids[index] = malloc(sizeof(char));
00812 *(agent->datastate->agent_code_ids[index]) = '\0';
00813 }
00814 if (agent->datastate->tasks[cur_task]->code_id && attribute != NULL) {
00815 if (!strcmp(attribute, agent->datastate->tasks[cur_task]->code_id)) {
00816 agent->datastate->agent_code = agent->datastate->agent_codes[index];
00817 }
00818 } else {
00819 agent->datastate->agent_code = agent->datastate->agent_codes[0];
00820 }
00821 return MC_SUCCESS;
00822 }
00823
00824
00825 error_code_t
00826 agent_return_xml_parse(agent_p agent)
00827 {
00828 xml_parser_t xml_parser;
00829 xml_parser.root = agent->datastate->xml_root;
00830 xml_parser.node = (const mxml_node_t*)xml_get_child(
00831 xml_parser.root,
00832 "NAME",
00833 1);
00834
00835 agent_xml_parse__name(agent, &xml_parser);
00836
00837 xml_parser.node = (const mxml_node_t*)xml_get_child(
00838 xml_parser.root,
00839 "OWNER",
00840 1);
00841
00842 agent_xml_parse__owner(agent, &xml_parser);
00843
00844 xml_parser.node = (const mxml_node_t*)xml_get_child(
00845 xml_parser.root,
00846 "HOME",
00847 1);
00848
00849 agent_xml_parse__home(agent, &xml_parser);
00850
00851 xml_parser.node = (const mxml_node_t*)xml_get_child(
00852 xml_parser.root,
00853 "TASK",
00854 1);
00855
00856 agent_xml_parse__tasks(agent, &xml_parser);
00857 return MC_SUCCESS;
00858 }
00859
00860 error_code_t
00861 message_xml_parse(message_p message)
00862 {
00863 int err_code;
00864 xml_parser_p xml_parser;
00865 xml_parser = (xml_parser_p)malloc(sizeof(xml_parser_t));
00866 xml_parser->root = message->xml_root;
00867 xml_parser->node = mxmlFindElement
00868 (
00869 (mxml_node_t*)xml_parser->root,
00870 (mxml_node_t*)xml_parser->root,
00871 "MOBILEC_MESSAGE",
00872 NULL,
00873 NULL,
00874 MXML_NO_DESCEND
00875 );
00876 if (xml_parser->node == NULL) {
00877 xml_parser->node = mxmlFindElement
00878 (
00879 (mxml_node_t*)xml_parser->root,
00880 (mxml_node_t*)xml_parser->root,
00881 "MOBILEC_MESSAGE",
00882 NULL,
00883 NULL,
00884 MXML_DESCEND
00885 );
00886 }
00887 if (xml_parser->node == NULL) {
00888 err_code = MC_ERR_PARSE;
00889 goto cleanup;
00890 }
00891 xml_parser->root = xml_parser->node;
00892 if(
00893 strcmp(
00894 (const char*)xml_get_element_name(xml_parser->node),
00895 "MOBILEC_MESSAGE"
00896 )
00897 )
00898 {
00899 fprintf(stderr, "Parse error. %s:%d\n", __FILE__, __LINE__);
00900 err_code = MC_ERR_PARSE;
00901 goto cleanup;
00902 }
00903 xml_parser->node = (const mxml_node_t*)xml_get_child
00904 (
00905 xml_parser->node,
00906 "MESSAGE",
00907 1
00908 );
00909 err_code = message_xml_parse__message(message, xml_parser);
00910 cleanup:
00911 free(xml_parser);
00912 return err_code;
00913 }
00914
00915 error_code_t
00916 message_xml_parse__message(message_p message, xml_parser_p xml_parser)
00917 {
00918 const char* attribute;
00919 char* buf;
00920 char* hostname;
00921 char* port_str;
00922 #ifndef _WIN32
00923 char* save_ptr;
00924 #endif
00925 int port;
00926 if (xml_parser->node == NULL) {
00927 return MC_ERR_PARSE;
00928 }
00929 attribute = mxmlElementGetAttr
00930 (
00931 (mxml_node_t*)xml_parser->node,
00932 "message"
00933 );
00934 if (!strcmp(attribute, "MOBILE_AGENT")) {
00935 message->message_type = MOBILE_AGENT;
00936 message->xml_payload = xml_get_child
00937 (
00938 xml_parser->node,
00939 "MOBILE_AGENT",
00940 1
00941 );
00942 } else if (!strcmp(attribute, "RETURN_MSG")) {
00943 message->message_type = RETURN_MSG;
00944 message->xml_payload = xml_get_child
00945 (
00946 xml_parser->node,
00947 "MOBILE_AGENT",
00948 1
00949 );
00950 } else if (!strcmp(attribute, "ACL")) {
00951 message->message_type = FIPA_ACL;
00952 } else if (!strcmp(attribute, "ENCRYPTION_INITIALIZE")) {
00953 message->message_type = ENCRYPTION_INITIALIZE;
00954 message->xml_payload = xml_get_child
00955 (
00956 xml_parser->node,
00957 "ENCRYPTION_DATA",
00958 1
00959 );
00960 } else if (!strcmp(attribute, "ENCRYPTED_DATA")) {
00961 message->message_type = ENCRYPTED_DATA;
00962 message->xml_payload = xml_get_child
00963 (
00964 xml_parser->node,
00965 "ENCRYPTED_DATA",
00966 1
00967 );
00968 } else if (!strcmp(attribute, "REQUEST_ENCRYPTION_INITIALIZE")) {
00969 message->message_type = REQUEST_ENCRYPTION_INITIALIZE;
00970 } else {
00971 fprintf(stderr, "Parse error. %s:%d\n", __FILE__, __LINE__);
00972 return MC_ERR_PARSE;
00973 }
00974 attribute = mxmlElementGetAttr
00975 (
00976 (mxml_node_t*)xml_parser->node,
00977 "from"
00978 );
00979 if(attribute != NULL) {
00980
00981 if(message->from_address) free(message->from_address);
00982 message->from_address = (char*)malloc
00983 (
00984 sizeof(char) *
00985 (strlen(attribute)+1)
00986 );
00987 CHECK_NULL(message->from_address, exit(0););
00988 strcpy(message->from_address, attribute);
00989 buf = (char*)malloc
00990 (
00991 sizeof(char) *
00992 (strlen(message->from_address)+1)
00993 );
00994 CHECK_NULL(buf, exit(0););
00995 strcpy(buf, message->from_address);
00996 hostname = strtok_r(buf, ":", &save_ptr);
00997 port_str = strtok_r(NULL, ":", &save_ptr);
00998 port = atoi(port_str);
00999 message->addr->sin_port = htons(port);
01000 free(buf);
01001 }
01002 return MC_SUCCESS;
01003 }
01004
01005