diff -r 4697dfb2d7ad -r 238255e8b033 messagingappbase/smsmtm/clientmtm/src/SMUTSET.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/smsmtm/clientmtm/src/SMUTSET.CPP Fri Apr 16 14:56:15 2010 +0300 @@ -0,0 +1,849 @@ +// 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 +#include "SMCMMAIN.H" +#include "SMUTSET.H" + +#include +#include +#include +#include +#include +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(KSmcmSCAddressGranularity); + } + + +void CSmsSettings::StoreToCommDbL() const + { + if (iCommDbAction != EStoreToCommDb && iSmsBearerAction != EStoreToCommDb) + return; // nothing to store to the Comm DB + + CMDBSession *dbSession = CMDBSession::NewL(CMDBSession::LatestVersion()); + CleanupStack::PushL(dbSession); + CMDBRecordSet globalSettingsRecord(KCDTIdGlobalSettingsRecord); + TRAPD(err, globalSettingsRecord.LoadL(*dbSession)); + if(err != KErrNone) + { + User::Leave(KErrNotFound); + } + + if (iCommDbAction == EStoreToCommDb) + { + CCDModemBearerRecord *modemRecord = (CCDModemBearerRecord*)(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord)); + CleanupStack::PushL(modemRecord); + modemRecord->SetRecordId(((CCDGlobalSettingsRecord*)globalSettingsRecord.iRecords[0])->iModemForPhoneServicesAndSMS); + 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.iRecords[0])->iSMSBearer = iSmsBearer; + ((CCDGlobalSettingsRecord*)globalSettingsRecord.iRecords[0])->iSMSBearer.ModifyL(*dbSession); + } + + 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(aDefaultSCCount(), 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); + } + } +