iotivity 0.9.0
[platform/upstream/iotivity.git] / service / soft-sensor-manager / SDK / cpp / src / InprocSSMCore.cpp
1 #include "SSMInterface.h"
2 #include "SSMInterface/SSMCore.h"
3 #include "Common/PlatformLayer.h"
4
5 class SSMCoreEventReceiver : public IQueryEngineEvent
6 {
7     public:
8         SSMCoreEventReceiver()
9         {
10         }
11
12         SSMRESULT onQueryEngineEvent(IN int cqid, IN IDataReader *pResult)
13         {
14             SSMRESULT res = SSM_E_FAIL;
15
16             m_mtxListener.lock();
17
18             if (m_mapListener.find(cqid) == m_mapListener.end())
19             {
20                 SSM_CLEANUP_ASSERT(res);
21             }
22
23             m_mapListener[cqid]->onQueryEngineEvent(cqid, pResult);
24
25             res = SSM_S_OK;
26
27 CLEANUP:
28             m_mtxListener.unlock();
29             return res;
30         }
31
32         void lockListener()
33         {
34             m_mtxListener.lock();
35         }
36
37         void unlockListener()
38         {
39             m_mtxListener.unlock();
40         }
41
42         void addListener(IN int cqid, IN IQueryEngineEvent *pEngineEvent)
43         {
44             m_mapListener[cqid] = pEngineEvent;
45         }
46
47         void removeListener(IN int cqid)
48         {
49             m_mapListener.erase(cqid);
50         }
51
52     private:
53         CSimpleMutex                        m_mtxListener;
54         std::map<int, IQueryEngineEvent *>   m_mapListener;
55 };
56
57 IQueryEngine                        *g_pQueryEngineInstance = NULL;
58 SSMCoreEventReceiver                *g_pEventReceiver = NULL;
59
60 SSMInterface::SSMInterface()
61 {
62     std::string xmlDescription = "<SSMCore>"
63                                  "<Device>"
64                                  "<UDN>abcde123-31f8-11b4-a222-08002b34c003</UDN>"
65                                  "<Name>MyPC</Name>"
66                                  "<Type>PC</Type>"
67                                  "</Device>"
68                                  "</SSMCore>";
69
70     SSMRESULT res = SSM_E_FAIL;
71
72     g_pEventReceiver = new SSMCoreEventReceiver();
73     SSM_CLEANUP_NULL_ASSERT(g_pEventReceiver);
74     SSM_CLEANUP_ASSERT(InitializeSSMCore(xmlDescription));
75     SSM_CLEANUP_ASSERT(StartSSMCore());
76     SSM_CLEANUP_ASSERT(CreateQueryEngine(&g_pQueryEngineInstance));
77     SSM_CLEANUP_ASSERT(g_pQueryEngineInstance->registerQueryEvent(g_pEventReceiver));
78 CLEANUP:
79     ;
80 }
81
82 SSMInterface::~SSMInterface()
83 {
84     SSMRESULT res = SSM_E_FAIL;
85
86     SSM_CLEANUP_ASSERT(g_pQueryEngineInstance->unregisterQueryEvent(g_pEventReceiver));
87     ReleaseQueryEngine(g_pQueryEngineInstance);
88     g_pQueryEngineInstance = NULL;
89     SSM_CLEANUP_ASSERT(StopSSMCore());
90     SSM_CLEANUP_ASSERT(TerminateSSMCore());
91
92 CLEANUP:
93     SAFE_DELETE(g_pEventReceiver);
94 }
95
96 SSMRESULT SSMInterface::registerQuery(IN std::string queryString, IN IQueryEngineEvent *listener,
97                                       IN int &cqid)
98 {
99     SSMRESULT res = SSM_E_FAIL;
100
101     g_pEventReceiver->lockListener();
102     SSM_CLEANUP_ASSERT(g_pQueryEngineInstance->executeContextQuery(queryString, &cqid));
103     g_pEventReceiver->addListener(cqid, listener);
104
105 CLEANUP:
106     g_pEventReceiver->unlockListener();
107     return res;
108 }
109
110 SSMRESULT SSMInterface::unregisterQuery(IN int cqid)
111 {
112     SSMRESULT res = SSM_E_FAIL;
113
114     g_pEventReceiver->lockListener();
115     SSM_CLEANUP_ASSERT(g_pQueryEngineInstance->killContextQuery(cqid));
116     g_pEventReceiver->removeListener(cqid);
117
118 CLEANUP:
119     g_pEventReceiver->unlockListener();
120     return res;
121 }