Add accessors for TR_MSG structure.
[trust_router.git] / common / tr_msg.c
index 2a149a6..6367476 100644 (file)
 #include <trust_router/tr_name.h>
 #include <trust_router/tid.h>
 
+enum msg_type tr_msg_get_msg_type(TR_MSG *msg) 
+{
+  return msg->msg_type;
+}
+
+void tr_msg_set_msg_type(TR_MSG *msg, enum msg_type type)
+{
+  msg->msg_type = type;
+}
+
+TID_REQ *tr_msg_get_req(TR_MSG *msg)
+{
+  return msg->tid_req;
+}
+
+void tr_msg_set_req(TR_MSG *msg, TID_REQ *req)
+{
+  msg->tid_req = req;
+}
+
+TID_RESP *tr_msg_get_resp(TR_MSG *msg)
+{
+  return msg->tid_resp;
+}
+
+void tr_msg_set_resp(TR_MSG *msg, TID_RESP *resp)
+{
+  msg->tid_resp = resp;
+}
+
 static json_t *tr_msg_encode_dh(DH *dh)
 {
   json_t *jdh = NULL;
@@ -112,6 +142,11 @@ static json_t * tr_msg_encode_tidreq(TID_REQ *req)
 
   jstr = json_string(req->comm->buf);
   json_object_set_new(jreq, "community", jstr);
+  
+  if (req->orig_coi) {
+    jstr = json_string(req->orig_coi->buf);
+    json_object_set_new(jreq, "orig_coi", jstr);
+  }
 
   json_object_set_new(jreq, "dh_info", tr_msg_encode_dh(req->tidc_dh));
   
@@ -198,6 +233,7 @@ static TID_SRVR_BLK *tr_msg_decode_one_server(json_t *jsrvr)
 
   if (NULL == (srvr = malloc(sizeof(TID_SRVR_BLK)))) 
     return NULL;
+  memset(srvr, 0, sizeof(TID_SRVR_BLK));
 
   if ((NULL == (jsrvr_addr = json_object_get(jsrvr, "server_addr"))) ||
       (NULL == (jsrvr_kn = json_object_get(jsrvr, "key_name"))) ||
@@ -244,7 +280,7 @@ static TID_SRVR_BLK *tr_msg_decode_servers(json_t *jservers)
   size_t i, num_servers;
 
   num_servers = json_array_size(jservers);
-  fprintf(stderr, "tr_msg_decode_servers(): Number of servers = %d.\n", num_servers);
+  fprintf(stderr, "tr_msg_decode_servers(): Number of servers = %u.\n", (unsigned) num_servers);
   
   if (0 == num_servers) {
     fprintf(stderr, "tr_msg_decode_servers(): Server array is empty.\n"); 
@@ -320,12 +356,12 @@ static TID_RESP *tr_msg_decode_tidresp(json_t *jresp)
 {
   TID_RESP *tresp = NULL;
   json_t *jresult = NULL;
-  json_t *jerr_msg = NULL;
   json_t *jrp_realm = NULL;
   json_t *jrealm = NULL;
   json_t *jcomm = NULL;
   json_t *jorig_coi = NULL;
   json_t *jservers = NULL;
+  json_t *jerr_msg = NULL;
 
   if (!(tresp = malloc(sizeof(TID_RESP)))) {
     fprintf (stderr, "tr_msg_decode_tidresp(): Error allocating TID_RESP structure.\n");
@@ -334,12 +370,15 @@ static TID_RESP *tr_msg_decode_tidresp(json_t *jresp)
  
   memset(tresp, 0, sizeof(TID_RESP));
 
-  /* store required fields from request */
+  /* store required fields from response */
   if ((NULL == (jresult = json_object_get(jresp, "result"))) ||
+      (!json_is_string(jresult)) ||
       (NULL == (jrp_realm = json_object_get(jresp, "rp_realm"))) ||
+      (!json_is_string(jrp_realm)) ||
       (NULL == (jrealm = json_object_get(jresp, "target_realm"))) ||
+      (!json_is_string(jrealm)) ||
       (NULL == (jcomm = json_object_get(jresp, "comm"))) ||
-      (NULL == (jservers = json_object_get(jresp, "servers")))) {
+      (!json_is_string(jcomm))) {
     fprintf (stderr, "tr_msg_decode_tidresp(): Error parsing response.\n");
     free(tresp);
     return NULL;
@@ -347,12 +386,20 @@ static TID_RESP *tr_msg_decode_tidresp(json_t *jresp)
 
   if (0 == (strcmp(json_string_value(jresult), "success"))) {
     fprintf(stderr, "tr_msg_decode_tidresp(): Success! result = %s.\n", json_string_value(jresult));
+    if ((NULL != (jservers = json_object_get(jresp, "servers"))) ||
+       (!json_is_array(jservers))) {
+      tresp->servers = tr_msg_decode_servers(jservers); 
+    } 
+    else {
+      return NULL;
+    }
     tresp->result = TID_SUCCESS;
   }
   else {
     tresp->result = TID_ERROR;
     fprintf(stderr, "tr_msg_decode_tidresp(): Error! result = %s.\n", json_string_value(jresult));
-    if (NULL != (jerr_msg = json_object_get(jresp, "err_msg"))) {
+    if ((NULL != (jerr_msg = json_object_get(jresp, "err_msg"))) ||
+       (!json_is_string(jerr_msg))) {
       tresp->err_msg = tr_new_name((char *)json_string_value(jerr_msg));
     }
   }
@@ -366,9 +413,7 @@ static TID_RESP *tr_msg_decode_tidresp(json_t *jresp)
       (!json_is_object(jorig_coi))) {
     tresp->orig_coi = tr_new_name((char *)json_string_value(jorig_coi));
   }
-
-  tresp->servers = tr_msg_decode_servers(jservers); 
-  
+     
   return tresp;
 }