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