--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/smsprotocols/smsstack/gsmu/src/gsmumsgadditionattributes.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,716 @@
+// Copyright (c) 1999-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:
+// GsmuMsgAdditionalAttributes.cpp
+//
+//
+
+#include "gsmumsgadditionalattributes.h"
+#include "smsstacklog.h"
+
+
+CSmsMessageAdditionalAttributes* CSmsMessageAdditionalAttributes::NewL()
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::NewL()");
+
+ CSmsMessageAdditionalAttributes* additionalAttributes=new(ELeave) CSmsMessageAdditionalAttributes();
+ CleanupStack::PushL(additionalAttributes);
+ additionalAttributes->ConstructL();
+ CleanupStack::Pop();
+ return additionalAttributes;
+ } // CSmsMessageAdditionalAttributes::NewL
+
+
+CSmsMessageAdditionalAttributes::CSmsMessageAdditionalAttributes()
+ {
+ // NOP
+ } // CSmsMessageAdditionalAttributes::CSmsMessageAdditionalAttributes
+
+
+CSmsMessageAdditionalAttributes::~CSmsMessageAdditionalAttributes()
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::~CSmsMessageAdditionalAttributes()");
+
+ iSmsPDUArray.ResetAndDestroy();
+
+ for (TInt category = 0; category < TSmsInformationElementCategories::ENumberOfCategories; category++)
+ {
+ if (iCollectionOfPointersToIEArrays[category] != NULL)
+ {
+ iCollectionOfPointersToIEArrays[category]->ResetAndDestroy();
+ }
+
+ delete iCollectionOfPointersToIEArrays[category];
+ }
+
+ delete iHyperLinkOperations;
+ delete iReplyAddressOperations;
+ delete iSpecialSMSMessageOperations;
+ delete iEnhancedVoiceMailOperations;
+ delete iSMSCCtrlParameterOperations;
+ delete iTPSRROperations;
+ delete iStatusReportScheme;
+ delete iIncompleteClass0MessageInfo;
+ } // CSmsMessageAdditionalAttributes::CSmsMessageAdditionalAttributes
+
+
+void CSmsMessageAdditionalAttributes::ConstructL()
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::ConstructL()");
+
+ iStatusReportScheme = new (ELeave) CSmsMessageAdditionalAttributes::CDefaultScheme();
+
+ for (TInt category = 0; category < TSmsInformationElementCategories::ENumberOfCategories; category++)
+ {
+ iCollectionOfPointersToIEArrays[category] = new (ELeave) CArrayOfPointersToControlInformationElements(8);
+ }
+ } // CSmsMessageAdditionalAttributes::ConstructL
+
+
+void CSmsMessageAdditionalAttributes::AddControlInformationElementL(CSmsInformationElement* aIE)
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::AddControlInformationElementL()");
+
+ TSmsInformationElementCategories::TInformationElementCategory category;
+ if (aIE != NULL)
+ {
+ if (TSmsInformationElementCategories::GetCategoryDefinition(aIE->Identifier(), category))
+ {
+ AddControlInformationElementL(category,aIE);
+ }
+ else
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::AddControlInformationElementL, aIE->Identifier() is invalid");
+ User::Leave(KErrArgument);
+ }
+ }
+ else
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::AddControlInformationElementL, aIE == NULL");
+ User::Leave(KErrArgument);
+ }
+ } // CSmsMessageAdditionalAttributes::AddControlInformationElementL
+
+
+TBool CSmsMessageAdditionalAttributes::Find1stInstanceOfControlInformationElement(TInformationElementId aId, TUint& aIndex) const
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::Find1stInstanceOfControlInformationElement()");
+
+ TBool rc = EFalse;
+ TSmsInformationElementCategories::TInformationElementCategory category;
+
+ if (TSmsInformationElementCategories::GetCategoryDefinition(aId, category))
+ {
+ TInt count=iCollectionOfPointersToIEArrays[category]->Count();
+ for (TInt i=0; i<count; i++)
+ {
+ if (iCollectionOfPointersToIEArrays[category]->operator[](i)->Identifier()==aId)
+ {
+ aIndex=i;
+ rc=ETrue;
+ break;
+ }
+ }
+ }
+ return rc;
+ } // CSmsMessageAdditionalAttributes::Find1stInstanceOfControlInformationElement
+
+
+TBool CSmsMessageAdditionalAttributes::FindNextInstanceOfControlInformationElement(TInformationElementId aId, TUint aStartIndex, TUint& aIndex) const
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::FindNextInstanceOfControlInformationElement()");
+
+ TBool rc = EFalse;
+ TSmsInformationElementCategories::TInformationElementCategory category;
+
+ if (TSmsInformationElementCategories::GetCategoryDefinition(aId, category))
+ {
+ TInt count=iCollectionOfPointersToIEArrays[category]->Count();
+ for (TInt i =aStartIndex + 1; i<count; i++)
+ {
+ if (iCollectionOfPointersToIEArrays[category]->operator[](i)->Identifier()==aId)
+ {
+ aIndex=i;
+ rc=ETrue;
+ break;
+ }
+ }
+ }
+
+ return rc;
+ } // CSmsMessageAdditionalAttributes::FindNextInstanceOfControlInformationElement
+
+
+CSmsInformationElement& CSmsMessageAdditionalAttributes::GetControlInformationElementL(TInformationElementId aId, TUint aIndex) const
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::GetControlInformationElementL()");
+
+
+ TSmsInformationElementCategories::TInformationElementCategory category;
+
+ if (TSmsInformationElementCategories::GetCategoryDefinition(aId, category) == EFalse)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ if (aIndex >= iCollectionOfPointersToIEArrays[category]->Count())
+ {
+ LOGGSMU3("CSmsMessageAdditionalAttributes::GetControlInformationElementL aId = %d , aIndex = %d", aId, aIndex);
+ LOGGSMU2("CSmsMessageAdditionalAttributes::GetControlInformationElementL Count = %d", iCollectionOfPointersToIEArrays[category]->Count());
+ User::Leave(KErrArgument);
+ }
+
+ if (iCollectionOfPointersToIEArrays[category]->operator[](aIndex) == NULL)
+ {
+ LOGGSMU3("CSmsMessageAdditionalAttributes::GetControlInformationElementL aId = %d , aIndex = %d", aId, aIndex);
+ User::Leave(KErrArgument);
+ }
+
+ if (iCollectionOfPointersToIEArrays[category]->operator[](aIndex)->Identifier()!=aId)
+ {
+ LOGGSMU3("CSmsMessageAdditionalAttributes::GetControlInformationElementL aId = %d, aIndex = %d", aId, aIndex);
+ LOGGSMU2("CSmsMessageAdditionalAttributes::GetControlInformationElementL id = %d", iCollectionOfPointersToIEArrays[category]->operator[](aIndex)->Identifier());
+ User::Leave(KErrArgument);
+ }
+
+ CSmsInformationElement* ie = iCollectionOfPointersToIEArrays[category]->operator[](aIndex);
+ return *ie;
+ } // CSmsMessageAdditionalAttributes::GetControlInformationElementL
+
+
+TBool CSmsMessageAdditionalAttributes::RemoveControlInformationElement(TInformationElementId aId, TUint aIndex, CSmsInformationElementPtr& aIE)
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::RemoveControlInformationElement()");
+
+ TBool rc = EFalse;
+ TSmsInformationElementCategories::TInformationElementCategory category;
+
+ if (TSmsInformationElementCategories::GetCategoryDefinition(aId, category))
+ {
+ if ((iCollectionOfPointersToIEArrays[category]->Count() > aIndex) &&
+ (iCollectionOfPointersToIEArrays[category]->operator[](aIndex)->Identifier()==aId))
+ {
+ aIE = iCollectionOfPointersToIEArrays[category]->operator[](aIndex);
+ iCollectionOfPointersToIEArrays[category]->Delete(aIndex);
+ rc = ETrue;
+ }
+ }
+
+ return rc;
+ } // CSmsMessageAdditionalAttributes::RemoveControlInformationElement
+
+
+void CSmsMessageAdditionalAttributes::AddControlInformationElementL(TCategory aCategory, CSmsInformationElementPtr aIE)
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::AddControlInformationElementL()");
+
+ if ((aIE != NULL) &&
+ (aCategory < TSmsInformationElementCategories::ENumberOfCategories))
+ {
+ iCollectionOfPointersToIEArrays[aCategory]->AppendL(aIE);
+ }
+ else
+ {
+ User::Leave(KErrArgument);
+ }
+ } // CSmsMessageAdditionalAttributes::AddControlInformationElementL
+
+
+TBool CSmsMessageAdditionalAttributes::RemoveNextControlInformationElement(TCategory aCategory, CSmsInformationElementPtr& aIEPtr)
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::RemoveNextControlInformationElement()");
+
+ TBool rc = EFalse;
+ if (aCategory < TSmsInformationElementCategories::ENumberOfCategories)
+ {
+ TInt tailIndex;
+ if ((tailIndex = (iCollectionOfPointersToIEArrays[aCategory]->Count() - 1)) >= 0)
+ {
+ aIEPtr = (*iCollectionOfPointersToIEArrays[aCategory])[tailIndex];
+ iCollectionOfPointersToIEArrays[aCategory]->Delete(tailIndex);
+ rc = ETrue;
+ }
+ }
+ return rc;
+ } // CSmsMessageAdditionalAttributes::RemoveNextControlInformationElement
+
+
+CSmsInformationElement& CSmsMessageAdditionalAttributes::GetControlInformationElementL(TCategory aCategory, TUint aIndex) const
+ {
+ LOGGSMU3("CSmsMessageAdditionalAttributes::GetControlInformationElementL(): aCategory=%d, aIndex=%d",
+ aCategory, aIndex);
+
+ if ((aCategory >= TSmsInformationElementCategories::ENumberOfCategories) ||
+ (aIndex >= iCollectionOfPointersToIEArrays[aCategory]->Count()))
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::GetControlInformationElementL: KErrArgument");
+ User::Leave(KErrArgument);
+ }
+
+ if ((iCollectionOfPointersToIEArrays[aCategory])->operator[](aIndex) == NULL)
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::GetControlInformationElementL: KErrCorrupt");
+ User::Leave(KErrCorrupt);
+ }
+
+ return *(iCollectionOfPointersToIEArrays[aCategory]->operator[](aIndex));
+ } // CSmsMessageAdditionalAttributes::GetControlInformationElementL
+
+
+void CSmsMessageAdditionalAttributes::DeleteControlInformationElement(TCategory aCategory, TUint8 aIndex)
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::DeleteControlInformationElement()");
+
+ if (aCategory < TSmsInformationElementCategories::ENumberOfCategories)
+ {
+ TInt count = iCollectionOfPointersToIEArrays[aCategory]->Count();
+ if (aIndex < count)
+ {
+ CSmsInformationElement* iE = iCollectionOfPointersToIEArrays[aCategory]->operator[](aIndex);
+ iCollectionOfPointersToIEArrays[aCategory]->Delete(aIndex);
+ // The element being deleted has been removed from iCollectionOfPointersToIEArrays. So, next time it cannot be deleted again.
+ // coverity[double_free]
+ delete iE;
+ }
+ }
+ } // CSmsMessageAdditionalAttributes::DeleteControlInformationElement
+
+
+TUint CSmsMessageAdditionalAttributes::NumberOfControlInformationElements(TCategory aCategory) const
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::NumberOfControlInformationElements1()");
+
+ TUint count = 0;
+
+ if (aCategory < TSmsInformationElementCategories::ENumberOfCategories)
+ {
+ count = iCollectionOfPointersToIEArrays[aCategory]->Count();
+ }
+
+ return count;
+ } // CSmsMessageAdditionalAttributes::NumberOfControlInformationElements
+
+
+void CSmsMessageAdditionalAttributes::ExternalizeL(RWriteStream& aStream, TInt aVersion) const
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::ExternalizeL()");
+
+ if(aVersion == CSmsMessage::ESmsIncompleteClass0MessageV)
+ {
+ iIncompleteClass0MessageInfo->ExternalizeL(aStream);
+ return;
+ }
+
+ for (TInt category = 0; category < TSmsInformationElementCategories::ENumberOfCategories; category++)
+ {
+ TUint32 count = iCollectionOfPointersToIEArrays[category]->Count();
+
+ aStream.WriteUint32L(count);
+ for (TUint32 j = 0; j < count; j++)
+ {
+ iCollectionOfPointersToIEArrays[category]->operator[](j)->ExternalizeL(aStream);
+ }
+ }
+
+ if (aVersion == CSmsMessage::ESmsMessageV2 ||
+ aVersion == CSmsMessage::ESmsMessageV3 ||
+ aVersion == CSmsMessage::ESmsMessageV4) // Status Report Scheme
+ {
+ aStream.WriteInt16L(iStatusReportScheme->Id()); //The Scheme
+
+ if(iStatusReportScheme->Id() == ETPSRRScheme)
+ {
+ CTPSRRScheme* scheme = (CTPSRRScheme*)iStatusReportScheme;
+ TUint32 count = (scheme->iTPSRRStatusReport).Count(); // TPSRR Array Count
+ aStream << count;
+ for(TInt ii=0; ii<count; ii++)
+ {
+ aStream.WriteUint16L((scheme->iTPSRRStatusReport[ii]).iSegmentSequenceNum); // Segment number
+ aStream.WriteInt16L((scheme->iTPSRRStatusReport[ii]).iTPSRRStatus); // TPSRR Bit
+ }
+ aStream.WriteInt16L(scheme->iDefaultStatusReport); // Default
+ aStream.WriteInt16L(scheme->iNumOfPDUs);
+ }
+
+ if(iStatusReportScheme->Id() == EControlParametersScheme)
+ {
+ CControlParametersScheme* scheme = (CControlParametersScheme*)iStatusReportScheme;
+ TUint32 count = (scheme->iControlParametersStatusReport).Count(); // Control Params Array Count
+ aStream << count;
+ for(TInt ii=0; ii<count; ii++)
+ {
+ aStream.WriteUint16L((scheme->iControlParametersStatusReport[ii]).iSegmentSequenceNum); // Segment number
+ aStream.WriteInt8L((scheme->iControlParametersStatusReport[ii]).iSelectiveStatus); // Selective Status
+ }
+ aStream.WriteInt8L(scheme->iDefaultStatusReport); // Default
+ aStream.WriteInt16L(scheme->iNumOfPDUs);
+ }
+ }
+
+ // CSmsMessage::ESmsMessageV3 is the same as CSmsMessage::ESmsIncompleteClass0MessageV!
+
+ if (aVersion == CSmsMessage::ESmsMessageV4) // National language 7bit encoding support
+ {
+ aStream.WriteInt32L(iAlternative7bitEncoding);
+ }
+ }
+
+void CSmsMessageAdditionalAttributes::InternalizeL(RReadStream& aStream, TInt aVersion)
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::InternalizeL()");
+
+ if(aVersion == CSmsMessage::ESmsIncompleteClass0MessageV)
+ {
+ iIncompleteClass0MessageInfo->InternalizeL(aStream);
+ return;
+ }
+
+ for (TInt category = 0; category < TSmsInformationElementCategories::ENumberOfCategories; category++)
+ {
+ TUint32 count = aStream.ReadInt32L();
+ iCollectionOfPointersToIEArrays[category]->ResetAndDestroy();
+
+ for (TInt32 j = 0; j < count; j++)
+ {
+ CSmsInformationElement* informationElement = CSmsInformationElement::NewL();
+ CleanupStack::PushL(informationElement);
+ aStream >> *informationElement;
+ iCollectionOfPointersToIEArrays[category]->AppendL(informationElement);
+ CleanupStack::Pop();
+ }
+ }
+
+ if (aVersion == CSmsMessage::ESmsMessageV2 ||
+ aVersion == CSmsMessage::ESmsMessageV3 ||
+ aVersion == CSmsMessage::ESmsMessageV4) // Status Report Scheme
+ {
+ TSmsStatusReportScheme schemeId = static_cast<TSmsStatusReportScheme>(aStream.ReadInt16L());
+
+ if(schemeId == ETPSRRScheme)
+ {
+ SetStatusReportSchemeL(ETPSRRScheme);
+ CTPSRRScheme* scheme = (CTPSRRScheme*)iStatusReportScheme;
+
+ TUint32 count = aStream.ReadInt32L();
+
+ CSmsMessageAdditionalAttributes::CTPSRRScheme::TSmsTPSRRStatus tpsrrStatus;
+ for(TInt ii=0; ii<count; ii++)
+ {
+ tpsrrStatus.iSegmentSequenceNum = aStream.ReadUint16L(); // Segment number
+ tpsrrStatus.iTPSRRStatus = static_cast<TSmsFirstOctet::TSmsStatusReportRequest>(aStream.ReadInt16L()); // TPSRR Bit
+ (scheme->iTPSRRStatusReport).AppendL(tpsrrStatus);
+ }
+ scheme->iDefaultStatusReport = static_cast<TSmsFirstOctet::TSmsStatusReportRequest>(aStream.ReadInt16L());
+ scheme->iNumOfPDUs = aStream.ReadInt16L();
+ }
+ if(schemeId == EControlParametersScheme)
+ {
+ SetStatusReportSchemeL(EControlParametersScheme);
+ CControlParametersScheme* scheme = (CControlParametersScheme*)iStatusReportScheme;
+
+ TUint32 count = aStream.ReadInt32L();
+
+ CSmsMessageAdditionalAttributes::CControlParametersScheme::TSmsSMSCCtrlParameterStatus smscCtrlParameterStatus;
+ for(TInt ii=0; ii<count; ii++)
+ {
+ smscCtrlParameterStatus.iSegmentSequenceNum = aStream.ReadUint16L(); // Segment number
+ smscCtrlParameterStatus.iSelectiveStatus = aStream.ReadInt8L(); // Selective Status
+ (scheme->iControlParametersStatusReport).AppendL(smscCtrlParameterStatus);
+ }
+ scheme->iDefaultStatusReport = aStream.ReadInt8L();
+ scheme->iNumOfPDUs = aStream.ReadInt16L();
+ }
+ }
+ else
+ {
+ SetStatusReportSchemeL(EDefaultScheme);
+ }
+
+ // CSmsMessage::ESmsMessageV3 is the same as CSmsMessage::ESmsIncompleteClass0MessageV!
+
+ if (aVersion == CSmsMessage::ESmsMessageV4) // National language 7bit encoding support
+ {
+ iAlternative7bitEncoding = (TSmsEncoding) aStream.ReadInt32L();
+ }
+ } // CSmsMessageAdditionalAttributes::InternalizeL
+
+
+void CSmsMessageAdditionalAttributes::ResetAttributesL()
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::ResetAttributesL()");
+
+ for (TInt category = 0; category < TSmsInformationElementCategories::ENumberOfCategories; category++)
+ {
+ iCollectionOfPointersToIEArrays[category]->ResetAndDestroy();
+ }
+
+ if(iStatusReportScheme != NULL)
+ {
+ delete iStatusReportScheme;
+ iStatusReportScheme = NULL;
+ }
+
+ iStatusReportScheme = new (ELeave) CSmsMessageAdditionalAttributes::CDefaultScheme();
+
+ iAlternative7bitEncoding = ESmsEncodingNone;
+ } // CSmsMessageAdditionalAttributes::ResetAttributesL
+
+
+CSmsIEOperation& CSmsMessageAdditionalAttributes::GetIEOperationL(TInformationElementId aId) const
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::GetIEOperation()");
+
+ CSmsIEOperation* operation = NULL;
+
+ switch(aId)
+ {
+ case CSmsInformationElement::ESmsHyperLinkFormat:
+ operation = iHyperLinkOperations;
+ break;
+ case CSmsInformationElement::ESmsReplyAddressFormat:
+ operation = iReplyAddressOperations;
+ break;
+ case CSmsInformationElement::ESmsEnhanceVoiceMailInformation:
+ operation = iEnhancedVoiceMailOperations;
+ break;
+ case CSmsInformationElement::ESmsIEISpecialSMSMessageIndication:
+ operation = iSpecialSMSMessageOperations;
+ break;
+ case CSmsInformationElement::ESmsIEISMSCControlParameters:
+ operation = iSMSCCtrlParameterOperations;
+ break;
+ default:
+ User::Leave(KErrArgument);
+ break;
+ }
+
+ return *operation;
+ } // CSmsMessageAdditionalAttributes::GetIEOperationL
+
+
+/**
+ * Gets the operation being used but for a non Information Element Type.
+ *
+ * @note In the present case it is the TPSRR operation as that's the only one which exists as for now.
+ *
+ * @param aId The Identifier for the operation.
+ */
+CSmsNonIEOperation& CSmsMessageAdditionalAttributes::GetNonIEOperationL(TSmsNonIEIdentifier aId) const
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::GetNonIEOperationL");
+
+ CSmsNonIEOperation* operation = NULL;
+
+ if(aId == ESmsTPSRRParameter)
+ {
+ operation = iTPSRROperations;
+ }
+ else if (aId == ESmsIncompleteClass0MessageParameter)
+ {
+ operation = iIncompleteClass0MessageInfo;
+ }
+ else
+ {
+ User::Leave(KErrArgument);
+ }
+
+ return *operation;
+ } // CSmsMessageAdditionalAttributes::GetIEOperationL
+
+
+void CSmsMessageAdditionalAttributes::SetIEOperationL(CSmsIEOperation* aOperation)
+ {
+ LOGGSMU1("CSmsMessageAdditionalAttributes::SetIEOperationL()");
+
+ if (aOperation == NULL)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ LOGGSMU2("CSmsMessageAdditionalAttributes::AddIEOperation, operation=%d", aOperation->Id());
+
+ switch(aOperation->Id())
+ {
+ case CSmsInformationElement::ESmsHyperLinkFormat:
+ iHyperLinkOperations = (CSmsHyperLinkOperations*) aOperation;
+ break;
+ case CSmsInformationElement::ESmsReplyAddressFormat:
+ iReplyAddressOperations = (CSmsReplyAddressOperations*)aOperation;
+ break;
+ case CSmsInformationElement::ESmsEnhanceVoiceMailInformation:
+ iEnhancedVoiceMailOperations = (CSmsEnhancedVoiceMailOperations*) aOperation;
+ break;
+ case CSmsInformationElement::ESmsIEISpecialSMSMessageIndication:
+ iSpecialSMSMessageOperations = (CSmsSpecialSMSMessageOperations*) aOperation;
+ break;
+ case CSmsInformationElement::ESmsIEISMSCControlParameters:
+ iSMSCCtrlParameterOperations = (CSmsSMSCCtrlParameterOperations*) aOperation;
+ break;
+ default:
+ (void) aOperation;
+ User::Leave(KErrArgument);
+ break;
+ }
+ } // CSmsMessageAdditionalAttributes::SetIEOperationL
+
+
+/**
+ * Sets the operation but for a non Information Element Type.
+ *
+ * @note In the present case it is the TPSRR operation as that's the only one which exists as for now.
+ */
+void CSmsMessageAdditionalAttributes::SetNonIEOperationL(CSmsNonIEOperation* aOperation)
+ {
+ if (aOperation == NULL)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ LOGGSMU2("CSmsMessageAdditionalAttributes::SetNonIEOperationL, operation = %d", aOperation->Id());
+
+ if (aOperation->Id() == ESmsTPSRRParameter)
+ {
+ iTPSRROperations = (CSmsTPSRROperations*) aOperation;
+ }
+ else if (aOperation->Id() == ESmsIncompleteClass0MessageParameter)
+ {
+ iIncompleteClass0MessageInfo = (CIncompleteClass0MessageInfo*) aOperation;
+ }
+ else
+ {
+ User::Leave(KErrArgument);
+ }
+ } // CSmsMessageAdditionalAttributes::SetNonIEOperationL
+
+
+/**
+ * Gets the pointer to the scheme being used for Status reporting. This is called in operations class and
+ * in Segmentation Store.
+ *
+ * @return Pointer to the scheme being used.
+ */
+CSmsMessageAdditionalAttributes::CSmsStatusReportScheme& CSmsMessageAdditionalAttributes::GetStatusReportScheme() const
+ {
+ return *iStatusReportScheme;
+ } // CSmsMessageAdditionalAttributes::GetStatusReportScheme
+
+
+void CSmsMessageAdditionalAttributes::SetStatusReportSchemeL(TSmsStatusReportScheme aId)
+ {
+ if(iStatusReportScheme != NULL)
+ {
+ delete iStatusReportScheme;
+ iStatusReportScheme = NULL;
+ }
+
+ if (aId == EControlParametersScheme)
+ {
+ iStatusReportScheme = new (ELeave) CSmsMessageAdditionalAttributes::CControlParametersScheme();
+ }
+ if (aId == ETPSRRScheme)
+ {
+ iStatusReportScheme = new (ELeave) CSmsMessageAdditionalAttributes::CTPSRRScheme();
+ }
+ if (aId == EDefaultScheme)
+ {
+ iStatusReportScheme = new (ELeave) CSmsMessageAdditionalAttributes::CDefaultScheme();
+ }
+ } // CSmsMessageAdditionalAttributes::SetStatusReportSchemeL
+
+
+/**
+ * Get the current encoding value.
+ *
+ * @return Encoding value.
+ */
+TSmsEncoding CSmsMessageAdditionalAttributes::Alternative7bitEncoding() const
+ {
+ return iAlternative7bitEncoding;
+ } // CSmsMessageAdditionalAttributes::Alternative7bitEncoding
+
+
+/**
+ * Set the encoding value.
+ *
+ * @param aEncoding Encoding value.
+ */
+void CSmsMessageAdditionalAttributes::SetAlternative7bitEncoding(TSmsEncoding aEncoding)
+ {
+ iAlternative7bitEncoding = aEncoding;
+ } // CSmsMessageAdditionalAttributes::SetAlternative7bitEncoding
+
+
+CSmsMessageAdditionalAttributes::CControlParametersScheme::CControlParametersScheme()
+: iControlParametersStatusReport(), iNumOfPDUs(0)
+ {
+ } // CSmsMessageAdditionalAttributes::CControlParametersScheme::CControlParametersScheme
+
+
+/**
+ * Returns the ID of the current scheme.
+ */
+TSmsStatusReportScheme CSmsMessageAdditionalAttributes::CControlParametersScheme::Id()
+ {
+ return EControlParametersScheme;
+ } // CSmsMessageAdditionalAttributes::CControlParametersScheme::Id
+
+
+CSmsMessageAdditionalAttributes::CControlParametersScheme::~CControlParametersScheme()
+ {
+ iControlParametersStatusReport.Reset();
+ iControlParametersStatusReport.Close();
+ } // CSmsMessageAdditionalAttributes::CControlParametersScheme::~CControlParametersScheme
+
+
+CSmsMessageAdditionalAttributes::CTPSRRScheme::CTPSRRScheme()
+: iTPSRRStatusReport(), iNumOfPDUs(0)
+ {
+
+ } // CSmsMessageAdditionalAttributes::CTPSRRScheme::CTPSRRScheme
+
+
+/**
+ * Returns the ID of the current scheme.
+ */
+TSmsStatusReportScheme CSmsMessageAdditionalAttributes::CTPSRRScheme::Id()
+ {
+ return ETPSRRScheme;
+ } // CSmsMessageAdditionalAttributes::CTPSRRScheme::Id
+
+
+CSmsMessageAdditionalAttributes::CTPSRRScheme::~CTPSRRScheme()
+ {
+ iTPSRRStatusReport.Reset();
+ iTPSRRStatusReport.Close();
+ } // CSmsMessageAdditionalAttributes::CTPSRRScheme::~CTPSRRScheme
+
+
+CSmsMessageAdditionalAttributes::CDefaultScheme::CDefaultScheme()
+ {
+
+ } // CSmsMessageAdditionalAttributes::CDefaultScheme::CDefaultScheme
+
+
+/**
+ * Returns the ID of the current scheme.
+ */
+TSmsStatusReportScheme CSmsMessageAdditionalAttributes::CDefaultScheme::Id()
+ {
+ return EDefaultScheme;
+ } // CSmsMessageAdditionalAttributes::CDefaultScheme::Id
+
+
+CSmsMessageAdditionalAttributes::CDefaultScheme::~CDefaultScheme()
+ {
+
+ } // CSmsMessageAdditionalAttributes::CDefaultScheme::~CDefaultScheme