hti/PC_Tools/HTIGateway/HtiGateway/src/HtiMessage.cpp
branchRCL_3
changeset 59 8ad140f3dd41
parent 0 a03f92240627
equal deleted inserted replaced
49:7fdc9a71d314 59:8ad140f3dd41
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 * 
       
    14 * Description:
       
    15 *   This file contains implementation of HtiMessage class.
       
    16 */
       
    17 
       
    18 #include "htimessage.h"
       
    19 #include "crc16.h"
       
    20 #include <memory.h>
       
    21 #include <crtdbg.h>
       
    22 #include <stdio.h>
       
    23 
       
    24 static const BYTE HTI_ERR_CMD = 0xFF;
       
    25 static const int HTI_MIN_ERR_MSG_SIZE = 10;
       
    26 static const int HTI_MAX_ERR_MSG_SIZE = 0xFF;
       
    27 
       
    28 
       
    29 HtiMessage::HtiMessage(DWORD serviceId, void* body, DWORD len, BYTE priority)
       
    30 {
       
    31 	m_ErrDescr = NULL;
       
    32 	m_Size = len + KMsgHeaderMinSize;
       
    33 	m_Message = new BYTE[m_Size];
       
    34 	//_RPT1(_CRT_WARN,"HtiMessage::HtiMessage %x\n", body);
       
    35 	//_RPT2(_CRT_WARN,"HtiMessage::HtiMessage m_Message %x <%d>\n", m_Message, m_Size);
       
    36 	memset(m_Message, 0, KMsgHeaderMinSize);
       
    37 	memcpy(m_Message + KMsgHeaderMinSize, body, len);
       
    38 	*((DWORD*)(m_Message + KMsgServiceNameOffset)) = serviceId;
       
    39 	*((DWORD*)(m_Message + KMsgBodySizeOffset)) = len;
       
    40 	m_Message[KMsgVersionOffset] = KDefaultVersion;
       
    41 	m_Message[KMsgPriorityOffset] = priority;
       
    42 	//CRC
       
    43 	*((WORD*)(m_Message + KMsgCrcOffset)) = CRC16CCITT(m_Message, KMsgHeaderMinSize-2);
       
    44 }
       
    45 
       
    46 HtiMessage::HtiMessage(void* message, DWORD len)
       
    47 {
       
    48 	m_ErrDescr = NULL;
       
    49 	BYTE* srcMsg = (BYTE*)message;
       
    50     int extSize = srcMsg[KMsgExtSizeOffset];
       
    51     int headerSize = MinHeaderSize() + extSize;
       
    52 
       
    53     m_Size = *((DWORD*)(srcMsg + KMsgBodySizeOffset));
       
    54 	m_Size += headerSize;
       
    55     
       
    56     //allocate header space
       
    57     m_Message = new BYTE[m_Size];
       
    58 	//_RPT1(_CRT_WARN,"HtiMessage::HtiMessage %x \n", message);
       
    59 	//_RPT2(_CRT_WARN,"HtiMessage::HtiMessage m_Message %x <%d>\n", m_Message, m_Size);
       
    60     
       
    61     //copy message
       
    62 	m_MessageReminderSize = m_Size;
       
    63 	AddToBody( message, len);
       
    64 	//memcpy( m_Message, message, min(m_MessageReminderSize, len) );
       
    65 	//m_MessageReminderSize -= min(m_MessageReminderSize, len);
       
    66 }
       
    67 
       
    68 DWORD HtiMessage::AddToBody(void* data, DWORD len)
       
    69 {
       
    70 	//_RPT1(_CRT_WARN,"HtiMessage::AddToBody %x\n", data);
       
    71 	DWORD copyLen = min(m_MessageReminderSize, len);
       
    72 	memcpy( m_Message + m_Size - m_MessageReminderSize, data, copyLen);
       
    73 	m_MessageReminderSize -= copyLen;
       
    74 	return copyLen;
       
    75 
       
    76 /*
       
    77 	if ( m_MessageReminderSize <= len) //last part
       
    78 	{
       
    79 		memcpy(m_Message + m_Size - m_MessageReminderSize, data, m_MessageReminderSize);
       
    80 		DWORD copyLen = m_MessageReminderSize;
       
    81 		m_MessageReminderSize = 0;
       
    82 		return copyLen;
       
    83 	}
       
    84 	else //in the middle
       
    85 	{
       
    86 		memcpy(m_Message + m_Size - m_MessageReminderSize, data, len);
       
    87 		m_MessageReminderSize -= len;
       
    88 	}
       
    89 
       
    90 	return len;
       
    91 */
       
    92 }
       
    93 
       
    94 HtiMessage::~HtiMessage()
       
    95 {
       
    96 	//_RPT1(_CRT_WARN,"~HtiMessage err %x\n", m_ErrDescr);
       
    97 	//_RPT1(_CRT_WARN,"~HtiMessage msg %x\n", m_Message);
       
    98 	delete[] m_ErrDescr;
       
    99 	delete[] m_Message;
       
   100 }
       
   101 
       
   102 /**
       
   103 * Returns whole HTI message including header
       
   104 */
       
   105 void* HtiMessage::HtiData()
       
   106 {
       
   107 	return m_Message;
       
   108 }
       
   109 
       
   110 DWORD HtiMessage::HtiDataSize()
       
   111 {
       
   112 	return m_Size;
       
   113 }
       
   114 
       
   115 DWORD HtiMessage::GetBodySize()
       
   116 {
       
   117 	return  *((DWORD*)(m_Message + KMsgBodySizeOffset));
       
   118 }
       
   119 
       
   120 DWORD HtiMessage::GetExtSize()
       
   121 {
       
   122 	return m_Message[KMsgExtSizeOffset];
       
   123 }
       
   124 
       
   125 int HtiMessage::GetBodyStart()
       
   126 {
       
   127 	return GetExtSize()+MinHeaderSize();
       
   128 }
       
   129 
       
   130 void* HtiMessage::GetBody()
       
   131 {
       
   132 	return m_Message+GetBodyStart();
       
   133 }
       
   134 
       
   135 DWORD HtiMessage::GetServiceUID()
       
   136 {
       
   137 	return *((DWORD*)(m_Message + KMsgServiceNameOffset));
       
   138 }
       
   139 
       
   140 bool HtiMessage::CheckValidHtiHeader(void* header)
       
   141 {
       
   142 	//check CRC16
       
   143 	WORD headerCrc16 = *((WORD*)((BYTE*)header+KMsgCrcOffset));
       
   144 	WORD calcCrc16 = CRC16CCITT(header, KMsgCrcOffset);
       
   145 
       
   146 	return headerCrc16 == calcCrc16;
       
   147 }
       
   148 
       
   149 DWORD HtiMessage::ExtractMsgSizeFromHeader(void* header)
       
   150 {
       
   151 	return *((DWORD*)(((BYTE*)header)+KMsgBodySizeOffset));
       
   152 }
       
   153 
       
   154 int HtiMessage::MinHeaderSize()
       
   155 {
       
   156 	return KMsgHeaderMinSize;
       
   157 }
       
   158 
       
   159 HtiMessage* HtiMessage::CreateErrorMessage(int errorCode, const char* errDescr)
       
   160 {
       
   161 	BYTE* msg = new BYTE[ HTI_MAX_ERR_MSG_SIZE ];
       
   162 	memset(msg, 0, HTI_MAX_ERR_MSG_SIZE );
       
   163 	msg[0] = HTI_ERR_CMD;
       
   164 	*((DWORD*)(msg + HtiServiceErrCodeOffset)) = errorCode;
       
   165 	*((DWORD*)(msg + HtiErrServiceUidOffset)) = HTI_SYSTEM_SERVICE_UID;
       
   166 	int descrLen = min(strlen( errDescr ), HTI_MAX_ERR_MSG_SIZE - HtiErrDescrOffset );
       
   167 	memcpy( msg + HtiErrDescrOffset,
       
   168 			errDescr,
       
   169 			descrLen
       
   170 			);
       
   171 	HtiMessage* newMsg = new HtiMessage(HTI_SYSTEM_SERVICE_UID,
       
   172 										msg,
       
   173 										descrLen + HtiErrDescrOffset + MinHeaderSize());
       
   174 	return newMsg;
       
   175 }
       
   176 
       
   177 bool HtiMessage::IsErrorMessage()
       
   178 {
       
   179 	if ( m_Message )
       
   180 	{
       
   181 		return GetServiceUID() == HTI_SYSTEM_SERVICE_UID &&
       
   182 		   m_Message[GetBodyStart()] == HTI_ERR_CMD &&
       
   183 		   GetBodySize()>= HTI_MIN_ERR_MSG_SIZE ;
       
   184 	}
       
   185 	return false;
       
   186 }
       
   187 
       
   188 int HtiMessage::HtiErrorCode()
       
   189 {
       
   190 	if ( IsErrorMessage() )
       
   191 	{
       
   192 		return m_Message[GetBodyStart()+HtiErrCodeOffset];
       
   193 	}
       
   194 	return -1;
       
   195 }
       
   196 int HtiMessage::ServiceErrorCode()
       
   197 {
       
   198 	if ( IsErrorMessage() )
       
   199 	{
       
   200 		return  *((DWORD*)(m_Message + GetBodyStart() + HtiServiceErrCodeOffset));
       
   201 	}
       
   202 	return -1;
       
   203 }
       
   204 
       
   205 char* HtiMessage::ErrorDescription()
       
   206 {
       
   207 	if ( IsErrorMessage() )
       
   208 	{
       
   209 		int desrLen = GetBodySize() - HtiErrDescrOffset;
       
   210 		m_ErrDescr = new char[desrLen+1];
       
   211 		//_RPT2(_CRT_WARN,"HtiMessage::ErrorDescription %x <%d>\n", m_ErrDescr, desrLen+1);
       
   212 		memcpy( m_ErrDescr,
       
   213 				m_Message + GetBodyStart() + HtiErrDescrOffset,
       
   214 				desrLen );
       
   215 		m_ErrDescr[desrLen] = 0;
       
   216 		return m_ErrDescr;
       
   217 	}
       
   218 	return NULL;
       
   219 }
       
   220 
       
   221 int HtiMessage::ErrorServiceUid()
       
   222 {
       
   223 	if ( IsErrorMessage() )
       
   224 	{
       
   225 		return  *((DWORD*)(m_Message + GetBodyStart() + HtiErrServiceUidOffset));
       
   226 	}
       
   227 	return -1;
       
   228 }