Added support for A1 Policy Create message parsing

Signed-off-by: Ron Shacham <rshacham@research.att.com>
Change-Id: I002d447b0c908b94deda50e92ace58115bbe05aa
diff --git a/src/ts_xapp/ts_xapp.cpp b/src/ts_xapp/ts_xapp.cpp
index 4cb3ebc..5a760e6 100644
--- a/src/ts_xapp/ts_xapp.cpp
+++ b/src/ts_xapp/ts_xapp.cpp
@@ -85,6 +85,74 @@
 
 };
 
+struct PolicyHandler : public BaseReaderHandler<UTF8<>, PolicyHandler> {
+  unordered_map<string, string> cell_pred;
+  std::string ue_id;
+  bool ue_id_found = false;
+  string curr_key = "";
+  string curr_value = "";
+  int policy_type_id;
+  int policy_instance_id;
+  int threshold;
+  std::string operation;
+  bool found_threshold = false;
+
+  
+  bool Null() { cout << "Null()" << endl; return true; }
+  bool Bool(bool b) { cout << "Bool(" << boolalpha << b << ")" << endl; return true; }
+  bool Int(int i) {
+    cout << "Int(" << i << ")" << endl;
+    if (curr_key.compare("policy_type_id") == 0) {
+      policy_type_id = i;
+    } else if (curr_key.compare("policy_instance_id") == 0) {
+      policy_instance_id = i;
+    } else if (curr_key.compare("threshold") == 0) {
+      found_threshold = true;
+      threshold = i;
+    }
+
+    return true;
+  }
+  bool Uint(unsigned u) {
+    cout << "Int(" << u << ")" << endl;
+    if (curr_key.compare("policy_type_id") == 0) {
+      policy_type_id = u;
+    } else if (curr_key.compare("policy_instance_id") == 0) {
+      policy_instance_id = u;
+    } else if (curr_key.compare("threshold") == 0) {
+      found_threshold = true;
+      threshold = u;
+    }
+
+    return true;
+  }    
+  bool Int64(int64_t i) { cout << "Int64(" << i << ")" << endl; return true; }
+  bool Uint64(uint64_t u) { cout << "Uint64(" << u << ")" << endl; return true; }
+  bool Double(double d) { cout << "Double(" << d << ")" << endl; return true; }
+  bool String(const char* str, SizeType length, bool copy) {
+    cout << "String(" << str << ", " << length << ", " << boolalpha << copy << ")" << endl;
+    if (curr_key.compare("operation") != 0) {
+      operation = str;
+    }
+
+    return true;
+  }
+  bool StartObject() {
+    cout << "StartObject()" << endl;
+    return true;
+  }
+  bool Key(const char* str, SizeType length, bool copy) {
+    cout << "Key(" << str << ", " << length << ", " << boolalpha << copy << ")" << endl;
+    curr_key = str;
+
+    return true;
+  }
+  bool EndObject(SizeType memberCount) { cout << "EndObject(" << memberCount << ")" << endl; return true; }
+  bool StartArray() { cout << "StartArray()" << endl; return true; }
+  bool EndArray(SizeType elementCount) { cout << "EndArray(" << elementCount << ")" << endl; return true; }
+
+};
+
 struct PredictionHandler : public BaseReaderHandler<UTF8<>, PredictionHandler> {
   unordered_map<string, string> cell_pred;
   std::string ue_id;
@@ -266,8 +334,18 @@
   mbuf.Send_response( 101, -1, 5, (unsigned char *) "OK1\n" );	// validate that we can use the same buffer for 2 rts calls
   mbuf.Send_response( 101, -1, 5, (unsigned char *) "OK2\n" );
 
+  const char *arg = (const char*)payload.get();
+
+  PolicyHandler handler;
+  Reader reader;
+  StringStream ss(arg);
+  reader.Parse(ss,handler);
+
   //Set the threshold value
 
+  if (handler.found_threshold) {
+    rsrp_threshold = handler.threshold;
+  }
   
 }
 
@@ -363,11 +441,11 @@
 
   fprintf(stderr, "cb 1\n");
 
-  char *incoming_msg = "{\"12345\": {\"222\": \"20000\", \"333\" : \"50000\"} }";
+  const char* arg = (const char*)payload.get();
 
   PredictionHandler handler;
   Reader reader;
-  StringStream ss(incoming_msg);
+  StringStream ss(arg);
   reader.Parse(ss,handler);
 
   std::string pred_ue_id = handler.ue_id;
@@ -482,7 +560,7 @@
 
   nsu = Namespace(sdl_namespace_u);
   nsc = Namespace(sdl_namespace_c);
-  
+
   
   fprintf( stderr, "<XAPP> listening on port: %s\n", port );
   xfw = std::unique_ptr<Xapp>( new Xapp( port, true ) ); // new xAPP thing; wait for a route table