summaryrefslogtreecommitdiff
path: root/core/SystemStatusOsObserver.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/SystemStatusOsObserver.h')
-rw-r--r--core/SystemStatusOsObserver.h333
1 files changed, 333 insertions, 0 deletions
diff --git a/core/SystemStatusOsObserver.h b/core/SystemStatusOsObserver.h
new file mode 100644
index 0000000..8e42d21
--- /dev/null
+++ b/core/SystemStatusOsObserver.h
@@ -0,0 +1,333 @@
+/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation, nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef __SYSTEM_STATUS_OSOBSERVER__
+#define __SYSTEM_STATUS_OSOBSERVER__
+
+#include <stdint.h>
+#include <string>
+#include <list>
+#include <map>
+#include <new>
+#include <vector>
+#include <platform_lib_log_util.h>
+#include <DataItemId.h>
+#include <MsgTask.h>
+#include <IOsObserver.h>
+
+namespace loc_core
+{
+
+/******************************************************************************
+ SystemStatusOsObserver
+******************************************************************************/
+// Forward Declarations
+class IDataItemCore;
+
+template <typename CT, typename DIT>
+class IClientIndex;
+
+template <typename CT, typename DIT>
+class IDataItemIndex;
+
+struct SystemContext {
+ IDataItemSubscription *mSubscriptionObj;
+ IFrameworkActionReq *mFrameworkActionReqObj;
+ const MsgTask *mMsgTask;
+
+ inline SystemContext() :
+ mSubscriptionObj(NULL),
+ mFrameworkActionReqObj(NULL),
+ mMsgTask(NULL) {}
+};
+
+// Clients wanting to get data from OS/Framework would need to
+// subscribe with OSObserver using IDataItemSubscription interface.
+// Such clients would need to implement IDataItemObserver interface
+// to receive data when it becomes available.
+class SystemStatusOsObserver : public IOsObserver {
+
+public:
+ // ctor
+ SystemStatusOsObserver(const MsgTask* msgTask);
+
+ // dtor
+ ~SystemStatusOsObserver();
+
+ // To set the subscription object
+ inline void setSubscriptionObj(IDataItemSubscription *subscriptionObj) {
+ mContext.mSubscriptionObj = subscriptionObj;
+ };
+
+ // To set the framework action request object
+ inline void setFrameworkActionReqObj(IFrameworkActionReq *frameworkActionReqObj) {
+ mContext.mFrameworkActionReqObj = frameworkActionReqObj;
+ }
+
+ // IDataItemObserver Overrides
+ virtual void getName (string & name);
+ virtual void notify (const std::list <IDataItemCore *> & dlist);
+
+ // IDataItemSubscription Overrides
+ virtual void subscribe (const std :: list <DataItemId> & l, IDataItemObserver * client);
+ virtual void updateSubscription
+ (
+ const std :: list <DataItemId> & l,
+ IDataItemObserver * client
+ );
+ virtual void requestData
+ (
+ const std :: list <DataItemId> & l,
+ IDataItemObserver * client
+ );
+ virtual void unsubscribe (const std :: list <DataItemId> & l, IDataItemObserver * client);
+ virtual void unsubscribeAll (IDataItemObserver * client);
+
+ // IFrameworkActionReq Overrides
+ virtual void turnOn (DataItemId dit, int timeOut = 0);
+ virtual void turnOff (DataItemId dit);
+
+private:
+
+ SystemContext mContext;
+ const string mAddress;
+ IClientIndex <IDataItemObserver *, DataItemId> *mClientIndex;
+ IDataItemIndex <IDataItemObserver *, DataItemId> *mDataItemIndex;
+ map < DataItemId, IDataItemCore * > mDataItemCache;
+ map < DataItemId, int > mActiveRequestCount;
+
+ // Nested types
+ // Messages
+ struct HandleMsgBase : public LocMsg {
+ HandleMsgBase (SystemStatusOsObserver * parent);
+ virtual ~HandleMsgBase ();
+ // Data members
+ SystemStatusOsObserver * mParent;
+ };
+
+ // Helpers
+ int sendFirstResponse
+ (
+ const list <DataItemId> & l,
+ IDataItemObserver * to
+ );
+
+ int sendCachedDataItems
+ (
+ const list <DataItemId> & l,
+ IDataItemObserver * to
+ );
+
+ int updateCache (IDataItemCore * d, bool &dataItemUpdated);
+ void logMe (const list <DataItemId> & l);
+
+ // Messages
+ struct HandleClientMsg : public LocMsg {
+ HandleClientMsg (SystemStatusOsObserver * parent, IDataItemObserver * client);
+ virtual ~HandleClientMsg ();
+ // Data Members
+ SystemStatusOsObserver * mParent;
+ IDataItemObserver * mClient;
+ };
+
+ struct HandleSubscribeReq : public HandleClientMsg {
+ HandleSubscribeReq (SystemStatusOsObserver * parent,
+ const list <DataItemId> & l,
+ IDataItemObserver * client);
+ virtual ~HandleSubscribeReq ();
+ void proc () const;
+ // Data members
+ const list <DataItemId> mDataItemList;
+ };
+
+ struct HandleUpdateSubscriptionReq : public HandleClientMsg {
+ HandleUpdateSubscriptionReq (SystemStatusOsObserver * parent,
+ const list <DataItemId> & l,
+ IDataItemObserver * client);
+ virtual ~HandleUpdateSubscriptionReq ();
+ void proc () const;
+ // Data members
+ const list <DataItemId> mDataItemList;
+ };
+
+ struct HandleRequestData : public HandleClientMsg {
+ HandleRequestData (SystemStatusOsObserver * parent,
+ const list <DataItemId> & l,
+ IDataItemObserver * client);
+ virtual ~HandleRequestData ();
+ void proc () const;
+ const list <DataItemId> mDataItemList;
+ };
+
+ struct HandleUnsubscribeReq : public HandleClientMsg {
+ HandleUnsubscribeReq (SystemStatusOsObserver * parent,
+ const list <DataItemId> & l,
+ IDataItemObserver * client);
+ virtual ~HandleUnsubscribeReq ();
+ void proc () const;
+ // Data members
+ const list <DataItemId> mDataItemList;
+ };
+
+ struct HandleUnsubscribeAllReq : public HandleClientMsg {
+ HandleUnsubscribeAllReq
+ (
+ SystemStatusOsObserver * parent,
+ IDataItemObserver * client
+ );
+ virtual ~HandleUnsubscribeAllReq ();
+ void proc () const;
+ };
+
+ struct HandleNotify : public HandleMsgBase {
+ HandleNotify (SystemStatusOsObserver * parent, list <IDataItemCore *> dlist);
+ virtual ~HandleNotify ();
+ void getListOfClients
+ (
+ const list <DataItemId> & dlist,
+ list <IDataItemObserver *> & clients
+ ) const;
+ void proc () const;
+ // Data members
+ list <IDataItemCore *> mDList;
+ };
+
+ struct HandleTurnOn : public HandleMsgBase {
+ HandleTurnOn (SystemStatusOsObserver * parent,
+ const DataItemId dit,
+ const int timeOut);
+ virtual ~HandleTurnOn ();
+ void proc () const;
+ // Data members
+ DataItemId mDataItemId;
+ int mTimeOut;
+ };
+
+ struct HandleTurnOff : public HandleMsgBase {
+ HandleTurnOff (SystemStatusOsObserver * parent,const DataItemId dit);
+ virtual ~HandleTurnOff ();
+ void proc () const;
+ // Data members
+ DataItemId mDataItemId;
+ };
+
+};
+
+
+/******************************************************************************
+ Messages
+******************************************************************************/
+// Ctors
+inline SystemStatusOsObserver :: HandleMsgBase :: HandleMsgBase (SystemStatusOsObserver * parent)
+:
+mParent (parent)
+{}
+
+inline SystemStatusOsObserver :: HandleClientMsg :: HandleClientMsg
+(
+ SystemStatusOsObserver * parent,
+ IDataItemObserver * client
+)
+:
+mParent (parent),
+mClient (client)
+{}
+
+inline SystemStatusOsObserver :: HandleSubscribeReq :: HandleSubscribeReq
+ (SystemStatusOsObserver * parent, const list <DataItemId> & l, IDataItemObserver * client)
+:
+HandleClientMsg (parent, client), mDataItemList (l)
+{}
+
+inline SystemStatusOsObserver :: HandleUpdateSubscriptionReq :: HandleUpdateSubscriptionReq
+ (SystemStatusOsObserver * parent, const list <DataItemId> & l, IDataItemObserver * client)
+:
+HandleClientMsg (parent, client), mDataItemList (l)
+{}
+
+inline SystemStatusOsObserver :: HandleRequestData :: HandleRequestData
+ (SystemStatusOsObserver * parent, const list <DataItemId> & l, IDataItemObserver * client)
+:
+HandleClientMsg (parent, client), mDataItemList (l)
+{}
+
+inline SystemStatusOsObserver :: HandleUnsubscribeReq :: HandleUnsubscribeReq
+ (SystemStatusOsObserver * parent, const list <DataItemId> & l, IDataItemObserver * client)
+:
+HandleClientMsg (parent, client), mDataItemList (l)
+{}
+
+inline SystemStatusOsObserver :: HandleUnsubscribeAllReq :: HandleUnsubscribeAllReq
+ (SystemStatusOsObserver * parent, IDataItemObserver * client)
+:
+HandleClientMsg (parent, client)
+{}
+
+inline SystemStatusOsObserver :: HandleNotify :: HandleNotify
+ (SystemStatusOsObserver * parent, list <IDataItemCore *> dlist)
+:
+HandleMsgBase (parent), mDList (dlist)
+{}
+
+inline SystemStatusOsObserver :: HandleTurnOn :: HandleTurnOn
+ (SystemStatusOsObserver * parent, const DataItemId dit,const int timeOut)
+:
+HandleMsgBase (parent), mDataItemId (dit), mTimeOut (timeOut)
+{}
+
+inline SystemStatusOsObserver :: HandleTurnOff :: HandleTurnOff
+ (SystemStatusOsObserver * parent, const DataItemId dit)
+:
+HandleMsgBase (parent), mDataItemId (dit)
+{}
+
+// Dtors
+inline SystemStatusOsObserver :: HandleMsgBase :: ~HandleMsgBase () {}
+inline SystemStatusOsObserver :: HandleClientMsg :: ~HandleClientMsg () {}
+inline SystemStatusOsObserver :: HandleSubscribeReq :: ~HandleSubscribeReq () {}
+inline SystemStatusOsObserver :: HandleUpdateSubscriptionReq :: ~HandleUpdateSubscriptionReq() {}
+inline SystemStatusOsObserver :: HandleRequestData :: ~HandleRequestData() {}
+inline SystemStatusOsObserver :: HandleUnsubscribeReq :: ~HandleUnsubscribeReq () {}
+inline SystemStatusOsObserver :: HandleUnsubscribeAllReq :: ~HandleUnsubscribeAllReq () {}
+
+inline SystemStatusOsObserver :: HandleNotify :: ~HandleNotify () {
+ list <IDataItemCore *> :: iterator it = mDList.begin ();
+ for (; it != mDList.end (); ++it) {
+ delete *it;
+ *it = NULL;
+ }
+}
+
+inline SystemStatusOsObserver :: HandleTurnOn :: ~HandleTurnOn () {}
+inline SystemStatusOsObserver :: HandleTurnOff :: ~HandleTurnOff () {}
+
+
+} // namespace loc_core
+
+#endif //__SYSTEM_STATUS__
+