diff -r 4697dfb2d7ad -r 238255e8b033 messagingapp/msgsettings/msginit/src/simscnumberdetector.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgsettings/msginit/src/simscnumberdetector.cpp Fri Apr 16 14:56:15 2010 +0300 @@ -0,0 +1,565 @@ +/* + * Copyright (c) 2010 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: + * A class which takes care of reading the possible new + * service centres from SIM and adds them to pda-side Sms Settings. + * + */ + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "simscnumberdetector.h" +#include "startupmonitor.h" + +#include "debugtraces.h" + + + +// ================= MEMBER FUNCTIONS ======================= + +EXPORT_C CMsgSimOperation* CMsgSimOperation::NewL( + MSimOperationObserver& aObserver ) + { + QDEBUG_WRITE("CMsgSimOperation::NewL enter") + + CMsgSimOperation* self = new (ELeave) CMsgSimOperation(aObserver); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + QDEBUG_WRITE("CMsgSimOperation::NewL End") + return self; + + + } + + +CMsgSimOperation::CMsgSimOperation(MSimOperationObserver& aObserver) : +iRetryCount(0), iObserver(aObserver) + { + } + +void CMsgSimOperation::ConstructL() + { + QDEBUG_WRITE("CMsgSimOperation::ConstructL enter") + + iCenRepSession = CRepository::NewL(KCRUidSmum); + + // initialise + iMsvSession = CMsvSession::OpenSyncL(*this); + + // Create the SMS Service + TMsvId serviceId = CreateSmsServiceL(); + + // Update the SMS cenrep with the default settings. + CreateDefaultSettingsL(serviceId); + + iClientRegistry = CClientMtmRegistry::NewL(*iMsvSession); + iSmsClientMtm = + STATIC_CAST( CSmsClientMtm*, iClientRegistry->NewMtmL( KUidMsgTypeSMS )); + + // Start the System state monitor + iStartupMonitor = CStartUpMonitor::NewL(this); + + QDEBUG_WRITE("CMsgSimOperation::ConstructL exit") + } + +TMsvId CMsgSimOperation::CreateSmsServiceL() + { + TMsvId serviceEntryId = KMsvNullIndexEntryId; + TInt err = KErrNone; + TRAP( err, serviceEntryId = ServiceIdL()); + + // If no service, create one + if (err == KErrNotFound) + { + TMsvEntry entry; + entry.iMtm = KUidMsgTypeSMS; + entry.iType = KUidMsvServiceEntry; + entry.SetReadOnly(EFalse); + entry.SetVisible(EFalse); + entry.iDate.HomeTime(); + entry.iDetails.Set(KSmsService); + CMsvEntry* root = iMsvSession->GetEntryL(KMsvRootIndexEntryId); + CleanupStack::PushL(root); + + // In case no root store, create one... + if (!root->HasStoreL()) + { + // --- The entry does not have a store. EditStoreL() will create one --- + CMsvStore* store = root->EditStoreL(); + CleanupStack::PushL(store); + store->CommitL(); + CleanupStack::PopAndDestroy(); // store + store = NULL; // destroyed + } + root->CreateL(entry); + CleanupStack::PopAndDestroy(); // root + serviceEntryId = entry.Id(); + + } + return serviceEntryId; + } + + +TMsvId CMsgSimOperation::ServiceIdL() + { + TMsvId id = KMsvNullIndexEntryId; + CMsvEntry* root = iMsvSession->GetEntryL(KMsvRootIndexEntryId); + CleanupStack::PushL(root); + TSmsUtilities::ServiceIdL(*root, id); + CleanupStack::PopAndDestroy(root); + return id; + } + + +void CMsgSimOperation::CreateDefaultSettingsL(TMsvId aServiceId) + { + QDEBUG_WRITE("CMsgSimOperation::CreateDefaultSettingsL enter") + + CSmsSettings* serviceSettings = CSmsSettings::NewL(); + CleanupStack::PushL(serviceSettings); + CSmsAccount* smsAccount = CSmsAccount::NewLC(); + + // Read the RFS related settings from shared data. + TInt originalCount = 0; + smsAccount->LoadSettingsL(*serviceSettings); + originalCount = serviceSettings->ServiceCenterCount(); + + if (!originalCount) + { + QDEBUG_WRITE("Original count = 0") + + ReadDefaultSettingsFromSharedDataL(serviceSettings); + + // Rest of the sms settings, which are fixed. + serviceSettings->SetValidityPeriodFormat(TSmsFirstOctet::ESmsVPFInteger); //relative + serviceSettings->SetDelivery(ESmsDeliveryImmediately); + serviceSettings->SetCanConcatenate(ETrue); + serviceSettings->SetStatusReportHandling(CSmsSettings::EMoveReportToInboxInvisible); + serviceSettings->SetSpecialMessageHandling(CSmsSettings::EMoveReportToInboxVisible); + serviceSettings->SetRejectDuplicate(ETrue); + TInt descriptionLength = KSmsDescriptionLength; + + // Read the value for description length + CRepository* repository = CRepository::NewLC(KCRUidMuiuSettings); + if (KErrNone == repository->Get(KMuiuDescriptionLength, + descriptionLength)) + { + //Make sure value is not zero + descriptionLength = Max(descriptionLength, KSmsDescriptionLength); + } + CleanupStack::PopAndDestroy(); // repository + serviceSettings->SetDescriptionLength(descriptionLength); + + // Set saving to commsdb + serviceSettings->SetCommDbAction(CSmsSettings::EStoreToCommDb); + serviceSettings->SetSmsBearerAction(CSmsSettings::EStoreToCommDb); + + } + + // Save settings + CMsvEntry* service = iMsvSession->GetEntryL(aServiceId); + CleanupStack::PushL(service); + CMsvStore* msvstore = service->EditStoreL(); + CleanupStack::PushL(msvstore); + + TInt maxTries(5); + TBool done(EFalse); + while (maxTries && !done) + { + TRAPD( err, smsAccount->SaveSettingsL( *serviceSettings ) ); + if (err == KErrNone) + { + QDEBUG_WRITE("CMsgSimOperation::CreateDefaultSettingsL settings saved") + + done = ETrue; + } + else if (err == KErrLocked) + { + QDEBUG_WRITE("CMsgSimOperation::CreateDefaultSettingsL KErrLocked") + + // Wait a while and retry. + User::After(100000); // 0.1 seconds + maxTries--; + } + else + { + User::Leave(err); + } + } + + msvstore->CommitL(); + CleanupStack::PopAndDestroy(2); // msvstore, service + CleanupStack::PopAndDestroy(2); // serviceSettings, smsAccount + + QDEBUG_WRITE("CMsgSimOperation::CreateDefaultSettingsL Exit") + } + + +void CMsgSimOperation:: +ReadDefaultSettingsFromSharedDataL(CSmsSettings* aServiceSettings) + { + QDEBUG_WRITE("CMsgSimOperation::ReadDefaultSettingsFromSharedDataL Enter") + + if ( iCenRepSession ) + { + TInt readedSetting; + + // Delivery report + if (iCenRepSession->Get(KSmumDeliveryReport, readedSetting) != KErrNone) + { + readedSetting = KDefDeliveryReport; + } + aServiceSettings->SetDeliveryReport(readedSetting); + + // Validity period + if (iCenRepSession->Get(KSmumValidityPeriod, readedSetting) != KErrNone) + { + readedSetting = KDefValidityPeriod; + } + aServiceSettings->SetValidityPeriod(readedSetting); + + // Message conversion + if (iCenRepSession->Get(KSmumMessageConversion, readedSetting) + != KErrNone) + { + readedSetting = KDefMessageConversion; + } + aServiceSettings->SetMessageConversion((TSmsPIDConversion) readedSetting); + + // Preferred connection + if (iCenRepSession->Get(KSmumPreferredConnection, readedSetting) + != KErrNone) + { + readedSetting = KDefPreferredConnection; + } + aServiceSettings->SetSmsBearer((CSmsSettings::TMobileSmsBearer) readedSetting); + + // Reply via same centre + if (iCenRepSession->Get(KSmumRemoveReplyViaSameCentre, readedSetting) + != KErrNone) + { + if (iCenRepSession->Get(KSmumReplyViaSameCentre, readedSetting) + != KErrNone) + { + readedSetting = KDefReplyViaSameCentre; + } + } + else + { + if (!readedSetting) + { + if (iCenRepSession->Get(KSmumReplyViaSameCentre, readedSetting) + != KErrNone) + { + readedSetting = KDefReplyViaSameCentre; + } + } + } + aServiceSettings->SetReplyPath(readedSetting); + } + + QDEBUG_WRITE("CMsgSimOperation::ReadDefaultSettingsFromSharedDataL Exit") + + } + +CMsgSimOperation::~CMsgSimOperation() + { + QDEBUG_WRITE("CMsgSimOperation::~CMsgSimOperation Enter") + delete iSimOperation; + delete iSmsClientMtm; + delete iClientRegistry; + delete iMsvSession; + delete iStartupMonitor; + iStartupMonitor = NULL; + QDEBUG_WRITE("CMsgSimOperation::~CMsgSimOperation Exit") + } + +void CMsgSimOperation::StartL() + { + + QDEBUG_WRITE("CMsgSimOperation::StartL Enter") + + // Retry is used to define the times ReadSimParamsL() is called + iRetryCount++; + + if ( IsSIMPresent() ) + { + if ( HasSIMChanged() || HasNoSmscSettings() ) + { + QDEBUG_WRITE("CMsgSimOperation::StartL Reading sim settings") + + CMsvOperationWait* wait = CMsvOperationWait::NewLC(); + iSimOperation = iSmsClientMtm->ReadSimParamsL(wait->iStatus); + wait->Start(); + + QDEBUG_WRITE("CMsgSimOperation::StartL Before CActiveScheduler::Start") + + CActiveScheduler::Start(); + + QDEBUG_WRITE("CMsgSimOperation::StartL After CActiveScheduler::Start") + + TInt err = wait->iStatus.Int(); + StartRunL(err); + CleanupStack::PopAndDestroy(); + + } + } + CompleteClientRequest(0); + + QDEBUG_WRITE("CMsgSimOperation::StartL Exit") + } + +void CMsgSimOperation::CompleteClientRequest(TInt /*aValue*/) + { + iObserver.CompleteOperation(); + } + +void CMsgSimOperation::Panic(TSimOperationPanic aPanic) + { + _LIT(KSimOpPanicCategory, "SIMOP"); + User::Panic(KSimOpPanicCategory, aPanic); + } + +void CMsgSimOperation::StartRunL(TInt aErr) + { + QDEBUG_WRITE("CMsgSimOperation::StartRunL Enter") + + TInt error = aErr; + + if (error == KErrNone) + { + TRAP( error, DoStartRunL()); + } + + // if problems with above; retry + TInt maxRetryCount = KSmumRetryCount; + if (error == KErrTimedOut) + { + QDEBUG_WRITE("CMsgSimOperation::StartRunL ErrorTimed Out") + // no use to retry many times if timed out already + maxRetryCount = KSmumRetryCount / 10; + } + if (error != KErrNone && iRetryCount <= maxRetryCount) + { + // first cancel the current simOp if still ongoing + if (iSimOperation) + { + iSimOperation->Cancel(); + delete iSimOperation; + iSimOperation = NULL; + } + + // wait a bit and actual retry + User::After(KSmumRetryDelay); + StartL(); + return; + } + + QDEBUG_WRITE("CMsgSimOperation::StartRunL Exit") + } + +// ---------------------------------------------------- +// CCMsgSimOperation::DoRunL +// +// ---------------------------------------------------- +void CMsgSimOperation::DoStartRunL() + { + QDEBUG_WRITE("CMsgSimOperation::DoStartRunL Enter") + + TIntBuf progressBuf; + progressBuf.Copy(iSimOperation->ProgressL()); + TInt error = progressBuf(); + + if (error != KErrNone) + { + QDEBUG_WRITE("CMsgSimOperation::DoStartRunL " + "iSimOperation->ProgressL() error ") + return; + } + + + // Load current settings + CSmsSettings* smsSettings = CSmsSettings::NewLC(); + CSmsAccount* smsAccount = CSmsAccount::NewLC(); + smsAccount->LoadSettingsL(*smsSettings); + + // Remove all old SMSC's configured + TInt numSCAddresses = smsSettings->ServiceCenterCount(); + + QDEBUG_WRITE_FORMAT("CMsgSimOperation::DoStartRunL numSCAddresses =",numSCAddresses) + + for (TInt j = numSCAddresses; j > 0; j--) + { + smsSettings->RemoveServiceCenter(j - 1); + } + + // Add all SMSC's from SIM + CMobilePhoneSmspList* centersList = iSimOperation->ServiceCentersLC(); + TInt count = centersList->Enumerate(); + + QDEBUG_WRITE_FORMAT("CMsgSimOperation::DoStartRunL count from sim operation =",count) + + for ( TInt i = 0; i < count; i++ ) + { + QDEBUG_WRITE("CMsgSimOperation::DoStartRunL inside for loop") + + RMobileSmsMessaging::TMobileSmspEntryV1 entry; + entry = centersList->GetEntryL(i); + + QDEBUG_WRITE("CMsgSimOperation::DoStartRunL Mobile sms entry read") + + // If empty tel number field, don't add + if (entry.iServiceCentre.iTelNumber == KNullDesC) + { + continue; + } + + QDEBUG_WRITE("CMsgSimOperation::DoStartRunL create name") + + TBuf<100> name(KSmscSimDefaultName); + name.AppendNum(i); + + QDEBUG_WRITE("CMsgSimOperation::DoStartRunL name created") + + smsSettings->AddServiceCenterL(name, entry.iServiceCentre.iTelNumber); + + + QDEBUG_WRITE("CMsgSimOperation::DoStartRunL AddServiceCenterL completed") + + if ( i == 0 ) + { + smsSettings->SetDefaultServiceCenter(i); + QDEBUG_WRITE("CMsgSimOperation::DoStartRunL SetDefaultServiceCenter completed") + } + } + + // save settings + smsAccount->SaveSettingsL(*smsSettings); + + QDEBUG_WRITE("CMsgSimOperation::DoStartRunL SaveSettingsL completed") + + CleanupStack::PopAndDestroy(3, smsSettings); // centersList, smsAccount, smsSettings + + QDEBUG_WRITE("CMsgSimOperation::DoStartRunL Exit") + + } + +void CMsgSimOperation::HandleSessionEventL(TMsvSessionEvent aEvent, + TAny* /*aArg1*/, TAny* /*aArg2*/, + TAny* /*aArg3*/) + { + // problem case handling + if (aEvent == EMsvServerFailedToStart) + { + // Nothing to do here + CompleteClientRequest(0); + } + + else if ( (aEvent == EMsvServerTerminated) || (aEvent == EMsvCloseSession)) + { + delete iSimOperation; // These objects must be deleted first + iSimOperation = NULL; // as they can't exist without a MsvSession + + delete iSmsClientMtm; + iSmsClientMtm = NULL; + + delete iClientRegistry; + iClientRegistry = NULL; + + delete iMsvSession; + iMsvSession = NULL; + + CompleteClientRequest(0); + } + } + +void CMsgSimOperation::HandleStartupReadyL() + { + QDEBUG_WRITE("CMsgSimOperation::HandleStartupReadyL Enter") + // Boot ready, start the real SimOperation + StartL(); + + QDEBUG_WRITE("CMsgSimOperation::HandleStartupReadyL Exit") + } + +TBool CMsgSimOperation::IsSIMPresent() + { + QDEBUG_WRITE("CMsgSimOperation::IsSIMPresent Enter") + + TInt status = KErrNone; + TInt value = 0; + + status = RProperty::Get(KPSUidStartup, KPSSimStatus, value); + + if (status == KErrNone && value != ESimNotPresent) + { + QDEBUG_WRITE("CMsgSimOperation::IsSIMPresent returned True") + + return ETrue; + } + else + { + QDEBUG_WRITE("CMsgSimOperation::IsSIMPresent returned False") + + return EFalse; + } + + + } + +TBool CMsgSimOperation::HasSIMChanged() + { + QDEBUG_WRITE("CMsgSimOperation::HasSIMChanged Enter") + + TInt simValue = 0; + TInt status = RProperty::Get(KPSUidStartup, KPSSimChanged, simValue); + if (status == KErrNone && simValue == ESimChanged) + { + QDEBUG_WRITE("CMsgSimOperation::HasSIMChanged returned True") + return ETrue; + } + + QDEBUG_WRITE("CMsgSimOperation::HasSIMChanged returned False") + return EFalse; + } + + +TBool CMsgSimOperation::HasNoSmscSettings() + { + QDEBUG_WRITE("CMsgSimOperation::HasNoSmscSettings Enter") + + CSmsSettings &settings = iSmsClientMtm->ServiceSettings(); + if (settings.ServiceCenterCount() > 0) + { + QDEBUG_WRITE("CMsgSimOperation::HasNoSmscSettings returned False") + + return EFalse; + } + + QDEBUG_WRITE("CMsgSimOperation::HasNoSmscSettings returned True") + return ETrue; + } + +// End of File