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