diff -r 000000000000 -r d6fe6244b863 htiui/HtiServicePlugins/HtiMessagesServicePlugin/src/HtiMsgSettingsHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/htiui/HtiServicePlugins/HtiMessagesServicePlugin/src/HtiMsgSettingsHandler.cpp Tue Feb 02 00:17:27 2010 +0200 @@ -0,0 +1,829 @@ +/* +* Copyright (c) 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: Implementation of message settings handling. +* +*/ + + +// INCLUDE FILES +#include "HtiMessagesServicePlugin.h" +#include "HtiMsgSettingsHandler.h" + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS +const TUid KCRUidSmum = { 0x101F87EF }; // from MessagingInternalCRKeys.h + +const TInt KMinSetDefaultSmsCenterLength = 4; +const TInt KMinDeleteSmsCenterLength = 2; +const TInt KMinSetMmsSettingsLength = 10; + +// set SMS settings has a fixed length +const TInt KSetSmsSettingsLength = 6; + +// message validity times in seconds +const TInt KValidityTimeMax = 0; +const TInt KValidityTime1h = 3600; +const TInt KValidityTime6h = 6 * 3600; +const TInt KValidityTime24h = 24 * 3600; +const TInt KValidityTime3d = 3 * 24 * 3600; +const TInt KValidityTime1w = 7 * 24 * 3600; + +// from MmsSettingsDefs.h +const TInt KMmsUniImageSmallWidth = 640; +const TInt KMmsUniImageSmallHeight = 480; +const TInt KMmsUniImageLargeWidth = 1600; +const TInt KMmsUniImageLargeHeight = 1200; + +const TInt KApMaxConnNameLength = 30; + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +_LIT8( KErrorInvalidParameters, "Invalid command parameters" ); +_LIT8( KErrorSetDefaultSmsCenterFailed, "Setting default SMS center failed" ); +_LIT8( KErrorDeleteSmsCenterFailed, "SMS center deletion failed" ); +_LIT8( KErrorSmsCenterAlreadyExists, "SMS center with given name already exists with different number" ); +_LIT8( KErrorSmsCenterNotFound, "SMS center with given name not found" ); +_LIT8( KErrorSetSmsSettingsFailed, "Setting SMS service settings failed" ); +_LIT8( KErrorSetMmsSettingsFailed, "Setting MMS service settings failed" ); +_LIT8( KErrorApNotFound, "Access Point not found" ); +_LIT8( KErrorUnrecognizedCommand, "Unrecognized command" ); + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CHtiMsgSettingsHandler* CHtiMsgSettingsHandler::NewL() + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::NewL" ); + CHtiMsgSettingsHandler* self = new (ELeave) CHtiMsgSettingsHandler(); + CleanupStack::PushL ( self ); + self->ConstructL(); + CleanupStack::Pop(); + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::NewL" ); + return self; + } + + +// ---------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::CHtiMsgSettingsHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +CHtiMsgSettingsHandler::CHtiMsgSettingsHandler() + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::CHtiMsgSettingsHandler" ); + + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::CHtiMsgSettingsHandler" ); + } + + +// ----------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::~CHtiMsgSettingsHandler +// Destructor. +// ----------------------------------------------------------------------------- +CHtiMsgSettingsHandler::~CHtiMsgSettingsHandler() + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::~CHtiMsgSettingsHandler" ); + + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::~CHtiMsgSettingsHandler" ); + } + + +// ----------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +void CHtiMsgSettingsHandler::ConstructL() + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::ConstructL" ); + + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::ConstructL" ); + } + + +// ----------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::SetDispatcher +// Sets the dispatcher pointer. +// ----------------------------------------------------------------------------- + +void CHtiMsgSettingsHandler::SetDispatcher( MHtiDispatcher* aDispatcher ) + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::SetDispatcher" ); + iDispatcher = aDispatcher; + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::SetDispatcher" ); + } + + +// ----------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::ProcessMessageL +// Parses the received message and calls handler functions. +// ----------------------------------------------------------------------------- +void CHtiMsgSettingsHandler::ProcessMessageL( const TDesC8& aMessage, + THtiMessagePriority /*aPriority*/ ) + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::ProcessMessageL" ); + + // Zero length message and command code validity already checked + // in HtiMessagesServicePlugin. + + if ( aMessage[0] == CHtiMessagesServicePlugin::ESetDefaultSmsCenter ) + { + if ( aMessage.Length() < 1 + KMinSetDefaultSmsCenterLength ) + { + SendErrorMessageL( KErrArgument, KErrorInvalidParameters ); + } + else + { + TRAPD( err, HandleSetDefaultSmsCenterL( + aMessage.Right( aMessage.Length() - 1 ) ) ); + if ( err != KErrNone ) + { + SendErrorMessageL( err, KErrorSetDefaultSmsCenterFailed ); + } + } + } + + else if ( aMessage[0] == CHtiMessagesServicePlugin::EDeleteSmsCenter ) + { + if ( aMessage.Length() < 1 + KMinDeleteSmsCenterLength ) + { + SendErrorMessageL( KErrArgument, KErrorInvalidParameters ); + } + else + { + TRAPD( err, HandleDeleteSmsCenterL( + aMessage.Right( aMessage.Length() - 1 ) ) ); + if ( err != KErrNone ) + { + SendErrorMessageL( err, KErrorDeleteSmsCenterFailed ); + } + } + } + + else if ( aMessage[0] == CHtiMessagesServicePlugin::ESetSmsSettings ) + { + if ( aMessage.Length() != 1 + KSetSmsSettingsLength ) + { + SendErrorMessageL( KErrArgument, KErrorInvalidParameters ); + } + else + { + TRAPD( err, HandleSetSmsSettingsL( + aMessage.Right( aMessage.Length() - 1 ) ) ); + if ( err != KErrNone ) + { + SendErrorMessageL( err, KErrorSetSmsSettingsFailed ); + } + } + } + + else if ( aMessage[0] == CHtiMessagesServicePlugin::ESetMmsSettings ) + { + if ( aMessage.Length() < 1 + KMinSetMmsSettingsLength ) + { + SendErrorMessageL( KErrArgument, KErrorInvalidParameters ); + } + else + { + TRAPD( err, HandleSetMmsSettingsL( + aMessage.Right( aMessage.Length() - 1 ) ) ); + if ( err != KErrNone ) + { + SendErrorMessageL( err, KErrorSetMmsSettingsFailed ); + } + } + } + + else + { + SendErrorMessageL( KErrArgument, KErrorUnrecognizedCommand ); + } + + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::ProcessMessageL" ); + } + + +// ---------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::HandleSetDefaultSmsCenterL +// Creates new default SMS center. +// ---------------------------------------------------------------------------- +void CHtiMsgSettingsHandler::HandleSetDefaultSmsCenterL( const TDesC8& aData ) + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::HandleSetDefaultSmsCenterL" ); + + TBuf<255> name; + TBuf<255> number; + + TInt dataLength = aData.Length(); + TInt offset = 0; + TInt fieldLength = aData[offset]; + offset++; + + if ( offset + fieldLength > dataLength ) + { + HTI_LOG_TEXT( "Invalid length specified for name" ); + SendErrorMessageL( KErrArgument, KErrorInvalidParameters ); + return; + } + name.Copy( aData.Mid( offset, fieldLength ) ); + offset += fieldLength; + fieldLength = aData[offset]; + offset++; + + if ( offset + fieldLength > dataLength ) + { + HTI_LOG_TEXT( "Invalid length specified for number" ); + SendErrorMessageL( KErrArgument, KErrorInvalidParameters ); + return; + } + number.Copy( aData.Mid( offset, fieldLength ) ); + + HTI_LOG_FORMAT( "SMS center name: %S", &name ); + HTI_LOG_FORMAT( "SMS center number: %S", &number ); + + HTI_LOG_TEXT( "Loading current settings..." ); + CSmsSettings* smsSettings = CSmsSettings::NewLC(); + CSmsAccount* smsAccount = CSmsAccount::NewLC(); + smsAccount->LoadSettingsL( *smsSettings ); + + HTI_LOG_TEXT( "Looping through existing SMS centers..." ); + TInt i = 0; + for ( i = 0; i < smsSettings->ServiceCenterCount(); i++ ) + { + CSmsServiceCenter ¢er = smsSettings->GetServiceCenter( i ); + + HTI_LOG_FORMAT( "Found SMS center: %S", &( center.Name() ) ); + + if ( center.Name() == name && center.Address() != number ) + { + HTI_LOG_TEXT( "Error, SMS center with given name already exists" ); + SendErrorMessageL( KErrAlreadyExists, KErrorSmsCenterAlreadyExists ); + CleanupStack::PopAndDestroy( 2 ); // smsAccount, smsSettings + return; + } + else if ( center.Name() == name && center.Address() == number ) + { + HTI_LOG_TEXT( "The defined SMS center already exists, setting it to default" ); + smsSettings->SetDefaultServiceCenter( i ); + smsAccount->SaveSettingsL( *smsSettings ); + + CleanupStack::PopAndDestroy( 2 ); // smsAccount, smsSettings + SendOkMsgL( KNullDesC8 ); + + return; + } + } + + HTI_LOG_TEXT( "Creating new default SMS center" ); + smsSettings->AddServiceCenterL( name, number ); + smsSettings->SetDefaultServiceCenter( i ); + smsAccount->SaveSettingsL( *smsSettings ); + + CleanupStack::PopAndDestroy( 2 ); // smsAccount, smsSettings + + SendOkMsgL( KNullDesC8 ); + + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::HandleSetDefaultSmsCenterL" ); + } + + +// ---------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::HandleDeleteSmsCenterL +// Deletes the defined SMS center. +// ---------------------------------------------------------------------------- +void CHtiMsgSettingsHandler::HandleDeleteSmsCenterL( const TDesC8& aData ) + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::HandleDeleteSmsCenterL" ); + + TBuf<255> name; + + TInt dataLength = aData.Length(); + TInt offset = 0; + TInt fieldLength = aData[offset]; + offset++; + + if ( offset + fieldLength > dataLength ) + { + HTI_LOG_TEXT( "Invalid length specified for name" ); + SendErrorMessageL( KErrArgument, KErrorInvalidParameters ); + return; + } + name.Copy( aData.Mid( offset, fieldLength ) ); + + HTI_LOG_FORMAT( "SMS center name: %S", &name ); + + HTI_LOG_TEXT( "Loading current settings..." ); + CSmsSettings* smsSettings = CSmsSettings::NewLC(); + CSmsAccount* smsAccount = CSmsAccount::NewLC(); + smsAccount->LoadSettingsL( *smsSettings ); + + HTI_LOG_TEXT( "Looping through existing SMS centers..." ); + TInt i = 0; + for ( i = 0; i < smsSettings->ServiceCenterCount(); i++ ) + { + CSmsServiceCenter ¢er = smsSettings->GetServiceCenter( i ); + + HTI_LOG_FORMAT( "Found SMS center: %S", &( center.Name() ) ); + + if ( center.Name() == name ) + { + HTI_LOG_TEXT( "Name matches, deleting..." ); + smsSettings->RemoveServiceCenter( i ); + smsAccount->SaveSettingsL( *smsSettings ); + + CleanupStack::PopAndDestroy( 2 ); // smsAccount, smsSettings + + SendOkMsgL( KNullDesC8 ); + return; + } + } + + CleanupStack::PopAndDestroy( 2 ); // smsAccount, smsSettings + + SendErrorMessageL( KErrNotFound, KErrorSmsCenterNotFound ); + + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::HandleDeleteSmsCenterL" ); + } + + +// ---------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::HandleSetSmsSettingsL +// Sets the SMS service settings. +// ---------------------------------------------------------------------------- +void CHtiMsgSettingsHandler::HandleSetSmsSettingsL( const TDesC8& aData ) + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::HandleSetSmsSettingsL" ); + + // extract values + TInt offset = 0; + TInt characterSupport = aData[offset]; + offset++; + HTI_LOG_FORMAT( "Character support = %d", characterSupport ); + + TBool deliveryReport = aData[offset]; + offset++; + HTI_LOG_FORMAT( "Delivery report = %d", deliveryReport ); + + TInt validityPeriod = aData[offset]; + offset++; + HTI_LOG_FORMAT( "Validity period = %d", validityPeriod ); + + TInt messageConversion = aData[offset]; + offset++; + HTI_LOG_FORMAT( "Message conversion = %d", messageConversion ); + + TInt preferredConnection = aData[offset]; + offset++; + HTI_LOG_FORMAT( "Preferred connection = %d", preferredConnection ); + + TBool replyViaSameCenter = aData[offset]; + offset++; + HTI_LOG_FORMAT( "Reply via same center = %d", replyViaSameCenter ); + + // Validate values + if ( characterSupport > 1 || validityPeriod > 5 || + messageConversion > 3 || preferredConnection > 1 ) + { + HTI_LOG_TEXT( "Invalid values found" ); + SendErrorMessageL( KErrArgument, KErrorInvalidParameters ); + return; + } + + HTI_LOG_TEXT( "Loading current settings..." ); + CSmsSettings* smsSettings = CSmsSettings::NewLC(); + CSmsAccount* smsAccount = CSmsAccount::NewLC(); + smsAccount->LoadSettingsL( *smsSettings ); + + HTI_LOG_TEXT( "Opening SMS settings Central Repository" ); + CRepository* cenRep = CRepository::NewLC( KCRUidSmum ); + HTI_LOG_TEXT( "Setting character support setting to SMS settings Central Repository" ); + TUint32 KSmumCharSupport = 0x00000008; // from MessagingInternalCRKeys.h + switch ( characterSupport ) + { + case 0: + cenRep->Set( KSmumCharSupport, ECharSetFull ); + break; + case 1: + cenRep->Set( KSmumCharSupport, ECharSetReduced ); + break; + default: + User::Leave( KErrArgument ); + break; + } + CleanupStack::PopAndDestroy( cenRep ); + HTI_LOG_TEXT( "SMS settings Central Repository closed" ); + + smsSettings->SetDeliveryReport( deliveryReport ); + + switch ( validityPeriod ) + { + case 0: + smsSettings->SetValidityPeriod( TTimeIntervalMinutes( 0 ) ); + break; + case 1: + smsSettings->SetValidityPeriod( + TTimeIntervalMinutes( KValidityTime1h / 60 ) ); + break; + case 2: + smsSettings->SetValidityPeriod( + TTimeIntervalMinutes( KValidityTime6h / 60 ) ); + break; + case 3: + smsSettings->SetValidityPeriod( + TTimeIntervalMinutes( KValidityTime24h / 60 ) ); + break; + case 4: + smsSettings->SetValidityPeriod( + TTimeIntervalMinutes( KValidityTime3d / 60 ) ); + break; + case 5: + smsSettings->SetValidityPeriod( + TTimeIntervalMinutes( KValidityTime1w / 60 ) ); + break; + default: + User::Leave( KErrArgument ); + break; + } + + switch ( messageConversion ) + { + case 0: + smsSettings->SetMessageConversion( ESmsConvPIDNone ); + break; + case 1: + smsSettings->SetMessageConversion( ESmsConvFax ); + break; + case 2: + smsSettings->SetMessageConversion( ESmsConvPaging ); + break; + case 3: + smsSettings->SetMessageConversion( ESmsConvMail ); + break; + default: + User::Leave( KErrArgument ); + break; + } + + switch ( preferredConnection ) + { + case 0: + smsSettings->SetSmsBearer( CSmsSettings::ESmsBearerCircuitPreferred ); + break; + case 1: + smsSettings->SetSmsBearer( CSmsSettings::ESmsBearerPacketPreferred ); + break; + default: + User::Leave( KErrArgument ); + break; + } + + smsSettings->SetReplyPath( replyViaSameCenter ); + + HTI_LOG_TEXT( "Saving the settings" ); + smsAccount->SaveSettingsL( *smsSettings ); + + CleanupStack::PopAndDestroy( 2 ); // smsAccount, smsSettings + + SendOkMsgL( KNullDesC8 ); + + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::HandleSetSmsSettingsL" ); + } + + +// ---------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::HandleSetMmsSettingsL +// Sets the MMS service settings. +// ---------------------------------------------------------------------------- +void CHtiMsgSettingsHandler::HandleSetMmsSettingsL( const TDesC8& aData ) + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::HandleSetMmsSettingsL" ); + TInt offset = 0; + + // Get the access point name and search UID for that AP. + TInt apNameLength = aData[offset]; + offset++; + if ( apNameLength > KApMaxConnNameLength || + aData.Length() != ( KMinSetMmsSettingsLength + apNameLength - 1 ) ) + { + SendErrorMessageL( KErrArgument, KErrorInvalidParameters ); + return; + } + + TBuf apName; + apName.Copy( aData.Mid( offset, apNameLength ) ); + offset += apNameLength; + HTI_LOG_FORMAT( "Searching AP with name: %S", &apName ); + TInt apUid = GetAccessPointUIDL( apName ); + if ( apUid == KErrNotFound ) + { + SendErrorMessageL( KErrNotFound, KErrorApNotFound ); + return; + } + + // Extract other values + TMmsCreationMode creationMode = ( TMmsCreationMode ) aData[offset]; + offset++; + HTI_LOG_FORMAT( "creation mode = %d", creationMode ); + + TInt imageSize = aData[offset]; + offset++; + HTI_LOG_FORMAT( "image size = %d", imageSize ); + + TInt receptionMode = aData[offset]; + offset++; + HTI_LOG_FORMAT( "reception mode = %d", receptionMode ); + + TBool receiveAnonymous = aData[offset]; + offset++; + HTI_LOG_FORMAT( "receive anonymous = %d", receiveAnonymous ); + + TBool receiveAdvert = aData[offset]; + offset++; + HTI_LOG_FORMAT( "receive adverts = %d", receiveAdvert ); + + TBool requestDeliveryReport = aData[offset]; + offset++; + HTI_LOG_FORMAT( "request deliv reps = %d", requestDeliveryReport ); + + TBool sendDeliveryReport = aData[offset]; + offset++; + HTI_LOG_FORMAT( "send deliv reps = %d", sendDeliveryReport ); + + TInt validityPeriod = aData[offset]; + offset++; + HTI_LOG_FORMAT( "validity period = %d", validityPeriod ); + + // Validate values + if ( creationMode > 2 || imageSize > 2 || + receptionMode > 3 || validityPeriod > 5 || + ( creationMode == 0 && imageSize == 2 ) ) + { + HTI_LOG_TEXT( "Invalid values found" ); + SendErrorMessageL( KErrArgument, KErrorInvalidParameters ); + return; + } + + // Load current settings + CMmsSettings* mmsSettings = CMmsSettings::NewL(); + CleanupStack::PushL( mmsSettings ); + mmsSettings->LoadSettingsL(); + HTI_LOG_TEXT( "Settings loaded - now updating" ); + + // Update the values + if ( mmsSettings->AccessPointCount() > 0 ) + { + mmsSettings->DeleteAccessPointL( 0 ); + } + mmsSettings->AddAccessPointL( apUid, 0 ); + + mmsSettings->SetCreationMode( creationMode ); + + switch ( imageSize ) + { + case 0: + mmsSettings->SetImageWidth( KMmsUniImageSmallWidth ); + mmsSettings->SetImageHeight( KMmsUniImageSmallHeight ); + break; + case 1: + mmsSettings->SetImageWidth( KMmsUniImageLargeWidth ); + mmsSettings->SetImageHeight( KMmsUniImageLargeHeight ); + break; + default: + User::Leave( KErrArgument ); + break; + } + + switch ( receptionMode ) + { + case 0: + mmsSettings->SetReceivingModeHome( EMmsReceivingAutomatic ); + mmsSettings->SetReceivingModeForeign( EMmsReceivingAutomatic ); + break; + case 1: + mmsSettings->SetReceivingModeHome( EMmsReceivingAutomatic ); + mmsSettings->SetReceivingModeForeign( EMmsReceivingManual ); + break; + case 2: + mmsSettings->SetReceivingModeHome( EMmsReceivingManual ); + mmsSettings->SetReceivingModeForeign( EMmsReceivingManual ); + break; + case 3: + mmsSettings->SetReceivingModeHome( EMmsReceivingReject ); + mmsSettings->SetReceivingModeForeign( EMmsReceivingReject ); + break; + default: + User::Leave( KErrArgument ); + break; + } + + mmsSettings->SetAcceptAnonymousMessages( receiveAnonymous ); + mmsSettings->SetAcceptAdvertisementMessages( receiveAdvert ); + + if ( requestDeliveryReport ) + { + mmsSettings->SetDeliveryReportWanted( KMmsYes ); + } + else + { + mmsSettings->SetDeliveryReportWanted( KMmsNo ); + } + + if ( sendDeliveryReport ) + { + mmsSettings->SetDeliveryReportSendingAllowed( KMmsYes ); + } + else + { + mmsSettings->SetDeliveryReportSendingAllowed( KMmsNo ); + } + + switch ( validityPeriod ) + { + case 0: + mmsSettings->SetExpiryInterval( KValidityTimeMax ); + break; + case 1: + mmsSettings->SetExpiryInterval( KValidityTime1h ); + break; + case 2: + mmsSettings->SetExpiryInterval( KValidityTime6h ); + break; + case 3: + mmsSettings->SetExpiryInterval( KValidityTime24h ); + break; + case 4: + mmsSettings->SetExpiryInterval( KValidityTime3d ); + break; + case 5: + mmsSettings->SetExpiryInterval( KValidityTime1w ); + break; + default: + User::Leave( KErrArgument ); + break; + } + + // Check validity of updated settings and save if valid. + if ( mmsSettings->ValidateSettings() != KErrNone ) + { + HTI_LOG_TEXT( "Settings not valid - won't save" ); + SendErrorMessageL( KErrArgument, KErrorInvalidParameters ); + } + else + { + HTI_LOG_TEXT( "Settings valid - now saving" ); + mmsSettings->SaveSettingsL(); + SendOkMsgL( KNullDesC8 ); + } + + CleanupStack::PopAndDestroy(); // mmsSettings + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::HandleSetMmsSettingsL" ); + } + + +// ---------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::GetAccessPointUIDL +// Gets the UID of Access Point named by aApName. +// Returns KErrNotFound if AP not found. +// ---------------------------------------------------------------------------- +TInt CHtiMsgSettingsHandler::GetAccessPointUIDL( const TDesC& aApName ) + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::GetAccessPointUIDL" ); + TInt uid = KErrNotFound; + + RCmManager cmManager; + cmManager.OpenL(); + CleanupClosePushL( cmManager ); + + // Search from uncategorised first + RArray array = RArray(); + cmManager.ConnectionMethodL( array ); + CleanupClosePushL( array ); + TInt i = 0; + while ( i < array.Count() && uid == KErrNotFound ) + { + RCmConnectionMethod cm = cmManager.ConnectionMethodL( array[i] ); + CleanupClosePushL( cm ); + HBufC* name = cm.GetStringAttributeL( CMManager::ECmName ); + HTI_LOG_FORMAT( "Found name: %S", name ); + CleanupStack::PushL( name ); + if ( aApName.Compare( *name ) == 0 ) + { + uid = cm.GetIntAttributeL( CMManager::ECmWapId ); + HTI_LOG_FORMAT( "Match: UID = %d", uid ); + } + CleanupStack::PopAndDestroy(); // name + CleanupStack::PopAndDestroy(); // cm + i++; + } + CleanupStack::PopAndDestroy(); // array + + // If not found from uncategorised, search from all destinations + if ( uid == KErrNotFound ) + { + HTI_LOG_TEXT( "Not found from uncategorised" ); + RArray destIdArray = RArray(); + cmManager.AllDestinationsL( destIdArray ); + CleanupClosePushL( destIdArray ); + i = 0; + while ( i < destIdArray.Count() && uid == KErrNotFound ) + { + RCmDestination dest = cmManager.DestinationL( destIdArray[i] ); + CleanupClosePushL( dest ); + TInt j = 0; + while ( j < dest.ConnectionMethodCount() && uid == KErrNotFound ) + { + HBufC* name = dest.ConnectionMethodL( j ).GetStringAttributeL( + CMManager::ECmName ); + CleanupStack::PushL( name ); + HTI_LOG_FORMAT( "Found name: %S", name ); + if ( aApName.Compare( *name ) == 0 ) + { + uid = dest.ConnectionMethodL( j ).GetIntAttributeL( + CMManager::ECmWapId ); + HTI_LOG_FORMAT( "Match: UID = %d", uid ); + } + CleanupStack::PopAndDestroy(); // name + j++; + } + CleanupStack::PopAndDestroy(); // dest + i++; + } + CleanupStack::PopAndDestroy(); // destIdArray + } + + CleanupStack::PopAndDestroy(); // cmManager + + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::GetAccessPointUIDL" ); + return uid; + } + + +// ---------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::SendOkMsgL +// Helper function for sending response messages. +// ---------------------------------------------------------------------------- +void CHtiMsgSettingsHandler::SendOkMsgL( const TDesC8& aData ) + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::SendOkMsgL" ); + User::LeaveIfNull( iDispatcher ); + HBufC8* temp = HBufC8::NewL( aData.Length() + 1 ); + TPtr8 response = temp->Des(); + response.Append( ( TChar ) CHtiMessagesServicePlugin::EResultOk ); + response.Append( aData ); + User::LeaveIfError( iDispatcher->DispatchOutgoingMessage( + temp, KHtiMessagesServiceUid ) ); + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::SendOkMsgL" ); + } + + +// ---------------------------------------------------------------------------- +// CHtiMsgSettingsHandler::SendErrorMessageL +// Helper function for sending error response messages. +// ---------------------------------------------------------------------------- +void CHtiMsgSettingsHandler::SendErrorMessageL( TInt aError, const TDesC8& aDescription ) + { + HTI_LOG_FUNC_IN( "CHtiMsgSettingsHandler::SendErrorMessageL" ); + User::LeaveIfNull( iDispatcher ); + User::LeaveIfError( iDispatcher->DispatchOutgoingErrorMessage( + aError, aDescription, KHtiMessagesServiceUid ) ); + HTI_LOG_FUNC_OUT( "CHtiMsgSettingsHandler::SendErrorMessageL" ); + } + +// End of file