Modified Scene Manager Interface
authorChaJiwon <jw_wonny.cha@samsung.com>
Thu, 4 Feb 2016 04:52:48 +0000 (13:52 +0900)
committerUze Choi <uzchoi@samsung.com>
Thu, 18 Feb 2016 00:51:35 +0000 (00:51 +0000)
- SceneList, SceneCollection, Scene, SceneAction
- Apply interface to sceneserver sample

Change-Id: I7573566b568a6edad82b72da3866ede7b9589309
Signed-off-by: wonny <jw_wonny.cha@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/4931
Reviewed-by: JungHo Kim <jhyo.kim@samsung.com>
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
14 files changed:
service/scene-manager/SConscript
service/scene-manager/include/Scene.h
service/scene-manager/include/SceneAction.h
service/scene-manager/include/SceneCollection.h [moved from service/scene-manager/src/SceneCollection.h with 52% similarity]
service/scene-manager/include/SceneList.h
service/scene-manager/sampleapp/linux/SConscript
service/scene-manager/sampleapp/linux/fanserver.cpp [new file with mode: 0755]
service/scene-manager/sampleapp/linux/sceneserver.cpp
service/scene-manager/src/Scene.cpp
service/scene-manager/src/SceneAction.cpp
service/scene-manager/src/SceneCollection.cpp
service/scene-manager/src/SceneList.cpp
service/scene-manager/src/SceneMemberObject.cpp [deleted file]
service/scene-manager/src/SceneMemberObject.h [deleted file]

index 664b7d5..85295c8 100755 (executable)
@@ -81,7 +81,6 @@ if target_os == 'android':
 SCENE_SRC_DIR = './src/' 
 scenemanager_src = [
         SCENE_SRC_DIR + 'SceneCollection.cpp',
-        SCENE_SRC_DIR + 'SceneMemberObject.cpp',
         SCENE_SRC_DIR + 'SceneAction.cpp',
         SCENE_SRC_DIR + 'Scene.cpp',
         SCENE_SRC_DIR + 'SceneList.cpp',
index 1179cab..f295a54 100755 (executable)
 #ifndef SM_SCENE_H_
 #define SM_SCENE_H_
 
-#include "RCSRemoteResourceObject.h"
-#include "RCSResourceObject.h"
 #include "SceneAction.h"
 
 #include <vector>
-#include <memory>
 
 namespace OIC
 {
     namespace Service
     {
+        class SceneCollectionResourceObject;
         class Scene
         {
         public:
+//            class InvalidRemoteResourceObjectException: public RCSException
+//            {
+//            public:
+//                InvalidRemoteResourceObjectException(std::string&& what) :
+//                    RCSException{ std::move(what) } {}
+//            };
+
+            class InvalidExecuteCallbackException: public RCSException
+            {
+            public:
+                InvalidExecuteCallbackException(std::string&& what) :
+                    RCSException{ std::move(what) } {}
+            };
+
             typedef std::shared_ptr< Scene > Ptr;
-            typedef std::function< void(const RCSResourceAttributes&, int) > ExecuteCallback;
-        public:
-            Scene (const std::string&);
-            Scene(const std::string&, ExecuteCallback);
-            ~Scene();
+            typedef std::function< void(int) >  ExecuteCallback;
 
-            bool addSceneAction(const std::shared_ptr< SceneAction >&);
-            bool removeSceneAction(const std::shared_ptr< SceneAction >&);
+        private:
+            Scene(const Scene&) = default;
+            Scene(const std::string&, std::shared_ptr<SceneCollectionResourceObject>);
+            friend class SceneCollection;
 
-            bool execute();
+        public:
+            SceneAction::Ptr addNewSceneAction(const RCSRemoteResourceObject::Ptr&,
+                    const RCSResourceAttributes&);
+            SceneAction::Ptr addNewSceneAction(const RCSRemoteResourceObject::Ptr&, const std::string&,
+                    const RCSResourceAttributes::Value&);
 
-            void setCallback(ExecuteCallback);
+            std::vector<SceneAction::Ptr> getSceneAction(const RCSRemoteResourceObject::Ptr&) const;
+            std::vector<SceneAction::Ptr> getSceneActions() const ;
 
             std::string getName() const;
-            void setName(const std::string);
 
-        private:
-            void onSceneActionExecuteResult(const RCSResourceAttributes& attributes, int);
+            void removeSceneAction(const SceneAction::Ptr&);
+            void removeSceneAction(const RCSRemoteResourceObject::Ptr&);
+
+            void execute(ExecuteCallback);
 
         private:
-            std::string m_sceneName;
-            std::vector< std::shared_ptr< SceneAction > > m_sceneActionList;
-            ExecuteCallback m_callback;
-        };
+            std::string m_name;
+            std::shared_ptr< SceneCollectionResourceObject > m_sceneCollectionResourceObj;
 
+        };
     } /* namespace Service */
 } /* namespace OIC */
-
-#endif /* RH_HOSTINGOBJECT_H_ */
+#endif /* SM_SCENE_H_ */
 
index 51ff110..233e20f 100755 (executable)
 #ifndef SM_SCENEACTION_H_
 #define SM_SCENEACTION_H_
 
-#include "SceneMemberObject.h"
+#include "RCSRemoteResourceObject.h"
+#include "RCSResourceAttributes.h"
+
+#include <memory>
 
 namespace OIC
 {
     namespace Service
     {
+        class SceneMemberResourceObject;
         class SceneAction
         {
         public:
             typedef std::shared_ptr< SceneAction > Ptr;
-            typedef std::function< void(const RCSResourceAttributes&, int) > ExecuteCallback;
 
-        public:
-            SceneAction(const SceneMemberObject::Ptr&, const std::string&,
+        private:
+            SceneAction(const std::shared_ptr< SceneMemberResourceObject >,
+                    const std::string&, const RCSResourceAttributes&);
+            SceneAction(const std::shared_ptr< SceneMemberResourceObject >,
+                    const std::string&, const std::string&,
                     const RCSResourceAttributes::Value&);
+            friend class Scene;
 
-            bool execute();
+        public:
+            void update(const std::string&, RCSResourceAttributes::Value);
+            void update(const RCSResourceAttributes&);
 
-            void setCallback(ExecuteCallback);
+            const RCSResourceAttributes getAction();
+            RCSRemoteResourceObject::Ptr getRemoteResourceObject() const;
 
         private:
+            RCSRemoteResourceObject::Ptr m_pRemoteResourceObject;
+            std::string m_sceneName;
+            std::shared_ptr< SceneMemberResourceObject > m_sceneMemberResourceObj;
             RCSResourceAttributes m_attr;
-            SceneMemberObject::Ptr m_sceneMemberPtr;
-            ExecuteCallback m_callback;
         };
     } /* namespace Service */
 } /* namespace OIC */
-
 #endif /* SM_SCENEACTION_H_ */
-
similarity index 52%
rename from service/scene-manager/src/SceneCollection.h
rename to service/scene-manager/include/SceneCollection.h
index 4580aad..4d30760 100755 (executable)
 #ifndef SM_SCENECOLLECTION_H_
 #define SM_SCENECOLLECTION_H_
 
-#include <functional>
-#include <memory>
-
-#include "RCSResourceObject.h"
-#include "RCSRemoteResourceObject.h"
-#include "SceneMemberObject.h"
 #include "Scene.h"
+#include <functional>
+#include <map>
 
 namespace OIC
 {
     namespace Service
     {
-        class Scene;
+        class SceneCollectionResourceObject;
         class SceneCollection
         {
         public:
+            class InvalidSceneNameException: public RCSException
+            {
+                public:
+                InvalidSceneNameException(std::string&& what) :
+                    RCSException{ std::move(what) } {}
+            };
+
             typedef std::shared_ptr< SceneCollection > Ptr;
 
+        private:
+            SceneCollection(const std::shared_ptr< SceneCollectionResourceObject >&);
+            friend class SceneList;
+
         public:
-            SceneCollection();
+            Scene::Ptr addNewScene(const std::string&);
+            std::map< const std::string, Scene::Ptr > getScenes() const;
+            Scene::Ptr getScene(const std::string&) const;
+
+            void removeScene(Scene::Ptr);
 
             void setName(const std::string&);
             std::string getName() const;
-
-            std::string getUri() const;
             std::string getId() const;
 
-            Scene::Ptr addScene(const std::string&);
-            const std::vector< Scene::Ptr >& getSceneList();
-            bool removeScene(const Scene::Ptr&);
-
-            SceneMemberObject::Ptr addSceneMember(const RCSRemoteResourceObject::Ptr&);
-            const  std::vector< SceneMemberObject::Ptr >& getSceneMemberList();
-            bool removeSceneMember(SceneMemberObject::Ptr);
-
         private:
-            RCSSetResponse setRequestHandler(const RCSRequest&, RCSResourceAttributes&);
-            RCSSetResponse createSceneRequestHandler(const RCSRequest&, RCSResourceAttributes&);
-            RCSSetResponse executeSceneRequestHandler(const RCSRequest&, RCSResourceAttributes&);
-            RCSSetResponse createSceneMemberRequestHandler(const RCSRequest&,
-                    RCSResourceAttributes&);
-
-        private:
-            std::string m_Id;
-            std::string m_Uri;
-
-            std::vector< Scene::Ptr > m_SceneList;
-            std::vector< SceneMemberObject::Ptr > m_SceneMemberObjectList;
+            std::map< const std::string, Scene::Ptr > m_scenes;
+            std::shared_ptr< SceneCollectionResourceObject > m_sceneCollectionResourceObj;
 
-            RCSResourceObject::Ptr m_sceneCollectionResourcePtr;
         };
     } /* namespace Service */
 } /* namespace OIC */
index d30cd7e..9789aaa 100755 (executable)
 #ifndef SM_SCENELIST_H_
 #define SM_SCENELIST_H_
 
-#include <SceneCollection.h>
+#include "SceneCollection.h"
 
 #include <string>
-#include <memory>
 
 namespace OIC
 {
     namespace Service
     {
-//        class RCSResourceObject;
-        class RCSRemoteResourceObject;
-
+        class SceneListResourceObject;
         class SceneList
         {
-        public:
-            typedef std::shared_ptr< RCSRemoteResourceObject > RemoteObjectPtr;
-
         private:
-            SceneList();
             ~SceneList() = default;
 
         public:
-            static SceneList * getInstance();
-            SceneCollection::Ptr createSceneCollection();
+            static SceneList* getInstance();
+            SceneCollection::Ptr addNewSceneCollection();
+            std::vector<SceneCollection::Ptr> getSceneCollections() const;
+            void removeSceneCollection(SceneCollection::Ptr);
 
             void setName(const std::string&);
             std::string getName() const;
index a7f0292..37b568d 100755 (executable)
@@ -40,6 +40,7 @@ if 'rt' in scenemanager_sample_env.get('LIBS'):
 # Source files and Targets
 ######################################################################
 sceneserver = scenemanager_sample_env.Program('sceneserver', 'sceneserver.cpp')
+fanserver = scenemanager_sample_env.Program('fanserver', 'fanserver.cpp')
 lightserver = scenemanager_sample_env.Program('lightserver', 'lightserver.cpp')
 #groupclient = scenemanager_sample_env.Program('groupclient', 'groupclient.cpp')
 
diff --git a/service/scene-manager/sampleapp/linux/fanserver.cpp b/service/scene-manager/sampleapp/linux/fanserver.cpp
new file mode 100755 (executable)
index 0000000..4f6a3c7
--- /dev/null
@@ -0,0 +1,331 @@
+//******************************************************************
+//
+// Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.
+// Copyright 2014 Samsung Electronics All Rights Reserved.
+//
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+///
+/// This sample provides steps to define an interface for a resource
+/// (properties and methods) and host this resource on the server.
+///
+
+#include <functional>
+
+#include <pthread.h>
+#include <mutex>
+#include <condition_variable>
+
+#include "OCPlatform.h"
+#include "OCApi.h"
+
+using namespace OC;
+using namespace std;
+namespace PH = std::placeholders;
+
+int gObservation = 0;
+void * ChangeLightRepresentation(void *param);
+void * handleSlowResponse(void *param, std::shared_ptr< OCResourceRequest > pRequest);
+
+// Specifies secure or non-secure
+// false: non-secure resource
+// true: secure resource
+bool isSecure = false;
+
+/// Specifies whether Entity handler is going to do slow response or not
+bool isSlowResponse = false;
+
+// Forward declaring the entityHandler
+
+/// This class represents a single resource named 'lightResource'. This resource has
+/// two simple properties named 'state' and 'power'
+
+class FanResource
+{
+
+public:
+    /// Access this property from a TB client
+    std::string m_speed;
+    std::string m_fanUri;
+    OCResourceHandle m_resourceHandle;
+    OCRepresentation m_fanRep;
+
+public:
+    /// Constructor
+    FanResource() :
+            m_speed("10"), m_fanUri("/a/fan"), m_resourceHandle(0)
+    {
+        // Initialize representation
+        m_fanRep.setUri(m_fanUri);
+
+        m_fanRep.setValue("speed", m_speed);
+    }
+
+    /* Note that this does not need to be a member function: for classes you do not have
+     access to, you can accomplish this with a free function: */
+
+    /// This function internally calls registerResource API.
+    void createResource()
+    {
+        std::string resourceURI = m_fanUri; //URI of the resource
+        std::string resourceTypeName = "core.fan"; //resource type name. In this case, it is light
+        std::string resourceInterface = DEFAULT_INTERFACE; // resource interface.
+
+        EntityHandler cb = std::bind(&FanResource::entityHandler, this, PH::_1);
+
+        // This will internally create and register the resource.
+        OCStackResult result = OCPlatform::registerResource(m_resourceHandle, resourceURI,
+                resourceTypeName, resourceInterface, cb, OC_DISCOVERABLE | OC_OBSERVABLE);
+
+        if (OC_STACK_OK != result)
+        {
+            cout << "Resource creation was unsuccessful\n";
+        }
+        else
+        {
+            cout << "Resource URI : " << resourceURI << endl;
+            cout << "\tResource Type Name : " << resourceTypeName << endl;
+            cout << "\tResource Interface : " << DEFAULT_INTERFACE << endl;
+            cout << "\tResource creation is successful with resource handle : " << m_resourceHandle
+                    << endl;
+        }
+    }
+
+    OCResourceHandle getHandle()
+    {
+        return m_resourceHandle;
+    }
+
+    // Puts representation.
+    // Gets values from the representation and
+    // updates the internal state
+    void put(OCRepresentation& rep)
+    {
+        try
+        {
+            if (rep.getValue("speed", m_speed))
+            {
+                cout << "\t\t\t\t" << "speed: " << m_speed << endl;
+            }
+            else
+            {
+                cout << "\t\t\t\t" << "speed not found in the representation" << endl;
+            }
+        }
+        catch (exception& e)
+        {
+            cout << e.what() << endl;
+        }
+
+    }
+
+    // Post representation.
+    // Post can create new resource or simply act like put.
+    // Gets values from the representation and
+    // updates the internal state
+    OCRepresentation post(OCRepresentation& rep)
+    {
+        put(rep);
+        return get();
+    }
+
+    // gets the updated representation.
+    // Updates the representation with latest internal state before
+    // sending out.
+    OCRepresentation get()
+    {
+        m_fanRep.setValue("speed", m_speed);
+
+        return m_fanRep;
+    }
+
+    void addType(const std::string& type) const
+    {
+        OCStackResult result = OCPlatform::bindTypeToResource(m_resourceHandle, type);
+        if (OC_STACK_OK != result)
+        {
+            cout << "Binding TypeName to Resource was unsuccessful\n";
+        }
+    }
+
+    void addInterface(const std::string& interface) const
+    {
+        OCStackResult result = OCPlatform::bindInterfaceToResource(m_resourceHandle, interface);
+        if (OC_STACK_OK != result)
+        {
+            cout << "Binding TypeName to Resource was unsuccessful\n";
+        }
+    }
+
+private:
+// This is just a sample implementation of entity handler.
+// Entity handler can be implemented in several ways by the manufacturer
+    OCEntityHandlerResult entityHandler(std::shared_ptr< OCResourceRequest > request)
+    {
+        cout << "\tIn Server CPP entity handler:\n";
+        OCEntityHandlerResult ehResult = OC_EH_ERROR;
+        if (request)
+        {
+            // Get the request type and request flag
+            std::string requestType = request->getRequestType();
+            int requestFlag = request->getRequestHandlerFlag();
+
+            if (requestFlag & RequestHandlerFlag::RequestFlag)
+            {
+                cout << "\t\trequestFlag : Request\n";
+                auto pResponse = std::make_shared< OC::OCResourceResponse >();
+                pResponse->setRequestHandle(request->getRequestHandle());
+                pResponse->setResourceHandle(request->getResourceHandle());
+
+                // If the request type is GET
+                if (requestType == "GET")
+                {
+                    cout << "\t\t\trequestType : GET\n";
+                    if (isSlowResponse) // Slow response case
+                    {
+                        static int startedThread = 0;
+                        if (!startedThread)
+                        {
+                            std::thread t(handleSlowResponse, (void *) this, request);
+                            startedThread = 1;
+                            t.detach();
+                        }
+                        ehResult = OC_EH_SLOW;
+                    }
+                    else // normal response case.
+                    {
+                        pResponse->setErrorCode(200);
+                        pResponse->setResponseResult(OC_EH_OK);
+                        pResponse->setResourceRepresentation(get());
+                        if (OC_STACK_OK == OCPlatform::sendResponse(pResponse))
+                        {
+                            ehResult = OC_EH_OK;
+                        }
+                    }
+                }
+                else if (requestType == "PUT")
+                {
+                    cout << "\t\t\trequestType : PUT\n";
+                    OCRepresentation rep = request->getResourceRepresentation();
+
+                    // Do related operations related to PUT request
+                    // Update the lightResource
+                    put(rep);
+                    pResponse->setErrorCode(200);
+                    pResponse->setResponseResult(OC_EH_OK);
+                    pResponse->setResourceRepresentation(get());
+                    if (OC_STACK_OK == OCPlatform::sendResponse(pResponse))
+                    {
+                        ehResult = OC_EH_OK;
+                    }
+                }
+                else if (requestType == "POST")
+                {
+                    cout << "\t\t\trequestType : POST\n";
+
+                    OCRepresentation rep = request->getResourceRepresentation();
+
+                    // Do related operations related to POST request
+                    OCRepresentation rep_post = post(rep);
+                    pResponse->setResourceRepresentation(rep_post);
+                    pResponse->setErrorCode(200);
+                    if (rep_post.hasAttribute("createduri"))
+                    {
+                        pResponse->setResponseResult(OC_EH_RESOURCE_CREATED);
+                        pResponse->setNewResourceUri(
+                                rep_post.getValue< std::string >("createduri"));
+                    }
+
+                    if (OC_STACK_OK == OCPlatform::sendResponse(pResponse))
+                    {
+                        ehResult = OC_EH_OK;
+                    }
+                }
+                else if (requestType == "DELETE")
+                {
+                    // DELETE request operations
+                }
+            }
+        }
+        else
+        {
+            std::cout << "Request invalid" << std::endl;
+        }
+
+        return ehResult;
+    }
+};
+
+void * handleSlowResponse(void *param, std::shared_ptr< OCResourceRequest > pRequest)
+{
+    // This function handles slow response case
+    FanResource* fanPtr = (FanResource*) param;
+    // Induce a case for slow response by using sleep
+    std::cout << "SLOW response" << std::endl;
+    sleep(10);
+
+    auto pResponse = std::make_shared< OC::OCResourceResponse >();
+    pResponse->setRequestHandle(pRequest->getRequestHandle());
+    pResponse->setResourceHandle(pRequest->getResourceHandle());
+    pResponse->setResourceRepresentation(fanPtr->get());
+    pResponse->setErrorCode(200);
+    pResponse->setResponseResult(OC_EH_OK);
+
+    // Set the slow response flag back to false
+    isSlowResponse = false;
+    OCPlatform::sendResponse(pResponse);
+    return NULL;
+}
+
+int main()
+{
+    // Create PlatformConfig object
+    PlatformConfig cfg
+    { OC::ServiceType::InProc, OC::ModeType::Server, "0.0.0.0",
+    // By setting to "0.0.0.0", it binds to all available interfaces
+            0,// Uses randomly available port
+            OC::QualityOfService::LowQos };
+
+    OCPlatform::Configure(cfg);
+    try
+    {
+        // Create the instance of the resource class
+        // (in this case instance of class 'LightResource').
+        FanResource myFan;
+
+        // Invoke createResource function of class light.
+        myFan.createResource();
+
+        // A condition variable will free the mutex it is given, then do a non-
+        // intensive block until 'notify' is called on it.  In this case, since we
+        // don't ever call cv.notify, this should be a non-processor intensive version
+        // of while(true);
+        std::mutex blocker;
+        std::condition_variable cv;
+        std::unique_lock < std::mutex > lock(blocker);
+        cv.wait(lock);
+    }
+    catch (OCException e)
+    {
+        //log(e.what());
+    }
+
+    // No explicit call to stop the platform.
+    // When OCPlatform::destructor is invoked, internally we do platform cleanup
+
+    return 0;
+}
index 04290cb..996d980 100755 (executable)
 #include "RCSDiscoveryManager.h"
 #include "RCSRemoteResourceObject.h"
 #include "RCSResourceAttributes.h"
+#include "RCSResourceObject.h"
 #include "RCSAddress.h"
 #include "SceneList.h"
 
 using namespace OC;
 using namespace OIC::Service;
 
-constexpr int CREATE_SCENE = 1;
-constexpr int EXECUTE_SCENE = 2;
+constexpr int CREATE_SCENE_LIST = 1;
+constexpr int CREATE_SCENE_COLLECTION = 2;
+constexpr int GET_SCENE_COLLECTIONS = 3;
+constexpr int CREATE_SCENE = 4;
+constexpr int GET_SCENE = 5;
+constexpr int EXECUTE_SCENE = 6;
+constexpr int GET_SCENE_ACTION = 7;
+constexpr int UPDATE_SCENE_ACTION = 8;
 
 struct CloseApp {};
 
-const std::string resourceType = "core.light";
+const std::vector<std::string> resourceTypes{"core.light", "core.fan"};
 const std::string relativetUri = OC_RSRVD_WELL_KNOWN_URI;
 
 std::mutex mtx;
@@ -46,17 +53,16 @@ RCSRemoteResourceObject::Ptr g_selectedResource;
 std::shared_ptr<RCSRemoteResourceObject> g_discoveredResources;
 
 std::vector<RCSRemoteResourceObject::Ptr> g_foundResourceList;
-
 std::vector<RCSResourceObject::Ptr> g_memberResourceList;
 
 SceneCollection::Ptr g_sceneColObj;
 Scene::Ptr g_scene;
-std::vector<SceneMemberObject::Ptr> g_sceneMemObj;
+SceneAction::Ptr g_sceneAction;
 
 typedef std::function<void(std::shared_ptr<RCSRemoteResourceObject>)> DiscoveryCallback;
-typedef std::function<void (const RCSResourceAttributes&, int)> ExecuteCallback;
+typedef std::function<void (int)> ExecuteCallback;
 
-void onExecute(const RCSResourceAttributes& attrs, int /*Code*/)
+void onExecute(int /*Code*/)
 {
     std::cout << __func__ << std::endl;
 }
@@ -109,45 +115,106 @@ bool discoverResource()
 {
     std::cout << "Wait 2 seconds until discovered." << std::endl;
 
+
     try
     {
-        RCSDiscoveryManager::getInstance()->discoverResourceByType(RCSAddress::multicast(),
-                relativetUri, "core.light", &onResourceDiscovered);
+        RCSDiscoveryManager::getInstance()->discoverResourceByTypes(RCSAddress::multicast(),
+                relativetUri, resourceTypes, &onResourceDiscovered);
     }
     catch(const RCSPlatformException& e)
     {
          std::cout << e.what() << std::endl;
     }
     std::unique_lock<std::mutex> lck(mtx);
-    cond.wait_for(lck, std::chrono::seconds(2));
 
+    cond.wait_for(lck, std::chrono::seconds(4));
     return g_discoveredResources != nullptr;
 }
 
-void createScene()
+void createSceneList()
+{
+    SceneList::getInstance()->setName("sceneList Name");
+    std::cout << SceneList::getInstance()->getName() << std::endl;
+}
+
+void createSceneCollection()
 {
-    if(g_foundResourceList.size() == 0)
+    g_sceneColObj = SceneList::getInstance()->addNewSceneCollection();
+    g_sceneColObj->setName("Living Room");
+    std::cout << "Created CollectionName : " << g_sceneColObj->getName() << std::endl;
+    std::cout << "Id : " << g_sceneColObj->getId() << std::endl;
+
+    g_sceneColObj = SceneList::getInstance()->addNewSceneCollection();
+    g_sceneColObj->setName("Kitchen");
+    std::cout << "Created CollectionName : " << g_sceneColObj->getName() << std::endl;
+    std::cout << "Id : " << g_sceneColObj->getId() << std::endl;
+}
+
+void getSceneCollection()
+{
+    auto sceneCollectionList = SceneList::getInstance()->getSceneCollections();
+    int i = 1;
+
+    for(const auto& it : sceneCollectionList)
     {
-        std::cout << "First, find a light resource" << std::endl;
-        return ;
+        std::cout << i++ << "." << it->getName() << std::endl;
     }
+}
 
-    g_sceneColObj = SceneList::getInstance()->createSceneCollection();
+void createScene()
+{
+    g_scene = g_sceneColObj->addNewScene("Going Out");
+    g_scene->addNewSceneAction(g_foundResourceList.at(0), "power", "off");
+    g_scene->addNewSceneAction(g_foundResourceList.at(1), "speed", "10");
 
-    g_scene = g_sceneColObj->addScene("allbulbsson");
-    g_scene->setCallback(onExecute);
+    g_sceneColObj->addNewScene("Cooking");
 
-    for(const auto &it : g_foundResourceList)
+    auto sceneList = g_sceneColObj->getScenes();
+    for(const auto &it : sceneList)
     {
-        g_sceneMemObj.push_back(g_sceneColObj->addSceneMember(it));
-        g_scene->addSceneAction(std::make_shared< SceneAction >(g_sceneMemObj.at(0), "power", "off"));
+        std::cout << it.first << std::endl;
     }
 }
 
+void getScene()
+{
+    auto sceneList = g_sceneColObj->getScenes();
+    for(const auto &it : sceneList)
+    {
+        std::cout << it.first << std::endl;
+    }
+
+    g_scene = g_sceneColObj->getScene("Going Out");
+}
+
 void executeScene()
 {
-    if(g_scene != nullptr)
-        g_scene->execute();
+    g_scene->execute(onExecute);
+    std::cout << "execute scene!" << std::endl;
+}
+
+void getSceneAction()
+{
+    auto sceneActionList = g_scene->getSceneActions();
+    std::cout << g_scene->getName() << std::endl;
+    for(const auto &it : sceneActionList)
+    {
+        std::cout << it.use_count() << std::endl;
+        std::cout << it->getRemoteResourceObject()->getUri() << std::endl;
+        auto attr = it->getAction();
+        for(const auto &att : attr)
+        {
+            std::cout << att.key() << " : "  << att.value().toString() << std::endl;
+        }
+    }
+    auto sceneActions = g_scene->getSceneAction(g_foundResourceList.at(0));
+    g_sceneAction = sceneActions.at(0);
+}
+
+void updateSceneAction()
+{
+    g_sceneAction->update("power", "on");
+    executeScene();
 }
 
 int main()
@@ -163,20 +230,44 @@ int main()
         try
         {
             std::cout << "========================================================\n";
-            std::cout << CREATE_SCENE  << ". Create a Scene                       \n";
-            std::cout << EXECUTE_SCENE << ". Execute a Scene                      \n";
+            std::cout << CREATE_SCENE_LIST  << ". Create a SceneList                       \n";
+            std::cout << CREATE_SCENE_COLLECTION << ". Create a SceneCollection                     \n";
+            std::cout << GET_SCENE_COLLECTIONS << ". Get SceneCollections                      \n";
+            std::cout << CREATE_SCENE << ". Create a Scene                      \n";
+            std::cout << GET_SCENE << ". Get a Scene                      \n";
+            std::cout << EXECUTE_SCENE << ". Execute Scene                      \n";
+            std::cout << GET_SCENE_ACTION << ". Get a SceneAction                      \n";
+            std::cout << UPDATE_SCENE_ACTION << ". Update SceneAction                      \n";
             std::cout << "========================================================\n";
 
-            command = processUserInput(CREATE_SCENE, EXECUTE_SCENE);
+            command = processUserInput(CREATE_SCENE_LIST, UPDATE_SCENE_ACTION);
 
             switch(command)
             {
-            case CREATE_SCENE:
-                createScene();
-                break;
-            case EXECUTE_SCENE:
-                executeScene();
-                break;
+                case CREATE_SCENE_LIST:
+                    createSceneList();
+                    break;
+                case CREATE_SCENE_COLLECTION:
+                    createSceneCollection();
+                    break;
+                case GET_SCENE_COLLECTIONS:
+                    getSceneCollection();
+                    break;
+                case CREATE_SCENE:
+                    createScene();
+                    break;
+                case GET_SCENE:
+                    getScene();
+                    break;
+                case EXECUTE_SCENE:
+                    executeScene();
+                    break;
+                case GET_SCENE_ACTION:
+                    getSceneAction();
+                    break;
+                case UPDATE_SCENE_ACTION:
+                    updateSceneAction();
+                    break;
             }
         }
         catch (const std::exception& e)
index 3abe16f..494598c 100755 (executable)
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 #include "Scene.h"
+#include "SceneCollectionResourceObject.h"
 
-#include <iostream>
+#include <algorithm>
 
 namespace OIC
 {
     namespace Service
     {
+        Scene::Scene(const std::string& sceneName,
+                SceneCollectionResourceObject::Ptr sceneCollectionResource) :
+                m_name(sceneName), m_sceneCollectionResourceObj(sceneCollectionResource) {}
 
-        Scene::Scene(const std::string& sceneName, ExecuteCallback cb) :
-                m_sceneName(sceneName), m_callback(std::move(cb))
+        SceneAction::Ptr Scene::addNewSceneAction(
+               const RCSRemoteResourceObject::Ptr& RCSRemoteResourceObjectPtr,
+               const std::string& key, const RCSResourceAttributes::Value& value)
         {
-        }
+            RCSResourceAttributes resAttr;
+            resAttr[key] = RCSResourceAttributes::Value(value);
 
-        Scene::Scene(const std::string& sceneName) :
-                m_sceneName(sceneName)
-        {
+            return addNewSceneAction(RCSRemoteResourceObjectPtr, resAttr);
         }
 
-        Scene::~Scene()
+        SceneAction::Ptr Scene::addNewSceneAction(
+                const RCSRemoteResourceObject::Ptr& RCSRemoteResourceObjectPtr,
+                const RCSResourceAttributes& attr)
         {
-            m_sceneActionList.clear();
-        }
+            if(RCSRemoteResourceObjectPtr == nullptr)
+            {
+                throw RCSInvalidParameterException("RCSRemoteResoureObjectPtr value is null");
+            }
 
-        bool Scene::addSceneAction(const SceneAction::Ptr& newSceneAction)
-        {
-            if(newSceneAction == nullptr)
+            SceneMemberResourceObject::Ptr sceneMemberResObj;
+            auto members = m_sceneCollectionResourceObj->getSceneMembers();
+            auto check = std::find_if(members.begin(), members.end(), [&RCSRemoteResourceObjectPtr] (
+                    const SceneMemberResourceObject::Ptr it){
+                return it->getRemoteResourceObject() == RCSRemoteResourceObjectPtr;});
+
+            if(check != members.end())
             {
-                throw RCSInvalidParameterException { "SceneAction is empty!" };
+                sceneMemberResObj = *check;
             }
 
-            newSceneAction->setCallback(
-                    std::bind(&Scene::onSceneActionExecuteResult, this, std::placeholders::_1,
-                            std::placeholders::_2));
-            m_sceneActionList.push_back(newSceneAction);
+            else
+            {
+                sceneMemberResObj = SceneMemberResourceObject::createSceneMemberResource(
+                        RCSRemoteResourceObjectPtr);
+                m_sceneCollectionResourceObj->addSceneMember(sceneMemberResObj);
+            }
 
-            return true;
-        }
-        bool Scene::removeSceneAction(const SceneAction::Ptr& sceneAction)
-        {
-            // TODO
+            SceneAction::Ptr sceneActionPtr(new SceneAction(sceneMemberResObj, m_name, attr));
+            return sceneActionPtr;
         }
 
-        void Scene::setCallback(ExecuteCallback cb)
+        std::vector< SceneAction::Ptr > Scene::getSceneAction( // need to confirm return type vector or Ptr
+                const RCSRemoteResourceObject::Ptr& RCSRemoteResourceObjectPtr) const
         {
-            if(cb == nullptr)
+            std::vector<SceneAction::Ptr> actions;
+            auto sceneMemberResObjs = m_sceneCollectionResourceObj->getSceneMembers();
+            for(const auto& member: sceneMemberResObjs)
             {
-                throw RCSInvalidParameterException { "callback is empty!" };
+                if(member->getRemoteResourceObject() == RCSRemoteResourceObjectPtr)
+                {
+                    auto mappingInfo = member->getMappingInfo();
+                    for(const auto& it: mappingInfo)
+                    {
+                        if(it.sceneName == m_name)
+                        {
+                            SceneAction::Ptr sceneActionPtr(new SceneAction(
+                                    member, m_name, it.key, it.value));
+                            actions.push_back(sceneActionPtr);
+                        }
+                    }
+                }
             }
-
-            m_callback = std::move(cb);
+            return actions;
         }
 
-        bool Scene::execute()
+        std::vector< SceneAction::Ptr > Scene::getSceneActions() const
         {
-            for (const auto& it : m_sceneActionList)
+            std::vector<SceneAction::Ptr> actions;
+            auto sceneMemberResObjs = m_sceneCollectionResourceObj->getSceneMembers();
+            for(const auto& member: sceneMemberResObjs)
             {
-                if (it->execute() == false)
+                auto mappingInfo = member->getMappingInfo();
+                for(const auto& it : mappingInfo)
                 {
-                    return false;
+                    if(it.sceneName == m_name)
+                    {
+                        SceneAction::Ptr sceneActionPtr(new SceneAction(
+                                member, m_name, it.key, it.value));
+//                        SceneAction::WeakPtr sceneActionWeakPtr(sceneActionPtr);
+                        actions.push_back(sceneActionPtr);
+                    }
                 }
             }
-            return true;
+            return actions;
         }
 
         std::string Scene::getName() const
         {
-            return m_sceneName;
+            return m_name;
         }
 
-        void Scene::setName(const std::string name)
+        void Scene::removeSceneAction(const SceneAction::Ptr& sceneActionPtr)
         {
-            m_sceneName = name;
+//            TODO
         }
 
-        void Scene::onSceneActionExecuteResult(const RCSResourceAttributes& attributes, int eCode)
+        void Scene::removeSceneAction(
+                const RCSRemoteResourceObject::Ptr& RCSRemoteResourceObjectPtr)
         {
-            if (attributes.empty())
-            {
-                std::cout << "\tattributes is empty" << std::endl;
-            }
-
-            for (const auto& attr : attributes)
-            {
-                std::cout << "\tkey : " << attr.key() << std::endl << "\tvalue : "
-                        << attr.value().toString() << std::endl;
-
-                if (m_callback != nullptr)
-                {
-                    m_callback(attributes, eCode);
-                }
-            }
+//            TODO
         }
 
+        void Scene::execute(ExecuteCallback cb)
+        {
+            m_sceneCollectionResourceObj->execute(m_name, cb);
+        }
     } /* namespace Service */
 } /* namespace OIC */
-
index c3335d4..5e01914 100755 (executable)
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 #include "SceneAction.h"
+#include "SceneMemberResourceObject.h"
 
 namespace OIC
 {
     namespace Service
     {
-        SceneAction::SceneAction(const SceneMemberObject::Ptr& SceneMemberObjectPtr,
-                const std::string& key, const RCSResourceAttributes::Value& value) :
-                m_sceneMemberPtr(SceneMemberObjectPtr)
+        SceneAction::SceneAction(const SceneMemberResourceObject::Ptr SceneMemberResource,
+                const std::string& sceneName, const RCSResourceAttributes& attr) :
+                m_pRemoteResourceObject(SceneMemberResource->getRemoteResourceObject()),
+                m_sceneName(sceneName),
+                m_sceneMemberResourceObj(SceneMemberResource)
         {
-            m_attr[key] = RCSResourceAttributes::Value(value);
+            for (const auto& it : attr)
+            {
+                m_sceneMemberResourceObj->addMappingInfo(
+                        SceneMemberResourceObject::MappingInfo(m_sceneName, it.key(), it.value()));
+            }
         }
 
-        void SceneAction::setCallback(ExecuteCallback cb)
+        SceneAction::SceneAction(const SceneMemberResourceObject::Ptr SceneMemberResource,
+                const std::string& sceneName, const std::string& key,
+                const RCSResourceAttributes::Value& value) :
+                m_pRemoteResourceObject(SceneMemberResource->getRemoteResourceObject()),
+                m_sceneName(sceneName), m_sceneMemberResourceObj(SceneMemberResource)
         {
-            if (cb == nullptr)
+            m_sceneMemberResourceObj->addMappingInfo(
+                                SceneMemberResourceObject::MappingInfo(m_sceneName, key, value));
+        }
+
+        void SceneAction::update(const std::string& key,
+                RCSResourceAttributes::Value value)
+        {
+            m_attr[key] = value;
+            update(m_attr);
+        }
+
+        void SceneAction::update(const RCSResourceAttributes& attr)
+        {
+            for(const auto& it : attr)
             {
-                throw RCSInvalidParameterException { "Callback is empty!" };
+                m_sceneMemberResourceObj->addMappingInfo(
+                        SceneMemberResourceObject::MappingInfo(m_sceneName, it.key(), it.value()));
             }
+        }
 
-            m_callback = std::move(cb);
+        const RCSResourceAttributes SceneAction::getAction()
+        {
+            m_attr.clear();
+            auto mappingInfo = m_sceneMemberResourceObj->getMappingInfo();
+            for(const auto& it : mappingInfo)
+            {
+                if(it.sceneName == m_sceneName)
+                {
+                    m_attr[it.key] = RCSResourceAttributes::Value(it.value);
+                }
+            }
+            return m_attr;
         }
 
-        bool SceneAction::execute()
+        RCSRemoteResourceObject::Ptr SceneAction::getRemoteResourceObject() const
         {
-            m_sceneMemberPtr->getRemoteResourceObject()->setRemoteAttributes(m_attr, m_callback);
-            return true;
+            return m_pRemoteResourceObject;
         }
+
     } /* namespace Service */
 } /* namespace OIC */
 
index 1cdfee5..e6bec4e 100755 (executable)
@@ -19,8 +19,8 @@
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 #include "SceneCollection.h"
+#include "SceneCollectionResourceObject.h"
 
-#include "uuid/uuid.h"
 #include "octypes.h"
 #include "ocrandom.h"
 
@@ -28,208 +28,68 @@ namespace OIC
 {
     namespace Service
     {
-        namespace
-        {
-            unsigned int numSceneCollection = 0;
-
-            const std::string PREFIX_SCENE_COLLECTION_URI = "/a/sceneCollection/";
-            const std::string LAST_SCENE = "lastScene";
-            const std::string SCENE_VALUES = "sceneValues";
-            const std::string SCENE_COLLECTION_NAME = "n";
-            const std::string SCENE_COLLECTION_ID = "id";
-            const std::string SCENE_RTS = "rts";
-            const std::string SCENE_RTS_VALUE = "oic.r.scenemember";
-            const std::string SCENE_PAYLOAD_LINK = "link";
+        SceneCollection::SceneCollection(
+                const SceneCollectionResourceObject::Ptr& sceneCollectionResource) :
+                m_sceneCollectionResourceObj(sceneCollectionResource) {}
 
-            const std::string SCENE_COLLECTION_RT = "oic.wk.scenecollection";
+        Scene::Ptr SceneCollection::addNewScene(const std::string& sceneName)
+        {
+            if(sceneName.empty())
+            {
+                throw RCSInvalidParameterException("Scene name is an empty string");
+            }
 
+            m_sceneCollectionResourceObj->addScene(sceneName);
 
-            std::string OICGenerateUUIDStr()
+            for (const auto& it : m_scenes)
             {
-                uint8_t uuid[UUID_SIZE] = { 0, };
-                char uuidStr[UUID_STRING_SIZE] = { 0, };
-                if(RAND_UUID_OK == OCGenerateUuid(uuid))
+                if (it.first.compare(sceneName) == 0)
                 {
-                    if(RAND_UUID_OK == OCConvertUuidToString(uuid, uuidStr))
-                    {
-                        return std::string(uuidStr);
-                    }
+                    return it.second;
                 }
-                return "";
             }
-        }
-
-        SceneCollection::SceneCollection()
-        : m_Id(), m_Uri(PREFIX_SCENE_COLLECTION_URI + std::to_string(numSceneCollection++))
-        {
-            m_Id = OICGenerateUUIDStr();
-            if(m_Id == "")
-            {
-                // TODO handle uuid creation fail.
-            }
-
-            m_sceneCollectionResourcePtr = RCSResourceObject::Builder(m_Uri, SCENE_COLLECTION_RT,
-                    OC_RSRVD_INTERFACE_DEFAULT).setDiscoverable(true).setObservable(true).build();
-
-            m_sceneCollectionResourcePtr->setAttribute(LAST_SCENE, "");
-            m_sceneCollectionResourcePtr->setAttribute(SCENE_VALUES, std::vector<std::string>());
-            m_sceneCollectionResourcePtr->setAttribute(SCENE_COLLECTION_NAME, "");
-            m_sceneCollectionResourcePtr->setAttribute(SCENE_COLLECTION_ID, m_Id);
-            m_sceneCollectionResourcePtr->setAttribute(SCENE_RTS, SCENE_RTS_VALUE);
-
-
-            m_sceneCollectionResourcePtr->setSetRequestHandler(
-                    std::bind(
-                            &SceneCollection::setRequestHandler, this,
-                            std::placeholders::_1, std::placeholders::_2));
-        }
-
-        const std::vector< Scene::Ptr >& SceneCollection::getSceneList()
-        {
-            return m_SceneList;
-        }
 
-        void SceneCollection::setName(const std::string& sceneCollectionName)
-        {
-            m_sceneCollectionResourcePtr->setAttribute(SCENE_COLLECTION_NAME, sceneCollectionName);
-        }
+            Scene::Ptr scenePtr(new Scene(sceneName, m_sceneCollectionResourceObj));
+            m_scenes.insert(std::pair<const std::string, Scene::Ptr>(sceneName, scenePtr));
 
-        std::string SceneCollection::getName() const
-        {
-            return m_sceneCollectionResourcePtr->
-                    getAttributeValue(SCENE_COLLECTION_NAME).get<std::string>();
+            return scenePtr;
         }
 
-        std::string SceneCollection::getUri() const
-        {
-            return m_Uri;
-        }
-
-        std::string SceneCollection::getId() const
+        std::map< const std::string, Scene::Ptr > SceneCollection::getScenes() const
         {
-            return m_Id;
+            return m_scenes;
         }
 
-        Scene::Ptr SceneCollection::addScene(const std::string& sceneName)
+        Scene::Ptr SceneCollection::getScene(const std::string& sceneName) const
         {
-            Scene::Ptr m_scene = std::make_shared < Scene > (sceneName);
-            m_SceneList.push_back(m_scene);
-            return m_scene;
-        }
-
-        bool SceneCollection::removeScene(const Scene::Ptr& it)
-        {
-            // remove scene
-            // remove scene Name list
-        }
-
-        SceneMemberObject::Ptr SceneCollection::addSceneMember(
-                const RCSRemoteResourceObject::Ptr& it)
-        {
-            auto newSceneMemberObj = std::make_shared < SceneMemberObject > (it);
-            m_SceneMemberObjectList.push_back(newSceneMemberObj);
-            return newSceneMemberObj;
-        }
-
-        bool SceneCollection::removeSceneMember(SceneMemberObject::Ptr it)
-        {
-        }
-
-        const std::vector< SceneMemberObject::Ptr >& SceneCollection::getSceneMemberList()
-        {
-            return m_SceneMemberObjectList;
-        }
-
-        RCSSetResponse
-        SceneCollection::setRequestHandler(
-                const RCSRequest & request, RCSResourceAttributes & attributes)
-        {
-            if(attributes.contains(SCENE_PAYLOAD_LINK))
+            auto it = m_scenes.find(sceneName);
+            if (it != m_scenes.end())
             {
-                return createSceneMemberRequestHandler(request, attributes);
-            }
-
-            if(attributes.contains(SCENE_VALUES))
-            {
-                return createSceneRequestHandler(request, attributes);
+                return it->second;
             }
+        }
 
-            if(attributes.contains(LAST_SCENE))
+        void SceneCollection::removeScene(Scene::Ptr scenePtr)
+        {
+            if (scenePtr == nullptr)
             {
-                return executeSceneRequestHandler(request, attributes);
+                throw RCSInvalidParameterException("Scene Ptr is empty!");
             }
-
-
-            return RCSSetResponse::create(attributes, (int)OC_STACK_ERROR)
-            .setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
         }
 
-        RCSSetResponse
-        SceneCollection::createSceneMemberRequestHandler(
-                const RCSRequest &, RCSResourceAttributes & attributes)
+        void SceneCollection::setName(const std::string& name)
         {
-            std::string request_key = attributes.at(SCENE_PAYLOAD_LINK).get<std::string>();
-            // TODO create scene member
-
-            attributes.at(SCENE_COLLECTION_ID) = m_Id;
-
-            return RCSSetResponse::create(attributes)
-            .setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
+            m_sceneCollectionResourceObj->setName(name);
         }
 
-        RCSSetResponse
-        SceneCollection::createSceneRequestHandler(
-                const RCSRequest &, RCSResourceAttributes & attributes)
+        std::string SceneCollection::getName() const
         {
-            std::vector<std::string> request_key
-                = attributes.at(SCENE_VALUES).get<std::vector<std::string>>();
-
-            std::vector<std::string> newScene;
-            std::vector<std::string>::iterator iter = request_key.begin();
-            std::vector<Scene::Ptr>::iterator foundScene;
-
-            struct FindSceneName
-            {
-                bool operator()(Scene::Ptr scene) const { return scene->getName() == name; }
-                std::string name;
-            };
-
-            while(iter != request_key.end())
-            {
-                FindSceneName fScene;
-                fScene.name = *iter;
-                foundScene = std::find_if(m_SceneList.begin(), m_SceneList.end(), fScene);
-                if(foundScene == m_SceneList.end())
-                {
-                    newScene.push_back(*iter);
-                }
-                iter++;
-            }
-
-            for(unsigned int i = 0; i < newScene.size(); ++i)
-            {
-                // TODO create scene
-                newScene[i]; //Scene Value
-            }
-
-
-            // success
-            return RCSSetResponse::create(attributes)
-            .setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
+            return m_sceneCollectionResourceObj->getName();
         }
 
-        RCSSetResponse
-        SceneCollection::executeSceneRequestHandler(
-                const RCSRequest &, RCSResourceAttributes & attributes)
+        std::string SceneCollection::getId() const
         {
-            std::string request_key = attributes.at(LAST_SCENE).get<std::string>();
-            m_sceneCollectionResourcePtr->setAttribute(LAST_SCENE, request_key);
-
-            // TODO execute scene
-
-            // success
-            return RCSSetResponse::create(attributes)
-            .setAcceptanceMethod(RCSSetResponse::AcceptanceMethod::IGNORE);
+            return m_sceneCollectionResourceObj->getId();
         }
     } /* namespace Service */
 } /* namespace OIC */
index fcea9f5..5d0c5bf 100755 (executable)
@@ -19,6 +19,8 @@
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 #include "SceneList.h"
+#include "SceneListResourceObject.h"
+#include "SceneCollectionResourceObject.h"
 
 #include "RCSRequest.h"
 #include "PrimitiveResource.h"
@@ -28,83 +30,53 @@ namespace OIC
 {
     namespace Service
     {
-        namespace
+        SceneList * SceneList::getInstance()
         {
-            const std::string SCENE_LIST_NAME = "n";
-            const std::string SCENE_LIST_ID = "id";
-            const std::string SCENE_LIST_LINK = "link";
-            const std::string SCENE_LIST_RTS = "rts";
-            const std::string SCENE_LIST_RTS_VALUE = "oic.wk.scenecollection";
-            const std::string SCENE_LIST_RT_NAME = "oic.wk.scenelist";
-            const std::string SCENE_LIST_URI = "/SceneListResURI";
-            const std::string SCENE_LIST_DEFAULT_NAME = "list of scene Collections";
-            const std::string COAP_TAG = "coap://";
-
-            RCSResourceObject::Ptr sceneListResourcePtr;
-            // < std::string uri, SceneCollection::Ptr collection_instance >
-            std::map< std::string, SceneCollection::Ptr > sceneCollections;
-
-            RCSSetResponse setRequestHandler(const RCSRequest & /*request*/,
-                    RCSResourceAttributes & attributes)
-            {
-                auto newObject = SceneList::getInstance()->createSceneCollection();
-
-                if (newObject == nullptr)
-                {
-                    return RCSSetResponse::create(attributes, (int) OC_STACK_ERROR).setAcceptanceMethod(
-                            RCSSetResponse::AcceptanceMethod::IGNORE);
-                }
-
-                newObject->setName(attributes.at(SCENE_LIST_NAME).get< std::string >());
-
-                attributes.at(SCENE_LIST_ID) = newObject->getId();
-                attributes.at(SCENE_LIST_LINK) = COAP_TAG + newObject->getUri();
-
-                return RCSSetResponse::create(attributes).setAcceptanceMethod(
-                        RCSSetResponse::AcceptanceMethod::IGNORE);
-            }
+            static SceneList instance;
+            return &instance;
         }
 
-        SceneList::SceneList()
+        SceneCollection::Ptr SceneList::addNewSceneCollection()
         {
-            sceneListResourcePtr = RCSResourceObject::Builder(SCENE_LIST_URI, SCENE_LIST_RT_NAME,
-            OC_RSRVD_INTERFACE_DEFAULT).setDiscoverable(true).setObservable(false).build();
+            auto sceneCollectionResObj =
+                    SceneCollectionResourceObject::createSceneCollectionObject();
+            SceneListResourceObject::getInstance()->addSceneCollectionResource(sceneCollectionResObj);
 
-            sceneListResourcePtr->setAttribute(SCENE_LIST_NAME, SCENE_LIST_DEFAULT_NAME);
-            sceneListResourcePtr->setAttribute(SCENE_LIST_RTS, SCENE_LIST_RTS_VALUE);
-            sceneListResourcePtr->setSetRequestHandler(&setRequestHandler);
+            SceneCollection::Ptr sceneCollectionPtr(new SceneCollection(sceneCollectionResObj));
+            return sceneCollectionPtr;
         }
 
-        SceneList* SceneList::getInstance()
+        std::vector< SceneCollection::Ptr > SceneList::getSceneCollections() const
         {
-            static SceneList instance;
-            return &instance;
+            std::vector<SceneCollection::Ptr> sceneCollections;
+            auto sceneCollectionResObjs = SceneListResourceObject::getInstance()->getSceneCollections();
+            for(const auto& it : sceneCollectionResObjs)
+            {
+                SceneCollection::Ptr sceneCollectionPtr(new SceneCollection(it));
+                sceneCollections.push_back(sceneCollectionPtr);
+            }
+            return sceneCollections;
         }
 
-        SceneCollection::Ptr SceneList::createSceneCollection()
+        void SceneList::removeSceneCollection(SceneCollection::Ptr sceneCollectionPtr)
         {
-            auto newSceneCollectionObj = std::make_shared< SceneCollection >();
-
-            if (newSceneCollectionObj != nullptr)
-            {
-                sceneCollections.insert(
-                        std::make_pair(newSceneCollectionObj->getUri(), newSceneCollectionObj));
-                // TODO : bind resource!!
-                return newSceneCollectionObj;
-            }
-            return nullptr;
+//            TODO : remove logic
+//            if (sceneCollectionPtr == nullptr)
+//            {
+//                throw RCSInvalidParameterException
+//                { "Scene Collection Ptr is empty!" };
+//            }
         }
 
-        void SceneList::setName(const std::string& name)
+        void SceneList::setName(const std::string& sceneListName)
         {
-            sceneListResourcePtr->setAttribute(SCENE_LIST_NAME, name);
+            SceneListResourceObject::getInstance()->setName(sceneListName);
         }
 
         std::string SceneList::getName() const
         {
-            return sceneListResourcePtr->getAttributeValue(SCENE_LIST_NAME).toString();
+            return SceneListResourceObject::getInstance()->getName();
         }
-
     } /* namespace Service */
 } /* namespace OIC */
 
diff --git a/service/scene-manager/src/SceneMemberObject.cpp b/service/scene-manager/src/SceneMemberObject.cpp
deleted file mode 100755 (executable)
index 149cb48..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-//******************************************************************
-//
-// Copyright 2016 Samsung Electronics All Rights Reserved.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-#include "SceneMemberObject.h"
-
-namespace OIC
-{
-    namespace Service
-    {
-        namespace
-        {
-            unsigned int m_numSceneMember = 0;
-
-            const std::string SCENE_MEMBER_RT = "oic.r.scenemember";
-        }
-
-        SceneMemberObject::SceneMemberObject(RCSRemoteResourceObject::Ptr it) :
-                link{ it->getUri() }
-        {
-            RemoteObjectPtr = it;
-
-            std::string resourceUri = "/a/sceneMember" + std::to_string(m_numSceneMember++);
-            sceneMemberResourcePtr = RCSResourceObject::Builder(resourceUri, SCENE_MEMBER_RT,
-                    OC_RSRVD_INTERFACE_DEFAULT).setDiscoverable(true).setObservable(true).build();
-
-            sceneMemberResourcePtr->setAutoNotifyPolicy(RCSResourceObject::AutoNotifyPolicy::NEVER);
-            sceneMemberResourcePtr->setSetRequestHandlerPolicy(
-                    RCSResourceObject::SetRequestHandlerPolicy::NEVER);
-
-            sceneMemberResourcePtr->setAttribute("link", it->getUri());
-        }
-
-        void SceneMemberObject::setName(std::string sceneMemberName)
-        {
-            name = sceneMemberName;
-            sceneMemberResourcePtr->setAttribute("name", sceneMemberName);
-        }
-
-        std::string SceneMemberObject::getName()
-        {
-            return name;
-        }
-
-        RCSResourceAttributes SceneMemberObject::getSceneMappingItem(std::string sceneName)
-        {
-            for (const auto& it : sceneMapping)
-            {
-                if (it.first == sceneName)
-                    return it.second;
-            }
-        }
-
-        std::map< std::string, RCSResourceAttributes > SceneMemberObject::getSceneMapping()
-        {
-            return sceneMapping;
-        }
-
-        bool SceneMemberObject::hasSceneMappingitem(std::string sceneName)
-        {
-            if (sceneMapping.find(sceneName) == sceneMapping.end())
-                return false;
-            return true;
-        }
-
-        RCSRemoteResourceObject::Ptr SceneMemberObject::getRemoteResourceObject()
-        {
-            return RemoteObjectPtr;
-        }
-
-    } /* namespace Service */
-} /* namespace OIC */
-
diff --git a/service/scene-manager/src/SceneMemberObject.h b/service/scene-manager/src/SceneMemberObject.h
deleted file mode 100755 (executable)
index 033026d..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-//******************************************************************
-//
-// Copyright 2016 Samsung Electronics All Rights Reserved.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-#ifndef SM_SCENEMEMBEROBJECT_H_
-#define SM_SCENEMEMBEROBJECT_H_
-
-#include <cstdbool>
-#include <list>
-#include <functional>
-#include <string>
-#include <map>
-
-#include "octypes.h"
-
-#include "RCSRemoteResourceObject.h"
-#include "RCSResourceObject.h"
-
-namespace OIC
-{
-    namespace Service
-    {
-        class SceneMemberObject
-        {
-        public:
-            typedef std::shared_ptr< SceneMemberObject > Ptr;
-
-        public:
-            SceneMemberObject(RCSRemoteResourceObject::Ptr);
-
-        public:
-            void setName(std::string);
-            std::string getName();
-
-            RCSResourceAttributes getSceneMappingItem(std::string);
-            std::map< std::string, RCSResourceAttributes > getSceneMapping();
-            bool hasSceneMappingitem(std::string);
-            RCSRemoteResourceObject::Ptr getRemoteResourceObject();
-
-        private:
-            unsigned int Id;
-            std::string name;
-            std::string link;
-            std::map< std::string, RCSResourceAttributes > sceneMapping;
-
-            RCSRemoteResourceObject::Ptr RemoteObjectPtr;
-            RCSResourceObject::Ptr sceneMemberResourcePtr;
-        };
-    } /* namespace Service */
-} /* namespace OIC */
-#endif /* SM_SCENEMEMBEROBJECT_H_ */