--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/smsmtm/clientmtm/src/SMUTSET.CPP Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,879 @@
+// 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:
+//
+
+
+#include <etelmm.h>
+#include "SMCMMAIN.H"
+#include "SMUTSET.H"
+
+#include <commsdattypesv1_1.h>
+#include <commsdat.h>
+#include <txtetext.h>
+#include <csmsemailfields.h>
+#include <logwraplimits.h>
+using namespace CommsDat;
+
+
+
+// Compile time check to see if the enums RMobileSmsMessaging::TMobileSmsBearer and CSmsSettings::TMobileSmsBearer
+// are equivalent.
+
+#undef C_ASSERT
+#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
+
+C_ASSERT(RMobileSmsMessaging::ESmsBearerPacketOnly==CSmsSettings::ESmsBearerPacketOnly);
+C_ASSERT(RMobileSmsMessaging::ESmsBearerCircuitOnly==CSmsSettings::ESmsBearerCircuitOnly);
+C_ASSERT(RMobileSmsMessaging::ESmsBearerPacketPreferred==CSmsSettings::ESmsBearerPacketPreferred);
+C_ASSERT(RMobileSmsMessaging::ESmsBearerCircuitPreferred==CSmsSettings::ESmsBearerCircuitPreferred);
+
+const TInt16 KMsgFileSmsMessageSettingsVersion = 1;
+const TInt16 KMsgFileSmsNumberVersion = 2;
+const TInt KSmcmSCAddressGranularity = 8;
+
+
+/**
+Constructor.
+*/
+CSmsMessageSettings::CSmsMessageSettings()
+: CBase(),
+ iValidityPeriodFormat(TSmsFirstOctet::ESmsVPFSemiOctet)
+ {
+ }
+
+/**
+Internalises the settings from a read stream.
+
+@param aReadStream
+The stream from which the settings should be internalised.
+*/
+EXPORT_C void CSmsMessageSettings::InternalizeL(RReadStream& aReadStream)
+ {
+ aReadStream.ReadInt16L(); // version - not used yet
+
+ iValidityPeriod = aReadStream.ReadInt32L();
+ iValidityPeriodFormat = (TSmsFirstOctet::TSmsValidityPeriodFormat) aReadStream.ReadInt8L();
+ iAlphabet = (TSmsDataCodingScheme::TSmsAlphabet) aReadStream.ReadInt16L();
+ iMsgFlags = aReadStream.ReadUint32L();
+ iMessageConversion = (TSmsPIDConversion) aReadStream.ReadInt16L();
+ }
+
+/**
+Externalises the settings to a write stream.
+
+@param aWriteStream
+The stream to which the settings should be externalised.
+*/
+EXPORT_C void CSmsMessageSettings::ExternalizeL(RWriteStream& aWriteStream) const
+ {
+ aWriteStream.WriteInt16L(KMsgFileSmsMessageSettingsVersion);
+ aWriteStream.WriteInt32L(iValidityPeriod.Int());
+ aWriteStream.WriteInt8L(iValidityPeriodFormat);
+ aWriteStream.WriteInt16L(iAlphabet);
+ aWriteStream.WriteUint32L(iMsgFlags);
+ aWriteStream.WriteInt16L(iMessageConversion);
+ }
+
+/**
+Copies the settings stored in the specified object into this object.
+
+@param aSettings
+The settings to be copied.
+*/
+EXPORT_C void CSmsMessageSettings::CopyL(const CSmsMessageSettings& aSettings)
+ {
+ iMsgFlags = aSettings.iMsgFlags;
+ iMessageConversion = aSettings.iMessageConversion;
+ iAlphabet = aSettings.iAlphabet;
+ SetValidityPeriod(aSettings.ValidityPeriod());
+ SetValidityPeriodFormat(aSettings.ValidityPeriodFormat());
+ }
+
+/**
+Returns SMS message settings flag
+
+@return
+SMS message settings flag
+*/
+TUint32 CSmsMessageSettings::MessageFlags() const
+ {
+ return iMsgFlags;
+ }
+
+/**
+Sets SMS message settings flag
+
+@param aMsgFlags
+SMS message settings flag
+*/
+void CSmsMessageSettings::SetMessageFlags(TUint32 aMsgFlags)
+ {
+ iMsgFlags = aMsgFlags;
+ }
+
+/*
+ * CSmsSettings
+ */
+
+/**
+Allocates and constructs an SMS settings object.
+
+Initialises all member data to their default values.
+
+@return
+The newly constructed SMS settings object.
+*/
+EXPORT_C CSmsSettings* CSmsSettings::NewL()
+ {
+ CSmsSettings* self = CSmsSettings::NewLC();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+/**
+Allocates and constructs an SMS settings object.
+
+Initialises all member data to their default values.
+
+@return
+The newly constructed SMS settings object.
+*/
+EXPORT_C CSmsSettings* CSmsSettings::NewLC()
+ {
+ CSmsSettings* self = new (ELeave) CSmsSettings();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+/**
+Constructor.
+*/
+CSmsSettings::CSmsSettings()
+: CSmsMessageSettings(),
+ iDefaultSC(-1),
+ iStatusReportHandling(EDoNotWatchForReport),
+ iSpecialMessageHandling(EDoNotWatchForReport),
+ iCommDbAction(ENone),
+ iSmsBearerAction(ENone),
+ iSmsBearer(ESmsBearerCircuitPreferred),
+ iClass2Folder(KMsvGlobalInBoxIndexEntryId),
+ iDescriptionLength(KSmsDescriptionLength)
+ {
+ }
+
+/**
+Destructor.
+*/
+EXPORT_C CSmsSettings::~CSmsSettings()
+ {
+ if (iServiceCenters)
+ {
+ iServiceCenters->ResetAndDestroy();
+ delete iServiceCenters;
+ }
+ }
+
+/**
+Second phase construction.
+*/
+void CSmsSettings::ConstructL()
+ {
+ iServiceCenters = new (ELeave) CArrayPtrFlat<CSmsServiceCenter>(KSmcmSCAddressGranularity);
+ }
+
+
+void CSmsSettings::StoreToCommDbL() const
+ {
+ if (iCommDbAction != EStoreToCommDb && iSmsBearerAction != EStoreToCommDb)
+ return; // nothing to store to the Comm DB
+
+ CMDBSession *dbSession = CMDBSession::NewL(KCDVersion1_2);
+ CleanupStack::PushL(dbSession);
+
+ //Create a CCDModemBearerRecord link field container to read the
+ //RecordID in the CCDGlobalSettingsRecord.iModemForPhoneServicesAndSMS
+ CMDBRecordLink<CCDModemBearerRecord> *modemBearerRecordSet = new(ELeave) CMDBRecordLink<CCDModemBearerRecord>(KCDTIdGlobalSettingsRecord | KCDTIdModemPhoneServicesSMS);
+ CleanupStack::PushL(modemBearerRecordSet);
+
+ //RecordID needs to be set to 1, as there is always just one GlobalSettings record
+ modemBearerRecordSet->SetRecordId(1);
+
+ //Load field container with data from database
+ TRAPD(err, modemBearerRecordSet->LoadL(*dbSession));
+ if(err != KErrNone)
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ if (iCommDbAction == EStoreToCommDb)
+ {
+ //Create a container for a ModemBearerRecord and read its contents
+ CCDModemBearerRecord *modemRecord = static_cast<CCDModemBearerRecord*> (CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord));
+ CleanupStack::PushL(modemRecord);
+
+ //Set the record ID to that previously read from CCDGlobalSettingsRecord.iModemForPhoneServicesAndSMS
+ modemRecord->SetRecordId(*modemBearerRecordSet);
+
+ //Load record container with data from database
+ modemRecord->LoadL(*dbSession);
+
+ if (iDefaultSC > -1 && iServiceCenters->Count())
+ {
+ const TPtrC address = GetServiceCenter(iDefaultSC).Address();
+ modemRecord->iMessageCentreNumber.SetMaxLengthL(address.Length());
+ modemRecord->iMessageCentreNumber = address;
+ }
+ else
+ {
+ modemRecord->iMessageCentreNumber = KNullDesC;
+ }
+
+ const TUint32 valPeriod = (TUint32) ValidityPeriod().Int();
+ modemRecord->iMessageValidityPeriod = valPeriod;
+
+ const TBool delReport = DeliveryReport() ? ETrue : EFalse;
+ modemRecord->iMessageDeliveryReport = delReport;
+
+ modemRecord->ModifyL(*dbSession);
+
+ CleanupStack::PopAndDestroy(modemRecord);
+ }
+
+ if (iSmsBearerAction == EStoreToCommDb)
+ {
+ CCDGlobalSettingsRecord* globalSettingsRecord = static_cast<CCDGlobalSettingsRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdGlobalSettingsRecord));
+ CleanupStack::PushL(globalSettingsRecord);
+
+ //RecordID needs to be set to 1, as there is always just one GlobalSettings record
+ globalSettingsRecord->SetRecordId(1);
+
+ TRAPD(err, globalSettingsRecord->LoadL(*dbSession));
+ if(err != KErrNone)
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ globalSettingsRecord->iSMSBearer = SmsBearer();
+ globalSettingsRecord->iSMSBearer.ModifyL(*dbSession);
+ CleanupStack::PopAndDestroy(globalSettingsRecord);
+ }
+
+ CleanupStack::PopAndDestroy(modemBearerRecordSet);
+ CleanupStack::PopAndDestroy(dbSession);
+ }
+
+
+/**
+Gets the number of Service Centre addresses stored in this object.
+
+@return
+The number of addresses.
+*/
+EXPORT_C TInt CSmsSettings::ServiceCenterCount() const
+ {
+ return iServiceCenters->Count();
+ }
+
+/**
+Gets the Service Centre address at the specified index in the list.
+
+@param aIndex
+The index of the specified address.
+
+@return
+The indexed address.
+*/
+EXPORT_C CSmsServiceCenter& CSmsSettings::GetServiceCenter(TInt aIndex) const
+ {
+ return *iServiceCenters->At(aIndex);
+ }
+
+/**
+Appends a service centre address (name and number) to the list.
+
+@param aName
+The Service Centre name
+
+@param aNumber
+The Service Centre number.
+*/
+EXPORT_C void CSmsSettings::AddServiceCenterL(const TDesC& aName,const TDesC& aNumber)
+ {
+
+ CSmsServiceCenter* recipient=CSmsServiceCenter::NewL();
+ CleanupStack::PushL(recipient);
+ recipient->SetNameL(aName);
+ recipient->SetAddressL(aNumber);
+
+ iServiceCenters->AppendL(recipient);
+ CleanupStack::Pop(recipient);
+
+ if (iServiceCenters->Count() == 1 || iDefaultSC < 0)
+ iDefaultSC = 0;
+ }
+
+/**
+Removes the service centre address with index aIndex from the array of service
+centre addresses that are stored in the object.
+
+@param aIndex
+The index of the Service Centre address to remove.
+*/
+EXPORT_C void CSmsSettings::RemoveServiceCenter(TInt aIndex)
+ {
+ delete iServiceCenters->At(aIndex);
+ iServiceCenters->Delete(aIndex);
+
+ if (iDefaultSC == aIndex)
+ {
+ iDefaultSC = iServiceCenters->Count() ? 0 : -1;
+ }
+ else if (iDefaultSC > aIndex)
+ {
+ iDefaultSC--;
+ }
+ }
+
+/**
+Gets the index of the default service centre address for this service.
+
+@return
+The index of the default service centre address.
+*/
+EXPORT_C TInt CSmsSettings::DefaultServiceCenter() const
+ {
+ return iDefaultSC;
+ }
+
+/**
+Sets the index of the default service centre address for this service.
+
+@param aDefaultSC
+An index into the list of the default service centre address.
+
+@panic SMCM 7
+The specified index is negative or beyond the maximum index (debug only).
+*/
+EXPORT_C void CSmsSettings::SetDefaultServiceCenter(TInt aDefaultSC)
+ {
+ __ASSERT_DEBUG(aDefaultSC>=0, Panic(ESmscDefaultSCOutOfRange));
+ __ASSERT_DEBUG(aDefaultSC<iServiceCenters->Count(), Panic(ESmscDefaultSCOutOfRange));
+
+ iDefaultSC=aDefaultSC;
+ }
+
+void CSmsSettings::RemoveSCAddresses()
+ {
+ iServiceCenters->ResetAndDestroy();
+ }
+
+/**
+Copies the SMS settings stored in the specified object into this object.
+
+@param aSmsSettings
+The SMS Settings to be copied.
+*/
+EXPORT_C void CSmsSettings::CopyL(const CSmsSettings& aSmsSettings)
+ {
+ CSmsMessageSettings::CopyL(aSmsSettings);
+
+ iServiceCenters->ResetAndDestroy();
+ const TInt count = aSmsSettings.ServiceCenterCount();
+ for (TInt i=0; i < count; i++)
+ {
+ CSmsServiceCenter* scNumber = CSmsServiceCenter::NewL(aSmsSettings.GetServiceCenter(i));
+ CleanupStack::PushL(scNumber);
+ iServiceCenters->AppendL(scNumber);
+ CleanupStack::Pop(scNumber);
+ }
+
+ iDelivery = aSmsSettings.iDelivery;
+ iDefaultSC = aSmsSettings.iDefaultSC;
+ iSpecialMessageHandling = aSmsSettings.iSpecialMessageHandling;
+ iStatusReportHandling = aSmsSettings.iStatusReportHandling;
+ iSetFlags = aSmsSettings.iSetFlags;
+ iCommDbAction = aSmsSettings.iCommDbAction;
+ iSmsBearerAction = aSmsSettings.iSmsBearerAction;
+ iSmsBearer = aSmsSettings.iSmsBearer;
+ iClass2Folder = aSmsSettings.iClass2Folder;
+ iDescriptionLength = aSmsSettings.iDescriptionLength;
+ }
+
+/**
+Returns SMS settings flag
+
+@return
+SMS settings flag
+*/
+TUint32 CSmsSettings::SettingsFlags() const
+ {
+ return iSetFlags;
+ }
+
+/**
+Sets SMS settings flag
+
+@param aSetFlags
+SMS settings flag
+*/
+void CSmsSettings::SetSettingsFlags(TUint32 aSetFlags)
+ {
+ iSetFlags = aSetFlags;
+ }
+
+/*
+ * CSmsNumber
+ */
+
+/**
+Creates and allocates a new CSmsNumber object.
+
+@return
+The new object.
+*/
+EXPORT_C CSmsNumber* CSmsNumber::NewL()
+ {
+ return new(ELeave) CSmsNumber();
+ }
+
+/**
+Creates and allocates a new CSmsNumber object, copying an existing object.
+
+@param aSmsNumber
+The object to be copied.
+
+@return
+The new object.
+*/
+EXPORT_C CSmsNumber* CSmsNumber::NewL(const CSmsNumber& aSmsNumber)
+ {
+ CSmsNumber* number=new(ELeave) CSmsNumber();
+ CleanupStack::PushL(number);
+ number->CopyL(aSmsNumber);
+ CleanupStack::Pop(number);
+ return number;
+ }
+
+/**
+Destructor.
+*/
+EXPORT_C CSmsNumber::~CSmsNumber()
+ {
+ delete iNumber;
+ delete iName;
+ }
+
+/**
+Internalises the object from a read stream.
+
+@param aStream
+The stream from which the object should be internalised.
+*/
+EXPORT_C void CSmsNumber::InternalizeL( RReadStream& aStream)
+ {
+ TInt16 version = aStream.ReadInt16L();
+
+ CMsvRecipient::InternalizeL(aStream);
+
+ HBufC* number = HBufC::NewL(aStream, KSmcmSmsNumberMaxNumberLength);
+ delete iNumber;
+ iNumber = number;
+
+ HBufC* name = HBufC::NewL(aStream, KSmcmSmsNumberMaxNameLength);
+ delete iName;
+ iName = name;
+
+ iLogId = aStream.ReadInt32L();
+
+ if( version >= 2 )
+ {
+ iDeliveryStatus = (TSmsAckStatus) aStream.ReadInt8L();
+ }
+ else
+ {
+ iDeliveryStatus = ENoAckRequested;
+ }
+ }
+
+/**
+Externalises the object to a write stream.
+
+@param aStream
+The stream to which the object should be externalised.
+*/
+EXPORT_C void CSmsNumber::ExternalizeL( RWriteStream& aStream) const
+ {
+ aStream.WriteInt16L(KMsgFileSmsNumberVersion);
+
+ CMsvRecipient::ExternalizeL(aStream);
+
+ aStream << Address();
+ aStream << Name();
+
+ aStream.WriteInt32L(iLogId);
+ aStream.WriteInt8L(iDeliveryStatus);
+ }
+
+/**
+Constructor.
+*/
+CSmsNumber::CSmsNumber()
+: iLogId(KLogNullId)
+ {
+ }
+
+/**
+Copies settings from another CSmsNumber object.
+
+@param aSmsNumber
+The object to be copied.
+
+@return
+This object with the updated settings.
+*/
+EXPORT_C CSmsNumber& CSmsNumber::CopyL(const CSmsNumber& aSmsNumber)
+ {
+ SetNameL(aSmsNumber.Name());
+ SetAddressL(aSmsNumber.Address());
+ SetLogId(aSmsNumber.LogId());
+ SetAckStatus(ESmsAckTypeDelivery, aSmsNumber.AckStatus(ESmsAckTypeDelivery));
+ return *this;
+ }
+
+/**
+Gets the recipient address.
+
+The address is a telephone number. It is limited to a maximum length specified
+by KSmcmSmsNumberMaxNumberLength.
+
+@see KSmcmSmsNumberMaxNumberLength
+
+@return
+A descriptor with the recipient address.
+*/
+EXPORT_C TPtrC CSmsNumber::Address() const
+ {
+ TPtrC number = iNumber ? iNumber->Des() : TPtrC();
+ return number;
+ }
+
+/**
+Gets the recipient name.
+
+@return
+A descriptor with the recipient name.
+*/
+EXPORT_C TPtrC CSmsNumber::Name() const
+ {
+ TPtrC name = iName ? iName->Des() : TPtrC();
+ return name;
+ }
+
+/**
+Sets the recipient address.
+
+The address is a telephone number. It is limited to a maximum length specified
+by KSmcmSmsNumberMaxNumberLength.
+
+@see KSmcmSmsNumberMaxNumberLength
+
+@param aAddress
+The recipient address.
+*/
+EXPORT_C void CSmsNumber::SetAddressL(const TDesC& aAddress)
+ {
+ TPtrC clippedNumber = LimitStringSize(aAddress, KSmcmSmsNumberMaxNumberLength);
+ HBufC* number = clippedNumber.AllocL();
+ delete iNumber;
+ iNumber = number;
+ }
+
+/**
+Sets the recipient email address, The address here is a email address.
+
+@param aAddress
+The recipient address.
+@param aEmailFields
+Encapsulates the address fields for Email sent over SMS.
+@param aAlias
+*/
+
+// For address information separation (start)
+const TUint KMsgSmsAddressStartChar ('<');
+// For address information separation (end)
+const TUint KMsgSmsAddressEndChar ('>');
+
+void CSmsNumber::SetEmailAddressL(const TDesC& aAddress, CSmsEmailFields* aEmailFields, const TDesC& aAlias)
+ {
+ if ( aAlias.Length() > 0 )
+ {
+ HBufC* aliasBuf = HBufC::NewLC( aAddress.Length() + aAlias.Length() + 3 );
+ TPtr aliasTPtr = aliasBuf->Des();
+ aliasTPtr.Append( aAlias );
+ aliasTPtr.Append( CEditableText::ESpace );
+ aliasTPtr.Append( KMsgSmsAddressStartChar );
+ aliasTPtr.Append( aAddress );
+ aliasTPtr.Append( KMsgSmsAddressEndChar );
+ aEmailFields->AddAddressL( aliasTPtr );
+
+ CleanupStack::PopAndDestroy( aliasBuf );
+ }
+ else
+ {
+ aEmailFields->AddAddressL( aAddress );
+ }
+ }
+
+/**
+Sets the recipient name.
+
+The name is limited to a maximum length specified by KSmcmSmsNumberMaxNameLength.
+
+@see KSmcmSmsNumberMaxNameLength
+
+@param aName
+The recipient name.
+*/
+EXPORT_C void CSmsNumber::SetNameL(const TDesC& aName)
+ {
+ TPtrC clippedName = LimitStringSize(aName, KSmcmSmsNumberMaxNameLength);
+ HBufC* name = clippedName.AllocL();
+ delete iName;
+ iName = name;
+ }
+
+/**
+Gets the delivery status for this recipient.
+
+@return
+The current delivery status for this recipient.
+
+@see CSmsNumber::TSmsDeliveryStatus
+*/
+EXPORT_C CSmsNumber::TSmsAckStatus CSmsNumber::AckStatus(TSmsAckType aAckType) const
+ {
+ TSmsAckStatus status = ENoAckRequested;
+ switch( aAckType )
+ {
+ case ESmsAckTypeDelivery:
+ status = iDeliveryStatus;
+ break;
+ default:
+ // Use the default...
+ break;
+ }
+ return status;
+ }
+
+/**
+Sets the delivery status for this recipient.
+
+@param
+aDeliveryStatus The new delivery status for this recipient.
+
+@see CSmsNumber::TSmsDeliveryStatus
+*/
+EXPORT_C void CSmsNumber::SetAckStatus(TSmsAckType aAckType, TSmsAckStatus aAckStatus)
+ {
+ switch( aAckType )
+ {
+ case ESmsAckTypeDelivery:
+ iDeliveryStatus = aAckStatus;
+ break;
+ default:
+ // Do nothing - fail gracefully
+ break;
+ }
+ }
+
+/**
+Returns a limited version of the input string.
+
+The output string is limited by the maximum length specified or the actual#
+length of the input string, withever is the shortest.
+
+@param aString
+The input string to be limited.
+
+@param aMaxLength
+The maximum length
+
+@return
+The input string limited by the shortest value between its original length or
+the maximum length specified.
+*/
+TPtrC CSmsNumber::LimitStringSize(const TPtrC& aString, TInt aMaxLength) const
+ {
+ if (aString.Length() <= aMaxLength)
+ return aString;
+ else
+ return aString.Left(aMaxLength);
+ }
+
+/**
+Creates and allocates a new CSmsServiceCenter object.
+
+@return
+The new object.
+*/
+EXPORT_C CSmsServiceCenter* CSmsServiceCenter::NewL()
+ {
+ return new(ELeave) CSmsServiceCenter();
+ }
+
+/**
+Creates and allocates a new CSmsServiceCenter object, copying an existing object.
+
+@param CSmsServiceCenter
+The object to be copied.
+
+@return
+The new object.
+*/
+EXPORT_C CSmsServiceCenter* CSmsServiceCenter::NewL(const CSmsServiceCenter& aSmsSc)
+ {
+ CSmsServiceCenter* sc = new(ELeave) CSmsServiceCenter();
+ CleanupStack::PushL(sc);
+ sc->CopyL(aSmsSc);
+ CleanupStack::Pop(sc);
+ return sc;
+ }
+
+/**
+Destructor.
+*/
+EXPORT_C CSmsServiceCenter::~CSmsServiceCenter()
+ {
+ delete iNumber;
+ delete iName;
+ }
+
+/**
+Constructor.
+*/
+CSmsServiceCenter::CSmsServiceCenter()
+ {
+ }
+
+/**
+Copies settings from another CSmsServiceCenter object.
+
+@param aSmsSc
+The object to be copied.
+
+@return
+This object with the updated settings.
+*/
+EXPORT_C CSmsServiceCenter& CSmsServiceCenter::CopyL(const CSmsServiceCenter& aSmsSc)
+ {
+ SetNameL(aSmsSc.Name());
+ SetAddressL(aSmsSc.Address());
+ return *this;
+ }
+
+/**
+Gets the recipient address.
+
+The address is a telephone number. It is limited to a maximum length specified
+by KSmcmSmsNumberMaxNumberLength.
+
+@see KSmcmSmsNumberMaxNumberLength
+
+@return
+A descriptor with the recipient address.
+*/
+EXPORT_C TPtrC CSmsServiceCenter::Address() const
+ {
+ TPtrC number = iNumber ? iNumber->Des() : TPtrC();
+ return number;
+ }
+
+/**
+Gets the recipient name.
+
+@return
+A descriptor with the recipient name.
+*/
+EXPORT_C TPtrC CSmsServiceCenter::Name() const
+ {
+ TPtrC name = iName ? iName->Des() : TPtrC();
+ return name;
+ }
+
+/**
+Sets the recipient address.
+
+The address is a telephone number. It is limited to a maximum length specified
+by KSmcmSmsNumberMaxNumberLength.
+
+@see KSmcmSmsNumberMaxNumberLength
+
+@param aAddress
+The recipient address.
+*/
+EXPORT_C void CSmsServiceCenter::SetAddressL(const TDesC& aAddress)
+ {
+ TPtrC clippedNumber = LimitStringSize(aAddress, KSmcmSmsNumberMaxNumberLength);
+ HBufC* number = clippedNumber.AllocL();
+ delete iNumber;
+ iNumber = number;
+ }
+
+/**
+Sets the recipient name.
+
+The name is limited to a maximum length specified by KSmcmSmsNumberMaxNameLength.
+
+@see KSmcmSmsNumberMaxNameLength
+
+@param aName
+The recipient name.
+*/
+EXPORT_C void CSmsServiceCenter::SetNameL(const TDesC& aName)
+ {
+ TPtrC clippedName = LimitStringSize(aName, KSmcmSmsNumberMaxNameLength);
+ HBufC* name = clippedName.AllocL();
+ delete iName;
+ iName = name;
+ }
+
+/**
+Returns a limited version of the input string.
+
+The output string is limited by the maximum length specified or the actual#
+length of the input string, withever is the shortest.
+
+@param aString
+The input string to be limited.
+
+@param aMaxLength
+The maximum length
+
+@return
+The input string limited by the shortest value between its original length or
+the maximum length specified.
+*/
+TPtrC CSmsServiceCenter::LimitStringSize(const TPtrC& aString, TInt aMaxLength) const
+ {
+ if (aString.Length() <= aMaxLength)
+ {
+ return aString;
+ }
+ else
+ {
+ return aString.Left(aMaxLength);
+ }
+ }
+