/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 "include/fipa_acl_envelope.h"
00035 #include "include/mc_error.h"
00036 #include "include/mc_platform.h"
00037 
00038 /* fipa_acl_envelope_Received */
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 /* fipa_acl_Param */
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 /* fipa_acl_envelope */
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 /* Parsing Functions */
00156 int fipa_envelope_Parse(
00157     struct fipa_acl_envelope_s* envelope,
00158     const char* message)
00159 {
00160   /* Call mxml to parse the message */
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   /* Find the 'envelope' element */
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   /* Lets figure out how hany params there are */
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     /* There should be at least 1 param */
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   /* There are a bunch of agent identifiers that must be parsed inside the 
00259    * 'to' node. Let us first count the number */
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   /* Now we parse each one */
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   /* find the comments node, if there is one */
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   /* The comments node exists. Lets get it's contents */
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   /* find the comments node, if there is one */
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   /* The comments node exists. Lets get it's contents */
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   /* Count the number of agent id's in the node */
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   /* Allocate space in envelope */
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   /* Parse each one */
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   /* Need to parse the following nodes:
00576    *   received-by
00577    *   received-date
00578    * o received-from
00579    * o received-id
00580    * o received-via */
00581 
00582   /* received-by */
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   /* received-date */
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   /* received-from */
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   /* received-id */
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   /* received-via */
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   /* The child of 'name' better be some text! */
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   /* Here we expect any number of 'url' elements.
00735    * Let us count the number */
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   /* Now we must copy each one */
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   /* Here we must parse a set of agent identifiers. */
00802   
00803   /* First, find out how many resolvers there are */
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   /* Now we allocate space and parse */
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  * Composing Functions
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   /* FIXME: Only create 1 param for now. What's with multiple params? */
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 /*  mxmlAdd
00949     (
00950      node,
00951      MXML_ADD_AFTER,
00952      MXML_ADD_TO_PARENT,
00953      fipa_envelope_Compose__received(fipa_acl)
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   /* Compose Addresses */
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 

Generated on Fri May 16 14:49:54 2008 for Mobile-C by  doxygen 1.5.4