Implement TriggerStandbyState 83/140383/3
authorMu-Woong Lee <muwoong.lee@samsung.com>
Tue, 25 Jul 2017 02:24:05 +0000 (11:24 +0900)
committerMu-Woong Lee <muwoong.lee@samsung.com>
Tue, 25 Jul 2017 04:08:28 +0000 (13:08 +0900)
Change-Id: Iaabcffd256bdabeb84172b7202c66e5d19df833c
Signed-off-by: Mu-Woong Lee <muwoong.lee@samsung.com>
src/server/ContextManager.h
src/server/ContextPublisher.cpp
src/server/ContextPublisher.h
src/server/IContextObserver.h
src/server/JobManager.cpp
src/server/JobRunner.cpp
src/server/JobState.h
src/server/TriggerStandbyState.cpp
src/server/TriggerStandbyState.h

index 25973b8f3385f2225bb5b610b3e099c43272aeb2..5ae8f2688b4e23f737ddd709df05b1a78570b7aa 100644 (file)
 
 #include <map>
 #include <ContextTypes.h>
-#include "ContextPublisher.h"
 
 namespace ctx {
 
+       class ContextPublisher;
+
        class ContextManager {
        public:
                ~ContextManager();
index 378f4d7f32b2974ba91bfc3931240cc56a6ec31c..6b142431ad74bf8506d931c3e38b31a464bd9ae3 100644 (file)
@@ -44,19 +44,22 @@ ContextPublisher::~ContextPublisher()
 {
 }
 
-void ContextPublisher::addObserver(IContextObserver* observer)
+void ContextPublisher::addObserver(IContextObserver* observer, void* userData)
 {
        if (__observers.empty()) {
                read();
                subscribe();
        }
 
-       __observers.push_back(observer);
+       __observers.emplace_back(observer, userData);
 }
 
 void ContextPublisher::removeObserver(IContextObserver* observer)
 {
-       __observers.remove(observer);
+       __observers.remove_if(
+                       [&](const ObserverInfo& info)->bool {
+                               return (info.observer == observer);
+                       });
 
        if (__observers.empty()) {
                unsubscribe();
@@ -89,8 +92,8 @@ const Json::Value& ContextPublisher::getData()
 
 void ContextPublisher::notifyObservers()
 {
-       for (auto& observer : __observers) {
-               observer->ready();
+       for (auto& info : __observers) {
+               info.observer->contextDataReady(this, info.data);
        }
 }
 
@@ -103,3 +106,9 @@ void ContextPublisher::clearData()
 {
        __data = Json::nullValue;
 }
+
+ContextPublisher::ObserverInfo::ObserverInfo(IContextObserver* o, void* d) :
+       observer(o),
+       data(d)
+{
+}
index aa4afcc8c47520f02201aa9fd559cf6a5b55c290..ab40e1a5f30b42be54f9c8098b875d9b6266f373 100644 (file)
@@ -38,7 +38,7 @@ namespace ctx {
        public:
                virtual ~ContextPublisher();
 
-               void addObserver(IContextObserver* observer);
+               void addObserver(IContextObserver* observer, void* userData);
                void removeObserver(IContextObserver* observer);
 
                virtual const char* getUri() const = 0;
@@ -65,7 +65,12 @@ namespace ctx {
                Json::Value __data;
 
        private:
-               std::list<IContextObserver*> __observers;
+               struct ObserverInfo {
+                       IContextObserver* observer;
+                       void* data;
+                       ObserverInfo(IContextObserver* o, void* d);
+               };
+               std::list<ObserverInfo> __observers;
        };
 
 }
index 2508fadbe0818e0dd505bba9bdb35607f3be1cb7..b06a633ecb36da64cfa35e578c36223f5a30a1a3 100644 (file)
 
 namespace ctx {
 
+       class ContextPublisher;
+
        class IContextObserver {
        public:
                virtual ~IContextObserver() {}
 
-               virtual void ready() = 0;
+               virtual void contextDataReady(ContextPublisher* pubs, void* userData) = 0;
        };
 
 }
index 3b82c056e2beff25589ce8a30d5b8fc56db71a39..50b918e16c33198219cd7e0f3333d37a098b31a4 100644 (file)
@@ -19,6 +19,7 @@
 #include <Conf.h>
 #include <JobAction.h>
 #include "ContextManager.h"
+#include "ContextPublisher.h"
 #include "SchedTimer.h"
 #include "OnDemandJobRunner.h"
 #include "PeriodicJobRunner.h"
index 806424823038583a6ee1b2efaff548af5578d456..973a40d157b075ae3ed02730a63606c56513e78a 100644 (file)
@@ -68,16 +68,24 @@ JobInfo* JobRunner::getJobInfo()
 
 void JobRunner::setState(JobState* state)
 {
+       bool success = false;
+
        delete __state;
        __state = state;
 
        IF_FAIL_VOID(__state);
 
        try {
-               if (__state->execute())
+               if ((success = __state->execute()))
                        __state->setClient(__client);
        } catch (const std::runtime_error& e) {
-               _E("State transtion failed: %s", e.what());
+               _E("State transition failed: %s", e.what());
+               _I("Terminating Job-%d of '%s'", getJobId(), getOwner().c_str());
+               terminate();
+       }
+
+       if (!success) {
+               _E("State transition failed");
                _I("Terminating Job-%d of '%s'", getJobId(), getOwner().c_str());
                terminate();
        }
index c1998c8d33865e2d9aeb34156c214230b21370a6..8f967c2d8d400ecc136fc256c030dc015e575dd2 100644 (file)
@@ -22,7 +22,7 @@
 #include <JobInfo.h>
 
 #define _ENTER _I("ENTER: Job-%d of '%s'", getJobId(), getOwner().c_str())
-#define _EXIT  _I("EXIT : Job-%d of '%s'", getJobId(), getOwner().c_str())
+#define _EXIT  _D("EXIT : Job-%d of '%s'", getJobId(), getOwner().c_str())
 
 namespace ctx {
 
index ff681cb07f27e8cf44909e49e36229a889d4a0ce..288032de79eef9b8e63126d9948253416dd3c7b1 100644 (file)
  * limitations under the License.
  */
 
+#include <JobContext.h>
+#include "ContextManager.h"
+#include "ContextPublisher.h"
+#include "ReqVerificationState.h"
 #include "TriggerStandbyState.h"
 
 using namespace ctx;
@@ -27,11 +31,42 @@ TriggerStandbyState::TriggerStandbyState(JobRunner* runner) :
 TriggerStandbyState::~TriggerStandbyState()
 {
        _EXIT;
+       __unsubscribe();
 }
 
 bool TriggerStandbyState::execute()
 {
-       //TODO: Subscribe the trigger contexts.
-       // If a context expires, verify its attributes, and transit to ReqVerificationState.
+       return __subscribe();
+}
+
+void TriggerStandbyState::contextDataReady(ContextPublisher* pubs, void* userData)
+{
+       JobTrigger* trigger = static_cast<JobTrigger*>(userData);
+
+       if (*trigger <= pubs->getData())
+               transit(new ReqVerificationState(this));
+}
+
+bool TriggerStandbyState::__subscribe()
+{
+       auto& triggers = static_cast<OnDemandJobInfo*>(getJobInfo())->getTriggers();
+
+       for (auto& trg : triggers) {
+               ContextPublisher* pubs = ContextManager::getPublisher(trg->getUri(), getUid());
+               IF_FAIL_RETURN(pubs, false);
+
+               pubs->addObserver(this, trg);
+               __publishers.push_back(pubs);
+       }
+
        return true;
 }
+
+void TriggerStandbyState::__unsubscribe()
+{
+       for (auto& pubs : __publishers) {
+               pubs->removeObserver(this);
+       }
+
+       __publishers.clear();
+}
index 3d0e42f7f08876999a9f29fa02f1ae016de4e04b..9e5e34be5918c11ea902f49f8de3a101080ce034 100644 (file)
 #ifndef __CONTEXT_JOB_SCHEDULER_TRIGGER_STANDBY_STATE_H__
 #define __CONTEXT_JOB_SCHEDULER_TRIGGER_STANDBY_STATE_H__
 
+#include <vector>
 #include <WakeLock.h>
+#include "IContextObserver.h"
 #include "JobState.h"
 
 namespace ctx {
 
-       class TriggerStandbyState : public JobState {
+       class ContextPublisher;
+
+       class TriggerStandbyState : public JobState, public IContextObserver {
        public:
                TriggerStandbyState(JobRunner* runner);
                ~TriggerStandbyState();
 
                bool execute();
+               void contextDataReady(ContextPublisher* pubs, void* userData);
+
+       private:
+               bool __subscribe();
+               void __unsubscribe();
+
+               std::vector<ContextPublisher*> __publishers;
        };
 
 }