Merge "Modify operator[] to get the right LastResult" into devel_3.0_main
[platform/framework/native/appfw.git] / src / io / FIo_MmcStorageManagerImpl.cpp
index a2e761a..9b30549 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);
  * @brief      This is the implementation file for _MmcStorageManagerImpl class.
  */
 
-#include <limits.h>
 #include <unique_ptr.h>
-#include <new>
 
 #include <FBaseSysLog.h>
+#include <FBaseRtIEventArg.h>
 #include <FBase_NativeError.h>
-#include <FIo_MmcStorageManagerImpl.h>
+#include "FIoIMmcStorageMountListener.h"
+#include "FIoIMmcStorageFormatListener.h"
 
+#include "FIo_MmcStorageManagerImpl.h"
 #include "FIo_MmcStorageManagerProxy.h"
 
+using namespace std;
+
 using namespace Tizen::Base;
 using namespace Tizen::Base::Collection;
+using namespace Tizen::Base::Runtime;
 
 namespace Tizen { namespace Io
 {
 
+static const int MOUNT_TYPE = 0;
+static const int UNMOUNT_TYPE = 1;
+
+class _MountEventArg
+       : public IEventArg
+{
+public:
+       _MountEventArg(int type, result r)
+               : __type(type)
+               , __r(r)
+       {
+       }
+       int __type;
+       result __r;
+};
+
+class _FormatEventArg
+       : public IEventArg
+{
+public:
+       _FormatEventArg(result r)
+               : __r(r)
+       {
+       }
+       result __r;
+};
+
+class _MountEvent
+       : public Event
+{
+protected:
+       virtual void FireImpl(IEventListener& listener, const IEventArg& arg)
+       {
+               const _MountEventArg* pArg = dynamic_cast<const _MountEventArg*>(&arg);
+               if (pArg != null)
+               {
+                       IMmcStorageMountListener* pListener = dynamic_cast<IMmcStorageMountListener*> (&listener);
+                       if (pListener != null)
+                       {
+                               if (pArg->__type == MOUNT_TYPE) // Mount
+                               {
+                                       pListener->OnMmcStorageMounted(pArg->__r);
+                               }
+                               else    // Unmount
+                               {
+                                       pListener->OnMmcStorageUnmounted(pArg->__r);
+                               }
+                       }
+               }
+       }
+
+};
+
+class _FormatEvent
+       : public Event
+{
+protected:
+       virtual void FireImpl(IEventListener& listener, const IEventArg& arg)
+       {
+               IMmcStorageFormatListener* pListener = dynamic_cast<IMmcStorageFormatListener*> (&listener);
+               if (pListener != null)
+               {
+                       const _FormatEventArg* pArg = dynamic_cast<const _FormatEventArg*>(&arg);
+                       if (pArg != null)
+                       {
+                               pListener->OnMmcStorageFormatted(pArg->__r);
+                       }
+
+               }
+       }
+
+};
+
 _MmcStorageManagerImpl::_MmcStorageManagerImpl(void)
        : __pMmcStorageManagerProxy(null)
+       , __pMountEvent(null)
+       , __pFormatEvent(null)
 {
 }
 
 _MmcStorageManagerImpl::~_MmcStorageManagerImpl(void)
 {
+       delete __pMountEvent;
+       delete __pFormatEvent;
 }
 
 result
 _MmcStorageManagerImpl::Construct(void)
 {
-       result r = E_SUCCESS;
+       unique_ptr<_MountEvent> pMountEvent(new (std::nothrow) _MountEvent);
+       SysTryReturnResult(NID_IO, pMountEvent != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
 
-       std::unique_ptr<_MmcStorageManagerProxy> pMmcStorageManagerProxy(new (std::nothrow) _MmcStorageManagerProxy);
-       SysTryReturnResult(NID_IO, pMmcStorageManagerProxy != null, E_OUT_OF_MEMORY, "The memory is insufficient");
+       unique_ptr<_FormatEvent> pFormatEvent(new (std::nothrow) _FormatEvent);
+       SysTryReturnResult(NID_IO, pFormatEvent != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
 
-       r = pMmcStorageManagerProxy->Construct(this);
-       SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] __pMmcStorageManagerProxy->Construct() failed.", GetErrorMessage(r));
-
-       __pMmcStorageManagerProxy = pMmcStorageManagerProxy.release();
+       __pMountEvent = pMountEvent.release();
+       __pFormatEvent = pFormatEvent.release();
 
        return E_SUCCESS;
 }
@@ -67,139 +146,106 @@ _MmcStorageManagerImpl::GetInstance(void)
        static _MmcStorageManagerImpl* pImpl = null;
        if (pImpl == null)
        {
-               std::unique_ptr<_MmcStorageManagerImpl> p(new (std::nothrow) _MmcStorageManagerImpl);
-               SysTryReturn(NID_IO, p != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+               unique_ptr<_MmcStorageManagerImpl> pMmcStorageManagerImpl(new (std::nothrow) _MmcStorageManagerImpl);
+               SysTryReturn(NID_IO, pMmcStorageManagerImpl != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
 
-               result r = p->Construct();
-               SysTryReturn(NID_IO, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] Failed to initialize channel.");
+               result r = pMmcStorageManagerImpl->Construct();
+               SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Propagating to caller...", GetErrorMessage(r));
 
-               pImpl = p.release();
+               pImpl = pMmcStorageManagerImpl.release();
        }
 
        return pImpl;
-
 }
 
 result
 _MmcStorageManagerImpl::Mount(void)
 {
+       if (__pMmcStorageManagerProxy == null)
+       {
+               __pMmcStorageManagerProxy = _MmcStorageManagerProxy::GetInstance();
+               SysTryReturnResult(NID_IO, __pMmcStorageManagerProxy != null, E_SERVICE_BUSY, "Failed to get IPC proxy instance.");
+               __pMmcStorageManagerProxy->SetMmcStorageManagerListener(this);
+       }
        return __pMmcStorageManagerProxy->Mount();
 }
 
 result
 _MmcStorageManagerImpl::Unmount(void)
 {
+       if (__pMmcStorageManagerProxy == null)
+       {
+               __pMmcStorageManagerProxy = _MmcStorageManagerProxy::GetInstance();
+               SysTryReturnResult(NID_IO, __pMmcStorageManagerProxy != null, E_SERVICE_BUSY, "Failed to get IPC proxy instance.");
+               __pMmcStorageManagerProxy->SetMmcStorageManagerListener(this);
+       }
        return __pMmcStorageManagerProxy->Unmount();
 }
 
 result
 _MmcStorageManagerImpl::Format(void)
 {
+       if (__pMmcStorageManagerProxy == null)
+       {
+               __pMmcStorageManagerProxy = _MmcStorageManagerProxy::GetInstance();
+               SysTryReturnResult(NID_IO, __pMmcStorageManagerProxy != null, E_SERVICE_BUSY, "Failed to get IPC proxy instance.");
+               __pMmcStorageManagerProxy->SetMmcStorageManagerListener(this);
+       }
        return __pMmcStorageManagerProxy->Format();
 }
 
 result
 _MmcStorageManagerImpl::AddMmcStorageMountListener(IMmcStorageMountListener& listener)
 {
-       result r = __pMmcMountListener.Add(&listener);
-       SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
-
-       return E_SUCCESS;
+       return __pMountEvent->AddListener(listener);
 }
 
 result
 _MmcStorageManagerImpl::RemoveMmcStorageMountListener(IMmcStorageMountListener& listener)
 {
-       result r = __pMmcMountListener.Remove(&listener);
-       SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
-
-       return E_SUCCESS;
+       return __pMountEvent->RemoveListener(listener);
 }
 
 result
 _MmcStorageManagerImpl::AddMmcStorageFormatListener(IMmcStorageFormatListener& listener)
 {
-       result r = __pMmcFormatListener.Add(&listener);
-       SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
-
-       return E_SUCCESS;
+       return __pFormatEvent->AddListener(listener);
 }
 
 result
 _MmcStorageManagerImpl::RemoveMmcStorageFormatListener(IMmcStorageFormatListener& listener)
 {
-       result r = E_SUCCESS;
-
-       r = __pMmcFormatListener.Remove(&listener);
-       SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
-
-       return E_SUCCESS;
+       return __pFormatEvent->RemoveListener(listener);
 }
 
-result
+void
 _MmcStorageManagerImpl::OnMmcMountResponseReceived(result r)
 {
-       std::unique_ptr< IEnumeratorT< IMmcStorageMountListener* > >
-               pEnum(__pMmcMountListener.GetEnumeratorN());
-       if (pEnum.get())
+       _MountEventArg* pEventArg= new (std::nothrow) _MountEventArg(MOUNT_TYPE, r);
+       if(pEventArg != null)
        {
-               while (pEnum->MoveNext() == E_SUCCESS)
-               {
-                       IMmcStorageMountListener* pListener = null;
-                       pEnum->GetCurrent(pListener);
-                       if (pListener != null)
-                       {
-                               SysLog(NID_IO, "Final Mount() response sent to Application : [%s]", GetErrorMessage(r));
-                               pListener->OnMmcStorageMounted(r);
-                       }
-               }
+               __pMountEvent->Fire(*pEventArg);
        }
-
-       return E_SUCCESS;
 }
 
-result
+void
 _MmcStorageManagerImpl::OnMmcUnmountResponseReceived(result r)
 {
-       std::unique_ptr< IEnumeratorT< IMmcStorageMountListener* > >
-               pEnum(__pMmcMountListener.GetEnumeratorN());
-       if (pEnum.get())
+       _MountEventArg* pEventArg= new (std::nothrow) _MountEventArg(UNMOUNT_TYPE, r);
+       if(pEventArg != null)
        {
-               while (pEnum->MoveNext() == E_SUCCESS)
-               {
-                       IMmcStorageMountListener* pListener = null;
-                       pEnum->GetCurrent(pListener);
-                       if (pListener != null)
-                       {
-                               SysLog(NID_IO, "Final Unmount() response sent to Application : [%s]", GetErrorMessage(r));
-                               pListener->OnMmcStorageUnmounted(r);
-                       }
-               }
+               __pMountEvent->Fire(*pEventArg);
        }
-
-       return E_SUCCESS;
 }
 
-result
+void
 _MmcStorageManagerImpl::OnMmcFormatResponseReceived(result r)
 {
-       std::unique_ptr<IEnumeratorT< IMmcStorageFormatListener* > >
-               pEnum(__pMmcFormatListener.GetEnumeratorN());
-       if (pEnum.get())
+       _FormatEventArg* pEventArg= new (std::nothrow) _FormatEventArg(r);
+       if(pEventArg != null)
        {
-               while (pEnum->MoveNext() == E_SUCCESS)
-               {
-                       IMmcStorageFormatListener* pListener = null;
-                       pEnum->GetCurrent(pListener);
-                       if (pListener != null)
-                       {
-                               SysLog(NID_IO, "Final Format() response sent to Application : [%s]", GetErrorMessage(r));
-                               pListener->OnMmcStorageFormatted(r);
-                       }
-               }
+               __pFormatEvent->Fire(*pEventArg);
        }
-
-       return E_SUCCESS;
 }
 
 }} // Tizen::Io