00001 /* SVN FILE INFO 00002 * $Revision: 174 $ : Last Committed Revision 00003 * $Date: 2008年06月24日 10:50:29 -0700 (2008年6月24日) $ : Last Committed Date */ 00004 /*[ 00005 * Copyright (c) 2007 Integration Engineering Laboratory 00006 University of California, Davis 00007 * 00008 * Permission to use, copy, and distribute this software and its 00009 * documentation for any purpose with or without fee is hereby granted, 00010 * provided that the above copyright notice appear in all copies and 00011 * that both that copyright notice and this permission notice appear 00012 * in supporting documentation. 00013 * 00014 * Permission to modify the software is granted, but not the right to 00015 * distribute the complete modified source code. Modifications are to 00016 * be distributed as patches to the released version. Permission to 00017 * distribute binaries produced by compiling modified sources is granted, 00018 * provided you 00019 * 1. distribute the corresponding source modifications from the 00020 * released version in the form of a patch file along with the binaries, 00021 * 2. add special version identification to distinguish your version 00022 * in addition to the base release version number, 00023 * 3. provide your name and address as the primary contact for the 00024 * support of your modified version, and 00025 * 4. retain our contact information in regard to use of the base 00026 * software. 00027 * Permission to distribute the released version of the source code along 00028 * with corresponding source modifications in the form of a patch file is 00029 * granted with same provisions 2 through 4 for binary distributions. 00030 * 00031 * This software is provided "as is" without express or implied warranty 00032 * to the extent permitted by applicable law. 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 /* Add the 'name' node */ 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 /* Add the 'owner' node */ 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 /* Add the 'home' node */ 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 /* Add the 'task' node */ 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 /* Set up server name attribute */ 00329 mxmlElementSetAttr( 00330 node, 00331 "server", 00332 agent->datastate->tasks[index]->server_name 00333 ); 00334 00335 /* Set up task completion attribute */ 00336 sprintf(buf, "%d", agent->datastate->tasks[index]->task_completed); 00337 mxmlElementSetAttr( 00338 node, 00339 "complete", 00340 buf 00341 ); 00342 00343 /* Set up the code id */ 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 /* Set up persistent flag, only if it _is_ persistent */ 00353 if (agent->datastate->persistent || agent->datastate->tasks[index]->persistent) { 00354 mxmlElementSetAttr( 00355 node, 00356 "persistent", 00357 "1" 00358 ); 00359 } 00360 00361 /* Add 'DATA' nodes */ 00362 /* First, add the return data */ 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 /* Now, add all the variables that the agent wants to save */ 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 /* Set up return variable name attribute */ 00440 mxmlElementSetAttr( 00441 node, 00442 "name", 00443 interp_variable->name 00444 ); 00445 00446 if (interp_variable != NULL) 00447 { 00448 /* Set up the 'dim' attribute */ 00449 sprintf( 00450 buf, 00451 "%d", 00452 interp_variable->array_dim 00453 ); 00454 mxmlElementSetAttr( 00455 node, 00456 "dim", 00457 buf 00458 ); 00459 00460 /* set up the 'type' attribute */ 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 /* Set up row nodes */ 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 /* This recursive function actually creates the tree of row nodes. */ 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 /* Create my node, but need to attach node of lower dimensions */ 00609 size = 1; 00610 for (i = 1; i < dim; i++) { 00611 size *= extent[i]; /* size is the size of a dimension */ 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