Update Broker architecture.
authorjyong2.kim <jyong2.kim@samsung.com>
Mon, 22 Jun 2015 04:19:57 +0000 (13:19 +0900)
committerUze Choi <uzchoi@samsung.com>
Mon, 22 Jun 2015 06:41:30 +0000 (06:41 +0000)
Modify Architecture about Resource Presence managing by Broker directly instead of DevicePresence.
Add Class DeviceAssociation that manage device handle.
Delete unused function.

Change-Id: I1c9e39d0388ba808169e1c763daba8a8943e3189
Signed-off-by: jyong2.kim <jyong2.kim@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/1372
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
service/basis/resourceBroker/SConscript
service/basis/resourceBroker/include/BrokerTypes.h
service/basis/resourceBroker/include/DeviceAssociation.h [new file with mode: 0644]
service/basis/resourceBroker/include/DevicePresence.h
service/basis/resourceBroker/include/ResourceBroker.h
service/basis/resourceBroker/include/ResourcePresence.h
service/basis/resourceBroker/src/DeviceAssociation.cpp [new file with mode: 0644]
service/basis/resourceBroker/src/DevicePresence.cpp
service/basis/resourceBroker/src/ResourceBroker.cpp
service/basis/resourceBroker/src/ResourcePresence.cpp

index 4780137..40b26eb 100755 (executable)
@@ -58,9 +58,11 @@ if target_os == 'linux':
 ######################################################################
 BROKER_SRC_DIR = 'src/'
 resourcebroker_src = [
-        BROKER_SRC_DIR + 'ResourceBroker.cpp',
+        BROKER_SRC_DIR + 'DeviceAssociation.cpp',
+        BROKER_SRC_DIR + 'DevicePresence.cpp',
         BROKER_SRC_DIR + 'ResourcePresence.cpp',
-        BROKER_SRC_DIR + 'DevicePresence.cpp']
+        BROKER_SRC_DIR + 'ResourceBroker.cpp'
+        ]
 
 
 if target_os in ['tizen','android'] :
index e61c319..a49469c 100755 (executable)
 
 #define BROKER_TAG PCF("BROKER")
 
-#define BROKER_TRANSPORT OCConnectivityType::CT_IP_USE_V4
+#define BROKER_TRANSPORT OCConnectivityType::CT_ADAPTER_IP
 
 using namespace OIC::Service;
 
-struct BrokerRequesterInfo;
-class ResourcePresence;
-class DevicePresence;
-
-enum class DISCOVER_TRANSACTION;
-enum class BROKER_STATE;
-
-typedef std::function<void(std::shared_ptr<OC::OCResource>)> FindCB;
-typedef std::function<DISCOVER_TRANSACTION(std::shared_ptr<PrimitiveResource> resource)> DiscoverCB;
-
-typedef std::function<OCStackResult(BROKER_STATE)> BrokerCB;
-
-typedef std::shared_ptr<PrimitiveResource> PrimitiveResourcePtr;
-typedef std::shared_ptr<BrokerRequesterInfo> BrokerRequesterInfoPtr;
-
-typedef std::shared_ptr<ResourcePresence> ResourcePresencePtr;
-typedef std::shared_ptr<DevicePresence> DevicePresencePtr;
-
 /*
  * @BROKER_STATE
  * brief : resourcePresence state
@@ -72,6 +54,7 @@ enum class BROKER_STATE
     DESTROYED,
     NONE
 };
+
 /*
  * @DEVICE_STATE
  * brief : devicePresence state
@@ -86,11 +69,28 @@ enum class DEVICE_STATE
     LOST_SIGNAL
 };
 
+enum class BROKER_MODE
+{
+    DEVICE_PRESENCE_MODE = 0,
+    NON_PRESENCE_MODE
+};
 
+typedef std::function<OCStackResult(BROKER_STATE)> BrokerCB;
 struct BrokerRequesterInfo
 {
     BrokerCB brockerCB;
 };
+typedef std::shared_ptr<BrokerRequesterInfo> BrokerRequesterInfoPtr;
+
+class ResourcePresence;
+class DevicePresence;
+
+typedef std::function<void(std::shared_ptr<OC::OCResource>)> FindCB;
+
+typedef std::shared_ptr<PrimitiveResource> PrimitiveResourcePtr;
+
+typedef std::shared_ptr<ResourcePresence> ResourcePresencePtr;
+typedef std::shared_ptr<DevicePresence> DevicePresencePtr;
 
 typedef OC::OCPlatform::OCPresenceHandle BasePresenceHandle;
 typedef std::function<void(OCStackResult, const unsigned int,
diff --git a/service/basis/resourceBroker/include/DeviceAssociation.h b/service/basis/resourceBroker/include/DeviceAssociation.h
new file mode 100644 (file)
index 0000000..1916163
--- /dev/null
@@ -0,0 +1,50 @@
+//******************************************************************
+//
+// Copyright 2015 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 DEVICEASSOCIATION_H_
+#define DEVICEASSOCIATION_H_
+
+#include <list>
+#include <string>
+#include <algorithm>
+#include <mutex>
+#include <condition_variable>
+
+#include "BrokerTypes.h"
+
+class DeviceAssociation {
+public:
+
+    static DeviceAssociation * getInstance();
+
+    DevicePresencePtr findDevice(const std::string & address);
+    void addDevice(DevicePresencePtr dPresence);
+    void removeDevice(DevicePresencePtr dPresence);
+
+private:
+    DeviceAssociation();
+    ~DeviceAssociation();
+
+    static DeviceAssociation * s_instance;
+    static std::mutex s_mutexForCreation;
+    static std::list< DevicePresencePtr > s_deviceList;
+};
+
+#endif /* DEVICEASSOCIATION_H_ */
index e17a445..495d01b 100755 (executable)
 class DevicePresence
 {
 public:
-    DevicePresence(PrimitiveResourcePtr pResource, BrokerCB _cb);
-
-    DevicePresence();
+    DevicePresence(PrimitiveResourcePtr pResource);
     ~DevicePresence();
 
-    void createDevicePresence(PrimitiveResourcePtr pResource, BrokerCB _cb);
-
-    void addPresenceResource(PrimitiveResourcePtr pResource, BrokerCB _cb);
-    ResourcePresencePtr findResourcePresence(PrimitiveResourcePtr pResource, BrokerCB _cb);
-    ResourcePresencePtr findResourcePresence(PrimitiveResourcePtr pResource);
+    const std::string getAddress() const;
+    void addPresenceResource(ResourcePresence * rPresence);
 
 private:
-    SubscribeCallback pSubscribeRequestCB;
-
-    std::unique_ptr<std::list<ResourcePresencePtr>> resourcePresenceList;
+    std::string address;
+    DEVICE_STATE state;
+    bool isWithinTime;
 
+    std::list<ResourcePresence * > resourcePresenceList;
 
-    BasePresenceHandle presenceHandle;
-    PresenceSubscriber presenceSubscriber;
+    SubscribeCallback pSubscribeRequestCB;
     TimeoutCallback pTimeoutCB;
-    DEVICE_STATE state;
-    const std::string address;
+    PresenceSubscriber presenceSubscriber;
 
-    void subscribeCB(OCStackResult ret,const unsigned int seq, const std::string& Hostaddress);
     void requestAllResourcePresence();
-    bool isWithinTime;
-    void TimeOutCB(int msg);
+
+    void subscribeCB(OCStackResult ret,const unsigned int seq, const std::string& Hostaddress);
+    void timeOutCB(int msg);
 
 };
 
index 6640970..0ca2281 100755 (executable)
@@ -29,7 +29,7 @@
 #include <condition_variable>
 
 #include "BrokerTypes.h"
-#include "DevicePresence.h"
+#include "ResourcePresence.h"
 
 class ResourceBroker
 {
@@ -40,21 +40,15 @@ public:
 
     OCStackResult cancelHostResource(PrimitiveResourcePtr pResource);
 
-
     BROKER_STATE getResourceState(PrimitiveResourcePtr pResource);
 
-
 private:
     ResourceBroker();
     ~ResourceBroker();
 
     static ResourceBroker * s_instance;
     static std::mutex s_mutexForCreation;
-    static std::unique_ptr<std::list< DevicePresencePtr >>  s_presenceList;
-
-    ResourcePresencePtr findResourcePresence(PrimitiveResourcePtr pResource, BrokerCB cb);
-    DevicePresencePtr findDevicePresence(PrimitiveResourcePtr pResource, BrokerCB cb);
-
+    static std::unique_ptr<std::list< ResourcePresencePtr >>  s_presenceList;
 
     ResourcePresencePtr findResourcePresence(PrimitiveResourcePtr pResource);
 
index c8b4cbf..7ef6a5c 100755 (executable)
@@ -30,7 +30,7 @@
 class ResourcePresence
 {
 public:
-    ResourcePresence(PrimitiveResourcePtr pResource, BrokerCB _cb);
+    ResourcePresence(PrimitiveResourcePtr pResource);
     ~ResourcePresence();
 
     void addBrokerRequesterCB(BrokerCB _cb);
@@ -44,18 +44,26 @@ public:
     void setResourcestate(BROKER_STATE _state);
     void executeAllBrokerCB();
 
+    void changePresenceMode(BROKER_MODE newMode);
+
 private:
     PrimitiveResourcePtr primitiveResource;
 
     std::unique_ptr<std::list<BrokerRequesterInfoPtr>> requesterList;
 
     BROKER_STATE state;
+    BROKER_MODE mode;
+
     GetCallback pGetCB;
-    TimeoutCallback pTimeoutCB;
     void GetCB(const HeaderOptions &hos, const ResponseStatement& rep, int seq);
+
+    TimeoutCallback pTimeoutCB;
+
     bool isWithinTime;
     void TimeOutCB(int msg);
 
+    void registerDevicePresence();
+
 };
 
 #endif /* RESOURCEPRESENCE_H_ */
diff --git a/service/basis/resourceBroker/src/DeviceAssociation.cpp b/service/basis/resourceBroker/src/DeviceAssociation.cpp
new file mode 100644 (file)
index 0000000..03757f3
--- /dev/null
@@ -0,0 +1,83 @@
+//******************************************************************
+//
+// Copyright 2015 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 "DeviceAssociation.h"
+#include "DevicePresence.h"
+
+DeviceAssociation * DeviceAssociation::s_instance = nullptr;
+std::mutex DeviceAssociation::s_mutexForCreation;
+std::list< DevicePresencePtr >  DeviceAssociation::s_deviceList;
+
+DeviceAssociation::DeviceAssociation()
+{
+    // TODO Auto-generated constructor stub
+
+}
+
+DeviceAssociation::~DeviceAssociation()
+{
+    // TODO Auto-generated destructor stub
+}
+
+DeviceAssociation * DeviceAssociation::getInstance()
+{
+    if (!s_instance)
+    {
+        s_mutexForCreation.lock();
+        if (!s_instance)
+        {
+            s_instance = new DeviceAssociation();
+        }
+        s_mutexForCreation.unlock();
+    }
+    return s_instance;
+}
+
+DevicePresencePtr DeviceAssociation::findDevice(const std::string & address)
+{
+    DevicePresencePtr retDevice = nullptr;
+    for(auto it : s_deviceList)
+    {
+        if(address == it->getAddress())
+        {
+            retDevice = it;
+        }
+    }
+
+    return retDevice;
+}
+
+void DeviceAssociation::addDevice(DevicePresencePtr dPresence)
+{
+    DevicePresencePtr foundDevice = findDevice(dPresence->getAddress());
+    if(foundDevice == nullptr)
+    {
+        s_deviceList.push_back(dPresence);
+    }
+}
+
+void DeviceAssociation::removeDevice(DevicePresencePtr dPresence)
+{
+    DevicePresencePtr foundDevice = findDevice(dPresence->getAddress());
+    if(foundDevice != nullptr)
+    {
+        s_deviceList.remove(foundDevice);
+    }
+}
index f44bd65..dcec8ec 100755 (executable)
 #include "DevicePresence.h"
 #include "PrimitiveException.h"
 
-DevicePresence::DevicePresence(PrimitiveResourcePtr pResource, BrokerCB _cb)
-{
-    createDevicePresence(pResource, _cb);
-}
-
-DevicePresence::DevicePresence()
-{
-}
-
-DevicePresence::~DevicePresence()
-{
-    // TODO Auto-generated destructor stub
-
-    resourcePresenceList->clear();
-}
-
-void DevicePresence::createDevicePresence(PrimitiveResourcePtr pResource, BrokerCB _cb)
+DevicePresence::DevicePresence(PrimitiveResourcePtr pResource)
 {
     pSubscribeRequestCB = std::bind(&DevicePresence::subscribeCB, this,
                 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
+
     const char* log = pResource->getHost().c_str();
     OC_LOG_V(DEBUG, BROKER_TAG, "%s",log);
+
     try
     {
         presenceSubscriber
         = PresenceSubscriber(pResource->getHost(), BROKER_TRANSPORT, pSubscribeRequestCB);
 
         OC_LOG_V(DEBUG, BROKER_TAG, "subscribe Presence");
-    } catch(PrimitiveException e)
+    } catch(PrimitiveException e)
     {
         OC_LOG_V(DEBUG, BROKER_TAG, "exception in subscribe Presence %s",e.what());
     }
-    resourcePresenceList
-    = std::unique_ptr<std::list<ResourcePresencePtr>>(new std::list<ResourcePresencePtr>);
 
-    addPresenceResource(pResource, _cb);
     state = DEVICE_STATE::REQUESTED;
-    pTimeoutCB = std::bind(&DevicePresence::TimeOutCB, this,
-                std::placeholders::_1);
+    pTimeoutCB = std::bind(&DevicePresence::timeOutCB, this, std::placeholders::_1);
+
+    isWithinTime = true;
     //TODO generate Timer(if(!isTimer))
     //register pTimeroutCB
-    this->isWithinTime = true;
 }
-void DevicePresence::TimeOutCB(int msg)
-{
-    this->isWithinTime = false;
-    OC_LOG_V(DEBUG, BROKER_TAG, "Timeout execution. will be discard after receiving cb message");
-    state = DEVICE_STATE::LOST_SIGNAL;
-}
-void DevicePresence::addPresenceResource(PrimitiveResourcePtr pResource, BrokerCB _cb)
-{
-    ResourcePresencePtr newPresenceResource = ResourcePresencePtr(new ResourcePresence(pResource, _cb));
-    resourcePresenceList->push_back(newPresenceResource);
 
+DevicePresence::~DevicePresence()
+{
+    resourcePresenceList.clear();
 }
 
-ResourcePresencePtr DevicePresence::findResourcePresence(PrimitiveResourcePtr pResource, BrokerCB _cb)
+const std::string DevicePresence::getAddress() const
 {
-    ResourcePresencePtr retResource(nullptr);
-
-    if (resourcePresenceList->empty())// || pResource.isEmpty())
-    {
-       return retResource;
-    }
-    else
-    {
-       std::list<ResourcePresencePtr>::iterator it;
-
-       ResourcePresencePtr temp = ResourcePresencePtr(new ResourcePresence(pResource, _cb));
-       it = std::find(resourcePresenceList->begin(), resourcePresenceList->end(), temp);
-       if(it == resourcePresenceList->end())
-       {
-           return retResource;
-       }
-       else
-       {
-           retResource = *it;
-       }
-    }
-
-    return retResource;
+    return address;
 }
 
-ResourcePresencePtr DevicePresence::findResourcePresence(PrimitiveResourcePtr pResource)
+void DevicePresence::addPresenceResource(ResourcePresence * rPresence)
 {
-    ResourcePresencePtr retResource(nullptr);
-    if (resourcePresenceList->empty())// || pResource.isEmpty())
-    {
-       return retResource;
-    }
-    else
-    {
-        for(auto & it : * resourcePresenceList)
-        {
-            if(it->getPrimitiveResource() == pResource)
-            {
-                retResource = it;
-            }
-        }
-    }
-    return retResource;
+    resourcePresenceList.push_back(rPresence);
 }
 
 void DevicePresence::requestAllResourcePresence()
 {
-    std::list<ResourcePresencePtr>::iterator it;
-    for( auto & it : * resourcePresenceList)
+    for(auto it : resourcePresenceList)
     {
         it->requestResourceState();
     }
@@ -136,6 +74,7 @@ void DevicePresence::requestAllResourcePresence()
 void DevicePresence::subscribeCB(OCStackResult ret,
         const unsigned int seq, const std::string& hostAddress)
 {
+    std::cout << "Call Back Deivce's Presence\n";
     const char* log = hostAddress.c_str();
     OC_LOG_V(DEBUG, BROKER_TAG, "Received presence CB from: %s",log);
     OC_LOG_V(DEBUG, BROKER_TAG, "In subscribeCB: %d",ret);
@@ -147,54 +86,60 @@ void DevicePresence::subscribeCB(OCStackResult ret,
             case OC_STACK_OK:
             case OC_STACK_RESOURCE_CREATED:
             case OC_STACK_CONTINUE:
-
                 OC_LOG_V(DEBUG, BROKER_TAG, "SEQ# %d",seq);
                 state = DEVICE_STATE::ALIVE;
-
                 OC_LOG_V(DEBUG, BROKER_TAG, "device state : %d",(int)state);
-                if(!resourcePresenceList->empty())
+                if(!resourcePresenceList.empty())
                 {
                     requestAllResourcePresence();
                 }
                 break;
+
             case OC_STACK_INVALID_REQUEST_HANDLE:
             case OC_STACK_RESOURCE_DELETED:
             case OC_STACK_TIMEOUT:
             case OC_STACK_COMM_ERROR:
                 //TODO get request
                 state = DEVICE_STATE::REQUESTED;
-                if(!resourcePresenceList->empty())
+                if(!resourcePresenceList.empty())
                 {
                     OC_LOG_V(DEBUG, BROKER_TAG, "ready to execute requestAllResourcePresence()");
                     requestAllResourcePresence();
                 }
                 break;
+
             case OC_STACK_PRESENCE_STOPPED:
             case OC_STACK_PRESENCE_TIMEOUT:
-
                 OC_LOG_V(DEBUG, BROKER_TAG, "Server Presence Stop!!");
                 state = DEVICE_STATE::LOST_SIGNAL;
-                for(auto & it : * resourcePresenceList)
-                {
-                    it->setResourcestate(BROKER_STATE::LOST_SIGNAL);
-                    it->executeAllBrokerCB();
-                }
-
+                requestAllResourcePresence();
                 break;
+
             case OC_STACK_PRESENCE_DO_NOT_HANDLE:
                 OC_LOG_V(DEBUG, BROKER_TAG, "Presence Lost Signal because do not handled");
                 state = DEVICE_STATE::LOST_SIGNAL;
+                requestAllResourcePresence();
                 break;
+
             default:
+                OC_LOG_V(DEBUG, BROKER_TAG, "Presence Lost Signal because unknown type");
                 state = DEVICE_STATE::LOST_SIGNAL;
+                requestAllResourcePresence();
                 break;
         }
     }
     else
     {
-        OC_LOG_V(DEBUG, BROKER_TAG, "its message is not available because of Timeout msg");
+        OC_LOG_V(DEBUG, BROKER_TAG, "This response is Timeout but device steel alive");
         this->state = DEVICE_STATE::ALIVE;
         //notify cb message to user.
         isWithinTime = true;
     }
 }
+
+void DevicePresence::timeOutCB(int msg)
+{
+    this->isWithinTime = false;
+    OC_LOG_V(DEBUG, BROKER_TAG, "Timeout execution. will be discard after receiving cb message");
+    state = DEVICE_STATE::LOST_SIGNAL;
+}
index 07267b9..316acb4 100755 (executable)
 
 ResourceBroker * ResourceBroker::s_instance = NULL;
 std::mutex ResourceBroker::s_mutexForCreation;
-std::unique_ptr<std::list< DevicePresencePtr >>  ResourceBroker::s_presenceList(nullptr);
+std::unique_ptr<std::list< ResourcePresencePtr >>  ResourceBroker::s_presenceList(nullptr);
 
 ResourceBroker::ResourceBroker()
 {
     // TODO Auto-generated constructor stub
     if(s_presenceList == nullptr)
     {
-        s_presenceList = std::unique_ptr<std::list< DevicePresencePtr >>(new std::list<DevicePresencePtr>);
+        s_presenceList = std::unique_ptr<std::list< ResourcePresencePtr >>(new std::list<ResourcePresencePtr>);
     }
 }
 
@@ -73,21 +73,18 @@ OCStackResult ResourceBroker::hostResource(PrimitiveResourcePtr pResource, Broke
         return ret;
     }
 
-    DevicePresencePtr presenceItem = findDevicePresence(pResource, cb);
-
+    ResourcePresencePtr presenceItem = findResourcePresence(pResource);
     if(presenceItem == nullptr)
     {
-        OC_LOG_V(DEBUG, BROKER_TAG, "Not found any Handled Device.");
-        OC_LOG_V(DEBUG, BROKER_TAG, "Create New Device Presence Handler.");
-
-        DevicePresencePtr newItem = DevicePresencePtr(new DevicePresence());
-        newItem->createDevicePresence(pResource, cb);
+        OC_LOG_V(DEBUG, BROKER_TAG, "Not found any Handled Resource.");
+        OC_LOG_V(DEBUG, BROKER_TAG, "Create New Resource Presence Handler.");
 
-        s_presenceList->push_back(newItem);
+        presenceItem = ResourcePresencePtr(new ResourcePresence(pResource));
+        s_presenceList->push_back(presenceItem);
     }
     else
     {
-        presenceItem->addPresenceResource(pResource, cb);
+        presenceItem->addBrokerRequesterCB(cb);
     }
 
     return ret;
@@ -102,7 +99,7 @@ BROKER_STATE ResourceBroker::getResourceState(PrimitiveResourcePtr pResource)
 {
     BROKER_STATE retState = BROKER_STATE::NONE;
 
-    auto foundResource = findResourcePresence(pResource);
+    ResourcePresencePtr foundResource = findResourcePresence(pResource);
 
     if(foundResource != nullptr)
     {
@@ -111,65 +108,19 @@ BROKER_STATE ResourceBroker::getResourceState(PrimitiveResourcePtr pResource)
     return retState;
 }
 
-
-DevicePresencePtr ResourceBroker::findDevicePresence(PrimitiveResourcePtr pResource, BrokerCB cb)
-{
-    DevicePresencePtr retDevice(nullptr);
-    if (s_presenceList->empty())// || pResource->isEmpty())
-    {
-        return retDevice;
-    }
-    else
-    {
-        std::list<DevicePresencePtr>::iterator it;
-
-        DevicePresencePtr temp = DevicePresencePtr(new DevicePresence(pResource, cb));
-        it = std::find(s_presenceList->begin(), s_presenceList->end(), temp);
-
-        if(it == s_presenceList->end())
-        {
-            return retDevice;
-        }
-        else
-        {
-            retDevice = *it;
-        }
-    }
-
-    return retDevice;
-}
-
-ResourcePresencePtr ResourceBroker::findResourcePresence(PrimitiveResourcePtr pResource, BrokerCB cb)
-{
-    ResourcePresencePtr retResource(nullptr);
-    if (s_presenceList->empty())// || pResource.isEmpty())
-    {
-        return retResource;
-    }
-    else
-    {
-        DevicePresencePtr foundDevice = findDevicePresence(pResource, cb);
-        retResource = foundDevice->findResourcePresence(pResource, cb);
-    }
-
-    return retResource;
-}
-
 ResourcePresencePtr ResourceBroker::findResourcePresence(PrimitiveResourcePtr pResource)
 {
     ResourcePresencePtr retResource(nullptr);
-    if (s_presenceList->empty())// || pResource->isEmpty())
-    {
-        return retResource;
-    }
-    else
+
+    if(s_presenceList->empty() != true)
     {
         for(auto & it : * s_presenceList)
         {
-            auto temp = it->findResourcePresence(pResource);
-            if(temp != nullptr)
+            PrimitiveResourcePtr temp = it->getPrimitiveResource();
+            if(temp == pResource)
             {
-                retResource = temp;
+                retResource = it;
+                break;
             }
         }
     }
index 8c56d8b..64e1561 100755 (executable)
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 #include "ResourcePresence.h"
+#include "DeviceAssociation.h"
+#include "DevicePresence.h"
 
-ResourcePresence::ResourcePresence(PrimitiveResourcePtr pResource, BrokerCB _cb)
+ResourcePresence::ResourcePresence(PrimitiveResourcePtr pResource)
 {
     primitiveResource = pResource;
 
@@ -28,13 +30,36 @@ ResourcePresence::ResourcePresence(PrimitiveResourcePtr pResource, BrokerCB _cb)
             std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
     pTimeoutCB = std::bind(&ResourcePresence::TimeOutCB, this,
             std::placeholders::_1);
+
     requesterList
     = std::unique_ptr<std::list<BrokerRequesterInfoPtr>>(new std::list<BrokerRequesterInfoPtr>);
+
     //TODO generate Timer(if(!isTimer))
     //register pTimeroutCB
-    addBrokerRequesterCB(_cb);
+
     state = BROKER_STATE::REQUESTED;
-    this->isWithinTime = true;
+    isWithinTime = true;
+
+    mode = BROKER_MODE::NON_PRESENCE_MODE;
+    primitiveResource->requestGet(pGetCB);
+
+    registerDevicePresence();
+}
+
+void ResourcePresence::registerDevicePresence()
+{
+    // find device......
+    std::string deviceAddress = primitiveResource->getHost();
+
+    DevicePresencePtr foundDevice
+    = DeviceAssociation::getInstance()->findDevice(deviceAddress);
+
+    if(foundDevice == nullptr)
+    {
+        foundDevice = DevicePresencePtr(new DevicePresence(primitiveResource));
+        DeviceAssociation::getInstance()->addDevice(foundDevice);
+    }
+    foundDevice->addPresenceResource(this);
 }
 
 ResourcePresence::~ResourcePresence()
@@ -123,32 +148,12 @@ void ResourcePresence::GetCB(const HeaderOptions &hos, const ResponseStatement&
     {
 
     }
+
+    if(mode == BROKER_MODE::NON_PRESENCE_MODE)
+    {
+        // TODO set timer & request get
+    }
 }
-/*
- * TODO : getCB logic is not fixed until now. below logic will be used forwarding task.
- *
- * //            if(eCode == OC_STACK_OK)
-//            {
-                OC_LOG_V(DEBUG, BROKER_TAG, "broker state :: %d",(int)state);
-                state = BROKER_STATE::ALIVE;
-                OC_LOG_V(DEBUG, BROKER_TAG, "broker state changed :: %d",(int)state);
-                OC_LOG_V(DEBUG, BROKER_TAG, "GET request was successful");
-//                std::cout << "[ResourcePresence]" << "Resource URI: " << rep.getUri() << std::endl;
-//            }
-//            else
-//            {
-//                std::cout << "[ResourcePresence]" << "onGET Response error: " << eCode << std::endl;
-                if(!requesterList->empty())
-                {
-                    executeAllBrokerCB();
-                }
-                else
-                {
-                    OC_LOG_V(DEBUG, BROKER_TAG, "None exist resource for request");
-                    state = BROKER_STATE::DESTROYED;
-                }
-//            }
- */
 
 PrimitiveResourcePtr ResourcePresence::getPrimitiveResource()
 {
@@ -159,3 +164,15 @@ BROKER_STATE ResourcePresence::getResourceState()
 {
     return state;
 }
+
+void ResourcePresence::changePresenceMode(BROKER_MODE newMode)
+{
+    if(newMode != mode)
+    {
+        if(newMode == BROKER_MODE::NON_PRESENCE_MODE)
+        {
+            requestResourceState();
+        }
+        mode = newMode;
+    }
+}