--- a/mmsengine/mmsmessage/src/mmsownnumber.cpp Thu Sep 02 20:23:03 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,546 +0,0 @@
-/*
-* Copyright (c) 2005 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: Check id any of given numbers is caller's own number
-*
-*/
-
-
-
-
-// INCLUDE FILES
-#include "mmsownnumber.h"
-#include "mmsgenutils.h"
-#include <e32std.h>
-#include <badesca.h>
-#include <centralrepository.h>
-#include <telconfigcrkeys.h>
-
-#include <CVPbkContactManager.h>
-#include <VPbkContactStoreUris.h>
-#include <CVPbkContactStoreUriArray.h>
-#include <MVPbkContactLinkArray.h>
-#include <MVPbkContactLink.h>
-#include <TVPbkContactStoreUriPtr.h>
-#include <MVPbkContactStoreList.h>
-#include <MVPbkContactOperationBase.h>
-#include <MVPbkStoreContact.h>
-#include <MVPbkFieldType.h>
-#include <MVPbkContactFieldTextData.h>
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CMmsOwnNumber::CMmsOwnNumber
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CMmsOwnNumber::CMmsOwnNumber()
- : CActive( EPriorityNormal ),
- iIndex( KErrNotFound )
- {
- CActiveScheduler::Add(this);
- }
-
-// -----------------------------------------------------------------------------
-// CMmsOwnNumber::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CMmsOwnNumber::ConstructL( RFs* aFs )
- {
- iFs = aFs;
-
- // The function is supposed to get a descriptor with packed URIs.
- // As we only have one URI we assume it is packed enough
- CVPbkContactStoreUriArray* storeArray = CVPbkContactStoreUriArray::NewLC();
- TVPbkContactStoreUriPtr uriPtr( VPbkContactStoreUris::SimGlobalOwnNumberUri() );
- storeArray->AppendL( uriPtr );
-
- // TEST TRY ALSO DEFAULT DATABASE AS SIM DATABASE DOES NOT WORK IN WINS
-
-/*
- TVPbkContactStoreUriPtr uriPtr2( VPbkContactStoreUris::DefaultCntDbUri() );
- storeArray->AppendL( uriPtr2 );
-*/
- // END OF TEST
-
- iNumberOfStores = storeArray->Count();
- iNumberOfOpenStores = iNumberOfStores; // otimistic
-
- // Open the database with the URI that specifies our own number
- iContactManager = CVPbkContactManager::NewL( *storeArray, aFs );
-
- CleanupStack::PopAndDestroy( storeArray );
-
- iContactList = &(iContactManager->ContactStoresL());
-
- //Let's find the number of digits to match
- iDigitsToMatch = KMmsNumberOfDigitsToMatch ;
-
- CRepository* repository = NULL;
- TInt error = KErrNone;
- TRAP( error, repository = CRepository::NewL( KCRUidTelConfiguration ));
- if ( error == KErrNone)
- {
- error = repository->Get( KTelMatchDigits, iDigitsToMatch );
- delete repository;
- if( error != KErrNone )
- {
- iDigitsToMatch=KMmsNumberOfDigitsToMatch;
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// CMmsOwnNumber::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CMmsOwnNumber* CMmsOwnNumber::NewL( RFs* aFs )
- {
- CMmsOwnNumber* self = new( ELeave ) CMmsOwnNumber;
-
- CleanupStack::PushL( self );
- self->ConstructL( aFs );
- CleanupStack::Pop( self );
-
- return self;
- }
-
-
-// Destructor
-CMmsOwnNumber::~CMmsOwnNumber()
- {
- Cancel();
- delete iContact;
- delete iOperation;
- delete iResultArray;
- delete iContactManager;
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::DoCancel
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::DoCancel()
- {
- delete iOperation;
- iOperation = NULL;
- TRequestStatus* s=&iStatus;
- User::RequestComplete(s, KErrCancel);
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::RunL
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::RunL()
- {
-
- delete iOperation;
- iOperation = NULL;
-
- if ( iStatus != KErrNone )
- {
-#ifdef _DEBUG
- TMmsGenUtils::Log( _L("OwnNumber: RunL status: %d "), iStatus.Int() );
-#endif
-
- // Exit current scheduler loop, resuming execution of the StartL() function
- iActiveSchedulerWait.AsyncStop();
- return;
- }
-
- switch ( iState )
- {
- case EMmsOwnNumberOpening:
- {
- iState = EMmsOwnNumberSearching;
- iMatch = EFalse;
- SearchL();
- break;
- }
- case EMmsOwnNumberSearching:
- {
- iState = EMmsOwnNumberCheckingDuplicates;
- CheckDuplicatesL();
- break;
- }
- case EMmsOwnNumberCheckingDuplicates:
- {
- iState = EMmsOwnNumberIdle;
- iContactList->CloseAll( *this );
- break;
- }
- default:
- {
- break;
- }
- }
- if ( !IsActive() )
- {
- // Exit current scheduler loop, resuming execution of the StartL() function
- delete iResultArray;
- iResultArray = NULL;
- iActiveSchedulerWait.AsyncStop();
- }
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::RunError
-// ---------------------------------------------------------
-//
-
-#ifdef _DEBUG
-TInt CMmsOwnNumber::RunError( TInt aError )
-#else
-TInt CMmsOwnNumber::RunError( TInt /* aError */ )
-#endif
- {
-#ifdef _DEBUG
- TMmsGenUtils::Log( _L("OwnNumber: RunError: %d "), aError );
- TMmsGenUtils::Log( _L("OwnNumber: state: %d "), iState );
-#endif
- delete iOperation;
- iOperation = NULL;
- delete iResultArray;
- iResultArray = NULL;
- iActiveSchedulerWait.AsyncStop(); //Exit current scheduler loop, resuming execution of the Start() function
- return KErrNone;
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::FindCompleteL
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::FindCompleteL( MVPbkContactLinkArray* aResults )
- {
-#ifdef _DEBUG
- TMmsGenUtils::Log( _L("OwnNumber::FindCompleteL ") );
-#endif
- iResultArray = aResults;
- iContactToMatch = iResultArray->Count(); // point beyound the array
- iMatch = EFalse;
-
- // check the result array for matches and set our index accordingly
- if ( iResultArray->Count() == 0 )
- {
- // we are responsible for the results array if we did not leave.
- delete iResultArray;
- iResultArray = 0;
- // no match found - this is not our own number
- iNumberToMatch++;
- if ( iNumberToMatch < iNumberList->MdcaCount() )
- {
- // try the next one
- iState = EMmsOwnNumberOpening;
- }
- }
- else
- {
- // we found at least one match.
- // What do we do now...
- // Analyze the result in detail or just say "This is our own number"...
-
- // First approximation: Say this is our own.
- // Actually exact match cases should be checked, too (short number)
- // And possible email match, but that needs a different search function
-
- // save the match and return to RunL
- // It will stop the active scheduler and allow the code to return to caller
- iIndex = iNumberToMatch;
- if ( iNumberList->MdcaPoint( iNumberToMatch ).Length() < iDigitsToMatch ||
- iResultArray->Count() > 1 )
- {
- // need exact match, start from first item in the array
- iContactToMatch = 0;
- }
- }
- TRequestStatus* s=&iStatus;
- User::RequestComplete( s, KErrNone );
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::FindFailed
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::FindFailed(TInt aError)
- {
-#ifdef _DEBUG
- TMmsGenUtils::Log( _L("OwnNumber: FindFailed: %d "), aError );
-#endif
- iIndex = aError;
- TRequestStatus* s=&iStatus;
- iNumberToMatch++;
- if ( iNumberToMatch < iNumberList->MdcaCount() )
- {
- // try the next one
- iState = EMmsOwnNumberOpening;
- }
- User::RequestComplete( s, KErrNone );
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::OpenComplete
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::OpenComplete()
- {
- // if opening fails, StoreUnavailable is called
-#ifdef _DEBUG
- TMmsGenUtils::Log( _L("OwnNumber::OpenCompleteL") );
-#endif
- TRequestStatus* s=&iStatus;
- User::RequestComplete( s, KErrNone );
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::StoreReady
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::StoreReady(MVPbkContactStore& /*aContactStore*/)
- {
- // Nothing to do here
-#ifdef _DEBUG
- TMmsGenUtils::Log( _L("OwnNumber::StoreReady") );
-#endif
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::StoreUnavailable
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::StoreUnavailable(MVPbkContactStore& /*aContactStore*/, TInt /*aReason*/)
- {
-#ifdef _DEBUG
- TMmsGenUtils::Log( _L("OwnNumber::StoreUnavailable") );
-#endif
- iNumberOfOpenStores--;
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::HandleStoreEventL
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::HandleStoreEventL(
- MVPbkContactStore& /*aContactStore*/,
- TVPbkContactStoreEvent /*aStoreEvent*/)
- {
-
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::VPbkSingleContactOperationComplete
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::VPbkSingleContactOperationComplete(
- MVPbkContactOperationBase& /*aOperation*/,
- MVPbkStoreContact* aContact)
- {
-#ifdef _DEBUG
- TMmsGenUtils::Log( _L("OwnNumber::VPbkSingleContactOperationComplete") );
-#endif
- iContact = aContact;
-
- MVPbkBaseContactFieldCollection& fields = iContact->Fields();
-
- TInt fieldCount = fields.FieldCount();
-
- TInt i;
-
-/*
- const TInt maxMatchPriority = iContactManager->FieldTypes().MaxMatchPriority();
-*/
- for ( i = 0; i < fieldCount && !iMatch ; i++ )
- {
- const MVPbkBaseContactField& field = fields.FieldAt( i );
-/*
- const MVPbkFieldType* fieldType = field.MatchFieldType( maxMatchPriority );
-*/
- const MVPbkContactFieldData& fieldData = field.FieldData();
-
- // I could not figure out how to check the actual field type
- // (phone number or email or what), we must try all text fields
- if ( fieldData.DataType() == EVPbkFieldStorageTypeText )
- {
- const MVPbkContactFieldTextData& textData = MVPbkContactFieldTextData::Cast(fieldData);
- // Now we finally have the data we can compare with our own data
- if ( textData.Text().Compare( iNumberList->MdcaPoint( iNumberToMatch ) ) == 0 )
- {
- // exact match.
- iMatch = ETrue;
- }
- }
- }
-
- delete iContact;
- iContact = NULL;
-
- iContactToMatch++;
-
- if ( !iMatch && iContactToMatch < iResultArray->Count() )
- {
- iState = EMmsOwnNumberSearching;
- }
- else if ( !iMatch )
- {
- // This was not an exact match
- iIndex = KErrNotFound;
- delete iResultArray;
- iResultArray = 0;
- iNumberToMatch++;
- if ( iNumberToMatch < iNumberList->MdcaCount() )
- {
- // try the next one if any left
- iState = EMmsOwnNumberOpening;
- }
- }
- else
- {
- // keep LINT happy.
- }
-
- TRequestStatus* s=&iStatus;
- User::RequestComplete( s, KErrNone );
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::VPbkSingleContactOperationFailed(
- MVPbkContactOperationBase& /*aOperation*/,
-#ifdef _DEBUG
- TInt aError)
-#else
- TInt /*aError*/)
-#endif
- {
-#ifdef _DEBUG
- TMmsGenUtils::Log( _L("OwnNumber: ContactOperationFailed: %d "), aError );
-#endif
- // If not found iMatch stays false
- iContactToMatch++;
-
- TRequestStatus* s=&iStatus;
- User::RequestComplete( s, KErrNone );
- }
-
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::StartL
-// ---------------------------------------------------------
-//
-TInt CMmsOwnNumber::StartL( const CDesCArray& aNumberList )
- {
- iIndex = KErrNotFound;
- delete iOperation;
- iOperation = NULL;
-
- if ( aNumberList.MdcaCount() <= 0)
- {
- return iIndex; // no contacts, not found
- }
- iNumberList = &aNumberList;
- iNumberToMatch = 0;
- iContactToMatch = 0;
-
- iContactList->OpenAllL( *this );
-
- // We must set ourselves to pending because we don't give our status to anybody
- // When search is complete, the functions call our callbacks, and we complete ourselves
- iState = EMmsOwnNumberOpening;
- iStatus = KRequestPending;
- SetActive();
- iActiveSchedulerWait.Start(); //Re-enter the active scheduler--execution halts here until RunL is called
-
- // after iActiveSchedulerWait has been stopped execution continues here
-
- return iIndex; // return the possible index of caller's number
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::SearchL
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::SearchL()
- {
-#ifdef _DEBUG
- TMmsGenUtils::Log( _L("OwnNumber::SearchL") );
-#endif
- // Try checking number of open stores to see if anything was opened
- if ( iNumberOfOpenStores > 0 )
- {
- iOperation = iContactManager->MatchPhoneNumberL(
- iNumberList->MdcaPoint( iNumberToMatch ), iDigitsToMatch, *this );
-
- // We must set ourselves to pending because we don't give our status to anybody
- // When search is complete, the functions call our callbacks, and we complete ourselves
- iStatus = KRequestPending;
- SetActive();
- }
- // If we do not become active, RunL stops ActiveSchedulerWait
- }
-
-// ---------------------------------------------------------
-// CMmsOwnNumber::CheckDuplicatesL
-// ---------------------------------------------------------
-//
-void CMmsOwnNumber::CheckDuplicatesL()
- {
- // If more than one contact found or length of number is less than the
- // match number length, check for exact match
-
- // The match array is in iResultArray
-
-#ifdef _DEBUG
- TMmsGenUtils::Log( _L("OwnNumber::CheckDuplicatesL") );
-#endif
- delete iContact;
- iContact = NULL;
-
- TInt count = 0;
- if ( iResultArray )
- {
- count = iResultArray->Count();
- }
-
- if ( iContactToMatch < count )
- {
- iMatch = EFalse;
- iState = EMmsOwnNumberSearching;
- iOperation = iContactManager->RetrieveContactL(
- iResultArray->At( iContactToMatch ),
- *this);
- iStatus = KRequestPending;
- SetActive();
- }
- else
- {
- delete iResultArray;
- iResultArray = NULL;
- iStatus = KRequestPending;
- SetActive();
- TRequestStatus* s=&iStatus;
- User::RequestComplete( s, KErrNone );
- }
-
- }
-
-
-
-// ========================== OTHER EXPORTED FUNCTIONS =========================
-
-// End of File