--- a/smsprotocols/smsstack/common/src/smsstacklog.cpp Mon May 03 13:37:20 2010 +0300
+++ b/smsprotocols/smsstack/common/src/smsstacklog.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,935 +1,935 @@
-// Copyright (c) 2002-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:
-// Logging macros code specific structures in SMSStack.
-//
-//
-
-/**
- @file
- @internalComponent
-*/
-
-#include "gsmupdu.h"
-#include "smsstacklog.h"
-
-
-//
-// All functions in this file are available only if logging is enabled.
-//
-#ifdef _SMS_LOGGING_ENABLED
-
-
-/**
- * Number of characters per line during hex dump logging.
- */
-const TInt KHexDumpCharsPerLine = 32;
-
-
-/**
- * Converts a PDU from a buffer into a ASCII string and decodes it.
- *
- * @param aPDU PDU to log.
- * @param aCommandPdu Flag to say if this is a command PDU.
- */
-void LogSmsIfPDU(const TDesC8& aText, const TDesC8& aPDU, TBool aCommandPdu)
- {
- TBuf8<128> tmpBuf;
-
- //
- // Log the PDU as raw hex...
- //
- tmpBuf.Copy(aText);
- tmpBuf.Append(_L8("RAW: "));
-
- LOGSMSIFHEXBUF(tmpBuf, aPDU);
-
- //
- // Log the first octet...
- //
- // bit 7 6 5 4 3 2 1 0
- // submit rp udhi srr vpf vpf rd 0 1 mti, rd, vpf, rp, udhi, srr,
- // deliver rp udhi sri mms 0 0 mti, mms, rp, udhi, sri
- // status udhi srq mms 1 0 mti, udhi, mms, srq
- // command udhi srr 1 0 mti, udhi, srr
- //
- enum TSmsVp
- {
- EVpAbs,
- EVpEnh,
- EVpRel,
- EVpNone,
- };
-
- CSmsPDU::TSmsPDUType pduType = (CSmsPDU::TSmsPDUType) -1;
- TInt octetOffset = 0;
- TText8 firstOctet = aPDU[octetOffset++];
- TBool udhiPresent = EFalse;
- TSmsVp vpf = EVpRel;
-
- tmpBuf.Zero();
-
- if ((firstOctet & 0x03) == 0x00)
- {
- pduType = CSmsPDU::ESmsDeliver;
- tmpBuf.Append(_L8("DELIVER "));
- }
- else if ((firstOctet & 0x03) == 0x01)
- {
- pduType = CSmsPDU::ESmsSubmit;
- tmpBuf.Append(_L8("SUBMIT "));
- }
- else if((firstOctet & 0x03) == 0x02)
- {
- if (aCommandPdu)
- {
- pduType = CSmsPDU::ESmsCommand;
- tmpBuf.Append(_L8("COMMAND "));
- }
- else
- {
- pduType = CSmsPDU::ESmsStatusReport;
- tmpBuf.Append(_L8("STATUS "));
- }
- }
- else
- {
- tmpBuf.Append(_L8("UNKNOWN "));
- }
-
- if (pduType == CSmsPDU::ESmsSubmit || pduType == CSmsPDU::ESmsDeliver)
- {
- if (firstOctet & 0x80)
- {
- tmpBuf.Append(_L8(" 1"));
- }
- else
- {
- tmpBuf.Append(_L8(" 0"));
- }
- }
- else
- {
- tmpBuf.Append(_L8(" -"));
- }
-
- if (firstOctet & 0x40)
- {
- tmpBuf.Append(_L8(" 1"));
- udhiPresent = ETrue;
- }
- else
- {
- tmpBuf.Append(_L8(" 0"));
- }
-
- if (firstOctet & 0x20)
- {
- tmpBuf.Append(_L8(" 1"));
- }
- else
- {
- tmpBuf.Append(_L8(" 0"));
- }
-
- if (pduType == CSmsPDU::ESmsDeliver || pduType == CSmsPDU::ESmsStatusReport)
- {
- // MMS is Deliver or Status Report PDUs only...
- if (firstOctet & 0x04)
- {
- tmpBuf.Append(_L8(" 1"));
- }
- else
- {
- tmpBuf.Append(_L8(" 0"));
- }
- }
- else
- {
- tmpBuf.Append(_L8(" -"));
- }
-
- if (pduType == CSmsPDU::ESmsSubmit)
- {
- // Reject Duplicates and VP is for Sumbit PDUs only.
- if (firstOctet & 0x04)
- {
- tmpBuf.Append(_L8(" 1"));
- }
- else
- {
- tmpBuf.Append(_L8(" 0"));
- }
-
- if ((firstOctet & 0x18) == 0x18)
- {
- tmpBuf.Append(_L8(" ABS"));
- vpf = EVpAbs;
- }
- else if ((firstOctet & 0x18) == 0x10)
- {
- tmpBuf.Append(_L8(" REL"));
- vpf = EVpRel;
- }
- else if ((firstOctet & 0x18) == 0x08)
- {
- tmpBuf.Append(_L8(" ENH"));
- vpf = EVpEnh;
- }
- else
- {
- tmpBuf.Append(_L8(" NO "));
- vpf = EVpNone;
- }
- }
- else
- {
- tmpBuf.Append(_L8(" - -"));
- }
-
- LOGSMSIF2("%S HEX MTI RP UDHI SRX MMS RD VP", &aText);
- LOGSMSIF4("%SFO: 0x%02X %S", &aText, firstOctet, &tmpBuf);
-
- if (pduType == -1)
- {
- // Not supported!
- return;
- }
-
- //
- //
- // Message reference (submit, status report and command only)...
- //
- if (pduType == CSmsPDU::ESmsSubmit ||
- pduType == CSmsPDU::ESmsStatusReport ||
- pduType == CSmsPDU::ESmsCommand)
- {
- LOGSMSIF3("%SMR: 0x%02X", &aText, aPDU[octetOffset]);
- octetOffset++;
- }
-
- //
- // Command's PID, CT and MN...
- //
- if (pduType == CSmsPDU::ESmsCommand)
- {
- LOGSMSIF3("%SPID: 0x%02X", &aText, aPDU[octetOffset]);
- octetOffset++;
-
- LOGSMSIF3("%SCT: 0x%02X", &aText, aPDU[octetOffset]);
- octetOffset++;
-
- LOGSMSIF3("%SMN: 0x%02X", &aText, aPDU[octetOffset]);
- octetOffset++;
- }
-
- //
- // Log the telephone number...
- //
- TInt telLength = (TInt) aPDU[octetOffset];
- TInt typeOfNumber = aPDU[octetOffset+1];
-
- octetOffset += 2;
-
- if (telLength >= 0 && telLength <= 20)
- {
- // Convert the number to ascii...
- tmpBuf.Zero();
-
- for (TInt count = 0; count < (telLength + 1) / 2; count++)
- {
- tmpBuf.AppendFormat(_L8("%1X%1X"), aPDU[octetOffset] & 0x0f,
- (aPDU[octetOffset] >> 4) & 0x0f);
- octetOffset++;
- }
-
- tmpBuf.SetLength(telLength);
-
- LOGSMSIF4("%STEL: 0x%02X %S", &aText, typeOfNumber, &tmpBuf);
- }
- else
- {
- LOGSMSIF3("%STEL: Illegal length value (%d)!", &aText, telLength);
- return;
- }
-
- //
- // PID and the DCS (submit and deliver only)...
- //
- if (pduType == CSmsPDU::ESmsSubmit || pduType == CSmsPDU::ESmsDeliver)
- {
- LOGSMSIF3("%SPID: 0x%02X", &aText, aPDU[octetOffset]);
- octetOffset++;
-
- tmpBuf.Zero();
-
- TInt dcs = aPDU[octetOffset];
- octetOffset++;
-
- if ((dcs & 0xF0 != 0xF0) &&
- ((dcs & 0xD0) == 0x00 || (dcs & 0xC0) == 0xC0 ||
- (dcs & 0xD0) == 0xD0 || (dcs & 0xE0) == 0xE0))
- {
- //
- // Classless messages:
- // 00x0xxxx GSM 7 bit default alphabet with no message class
- // 1100xxxx Message Waiting Indication Group: Discard Message
- // 1101xxxx Message Waiting Indication Group: Store Message
- // 1110xxxx Message Waiting Indication Group: Store Message (UCS2 character set)
- //
- tmpBuf.Append(_L8("NO "));
- }
- else if ((dcs & 0xC0) == 0x00 || (dcs & 0x40) == 0x40 || (dcs & 0xF0) == 0xF0)
- {
- //
- // Message has a class:
- // 00xxxxxx General Data Coding indication
- // 01xxxxxx Message Marked for Automatic Deletion Group
- // 1111xxxx Data coding/message class
- //
- if ((dcs & 0x03) == 0x00) //class 0 sms
- {
- tmpBuf.Append(_L8("0 "));
- }
- else if((dcs & 0x03) == 0x03) //class 3 sms
- {
- tmpBuf.Append(_L8("3 "));
- }
- else if((dcs & 0x01) == 0x01) //class 1 sms
- {
- tmpBuf.Append(_L8("1 "));
- }
- else if((dcs & 0x02) == 0x02) //class 2 sms
- {
- tmpBuf.Append(_L8("2 "));
- }
- }
- else
- {
- //
- // 1000xxxx...1011xxxx Reserved coding groups
- //
- tmpBuf.Append(_L8("NO "));
- }
-
- if ((dcs & 0xF0) == 0xF0)
- {
- // Data coding/message class
- if ((dcs & 0x04) == 0x00)
- {
- tmpBuf.Append(_L8(" 7 BIT "));
- }
- else if ((dcs & 0x04) == 0x04)
- {
- tmpBuf.Append(_L8(" 8 BIT "));
- }
- }
- else if ((dcs & 0xC0) == 0xC0 || (dcs & 0xD0) == 0xD0)
- {
- //Message Waiting Indication: Discard Message or Store Message
- tmpBuf.Append(_L8(" 7 BIT "));
- }
- else if ((dcs & 0xE0) == 0xE0)
- {
- //Message Waiting Indication: Store Message (UCS2 character set)
- tmpBuf.Append(_L8("16 BIT "));
- }
- else if ((dcs & 0xC0) == 0x00 || (dcs & 0x40) == 0x40)
- {
- // General Data Coding indication or Automatic Deletion Group
- if ((dcs & 0x0C) == 0x00)
- {
- tmpBuf.Append(_L8(" 7 BIT "));
- }
- else if ((dcs & 0x0C) == 0x0C)
- {
- tmpBuf.Append(_L8("Reserved "));
- }
- else if ((dcs & 0x04) == 0x04)
- {
- tmpBuf.Append(_L8(" 8 BIT "));
- }
- else if ((dcs & 0x08) == 0x08)
- {
- tmpBuf.Append(_L8("16 BIT "));
- }
- }
- else
- {
- // Reserved coding groups
- tmpBuf.Append(_L("Reserved "));
- }
-
- if ((dcs & 0xF0 != 0xF0) &&
- ((dcs & 0xC0) == 0xC0 || (dcs & 0xD0) == 0xD0 || (dcs & 0xE0) == 0xE0))
- {
- if ((dcs & 0x03) == 0x00)
- {
- // Voicemail Message Waiting
- tmpBuf.Append(_L8("Voicemail Message Waiting"));
- }
- else if ((dcs & 0x03) == 0x03)
- {
- // Other Message Waiting
- tmpBuf.Append(_L8("Other Message Waiting"));
- }
- else if ((dcs & 0x01) == 0x01)
- {
- // Fax Message Waiting
- tmpBuf.Append(_L8("Fax Message Waiting"));
- }
- else if ((dcs & 0x02) == 0x02)
- {
- // Electronic Mail Message Waiting
- tmpBuf.Append(_L8("Electronic Mail Message Waiting"));
- }
- else
- {
- tmpBuf.Append(_L8("-"));
- }
- }
- else
- {
- tmpBuf.Append(_L8("-"));
- }
-
- LOGSMSIF2("%SDCS: HEX CLASS DCS INDICATION TYPE", &aText);
- LOGSMSIF4("%S 0x%02X %S", &aText, dcs, &tmpBuf);
- }
-
- //
- // VP (submit only)...
- //
- if (pduType == CSmsPDU::ESmsSubmit)
- {
- if (vpf == EVpRel)
- {
- LOGSMSIF3("%SVP: %d (Relative)", &aText, aPDU[octetOffset++]);
- }
- else if (vpf == EVpAbs)
- {
- // absolute format - TODO to look for the right format
- tmpBuf.Zero();
-
- for (TInt index = 0; index < 7; index++)
- {
- tmpBuf.AppendFormat(_L8("%02X"), aPDU[octetOffset + index]);
- }
-
- LOGSMSIF3("%SVP: %S (Absolute)", &aText, &tmpBuf);
- octetOffset += 7;
- }
- else if (vpf == EVpEnh)
- {
- // enhanced validity period - TODO to look for the right format
- tmpBuf.Zero();
-
- for (TInt index = 0; index < 7; index++)
- {
- tmpBuf.AppendFormat(_L8("%02X"), aPDU[octetOffset + index]);
- }
-
- LOGSMSIF3("%SVP: %S (Enhanced)", &aText, &tmpBuf);
- octetOffset += 7;
- }
- }
-
- //
- // SCTS (deliver and status) - TODO to look for the right format
- //
- if (pduType == CSmsPDU::ESmsDeliver || pduType == CSmsPDU::ESmsStatusReport)
- {
- tmpBuf.Zero();
-
- for (TInt index = 0; index < 7; index++)
- {
- tmpBuf.AppendFormat(_L8("%02X"), aPDU[octetOffset + index]);
- }
-
- LOGSMSIF3("%SSCTS: %S", &aText, &tmpBuf);
- octetOffset += 7;
- }
-
- //
- // Getting the DT and the status of the SR (SR only)
- // TODO to look for some appended octet after the status, eg. carried ud
- // and to analise the status
- //
- if (pduType == CSmsPDU::ESmsStatusReport)
- {
- tmpBuf.Zero();
-
- for (TInt index = 0; index < 7; index++)
- {
- tmpBuf.AppendFormat(_L8("%02X"), aPDU[octetOffset + index]);
- }
-
- LOGSMSIF3("%SDT: %S", &aText, &tmpBuf);
- octetOffset += 7;
-
- LOGSMSIF3("%SST: %02X", &aText, aPDU[octetOffset]);
- octetOffset++;
- }
-
- //
- // Getting the UDL - TODO to add UD later and to decode the UDH
- //
- if (pduType == CSmsPDU::ESmsDeliver || pduType == CSmsPDU::ESmsSubmit)
- {
- if (udhiPresent)
- {
- TInt udl = aPDU[octetOffset++];
- TInt udhl = aPDU[octetOffset++];
-
- if (udhl > 1)
- {
- tmpBuf.Zero();
-
- // getting iei_a
- TInt iei_a = aPDU[octetOffset++];
-
- // getting ieidl_a
- TInt ieidl_a = aPDU[octetOffset++];
-
- if (ieidl_a < udhl)
- {
- //
- // With EDS, IEIDL can be almost the whole payload; need to limit
- // length of debug or increase udlbuf2 to around 300 bytes (which would
- // make stack frame around 700 bytes out of allowed 2kB; seems too much)
- // TODO: think whether we should explicitly show this truncation, eg with "..."
- //
- for (TInt index = 0; index < ieidl_a; index++)
- {
- tmpBuf.AppendFormat(_L8("%02X"), aPDU[octetOffset + index]);
- if (tmpBuf.Length() > tmpBuf.MaxLength() - 2 ||
- octetOffset + index == aPDU.Length() - 1)
- {
- break;
- }
- }
- }
- else
- {
- LOGSMSIF3("%SUDL: Problems with the ieidl_a %d being less that UDHL",
- &aText, ieidl_a);
- }
-
- if ((ieidl_a + 1) > udhl)
- {
- LOGSMSIF2("%SUDL: Corrupted or implement decoding for second iei_b, iei_n!",
- &aText);
- }
-
- LOGSMSIF2("%SUDL: HEX UDHL IEI_A IEIDL_A ", &aText);
- LOGSMSIF7("%S 0x%02X 0x%02X 0x%02X 0x%02X %S", &aText,
- udl, udhl, iei_a, ieidl_a, &tmpBuf);
- }
- else
- {
- LOGSMSIF2("%SUDL: Corrupted because TP-UDHP is TRUE and TP-UDHL is less than 1!", &aText);
- LOGSMSIF2("%SUDL: HEX UDHL IEI_A", &aText);
- LOGSMSIF4("%S 0x%02X 0x%02X", &aText, udl, udhl);
- }
- }
- else
- {
- TInt udl = aPDU[octetOffset++];
-
- LOGSMSIF2("%SUDL: HEX UDHL", &aText);
- LOGSMSIF3("%S 0x%02X -", &aText, udl);
- }
- }
- } // LogSmsIfPDU
-
-
-void LogSmsIfHexBuf(const TDesC8& aText, const TDesC8& aHexBuf)
- {
- //
- // Print the PDU in hex in rows of upto KHexDumpCharsPerLine bytes...
- //
- TBuf8<KHexDumpCharsPerLine * 2> hexLine;
- TInt length = aHexBuf.Length();
- TInt position;
-
- for (position = 0; position < length; position += KHexDumpCharsPerLine)
- {
- TInt bytesToLog = length - position;
- TInt byteIndex;
-
- if (bytesToLog > KHexDumpCharsPerLine)
- {
- bytesToLog = KHexDumpCharsPerLine;
- }
-
- hexLine.Zero();
-
- for (byteIndex = 0; byteIndex < bytesToLog; byteIndex++)
- {
- hexLine.AppendFormat(_L8("%02X"), aHexBuf[position + byteIndex]);
- }
-
- LOGSMSIF3("%S%S", &aText, &hexLine);
- }
- } // LogSmsIfHexBuf
-
-
-/**
- * Logs a Type of Number enum.
- *
- * @param aTON Enum to log.
- */
-void LogSmsIfTypeOfNumber(const TDesC8& aText, RMobilePhone::TMobileTON aTON)
- {
- switch (aTON)
- {
- case RMobilePhone::EUnknownNumber:
- {
- LOGSMSIF2("%SEUnknownNumber", &aText);
- }
- break;
-
- case RMobilePhone::EInternationalNumber:
- {
- LOGSMSIF2("%SEInternationalNumber", &aText);
- }
- break;
-
- case RMobilePhone::ENationalNumber:
- {
- LOGSMSIF2("%SENationalNumber", &aText);
- }
- break;
-
- case RMobilePhone::ENetworkSpecificNumber:
- {
- LOGSMSIF2("%SENetworkSpecificNumber", &aText);
- }
- break;
-
- case RMobilePhone::ESubscriberNumber:
- {
- LOGSMSIF2("%SESubscriberNumber", &aText);
- }
- break;
-
- case RMobilePhone::EAlphanumericNumber:
- {
- LOGSMSIF2("%SEAlphanumericNumber", &aText);
- }
- break;
-
- case RMobilePhone::EAbbreviatedNumber:
- {
- LOGSMSIF2("%SEAbbreviatedNumber", &aText);
- }
- break;
-
- default:
- {
- LOGSMSIF3("%S<unknown enum %d>", &aText, aTON);
- }
- break;
- }
- } // LogSmsIfTypeOfNumber
-
-
-/**
- * Logs a Numbering Plan enum.
- *
- * @param aNPI Enum to log.
- */
-void LogSmsIfNumberingPlan(const TDesC8& aText, RMobilePhone::TMobileNPI aNPI)
- {
- switch (aNPI)
- {
- case RMobilePhone::EUnknownNumberingPlan:
- {
- LOGSMSIF2("%SEUnknownNumberingPlan", &aText);
- }
- break;
-
- case RMobilePhone::EIsdnNumberPlan:
- {
- LOGSMSIF2("%SEIsdnNumberPlan", &aText);
- }
- break;
-
- case RMobilePhone::EDataNumberPlan:
- {
- LOGSMSIF2("%SEDataNumberPlan", &aText);
- }
- break;
-
- case RMobilePhone::ETelexNumberPlan:
- {
- LOGSMSIF2("%SETelexNumberPlan", &aText);
- }
- break;
-
- case RMobilePhone::EServiceCentreSpecificPlan1:
- {
- LOGSMSIF2("%SEServiceCentreSpecificPlan1", &aText);
- }
- break;
-
- case RMobilePhone::EServiceCentreSpecificPlan2:
- {
- LOGSMSIF2("%SEServiceCentreSpecificPlan2", &aText);
- }
- break;
-
- case RMobilePhone::ENationalNumberPlan:
- {
- LOGSMSIF2("%SENationalNumberPlan", &aText);
- }
- break;
-
- case RMobilePhone::EPrivateNumberPlan:
- {
- LOGSMSIF2("%SEPrivateNumberPlan", &aText);
- }
- break;
-
- case RMobilePhone::EERMESNumberPlan:
- {
- LOGSMSIF2("%SEERMESNumberPlan", &aText);
- }
- break;
-
- default:
- {
- LOGSMSIF3("%S<unknown enum %d>", &aText, aNPI);
- }
- break;
- }
- } // LogSmsIfNumberingPlan
-
-
-/**
- * Logs contents of TMobileGsmSmsEntryV1 object.
- *
- * @param aSmsGsmEntryV1 Entry to log.
- */
-void LogSmsIfSmsEntry(const TDesC8& aText,
- const RMobileSmsStore::TMobileGsmSmsEntryV1& aSmsGsmEntryV1)
- {
- //
- // Header and index...
- //
- LOGSMSIF2("%SRMobileSmsStore::TMobileGsmSmsEntryV1:", &aText);
- LOGSMSIF4("%S iIndex=%d (0x%08x)", &aText, aSmsGsmEntryV1.iIndex,
- aSmsGsmEntryV1.iIndex);
-
- //
- // Message status...
- //
- switch (aSmsGsmEntryV1.iMsgStatus)
- {
- case RMobileSmsStore::EStoredMessageUnknownStatus:
- {
- LOGSMSIF2("%S iStoreStats=EStoredMessageUnknownStatus", &aText);
- }
- break;
-
- case RMobileSmsStore::EStoredMessageUnread:
- {
- LOGSMSIF2("%S iStoreStats=EStoredMessageUnread", &aText);
- }
- break;
-
- case RMobileSmsStore::EStoredMessageRead:
- {
- LOGSMSIF2("%S iStoreStats=EStoredMessageRead", &aText);
- }
- break;
-
- case RMobileSmsStore::EStoredMessageUnsent:
- {
- LOGSMSIF2("%S iStoreStats=EStoredMessageUnsent", &aText);
- }
- break;
-
- case RMobileSmsStore::EStoredMessageSent:
- {
- LOGSMSIF2("%S iStoreStats=EStoredMessageSent", &aText);
- }
- break;
-
- case RMobileSmsStore::EStoredMessageDelivered:
- {
- LOGSMSIF2("%S iStoreStats=EStoredMessageDelivered", &aText);
- }
- break;
-
- default:
- {
- LOGSMSIF3("%S iStoreStats=<unknown enum %d>", &aText,
- aSmsGsmEntryV1.iMsgStatus);
- }
- break;
- }
-
- //
- // Service centre number...
- //
- TBuf8<RMobilePhone::KMaxMobileTelNumberSize> numberIn8bit;
-
- numberIn8bit.Copy(aSmsGsmEntryV1.iServiceCentre.iTelNumber);
- LOGSMSIF3("%S SRC Address=\"%S\"", &aText, &numberIn8bit);
-
- //
- // Service Centre Type Of Number...
- //
- TBuf8<128> tmpBuf;
-
- tmpBuf.Copy(aText);
- tmpBuf.Append(_L8(" SRC AddrTON="));
-
- LOGSMSIFTYPEOFNUMBER(tmpBuf, aSmsGsmEntryV1.iServiceCentre.iTypeOfNumber);
-
- //
- // Number Plan...
- //
- tmpBuf.Copy(aText);
- tmpBuf.Append(_L8(" SRC AddrNPI="));
-
- LOGSMSIFNUMBERINGPLAN(tmpBuf, aSmsGsmEntryV1.iServiceCentre.iNumberPlan);
-
- //
- // PDU...
- //
- tmpBuf.Copy(aText);
- tmpBuf.Append(_L8(" PDU: "));
-
- LOGSMSIFPDU(tmpBuf, aSmsGsmEntryV1.iMsgData, EFalse);
- } // LogSmsIfSmsEntry
-
-
-/**
- * Logs contents of TMobileSmsSendAttributesV1 object.
- *
- * @param aAttrib Attributes to log.
- */
-void LogSmsIfSendAttributes(const TDesC8& aText,
- const RMobileSmsMessaging::TMobileSmsSendAttributesV1& aAttrib)
- {
- LOGSMSIF2("%SRMobileSmsMessaging::TMobileSmsSendAttributesV1:", &aText);
- LOGSMSIF3("%S iFlags=0x%08x", &aText, (TInt)(aAttrib.iFlags));
-
- if (aAttrib.iFlags & RMobileSmsMessaging::KGsmServiceCentre)
- {
- TBuf8<128 + RMobilePhone::KMaxMobileTelNumberSize> tmpBuf;
-
- tmpBuf.Copy(aAttrib.iGsmServiceCentre.iTelNumber);
- LOGSMSIF3("%S SRC Address=%S", &aText, &tmpBuf);
-
- tmpBuf.Copy(aText);
- tmpBuf.Append(_L8(" SRC AddrTON="));
-
- LOGSMSIFTYPEOFNUMBER(tmpBuf, aAttrib.iGsmServiceCentre.iTypeOfNumber);
-
- tmpBuf.Copy(aText);
- tmpBuf.Append(_L8(" SRC AddrNPI="));
-
- LOGSMSIFNUMBERINGPLAN(tmpBuf, aAttrib.iGsmServiceCentre.iNumberPlan);
- }
-
- if (aAttrib.iFlags & RMobileSmsMessaging::KSmsDataFormat)
- {
- switch (aAttrib.iDataFormat)
- {
- case RMobileSmsMessaging::EFormatUnspecified:
- {
- LOGSMSIF2("%S iDataFormat=EFormatUnspecified", &aText);
- }
- break;
-
- case RMobileSmsMessaging::EFormatGsmTpdu:
- {
- LOGSMSIF2("%S iDataFormat=EFormatGsmTpdu", &aText);
- }
- break;
-
- case RMobileSmsMessaging::EFormatCdmaTpdu:
- {
- LOGSMSIF2("%S iDataFormat=EFormatCdmaTpdu", &aText);
- }
- break;
-
- default:
- {
- LOGSMSIF3("%S iDataFormat=<unknown enum %d>", &aText,
- aAttrib.iDataFormat);
- }
- break;
- }
- }
-
- if (aAttrib.iFlags & RMobileSmsMessaging::KCdmaTeleservice)
- {
- LOGSMSIF3("%S iCdmaTeles=0x08X", &aText, aAttrib.iCdmaTeleservice);
- }
-
- if (aAttrib.iFlags & RMobileSmsMessaging::KCdmaServiceCategory)
- {
- LOGSMSIF3("%S iCdmaServ=0x08X", &aText, aAttrib.iCdmaServiceCategory);
- }
-
- if (aAttrib.iFlags & RMobileSmsMessaging::KRemotePartyInfo)
- {
- TBuf8<RMobilePhone::KMaxMobileTelNumberSize> tmpBuf;
-
- tmpBuf.Copy(aAttrib.iDestination.iTelNumber);
- LOGSMSIF3("%S DST Address=%S", &aText, &tmpBuf);
-
- tmpBuf.Copy(aText);
- tmpBuf.Append(_L8(" DST AddrTON="));
-
- LOGSMSIFTYPEOFNUMBER(tmpBuf, aAttrib.iDestination.iTypeOfNumber);
-
- tmpBuf.Copy(aText);
- tmpBuf.Append(_L8(" DST AddrNPI="));
-
- LOGSMSIFNUMBERINGPLAN(tmpBuf, aAttrib.iDestination.iNumberPlan);
- }
-
- if (aAttrib.iFlags & RMobileSmsMessaging::KMoreToSend)
- {
- if (aAttrib.iMore)
- {
- LOGSMSIF2("%S iMore=ETrue", &aText);
- }
- else
- {
- LOGSMSIF2("%S iMore=EFalse", &aText);
- }
- }
-
- if (aAttrib.iFlags & RMobileSmsMessaging::KMessageReference)
- {
- LOGSMSIF3("%S iMsgRef=0x08X", &aText, aAttrib.iMsgRef);
- }
-
- if(aAttrib.iFlags & RMobileSmsMessaging::KGsmSubmitReport)
- {
- TBuf8<RMobilePhone::KMaxMobileTelNumberSize> tmpBuf;
-
- tmpBuf.Copy(aText);
- tmpBuf.Append(_L8(" iSubmitReport PDU: "));
-
- LOGSMSIFPDU(tmpBuf, aAttrib.iSubmitReport, EFalse);
- }
- } // LogSmsIfSendAttributes
-
-#endif // _SMS_LOGGING_ENABLED
+// Copyright (c) 2002-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:
+// Logging macros code specific structures in SMSStack.
+//
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include "gsmupdu.h"
+#include "smsstacklog.h"
+
+
+//
+// All functions in this file are available only if logging is enabled.
+//
+#ifdef _SMS_LOGGING_ENABLED
+
+
+/**
+ * Number of characters per line during hex dump logging.
+ */
+const TInt KHexDumpCharsPerLine = 32;
+
+
+/**
+ * Converts a PDU from a buffer into a ASCII string and decodes it.
+ *
+ * @param aPDU PDU to log.
+ * @param aCommandPdu Flag to say if this is a command PDU.
+ */
+void LogSmsIfPDU(const TDesC8& aText, const TDesC8& aPDU, TBool aCommandPdu)
+ {
+ TBuf8<128> tmpBuf;
+
+ //
+ // Log the PDU as raw hex...
+ //
+ tmpBuf.Copy(aText);
+ tmpBuf.Append(_L8("RAW: "));
+
+ LOGSMSIFHEXBUF(tmpBuf, aPDU);
+
+ //
+ // Log the first octet...
+ //
+ // bit 7 6 5 4 3 2 1 0
+ // submit rp udhi srr vpf vpf rd 0 1 mti, rd, vpf, rp, udhi, srr,
+ // deliver rp udhi sri mms 0 0 mti, mms, rp, udhi, sri
+ // status udhi srq mms 1 0 mti, udhi, mms, srq
+ // command udhi srr 1 0 mti, udhi, srr
+ //
+ enum TSmsVp
+ {
+ EVpAbs,
+ EVpEnh,
+ EVpRel,
+ EVpNone,
+ };
+
+ CSmsPDU::TSmsPDUType pduType = (CSmsPDU::TSmsPDUType) -1;
+ TInt octetOffset = 0;
+ TText8 firstOctet = aPDU[octetOffset++];
+ TBool udhiPresent = EFalse;
+ TSmsVp vpf = EVpRel;
+
+ tmpBuf.Zero();
+
+ if ((firstOctet & 0x03) == 0x00)
+ {
+ pduType = CSmsPDU::ESmsDeliver;
+ tmpBuf.Append(_L8("DELIVER "));
+ }
+ else if ((firstOctet & 0x03) == 0x01)
+ {
+ pduType = CSmsPDU::ESmsSubmit;
+ tmpBuf.Append(_L8("SUBMIT "));
+ }
+ else if((firstOctet & 0x03) == 0x02)
+ {
+ if (aCommandPdu)
+ {
+ pduType = CSmsPDU::ESmsCommand;
+ tmpBuf.Append(_L8("COMMAND "));
+ }
+ else
+ {
+ pduType = CSmsPDU::ESmsStatusReport;
+ tmpBuf.Append(_L8("STATUS "));
+ }
+ }
+ else
+ {
+ tmpBuf.Append(_L8("UNKNOWN "));
+ }
+
+ if (pduType == CSmsPDU::ESmsSubmit || pduType == CSmsPDU::ESmsDeliver)
+ {
+ if (firstOctet & 0x80)
+ {
+ tmpBuf.Append(_L8(" 1"));
+ }
+ else
+ {
+ tmpBuf.Append(_L8(" 0"));
+ }
+ }
+ else
+ {
+ tmpBuf.Append(_L8(" -"));
+ }
+
+ if (firstOctet & 0x40)
+ {
+ tmpBuf.Append(_L8(" 1"));
+ udhiPresent = ETrue;
+ }
+ else
+ {
+ tmpBuf.Append(_L8(" 0"));
+ }
+
+ if (firstOctet & 0x20)
+ {
+ tmpBuf.Append(_L8(" 1"));
+ }
+ else
+ {
+ tmpBuf.Append(_L8(" 0"));
+ }
+
+ if (pduType == CSmsPDU::ESmsDeliver || pduType == CSmsPDU::ESmsStatusReport)
+ {
+ // MMS is Deliver or Status Report PDUs only...
+ if (firstOctet & 0x04)
+ {
+ tmpBuf.Append(_L8(" 1"));
+ }
+ else
+ {
+ tmpBuf.Append(_L8(" 0"));
+ }
+ }
+ else
+ {
+ tmpBuf.Append(_L8(" -"));
+ }
+
+ if (pduType == CSmsPDU::ESmsSubmit)
+ {
+ // Reject Duplicates and VP is for Sumbit PDUs only.
+ if (firstOctet & 0x04)
+ {
+ tmpBuf.Append(_L8(" 1"));
+ }
+ else
+ {
+ tmpBuf.Append(_L8(" 0"));
+ }
+
+ if ((firstOctet & 0x18) == 0x18)
+ {
+ tmpBuf.Append(_L8(" ABS"));
+ vpf = EVpAbs;
+ }
+ else if ((firstOctet & 0x18) == 0x10)
+ {
+ tmpBuf.Append(_L8(" REL"));
+ vpf = EVpRel;
+ }
+ else if ((firstOctet & 0x18) == 0x08)
+ {
+ tmpBuf.Append(_L8(" ENH"));
+ vpf = EVpEnh;
+ }
+ else
+ {
+ tmpBuf.Append(_L8(" NO "));
+ vpf = EVpNone;
+ }
+ }
+ else
+ {
+ tmpBuf.Append(_L8(" - -"));
+ }
+
+ LOGSMSIF2("%S HEX MTI RP UDHI SRX MMS RD VP", &aText);
+ LOGSMSIF4("%SFO: 0x%02X %S", &aText, firstOctet, &tmpBuf);
+
+ if (pduType == -1)
+ {
+ // Not supported!
+ return;
+ }
+
+ //
+ //
+ // Message reference (submit, status report and command only)...
+ //
+ if (pduType == CSmsPDU::ESmsSubmit ||
+ pduType == CSmsPDU::ESmsStatusReport ||
+ pduType == CSmsPDU::ESmsCommand)
+ {
+ LOGSMSIF3("%SMR: 0x%02X", &aText, aPDU[octetOffset]);
+ octetOffset++;
+ }
+
+ //
+ // Command's PID, CT and MN...
+ //
+ if (pduType == CSmsPDU::ESmsCommand)
+ {
+ LOGSMSIF3("%SPID: 0x%02X", &aText, aPDU[octetOffset]);
+ octetOffset++;
+
+ LOGSMSIF3("%SCT: 0x%02X", &aText, aPDU[octetOffset]);
+ octetOffset++;
+
+ LOGSMSIF3("%SMN: 0x%02X", &aText, aPDU[octetOffset]);
+ octetOffset++;
+ }
+
+ //
+ // Log the telephone number...
+ //
+ TInt telLength = (TInt) aPDU[octetOffset];
+ TInt typeOfNumber = aPDU[octetOffset+1];
+
+ octetOffset += 2;
+
+ if (telLength >= 0 && telLength <= 20)
+ {
+ // Convert the number to ascii...
+ tmpBuf.Zero();
+
+ for (TInt count = 0; count < (telLength + 1) / 2; count++)
+ {
+ tmpBuf.AppendFormat(_L8("%1X%1X"), aPDU[octetOffset] & 0x0f,
+ (aPDU[octetOffset] >> 4) & 0x0f);
+ octetOffset++;
+ }
+
+ tmpBuf.SetLength(telLength);
+
+ LOGSMSIF4("%STEL: 0x%02X %S", &aText, typeOfNumber, &tmpBuf);
+ }
+ else
+ {
+ LOGSMSIF3("%STEL: Illegal length value (%d)!", &aText, telLength);
+ return;
+ }
+
+ //
+ // PID and the DCS (submit and deliver only)...
+ //
+ if (pduType == CSmsPDU::ESmsSubmit || pduType == CSmsPDU::ESmsDeliver)
+ {
+ LOGSMSIF3("%SPID: 0x%02X", &aText, aPDU[octetOffset]);
+ octetOffset++;
+
+ tmpBuf.Zero();
+
+ TInt dcs = aPDU[octetOffset];
+ octetOffset++;
+
+ if ((dcs & 0xF0 != 0xF0) &&
+ ((dcs & 0xD0) == 0x00 || (dcs & 0xC0) == 0xC0 ||
+ (dcs & 0xD0) == 0xD0 || (dcs & 0xE0) == 0xE0))
+ {
+ //
+ // Classless messages:
+ // 00x0xxxx GSM 7 bit default alphabet with no message class
+ // 1100xxxx Message Waiting Indication Group: Discard Message
+ // 1101xxxx Message Waiting Indication Group: Store Message
+ // 1110xxxx Message Waiting Indication Group: Store Message (UCS2 character set)
+ //
+ tmpBuf.Append(_L8("NO "));
+ }
+ else if ((dcs & 0xC0) == 0x00 || (dcs & 0x40) == 0x40 || (dcs & 0xF0) == 0xF0)
+ {
+ //
+ // Message has a class:
+ // 00xxxxxx General Data Coding indication
+ // 01xxxxxx Message Marked for Automatic Deletion Group
+ // 1111xxxx Data coding/message class
+ //
+ if ((dcs & 0x03) == 0x00) //class 0 sms
+ {
+ tmpBuf.Append(_L8("0 "));
+ }
+ else if((dcs & 0x03) == 0x03) //class 3 sms
+ {
+ tmpBuf.Append(_L8("3 "));
+ }
+ else if((dcs & 0x01) == 0x01) //class 1 sms
+ {
+ tmpBuf.Append(_L8("1 "));
+ }
+ else if((dcs & 0x02) == 0x02) //class 2 sms
+ {
+ tmpBuf.Append(_L8("2 "));
+ }
+ }
+ else
+ {
+ //
+ // 1000xxxx...1011xxxx Reserved coding groups
+ //
+ tmpBuf.Append(_L8("NO "));
+ }
+
+ if ((dcs & 0xF0) == 0xF0)
+ {
+ // Data coding/message class
+ if ((dcs & 0x04) == 0x00)
+ {
+ tmpBuf.Append(_L8(" 7 BIT "));
+ }
+ else if ((dcs & 0x04) == 0x04)
+ {
+ tmpBuf.Append(_L8(" 8 BIT "));
+ }
+ }
+ else if ((dcs & 0xC0) == 0xC0 || (dcs & 0xD0) == 0xD0)
+ {
+ //Message Waiting Indication: Discard Message or Store Message
+ tmpBuf.Append(_L8(" 7 BIT "));
+ }
+ else if ((dcs & 0xE0) == 0xE0)
+ {
+ //Message Waiting Indication: Store Message (UCS2 character set)
+ tmpBuf.Append(_L8("16 BIT "));
+ }
+ else if ((dcs & 0xC0) == 0x00 || (dcs & 0x40) == 0x40)
+ {
+ // General Data Coding indication or Automatic Deletion Group
+ if ((dcs & 0x0C) == 0x00)
+ {
+ tmpBuf.Append(_L8(" 7 BIT "));
+ }
+ else if ((dcs & 0x0C) == 0x0C)
+ {
+ tmpBuf.Append(_L8("Reserved "));
+ }
+ else if ((dcs & 0x04) == 0x04)
+ {
+ tmpBuf.Append(_L8(" 8 BIT "));
+ }
+ else if ((dcs & 0x08) == 0x08)
+ {
+ tmpBuf.Append(_L8("16 BIT "));
+ }
+ }
+ else
+ {
+ // Reserved coding groups
+ tmpBuf.Append(_L("Reserved "));
+ }
+
+ if ((dcs & 0xF0 != 0xF0) &&
+ ((dcs & 0xC0) == 0xC0 || (dcs & 0xD0) == 0xD0 || (dcs & 0xE0) == 0xE0))
+ {
+ if ((dcs & 0x03) == 0x00)
+ {
+ // Voicemail Message Waiting
+ tmpBuf.Append(_L8("Voicemail Message Waiting"));
+ }
+ else if ((dcs & 0x03) == 0x03)
+ {
+ // Other Message Waiting
+ tmpBuf.Append(_L8("Other Message Waiting"));
+ }
+ else if ((dcs & 0x01) == 0x01)
+ {
+ // Fax Message Waiting
+ tmpBuf.Append(_L8("Fax Message Waiting"));
+ }
+ else if ((dcs & 0x02) == 0x02)
+ {
+ // Electronic Mail Message Waiting
+ tmpBuf.Append(_L8("Electronic Mail Message Waiting"));
+ }
+ else
+ {
+ tmpBuf.Append(_L8("-"));
+ }
+ }
+ else
+ {
+ tmpBuf.Append(_L8("-"));
+ }
+
+ LOGSMSIF2("%SDCS: HEX CLASS DCS INDICATION TYPE", &aText);
+ LOGSMSIF4("%S 0x%02X %S", &aText, dcs, &tmpBuf);
+ }
+
+ //
+ // VP (submit only)...
+ //
+ if (pduType == CSmsPDU::ESmsSubmit)
+ {
+ if (vpf == EVpRel)
+ {
+ LOGSMSIF3("%SVP: %d (Relative)", &aText, aPDU[octetOffset++]);
+ }
+ else if (vpf == EVpAbs)
+ {
+ // absolute format - TODO to look for the right format
+ tmpBuf.Zero();
+
+ for (TInt index = 0; index < 7; index++)
+ {
+ tmpBuf.AppendFormat(_L8("%02X"), aPDU[octetOffset + index]);
+ }
+
+ LOGSMSIF3("%SVP: %S (Absolute)", &aText, &tmpBuf);
+ octetOffset += 7;
+ }
+ else if (vpf == EVpEnh)
+ {
+ // enhanced validity period - TODO to look for the right format
+ tmpBuf.Zero();
+
+ for (TInt index = 0; index < 7; index++)
+ {
+ tmpBuf.AppendFormat(_L8("%02X"), aPDU[octetOffset + index]);
+ }
+
+ LOGSMSIF3("%SVP: %S (Enhanced)", &aText, &tmpBuf);
+ octetOffset += 7;
+ }
+ }
+
+ //
+ // SCTS (deliver and status) - TODO to look for the right format
+ //
+ if (pduType == CSmsPDU::ESmsDeliver || pduType == CSmsPDU::ESmsStatusReport)
+ {
+ tmpBuf.Zero();
+
+ for (TInt index = 0; index < 7; index++)
+ {
+ tmpBuf.AppendFormat(_L8("%02X"), aPDU[octetOffset + index]);
+ }
+
+ LOGSMSIF3("%SSCTS: %S", &aText, &tmpBuf);
+ octetOffset += 7;
+ }
+
+ //
+ // Getting the DT and the status of the SR (SR only)
+ // TODO to look for some appended octet after the status, eg. carried ud
+ // and to analise the status
+ //
+ if (pduType == CSmsPDU::ESmsStatusReport)
+ {
+ tmpBuf.Zero();
+
+ for (TInt index = 0; index < 7; index++)
+ {
+ tmpBuf.AppendFormat(_L8("%02X"), aPDU[octetOffset + index]);
+ }
+
+ LOGSMSIF3("%SDT: %S", &aText, &tmpBuf);
+ octetOffset += 7;
+
+ LOGSMSIF3("%SST: %02X", &aText, aPDU[octetOffset]);
+ octetOffset++;
+ }
+
+ //
+ // Getting the UDL - TODO to add UD later and to decode the UDH
+ //
+ if (pduType == CSmsPDU::ESmsDeliver || pduType == CSmsPDU::ESmsSubmit)
+ {
+ if (udhiPresent)
+ {
+ TInt udl = aPDU[octetOffset++];
+ TInt udhl = aPDU[octetOffset++];
+
+ if (udhl > 1)
+ {
+ tmpBuf.Zero();
+
+ // getting iei_a
+ TInt iei_a = aPDU[octetOffset++];
+
+ // getting ieidl_a
+ TInt ieidl_a = aPDU[octetOffset++];
+
+ if (ieidl_a < udhl)
+ {
+ //
+ // With EDS, IEIDL can be almost the whole payload; need to limit
+ // length of debug or increase udlbuf2 to around 300 bytes (which would
+ // make stack frame around 700 bytes out of allowed 2kB; seems too much)
+ // TODO: think whether we should explicitly show this truncation, eg with "..."
+ //
+ for (TInt index = 0; index < ieidl_a; index++)
+ {
+ tmpBuf.AppendFormat(_L8("%02X"), aPDU[octetOffset + index]);
+ if (tmpBuf.Length() > tmpBuf.MaxLength() - 2 ||
+ octetOffset + index == aPDU.Length() - 1)
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ LOGSMSIF3("%SUDL: Problems with the ieidl_a %d being less that UDHL",
+ &aText, ieidl_a);
+ }
+
+ if ((ieidl_a + 1) > udhl)
+ {
+ LOGSMSIF2("%SUDL: Corrupted or implement decoding for second iei_b, iei_n!",
+ &aText);
+ }
+
+ LOGSMSIF2("%SUDL: HEX UDHL IEI_A IEIDL_A ", &aText);
+ LOGSMSIF7("%S 0x%02X 0x%02X 0x%02X 0x%02X %S", &aText,
+ udl, udhl, iei_a, ieidl_a, &tmpBuf);
+ }
+ else
+ {
+ LOGSMSIF2("%SUDL: Corrupted because TP-UDHP is TRUE and TP-UDHL is less than 1!", &aText);
+ LOGSMSIF2("%SUDL: HEX UDHL IEI_A", &aText);
+ LOGSMSIF4("%S 0x%02X 0x%02X", &aText, udl, udhl);
+ }
+ }
+ else
+ {
+ TInt udl = aPDU[octetOffset++];
+
+ LOGSMSIF2("%SUDL: HEX UDHL", &aText);
+ LOGSMSIF3("%S 0x%02X -", &aText, udl);
+ }
+ }
+ } // LogSmsIfPDU
+
+
+void LogSmsIfHexBuf(const TDesC8& aText, const TDesC8& aHexBuf)
+ {
+ //
+ // Print the PDU in hex in rows of upto KHexDumpCharsPerLine bytes...
+ //
+ TBuf8<KHexDumpCharsPerLine * 2> hexLine;
+ TInt length = aHexBuf.Length();
+ TInt position;
+
+ for (position = 0; position < length; position += KHexDumpCharsPerLine)
+ {
+ TInt bytesToLog = length - position;
+ TInt byteIndex;
+
+ if (bytesToLog > KHexDumpCharsPerLine)
+ {
+ bytesToLog = KHexDumpCharsPerLine;
+ }
+
+ hexLine.Zero();
+
+ for (byteIndex = 0; byteIndex < bytesToLog; byteIndex++)
+ {
+ hexLine.AppendFormat(_L8("%02X"), aHexBuf[position + byteIndex]);
+ }
+
+ LOGSMSIF3("%S%S", &aText, &hexLine);
+ }
+ } // LogSmsIfHexBuf
+
+
+/**
+ * Logs a Type of Number enum.
+ *
+ * @param aTON Enum to log.
+ */
+void LogSmsIfTypeOfNumber(const TDesC8& aText, RMobilePhone::TMobileTON aTON)
+ {
+ switch (aTON)
+ {
+ case RMobilePhone::EUnknownNumber:
+ {
+ LOGSMSIF2("%SEUnknownNumber", &aText);
+ }
+ break;
+
+ case RMobilePhone::EInternationalNumber:
+ {
+ LOGSMSIF2("%SEInternationalNumber", &aText);
+ }
+ break;
+
+ case RMobilePhone::ENationalNumber:
+ {
+ LOGSMSIF2("%SENationalNumber", &aText);
+ }
+ break;
+
+ case RMobilePhone::ENetworkSpecificNumber:
+ {
+ LOGSMSIF2("%SENetworkSpecificNumber", &aText);
+ }
+ break;
+
+ case RMobilePhone::ESubscriberNumber:
+ {
+ LOGSMSIF2("%SESubscriberNumber", &aText);
+ }
+ break;
+
+ case RMobilePhone::EAlphanumericNumber:
+ {
+ LOGSMSIF2("%SEAlphanumericNumber", &aText);
+ }
+ break;
+
+ case RMobilePhone::EAbbreviatedNumber:
+ {
+ LOGSMSIF2("%SEAbbreviatedNumber", &aText);
+ }
+ break;
+
+ default:
+ {
+ LOGSMSIF3("%S<unknown enum %d>", &aText, aTON);
+ }
+ break;
+ }
+ } // LogSmsIfTypeOfNumber
+
+
+/**
+ * Logs a Numbering Plan enum.
+ *
+ * @param aNPI Enum to log.
+ */
+void LogSmsIfNumberingPlan(const TDesC8& aText, RMobilePhone::TMobileNPI aNPI)
+ {
+ switch (aNPI)
+ {
+ case RMobilePhone::EUnknownNumberingPlan:
+ {
+ LOGSMSIF2("%SEUnknownNumberingPlan", &aText);
+ }
+ break;
+
+ case RMobilePhone::EIsdnNumberPlan:
+ {
+ LOGSMSIF2("%SEIsdnNumberPlan", &aText);
+ }
+ break;
+
+ case RMobilePhone::EDataNumberPlan:
+ {
+ LOGSMSIF2("%SEDataNumberPlan", &aText);
+ }
+ break;
+
+ case RMobilePhone::ETelexNumberPlan:
+ {
+ LOGSMSIF2("%SETelexNumberPlan", &aText);
+ }
+ break;
+
+ case RMobilePhone::EServiceCentreSpecificPlan1:
+ {
+ LOGSMSIF2("%SEServiceCentreSpecificPlan1", &aText);
+ }
+ break;
+
+ case RMobilePhone::EServiceCentreSpecificPlan2:
+ {
+ LOGSMSIF2("%SEServiceCentreSpecificPlan2", &aText);
+ }
+ break;
+
+ case RMobilePhone::ENationalNumberPlan:
+ {
+ LOGSMSIF2("%SENationalNumberPlan", &aText);
+ }
+ break;
+
+ case RMobilePhone::EPrivateNumberPlan:
+ {
+ LOGSMSIF2("%SEPrivateNumberPlan", &aText);
+ }
+ break;
+
+ case RMobilePhone::EERMESNumberPlan:
+ {
+ LOGSMSIF2("%SEERMESNumberPlan", &aText);
+ }
+ break;
+
+ default:
+ {
+ LOGSMSIF3("%S<unknown enum %d>", &aText, aNPI);
+ }
+ break;
+ }
+ } // LogSmsIfNumberingPlan
+
+
+/**
+ * Logs contents of TMobileGsmSmsEntryV1 object.
+ *
+ * @param aSmsGsmEntryV1 Entry to log.
+ */
+void LogSmsIfSmsEntry(const TDesC8& aText,
+ const RMobileSmsStore::TMobileGsmSmsEntryV1& aSmsGsmEntryV1)
+ {
+ //
+ // Header and index...
+ //
+ LOGSMSIF2("%SRMobileSmsStore::TMobileGsmSmsEntryV1:", &aText);
+ LOGSMSIF4("%S iIndex=%d (0x%08x)", &aText, aSmsGsmEntryV1.iIndex,
+ aSmsGsmEntryV1.iIndex);
+
+ //
+ // Message status...
+ //
+ switch (aSmsGsmEntryV1.iMsgStatus)
+ {
+ case RMobileSmsStore::EStoredMessageUnknownStatus:
+ {
+ LOGSMSIF2("%S iStoreStats=EStoredMessageUnknownStatus", &aText);
+ }
+ break;
+
+ case RMobileSmsStore::EStoredMessageUnread:
+ {
+ LOGSMSIF2("%S iStoreStats=EStoredMessageUnread", &aText);
+ }
+ break;
+
+ case RMobileSmsStore::EStoredMessageRead:
+ {
+ LOGSMSIF2("%S iStoreStats=EStoredMessageRead", &aText);
+ }
+ break;
+
+ case RMobileSmsStore::EStoredMessageUnsent:
+ {
+ LOGSMSIF2("%S iStoreStats=EStoredMessageUnsent", &aText);
+ }
+ break;
+
+ case RMobileSmsStore::EStoredMessageSent:
+ {
+ LOGSMSIF2("%S iStoreStats=EStoredMessageSent", &aText);
+ }
+ break;
+
+ case RMobileSmsStore::EStoredMessageDelivered:
+ {
+ LOGSMSIF2("%S iStoreStats=EStoredMessageDelivered", &aText);
+ }
+ break;
+
+ default:
+ {
+ LOGSMSIF3("%S iStoreStats=<unknown enum %d>", &aText,
+ aSmsGsmEntryV1.iMsgStatus);
+ }
+ break;
+ }
+
+ //
+ // Service centre number...
+ //
+ TBuf8<RMobilePhone::KMaxMobileTelNumberSize> numberIn8bit;
+
+ numberIn8bit.Copy(aSmsGsmEntryV1.iServiceCentre.iTelNumber);
+ LOGSMSIF3("%S SRC Address=\"%S\"", &aText, &numberIn8bit);
+
+ //
+ // Service Centre Type Of Number...
+ //
+ TBuf8<128> tmpBuf;
+
+ tmpBuf.Copy(aText);
+ tmpBuf.Append(_L8(" SRC AddrTON="));
+
+ LOGSMSIFTYPEOFNUMBER(tmpBuf, aSmsGsmEntryV1.iServiceCentre.iTypeOfNumber);
+
+ //
+ // Number Plan...
+ //
+ tmpBuf.Copy(aText);
+ tmpBuf.Append(_L8(" SRC AddrNPI="));
+
+ LOGSMSIFNUMBERINGPLAN(tmpBuf, aSmsGsmEntryV1.iServiceCentre.iNumberPlan);
+
+ //
+ // PDU...
+ //
+ tmpBuf.Copy(aText);
+ tmpBuf.Append(_L8(" PDU: "));
+
+ LOGSMSIFPDU(tmpBuf, aSmsGsmEntryV1.iMsgData, EFalse);
+ } // LogSmsIfSmsEntry
+
+
+/**
+ * Logs contents of TMobileSmsSendAttributesV1 object.
+ *
+ * @param aAttrib Attributes to log.
+ */
+void LogSmsIfSendAttributes(const TDesC8& aText,
+ const RMobileSmsMessaging::TMobileSmsSendAttributesV1& aAttrib)
+ {
+ LOGSMSIF2("%SRMobileSmsMessaging::TMobileSmsSendAttributesV1:", &aText);
+ LOGSMSIF3("%S iFlags=0x%08x", &aText, (TInt)(aAttrib.iFlags));
+
+ if (aAttrib.iFlags & RMobileSmsMessaging::KGsmServiceCentre)
+ {
+ TBuf8<128 + RMobilePhone::KMaxMobileTelNumberSize> tmpBuf;
+
+ tmpBuf.Copy(aAttrib.iGsmServiceCentre.iTelNumber);
+ LOGSMSIF3("%S SRC Address=%S", &aText, &tmpBuf);
+
+ tmpBuf.Copy(aText);
+ tmpBuf.Append(_L8(" SRC AddrTON="));
+
+ LOGSMSIFTYPEOFNUMBER(tmpBuf, aAttrib.iGsmServiceCentre.iTypeOfNumber);
+
+ tmpBuf.Copy(aText);
+ tmpBuf.Append(_L8(" SRC AddrNPI="));
+
+ LOGSMSIFNUMBERINGPLAN(tmpBuf, aAttrib.iGsmServiceCentre.iNumberPlan);
+ }
+
+ if (aAttrib.iFlags & RMobileSmsMessaging::KSmsDataFormat)
+ {
+ switch (aAttrib.iDataFormat)
+ {
+ case RMobileSmsMessaging::EFormatUnspecified:
+ {
+ LOGSMSIF2("%S iDataFormat=EFormatUnspecified", &aText);
+ }
+ break;
+
+ case RMobileSmsMessaging::EFormatGsmTpdu:
+ {
+ LOGSMSIF2("%S iDataFormat=EFormatGsmTpdu", &aText);
+ }
+ break;
+
+ case RMobileSmsMessaging::EFormatCdmaTpdu:
+ {
+ LOGSMSIF2("%S iDataFormat=EFormatCdmaTpdu", &aText);
+ }
+ break;
+
+ default:
+ {
+ LOGSMSIF3("%S iDataFormat=<unknown enum %d>", &aText,
+ aAttrib.iDataFormat);
+ }
+ break;
+ }
+ }
+
+ if (aAttrib.iFlags & RMobileSmsMessaging::KCdmaTeleservice)
+ {
+ LOGSMSIF3("%S iCdmaTeles=0x08X", &aText, aAttrib.iCdmaTeleservice);
+ }
+
+ if (aAttrib.iFlags & RMobileSmsMessaging::KCdmaServiceCategory)
+ {
+ LOGSMSIF3("%S iCdmaServ=0x08X", &aText, aAttrib.iCdmaServiceCategory);
+ }
+
+ if (aAttrib.iFlags & RMobileSmsMessaging::KRemotePartyInfo)
+ {
+ TBuf8<RMobilePhone::KMaxMobileTelNumberSize> tmpBuf;
+
+ tmpBuf.Copy(aAttrib.iDestination.iTelNumber);
+ LOGSMSIF3("%S DST Address=%S", &aText, &tmpBuf);
+
+ tmpBuf.Copy(aText);
+ tmpBuf.Append(_L8(" DST AddrTON="));
+
+ LOGSMSIFTYPEOFNUMBER(tmpBuf, aAttrib.iDestination.iTypeOfNumber);
+
+ tmpBuf.Copy(aText);
+ tmpBuf.Append(_L8(" DST AddrNPI="));
+
+ LOGSMSIFNUMBERINGPLAN(tmpBuf, aAttrib.iDestination.iNumberPlan);
+ }
+
+ if (aAttrib.iFlags & RMobileSmsMessaging::KMoreToSend)
+ {
+ if (aAttrib.iMore)
+ {
+ LOGSMSIF2("%S iMore=ETrue", &aText);
+ }
+ else
+ {
+ LOGSMSIF2("%S iMore=EFalse", &aText);
+ }
+ }
+
+ if (aAttrib.iFlags & RMobileSmsMessaging::KMessageReference)
+ {
+ LOGSMSIF3("%S iMsgRef=0x08X", &aText, aAttrib.iMsgRef);
+ }
+
+ if(aAttrib.iFlags & RMobileSmsMessaging::KGsmSubmitReport)
+ {
+ TBuf8<RMobilePhone::KMaxMobileTelNumberSize> tmpBuf;
+
+ tmpBuf.Copy(aText);
+ tmpBuf.Append(_L8(" iSubmitReport PDU: "));
+
+ LOGSMSIFPDU(tmpBuf, aAttrib.iSubmitReport, EFalse);
+ }
+ } // LogSmsIfSendAttributes
+
+#endif // _SMS_LOGGING_ENABLED