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