2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FIo_LocalMessagePortImpl.cpp
20 * @brief This is the implementation file for the _LocalMessagePortImpl class.
24 #include <unique_ptr.h>
26 #include <FBaseSysLog.h>
27 #include <FBaseColHashMap.h>
28 #include <FBaseRtIEventArg.h>
29 #include <FIoLocalMessagePort.h>
30 #include <FIoIMessagePortListener.h>
32 #include "FIo_LocalMessagePortImpl.h"
33 #include "FIo_RemoteMessagePortImpl.h"
34 #include "FIo_MessagePortManagerImpl.h"
35 #include "FIo_MessagePortProxy.h"
39 using namespace Tizen::Base;
40 using namespace Tizen::Base::Runtime;
41 using namespace Tizen::Base::Collection;
42 using namespace Tizen::App;
44 namespace Tizen { namespace Io
47 class _MessagePortEventArg
51 _MessagePortEventArg()
56 RemoteMessagePort* __pRemotePort;
60 class _MessagePortEvent
64 virtual void FireImpl(IEventListener& listener, const IEventArg& arg)
66 IMessagePortListener* pListener = dynamic_cast<IMessagePortListener*> (&listener);
67 if (pListener != null)
69 const _MessagePortEventArg* pArg = dynamic_cast<const _MessagePortEventArg*>(&arg);
72 if (pArg->__pRemotePort == null)
74 pListener->OnMessageReceivedN(pArg->__pMap);
78 pListener->OnMessageReceivedN(pArg->__pRemotePort, pArg->__pMap);
85 _LocalMessagePortImpl::_LocalMessagePortImpl(void)
92 _LocalMessagePortImpl::~_LocalMessagePortImpl(void)
98 _LocalMessagePortImpl::Construct(const Tizen::Base::String& port, bool isTrusted)
100 result r = _MessagePortProxy::GetProxy()->RegisterMessagePort(port, isTrusted, *this);
101 SysTryReturnResult(NID_IO, r == E_SUCCESS, r, "Failed to initialize a message port.");
103 _MessagePortEvent* pEvent = new (std::nothrow) _MessagePortEvent();
104 SysTryReturnResult(NID_IO, pEvent != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
108 __isTrusted = isTrusted;
114 _LocalMessagePortImpl::AddMessagePortListener(IMessagePortListener& listener)
116 return __pEvent->AddListener(listener);
120 _LocalMessagePortImpl::RemoveMessagePortListener(IMessagePortListener& listener)
122 return __pEvent->RemoveListener(listener);
126 _LocalMessagePortImpl::GetName(void) const
132 _LocalMessagePortImpl::IsTrusted(void) const
138 _LocalMessagePortImpl::OnMessageReceivedN(IMap* pMap)
140 _MessagePortEventArg* pEventArg= new (std::nothrow) _MessagePortEventArg();
141 if(pEventArg != null)
143 pEventArg->__pMap = pMap;
144 __pEvent->Fire(*pEventArg);
149 _LocalMessagePortImpl::OnMessageReceivedN(const AppId& remoteAppId, const String& remotePort, bool isTrusted, IMap* pMap)
151 SysLog(NID_IO, "A message is received from remote port [%ls:%ls].", remoteAppId.GetPointer(), remotePort.GetPointer());
153 _MessagePortManagerImpl* pManager = _MessagePortManagerImpl::GetInstance();
154 SysTryReturnVoidResult(NID_IO, pManager != null, GetLastResult(), "Propagating.");
156 RemoteMessagePort* pRemotePort = pManager->GetRemoteMessagePort(remoteAppId, remotePort, isTrusted);
158 _MessagePortEventArg* pEventArg = new (std::nothrow) _MessagePortEventArg();
159 if(pEventArg != null)
161 pEventArg->__pRemotePort = pRemotePort;
162 pEventArg->__pMap = pMap;
163 __pEvent->Fire(*pEventArg);
168 _LocalMessagePortImpl::GetMessagePort(const String& port, bool isTrusted)
170 result r = E_SUCCESS;
172 LocalMessagePort* pLocalMessagePort = new (std::nothrow) LocalMessagePort;
173 SysTryReturn(NID_IO, pLocalMessagePort != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
175 unique_ptr<_LocalMessagePortImpl> pImpl(new (std::nothrow) _LocalMessagePortImpl);
176 SysTryCatch(NID_IO, pImpl != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
178 r = pImpl->Construct(port, isTrusted);
179 SysTryCatch(NID_IO, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] Failed to initialize a message port.");
181 pLocalMessagePort->__pLocalMessagePortImpl = pImpl.release();
184 return pLocalMessagePort;
187 delete pLocalMessagePort;