mobilemessaging/smsmtm/clientmtm/src/SMUTSET.CPP
changeset 0 72b543305e3a
--- /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);
+		}
+	}
+