This patch introduces a prefix for the activator functions of C++ bundles.
Multiple bundles can now be linked into one application.
Change-Id: I7f345bf1a81eac9616adbf9b975a7f8565c8c172
Signed-off-by: Markus Jung <markus.jung@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2581
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Hun-je Yeon <hunje.yeon@samsung.com>
Reviewed-by: Madan Lanka <lanka.madan@samsung.com>
* @param bundleId Id of the Bundle
* @param bundleUri Uri of the bundle
* @param bundlePath Path of the bundle
+ * @param activator Activation prefix for .so bundles, or activator class name for .jar bundles
* @param params key-value pairs in string form for other Bundle parameters
*
*/
virtual void addBundle(const std::string &bundleId, const std::string &bundleUri, const std::string &bundlePath,
- std::map<std::string, std::string> params) = 0;
+ const std::string &activator, std::map<std::string, std::string> params) = 0;
/**
* API for removing the bundle from the container
*
}
}
-extern "C" void externalActivateBundle(ResourceContainerBundleAPI *resourceContainer,
+extern "C" void bmisensor_externalActivateBundle(ResourceContainerBundleAPI *resourceContainer,
std::string bundleId)
{
bundle = new BMISensorBundleActivator();
bundle->activateBundle(resourceContainer, bundleId);
}
-extern "C" void externalDeactivateBundle()
+extern "C" void bmisensor_externalDeactivateBundle()
{
bundle->deactivateBundle();
delete bundle;
}
-extern "C" void externalCreateResource(resourceInfo resourceInfo)
+extern "C" void bmisensor_externalCreateResource(resourceInfo resourceInfo)
{
bundle->createResource(resourceInfo);
}
-extern "C" void externalDestroyResource(BundleResource *pBundleResource)
+extern "C" void bmisensor_externalDestroyResource(BundleResource *pBundleResource)
{
bundle->destroyResource(pBundleResource);
-}
\ No newline at end of file
+}
cout << "Press enter to add SO bundle " << endl;
getchar();
std::map<string, string> bundleParams;
- container->addBundle("oic.bundle.hueSample", "", "libHueBundle.so", bundleParams);
+ container->addBundle("oic.bundle.hueSample", "", "libHueBundle.so", "test", bundleParams);
std::list<RCSBundleInfo *> bundles = container->listBundles();
std::list<RCSBundleInfo *>::iterator bundleIt;
}
}
-extern "C" void externalActivateBundle(ResourceContainerBundleAPI *resourceContainer,
+extern "C" void disensor_externalActivateBundle(ResourceContainerBundleAPI *resourceContainer,
std::string bundleId)
{
bundle = new DISensorBundleActivator();
bundle->activateBundle(resourceContainer, bundleId);
}
-extern "C" void externalDeactivateBundle()
+extern "C" void disensor_externalDeactivateBundle()
{
bundle->deactivateBundle();
delete bundle;
}
-extern "C" void externalCreateResource(resourceInfo resourceInfo)
+extern "C" void disensor_externalCreateResource(resourceInfo resourceInfo)
{
bundle->createResource(resourceInfo);
}
-extern "C" void externalDestroyResource(BundleResource *pBundleResource)
+extern "C" void disensor_externalDestroyResource(BundleResource *pBundleResource)
{
bundle->destroyResource(pBundleResource);
}
}
}
-extern "C" void externalActivateBundle(ResourceContainerBundleAPI *resourceContainer,
+extern "C" void huesample_externalActivateBundle(ResourceContainerBundleAPI *resourceContainer,
std::string bundleId)
{
bundle = new HueSampleBundleActivator();
bundle->activateBundle(resourceContainer, bundleId);
}
-extern "C" void externalDeactivateBundle()
+extern "C" void huesample_externalDeactivateBundle()
{
bundle->deactivateBundle();
delete bundle;
}
-extern "C" void externalCreateResource(resourceInfo resourceInfo)
+extern "C" void huesample_externalCreateResource(resourceInfo resourceInfo)
{
bundle->createResource(resourceInfo);
}
-extern "C" void externalDestroyResource(BundleResource *pBundleResource)
+extern "C" void huesample_externalDestroyResource(BundleResource *pBundleResource)
{
bundle->destroyResource(pBundleResource);
}
<bundle>
<id>oic.bundle.BMISensor</id>
<path>libBMISensorBundle.so</path>
+ <activator>bmisensor</activator>
<version>1.0.0</version>
<resources>
<resourceInfo>
<bundle>
<id>oic.bundle.hueSample</id>
<path>libHueBundle.so</path>
+ <activator>huesample</activator>
<version>1.0.0</version>
<resources>
<resourceInfo>
void stopBundle(const std::string &bundleId);
void addBundle(const std::string &bundleId, const std::string &bundleUri,
- const std::string &bundlePath, std::map< string, string > params);
+ const std::string &bundlePath, const std::string &activator, std::map< string, string > params);
void removeBundle(const std::string &bundleId);
std::list< RCSBundleInfo * > listBundles();
}
void ResourceContainerImpl::addBundle(const std::string &bundleId,
- const std::string &bundleUri, const std::string &bundlePath,
- std::map< string, string > params)
+ const std::string &bundleUri, const std::string &bundlePath,
+ const std::string &activator, std::map< string, string > params)
{
(void) bundleUri;
RCSBundleInfo *bundleInfo = RCSBundleInfo::build();
bundleInfo->setID(bundleId);
bundleInfo->setPath(bundlePath);
- if (params.find(BUNDLE_ACTIVATOR) != params.end())
+ bundleInfo->setActivatorName(activator);
+ if (params.find("libraryPath") != params.end())
{
- string activatorName = params[BUNDLE_ACTIVATOR];
+ string activatorName = params["activator"]; // modify activator for Java bundle
std::replace(activatorName.begin(), activatorName.end(), '.', '/');
((BundleInfoInternal *) bundleInfo)->setActivatorName(activatorName);
((BundleInfoInternal *)bundleInfo)->setLibraryPath(params[BUNDLE_LIBRARY_PATH]);
deactivator_t *bundleDeactivator = NULL;
resourceCreator_t *resourceCreator = NULL;
resourceDestroyer_t *resourceDestroyer = NULL;
-
+ BundleInfoInternal *bundleInfoInternal = (BundleInfoInternal*) bundleInfo;
void *bundleHandle = NULL;
bundleHandle = dlopen(bundleInfo->getPath().c_str(), RTLD_LAZY);
if (bundleHandle != NULL)
{
- bundleActivator = (activator_t *) dlsym(bundleHandle, "externalActivateBundle");
- bundleDeactivator = (deactivator_t *) dlsym(bundleHandle,
- "externalDeactivateBundle");
- resourceCreator = (resourceCreator_t *) dlsym(bundleHandle,
- "externalCreateResource");
- resourceDestroyer = (resourceDestroyer_t *) dlsym(bundleHandle,
- "externalDestroyResource");
+ bundleActivator =
+ (activator_t *) dlsym(bundleHandle,
+ ("" + bundleInfoInternal->getActivatorName()
+ + "_externalActivateBundle").c_str());
+ bundleDeactivator =
+ (deactivator_t *) dlsym(bundleHandle,
+ ("" + bundleInfoInternal->getActivatorName()
+ + "_externalDeactivateBundle").c_str());
+ resourceCreator =
+ (resourceCreator_t *) dlsym(bundleHandle,
+ ("" + bundleInfoInternal->getActivatorName()
+ + "_externalCreateResource").c_str());
+ resourceDestroyer =
+ (resourceDestroyer_t *) dlsym(bundleHandle,
+ ("" + bundleInfoInternal->getActivatorName()
+ + "_externalDestroyResource").c_str());
+
if ((error = dlerror()) != NULL)
{
}
#endif
}
-}
\ No newline at end of file
+}
<bundle>
<id>oic.bundle.test</id>
<path>libTestBundle.so</path>
+ <activator>test</activator>
<version>1.0.0</version>
<!--</bundle>-->
</container>
\ No newline at end of file
std::list<RCSBundleInfo *> bundles;
bundles = m_pResourceContainer->listBundles();
- m_pResourceContainer->addBundle("oic.bundle.test", "", "libTestBundle.so", bundleParams);
+ m_pResourceContainer->addBundle("oic.bundle.test", "", "libTestBundle.so","test", bundleParams);
EXPECT_EQ(bundles.size() + 1, m_pResourceContainer->listBundles().size());
EXPECT_TRUE(((BundleInfoInternal *)(*m_pResourceContainer->listBundles().begin()))->isLoaded());
std::map<string, string> bundleParams;
std::list<RCSBundleInfo *> bundles;
- m_pResourceContainer->addBundle("oic.bundle.test", "", "libTestBundle.so", bundleParams);
+ m_pResourceContainer->addBundle("oic.bundle.test", "", "libTestBundle.so", "test", bundleParams);
bundles = m_pResourceContainer->listBundles();
- m_pResourceContainer->addBundle("oic.bundle.test", "", "libTestBundle.so", bundleParams);
+ m_pResourceContainer->addBundle("oic.bundle.test", "", "libTestBundle.so", "test", bundleParams);
EXPECT_EQ(bundles.size(), m_pResourceContainer->listBundles().size());
}
TEST_F(ResourceContainerImplTest, SoBundleLoadedWhenRegisteredWithRegisterBundleAPI)
{
m_pBundleInfo->setPath("libTestBundle.so");
+ m_pBundleInfo->setActivatorName("test");
m_pBundleInfo->setVersion("1.0");
m_pBundleInfo->setLibraryPath(".");
m_pBundleInfo->setID("oic.bundle.test");
{
m_pBundleInfo->setPath("libTestBundle.so");
m_pBundleInfo->setVersion("1.0");
+ m_pBundleInfo->setActivatorName("test");
m_pBundleInfo->setLibraryPath("../.");
m_pBundleInfo->setID("oic.bundle.test");
TEST_F(ResourceContainerImplTest, BundleNotActivatedWhenNotRegistered)
{
m_pBundleInfo->setPath("libTestBundle.so");
+ m_pBundleInfo->setActivatorName("test");
m_pBundleInfo->setVersion("1.0");
m_pBundleInfo->setLibraryPath("../.");
m_pBundleInfo->setID("oic.bundle.test");
m_pBundleInfo->setPath("libTestBundle.so");
m_pBundleInfo->setVersion("1.0");
m_pBundleInfo->setLibraryPath("../.");
+ m_pBundleInfo->setActivatorName("test");
m_pBundleInfo->setID("oic.bundle.test");
m_pResourceContainer->registerBundle(m_pBundleInfo);
m_pBundleInfo->setPath("libTestBundle.so");
m_pBundleInfo->setVersion("1.0");
m_pBundleInfo->setLibraryPath("../.");
+ m_pBundleInfo->setActivatorName("test");
m_pBundleInfo->setID("oic.bundle.test");
m_pResourceContainer->registerBundle(m_pBundleInfo);
m_pBundleInfo->setPath("libTestBundle.so");
m_pBundleInfo->setVersion("1.0");
m_pBundleInfo->setLibraryPath("../.");
+ m_pBundleInfo->setActivatorName("test");
m_pBundleInfo->setID("oic.bundle.test");
m_pResourceContainer->registerBundle(m_pBundleInfo);
ptr->startMonitoring();
testObject->ChangeResourceState();
EXPECT_TRUE(isCalled);
-}
\ No newline at end of file
+}
<id>oic.bundle.test</id>
<path>libTestBundle.so</path>
<libraryPath>.</libraryPath>
+ <activator>test</activator>
<version>1.0.0</version>
<resources>
<resourceInfo>
m_pResourceContainer->unregisterResource(pBundleResource);
}
-extern "C" void externalActivateBundle(ResourceContainerBundleAPI *resourceContainer,
+extern "C" void test_externalActivateBundle(ResourceContainerBundleAPI *resourceContainer,
std::string bundleId)
{
bundle = new TestBundleActivator();
bundle->activateBundle(resourceContainer, bundleId);
}
-extern "C" void externalDeactivateBundle()
+extern "C" void test_externalDeactivateBundle()
{
bundle->deactivateBundle();
delete bundle;
}
-extern "C" void externalCreateResource(resourceInfo resourceInfo)
+extern "C" void test_externalCreateResource(resourceInfo resourceInfo)
{
bundle->createResource(resourceInfo);
}
-extern "C" void externalDestroyResource(BundleResource *pBundleResource)
+extern "C" void test_externalDestroyResource(BundleResource *pBundleResource)
{
bundle->destroyResource(pBundleResource);
}