--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/smsprotocols/smsstack/test/smspdudbitems.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,387 @@
+// Copyright (c) 2003-2009 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:
+//
+
+
+
+#include "smspdudbitems.h"
+#include "Gsmumsg.h"
+#include "gsmubuf.h"
+#include <testconfigfileparser.h>
+
+
+EXPORT_C CSmsPduDbConcatSegment* CSmsPduDbConcatSegment::NewL(RFs& aFs, const CTestConfigItem& aItem, CSmsPDU::TSmsPDUType aType)
+ {
+ CSmsPduDbConcatSegment* self = new (ELeave) CSmsPduDbConcatSegment(aType);
+ CleanupStack::PushL(self);
+ self->DecodeL(aFs, aItem);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+
+
+EXPORT_C CSmsPduDbMessage* CSmsPduDbMessage::NewL(RFs& aFs, const CTestConfigItem& aItem, CSmsPDU::TSmsPDUType aType)
+ {
+ CSmsPduDbMessage* pdu = new (ELeave) CSmsPduDbMessage(aType);
+ CleanupStack::PushL(pdu);
+
+ pdu->DecodeL(aFs, aItem);
+
+ CleanupStack::Pop(pdu);
+
+ return pdu;
+ }
+
+
+
+
+
+EXPORT_C CSmsPduDbPdu* CSmsPduDbPdu::NewL(RFs& aFs, const CTestConfigItem& aItem, CSmsPDU::TSmsPDUType aType)
+ {
+ CSmsPduDbPdu* self = new (ELeave) CSmsPduDbPdu(aType);
+ CleanupStack::PushL(self);
+ self->DecodeL(aFs, aItem);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+
+
+EXPORT_C CSmsPduDbBase::~CSmsPduDbBase()
+ {
+ delete iSmsMessage;
+ }
+
+EXPORT_C CSmsPduDbConcat::~CSmsPduDbConcat()
+ {
+ iSegments.ResetAndDestroy();
+ }
+
+void CSmsPduDbPdu::DecodeL(RFs& aFs, const CTestConfigItem& aItem)
+ {
+ const TDesC8& val = aItem.Value();
+
+ User::LeaveIfError(CTestConfig::GetElement(val, KSmsPduDbDelimiter, CSmsPduDbBase::ESmsPduDbId, iId));
+
+ TPtrC8 pdu;
+ User::LeaveIfError(CTestConfig::GetElement(val, KSmsPduDbDelimiter, EPdu, pdu));
+ SetPduL(pdu);
+
+ const TInt err = CTestConfig::GetElement(val, KSmsPduDbDelimiter, EPduError, iDecodeError);
+ if (err != KErrNone)
+ {
+ iDecodeError = KErrNone;
+ }
+
+ (void) CTestConfig::GetElement(val, KSmsPduDbDelimiter, EPduDesc, iDescription); //ignore error
+
+ TRAP(iSmsMessageError, ConstructSmsMessageL(aFs));
+ }
+
+void CSmsPduDbPdu::ConstructSmsMessageL(RFs& aFs)
+ {
+ delete iSmsMessage;
+ iSmsMessage = NULL;
+ TGsmSms sms;
+ sms.SetPdu(iPdu);
+ const TBool mt = IsMobileTerminatedL();
+ iSmsMessage = CSmsMessage::NewL(aFs, sms, CSmsBuffer::NewL(), EFalse, mt);
+ }
+
+void CSmsPduDbConcatSegment::DecodeL(RFs& aFs, const CTestConfigItem& aItem)
+ {
+ const TDesC8& val = aItem.Value();
+
+ User::LeaveIfError(CTestConfig::GetElement(val, KSmsPduDbDelimiter, CSmsPduDbBase::ESmsPduDbId, iId));
+ User::LeaveIfError(CTestConfig::GetElement(val, KSmsPduDbDelimiter, EConcatSegment, iSegment));
+
+ TPtrC8 pdu;
+ User::LeaveIfError(CTestConfig::GetElement(val, KSmsPduDbDelimiter, EConcatPdu, pdu));
+ SetPduL(pdu);
+
+ const TInt err = CTestConfig::GetElement(val, KSmsPduDbDelimiter, EConcatError, iDecodeError);
+ if (err != KErrNone)
+ {
+ iDecodeError = KErrNone;
+ }
+
+ (void) CTestConfig::GetElement(val, KSmsPduDbDelimiter, EConcatDesc, iDescription); //ignore error
+
+ TRAP(iSmsMessageError, ConstructSmsMessageL(aFs));
+ }
+
+EXPORT_C void CSmsPduDbPdu::GetHexPdu(TDes8& aHexPdu) const
+ {
+ const TInt len = iPdu.Length();
+ aHexPdu.Zero();
+
+ for (TInt i=0; i < len; i++)
+ {
+ _LIT8(KHexFormat, "%02X");
+ const TUint8 val = iPdu[i];
+ aHexPdu.AppendFormat(KHexFormat, val);
+ }
+ }
+
+void CSmsPduDbPdu::SetPduL(const TDesC8& aHexPdu)
+ {
+ const TInt len = aHexPdu.Length();
+
+ if (len % 2 != 0)
+ User::Leave(KErrArgument);
+
+ for (TInt i = 0; i < len; i+=2)
+ {
+ const TPtrC8 ptr(aHexPdu.Mid(i, 2));
+ TLex8 lex(ptr);
+ TUint8 val;
+ User::LeaveIfError(lex.Val(val, EHex));
+ iPdu.Append(val);
+ }
+ }
+
+TBool CSmsPduDbPdu::IsMobileTerminatedL() const
+ {
+ TBool ret(EFalse);
+
+ switch(iType)
+ {
+ case CSmsPDU::ESmsSubmit:
+ case CSmsPDU::ESmsCommand:
+
+ ret = EFalse;
+ break;
+
+ case CSmsPDU::ESmsDeliver:
+ case CSmsPDU::ESmsStatusReport:
+
+ ret = ETrue;
+ break;
+
+ default:
+
+ User::Leave(KErrNotSupported);
+ break;
+ }
+
+
+ return ret;
+ }
+
+void CSmsPduDbMessage::DecodeL(RFs& aFs, const CTestConfigItem& aItem)
+ {
+ const TDesC8& val = aItem.Value();
+
+ iPdus.Reset();
+ delete iSmsMessage;
+ iSmsMessage = NULL;
+
+ CSmsBuffer* buffer = CSmsBuffer::NewL();
+ iSmsMessage = CSmsMessage::NewL(aFs, iType, buffer); //takes ownership of buffer
+
+ TPtrC8 body;
+ TBool statusReport(EFalse);
+ TInt dataCodingScheme(0);
+ TInt protocolIdentifier(0);
+
+ User::LeaveIfError(CTestConfig::GetElement(val, KSmsPduDbDelimiter, CSmsPduDbBase::ESmsPduDbId, iId));
+
+ TInt err = CTestConfig::GetElement(val, KSmsPduDbDelimiter, EMsgBody, body);
+ if (err == KErrNone)
+ {
+ SetBufferL(body, *buffer);
+ }
+
+ err = CTestConfig::GetElement(val, KSmsPduDbDelimiter, EMsgStatusReport, statusReport);
+ if (err == KErrNone)
+ {
+ if (iType == CSmsPDU::ESmsSubmit)
+ {
+ CSmsSubmit& submit = static_cast<CSmsSubmit&>(iSmsMessage->SmsPDU());
+ submit.SetStatusReportRequest(statusReport);
+ }
+ else if (iType == CSmsPDU::ESmsCommand)
+ {
+ CSmsCommand& command = static_cast<CSmsCommand&>(iSmsMessage->SmsPDU());
+ command.SetStatusReportRequest(statusReport);
+ }
+ }
+
+ err = CTestConfig::GetElement(val, KSmsPduDbDelimiter, EMsgDCS, dataCodingScheme);
+ if (err == KErrNone)
+ {
+ SetDataCodingScheme(dataCodingScheme);
+ }
+
+ err = CTestConfig::GetElement(val, KSmsPduDbDelimiter, EMsgPID, protocolIdentifier);
+ if (err == KErrNone)
+ {
+ SetProtocolIdentifier(protocolIdentifier);
+ }
+
+ (void) CTestConfig::GetElement(val, KSmsPduDbDelimiter, EMsgDesc, iDescription); //ignore error
+
+ TRAP(iPdusError, iSmsMessage->EncodeMessagePDUsL(iPdus));
+ }
+
+void CSmsPduDbMessage::SetDataCodingScheme(TInt aDCS)
+ {
+ TSmsOctet octet(aDCS);
+ TSmsDataCodingScheme& dcs = reinterpret_cast<TSmsDataCodingScheme&>(octet);
+
+ CSmsPDU& pdu = iSmsMessage->SmsPDU();
+
+ pdu.SetBits7To4(dcs.Bits7To4());
+
+ TSmsDataCodingScheme::TSmsClass dcsClass;
+ const TBool hasClass = dcs.Class(dcsClass);
+ pdu.SetClass(hasClass, dcsClass);
+
+ pdu.SetAlphabet(dcs.Alphabet());
+ pdu.SetTextCompressed(dcs.TextCompressed());
+ pdu.SetIndicationState(dcs.IndicationState());
+ pdu.SetIndicationType(dcs.IndicationType());
+ }
+
+void CSmsPduDbMessage::SetProtocolIdentifier(TInt aPID)
+ {
+ TSmsOctet octet(aPID);
+ TSmsProtocolIdentifier& pid = reinterpret_cast<TSmsProtocolIdentifier&>(octet);
+ CSmsPDU& pdu = iSmsMessage->SmsPDU();
+
+ pdu.SetPIDType(pid.PIDType());
+ pdu.SetTelematicDeviceIndicator(pid.TelematicDeviceIndicator());
+
+ if (pid.PIDType()==TSmsProtocolIdentifier::ESmsPIDShortMessageType)
+ {
+ TSmsProtocolIdentifier::TSmsShortMessageType pidSMT = (TSmsProtocolIdentifier::TSmsShortMessageType) pid.ShortMessageType();
+ pdu.SetShortMessageType(pidSMT);
+ }
+
+ if (pid.TelematicDeviceIndicator()==TSmsProtocolIdentifier::ESmsTelematicDevice)
+ {
+ pdu.SetTelematicDeviceType(pid.TelematicDeviceType());
+ }
+ }
+
+void CSmsPduDbMessage::SetBufferL(const TDesC8& aBody, CSmsBufferBase& aBuffer)
+ {
+ TLex8 body(aBody);
+ body.Mark();
+ TPtrC8 marked;
+
+
+ while (!body.Eos())
+ {
+ if (body.Peek() == KSmsPduDbTagStart)
+ {
+ marked.Set(body.MarkedToken());
+ AppendToBufferL(marked, aBuffer);
+ body.Mark();
+ ProcessUnicodeL(body, aBuffer);
+ }
+ else
+ {
+ body.Inc();
+ }
+ }
+
+ marked.Set(body.MarkedToken());
+ if (marked.Length() != 0)
+ {
+ AppendToBufferL(marked, aBuffer);
+ }
+ }
+
+void CSmsPduDbMessage::ProcessUnicodeL(TLex8& aBody, CSmsBufferBase& aBuffer)
+ {
+ const TPtrC8 remainder(aBody.Remainder());
+ const TInt locate = remainder.Locate(KSmsPduDbTagEnd);
+
+ if (locate != KErrNotFound)
+ {
+ aBody.Inc();
+ if (!aBody.Eos() && aBody.Peek().IsDigit())
+ {
+ aBody.Mark();
+ aBody.Inc(locate - 1);
+ TPtrC8 marked(aBody.MarkedToken());
+ ParseUnicodeL(marked, aBuffer);
+ aBody.Inc();
+ if (!aBody.Eos())
+ aBody.Mark();
+ }
+ }
+ else
+ aBody.Inc();
+ }
+
+void CSmsPduDbMessage::AppendToBufferL(const TDesC8& aItem, CSmsBufferBase& aBuffer)
+ {
+ HBufC* body16 = HBufC::NewLC(aItem.Length());
+ body16->Des().Copy(aItem);
+
+ const TInt len = aBuffer.Length();
+ aBuffer.InsertL(len, *body16);
+
+ CleanupStack::PopAndDestroy(body16);
+ }
+
+void CSmsPduDbMessage::ParseUnicodeL(const TDesC8& aUnicode, CSmsBufferBase& aBuffer)
+ {
+ TInt unicodeChar(0);
+ TInt unicodeRepeat(1);
+
+ User::LeaveIfError(CTestConfig::GetElement(aUnicode, KSmsPduDbTagDelimitier, EUnicodeChar, unicodeChar));
+
+ TInt err = CTestConfig::GetElement(aUnicode, KSmsPduDbTagDelimitier, EUnicodeCharRepeat, unicodeRepeat);
+
+ if (err != KErrNone || unicodeRepeat < 1)
+ {
+ unicodeRepeat = 1;
+ }
+
+ TBuf8<1> buf;
+ buf.Append(unicodeChar);
+
+ while (unicodeRepeat--)
+ {
+ AppendToBufferL(buf, aBuffer);
+ }
+ }
+
+EXPORT_C void CSmsPduDbConcat::DecodeL(RFs& aFs)
+ {
+ delete iSmsMessage;
+ iSmsMessage = NULL;
+ const CSmsPDU::TSmsPDUType type = iSegments[0]->iType;
+ iSmsMessage = CSmsMessage::NewL(aFs, type, CSmsBuffer::NewL());
+
+ CArrayFixFlat<TGsmSms>* pdus = new (ELeave) CArrayFixFlat<TGsmSms>(1);
+ CleanupStack::PushL(pdus);
+
+ const TInt count = iSegments.Count();
+
+ for (TInt i=0; i<count; i++)
+ {
+ const CSmsPduDbConcatSegment& segment = *iSegments[i];
+ TGsmSms sms;
+ sms.SetPdu(segment.iPdu);
+ pdus->AppendL(sms);
+ }
+
+ TRAP(iSmsMessageError, iSmsMessage->DecodeMessagePDUsL(*pdus));
+ CleanupStack::PopAndDestroy(pdus);
+ }