plugins load ftw
authorKevron Rees <kevron_m_rees@linux.intel.com>
Wed, 8 Aug 2012 20:57:16 +0000 (13:57 -0700)
committerKevron Rees <kevron_m_rees@linux.intel.com>
Wed, 8 Aug 2012 20:57:16 +0000 (13:57 -0700)
ambd/pluginloader.cpp
ambd/pluginloader.h
automotive-message-broker.odp

index 118c2e0..a905354 100644 (file)
@@ -45,73 +45,78 @@ PluginLoader::PluginLoader(string configFile): f_create(NULL)
                throw std::runtime_error("Failed to load config");
        }
        
-       JsonReader* reader = json_reader_new(json_parser_get_root(parser));
+       JsonNode* node = json_parser_get_root(parser);
+       
+       if(node == nullptr)
+               throw std::runtime_error("Unable to get JSON root object");
+       
+       JsonReader* reader = json_reader_new(node);
        
        if(reader == nullptr)
                throw std::runtime_error("Unable to create JSON reader");
        
-       json_reader_read_member(reader,"sources");
+       DebugOut()<<"Config members: "<<json_reader_count_members(reader)<<endl;
        
-       JsonNode* sourcesNode = json_reader_get_value(reader);
+       gchar** members = json_reader_list_members(reader);
        
-       if(sourcesNode != nullptr)
+       for(int i=0; i< json_reader_count_members(reader); i++)
        {
-
-               JsonArray* sourcesArray = json_node_get_array(sourcesNode);
-
-               int sourcesLength = json_array_get_length(sourcesArray);
-
-               for(int i=0; i < sourcesLength; i++)
-               {
-                       string path = json_array_get_string_element(sourcesArray,i);
-                       AbstractSource* plugin = loadPlugin<AbstractSource*>(path);
-                       
-                       if(plugin != nullptr)
-                               mSources.push_back(plugin);
-               }
-                       
-               json_reader_end_member(reader);
-               g_object_unref(sourcesArray);
+               cout<<"member: "<<members[i]<<endl;
        }
        
-       else 
+       json_reader_read_member(reader,"sources");
+       
+       const GError * srcReadError = json_reader_get_error(reader);
+       
+       if(srcReadError != nullptr)
        {
-               DebugOut()<<"Config contains no sources."<<endl;
+               DebugOut()<<"Error getting sources member: "<<srcReadError->message<<endl;
+               throw std::runtime_error("Error getting sources member");
        }
        
-       ///read the sinks:
-               
-       json_reader_read_member(reader,"sinks");
+       g_assert(json_reader_is_array(reader));
        
-       JsonNode* sinksNode = json_reader_get_value(reader);
        
-       if(sinksNode != nullptr)
-       {
        
-               JsonArray* sinksArray = json_node_get_array(sinksNode);
+       for(int i=0; i < json_reader_count_elements(reader); i++)
+       {
+               json_reader_read_element(reader,i);
                
-               int sinksLength = json_array_get_length(sinksArray);
+               string path = json_reader_get_string_value(reader);
+               AbstractSource* plugin = loadPlugin<AbstractSource*>(path);
                
-               for(int i=0; i < sinksLength; i++)
-               {
-                       string path = json_array_get_string_element(sinksArray,i);
-                       AbstractSink* plugin = loadPlugin<AbstractSink*>(path);
+               if(plugin != nullptr)
+                       mSources.push_back(plugin);
+               
+               json_reader_end_element(reader);
+       }
                        
-                       if(plugin != nullptr)
-                               mSinks.push_back(plugin);
-               }
+       json_reader_end_member(reader);
+
+       ///read the sinks:
                
-               json_reader_end_member(reader);
-               g_object_unref(sinksArray);
+       json_reader_read_member(reader,"sinks");
+                       
+       for(int i=0; i < json_reader_count_elements(reader); i++)
+       {
+               json_reader_read_element(reader,i);
+               
+               string path = json_reader_get_string_value(reader);
+               AbstractSink* plugin = loadPlugin<AbstractSink*>(path);
+               
+               if(plugin != nullptr)
+                       mSinks.push_back(plugin);
+               
+               json_reader_end_element(reader);
        }
        
+       json_reader_end_member(reader);
+       
        ///TODO: this will probably explode:
        
        g_error_free(error);
        g_object_unref(reader);
        g_object_unref(parser);
-       g_object_unref(sourcesNode);
-       g_object_unref(sinksNode);
        
 }
 
index 3be6820..773580e 100644 (file)
@@ -54,7 +54,7 @@ private: ///methods:
        template<class T>
        T loadPlugin(string pluginName)
        {
-               DebugOut()<<"Loading plugin: "<<pluginName;
+               DebugOut()<<"Loading plugin: "<<pluginName<<endl;
                
                if(lt_dlinit())
                {
@@ -65,18 +65,18 @@ private: ///methods:
                
                lt_dlerror();
                
-               lt_dlhandle handle = lt_dlopenext(mPluginPath.c_str());
+               lt_dlhandle handle = lt_dlopenext(pluginName.c_str());
                
                if(!handle)
                {
                        mErrorString = lt_dlerror();
-                       cerr<<"error opening plugin: "<<mPluginPath<<" in "<<__FILE__<<" - "<<__FUNCTION__<<":"<<__LINE__<<" "<<mErrorString<<endl;
+                       cerr<<"error opening plugin: "<<pluginName<<" in "<<__FILE__<<" - "<<__FUNCTION__<<":"<<__LINE__<<" "<<mErrorString<<endl;
                        return nullptr;
                }
                
                f_create = (create_t *)lt_dlsym(handle, "create");
                
-               mErrorString = lt_dlerror();
+               //mErrorString = lt_dlerror();
                
                if(f_create) 
                {
index 6bcbe22..53a9575 100644 (file)
Binary files a/automotive-message-broker.odp and b/automotive-message-broker.odp differ