Merge "Alarm Conditional AppLaunch Refactoring" into tizen_2.2
[platform/framework/native/appfw.git] / src / io / FIo_MmcStorageManagerProxy.cpp
index f3b43b4..e8b80e1 100644 (file)
@@ -1,5 +1,4 @@
 //
-// Open Service Platform
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the License);
 
 #include <FBaseErrors.h>
 #include <FBaseSysLog.h>
-#include <FIo_IpcClient.h>
+#include "FIo_IpcClient.h"
 
-#include "FIo_IMmcStorageServiceEventListener.h"
 #include "FIo_MmcStorageManagerProxy.h"
 #include "FIo_MmcStorageManagerIpcMessages.h"
 
 using namespace std;
-
 using namespace Tizen::Base;
 
 namespace Tizen { namespace Io
 {
 
+_MmcStorageManagerProxy* _MmcStorageManagerProxy::__pMmcStorageManagerProxyInstance = null;
+
 _MmcStorageManagerProxy::_MmcStorageManagerProxy(void)
        : __pIpcClient(null)
+       , __pListener(null)
 {
 }
 
@@ -48,7 +48,7 @@ _MmcStorageManagerProxy::~_MmcStorageManagerProxy(void)
 }
 
 result
-_MmcStorageManagerProxy::Construct(_IMmcStorageServiceEventListener* pListener)
+_MmcStorageManagerProxy::Construct(void)
 {
        unique_ptr<_IpcClient> pIpcClient(new (std::nothrow) _IpcClient);
        SysTryReturnResult(NID_IO, pIpcClient != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
@@ -57,11 +57,60 @@ _MmcStorageManagerProxy::Construct(_IMmcStorageServiceEventListener* pListener)
        SysTryReturnResult(NID_IO, r == E_SUCCESS, r, "Failed to connect to IPC server.");
 
        __pIpcClient = pIpcClient.release();
-       __pListener = pListener;
 
        return E_SUCCESS;
 }
 
+void
+_MmcStorageManagerProxy::InitSingleton(void)
+{
+       _MmcStorageManagerProxy* pInst = new (std::nothrow) _MmcStorageManagerProxy();
+       SysTryReturnVoidResult(NID_IO, pInst != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+
+       result r = pInst->Construct();
+       SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r));
+
+       __pMmcStorageManagerProxyInstance = pInst;
+
+       std::atexit(DestroySingleton);
+       return;
+
+CATCH:
+       delete pInst;
+}
+
+void
+_MmcStorageManagerProxy::DestroySingleton(void)
+{
+       delete __pMmcStorageManagerProxyInstance;
+}
+
+_MmcStorageManagerProxy*
+_MmcStorageManagerProxy::GetInstance(void)
+{
+       static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
+
+       if (__pMmcStorageManagerProxyInstance == null)
+       {
+               ClearLastResult();
+               pthread_once(&onceBlock, InitSingleton);
+               result r = GetLastResult();
+               if (IsFailed(r))
+               {
+                       onceBlock = PTHREAD_ONCE_INIT;
+                       SysPropagate(NID_IO, r);
+               }
+       }
+
+       return __pMmcStorageManagerProxyInstance;
+}
+
+void
+_MmcStorageManagerProxy::SetMmcStorageManagerListener(_IMmcStorageManagerListener* pListener)
+{
+       __pListener = pListener;
+}
+
 result
 _MmcStorageManagerProxy::Mount(void)
 {
@@ -127,24 +176,31 @@ void
 _MmcStorageManagerProxy::MountResponseReceived(result r)
 {
        SysLog(NID_IO, "Received Async mount response msg from server is : [%s]", GetErrorMessage(r));
-
-       __pListener->OnMmcMountResponseReceived(r);
+       if (__pListener != null)
+       {
+               __pListener->OnMmcMountResponseReceived(r);
+       }
 }
 
 void
 _MmcStorageManagerProxy::UnmountResponseReceived(result r)
 {
        SysLog(NID_IO, "Received Async unmount response msg from server is : [%s]", GetErrorMessage(r));
-
-       __pListener->OnMmcUnmountResponseReceived(r);
+       if (__pListener != null)
+       {
+               __pListener->OnMmcUnmountResponseReceived(r);
+       }
 }
 
 void
 _MmcStorageManagerProxy::FormatResponseReceived(result r)
 {
        SysLog(NID_IO, "Received Async format response msg from server is : [%s]", GetErrorMessage(r));
-
-       __pListener->OnMmcFormatResponseReceived(r);
+       if (__pListener != null)
+       {
+               __pListener->OnMmcFormatResponseReceived(r);
+       }
 }
 
-} } // Tizen::Io
+}} // Tizen::Io
+