javacommons/comms/src/commsmessage.cpp
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/comms/src/commsmessage.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,373 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  This class provides container for message.
+*
+*/
+
+#include <string.h>
+
+#include "javacommonutils.h"
+#include "exceptionbase.h"
+
+#include "commsmessage.h"
+#include "logger.h"
+#include "javauid.h"
+
+
+namespace java
+{
+namespace comms
+{
+using namespace std;
+using namespace java::util;
+
+
+OS_EXPORT CommsMessage::CommsMessage()
+        : mStream(ios::in | ios::out | ios::binary), mArray(0)
+{
+    memset(&mHeader, 0, sizeof(mHeader));
+}
+
+
+OS_EXPORT CommsMessage::CommsMessage(const ipcMessage_t* aMessage)
+        : mStream(ios::in | ios::out | ios::binary), mArray(0)
+{
+    mHeader = aMessage->ipcHeader;
+
+    mStream.clear();
+    mStream.str(""); //reset
+    mStream.write(aMessage->data, aMessage->ipcHeader.length-sizeof(aMessage->ipcHeader));
+
+}
+
+
+OS_EXPORT CommsMessage::CommsMessage(const CommsMessage& aMessage)
+        : mStream(ios::in | ios::out | ios::binary), mArray(0)
+{
+    *this = aMessage;
+}
+
+
+OS_EXPORT CommsMessage& CommsMessage::operator=(const CommsMessage& aMessage)
+{
+    if (this != &aMessage)
+    {
+        mHeader = aMessage.mHeader;
+
+        mStream.clear();
+        mStream.str(""); //reset
+        mStream << aMessage.toString();
+    }
+    return *this;
+}
+
+
+OS_EXPORT CommsMessage::~CommsMessage()
+{
+    delete[] mArray;
+}
+
+
+OS_EXPORT void CommsMessage::setMessageId(int aMessageId)
+{
+    mHeader.messageId = aMessageId;
+}
+
+
+OS_EXPORT void CommsMessage::setModuleId(int aModuleId)
+{
+    mHeader.moduleId = aModuleId;
+}
+
+
+OS_EXPORT void CommsMessage::setReceiver(int aReceiver)
+{
+    mHeader.receiver = aReceiver;
+}
+
+
+OS_EXPORT void CommsMessage::setSender(int aSender)
+{
+    mHeader.sender = aSender;
+}
+
+
+OS_EXPORT void CommsMessage::setMessageRef(int aMessageRef)
+{
+    mHeader.messageRef = aMessageRef;
+}
+
+
+OS_EXPORT int CommsMessage::getMessageId() const
+{
+    return mHeader.messageId;
+}
+
+
+OS_EXPORT int CommsMessage::getModuleId() const
+{
+    return mHeader.moduleId;
+}
+
+
+OS_EXPORT int CommsMessage::getReceiver() const
+{
+    return mHeader.receiver;
+}
+
+
+OS_EXPORT int CommsMessage::getSender() const
+{
+    return mHeader.sender;
+}
+
+
+OS_EXPORT bool CommsMessage::hasPermission(const CommsPermission& aPermission) const
+{
+    return (mHeader.permissions & aPermission) == aPermission;
+}
+
+
+OS_EXPORT int CommsMessage::getMessageRef() const
+{
+    return mHeader.messageRef;
+}
+
+
+OS_EXPORT void CommsMessage::replyTo(const CommsMessage& aMessage)
+{
+    setModuleId(aMessage.getModuleId());
+    setMessageId(aMessage.getMessageId());
+    setMessageRef(aMessage.getMessageRef());
+    setReceiver(aMessage.getSender());
+    setSender(aMessage.getReceiver());
+}
+
+
+OS_EXPORT CommsMessage& CommsMessage::operator << (const std::string& aStr)
+{
+    mStream << aStr.size() << " " << aStr;
+    return *this;
+}
+
+
+OS_EXPORT CommsMessage& CommsMessage::operator << (const std::wstring& aStr)
+{
+    string str;
+    try
+    {
+        char* utf8 = JavaCommonUtils::wstringToUtf8(aStr);
+        str.assign(utf8);
+        delete[] utf8;
+    }
+    catch (ExceptionBase& e)
+    {
+        ELOG2(EJavaComms, "%s: wstringToUtf8 failed: %s", __PRETTY_FUNCTION__, e.toString().c_str());
+    }
+
+    (*this) << str;
+
+    return *this;
+}
+
+
+OS_EXPORT CommsMessage& CommsMessage::operator << (const int& aInt)
+{
+    (*this) << JavaCommonUtils::intToString(aInt);
+    return *this;
+}
+
+
+OS_EXPORT CommsMessage& CommsMessage::operator << (const long long& aLong)
+{
+    (*this) << JavaCommonUtils::longLongToString(aLong);
+    return *this;
+}
+
+
+OS_EXPORT CommsMessage& CommsMessage::operator << (const java::util::Uid& aUid)
+{
+    (*this) << aUid.toString();
+    return *this;
+}
+
+
+OS_EXPORT CommsMessage& CommsMessage::operator >> (std::wstring& aStr)
+{
+    string str;
+    (*this) >> str;
+
+    try
+    {
+        aStr = JavaCommonUtils::utf8ToWstring(str.c_str());
+    }
+    catch (ExceptionBase& e)
+    {
+        ELOG2(EJavaComms, "%s: utf8ToWstring failed: %s", __PRETTY_FUNCTION__, e.toString().c_str());
+        aStr = L"";
+    }
+
+    return *this;
+}
+
+
+OS_EXPORT CommsMessage& CommsMessage::operator >> (std::string& aStr)
+{
+    aStr.clear();
+    int length = 0;
+
+    if (mStream >> length)
+    {
+        //Below is skipped space character.
+        if (!(mStream.get()))
+        {
+            ELOG2(EJavaComms, "ios::badbit - no space after length, invalid stream? - msgId=%d - moduleId=%d",
+                  getMessageId(), getModuleId());
+            mStream.setstate(ios::badbit);
+            return *this;
+        }
+
+        char* retPtr = new char[length];
+        if (!(mStream.read(retPtr,length)))
+        {
+            ELOG2(EJavaComms, "ios::badbit - unable read all, invalid stream? - msgId=%d - moduleId=%d",
+                  getMessageId(), getModuleId());
+            mStream.setstate(ios::badbit);
+            delete [] retPtr;
+            return *this;
+        }
+        aStr.append(retPtr, length);
+        delete [] retPtr;
+    }
+    else
+    {
+        LOG2(EJavaComms, EInfo, "ios::badbit - nothing to read - msgId=%d - moduleId=%d",
+             getMessageId(), getModuleId());
+        mStream.setstate(ios::badbit);
+    }
+    return *this;
+}
+
+
+OS_EXPORT CommsMessage& CommsMessage::operator >> (int& aInt)
+{
+    string str;
+    (*this) >> str;
+    try
+    {
+        aInt = JavaCommonUtils::stringToInt(str);
+    }
+    catch (ExceptionBase& e)
+    {
+        aInt = 0;
+        LOG3(EJavaComms, EInfo, "CommsMessage::operator >> (int& aInt) failed: %s - msgId=%d - moduleId=%d",
+             e.toString().c_str(), getMessageId(), getModuleId());
+    }
+    return *this;
+}
+
+
+OS_EXPORT CommsMessage& CommsMessage::operator >> (long long& aLong)
+{
+    string str;
+    (*this) >> str;
+    try
+    {
+        aLong = JavaCommonUtils::stringToLongLong(str);
+    }
+    catch (ExceptionBase& e)
+    {
+        aLong = 0LL;
+        LOG3(EJavaComms, EInfo, "CommsMessage::operator >> (long long& aLong) failed: %s - msgId=%d - moduleId=%d",
+             e.toString().c_str(), getMessageId(), getModuleId());
+    }
+    return *this;
+}
+
+
+OS_EXPORT CommsMessage& CommsMessage::operator >> (java::util::Uid& aUid)
+{
+    std::wstring str;
+    (*this) >> str;
+    java::util::Uid uid(str);
+    aUid = uid;
+    return *this;
+}
+
+
+OS_EXPORT bool CommsMessage::operator !() const
+{
+    if ((mStream.fail()) || (mStream.bad()))
+        return true;
+    return false;
+}
+
+
+OS_EXPORT CommsMessage::operator void*() const
+{
+    if ((mStream.fail()) || (mStream.bad()))
+        return 0;
+    return const_cast<CommsMessage*>(this);
+}
+
+
+OS_EXPORT std::string CommsMessage::toString() const
+{
+    return mStream.str();
+}
+
+
+OS_EXPORT char* CommsMessage::toByteArray()
+{
+    // get size
+    mStream.seekg(0, ios::end);
+    int size = mStream.tellg();
+    mStream.seekg(0, ios::beg);
+
+    if (size < 0)
+    {
+        // S60 STL implementation sets error flag on and return size -1 if stream is empty
+        size = 0;
+        mStream.clear();
+    }
+
+    delete[] mArray;
+
+    mArray = new char[size + sizeof(ipcHeader_t)];
+    ipcMessage_t* msg = reinterpret_cast<ipcMessage_t*>(mArray);
+
+    // get content
+    mStream.read(msg->data, size);
+
+    msg->ipcHeader = mHeader;
+    msg->ipcHeader.length = size + sizeof(ipcHeader_t);
+
+    return mArray;
+}
+
+
+OS_EXPORT void CommsMessage::begin()
+{
+    mStream.seekg(0, ios::beg);
+}
+
+
+OS_EXPORT void CommsMessage::reset()
+{
+    CommsMessage empty;
+    *this = empty;
+}
+
+} // namespace comms
+} // namespace java