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 #ifndef _WIN32
00035 #include "config.h"
00036 #else
00037 #include "winconfig.h"
00038 #endif
00039
00040 #include <mxml.h>
00041 #include "include/agent.h"
00042 #include "include/xml_compose.h"
00043 #include "include/xml_helper.h"
00044
00045 mxml_node_t*
00046 agent_xml_compose(agent_p agent)
00047 {
00048 mxml_node_t* node;
00049 node = mxmlLoadString
00050 (
00051 NULL,
00052 "<?xml version=\"1.0\"?>\n<!DOCTYPE myMessage SYSTEM \"mobilec.dtd\">",
00053 MXML_NO_CALLBACK
00054 );
00055 mxmlAdd
00056 (
00057 node,
00058 MXML_ADD_AFTER,
00059 MXML_ADD_TO_PARENT,
00060 agent_xml_compose__gaf_message(agent)
00061 );
00062 return node;
00063 }
00064
00065 mxml_node_t*
00066 agent_xml_compose__gaf_message(agent_p agent)
00067 {
00068 mxml_node_t* node;
00069 node = mxmlNewElement
00070 (
00071 NULL,
00072 "MOBILEC_MESSAGE"
00073 );
00074 mxmlAdd
00075 (
00076 node,
00077 MXML_ADD_AFTER,
00078 NULL,
00079 agent_xml_compose__message(agent)
00080 );
00081 return node;
00082 }
00083
00084 mxml_node_t*
00085 agent_xml_compose__message(agent_p agent)
00086 {
00087 mxml_node_t* node;
00088 node = mxmlNewElement
00089 (
00090 NULL,
00091 "MESSAGE"
00092 );
00093
00094 if(
00095 agent->agent_type == MC_REMOTE_AGENT ||
00096 agent->agent_type == MC_LOCAL_AGENT
00097 )
00098 {
00099 mxmlElementSetAttr
00100 (
00101 node,
00102 "message",
00103 "MOBILE_AGENT"
00104 );
00105 } else if
00106 (
00107 agent->agent_type == MC_RETURN_AGENT
00108 )
00109 {
00110 mxmlElementSetAttr
00111 (
00112 node,
00113 "message",
00114 "RETURN_MSG"
00115 );
00116 }
00117
00118 mxmlAdd
00119 (
00120 node,
00121 MXML_ADD_AFTER,
00122 NULL,
00123 agent_xml_compose__mobile_agent(agent)
00124 );
00125 return node;
00126 }
00127
00128 mxml_node_t*
00129 agent_xml_compose__mobile_agent(agent_p agent)
00130 {
00131 mxml_node_t* node;
00132
00133 node = mxmlNewElement
00134 (
00135 NULL,
00136 "MOBILE_AGENT"
00137 );
00138
00139 mxmlAdd
00140 (
00141 node,
00142 MXML_ADD_AFTER,
00143 NULL,
00144 agent_xml_compose__agent_data(agent)
00145 );
00146 return node;
00147 }
00148
00149 mxml_node_t*
00150 agent_xml_compose__agent_data(agent_p agent)
00151 {
00152 mxml_node_t* node;
00153 mxml_node_t* tmp_node;
00154
00155 node = mxmlNewElement
00156 (
00157 NULL,
00158 "AGENT_DATA"
00159 );
00160
00161
00162 tmp_node = agent_xml_compose__name(agent);
00163 if (tmp_node == NULL) {
00164 return NULL;
00165 }
00166 mxmlAdd(
00167 node,
00168 MXML_ADD_AFTER,
00169 NULL,
00170 tmp_node
00171 );
00172
00173
00174 tmp_node = agent_xml_compose__owner(agent);
00175 if (tmp_node != NULL) {
00176 mxmlAdd(
00177 node,
00178 MXML_ADD_AFTER,
00179 NULL,
00180 tmp_node
00181 );
00182 }
00183
00184
00185 tmp_node = agent_xml_compose__home(agent);
00186 if (tmp_node != NULL) {
00187 mxmlAdd(
00188 node,
00189 MXML_ADD_AFTER,
00190 NULL,
00191 tmp_node
00192 );
00193 }
00194
00195
00196 tmp_node = agent_xml_compose__wg_code(agent);
00197 if (tmp_node != NULL) {
00198 mxmlAdd(
00199 node,
00200 MXML_ADD_AFTER,
00201 NULL,
00202 tmp_node
00203 );
00204 }
00205
00206
00207 tmp_node = agent_xml_compose__tasks(agent);
00208 if (tmp_node != NULL) {
00209 mxmlAdd(
00210 node,
00211 MXML_ADD_AFTER,
00212 NULL,
00213 tmp_node
00214 );
00215 }
00216
00217 return node;
00218 }
00219
00220 mxml_node_t*
00221 agent_xml_compose__name(agent_p agent)
00222 {
00223 mxml_node_t* node;
00224 node = mxmlNewElement(
00225 NULL,
00226 "NAME"
00227 );
00228 mxmlNewText(
00229 node,
00230 0,
00231 agent->name
00232 );
00233 return node;
00234 }
00235
00236 mxml_node_t*
00237 agent_xml_compose__owner(agent_p agent)
00238 {
00239 mxml_node_t* node;
00240 node = mxmlNewElement(
00241 NULL,
00242 "OWNER"
00243 );
00244 mxmlNewText(
00245 node,
00246 0,
00247 agent->owner
00248 );
00249 return node;
00250 }
00251
00252 mxml_node_t*
00253 agent_xml_compose__home(agent_p agent)
00254 {
00255 mxml_node_t* node;
00256 node = mxmlNewElement(
00257 NULL,
00258 "HOME"
00259 );
00260 mxmlNewText(
00261 node,
00262 0,
00263 agent->home
00264 );
00265 return node;
00266 }
00267
00268 mxml_node_t*
00269 agent_xml_compose__wg_code(agent_p agent)
00270 {
00271 mxml_node_t* node;
00272 node = mxmlNewElement(
00273 NULL,
00274 "WG_CODE"
00275 );
00276 mxmlNewText(
00277 node,
00278 0,
00279 agent->wg_code
00280 );
00281 return node;
00282 }
00283
00284 mxml_node_t*
00285 agent_xml_compose__tasks(agent_p agent)
00286 {
00287 char buf[30];
00288 int i;
00289 mxml_node_t* node;
00290 mxml_node_t* tmp_node;
00291
00292 node=mxmlNewElement(
00293 NULL,
00294 "TASKS" );
00295
00296 sprintf(buf, "%d", agent->datastate->number_of_tasks);
00297 mxmlElementSetAttr(
00298 node,
00299 "task",
00300 buf
00301 );
00302
00303 buf[0] = '\0';
00304 sprintf(buf, "%d", agent->datastate->task_progress);
00305 mxmlElementSetAttr(
00306 node,
00307 "num",
00308 buf
00309 );
00310
00311 for (i = 0; i < agent->datastate->number_of_tasks; i++) {
00312 tmp_node = agent_xml_compose__task(agent, i);
00313 if (tmp_node != NULL) {
00314 mxmlAdd(
00315 node,
00316 MXML_ADD_AFTER,
00317 NULL,
00318 tmp_node
00319 );
00320 } else {
00321 return NULL;
00322 }
00323 }
00324
00325 i=0;
00326 tmp_node = agent_xml_compose__agent_code(agent, i);
00327 while (tmp_node != NULL) {
00328 mxmlAdd(
00329 node,
00330 MXML_ADD_AFTER,
00331 NULL,
00332 tmp_node
00333 );
00334 i++;
00335 tmp_node = agent_xml_compose__agent_code(agent, i);
00336 }
00337
00338 return node;
00339 }
00340
00341 mxml_node_t*
00342 agent_xml_compose__task(agent_p agent, int index)
00343 {
00344 char buf[30];
00345 mxml_node_t* node;
00346 mxml_node_t* tmp_node;
00347 interpreter_variable_data_t* tmp_interp_var;
00348 agent_file_data_p agent_file_data;
00349 node = mxmlNewElement(
00350 NULL,
00351 "TASK"
00352 );
00353
00354 buf[0] = '\0';
00355 sprintf(buf, "%d", index);
00356 mxmlElementSetAttr(
00357 node,
00358 "num",
00359 buf );
00360
00361
00362 mxmlElementSetAttr(
00363 node,
00364 "server",
00365 agent->datastate->tasks[index]->server_name
00366 );
00367
00368
00369 if (agent->datastate->tasks[index]->code_id) {
00370 mxmlElementSetAttr(
00371 node,
00372 "code_id",
00373 agent->datastate->tasks[index]->code_id
00374 );
00375 }
00376
00377
00378 if (agent->datastate->persistent || agent->datastate->tasks[index]->persistent) {
00379 mxmlElementSetAttr(
00380 node,
00381 "persistent",
00382 "1"
00383 );
00384 }
00385
00386
00387
00388 if(agent->datastate->tasks[index]->var_name != NULL) {
00389 mxmlElementSetAttr(
00390 node,
00391 "return",
00392 agent->datastate->tasks[index]->var_name );
00393
00394 if(
00395 strcmp(
00396 "no-return",
00397 agent->datastate->tasks[index]->var_name
00398 )
00399 )
00400 {
00401
00402 if (agent->datastate->tasks[index]->agent_return_data != NULL) {
00403 tmp_node = agent_xml_compose__data(
00404 agent,
00405 index,
00406 agent->datastate->tasks[index]->agent_return_data);
00407 } else {tmp_node = NULL;}
00408
00409 if(tmp_node != NULL) {
00410 mxmlAdd(
00411 node,
00412 MXML_ADD_AFTER,
00413 NULL,
00414 tmp_node );
00415 }
00416 }
00417 }
00418
00419
00420 ListWRLock( agent->datastate->tasks[index]->agent_variable_list );
00421 while
00422 (
00423 (
00424 tmp_interp_var = (interpreter_variable_data_t*)ListPop(
00425 agent->datastate->tasks[index]->agent_variable_list )
00426 ) != NULL
00427 )
00428 {
00429 tmp_node = agent_xml_compose__data(
00430 agent,
00431 index,
00432 tmp_interp_var);
00433 free(tmp_interp_var);
00434 if(tmp_node == NULL) {
00435 fprintf(stderr, "Compose error. %s:%d\n", __FILE__, __LINE__);
00436 ListWRUnlock( agent->datastate->tasks[index]->agent_variable_list );
00437 return NULL;
00438 }
00439 mxmlAdd(
00440 node,
00441 MXML_ADD_AFTER,
00442 NULL,
00443 tmp_node );
00444 }
00445 ListWRUnlock( agent->datastate->tasks[index]->agent_variable_list );
00446
00447 ListWRLock( agent->datastate->tasks[index]->agent_file_list );
00448
00449 while
00450 (
00451 (
00452 agent_file_data = (agent_file_data_t*)ListPop(
00453 agent->datastate->tasks[index]->agent_file_list )
00454 ) != NULL
00455 )
00456 {
00457 tmp_node = agent_xml_compose__file(
00458 agent,
00459 index,
00460 agent_file_data);
00461 agent_file_data_Destroy(agent_file_data);
00462 if(tmp_node == NULL) {
00463 fprintf(stderr, "Compose error. %s:%d\n", __FILE__, __LINE__);
00464 ListWRUnlock( agent->datastate->tasks[index]->agent_file_list );
00465 return NULL;
00466 }
00467 mxmlAdd(
00468 node,
00469 MXML_ADD_AFTER,
00470 NULL,
00471 tmp_node);
00472 }
00473 ListWRUnlock( agent->datastate->tasks[index]->agent_file_list );
00474 return node;
00475 }
00476
00477 mxml_node_t*
00478 agent_xml_compose__data(agent_p agent, int index, interpreter_variable_data_t* interp_variable)
00479 {
00480 char buf[30];
00481 mxml_node_t* node;
00482 mxml_node_t* tmp_node;
00483
00484 if (interp_variable == NULL) { return NULL; }
00485
00486 node = mxmlNewElement(
00487 NULL,
00488 "DATA"
00489 );
00490
00491 mxmlElementSetAttr(
00492 node,
00493 "name",
00494 interp_variable->name
00495 );
00496
00497 if (interp_variable != NULL)
00498 {
00499
00500 sprintf(
00501 buf,
00502 "%d",
00503 interp_variable->array_dim
00504 );
00505 mxmlElementSetAttr(
00506 node,
00507 "dim",
00508 buf
00509 );
00510
00511
00512 CH_DATATYPE_STRING(
00513 interp_variable->data_type,
00514 buf
00515 );
00516 mxmlElementSetAttr(
00517 node,
00518 "type",
00519 buf
00520 );
00521
00522 if (interp_variable->array_dim == 0)
00523 {
00524 CH_DATATYPE_VALUE_STRING
00525 (
00526 interp_variable->data_type,
00527 buf,
00528 interp_variable->data
00529 );
00530 mxmlElementSetAttr(
00531 node,
00532 "value",
00533 buf
00534 );
00535 } else {
00536
00537 tmp_node = agent_xml_compose__row(interp_variable, index);
00538 if (tmp_node != NULL) {
00539 mxmlAdd(
00540 node,
00541 MXML_ADD_AFTER,
00542 NULL,
00543 tmp_node
00544 );
00545 }
00546 }
00547 }
00548 return node;
00549 }
00550
00551 mxml_node_t*
00552 agent_xml_compose__file(agent_p agent, int index, agent_file_data_t* agent_file_data)
00553 {
00554 mxml_node_t* node;
00555 node = mxmlNewElement(
00556 MXML_NO_PARENT,
00557 "FILE"
00558 );
00559 mxmlElementSetAttr(
00560 node,
00561 "name",
00562 agent_file_data->name );
00563 mxmlNewText(
00564 node,
00565 0,
00566 agent_file_data->data );
00567 return node;
00568 }
00569
00570 mxml_node_t*
00571 agent_xml_compose__agent_code(agent_p agent, int index)
00572 {
00573 mxml_node_t* node;
00574 if (agent->datastate->agent_codes[index] == NULL) {
00575 return NULL;
00576 }
00577
00578 node = mxmlNewElement (
00579 MXML_NO_PARENT,
00580 "AGENT_CODE"
00581 );
00582
00583 xml_new_cdata(
00584 node,
00585 agent->datastate->agent_codes[index]
00586 );
00587 if (strlen(agent->datastate->agent_code_ids[index]) > 0) {
00588 mxmlElementSetAttr
00589 (
00590 node,
00591 "id",
00592 agent->datastate->agent_code_ids[index]
00593 );
00594 }
00595 return node;
00596 }
00597
00598 mxml_node_t*
00599 agent_xml_compose__row(interpreter_variable_data_t* interp_variable, int index)
00600 {
00601 mxml_node_t* node;
00602
00603 if (interp_variable == NULL) {
00604 return NULL;
00605 }
00606
00607 node = agent_xml_compose__create_row_nodes
00608 (
00609 interp_variable->data,
00610 0,
00611 interp_variable->array_extent,
00612 interp_variable->data_type,
00613 interp_variable->array_dim,
00614 0
00615 );
00616 return node;
00617 }
00618
00619
00620 mxml_node_t*
00621 agent_xml_compose__create_row_nodes
00622 (
00623 void* data,
00624 int index,
00625 int *extent,
00626 ChType_t type,
00627 int dim,
00628 int extent_index
00629 )
00630 {
00631 mxml_node_t* node;
00632 char *buf;
00633 char *varstring;
00634 int size;
00635 int i;
00636 if (dim == 1) {
00637 buf = (char*)malloc(sizeof(char) * 20);
00638 CH_DATATYPE_SIZE(type, size);
00639
00640 varstring = (char*)malloc(
00641 (sizeof(char)*64) * *extent);
00642 varstring[0] = '\0';
00643 for(i = 0; i < *extent; i++) {
00644 buf[0] = '\0';
00645 #ifndef _WIN32
00646 CH_DATATYPE_VALUE_STRING(type, buf, (data+ size*(index+i)));
00647 #else
00648 CH_DATATYPE_VALUE_STRING(type, buf, ((char*)data+ size*(index+i)));
00649 #endif
00650 strcat(varstring, buf);
00651 strcat(varstring, ",");
00652 }
00653 node = mxmlNewElement(
00654 MXML_NO_PARENT,
00655 "ROW" );
00656 buf[0] = '\0';
00657 sprintf(buf, "%d", extent_index);
00658 mxmlElementSetAttr(
00659 node,
00660 "index",
00661 buf );
00662
00663
00664 mxmlNewText(
00665 node,
00666 1,
00667 varstring );
00668 free(buf);
00669 free(varstring);
00670 return node;
00671 } else if (dim < 0) {
00672 fprintf(stderr, "INTERNAL ERROR: %s:%d\n",
00673 __FILE__, __LINE__);
00674 return NULL;
00675 } else if (dim == 0) {
00676 return NULL;
00677 } else {
00678
00679 size = 1;
00680 for (i = 1; i < dim; i++) {
00681 size *= extent[i];
00682 }
00683 node = mxmlNewElement(MXML_NO_PARENT, "ROW");
00684 buf = (char*)malloc(sizeof(char)*10);
00685 sprintf(buf, "%d", extent_index);
00686 mxmlElementSetAttr(
00687 node,
00688 "index",
00689 buf );
00690 for (i = 0; i < *extent; i++) {
00691 mxmlAdd(
00692 node,
00693 MXML_ADD_AFTER,
00694 MXML_ADD_TO_PARENT,
00695 agent_xml_compose__create_row_nodes(
00696 data,
00697 index + (size*i),
00698 extent+1,
00699 type,
00700 dim-1,
00701 i
00702 )
00703 );
00704 }
00705 free (buf);
00706 return node;
00707 }
00708 }
00709