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 #include <stdio.h>
00033 #include <mxml.h>
00034 #include <time.h>
00035 #include "include/fipa_acl_envelope.h"
00036 #include "include/mc_error.h"
00037 #include "include/mc_platform.h"
00038
00039
00040 fipa_acl_envelope_Received_t* fipa_acl_envelope_Received_New(void)
00041 {
00042 fipa_acl_envelope_Received_t* received;
00043 received = (fipa_acl_envelope_Received_t*)malloc(
00044 sizeof(fipa_acl_envelope_Received_t) );
00045 memset(received, 0, sizeof(fipa_acl_envelope_Received_t));
00046 return received;
00047 }
00048
00049 int fipa_acl_envelope_Received_Destroy(fipa_acl_envelope_Received_t* received)
00050 {
00051 if (received == NULL) return 0;
00052 fipa_url_Destroy(received->received_by);
00053 fipa_url_Destroy(received->received_from);
00054 fipa_DateTime_Destroy(received->received_date);
00055 if (received->received_id != NULL) free(received->received_id);
00056 fipa_url_Destroy(received->received_via);
00057 free(received);
00058 return 0;
00059 }
00060
00061 fipa_acl_envelope_Received_t* fipa_acl_envelope_Received_Copy(
00062 fipa_acl_envelope_Received_t* received)
00063 {
00064 fipa_acl_envelope_Received_t* copy;
00065 if (received == NULL) return NULL;
00066 copy = fipa_acl_envelope_Received_New();
00067 copy->received_by = fipa_url_Copy(received->received_by);
00068 copy->received_from = fipa_url_Copy(received->received_from);
00069 copy->received_date = fipa_DateTime_Copy(received->received_date);
00070 copy->received_id = strdup(received->received_id);
00071 copy->received_via = fipa_url_Copy(received->received_via);
00072
00073 return copy;
00074 }
00075
00076
00077 fipa_acl_Param_t* fipa_acl_Param_New(void)
00078 {
00079 fipa_acl_Param_t* param;
00080 param = (fipa_acl_Param_t*)malloc(sizeof(fipa_acl_Param_t));
00081 memset(param, 0, sizeof(fipa_acl_Param_t));
00082 return param;
00083 }
00084
00085 int fipa_acl_Param_Destroy(fipa_acl_Param_t* param)
00086 {
00087 if (param == NULL) return 0;
00088 fipa_agent_identifier_set_Destroy(param->to);
00089 fipa_agent_identifier_Destroy(param->from);
00090 if (param->comments != NULL) free(param->comments);
00091 if (param->acl_representation != NULL) free(param->acl_representation);
00092 if (param->payload_length != NULL) free(param->payload_length);
00093 if (param->payload_encoding != NULL) free (param->payload_encoding);
00094 fipa_DateTime_Destroy(param->date);
00095 fipa_agent_identifier_set_Destroy(param->intended_receiver);
00096 fipa_acl_envelope_Received_Destroy(param->received);
00097
00098 free(param);
00099 return 0;
00100 }
00101
00102 fipa_acl_Param_t* fipa_acl_Param_Copy(fipa_acl_Param_t* param)
00103 {
00104 fipa_acl_Param_t* copy;
00105 if (param == NULL) return NULL;
00106 copy = fipa_acl_Param_New();
00107 copy->to = fipa_agent_identifier_set_Copy(param->to);
00108 copy->from = fipa_agent_identifier_Copy(param->from);
00109 copy->comments = strdup(param->comments);
00110 copy->acl_representation = strdup(param->acl_representation);
00111 copy->payload_length = strdup(param->payload_length);
00112 copy->payload_encoding = strdup(param->payload_encoding);
00113 copy->date = fipa_DateTime_Copy(param->date);
00114 copy->intended_receiver = fipa_agent_identifier_set_Copy(param->intended_receiver);
00115 copy->received = fipa_acl_envelope_Received_Copy(param->received);
00116
00117 return copy;
00118 }
00119
00120
00121 fipa_acl_envelope_t* fipa_acl_envelope_New(void)
00122 {
00123 fipa_acl_envelope_t* envelope;
00124 envelope = (fipa_acl_envelope_t*)malloc(sizeof(fipa_acl_envelope_t));
00125 memset(envelope, 0, sizeof(fipa_acl_envelope_t));
00126 return envelope;
00127 }
00128
00129 int fipa_acl_envelope_Destroy(fipa_acl_envelope_t* envelope)
00130 {
00131 int i;
00132 if (envelope == NULL) return 0;
00133 if (envelope->params == NULL) return 0;
00134 for(i = 0; i < envelope->num_params; i++) {
00135 fipa_acl_Param_Destroy(envelope->params[i]);
00136 }
00137 free(envelope->params);
00138 free(envelope);
00139 return 0;
00140 }
00141
00142 fipa_acl_envelope_t* fipa_acl_envelope_Copy(fipa_acl_envelope_t* envelope)
00143 {
00144 int i;
00145 fipa_acl_envelope_t* copy;
00146 if (envelope == NULL) return NULL;
00147 copy = fipa_acl_envelope_New();
00148 copy->num_params = envelope->num_params;
00149 copy->params = (fipa_acl_Param_t**)malloc(sizeof(fipa_acl_Param_t*)*copy->num_params);
00150 for (i = 0; i < copy->num_params; i++) {
00151 copy->params[i] = fipa_acl_Param_Copy(envelope->params[i]);
00152 }
00153 return copy;
00154 }
00155
00156
00157 int fipa_envelope_Parse(
00158 struct fipa_acl_envelope_s* envelope,
00159 const char* message)
00160 {
00161
00162 int retval;
00163 mxml_node_t* root_node;
00164 root_node = mxmlLoadString(NULL, message, MXML_NO_CALLBACK);
00165 retval = fipa_envelope_HandleEnvelope(envelope, root_node);
00166 mxmlDelete(root_node);
00167 return retval;
00168 }
00169
00170 int fipa_envelope_HandleEnvelope(
00171 struct fipa_acl_envelope_s* envelope,
00172 mxml_node_t* node)
00173 {
00174
00175 mxml_node_t *envelope_node;
00176 envelope_node = mxmlFindElement(
00177 node,
00178 node,
00179 "envelope",
00180 NULL,
00181 NULL,
00182 MXML_DESCEND_FIRST
00183 );
00184 if (envelope_node == NULL) {
00185 return MC_ERR_PARSE;
00186 }
00187 return fipa_envelope_HandleParams(envelope, envelope_node);
00188 }
00189
00190 int fipa_envelope_HandleParams(
00191 struct fipa_acl_envelope_s* envelope,
00192 mxml_node_t* node)
00193 {
00194 mxml_node_t* param;
00195 int i;
00196 char buf[10];
00197
00198
00199 for (i = 1; ; i++) {
00200 sprintf(buf, "%d", i);
00201 param = mxmlFindElement(
00202 node,
00203 node,
00204 "params",
00205 "index",
00206 buf,
00207 MXML_DESCEND_FIRST);
00208 if (param == NULL) { break; }
00209 }
00210 i--;
00211 if (i == 0) {
00212
00213 return MC_ERR_PARSE;
00214 }
00215 envelope->num_params = i;
00216 envelope->params = (struct fipa_acl_Param_s**)malloc(
00217 sizeof(struct fipa_acl_Param_s*) * i);
00218 memset(envelope->params, 0, i*sizeof(struct fipa_acl_Param_s*) );
00219
00220 for (i = 1; i <= envelope->num_params; i++) {
00221 sprintf(buf, "%d", i);
00222 param = mxmlFindElement(
00223 node,
00224 node,
00225 "params",
00226 "index",
00227 buf,
00228 MXML_DESCEND_FIRST);
00229 fipa_envelope_HandleTo(envelope, param, i-1);
00230 fipa_envelope_HandleFrom(envelope, param, i-1);
00231 fipa_envelope_HandleComments(envelope, param, i-1);
00232 fipa_envelope_HandleAclRepresentation(envelope, param, i-1);
00233 fipa_envelope_HandlePayloadLength(envelope, param, i-1);
00234 fipa_envelope_HandlePayloadEncoding(envelope, param, i-1);
00235 fipa_envelope_HandleDate(envelope, param, i-1);
00236 fipa_envelope_HandleIntendedReceiver(envelope, param, i-1);
00237 fipa_envelope_HandleReceived(envelope, param, i-1);
00238 }
00239 return 0;
00240 }
00241
00242 int fipa_envelope_HandleTo(
00243 struct fipa_acl_envelope_s* envelope,
00244 mxml_node_t* param_node,
00245 int cur_param)
00246 {
00247 int i;
00248 mxml_node_t* to_node;
00249 mxml_node_t* aid_node;
00250
00251 to_node = mxmlFindElement(
00252 param_node,
00253 param_node,
00254 "to",
00255 NULL, NULL,
00256 MXML_DESCEND_FIRST );
00257 if (to_node == NULL) return MC_ERR_PARSE;
00258
00259
00260
00261 aid_node = mxmlFindElement(
00262 to_node,
00263 to_node,
00264 "agent-identifier",
00265 NULL, NULL,
00266 MXML_DESCEND_FIRST );
00267 if (aid_node == NULL) return MC_ERR_PARSE;
00268
00269 for(
00270 i = 1;
00271 (aid_node = mxmlFindElement(
00272 aid_node,
00273 to_node,
00274 "agent-identifier",
00275 NULL,NULL,
00276 MXML_NO_DESCEND )) != NULL;
00277 i++
00278 );
00279
00280 envelope->params[cur_param] = fipa_acl_Param_New();
00281 envelope->params[cur_param]->to = fipa_agent_identifier_set_New();
00282 envelope->params[cur_param]->to->num = i;
00283 envelope->params[cur_param]->to->retain_order = 0;
00284 envelope->params[cur_param]->to->fipa_agent_identifiers =
00285 (struct fipa_agent_identifier_s**) malloc(
00286 sizeof(struct fipa_agent_identifier_s*) *
00287 envelope->params[cur_param]->to->num );
00288
00289
00290 aid_node = mxmlFindElement(
00291 to_node,
00292 to_node,
00293 "agent-identifier",
00294 NULL, NULL,
00295 MXML_DESCEND_FIRST );
00296 if (aid_node == NULL) return MC_ERR_PARSE;
00297
00298 fipa_envelope_ParseAgentIdentifier(
00299 &(envelope->params[cur_param]->to->fipa_agent_identifiers[0]),
00300 aid_node );
00301
00302 for(
00303 i = 1;
00304 aid_node = mxmlFindElement(
00305 aid_node,
00306 to_node,
00307 "agent-identifier",
00308 NULL,NULL,
00309 MXML_NO_DESCEND );
00310 i++
00311 )
00312 {
00313 fipa_envelope_ParseAgentIdentifier(
00314 &(envelope->params[cur_param]->to->fipa_agent_identifiers[i]),
00315 aid_node );
00316 }
00317 return 0;
00318 }
00319
00320 int fipa_envelope_HandleFrom(
00321 struct fipa_acl_envelope_s* envelope,
00322 mxml_node_t* param_node,
00323 int cur_param)
00324 {
00325 mxml_node_t* from_node;
00326 mxml_node_t* aid_node;
00327
00328 from_node = mxmlFindElement(
00329 param_node,
00330 param_node,
00331 "from",
00332 NULL, NULL,
00333 MXML_DESCEND_FIRST);
00334 if (from_node == NULL) return 0;
00335
00336 aid_node = mxmlFindElement(
00337 from_node,
00338 from_node,
00339 "agent-identifier",
00340 NULL, NULL,
00341 MXML_DESCEND_FIRST);
00342 if (aid_node == NULL) return MC_ERR_PARSE;
00343
00344 return fipa_envelope_ParseAgentIdentifier(
00345 &envelope->params[cur_param]->from,
00346 aid_node);
00347 }
00348
00349 int fipa_envelope_HandleComments(
00350 struct fipa_acl_envelope_s* envelope,
00351 mxml_node_t* param_node,
00352 int cur_param)
00353 {
00354 mxml_node_t* comments_node;
00355
00356 comments_node = mxmlFindElement(
00357 param_node,
00358 param_node,
00359 "comments",
00360 NULL, NULL,
00361 MXML_DESCEND_FIRST);
00362 if (comments_node == NULL) return 0;
00363
00364
00365 if (comments_node->child->type != MXML_TEXT) return MC_ERR_PARSE;
00366 envelope->params[cur_param]->comments = (char*)malloc(
00367 sizeof(char) * (strlen(comments_node->child->value.text.string)+1));
00368 strcpy(envelope->params[cur_param]->comments,
00369 comments_node->child->value.text.string);
00370 return 0;
00371 }
00372
00373 int fipa_envelope_HandleAclRepresentation(
00374 struct fipa_acl_envelope_s* envelope,
00375 mxml_node_t* param_node,
00376 int cur_param)
00377 {
00378 mxml_node_t* acl_representation_node;
00379
00380 acl_representation_node = mxmlFindElement(
00381 param_node,
00382 param_node,
00383 "acl-representation",
00384 NULL, NULL,
00385 MXML_DESCEND_FIRST);
00386 if (acl_representation_node == NULL) return 0;
00387
00388
00389 if (acl_representation_node->child->type != MXML_TEXT) return MC_ERR_PARSE;
00390 envelope->params[cur_param]->acl_representation = (char*)malloc(
00391 sizeof(char) * (strlen(acl_representation_node->child->value.text.string)+1));
00392 strcpy(envelope->params[cur_param]->acl_representation,
00393 acl_representation_node->child->value.text.string);
00394 return 0;
00395 }
00396
00397 int fipa_envelope_HandlePayloadLength(
00398 struct fipa_acl_envelope_s* envelope,
00399 mxml_node_t* param_node,
00400 int cur_param)
00401 {
00402 mxml_node_t* payload_length_node;
00403
00404 payload_length_node = mxmlFindElement(
00405 param_node,
00406 param_node,
00407 "payload-length",
00408 NULL, NULL,
00409 MXML_DESCEND_FIRST);
00410 if (payload_length_node == NULL) return 0;
00411
00412 if (payload_length_node->child->type != MXML_TEXT) return MC_ERR_PARSE;
00413 envelope->params[cur_param]->payload_length = (char*)malloc(
00414 sizeof(char) * (strlen(payload_length_node->child->value.text.string)+1) );
00415 strcpy( envelope->params[cur_param]->payload_length,
00416 payload_length_node->child->value.text.string );
00417 return 0;
00418 }
00419
00420 int fipa_envelope_HandlePayloadEncoding(
00421 struct fipa_acl_envelope_s* envelope,
00422 mxml_node_t* param_node,
00423 int cur_param)
00424 {
00425 mxml_node_t* payload_encoding_node;
00426
00427 payload_encoding_node = mxmlFindElement(
00428 param_node,
00429 param_node,
00430 "payload-encoding",
00431 NULL, NULL,
00432 MXML_DESCEND_FIRST);
00433 if (payload_encoding_node == NULL) return 0;
00434
00435 if (payload_encoding_node->child->type != MXML_TEXT) return MC_ERR_PARSE;
00436
00437 envelope->params[cur_param]->payload_encoding = (char*)malloc(
00438 sizeof(char) * (strlen(payload_encoding_node->child->value.text.string)+1) );
00439 strcpy( envelope->params[cur_param]->payload_encoding,
00440 payload_encoding_node->child->value.text.string );
00441 return 0;
00442 }
00443
00444 int fipa_envelope_HandleDate(
00445 struct fipa_acl_envelope_s* envelope,
00446 mxml_node_t* param_node,
00447 int cur_param)
00448 {
00449 char date_string[25];
00450 mxml_node_t* date_node;
00451 fipa_message_string_t message_string;
00452
00453 date_node = mxmlFindElement(
00454 param_node,
00455 param_node,
00456 "date",
00457 NULL, NULL,
00458 MXML_DESCEND_FIRST);
00459 if (date_node == NULL) return 0;
00460
00461 if (date_node->child->type != MXML_TEXT) return MC_ERR_PARSE;
00462 if ( strlen(date_node->child->value.text.string) > 22) return MC_ERR_PARSE;
00463
00464 strcpy(date_string, date_node->child->value.text.string);
00465
00466 message_string.message = date_string;
00467 message_string.parse = date_string;
00468
00469 return fipa_datetime_Parse(
00470 &(envelope->params[cur_param]->date),
00471 &message_string);
00472 }
00473
00474 int fipa_envelope_HandleIntendedReceiver(
00475 struct fipa_acl_envelope_s* envelope,
00476 mxml_node_t* param_node,
00477 int cur_param)
00478 {
00479 int i;
00480 mxml_node_t* intended_receiver_node;
00481 mxml_node_t* aid_node;
00482
00483 intended_receiver_node = mxmlFindElement(
00484 param_node,
00485 param_node,
00486 "intended_receiver",
00487 NULL, NULL,
00488 MXML_DESCEND_FIRST);
00489 if (intended_receiver_node == NULL) {
00490 envelope->params[cur_param]->intended_receiver = NULL;
00491 return 0;
00492 }
00493 envelope->params[cur_param]->intended_receiver = fipa_agent_identifier_set_New();
00494
00495
00496 aid_node = mxmlFindElement(
00497 intended_receiver_node,
00498 intended_receiver_node,
00499 "agent-identifier",
00500 NULL, NULL,
00501 MXML_DESCEND_FIRST);
00502 if (aid_node == NULL) return MC_ERR_PARSE;
00503 for(
00504 i = 1;
00505 aid_node = mxmlFindElement(
00506 aid_node,
00507 intended_receiver_node,
00508 "agent-identifier",
00509 NULL,NULL,
00510 MXML_NO_DESCEND) ;
00511 i++
00512 );
00513
00514 envelope->params[cur_param]->intended_receiver->num = i;
00515 envelope->params[cur_param]->intended_receiver->fipa_agent_identifiers =
00516 (struct fipa_agent_identifier_s**)malloc(
00517 sizeof(struct fipa_agent_identifier_s*) * i);
00518 envelope->params[cur_param]->intended_receiver->retain_order = 0;
00519
00520
00521 aid_node = mxmlFindElement(
00522 intended_receiver_node,
00523 intended_receiver_node,
00524 "agent-identifier",
00525 NULL, NULL,
00526 MXML_DESCEND_FIRST);
00527 if (aid_node == NULL) return MC_ERR_PARSE;
00528 fipa_envelope_ParseAgentIdentifier(
00529 &(envelope->params[cur_param]->intended_receiver->
00530 fipa_agent_identifiers[0]),
00531 aid_node );
00532
00533 for(
00534 i = 1;
00535 aid_node = mxmlFindElement(
00536 aid_node,
00537 intended_receiver_node,
00538 "agent-identifier",
00539 NULL,NULL,
00540 MXML_NO_DESCEND) ;
00541 i++
00542 )
00543 {
00544 fipa_envelope_ParseAgentIdentifier(
00545 &(envelope->params[cur_param]->intended_receiver->
00546 fipa_agent_identifiers[i]),
00547 aid_node );
00548 }
00549 return 0;
00550 }
00551
00552 int fipa_envelope_HandleReceived(
00553 struct fipa_acl_envelope_s* envelope,
00554 mxml_node_t* param_node,
00555 int cur_param)
00556 {
00557 int err;
00558 mxml_node_t* received_node;
00559
00560 mxml_node_t* node;
00561 const char* attr;
00562
00563 fipa_message_string_t message_string;
00564
00565 char date_string[25];
00566
00567 received_node = mxmlFindElement(
00568 param_node,
00569 param_node,
00570 "received",
00571 NULL, NULL,
00572 MXML_DESCEND_FIRST);
00573
00574 if (received_node == NULL) return 0;
00575 envelope->params[cur_param]->received = fipa_acl_envelope_Received_New();
00576
00577
00578
00579
00580
00581
00582
00583
00584 node = mxmlFindElement(
00585 received_node,
00586 received_node,
00587 "received-by",
00588 NULL, NULL,
00589 MXML_DESCEND_FIRST);
00590 if (node == NULL) return MC_ERR_PARSE;
00591 attr = mxmlElementGetAttr(node, "value");
00592 envelope->params[cur_param]->received->received_by = fipa_url_New();
00593 envelope->params[cur_param]->received->received_by->str =
00594 (char*)malloc(sizeof(char) * (strlen(attr)+1));
00595 strcpy(envelope->params[cur_param]->received->received_by->str,
00596 attr);
00597
00598
00599 node = mxmlFindElement(
00600 received_node,
00601 received_node,
00602 "received-date",
00603 NULL, NULL,
00604 MXML_DESCEND_FIRST);
00605 if (node == NULL) return MC_ERR_PARSE;
00606 attr = mxmlElementGetAttr(node, "value");
00607 if (attr == NULL) return MC_ERR_PARSE;
00608 if ( strlen(attr) > 22 ) return MC_ERR_PARSE;
00609 strcpy(date_string, attr);
00610 message_string.message = date_string;
00611 message_string.parse = date_string;
00612
00613 err = fipa_datetime_Parse(
00614 &(envelope->params[cur_param]->received->received_date),
00615 &message_string);
00616 if (err) return err;
00617
00618
00619 node = mxmlFindElement(
00620 received_node,
00621 received_node,
00622 "received-from",
00623 NULL, NULL,
00624 MXML_DESCEND_FIRST);
00625 if(node == NULL) {
00626 envelope->params[cur_param]->received->received_from = NULL;
00627 } else {
00628 attr = mxmlElementGetAttr(node, "value");
00629 if (attr == NULL) return MC_ERR_PARSE;
00630 envelope->params[cur_param]->received->received_from =
00631 (struct fipa_url_s*)malloc(sizeof(struct fipa_url_s));
00632 envelope->params[cur_param]->received->received_from->str =
00633 (char*)malloc(sizeof(char)*(strlen(attr)+1));
00634 strcpy(
00635 envelope->params[cur_param]->received->received_from->str,
00636 attr );
00637 }
00638
00639
00640 node = mxmlFindElement(
00641 received_node,
00642 received_node,
00643 "received-id",
00644 NULL, NULL,
00645 MXML_DESCEND_FIRST);
00646 if(node == NULL) {
00647 envelope->params[cur_param]->received->received_id = NULL;
00648 } else {
00649 attr = mxmlElementGetAttr(node, "value");
00650 if (attr == NULL) return MC_ERR_PARSE;
00651 envelope->params[cur_param]->received->received_id =
00652 (char*)malloc(sizeof(char) * (strlen(attr)+1));
00653 strcpy(envelope->params[cur_param]->received->received_id,
00654 attr);
00655 }
00656
00657
00658 node = mxmlFindElement(
00659 received_node,
00660 received_node,
00661 "received-via",
00662 NULL, NULL,
00663 MXML_DESCEND_FIRST);
00664 if(node == NULL) {
00665 envelope->params[cur_param]->received->received_via = NULL;
00666 } else {
00667 attr = mxmlElementGetAttr(node, "value");
00668 if (attr == NULL) return MC_ERR_PARSE;
00669 envelope->params[cur_param]->received->received_via =
00670 (struct fipa_url_s*)malloc(sizeof(struct fipa_url_s));
00671 envelope->params[cur_param]->received->received_via->str =
00672 (char*)malloc(sizeof(char) * (strlen(attr)+1));
00673 strcpy(envelope->params[cur_param]->received->received_via->str,
00674 attr);
00675 }
00676 return 0;
00677 }
00678
00679 int fipa_envelope_ParseAgentIdentifier(
00680 struct fipa_agent_identifier_s** aid,
00681 mxml_node_t* agent_identifier_node
00682 )
00683 {
00684 int err;
00685 mxml_node_t* name_node;
00686 mxml_node_t* addresses_node;
00687 mxml_node_t* resolvers_node;
00688
00689 name_node = mxmlFindElement(
00690 agent_identifier_node,
00691 agent_identifier_node,
00692 "name",
00693 NULL, NULL,
00694 MXML_DESCEND_FIRST);
00695
00696 if(name_node->child->type != MXML_TEXT) {
00697 return MC_ERR_PARSE;
00698 } else {
00699 *aid = fipa_agent_identifier_New();
00700 (*aid)->name = (char*)malloc(sizeof(char) *
00701 (strlen(name_node->child->value.text.string)+1) );
00702 strcpy((*aid)->name,
00703 name_node->child->value.text.string );
00704 }
00705
00706 addresses_node = mxmlFindElement(
00707 agent_identifier_node,
00708 agent_identifier_node,
00709 "addresses",
00710 NULL, NULL,
00711 MXML_DESCEND_FIRST);
00712 if (addresses_node != NULL) {
00713 err = fipa_envelope_ParseAddresses(*aid, addresses_node);
00714 }
00715 if (err) return err;
00716 resolvers_node = mxmlFindElement(
00717 agent_identifier_node,
00718 agent_identifier_node,
00719 "resolvers",
00720 NULL, NULL,
00721 MXML_DESCEND_FIRST);
00722 if (resolvers_node != NULL) {
00723 err = fipa_envelope_ParseResolvers(*aid, resolvers_node);
00724 }
00725 if (err) return err;
00726 return 0;
00727 }
00728
00729 int fipa_envelope_ParseAddresses(
00730 struct fipa_agent_identifier_s* aid,
00731 mxml_node_t* addresses_node)
00732 {
00733 int i;
00734 mxml_node_t* url_node;
00735
00736
00737 url_node = mxmlFindElement(
00738 addresses_node,
00739 addresses_node,
00740 "url",
00741 NULL, NULL,
00742 MXML_DESCEND_FIRST);
00743 if (url_node == NULL) {
00744 return MC_ERR_PARSE;
00745 }
00746 for (
00747 i = 1;
00748 url_node = mxmlFindElement(
00749 url_node,
00750 addresses_node,
00751 "url",
00752 NULL, NULL,
00753 MXML_NO_DESCEND) ;
00754 i++
00755 );
00756 aid->addresses = (fipa_url_sequence_t*)malloc(sizeof(fipa_url_sequence_t));
00757 aid->addresses->num = i;
00758 aid->addresses->urls = (struct fipa_url_s**)malloc(
00759 sizeof(struct fipa_url_s*) * aid->addresses->num );
00760
00761 url_node = mxmlFindElement(
00762 addresses_node,
00763 addresses_node,
00764 "url",
00765 NULL, NULL,
00766 MXML_DESCEND_FIRST);
00767 if (url_node->child->type != MXML_TEXT) {
00768 return MC_ERR_PARSE;
00769 }
00770 aid->addresses->urls[0] = fipa_url_New();
00771 aid->addresses->urls[0]->str = (char*)malloc(
00772 sizeof(char) * (strlen(url_node->child->value.text.string)+1));
00773 strcpy(aid->addresses->urls[0]->str, url_node->child->value.text.string);
00774 for (
00775 i = 1;
00776 url_node = mxmlFindElement(
00777 url_node,
00778 addresses_node,
00779 "url",
00780 NULL, NULL,
00781 MXML_NO_DESCEND) ;
00782 i++
00783 )
00784 {
00785 if (url_node->child->type != MXML_TEXT) {
00786 return MC_ERR_PARSE;
00787 }
00788 aid->addresses->urls[i] = fipa_url_New();
00789 aid->addresses->urls[i]->str = (char*)malloc(
00790 sizeof(char) * (strlen(url_node->child->value.text.string)+1));
00791 strcpy(aid->addresses->urls[i]->str, url_node->child->value.text.string);
00792 }
00793 return 0;
00794 }
00795
00796 int fipa_envelope_ParseResolvers(
00797 struct fipa_agent_identifier_s* aid,
00798 mxml_node_t* resolvers_node)
00799 {
00800 int i;
00801 mxml_node_t* agent_id_node;
00802
00803
00804
00805 agent_id_node = mxmlFindElement(
00806 resolvers_node,
00807 resolvers_node,
00808 "agent-identifier",
00809 NULL, NULL,
00810 MXML_DESCEND_FIRST);
00811 if (agent_id_node == NULL) {
00812 return MC_ERR_PARSE;
00813 }
00814 for(
00815 i = 1;
00816 agent_id_node = mxmlFindElement(
00817 agent_id_node,
00818 resolvers_node,
00819 "agent-identifier",
00820 NULL, NULL,
00821 MXML_NO_DESCEND);
00822 i++);
00823
00824
00825 aid->resolvers = (fipa_agent_identifier_set_t*)malloc(sizeof(fipa_agent_identifier_set_t));
00826 aid->resolvers->num = i;
00827 aid->resolvers->retain_order = 0;
00828 aid->resolvers->fipa_agent_identifiers = (struct fipa_agent_identifier_s**)malloc(
00829 sizeof(struct fipa_agent_identifier_s*) * aid->resolvers->num);
00830 agent_id_node = mxmlFindElement(
00831 resolvers_node,
00832 resolvers_node,
00833 "agent-identifier",
00834 NULL, NULL,
00835 MXML_DESCEND_FIRST);
00836 if (agent_id_node == NULL) {
00837 return MC_ERR_PARSE;
00838 }
00839 fipa_envelope_ParseAgentIdentifier(
00840 &(aid->resolvers->fipa_agent_identifiers[0]), agent_id_node);
00841 for(
00842 i = 1;
00843 agent_id_node = mxmlFindElement(
00844 agent_id_node,
00845 resolvers_node,
00846 "agent-identifier",
00847 NULL, NULL,
00848 MXML_NO_DESCEND);
00849 i++
00850 )
00851 {
00852 fipa_envelope_ParseAgentIdentifier(
00853 &(aid->resolvers->fipa_agent_identifiers[i]), agent_id_node);
00854 }
00855 return 0;
00856 }
00857
00858
00859
00860
00861 char* fipa_envelope_Compose(fipa_acl_message_t* fipa_acl)
00862 {
00863 char* retval;
00864 mxml_node_t* node;
00865 node = mxmlLoadString
00866 (
00867 NULL,
00868 "<?xml version=\"1.0\"?>",
00869 MXML_NO_CALLBACK
00870 );
00871 mxmlAdd
00872 (
00873 node,
00874 MXML_ADD_AFTER,
00875 MXML_ADD_TO_PARENT,
00876 fipa_envelope_Compose__envelope(fipa_acl)
00877 );
00878 retval = mxmlSaveAllocString(
00879 node,
00880 MXML_NO_CALLBACK);
00881 mxmlDelete(node);
00882 return retval;
00883 }
00884
00885 mxml_node_t*
00886 fipa_envelope_Compose__envelope(fipa_acl_message_t* fipa_acl)
00887 {
00888 mxml_node_t* node;
00889
00890 node = mxmlNewElement(
00891 NULL,
00892 "envelope"
00893 );
00894
00895 mxmlAdd
00896 (
00897 node,
00898 MXML_ADD_AFTER,
00899 MXML_ADD_TO_PARENT,
00900 fipa_envelope_Compose__params(fipa_acl)
00901 );
00902 return node;
00903 }
00904
00905 mxml_node_t*
00906 fipa_envelope_Compose__params(fipa_acl_message_t* fipa_acl)
00907 {
00908 mxml_node_t* node;
00909 node = mxmlNewElement(
00910 NULL,
00911 "params"
00912 );
00913 mxmlElementSetAttr(node, "index", "1");
00914 mxmlAdd
00915 (
00916 node,
00917 MXML_ADD_AFTER,
00918 MXML_ADD_TO_PARENT,
00919 fipa_envelope_Compose__to(fipa_acl)
00920 );
00921 mxmlAdd
00922 (
00923 node,
00924 MXML_ADD_AFTER,
00925 MXML_ADD_TO_PARENT,
00926 fipa_envelope_Compose__from(fipa_acl)
00927 );
00928 mxmlAdd
00929 (
00930 node,
00931 MXML_ADD_AFTER,
00932 MXML_ADD_TO_PARENT,
00933 fipa_envelope_Compose__acl_representation(fipa_acl)
00934 );
00935 mxmlAdd
00936 (
00937 node,
00938 MXML_ADD_AFTER,
00939 MXML_ADD_TO_PARENT,
00940 fipa_envelope_Compose__payload_encoding(fipa_acl)
00941 );
00942 mxmlAdd
00943 (
00944 node,
00945 MXML_ADD_AFTER,
00946 MXML_ADD_TO_PARENT,
00947 fipa_envelope_Compose__date(fipa_acl)
00948 );
00949
00950
00951
00952
00953
00954
00955
00956 return node;
00957 }
00958
00959 mxml_node_t*
00960 fipa_envelope_Compose__to(fipa_acl_message_t* fipa_acl)
00961 {
00962 int i;
00963 int j;
00964 mxml_node_t* node;
00965 mxml_node_t* agent_identifier_node;
00966 mxml_node_t* name_node;
00967 mxml_node_t* addresses_node;
00968 mxml_node_t* url_node;
00969 node = mxmlNewElement(
00970 NULL,
00971 "to");
00972 for(i = 0; i < fipa_acl->receiver->num; i++) {
00973 agent_identifier_node = mxmlNewElement(
00974 node,
00975 "agent-identifier");
00976 name_node = mxmlNewElement(
00977 agent_identifier_node,
00978 "name");
00979 mxmlNewText(
00980 name_node,
00981 0,
00982 fipa_acl->receiver->fipa_agent_identifiers[i]->name);
00983
00984 addresses_node = mxmlNewElement(
00985 agent_identifier_node,
00986 "addresses");
00987 for(
00988 j = 0;
00989 j < fipa_acl->receiver->fipa_agent_identifiers[i]->addresses->num;
00990 j++
00991 )
00992 {
00993 url_node = mxmlNewElement(
00994 addresses_node,
00995 "url" );
00996 mxmlNewText(
00997 url_node,
00998 0,
00999 fipa_acl->receiver->fipa_agent_identifiers[i]->addresses->urls[j]->str );
01000 }
01001 }
01002 return node;
01003 }
01004
01005 mxml_node_t*
01006 fipa_envelope_Compose__from(fipa_acl_message_t* fipa_acl)
01007 {
01008 int i;
01009 extern mc_platform_p g_mc_platform;
01010 mxml_node_t* from_node;
01011 mxml_node_t* agent_identifier_node;
01012 mxml_node_t* name_node;
01013 mxml_node_t* addresses_node;
01014 mxml_node_t* url_node;
01015 dynstring_t* hostname;
01016 char buf[20];
01017
01018 from_node = mxmlNewElement(
01019 NULL,
01020 "from" );
01021 agent_identifier_node = mxmlNewElement(
01022 from_node,
01023 "agent-identifier" );
01024 name_node = mxmlNewElement(
01025 agent_identifier_node,
01026 "name" );
01027 mxmlNewText(
01028 name_node,
01029 0,
01030 fipa_acl->sender->name );
01031
01032
01033 addresses_node = mxmlNewElement(
01034 agent_identifier_node,
01035 "addresses");
01036 if (fipa_acl->sender->addresses != NULL) {
01037 if (fipa_acl->sender->addresses->num != 0) {
01038 for(i = 0; i < fipa_acl->sender->addresses->num; i++) {
01039 url_node = mxmlNewElement(
01040 addresses_node,
01041 "url" );
01042 mxmlNewText(
01043 url_node,
01044 0,
01045 fipa_acl->sender->addresses->urls[i]->str );
01046 }
01047 }
01048 } else {
01049 hostname = dynstring_New();
01050 url_node = mxmlNewElement(
01051 addresses_node,
01052 "url" );
01053 dynstring_Append(hostname, "http://");
01054 dynstring_Append(hostname, g_mc_platform->hostname);
01055 sprintf(buf, ":%d", g_mc_platform->port);
01056 dynstring_Append(hostname, buf);
01057 mxmlNewText(
01058 url_node,
01059 0,
01060 hostname->message );
01061 dynstring_Destroy(hostname);
01062 }
01063 return from_node;
01064 }
01065
01066 mxml_node_t*
01067 fipa_envelope_Compose__acl_representation(fipa_acl_message_t* fipa_acl)
01068 {
01069 mxml_node_t* node;
01070 node = mxmlNewElement(
01071 NULL,
01072 "acl-representation");
01073 mxmlNewText(
01074 node,
01075 0,
01076 "fipa.acl.rep.string.std");
01077 return node;
01078 }
01079
01080 mxml_node_t*
01081 fipa_envelope_Compose__payload_encoding(fipa_acl_message_t* fipa_acl)
01082 {
01083 mxml_node_t* node;
01084 node = mxmlNewElement(
01085 NULL,
01086 "payload-encoding");
01087 mxmlNewText(
01088 node,
01089 0,
01090 "US-ASCII" );
01091 return node;
01092 }
01093
01094 mxml_node_t*
01095 fipa_envelope_Compose__date(fipa_acl_message_t* fipa_acl)
01096 {
01097 time_t t;
01098 struct tm* mytm;
01099 char buf[30];
01100 mxml_node_t* node;
01101 t = time(NULL);
01102 mytm = localtime(&t);
01103 if (mytm == NULL) {
01104 fprintf(stderr, "time failure. %s:%d\n", __FILE__, __LINE__);
01105 return NULL;
01106 }
01107 if (strftime(buf, sizeof(buf), "%Y%m%dT%H%M%S000", mytm) == 0) {
01108 fprintf(stderr, "strftime failure. %s:%d\n", __FILE__, __LINE__);
01109 return NULL;
01110 }
01111
01112 node = mxmlNewElement(
01113 NULL,
01114 "date" );
01115 mxmlNewText(
01116 node,
01117 0,
01118 buf );
01119
01120 return node;
01121 }
01122