Add DataItemObserver interface in SystemStatus

Add DataItemObserver interface in SystemStatus so
that clients can subscribe dataitem events from
SystemStatus. Also moving DateItem and its observer,
subscription classes into HAL

Simplify DataItem class implementation.

Change-Id: I7b2c3fc9dcf67dd6132bbcccda874e3f7ed6fa94
CRs-Fixed: 2041019 2072896
diff --git a/core/SystemStatus.cpp b/core/SystemStatus.cpp
index 50cb4ed..dc03604 100644
--- a/core/SystemStatus.cpp
+++ b/core/SystemStatus.cpp
@@ -35,8 +35,10 @@
 #include <sys/time.h>
 #include <pthread.h>
 #include <platform_lib_log_util.h>
+#include <MsgTask.h>
 #include <loc_nmea.h>
 #include <SystemStatus.h>
+#include <SystemStatusOsObserver.h>
 
 namespace loc_core
 {
@@ -1176,10 +1178,44 @@
 /******************************************************************************
  SystemStatus
 ******************************************************************************/
-pthread_mutex_t SystemStatus::mMutexSystemStatus = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t   SystemStatus::mMutexSystemStatus = PTHREAD_MUTEX_INITIALIZER;
+SystemStatus*     SystemStatus::mInstance = NULL;
 
-SystemStatus::SystemStatus()
+SystemStatus* SystemStatus::getInstance(const MsgTask* msgTask)
 {
+    pthread_mutex_lock(&mMutexSystemStatus);
+
+    if (!mInstance) {
+        // Instantiating for the first time. msgTask should not be NULL
+        if (msgTask == NULL) {
+            LOC_LOGE("SystemStatus: msgTask is NULL!!");
+            pthread_mutex_unlock(&mMutexSystemStatus);
+            return NULL;
+        }
+        mInstance = new (nothrow) SystemStatus(msgTask);
+        LOC_LOGD("SystemStatus::getInstance:%p. Msgtask:%p", mInstance, msgTask);
+    }
+
+    pthread_mutex_unlock(&mMutexSystemStatus);
+    return mInstance;
+}
+
+void SystemStatus::destroyInstance()
+{
+    delete mInstance;
+    mInstance = NULL;
+}
+
+IOsObserver* SystemStatus::getOsObserver()
+{
+    return &mSysStatusObsvr;
+}
+
+SystemStatus::SystemStatus(const MsgTask* msgTask) :
+    mSysStatusObsvr(msgTask)
+{
+    int result = 0;
+    ENTRY_LOG ();
     mCache.mLocation.clear();
 
     mCache.mTimeAndClock.clear();
@@ -1196,6 +1232,8 @@
     mCache.mNavData.clear();
 
     mCache.mPositionFailure.clear();
+
+    EXIT_LOG_WITH_ERROR ("%d",result);
 }
 
 /******************************************************************************