/home/dko/projects/mobilec/trunk/src/fipa_envelope.c

Go to the documentation of this file.
00001 /*[
00002  * Copyright (c) 2007 Integration Engineering Laboratory
00003                       University of California, Davis
00004  *
00005  * Permission to use, copy, and distribute this software and its
00006  * documentation for any purpose with or without fee is hereby granted,
00007  * provided that the above copyright notice appear in all copies and
00008  * that both that copyright notice and this permission notice appear
00009  * in supporting documentation.
00010  *
00011  * Permission to modify the software is granted, but not the right to
00012  * distribute the complete modified source code.  Modifications are to
00013  * be distributed as patches to the released version.  Permission to
00014  * distribute binaries produced by compiling modified sources is granted,
00015  * provided you
00016  *   1. distribute the corresponding source modifications from the
00017  *    released version in the form of a patch file along with the binaries,
00018  *   2. add special version identification to distinguish your version
00019  *    in addition to the base release version number,
00020  *   3. provide your name and address as the primary contact for the
00021  *    support of your modified version, and
00022  *   4. retain our contact information in regard to use of the base
00023  *    software.
00024  * Permission to distribute the released version of the source code along
00025  * with corresponding source modifications in the form of a patch file is
00026  * granted with same provisions 2 through 4 for binary distributions.
00027  *
00028  * This software is provided "as is" without express or implied warranty
00029  * to the extent permitted by applicable law.
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 /* fipa_acl_envelope_Received */
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 /* fipa_acl_Param */
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 /* fipa_acl_envelope */
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 /* Parsing Functions */
00157 int fipa_envelope_Parse(
00158     struct fipa_acl_envelope_s* envelope,
00159     const char* message)
00160 {
00161   /* Call mxml to parse the message */
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   /* Find the 'envelope' element */
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   /* Lets figure out how hany params there are */
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     /* There should be at least 1 param */
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   /* There are a bunch of agent identifiers that must be parsed inside the 
00260    * 'to' node. Let us first count the number */
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   /* Now we parse each one */
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   /* find the comments node, if there is one */
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   /* The comments node exists. Lets get it's contents */
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   /* find the comments node, if there is one */
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   /* The comments node exists. Lets get it's contents */
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   /* Count the number of agent id's in the node */
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   /* Allocate space in envelope */
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   /* Parse each one */
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   /* Need to parse the following nodes:
00577    *   received-by
00578    *   received-date
00579    * o received-from
00580    * o received-id
00581    * o received-via */
00582 
00583   /* received-by */
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   /* received-date */
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   /* received-from */
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   /* received-id */
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   /* received-via */
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   /* The child of 'name' better be some text! */
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   /* Here we expect any number of 'url' elements.
00736    * Let us count the number */
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   /* Now we must copy each one */
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   /* Here we must parse a set of agent identifiers. */
00803   
00804   /* First, find out how many resolvers there are */
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   /* Now we allocate space and parse */
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  * Composing Functions
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   /* FIXME: Only create 1 param for now. What's with multiple params? */
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 /*  mxmlAdd
00950     (
00951      node,
00952      MXML_ADD_AFTER,
00953      MXML_ADD_TO_PARENT,
00954      fipa_envelope_Compose__received(fipa_acl)
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   /* Compose Addresses */
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 

Generated on Mon Jun 23 16:01:09 2008 for Mobile-C by  doxygen 1.5.4