#include <FIo_AppServiceIpcMessages.h>
#include <FIo_IpcClient.h>
#include "FIo_SerialPortImpl.h"
+#include "FSys_CommunicationDispatcherClient.h"
using namespace std;
using namespace Tizen::App;
using namespace Tizen::Base;
using namespace Tizen::Base::Runtime;
using namespace Tizen::Base::Collection;
+using namespace Tizen::System;
namespace Tizen { namespace Io
{
}
else
{
- pListener->OnSerialPortDataReceivedN(*(pArg->__pBuffer));
+ SysLog(NID_IO, "Forward byte data to application.");
+ ByteBuffer* pBuffer = pArg->__pBuffer;
+ pListener->OnSerialPortDataReceivedN(*pBuffer);
}
}
}
+
+ SysLog(NID_IO, "data is forwarded to application.");
}
};
-_SerialPortImpl::_SerialPortImpl(ISerialPortEventListener& listener)
+_SerialPortImpl* _SerialPortImpl::__pSerialPortImpl = null;
+
+_SerialPortImpl*
+_SerialPortImpl::GetInstance(void)
+{
+ SysLog(NID_IO, "Requires SerialPort instance");
+ if(__pSerialPortImpl == null)
+ {
+ __pSerialPortImpl = new (std::nothrow) _SerialPortImpl();
+ }
+ return __pSerialPortImpl;
+}
+
+_SerialPortImpl::_SerialPortImpl()
: __pIpcClient(null)
, __pEvent(null)
+ , __isOpended(false)
{
+ SysLog(NID_IO, "Initialize SerialPort");
result r = E_SUCCESS;
- ArrayList request;
- ArrayList response;
+ _CommunicationDispatcherClient* pCommunicationDispatcherClient = _CommunicationDispatcherClient::GetInstance();
+ SysTryCatch(NID_IO, pCommunicationDispatcherClient != null, r = E_SYSTEM, r, "It is failed to get CommunicationDispatcherClient.");
- __pIpcClient = new (std::nothrow) _IpcClient();
- SysTryReturnVoidResult(NID_IO, __pIpcClient != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
- r = __pIpcClient->Construct(COMMUNICATION_DISPATCHER_IPC_ID, this);
- SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
+ r = pCommunicationDispatcherClient->RegisterCommunicationListener(ACCESSORY_MANAGER_SERVICE_ID, *this);
+ SysTryCatch(NID_IO, r == E_SUCCESS, r = E_SYSTEM, r, "It is failed to register on CommunicationDispatcherClient.");
+
+ __pIpcClient = pCommunicationDispatcherClient->GetIpcClient();
+ SysTryCatch(NID_IO, __pIpcClient != null, r = E_SYSTEM, r, "It is failed to get IpcClient from CommunicationDispatcherClient.");
__pEvent = new (std::nothrow) _SerialPortEvent();
- SysTryReturnVoidResult(NID_IO, __pEvent != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ SysTryCatch(NID_IO, __pEvent != null, r = E_OUT_OF_MEMORY, r, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+
+CATCH:
+ SetLastResult(r);
+}
- __pEvent->AddListener(listener);
+_SerialPortImpl::~_SerialPortImpl(void)
+{
+ delete __pEvent;
+
+ __pEvent = null;
+ __pIpcClient = null;
+}
+
+result
+_SerialPortImpl::SerialOpen(void)
+{
+ result r = E_SUCCESS;
+ ArrayList request;
+ ArrayList response;
+ String serviceId(ACCESSORY_MANAGER_SERVICE_ID);
+ String commandId(SERIAL_COMMAND_OPEN);
+ SysLog(NID_IO, "Open SerialPort");
+ SysTryReturnResult(NID_IO, __pIpcClient != null, E_SYSTEM, "IPC is not ready.");
r = request.Construct();
- SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
- r = request.Add(String(ACCESSORY_MANAGER_SERVICE_ID));
- SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
- r = request.Add(String(SERIAL_COMMAND_OPEN));
- SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
r = response.Construct();
- SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
+
+ r = request.Add(serviceId);
+ r = request.Add(commandId);
unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(request, &response));
- SysTryReturnVoidResult(NID_IO, pMsg != NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ SysTryReturnResult(NID_IO, pMsg != NULL, r = E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
- r = __pIpcClient->SendRequest(pMsg.get());
- SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
+ SysLog(NID_IO, "Try to send IPC message");
+ r = __pIpcClient->SendRequest(*pMsg);
+ SysTryReturnResult(NID_IO, r == E_SUCCESS, E_SYSTEM, "[%s] Propagated.", GetErrorMessage(r));
+
+ SysLog(NID_IO, "Sent IPC message");
- SetLastResult(E_SUCCESS);
+ __isOpended = true;
+ return r;
}
-_SerialPortImpl::~_SerialPortImpl(void)
+result
+_SerialPortImpl::SerialClose(void)
{
result r = E_SUCCESS;
ArrayList request;
ArrayList response;
+ String serviceId(ACCESSORY_MANAGER_SERVICE_ID);
+ String commandId(SERIAL_COMMAND_CLOSE);
- SysTryReturnVoidResult(NID_IO, __pIpcClient != null, E_SYSTEM, "[E_SYSTEM] IPC client is not ready.");
+ SysLog(NID_IO, "Close SerialPort");
+ SysTryReturnResult(NID_IO, __pIpcClient != null, E_SYSTEM, "IPC client is not ready.");
r = request.Construct();
- SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
- r = request.Add(String(ACCESSORY_MANAGER_SERVICE_ID));
- SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
- r = request.Add(String(SERIAL_COMMAND_CLOSE));
- SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
+ r = request.Add(serviceId);
+ r = request.Add(commandId);
r = response.Construct();
- SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(request, &response));
- SysTryReturnVoidResult(NID_IO, pMsg != NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
+ SysTryReturnResult(NID_IO, pMsg != NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
- r = __pIpcClient->SendRequest(pMsg.get());
- SysTryReturnVoidResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
+ r = __pIpcClient->SendRequest(*pMsg);
+ SysTryReturnResult(NID_IO, r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r));
- delete __pEvent;
+ __isOpended = false;
+
+ return r;
+}
+
+bool
+_SerialPortImpl::IsOpended(void)
+{
+ return __isOpended;
+}
+
+result
+_SerialPortImpl::SetSerialPortEventListener(ISerialPortEventListener& listener)
+{
+ result r = E_SUCCESS;
+ SysTryReturnResult(NID_IO, __pEvent != null, E_SYSTEM, "Event is not ready.");
+ r = __pEvent->AddListener(listener);
- SetLastResult(E_SUCCESS);
+ return r;
}
result
ByteBuffer* pByteBuffer = null;
ArrayList request;
ArrayList response;
+ String serviceId(ACCESSORY_MANAGER_SERVICE_ID);
+ String commandId(SERIAL_COMMAND_WRITE);
SysTryReturnResult(NID_IO, byteBuffer.GetCapacity() < SERIAL_BUFFER_SIZE, E_MAX_EXCEEDED, "[E_MAX_EXCEEDED] The buffer size exceeded a limit of the current device.");
SysTryReturnResult(NID_IO, __pIpcClient != null, E_SYSTEM, "[E_SYSTEM] IPC client is not ready");
r = request.Construct();
- SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] Propagated.", GetErrorMessage(r));
- r = request.Add(String(ACCESSORY_MANAGER_SERVICE_ID));
- SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] Propagated.", GetErrorMessage(r));
- r = request.Add(String(SERIAL_COMMAND_WRITE));
- SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] Propagated.", GetErrorMessage(r));
+ r = request.Add(serviceId);
+ r = request.Add(commandId);
r = request.Add(*pByteBuffer);
- SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] Propagated.", GetErrorMessage(r));
r = response.Construct();
- SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] Propagated.", GetErrorMessage(r));
unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(request, &response));
SysTryReturnResult(NID_IO, pMsg != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
}
void
-_SerialPortImpl::OnIpcResponseReceived(_IpcClient& client, const IPC::Message& message)
-{
- IPC_BEGIN_MESSAGE_MAP(_SerialPortImpl, message)
- IPC_MESSAGE_HANDLER_EX(IoService_Data, &client, OnDataReceived)
- IPC_END_MESSAGE_MAP_EX()
-}
-
-void
_SerialPortImpl::OnDataReceived(const ArrayList& data)
{
ByteBuffer* pBuffer = null;
- unique_ptr<String> pCommand((String*)data.GetAt(SERIAL_DATA_HEAD));
+ String* pCommand = (String*)(data.GetAt(SERIAL_DATA_HEAD));
SysTryReturnVoidResult(NID_APP, pCommand != null, E_SYSTEM, "[E_SYSTEM] There is no command");
if (pCommand->Equals(SERIAL_COMMAND_DATA, true))
pBuffer = (ByteBuffer*)data.GetAt(SERIAL_DATA_BODY);
if (pBuffer != null)
{
+ ArrayList* pData = const_cast<ArrayList*>(&data);
+ pData->Remove(*pBuffer);
_SerialPortEventArg* pEventArg= new (std::nothrow) _SerialPortEventArg(pBuffer);
if(pEventArg != null)
{