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 while
00421 (
00422 (
00423 tmp_interp_var = agent_variable_list_Pop(
00424 agent->datastate->tasks[index]->agent_variable_list )
00425 ) != NULL
00426 )
00427 {
00428 tmp_node = agent_xml_compose__data(
00429 agent,
00430 index,
00431 tmp_interp_var);
00432 free(tmp_interp_var);
00433 if(tmp_node == NULL) {
00434 fprintf(stderr, "Compose error. %s:%d\n", __FILE__, __LINE__);
00435 return NULL;
00436 }
00437 mxmlAdd(
00438 node,
00439 MXML_ADD_AFTER,
00440 NULL,
00441 tmp_node );
00442 }
00443
00444
00445 while
00446 (
00447 (
00448 agent_file_data = agent_file_list_Pop(
00449 agent->datastate->tasks[index]->agent_file_list )
00450 ) != NULL
00451 )
00452 {
00453 tmp_node = agent_xml_compose__file(
00454 agent,
00455 index,
00456 agent_file_data);
00457 agent_file_data_Destroy(agent_file_data);
00458 if(tmp_node == NULL) {
00459 fprintf(stderr, "Compose error. %s:%d\n", __FILE__, __LINE__);
00460 return NULL;
00461 }
00462 mxmlAdd(
00463 node,
00464 MXML_ADD_AFTER,
00465 NULL,
00466 tmp_node);
00467 }
00468
00469 return node;
00470 }
00471
00472 mxml_node_t*
00473 agent_xml_compose__data(agent_p agent, int index, interpreter_variable_data_t* interp_variable)
00474 {
00475 char buf[30];
00476 mxml_node_t* node;
00477 mxml_node_t* tmp_node;
00478
00479 if (interp_variable == NULL) { return NULL; }
00480
00481 node = mxmlNewElement(
00482 NULL,
00483 "DATA"
00484 );
00485
00486 mxmlElementSetAttr(
00487 node,
00488 "name",
00489 interp_variable->name
00490 );
00491
00492 if (interp_variable != NULL)
00493 {
00494
00495 sprintf(
00496 buf,
00497 "%d",
00498 interp_variable->array_dim
00499 );
00500 mxmlElementSetAttr(
00501 node,
00502 "dim",
00503 buf
00504 );
00505
00506
00507 CH_DATATYPE_STRING(
00508 interp_variable->data_type,
00509 buf
00510 );
00511 mxmlElementSetAttr(
00512 node,
00513 "type",
00514 buf
00515 );
00516
00517 if (interp_variable->array_dim == 0)
00518 {
00519 CH_DATATYPE_VALUE_STRING
00520 (
00521 interp_variable->data_type,
00522 buf,
00523 interp_variable->data
00524 );
00525 mxmlElementSetAttr(
00526 node,
00527 "value",
00528 buf
00529 );
00530 } else {
00531
00532 tmp_node = agent_xml_compose__row(interp_variable, index);
00533 if (tmp_node != NULL) {
00534 mxmlAdd(
00535 node,
00536 MXML_ADD_AFTER,
00537 NULL,
00538 tmp_node
00539 );
00540 }
00541 }
00542 }
00543 return node;
00544 }
00545
00546 mxml_node_t*
00547 agent_xml_compose__file(agent_p agent, int index, agent_file_data_t* agent_file_data)
00548 {
00549 mxml_node_t* node;
00550 node = mxmlNewElement(
00551 MXML_NO_PARENT,
00552 "FILE"
00553 );
00554 mxmlElementSetAttr(
00555 node,
00556 "name",
00557 agent_file_data->name );
00558 mxmlNewText(
00559 node,
00560 0,
00561 agent_file_data->data );
00562 return node;
00563 }
00564
00565 mxml_node_t*
00566 agent_xml_compose__agent_code(agent_p agent, int index)
00567 {
00568 mxml_node_t* node;
00569 if (agent->datastate->agent_codes[index] == NULL) {
00570 return NULL;
00571 }
00572
00573 node = mxmlNewElement (
00574 MXML_NO_PARENT,
00575 "AGENT_CODE"
00576 );
00577
00578 xml_new_cdata(
00579 node,
00580 agent->datastate->agent_codes[index]
00581 );
00582 if (strlen(agent->datastate->agent_code_ids[index]) > 0) {
00583 mxmlElementSetAttr
00584 (
00585 node,
00586 "id",
00587 agent->datastate->agent_code_ids[index]
00588 );
00589 }
00590 return node;
00591 }
00592
00593 mxml_node_t*
00594 agent_xml_compose__row(interpreter_variable_data_t* interp_variable, int index)
00595 {
00596 mxml_node_t* node;
00597
00598 if (interp_variable == NULL) {
00599 return NULL;
00600 }
00601
00602 node = agent_xml_compose__create_row_nodes
00603 (
00604 interp_variable->data,
00605 0,
00606 interp_variable->array_extent,
00607 interp_variable->data_type,
00608 interp_variable->array_dim,
00609 0
00610 );
00611 return node;
00612 }
00613
00614
00615 mxml_node_t*
00616 agent_xml_compose__create_row_nodes
00617 (
00618 void* data,
00619 int index,
00620 int *extent,
00621 ChType_t type,
00622 int dim,
00623 int extent_index
00624 )
00625 {
00626 mxml_node_t* node;
00627 char *buf;
00628 char *varstring;
00629 int size;
00630 int i;
00631 if (dim == 1) {
00632 buf = (char*)malloc(sizeof(char) * 20);
00633 CH_DATATYPE_SIZE(type, size);
00634
00635 varstring = (char*)malloc(
00636 (sizeof(char)*64) * *extent);
00637 varstring[0] = '\0';
00638 for(i = 0; i < *extent; i++) {
00639 buf[0] = '\0';
00640 #ifndef _WIN32
00641 CH_DATATYPE_VALUE_STRING(type, buf, (data+ size*(index+i)));
00642 #else
00643 CH_DATATYPE_VALUE_STRING(type, buf, ((char*)data+ size*(index+i)));
00644 #endif
00645 strcat(varstring, buf);
00646 strcat(varstring, ",");
00647 }
00648 node = mxmlNewElement(
00649 MXML_NO_PARENT,
00650 "ROW" );
00651 buf[0] = '\0';
00652 sprintf(buf, "%d", extent_index);
00653 mxmlElementSetAttr(
00654 node,
00655 "index",
00656 buf );
00657
00658
00659 mxmlNewText(
00660 node,
00661 1,
00662 varstring );
00663 free(buf);
00664 free(varstring);
00665 return node;
00666 } else if (dim < 0) {
00667 fprintf(stderr, "INTERNAL ERROR: %s:%d\n",
00668 __FILE__, __LINE__);
00669 return NULL;
00670 } else if (dim == 0) {
00671 return NULL;
00672 } else {
00673
00674 size = 1;
00675 for (i = 1; i < dim; i++) {
00676 size *= extent[i];
00677 }
00678 node = mxmlNewElement(MXML_NO_PARENT, "ROW");
00679 buf = (char*)malloc(sizeof(char)*10);
00680 sprintf(buf, "%d", extent_index);
00681 mxmlElementSetAttr(
00682 node,
00683 "index",
00684 buf );
00685 for (i = 0; i < *extent; i++) {
00686 mxmlAdd(
00687 node,
00688 MXML_ADD_AFTER,
00689 MXML_ADD_TO_PARENT,
00690 agent_xml_compose__create_row_nodes(
00691 data,
00692 index + (size*i),
00693 extent+1,
00694 type,
00695 dim-1,
00696 i
00697 )
00698 );
00699 }
00700 free (buf);
00701 return node;
00702 }
00703 }
00704