Incorporating changes to Xapp Descriptor
[ric-app/hw.git] / src / xapp.cc
index ca737e6..c9cd5da 100644 (file)
@@ -20,7 +20,6 @@
  * xapp.cc
  *
  *  Created on: Mar, 2020
- *  Author: Shraboni Jana
  */
 
 #include "xapp.hpp"
@@ -32,43 +31,56 @@ Xapp::Xapp(XappSettings &config, XappRmr &rmr){
        return;
 }
 
-
-Xapp::Xapp(XappSettings &config, XappRmr &rmr, XappSDL &sdl){
-       rmr_ref = &rmr;
-       config_ref = &config;
-       sdl_ref = &sdl;
-       //sdl_ref.insert_data();
-       xapp_mutex = NULL;
-
-       return;
-}
 Xapp::~Xapp(void){
 
        //Joining the threads
        int threadcnt = xapp_rcv_thread.size();
-       for(int i=0; i<threadcnt; i++){
-               if(xapp_rcv_thread[i].joinable())
-                       xapp_rcv_thread[i].join();
+               for(int i=0; i<threadcnt; i++){
+                       if(xapp_rcv_thread[i].joinable())
+                               xapp_rcv_thread[i].join();
+       }
+       xapp_rcv_thread.clear();
+
+       if(xapp_mutex!=NULL){
+               xapp_mutex->~mutex();
+               delete xapp_mutex;
        }
-       delete xapp_mutex;
 };
+
+//stop the xapp.
+void Xapp::stop(void){
+  // Get the mutex lock
+       std::lock_guard<std::mutex> guard(*xapp_mutex);
+       rmr_ref->set_listen(false);
+       rmr_ref->~XappRmr();
+
+}
+
+void Xapp::init() {
+
+       //get rnib information
+       get_rnib_gnblist();
+
+
+}
 void Xapp::startup() {
        //send subscriptions and read A1 policies.
        startup_subscribe_requests();
-       startup_get_policies();
+       //startup_get_policies();
        return;
 }
 
-void Xapp::start_xapp_receiver(){
+void Xapp::start_xapp_receiver(XappMsgHandler& mp_handler){
        //start a receiver thread. Can be multiple receiver threads for more than 1 listening port.
-
+       rmr_ref->set_listen(true);
        xapp_mutex = new std::mutex();
 
-       std::vector<std::unique_ptr <XappMsgHandler>> message_procs;
        mdclog_write(MDCLOG_INFO,"Receiver Thread file= %s, line=%d",__FILE__,__LINE__);
-       std::unique_ptr<XappMsgHandler> mp_handler = std::make_unique<XappMsgHandler>();
+       //std::unique_ptr<XappMsgHandler> mp_handler = std::make_unique<XappMsgHandler>();
+       //auto mp_handler = _callbacks[0];
        std::lock_guard<std::mutex> guard(*xapp_mutex);
-       std::thread th_recv([&](){ rmr_ref->xapp_rmr_receive(std::move(*mp_handler.get()), rmr_ref);});
+       std::thread th_recv([&](){ rmr_ref->xapp_rmr_receive(std::move(mp_handler), rmr_ref);});
+
        xapp_rcv_thread.push_back(std::move(th_recv));
 
 
@@ -87,17 +99,13 @@ void Xapp::shutdown(){
 void Xapp::startup_subscribe_requests(void ){
    size_t data_size = ASN_BUFF_MAX_SIZE;
    unsigned char       data[data_size];
-
-   std::vector<std::string> gNodeBs;
-   gNodeBs.push_back("GNB1001"); //this line should come from RNIB
-
-
-   for(auto &it: gNodeBs){
+   std::string xapp_id = config_ref->operator [](XappSettings::SettingName::XAPP_ID);
+   for(auto &it: rnib_gnblist){
      int attempt = 0;
-        XappMsgHandler msg;
+        XappMsgHandler msg = XappMsgHandler(xapp_id);
 
/*     bool res_encode = msg.encode_subscription_request(data, &data_size);
-        if(!res_encode) exit(0);*/
       //bool res_encode = msg.encode_subscription_request(data, &data_size);
+        //if(!res_encode) exit(0);
        char *strMsg = "HelloWorld\0";
        strncpy((char *)data,strMsg,strlen(strMsg));
        data_size = sizeof(data);
@@ -109,6 +117,8 @@ void Xapp::startup_subscribe_requests(void ){
 
                 auto transmitter = std::bind(&XappRmr::xapp_rmr_send,rmr_ref, &rmr_header, (void*)data);
                 transmitter(); //this will go to subscription manager.
+                //rmr_ref->xapp_rmr_call(&rmr_header,(char*)strMsg);
+
                 break;
      }
    }
@@ -129,25 +139,44 @@ void Xapp::startup_get_policies(void){
   free(message);
 
 }
-void Xapp::sdl_data(void) {
-       sdl_ref->insert_data();
-}
-/*void Xapp::rnib_data(void) {
 
-          printf("Using rnibreader lib from C:\n");
-          open();
+void Xapp::set_rnib_gnblist(void) {
+
+          openSdl();
           void *result = getListGnbIds();
           if(result == NULL){
-
-               printf("ERROR: no data from getListGnbIds\n");
+                   mdclog_write(MDCLOG_ERR, "ERROR: no data from getListGnbIds\n");
                return;
            }
-           printf("getListGnbIds response: %s\n", (char *)result);
-           close();
-           free(result);
+
+           mdclog_write(MDCLOG_INFO, "GNB List in R-NIB %s\n", (char*)result);
+
+           Document doc;
+           doc.Parse((char*)result);
+           assert(doc.HasMember("gnb_list"));
+
+
+           const Value& gnblist = doc["gnb_list"];
+           if (gnblist.IsNull())
            return;
 
-}*/
+           assert(gnblist.IsArray());
+
+           for (SizeType i = 0; i < gnblist.Size(); i++) // Uses SizeType instead of size_t
+           {
+               assert(gnblist[i].IsObject());
+               const Value& gnbobj = gnblist[i];
+               assert(gnbobj.HasMember("inventory_name"));
+               assert(gnbobj["inventory_name"].IsString());
+               rnib_gnblist.push_back(gnbobj["inventory_name"].GetString());
+
+           }
+           closeSdl();
+
+           //delete result;
+           return;
+
+}