mobilemessaging/smum/src/smsdetailsplugin.cpp
author hgs
Wed, 03 Nov 2010 09:52:46 +0530
changeset 79 2981cb3aa489
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
79
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  
hgs
parents:
diff changeset
    15
*       SMS Details Ecom Plugin implementation.
hgs
parents:
diff changeset
    16
*
hgs
parents:
diff changeset
    17
*/
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
// INCLUDE FILES
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include <e32std.h>
hgs
parents:
diff changeset
    25
#include <implementationproxy.h>
hgs
parents:
diff changeset
    26
#include <data_caging_path_literals.hrh> 
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
#include <gsmumsg.h>
hgs
parents:
diff changeset
    29
#include <gsmuieoperations.h>
hgs
parents:
diff changeset
    30
#include <gsmubuf.h>
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
#include <txtetext.h>   // CEditableText
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
#include <MVPbkContactStore.h>
hgs
parents:
diff changeset
    35
#include <MVPbkContactStoreProperties.h>
hgs
parents:
diff changeset
    36
#include <contactmatcher.h>
hgs
parents:
diff changeset
    37
#include <CVPbkContactStoreUriArray.h>
hgs
parents:
diff changeset
    38
#include <MVPbkContactLink.h>
hgs
parents:
diff changeset
    39
#include <CVPbkContactLinkArray.h>
hgs
parents:
diff changeset
    40
#include <MVPbkFieldType.h>
hgs
parents:
diff changeset
    41
#include <TVPbkFieldVersitProperty.h>
hgs
parents:
diff changeset
    42
#include <MVPbkStoreContact.h>
hgs
parents:
diff changeset
    43
#include <CVPbkPhoneNumberMatchStrategy.h>
hgs
parents:
diff changeset
    44
#include <VPbkContactStoreUris.h>
hgs
parents:
diff changeset
    45
#include <TVPbkContactStoreUriPtr.h>
hgs
parents:
diff changeset
    46
#include <CPbk2StoreConfiguration.h>   // Contact store configuration
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
#include <StringLoader.h>               // StringLoader
hgs
parents:
diff changeset
    49
#include <stringresourcereader.h>
hgs
parents:
diff changeset
    50
#include <centralrepository.h>
hgs
parents:
diff changeset
    51
#include <telconfigcrkeys.h>    // KCRUidTelephonyConfiguration
hgs
parents:
diff changeset
    52
#include <commonphoneparser.h>      // Common phone number validity checker
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
#include <smsdetailsplugindata.rsg>
hgs
parents:
diff changeset
    55
#include "smsdetailsplugin.h"
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
//For logging
hgs
parents:
diff changeset
    58
#include "SmumLogging.h"
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
// CONSTANTS
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
const TInt KSmsDefaultGsmNumberMatchLength = 7;
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
const TInt KErrMultipleMatchFound = KErrGeneral;
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
_LIT( KSmsDetailsPluginResourceFile, "smsdetailsplugindata.rsc" );
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
struct TCntMatchRequestData
hgs
parents:
diff changeset
    70
    {
hgs
parents:
diff changeset
    71
    TPtrC iFromAddress;
hgs
parents:
diff changeset
    72
    TDes* iOutput;
hgs
parents:
diff changeset
    73
    TInt iMaxLength;
hgs
parents:
diff changeset
    74
    TInt iMatchDigitCount;
hgs
parents:
diff changeset
    75
    };
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
class CSmsDetailsPluginOneShotOperation : public CActive
hgs
parents:
diff changeset
    79
    {
hgs
parents:
diff changeset
    80
public:
hgs
parents:
diff changeset
    81
    CSmsDetailsPluginOneShotOperation( TCntMatchRequestData& aRequestData );
hgs
parents:
diff changeset
    82
    ~CSmsDetailsPluginOneShotOperation();
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
public: // API
hgs
parents:
diff changeset
    85
    inline TInt CompletionCode() const { return iStatus.Int(); }
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
private: // From CActive
hgs
parents:
diff changeset
    88
    void RunL();
hgs
parents:
diff changeset
    89
    void DoCancel();
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
private: // Internal functions
hgs
parents:
diff changeset
    92
    void MatchContactL();
hgs
parents:
diff changeset
    93
    HBufC* GetContactNameL(const MVPbkContactLink& aContactLink);
hgs
parents:
diff changeset
    94
    HBufC* GetContactNameInLowerCaseL(const MVPbkContactLink& aContactLink );
hgs
parents:
diff changeset
    95
    TBool  ShowContactNameL(CVPbkContactLinkArray* aLinkArray, TInt &nameIndex);
hgs
parents:
diff changeset
    96
    TInt GetCurrentStoreIndexL( CVPbkContactLinkArray& aLinkArray );
hgs
parents:
diff changeset
    97
    
hgs
parents:
diff changeset
    98
private: // Data members
hgs
parents:
diff changeset
    99
    TCntMatchRequestData& iRequestData;
hgs
parents:
diff changeset
   100
    CContactMatcher* iContactMatcher;
hgs
parents:
diff changeset
   101
    };
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
// ==================== LOCAL FUNCTIONS ====================
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   107
// Define the implementation table for Ecom
hgs
parents:
diff changeset
   108
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   109
//
hgs
parents:
diff changeset
   110
const TImplementationProxy ImplementationTable[] = 
hgs
parents:
diff changeset
   111
	{
hgs
parents:
diff changeset
   112
	IMPLEMENTATION_PROXY_ENTRY(0x102828A8, CSmsDetailsPlugin::NewL)
hgs
parents:
diff changeset
   113
	};
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   116
// Returns the implementation table
hgs
parents:
diff changeset
   117
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   118
//
hgs
parents:
diff changeset
   119
EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
hgs
parents:
diff changeset
   120
	{
hgs
parents:
diff changeset
   121
	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
	return ImplementationTable;
hgs
parents:
diff changeset
   124
	}
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
// ============================ MEMBER FUNCTIONS ===============================
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   130
// CSmsDetailsPlugin::NewL
hgs
parents:
diff changeset
   131
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   132
//
hgs
parents:
diff changeset
   133
CSmsDetailsPlugin* CSmsDetailsPlugin::NewL()
hgs
parents:
diff changeset
   134
	{
hgs
parents:
diff changeset
   135
	SMUMLOGGER_ENTERFN("CSmsDetailsPlugin::NewL");
hgs
parents:
diff changeset
   136
	CSmsDetailsPlugin* self = new (ELeave) CSmsDetailsPlugin();	
hgs
parents:
diff changeset
   137
	SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::NewL");
hgs
parents:
diff changeset
   138
	return self;
hgs
parents:
diff changeset
   139
	}
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   142
// CSmsDetailsPlugin::CreateResourceReaderL
hgs
parents:
diff changeset
   143
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   144
//
hgs
parents:
diff changeset
   145
void CSmsDetailsPlugin::CreateResourceReaderL( RFs* aFs )
hgs
parents:
diff changeset
   146
	{
hgs
parents:
diff changeset
   147
	SMUMLOGGER_ENTERFN("CSmsDetailsPlugin::CreateResourceReaderL");
hgs
parents:
diff changeset
   148
	if ( !iResourceReader )
hgs
parents:
diff changeset
   149
	    {
hgs
parents:
diff changeset
   150
        TParse fileParse;
hgs
parents:
diff changeset
   151
        fileParse.Set( KSmsDetailsPluginResourceFile, &KDC_RESOURCE_FILES_DIR, NULL );
hgs
parents:
diff changeset
   152
        TFileName resourceFile( fileParse.FullName() );
hgs
parents:
diff changeset
   153
        if ( aFs )
hgs
parents:
diff changeset
   154
            {
hgs
parents:
diff changeset
   155
            iResourceReader = CStringResourceReader::NewL( resourceFile, *aFs );
hgs
parents:
diff changeset
   156
            }
hgs
parents:
diff changeset
   157
        else
hgs
parents:
diff changeset
   158
            {
hgs
parents:
diff changeset
   159
            iResourceReader = CStringResourceReader::NewL( resourceFile );
hgs
parents:
diff changeset
   160
            }
hgs
parents:
diff changeset
   161
	    }
hgs
parents:
diff changeset
   162
	SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::CreateResourceReaderL");
hgs
parents:
diff changeset
   163
	}
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   166
// CSmsDetailsPlugin::CSmsDetailsPlugin
hgs
parents:
diff changeset
   167
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   168
//
hgs
parents:
diff changeset
   169
CSmsDetailsPlugin::CSmsDetailsPlugin()
hgs
parents:
diff changeset
   170
	{
hgs
parents:
diff changeset
   171
	}
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   174
// CSmsDetailsPlugin::~CSmsDetailsPlugin
hgs
parents:
diff changeset
   175
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   176
//
hgs
parents:
diff changeset
   177
CSmsDetailsPlugin::~CSmsDetailsPlugin()
hgs
parents:
diff changeset
   178
	{
hgs
parents:
diff changeset
   179
	SMUMLOGGER_ENTERFN("CSmsDetailsPlugin::~CSmsDetailsPlugin");
hgs
parents:
diff changeset
   180
	delete iResourceReader;
hgs
parents:
diff changeset
   181
    SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::~CSmsDetailsPlugin");
hgs
parents:
diff changeset
   182
	}
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   185
// CSmsDetailsPlugin::GetDetails
hgs
parents:
diff changeset
   186
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   187
//
hgs
parents:
diff changeset
   188
TInt CSmsDetailsPlugin::GetDetails(RFs& aFs, const CSmsMessage& aMessage, TDes& aDetails, TInt aMaxLength)
hgs
parents:
diff changeset
   189
	{
hgs
parents:
diff changeset
   190
    SMUMLOGGER_ENTERFN("CSmsDetailsPlugin::GetDetails(aFs, aMessage, aDetails, aMaxLength");
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
	__ASSERT_DEBUG( aMaxLength <= aDetails.MaxLength(), User::Invariant() );
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
	if (aMaxLength > aDetails.MaxLength())
hgs
parents:
diff changeset
   195
		{
hgs
parents:
diff changeset
   196
		aMaxLength = aDetails.MaxLength();
hgs
parents:
diff changeset
   197
		}
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
	aDetails.Zero();
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
	TPtrC fromAddress;
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
	switch (aMessage.SmsPDU().Type())
hgs
parents:
diff changeset
   204
		{
hgs
parents:
diff changeset
   205
		case CSmsPDU::ESmsSubmit:
hgs
parents:
diff changeset
   206
		case CSmsPDU::ESmsDeliver:
hgs
parents:
diff changeset
   207
		case CSmsPDU::ESmsStatusReport:
hgs
parents:
diff changeset
   208
			fromAddress.Set(aMessage.SmsPDU().ToFromAddress());
hgs
parents:
diff changeset
   209
			break;
hgs
parents:
diff changeset
   210
		default:
hgs
parents:
diff changeset
   211
			return KErrNotSupported;
hgs
parents:
diff changeset
   212
		}
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
	SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::GetDetails(aFs, aMessage, aDetails, aMaxLength");
hgs
parents:
diff changeset
   215
	return GetDetails(aFs, fromAddress, aDetails, aMaxLength);
hgs
parents:
diff changeset
   216
	}
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   219
// CSmsDetailsPlugin::GetDetails
hgs
parents:
diff changeset
   220
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   221
//
hgs
parents:
diff changeset
   222
TInt CSmsDetailsPlugin::GetDetails(RFs& aFs, const TDesC& aFromAddress, TDes& aDetails, TInt aMaxLength)
hgs
parents:
diff changeset
   223
	{
hgs
parents:
diff changeset
   224
    SMUMLOGGER_ENTERFN("CSmsDetailsPlugin::GetDetails(aFs, aFromAddress, aDetails, aMaxLength");
hgs
parents:
diff changeset
   225
	__ASSERT_DEBUG( aMaxLength <= aDetails.MaxLength(), User::Invariant() );
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
	if (aMaxLength > aDetails.MaxLength())
hgs
parents:
diff changeset
   228
		{
hgs
parents:
diff changeset
   229
		aMaxLength = aDetails.MaxLength();
hgs
parents:
diff changeset
   230
		}
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
    TInt ret = KErrNone;
hgs
parents:
diff changeset
   233
	TRAPD(err, DoGetDetailsL(aFs, aFromAddress, aDetails, aMaxLength));
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
	if ( (err != KErrNone) || (aDetails.Length() == 0) )
hgs
parents:
diff changeset
   236
		{
hgs
parents:
diff changeset
   237
		if (aFromAddress.Length() <= aMaxLength)
hgs
parents:
diff changeset
   238
			{
hgs
parents:
diff changeset
   239
			aDetails = aFromAddress;
hgs
parents:
diff changeset
   240
			aDetails.Trim();
hgs
parents:
diff changeset
   241
			}
hgs
parents:
diff changeset
   242
		else
hgs
parents:
diff changeset
   243
			{
hgs
parents:
diff changeset
   244
			// Truncate aFromAddress so that it fits into aDetails.
hgs
parents:
diff changeset
   245
			aDetails = aFromAddress.Left(aMaxLength);
hgs
parents:
diff changeset
   246
			aDetails.Trim();
hgs
parents:
diff changeset
   247
			}
hgs
parents:
diff changeset
   248
        // Propagate KErrCancel forwards
hgs
parents:
diff changeset
   249
        if ( err == KErrCancel )
hgs
parents:
diff changeset
   250
            {
hgs
parents:
diff changeset
   251
            ret = err;
hgs
parents:
diff changeset
   252
            }
hgs
parents:
diff changeset
   253
		}
hgs
parents:
diff changeset
   254
    SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::GetDetails(aFs, aFromAddress, aDetails, aMaxLength");
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
	return ret;
hgs
parents:
diff changeset
   257
	}
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   260
// CSmsDetailsPlugin::GetDescription
hgs
parents:
diff changeset
   261
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   262
//
hgs
parents:
diff changeset
   263
TInt CSmsDetailsPlugin::GetDescription(const CSmsMessage& aMessage, TDes& aDescription, TInt aMaxLength)
hgs
parents:
diff changeset
   264
	{
hgs
parents:
diff changeset
   265
    SMUMLOGGER_ENTERFN("CSmsDetailsPlugin::GetDescription(aMessage, aDescription, aMaxLength");
hgs
parents:
diff changeset
   266
hgs
parents:
diff changeset
   267
	__ASSERT_DEBUG( aMaxLength <= aDescription.MaxLength(), User::Invariant() );
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
	if (aMaxLength > aDescription.MaxLength())
hgs
parents:
diff changeset
   270
		{
hgs
parents:
diff changeset
   271
		aMaxLength = aDescription.MaxLength();
hgs
parents:
diff changeset
   272
		}
hgs
parents:
diff changeset
   273
hgs
parents:
diff changeset
   274
	aDescription.Zero();
hgs
parents:
diff changeset
   275
hgs
parents:
diff changeset
   276
	TBool gotDescription = EFalse;
hgs
parents:
diff changeset
   277
	TRAPD(err, gotDescription = DoGetDescriptionL(aMessage, aDescription, aMaxLength));
hgs
parents:
diff changeset
   278
	if(err != KErrNone || !gotDescription)
hgs
parents:
diff changeset
   279
	    {
hgs
parents:
diff changeset
   280
		ExtractDescriptionFromMessage(aMessage, aDescription, aMaxLength);
hgs
parents:
diff changeset
   281
	    }
hgs
parents:
diff changeset
   282
    SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::GetDescription(aMessage, aDescription, aMaxLength");
hgs
parents:
diff changeset
   283
	return KErrNone;
hgs
parents:
diff changeset
   284
	}
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   287
// CSmsDetailsPlugin::DoGetDetailsL
hgs
parents:
diff changeset
   288
//
hgs
parents:
diff changeset
   289
// For clarity the whole function is flagged
hgs
parents:
diff changeset
   290
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   291
//
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
void CSmsDetailsPlugin::DoGetDetailsL(RFs& aFs, const TDesC& aFromAddress, TDes& aDetails, TInt aMaxLength)
hgs
parents:
diff changeset
   294
	{
hgs
parents:
diff changeset
   295
	__UHEAP_MARK;
hgs
parents:
diff changeset
   296
    SMUMLOGGER_ENTERFN("CSmsDetailsPlugin::DoGetDetailsL(aFs, aFromAddress, aDetails, aMaxLength");
hgs
parents:
diff changeset
   297
	// Check that aFromAddress is a valid GSM telephone number
hgs
parents:
diff changeset
   298
    if ( !CommonPhoneParser::IsValidPhoneNumber( aFromAddress, CommonPhoneParser::ESMSNumber ) )
hgs
parents:
diff changeset
   299
        {
hgs
parents:
diff changeset
   300
		User::Leave( KErrArgument );
hgs
parents:
diff changeset
   301
        }
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
	aDetails.Zero();
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
    TInt matchDigitCount = KSmsDefaultGsmNumberMatchLength;
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
    // Read the amount of digits to be used in contact matching
hgs
parents:
diff changeset
   308
    // The key is owned by PhoneApp
hgs
parents:
diff changeset
   309
    CRepository* repository = CRepository::NewLC(KCRUidTelConfiguration);
hgs
parents:
diff changeset
   310
    if (KErrNone == repository->Get(KTelMatchDigits, matchDigitCount))
hgs
parents:
diff changeset
   311
        {
hgs
parents:
diff changeset
   312
        // Min is 7
hgs
parents:
diff changeset
   313
        matchDigitCount =
hgs
parents:
diff changeset
   314
            Max(matchDigitCount, KSmsDefaultGsmNumberMatchLength);
hgs
parents:
diff changeset
   315
        }
hgs
parents:
diff changeset
   316
    CleanupStack::PopAndDestroy(); // repository
hgs
parents:
diff changeset
   317
hgs
parents:
diff changeset
   318
    // Match contacts to the from address
hgs
parents:
diff changeset
   319
    // Prepare worker thread arguments
hgs
parents:
diff changeset
   320
    TCntMatchRequestData requestData;
hgs
parents:
diff changeset
   321
    requestData.iFromAddress.Set( aFromAddress );
hgs
parents:
diff changeset
   322
    requestData.iOutput = &aDetails;
hgs
parents:
diff changeset
   323
    requestData.iMaxLength = aMaxLength;
hgs
parents:
diff changeset
   324
    requestData.iMatchDigitCount = matchDigitCount;
hgs
parents:
diff changeset
   325
hgs
parents:
diff changeset
   326
    // Prepare thread name
hgs
parents:
diff changeset
   327
    _LIT( KSmsDetailsPluginCntMatcherWorkerThreadName, "S60SmsDetailsPluginWorkerThread_%08x" );
hgs
parents:
diff changeset
   328
    TName threadName;
hgs
parents:
diff changeset
   329
    threadName.AppendFormat( KSmsDetailsPluginCntMatcherWorkerThreadName, &requestData );
hgs
parents:
diff changeset
   330
hgs
parents:
diff changeset
   331
    // Create worker thread 
hgs
parents:
diff changeset
   332
    RThread workerThread;
hgs
parents:
diff changeset
   333
    CleanupClosePushL( workerThread );
hgs
parents:
diff changeset
   334
    /*
hgs
parents:
diff changeset
   335
     * LSAN-7HUB6B:: Contact matcher thread was using watcher process stack and hence running
hgs
parents:
diff changeset
   336
     * out of memory as the inbox was growing. At some point, when inbox has arnd 1700 msgs, it fails to allocate memory
hgs
parents:
diff changeset
   337
     * and hence there was no matching. 
hgs
parents:
diff changeset
   338
     * changed the thread creation to use seperate stack of 1MB max size.
hgs
parents:
diff changeset
   339
     */
hgs
parents:
diff changeset
   340
    const TInt threadCreationError = workerThread.Create( threadName, CntMatchThreadFunction, 8 * 1024, 0x1000, 0x100000, &requestData  );
hgs
parents:
diff changeset
   341
    User::LeaveIfError( threadCreationError );
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
    // Wait for thread to finish work
hgs
parents:
diff changeset
   344
    TRequestStatus workerThreadStatus;
hgs
parents:
diff changeset
   345
    workerThread.Rendezvous( workerThreadStatus );
hgs
parents:
diff changeset
   346
    workerThread.Resume();
hgs
parents:
diff changeset
   347
    User::WaitForRequest( workerThreadStatus );
hgs
parents:
diff changeset
   348
hgs
parents:
diff changeset
   349
    // Propagate error
hgs
parents:
diff changeset
   350
    User::LeaveIfError( workerThreadStatus.Int() );
hgs
parents:
diff changeset
   351
hgs
parents:
diff changeset
   352
    // Tidy up
hgs
parents:
diff changeset
   353
    CleanupStack::PopAndDestroy( &workerThread );
hgs
parents:
diff changeset
   354
    SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::DoGetDetailsL(aFs, aFromAddress, aDetails, aMaxLength");
hgs
parents:
diff changeset
   355
       
hgs
parents:
diff changeset
   356
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
   357
    }
hgs
parents:
diff changeset
   358
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   361
// CSmsDetailsPlugin::DoGetDescriptionL
hgs
parents:
diff changeset
   362
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   363
//
hgs
parents:
diff changeset
   364
TBool CSmsDetailsPlugin::DoGetDescriptionL(const CSmsMessage& aMessage,
hgs
parents:
diff changeset
   365
    TDes& aDescription, TInt aMaxLength)
hgs
parents:
diff changeset
   366
// this function returns EFalse if aMessage has no special message indication data and is not an SMS_STATUS_REPORT,
hgs
parents:
diff changeset
   367
// i.e. more needs to be done to extract the description from the message
hgs
parents:
diff changeset
   368
// otherwise returns ETrue
hgs
parents:
diff changeset
   369
	{
hgs
parents:
diff changeset
   370
    SMUMLOGGER_ENTERFN("CSmsDetailsPlugin::DoGetDescriptionL(aMessage, aDescription, aMaxLength");
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
    TInt resourceId = 0;
hgs
parents:
diff changeset
   373
	TBuf<KSmsDescriptionLength> format;
hgs
parents:
diff changeset
   374
	TSmsMessageIndicationType messageIndicationType;
hgs
parents:
diff changeset
   375
	TExtendedSmsIndicationType extendedType;
hgs
parents:
diff changeset
   376
	TSmsMessageProfileType messageProfileType;
hgs
parents:
diff changeset
   377
	TBool toStore=EFalse;
hgs
parents:
diff changeset
   378
	TUint totalIndicationCount=0;
hgs
parents:
diff changeset
   379
	TUint totalMessageCount=0;	
hgs
parents:
diff changeset
   380
	
hgs
parents:
diff changeset
   381
	//check if the messae contains an enhanced voice mail indication
hgs
parents:
diff changeset
   382
	CSmsEnhancedVoiceMailOperations& enhancedVoiceMailOperations = STATIC_CAST(CSmsEnhancedVoiceMailOperations&,aMessage.GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation));
hgs
parents:
diff changeset
   383
	
hgs
parents:
diff changeset
   384
	if(enhancedVoiceMailOperations.ContainsEnhancedVoiceMailIEL())
hgs
parents:
diff changeset
   385
		{
hgs
parents:
diff changeset
   386
		//get a copy of the indication
hgs
parents:
diff changeset
   387
		CEnhancedVoiceMailBoxInformation* retrievedNotification=enhancedVoiceMailOperations.CopyEnhancedVoiceMailIEL();
hgs
parents:
diff changeset
   388
		TVoiceMailInfoType typeInfo=retrievedNotification->Type();
hgs
parents:
diff changeset
   389
		//check its type
hgs
parents:
diff changeset
   390
		if(typeInfo==EGsmSmsVoiceMailNotification)
hgs
parents:
diff changeset
   391
			{
hgs
parents:
diff changeset
   392
			//increment the indication count
hgs
parents:
diff changeset
   393
			++totalIndicationCount;
hgs
parents:
diff changeset
   394
			resourceId = R_MSG_INDICATION_ENHANCED_VOICEMAIL_ONE;	
hgs
parents:
diff changeset
   395
			}
hgs
parents:
diff changeset
   396
		
hgs
parents:
diff changeset
   397
		TUint8 messageCount=retrievedNotification->NumberOfVoiceMessages();
hgs
parents:
diff changeset
   398
		//add the message count to the running total
hgs
parents:
diff changeset
   399
		totalMessageCount+=messageCount;
hgs
parents:
diff changeset
   400
		//if there is more that one message of this type then set the resouce id to 'many'
hgs
parents:
diff changeset
   401
		if(messageCount!=1)
hgs
parents:
diff changeset
   402
			{
hgs
parents:
diff changeset
   403
			++resourceId;	
hgs
parents:
diff changeset
   404
			}
hgs
parents:
diff changeset
   405
		
hgs
parents:
diff changeset
   406
		delete retrievedNotification;
hgs
parents:
diff changeset
   407
		}  
hgs
parents:
diff changeset
   408
		
hgs
parents:
diff changeset
   409
	//check for special message waiting indications
hgs
parents:
diff changeset
   410
	CSmsSpecialSMSMessageOperations& operations = STATIC_CAST(CSmsSpecialSMSMessageOperations&,aMessage.GetOperationsForIEL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication));
hgs
parents:
diff changeset
   411
	TUint specialMessageIndicationCount=operations.GetCountOfSpecialMessageIndicationsL();	
hgs
parents:
diff changeset
   412
	
hgs
parents:
diff changeset
   413
	if(specialMessageIndicationCount!=0)
hgs
parents:
diff changeset
   414
		{
hgs
parents:
diff changeset
   415
		//add special message indications to out indication count
hgs
parents:
diff changeset
   416
		totalIndicationCount+=specialMessageIndicationCount;	
hgs
parents:
diff changeset
   417
		
hgs
parents:
diff changeset
   418
		if(totalIndicationCount>1) 
hgs
parents:
diff changeset
   419
			{
hgs
parents:
diff changeset
   420
			//set the resource id to R_MSG_INDICATION_OTHER_ONE
hgs
parents:
diff changeset
   421
			resourceId = R_MSG_INDICATION_OTHER_ONE;
hgs
parents:
diff changeset
   422
			//get the total number of messages from the indicatations
hgs
parents:
diff changeset
   423
			TUint8 messageCount=0;
hgs
parents:
diff changeset
   424
			for(TInt loopCount=0;loopCount<specialMessageIndicationCount;loopCount++)
hgs
parents:
diff changeset
   425
				{
hgs
parents:
diff changeset
   426
				operations.GetMessageIndicationIEL(loopCount,toStore,messageIndicationType,extendedType,messageProfileType,messageCount);
hgs
parents:
diff changeset
   427
				totalMessageCount+=messageCount;						
hgs
parents:
diff changeset
   428
				}
hgs
parents:
diff changeset
   429
			}
hgs
parents:
diff changeset
   430
		else
hgs
parents:
diff changeset
   431
			{
hgs
parents:
diff changeset
   432
			//there is only one indication, get it's type and the number of messages it holds.
hgs
parents:
diff changeset
   433
			TUint8 messageCount=0;
hgs
parents:
diff changeset
   434
			operations.GetMessageIndicationIEL(0,toStore,messageIndicationType,
hgs
parents:
diff changeset
   435
											extendedType,messageProfileType,messageCount);	
hgs
parents:
diff changeset
   436
		
hgs
parents:
diff changeset
   437
			//add the message count to the running total
hgs
parents:
diff changeset
   438
			totalMessageCount+=messageCount;
hgs
parents:
diff changeset
   439
		
hgs
parents:
diff changeset
   440
			switch (messageIndicationType)
hgs
parents:
diff changeset
   441
				{
hgs
parents:
diff changeset
   442
				case EGsmSmsVoiceMessageWaiting:
hgs
parents:
diff changeset
   443
					resourceId = R_MSG_INDICATION_VOICEMAIL_ONE;
hgs
parents:
diff changeset
   444
					break;
hgs
parents:
diff changeset
   445
				
hgs
parents:
diff changeset
   446
				case EGsmSmsFaxMessageWaiting:
hgs
parents:
diff changeset
   447
					resourceId = R_MSG_INDICATION_FAX_ONE;
hgs
parents:
diff changeset
   448
					break;
hgs
parents:
diff changeset
   449
				
hgs
parents:
diff changeset
   450
				case EGsmSmsElectronicMailMessageWaiting:
hgs
parents:
diff changeset
   451
					resourceId = R_MSG_INDICATION_EMAIL_ONE;
hgs
parents:
diff changeset
   452
					break;
hgs
parents:
diff changeset
   453
					
hgs
parents:
diff changeset
   454
				case EGsmSmsExtendedMessageTypeWaiting:
hgs
parents:
diff changeset
   455
					//get the extended indications type
hgs
parents:
diff changeset
   456
					if(extendedType==EGsmSmsVideoMessageWaiting)
hgs
parents:
diff changeset
   457
						{
hgs
parents:
diff changeset
   458
						resourceId = R_MSG_INDICATION_VIDEOMESSAGE_ONE;	
hgs
parents:
diff changeset
   459
						}
hgs
parents:
diff changeset
   460
					else
hgs
parents:
diff changeset
   461
						{
hgs
parents:
diff changeset
   462
						resourceId = R_MSG_INDICATION_OTHER_ONE;	
hgs
parents:
diff changeset
   463
						}
hgs
parents:
diff changeset
   464
					break;
hgs
parents:
diff changeset
   465
					
hgs
parents:
diff changeset
   466
				default:
hgs
parents:
diff changeset
   467
					resourceId = R_MSG_INDICATION_OTHER_ONE;
hgs
parents:
diff changeset
   468
					break;
hgs
parents:
diff changeset
   469
				}	
hgs
parents:
diff changeset
   470
			}
hgs
parents:
diff changeset
   471
		//if there is more that one message waiting append 'many' to the id.
hgs
parents:
diff changeset
   472
		if(totalMessageCount!=1)
hgs
parents:
diff changeset
   473
			{
hgs
parents:
diff changeset
   474
			resourceId++;	
hgs
parents:
diff changeset
   475
			}
hgs
parents:
diff changeset
   476
		}
hgs
parents:
diff changeset
   477
hgs
parents:
diff changeset
   478
	const CSmsPDU& smsPDU= aMessage.SmsPDU();
hgs
parents:
diff changeset
   479
	// If no Special Msg Indication found in the User Data,
hgs
parents:
diff changeset
   480
	// then check the DataCodingScheme.
hgs
parents:
diff changeset
   481
	if (totalIndicationCount==0 && smsPDU.DataCodingSchemePresent())
hgs
parents:
diff changeset
   482
		{
hgs
parents:
diff changeset
   483
		TInt bits7to4 = smsPDU.Bits7To4();
hgs
parents:
diff changeset
   484
hgs
parents:
diff changeset
   485
		switch (bits7to4)
hgs
parents:
diff changeset
   486
			{
hgs
parents:
diff changeset
   487
			case TSmsDataCodingScheme::ESmsDCSMessageWaitingIndication7Bit:
hgs
parents:
diff changeset
   488
			case TSmsDataCodingScheme::ESmsDCSMessageWaitingIndicationUCS2:
hgs
parents:
diff changeset
   489
				{
hgs
parents:
diff changeset
   490
				if (smsPDU.IndicationState() == TSmsDataCodingScheme::ESmsIndicationActive)
hgs
parents:
diff changeset
   491
					{
hgs
parents:
diff changeset
   492
					totalIndicationCount = 1;
hgs
parents:
diff changeset
   493
hgs
parents:
diff changeset
   494
					switch (smsPDU.IndicationType())
hgs
parents:
diff changeset
   495
						{
hgs
parents:
diff changeset
   496
						case TSmsDataCodingScheme::ESmsVoicemailMessageWaiting:
hgs
parents:
diff changeset
   497
							resourceId = R_MSG_INDICATION_VOICEMAIL_ONE;
hgs
parents:
diff changeset
   498
							break;
hgs
parents:
diff changeset
   499
						case TSmsDataCodingScheme::ESmsFaxMessageWaiting:
hgs
parents:
diff changeset
   500
							resourceId = R_MSG_INDICATION_FAX_ONE;
hgs
parents:
diff changeset
   501
							break;
hgs
parents:
diff changeset
   502
						case TSmsDataCodingScheme::ESmsElectronicMailMessageWaiting:
hgs
parents:
diff changeset
   503
							resourceId = R_MSG_INDICATION_EMAIL_ONE;
hgs
parents:
diff changeset
   504
							break;
hgs
parents:
diff changeset
   505
						case TSmsDataCodingScheme::ESmsFaxOtherMessageWaiting:
hgs
parents:
diff changeset
   506
						default:
hgs
parents:
diff changeset
   507
							resourceId = R_MSG_INDICATION_OTHER_ONE;
hgs
parents:
diff changeset
   508
							break;
hgs
parents:
diff changeset
   509
						} //end switch
hgs
parents:
diff changeset
   510
					} //end if
hgs
parents:
diff changeset
   511
				} //end case
hgs
parents:
diff changeset
   512
			default:
hgs
parents:
diff changeset
   513
				{
hgs
parents:
diff changeset
   514
				break; //do nothing
hgs
parents:
diff changeset
   515
				}
hgs
parents:
diff changeset
   516
			}
hgs
parents:
diff changeset
   517
		}
hgs
parents:
diff changeset
   518
	
hgs
parents:
diff changeset
   519
	if (totalIndicationCount!=0)
hgs
parents:
diff changeset
   520
		{
hgs
parents:
diff changeset
   521
		//Special message found.
hgs
parents:
diff changeset
   522
		CreateResourceReaderL( NULL );
hgs
parents:
diff changeset
   523
        format = iResourceReader->ReadResourceString( resourceId );
hgs
parents:
diff changeset
   524
        
hgs
parents:
diff changeset
   525
        if (totalMessageCount == 1)
hgs
parents:
diff changeset
   526
            {
hgs
parents:
diff changeset
   527
            if (format.Length() <= aMaxLength)
hgs
parents:
diff changeset
   528
                {
hgs
parents:
diff changeset
   529
                aDescription = format;
hgs
parents:
diff changeset
   530
                }
hgs
parents:
diff changeset
   531
            else
hgs
parents:
diff changeset
   532
                {
hgs
parents:
diff changeset
   533
                // Truncate format so that it fits into aDescription.
hgs
parents:
diff changeset
   534
                aDescription = format.Left(aMaxLength);
hgs
parents:
diff changeset
   535
                }
hgs
parents:
diff changeset
   536
            }
hgs
parents:
diff changeset
   537
        else if (format.Length() < aMaxLength)
hgs
parents:
diff changeset
   538
            {
hgs
parents:
diff changeset
   539
            StringLoader::Format( aDescription, format, -1, totalMessageCount );
hgs
parents:
diff changeset
   540
            }
hgs
parents:
diff changeset
   541
        
hgs
parents:
diff changeset
   542
        SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::DoGetDescriptionL(aMessage, aDescription, aMaxLength) - 1- true");
hgs
parents:
diff changeset
   543
        return ETrue;
hgs
parents:
diff changeset
   544
		}
hgs
parents:
diff changeset
   545
	else
hgs
parents:
diff changeset
   546
		{
hgs
parents:
diff changeset
   547
		if(aMessage.Type() == CSmsPDU::ESmsStatusReport)
hgs
parents:
diff changeset
   548
			{
hgs
parents:
diff changeset
   549
			// for SMS_STATUS_REPORT messages, if we cannot read the string in, then
hgs
parents:
diff changeset
   550
			// we do not attempt to extract the description from the message: return EFalse
hgs
parents:
diff changeset
   551
    		CreateResourceReaderL( NULL );
hgs
parents:
diff changeset
   552
			aDescription.Copy( iResourceReader->ReadResourceString( R_MSG_TYPE_STATUS_REPORT ) );
hgs
parents:
diff changeset
   553
	        SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::DoGetDescriptionL(aMessage, aDescription, aMaxLength) - 2- true");
hgs
parents:
diff changeset
   554
			return ETrue;
hgs
parents:
diff changeset
   555
			}
hgs
parents:
diff changeset
   556
		else
hgs
parents:
diff changeset
   557
			{
hgs
parents:
diff changeset
   558
	        SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::DoGetDescriptionL(aMessage, aDescription, aMaxLength) - 3- false");
hgs
parents:
diff changeset
   559
			return EFalse;
hgs
parents:
diff changeset
   560
			}
hgs
parents:
diff changeset
   561
		}
hgs
parents:
diff changeset
   562
	}
hgs
parents:
diff changeset
   563
hgs
parents:
diff changeset
   564
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   565
// CSmsDetailsPlugin::ExtractDescriptionFromMessage
hgs
parents:
diff changeset
   566
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   567
//
hgs
parents:
diff changeset
   568
void CSmsDetailsPlugin::ExtractDescriptionFromMessage(const CSmsMessage& aMessage, TDes& aDescription, TInt aMaxLength)
hgs
parents:
diff changeset
   569
	{
hgs
parents:
diff changeset
   570
    SMUMLOGGER_ENTERFN("CSmsDetailsPlugin::ExtractDescriptionFromMessage(aMessage, aDescription, aMaxLength)");
hgs
parents:
diff changeset
   571
	if(aMessage.Type() != CSmsPDU::ESmsStatusReport)
hgs
parents:
diff changeset
   572
		{
hgs
parents:
diff changeset
   573
		aMessage.Buffer().Extract(aDescription, 0, Min(aMaxLength, aMessage.Buffer().Length()));
hgs
parents:
diff changeset
   574
hgs
parents:
diff changeset
   575
		TInt length = aDescription.Length();
hgs
parents:
diff changeset
   576
hgs
parents:
diff changeset
   577
		//replace paragraphs with spaces.
hgs
parents:
diff changeset
   578
		while(length--)
hgs
parents:
diff changeset
   579
			{
hgs
parents:
diff changeset
   580
			TText& text = aDescription[length];
hgs
parents:
diff changeset
   581
			const TChar ch(text);
hgs
parents:
diff changeset
   582
			if (ch.IsSpace() || text == CEditableText::EParagraphDelimiter)
hgs
parents:
diff changeset
   583
				text = ' ';
hgs
parents:
diff changeset
   584
			}
hgs
parents:
diff changeset
   585
hgs
parents:
diff changeset
   586
		aDescription.TrimAll(); //removes leading trailing and multiple internal whitespace (spaces, line feeds etc)
hgs
parents:
diff changeset
   587
		}
hgs
parents:
diff changeset
   588
    SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::ExtractDescriptionFromMessage(aMessage, aDescription, aMaxLength)");
hgs
parents:
diff changeset
   589
	}
hgs
parents:
diff changeset
   590
hgs
parents:
diff changeset
   591
TInt CSmsDetailsPlugin::CntMatchThreadFunction( TAny* aRequestData )
hgs
parents:
diff changeset
   592
    {
hgs
parents:
diff changeset
   593
    SMUMLOGGER_ENTERFN("CSmsDetailsPlugin::CntMatchThreadFunction");
hgs
parents:
diff changeset
   594
    TInt error = KErrNone;
hgs
parents:
diff changeset
   595
    //
hgs
parents:
diff changeset
   596
    CTrapCleanup* cleanupStack = CTrapCleanup::New();
hgs
parents:
diff changeset
   597
    if ( !cleanupStack )
hgs
parents:
diff changeset
   598
        {
hgs
parents:
diff changeset
   599
        error = KErrNoMemory;
hgs
parents:
diff changeset
   600
        }
hgs
parents:
diff changeset
   601
    else
hgs
parents:
diff changeset
   602
        {
hgs
parents:
diff changeset
   603
        // Carry out operation in this thread, but via an active scheduler
hgs
parents:
diff changeset
   604
        TRAP( error, CntMatchThreadFunctionL( aRequestData ) );
hgs
parents:
diff changeset
   605
        delete cleanupStack;
hgs
parents:
diff changeset
   606
        }
hgs
parents:
diff changeset
   607
hgs
parents:
diff changeset
   608
    // Rendezvous with MsvServer thread to report completion
hgs
parents:
diff changeset
   609
    RThread::Rendezvous( error );
hgs
parents:
diff changeset
   610
    SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::CntMatchThreadFunction");
hgs
parents:
diff changeset
   611
hgs
parents:
diff changeset
   612
    return error;
hgs
parents:
diff changeset
   613
    }
hgs
parents:
diff changeset
   614
hgs
parents:
diff changeset
   615
hgs
parents:
diff changeset
   616
void CSmsDetailsPlugin::CntMatchThreadFunctionL( TAny* aRequestData )
hgs
parents:
diff changeset
   617
    {
hgs
parents:
diff changeset
   618
    SMUMLOGGER_ENTERFN("CSmsDetailsPlugin::CntMatchThreadFunctionL");
hgs
parents:
diff changeset
   619
    TCntMatchRequestData* requestData = reinterpret_cast< TCntMatchRequestData* >( aRequestData );
hgs
parents:
diff changeset
   620
hgs
parents:
diff changeset
   621
    CActiveScheduler* scheduler = new(ELeave) CActiveScheduler();
hgs
parents:
diff changeset
   622
    CleanupStack::PushL( scheduler );
hgs
parents:
diff changeset
   623
    CActiveScheduler::Install( scheduler );
hgs
parents:
diff changeset
   624
hgs
parents:
diff changeset
   625
    // Create one-shot object to do the match operation
hgs
parents:
diff changeset
   626
    CSmsDetailsPluginOneShotOperation* operation = new(ELeave) CSmsDetailsPluginOneShotOperation( *requestData );
hgs
parents:
diff changeset
   627
    CleanupStack::PushL( operation );
hgs
parents:
diff changeset
   628
    
hgs
parents:
diff changeset
   629
    // Now start the scheduler to carry out the op
hgs
parents:
diff changeset
   630
    CActiveScheduler::Start();
hgs
parents:
diff changeset
   631
hgs
parents:
diff changeset
   632
    // Control returns here after the operation is complete. Propagate error codes to
hgs
parents:
diff changeset
   633
    // thread function.
hgs
parents:
diff changeset
   634
    User::LeaveIfError( operation->CompletionCode() );
hgs
parents:
diff changeset
   635
    
hgs
parents:
diff changeset
   636
    CleanupStack::PopAndDestroy( 2, scheduler ); // operation, scheduler
hgs
parents:
diff changeset
   637
    SMUMLOGGER_LEAVEFN("CSmsDetailsPlugin::CntMatchThreadFunctionL");
hgs
parents:
diff changeset
   638
    }
hgs
parents:
diff changeset
   639
hgs
parents:
diff changeset
   640
hgs
parents:
diff changeset
   641
hgs
parents:
diff changeset
   642
hgs
parents:
diff changeset
   643
hgs
parents:
diff changeset
   644
CSmsDetailsPluginOneShotOperation::CSmsDetailsPluginOneShotOperation( TCntMatchRequestData& aRequestData )
hgs
parents:
diff changeset
   645
: CActive( EPriorityNormal ), iRequestData( aRequestData )
hgs
parents:
diff changeset
   646
    {
hgs
parents:
diff changeset
   647
    SMUMLOGGER_ENTERFN("CSmsDetailsPluginOneShotOperation::CSmsDetailsPluginOneShotOperation");
hgs
parents:
diff changeset
   648
    CActiveScheduler::Add( this );
hgs
parents:
diff changeset
   649
    //
hgs
parents:
diff changeset
   650
    TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   651
    User::RequestComplete( status, KErrNone );
hgs
parents:
diff changeset
   652
    SetActive();
hgs
parents:
diff changeset
   653
    SMUMLOGGER_LEAVEFN("CSmsDetailsPluginOneShotOperation::CSmsDetailsPluginOneShotOperation");
hgs
parents:
diff changeset
   654
    }
hgs
parents:
diff changeset
   655
hgs
parents:
diff changeset
   656
hgs
parents:
diff changeset
   657
CSmsDetailsPluginOneShotOperation::~CSmsDetailsPluginOneShotOperation()
hgs
parents:
diff changeset
   658
    {
hgs
parents:
diff changeset
   659
    SMUMLOGGER_ENTERFN("CSmsDetailsPluginOneShotOperation::~CSmsDetailsPluginOneShotOperation");
hgs
parents:
diff changeset
   660
    if( iContactMatcher )
hgs
parents:
diff changeset
   661
        delete iContactMatcher;
hgs
parents:
diff changeset
   662
    Cancel();
hgs
parents:
diff changeset
   663
    SMUMLOGGER_LEAVEFN("CSmsDetailsPluginOneShotOperation::~CSmsDetailsPluginOneShotOperation");
hgs
parents:
diff changeset
   664
    }
hgs
parents:
diff changeset
   665
hgs
parents:
diff changeset
   666
hgs
parents:
diff changeset
   667
void CSmsDetailsPluginOneShotOperation::RunL()
hgs
parents:
diff changeset
   668
    {
hgs
parents:
diff changeset
   669
    SMUMLOGGER_ENTERFN("CSmsDetailsPluginOneShotOperation::RunL");
hgs
parents:
diff changeset
   670
    TRAPD( err, MatchContactL() );
hgs
parents:
diff changeset
   671
hgs
parents:
diff changeset
   672
    // Preserver error code so that the thread function can report it to the main MsvServer thread.
hgs
parents:
diff changeset
   673
    iStatus = err;
hgs
parents:
diff changeset
   674
hgs
parents:
diff changeset
   675
    // Stop scheduler which will return control to the thread function
hgs
parents:
diff changeset
   676
    CActiveScheduler::Stop();
hgs
parents:
diff changeset
   677
    SMUMLOGGER_LEAVEFN("CSmsDetailsPluginOneShotOperation::RunL");
hgs
parents:
diff changeset
   678
    }
hgs
parents:
diff changeset
   679
hgs
parents:
diff changeset
   680
hgs
parents:
diff changeset
   681
void CSmsDetailsPluginOneShotOperation::DoCancel()
hgs
parents:
diff changeset
   682
    {
hgs
parents:
diff changeset
   683
    // Nothing to do here - we already completed our request in the ctor
hgs
parents:
diff changeset
   684
    }
hgs
parents:
diff changeset
   685
hgs
parents:
diff changeset
   686
hgs
parents:
diff changeset
   687
void CSmsDetailsPluginOneShotOperation::MatchContactL()
hgs
parents:
diff changeset
   688
    {
hgs
parents:
diff changeset
   689
    SMUMLOGGER_ENTERFN("CSmsDetailsPluginOneShotOperation::MatchContactL");
hgs
parents:
diff changeset
   690
    RFs fsSession;
hgs
parents:
diff changeset
   691
    User::LeaveIfError( fsSession.Connect() );
hgs
parents:
diff changeset
   692
    CleanupClosePushL( fsSession );
hgs
parents:
diff changeset
   693
hgs
parents:
diff changeset
   694
    if( !iContactMatcher )
hgs
parents:
diff changeset
   695
        {
hgs
parents:
diff changeset
   696
        iContactMatcher = CContactMatcher::NewL( &fsSession );
hgs
parents:
diff changeset
   697
        iContactMatcher->OpenAllStoresL();
hgs
parents:
diff changeset
   698
        }
hgs
parents:
diff changeset
   699
 
hgs
parents:
diff changeset
   700
    CVPbkContactLinkArray* linkArray = CVPbkContactLinkArray::NewLC();
hgs
parents:
diff changeset
   701
    
hgs
parents:
diff changeset
   702
    iContactMatcher->MatchPhoneNumberL(
hgs
parents:
diff changeset
   703
        iRequestData.iFromAddress,
hgs
parents:
diff changeset
   704
        iRequestData.iMatchDigitCount,
hgs
parents:
diff changeset
   705
        CVPbkPhoneNumberMatchStrategy::EVPbkMatchFlagsNone,
hgs
parents:
diff changeset
   706
        *linkArray );
hgs
parents:
diff changeset
   707
    
hgs
parents:
diff changeset
   708
    TInt nameIndex = 0; //correct index if only one match is found
hgs
parents:
diff changeset
   709
    if( linkArray->Count() == 0 )
hgs
parents:
diff changeset
   710
        {
hgs
parents:
diff changeset
   711
        SMUMLOGGER_WRITE("No match found");
hgs
parents:
diff changeset
   712
        User::Leave( KErrNotFound );        
hgs
parents:
diff changeset
   713
        }
hgs
parents:
diff changeset
   714
    else if( linkArray->Count() > 1 )
hgs
parents:
diff changeset
   715
        {
hgs
parents:
diff changeset
   716
        //Multiple matches found. Get the current store single match index if any.
hgs
parents:
diff changeset
   717
        nameIndex = GetCurrentStoreIndexL( *linkArray );
hgs
parents:
diff changeset
   718
        if( nameIndex == KErrMultipleMatchFound )
hgs
parents:
diff changeset
   719
            {
hgs
parents:
diff changeset
   720
            /* No unique match in current store, Hence show the name only if all the matches have 
hgs
parents:
diff changeset
   721
             * identical names
hgs
parents:
diff changeset
   722
             */
hgs
parents:
diff changeset
   723
            if( ShowContactNameL( linkArray, nameIndex) == EFalse)
hgs
parents:
diff changeset
   724
                {
hgs
parents:
diff changeset
   725
                SMUMLOGGER_WRITE("No (Perfect) match found");
hgs
parents:
diff changeset
   726
                User::Leave( KErrMultipleMatchFound );
hgs
parents:
diff changeset
   727
                }
hgs
parents:
diff changeset
   728
            }
hgs
parents:
diff changeset
   729
        }
hgs
parents:
diff changeset
   730
hgs
parents:
diff changeset
   731
    // There should be only one match or multiple identical matches in this case.
hgs
parents:
diff changeset
   732
    // Use the same and read contact from the store.
hgs
parents:
diff changeset
   733
hgs
parents:
diff changeset
   734
    HBufC* alias = GetContactNameL( linkArray->At(nameIndex) );
hgs
parents:
diff changeset
   735
    if ( alias )
hgs
parents:
diff changeset
   736
        {
hgs
parents:
diff changeset
   737
        iRequestData.iOutput->Copy( alias->Left( iRequestData.iMaxLength ) );
hgs
parents:
diff changeset
   738
        delete alias;
hgs
parents:
diff changeset
   739
        alias = NULL;        
hgs
parents:
diff changeset
   740
        }
hgs
parents:
diff changeset
   741
hgs
parents:
diff changeset
   742
    CleanupStack::PopAndDestroy( 2, &fsSession ); // linkArray, fsSession
hgs
parents:
diff changeset
   743
    SMUMLOGGER_LEAVEFN("CSmsDetailsPluginOneShotOperation::MatchContactL");
hgs
parents:
diff changeset
   744
    }
hgs
parents:
diff changeset
   745
hgs
parents:
diff changeset
   746
hgs
parents:
diff changeset
   747
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   748
// CSmsDetailsPluginOneShotOperation::GetContactNameL
hgs
parents:
diff changeset
   749
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   750
//
hgs
parents:
diff changeset
   751
HBufC* CSmsDetailsPluginOneShotOperation::GetContactNameL(const MVPbkContactLink& aContactLink )
hgs
parents:
diff changeset
   752
    {
hgs
parents:
diff changeset
   753
    //SMUMLOGGER_ENTERFN("CSmsDetailsPluginOneShotOperation::GetContactNameL");
hgs
parents:
diff changeset
   754
    MVPbkStoreContact* tempContact;
hgs
parents:
diff changeset
   755
    iContactMatcher->GetStoreContactL(aContactLink, &tempContact);
hgs
parents:
diff changeset
   756
    tempContact->PushL();
hgs
parents:
diff changeset
   757
    
hgs
parents:
diff changeset
   758
    MVPbkStoreContactFieldCollection& coll = tempContact->Fields();
hgs
parents:
diff changeset
   759
    HBufC* nameBuff = iContactMatcher->GetNameL( coll );
hgs
parents:
diff changeset
   760
    
hgs
parents:
diff changeset
   761
    CleanupStack::PopAndDestroy(tempContact); // tempContact
hgs
parents:
diff changeset
   762
    //SMUMLOGGER_LEAVEFN("CSmsDetailsPluginOneShotOperation::GetContactNameL");
hgs
parents:
diff changeset
   763
    return nameBuff;
hgs
parents:
diff changeset
   764
    }
hgs
parents:
diff changeset
   765
hgs
parents:
diff changeset
   766
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   767
// CSmsDetailsPluginOneShotOperation::GetContactNameInLowerCaseL
hgs
parents:
diff changeset
   768
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   769
//
hgs
parents:
diff changeset
   770
HBufC* CSmsDetailsPluginOneShotOperation::GetContactNameInLowerCaseL(const MVPbkContactLink& aContactLink )
hgs
parents:
diff changeset
   771
    {
hgs
parents:
diff changeset
   772
    //SMUMLOGGER_ENTERFN("CSmsDetailsPluginOneShotOperation::GetContactNameInLowerCaseL");
hgs
parents:
diff changeset
   773
    //get the name 
hgs
parents:
diff changeset
   774
    HBufC* nameBuff =  GetContactNameL(aContactLink);
hgs
parents:
diff changeset
   775
    CleanupStack::PushL( nameBuff );
hgs
parents:
diff changeset
   776
    
hgs
parents:
diff changeset
   777
    //SMUMLOGGER_WRITE_FORMAT( "length: %d", nameBuff->Length() );
hgs
parents:
diff changeset
   778
    //SMUMLOGGER_WRITE_FORMAT( "size: %d", nameBuff->Size() );
hgs
parents:
diff changeset
   779
    
hgs
parents:
diff changeset
   780
    //Convert to lower case , since this name buffer is used to compare names.    
hgs
parents:
diff changeset
   781
    HBufC* nameInLowerCase = HBufC::NewL( nameBuff->Length() + 2 );
hgs
parents:
diff changeset
   782
    nameInLowerCase->Des().CopyLC( *nameBuff );
hgs
parents:
diff changeset
   783
    
hgs
parents:
diff changeset
   784
    CleanupStack::PopAndDestroy( nameBuff ); // nameBuff
hgs
parents:
diff changeset
   785
    //SMUMLOGGER_LEAVEFN("CSmsDetailsPluginOneShotOperation::GetContactNameInLowerCaseL");
hgs
parents:
diff changeset
   786
    return nameInLowerCase;
hgs
parents:
diff changeset
   787
    }
hgs
parents:
diff changeset
   788
hgs
parents:
diff changeset
   789
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   790
// CSmsDetailsPluginOneShotOperation::ShowContactNameL
hgs
parents:
diff changeset
   791
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   792
//
hgs
parents:
diff changeset
   793
TBool CSmsDetailsPluginOneShotOperation::ShowContactNameL(CVPbkContactLinkArray* aLinkArray, TInt &nameIndex)
hgs
parents:
diff changeset
   794
    {
hgs
parents:
diff changeset
   795
    SMUMLOGGER_ENTERFN("CSmsDetailsPluginOneShotOperation::ShowContactName");
hgs
parents:
diff changeset
   796
    /* TODO:: see the NOTE: below
hgs
parents:
diff changeset
   797
     * compare the names upto standard
hgs
parents:
diff changeset
   798
     * 1. if all the names are same - display the name 
hgs
parents:
diff changeset
   799
     *    eg: "abcdef xyz" && "abcdef xyz"
hgs
parents:
diff changeset
   800
     * 2. find min name legth among all,
hgs
parents:
diff changeset
   801
     *    if this length is > standard length and matches upto standard length - display the larger name.
hgs
parents:
diff changeset
   802
     *    eg: abcdef xyz123,  abcdef xyz12, abcdef xyz and std length is 10,
hgs
parents:
diff changeset
   803
     *        since match upto 10 chars is fine, display abcdef xyz123
hgs
parents:
diff changeset
   804
     * 3. in any other case do not show name
hgs
parents:
diff changeset
   805
     *    eg: abcdef xyz , abcde xyz
hgs
parents:
diff changeset
   806
     *        abcdef xyz , abcdef xy
hgs
parents:
diff changeset
   807
     *        abcdef xyz , abcde
hgs
parents:
diff changeset
   808
     */
hgs
parents:
diff changeset
   809
    TInt i, minLength = 999, maxLength = 0, length = 0, maxLengthIndex = 0;
hgs
parents:
diff changeset
   810
    TBool retVal = ETrue ;
hgs
parents:
diff changeset
   811
    SMUMLOGGER_WRITE( "Contact Match statistics to follow..." );
hgs
parents:
diff changeset
   812
    SMUMLOGGER_WRITE_FORMAT( "CSmsDetailsPluginOneShotOperation::MatchContactL Match count: %d", aLinkArray->Count() );
hgs
parents:
diff changeset
   813
    
hgs
parents:
diff changeset
   814
    for( i = 0 ; i < aLinkArray->Count(); i++ )
hgs
parents:
diff changeset
   815
        {
hgs
parents:
diff changeset
   816
        HBufC* alias = GetContactNameL( aLinkArray->At(i) );
hgs
parents:
diff changeset
   817
        SMUMLOGGER_WRITE_FORMAT( ":-> %s", alias->Des().PtrZ() );
hgs
parents:
diff changeset
   818
        length = alias->Des().Length();
hgs
parents:
diff changeset
   819
        if(minLength > length)
hgs
parents:
diff changeset
   820
            {
hgs
parents:
diff changeset
   821
            minLength = length;
hgs
parents:
diff changeset
   822
            }
hgs
parents:
diff changeset
   823
        if(maxLength < length)
hgs
parents:
diff changeset
   824
            {
hgs
parents:
diff changeset
   825
            maxLength = length;
hgs
parents:
diff changeset
   826
            maxLengthIndex = i;
hgs
parents:
diff changeset
   827
            }
hgs
parents:
diff changeset
   828
        delete alias;
hgs
parents:
diff changeset
   829
        alias = NULL;
hgs
parents:
diff changeset
   830
        }
hgs
parents:
diff changeset
   831
    SMUMLOGGER_WRITE_FORMAT( "                MinLength   : %d", minLength);
hgs
parents:
diff changeset
   832
    SMUMLOGGER_WRITE_FORMAT( "                MaxLength   : %d", maxLength); 
hgs
parents:
diff changeset
   833
    SMUMLOGGER_WRITE_FORMAT( "                MaxLen index: %d", maxLengthIndex);
hgs
parents:
diff changeset
   834
    
hgs
parents:
diff changeset
   835
    if(minLength != maxLength)
hgs
parents:
diff changeset
   836
        {
hgs
parents:
diff changeset
   837
        //complete length match not possible
hgs
parents:
diff changeset
   838
        retVal = EFalse;
hgs
parents:
diff changeset
   839
        
hgs
parents:
diff changeset
   840
        /* NOTE:
hgs
parents:
diff changeset
   841
         * Uncomment below code if partial length(upto stdLength) match is sufficient, 
hgs
parents:
diff changeset
   842
         * ensure stdLength is correct
hgs
parents:
diff changeset
   843
         */
hgs
parents:
diff changeset
   844
        /*
hgs
parents:
diff changeset
   845
        if(minLength < stdLength)
hgs
parents:
diff changeset
   846
            {
hgs
parents:
diff changeset
   847
            SMUMLOGGER_WRITE( "minLength < stdLength" );
hgs
parents:
diff changeset
   848
            retVal = EFalse;
hgs
parents:
diff changeset
   849
            }
hgs
parents:
diff changeset
   850
        */
hgs
parents:
diff changeset
   851
        }
hgs
parents:
diff changeset
   852
    
hgs
parents:
diff changeset
   853
    if( retVal )
hgs
parents:
diff changeset
   854
        {
hgs
parents:
diff changeset
   855
        TInt ret;
hgs
parents:
diff changeset
   856
        HBufC* longestName = GetContactNameInLowerCaseL( aLinkArray->At(maxLengthIndex) );        
hgs
parents:
diff changeset
   857
        SMUMLOGGER_WRITE_FORMAT( "Longest name:-> %s", longestName->Des().PtrZ() );
hgs
parents:
diff changeset
   858
        for ( i = 0; i < aLinkArray->Count() && retVal; i++ )
hgs
parents:
diff changeset
   859
            {
hgs
parents:
diff changeset
   860
            HBufC* nameI = GetContactNameInLowerCaseL( aLinkArray->At(i) );
hgs
parents:
diff changeset
   861
            SMUMLOGGER_WRITE_FORMAT( "compared with -> %s", nameI->Des().PtrZ() );
hgs
parents:
diff changeset
   862
            ret = longestName->Find(nameI->Des());
hgs
parents:
diff changeset
   863
            if(ret == KErrNotFound || ret != 0)
hgs
parents:
diff changeset
   864
                {
hgs
parents:
diff changeset
   865
                SMUMLOGGER_WRITE_FORMAT( "Part/Full Match error/offset: %d", ret );
hgs
parents:
diff changeset
   866
                retVal = EFalse;
hgs
parents:
diff changeset
   867
                }
hgs
parents:
diff changeset
   868
            delete nameI;
hgs
parents:
diff changeset
   869
            nameI = NULL;
hgs
parents:
diff changeset
   870
           }
hgs
parents:
diff changeset
   871
        delete longestName;
hgs
parents:
diff changeset
   872
        longestName = NULL;
hgs
parents:
diff changeset
   873
        }
hgs
parents:
diff changeset
   874
hgs
parents:
diff changeset
   875
    //If no match OR more than one match, then to avoid ambiguity, display the number
hgs
parents:
diff changeset
   876
    SMUMLOGGER_WRITE_FORMAT( "Final Match result : %d", retVal );
hgs
parents:
diff changeset
   877
    SMUMLOGGER_WRITE_FORMAT( "Final Match index  : %d", maxLengthIndex );
hgs
parents:
diff changeset
   878
    SMUMLOGGER_WRITE( "Contact Match statistics End here..." );
hgs
parents:
diff changeset
   879
hgs
parents:
diff changeset
   880
    SMUMLOGGER_LEAVEFN("CSmsDetailsPluginOneShotOperation::ShowContactName");
hgs
parents:
diff changeset
   881
    nameIndex = maxLengthIndex;
hgs
parents:
diff changeset
   882
    return retVal;
hgs
parents:
diff changeset
   883
    }
hgs
parents:
diff changeset
   884
hgs
parents:
diff changeset
   885
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   886
// CSmsDetailsPluginOneShotOperation::GetCurrentStoreIndexL
hgs
parents:
diff changeset
   887
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   888
//
hgs
parents:
diff changeset
   889
TInt CSmsDetailsPluginOneShotOperation::GetCurrentStoreIndexL( CVPbkContactLinkArray& aLinkArray )
hgs
parents:
diff changeset
   890
    {
hgs
parents:
diff changeset
   891
    TInt curStoreIndex( KErrMultipleMatchFound );
hgs
parents:
diff changeset
   892
    TInt curStoreMatchCount = 0;
hgs
parents:
diff changeset
   893
    RArray<TInt> otherStoreMatchIndices;
hgs
parents:
diff changeset
   894
    CleanupClosePushL( otherStoreMatchIndices );
hgs
parents:
diff changeset
   895
    
hgs
parents:
diff changeset
   896
    //Get the current configured contact store array(s)
hgs
parents:
diff changeset
   897
    CPbk2StoreConfiguration* storeConfiguration = CPbk2StoreConfiguration::NewL();
hgs
parents:
diff changeset
   898
    CleanupStack::PushL( storeConfiguration );
hgs
parents:
diff changeset
   899
    CVPbkContactStoreUriArray* currStoreArray = storeConfiguration->CurrentConfigurationL();
hgs
parents:
diff changeset
   900
    CleanupStack::PopAndDestroy(storeConfiguration);
hgs
parents:
diff changeset
   901
hgs
parents:
diff changeset
   902
    if ( currStoreArray )
hgs
parents:
diff changeset
   903
        {
hgs
parents:
diff changeset
   904
        /* Contact's store is compared against user selected stores.
hgs
parents:
diff changeset
   905
         * If contact is from such store, found index is incremented
hgs
parents:
diff changeset
   906
         * else, other store contact indices are populated into array for further use
hgs
parents:
diff changeset
   907
         */
hgs
parents:
diff changeset
   908
        for ( TInt i = 0; i < aLinkArray.Count(); i++ )
hgs
parents:
diff changeset
   909
            {
hgs
parents:
diff changeset
   910
            TVPbkContactStoreUriPtr uri = aLinkArray.At(i).ContactStore().StoreProperties().Uri();
hgs
parents:
diff changeset
   911
            if ( currStoreArray->IsIncluded( uri ) )
hgs
parents:
diff changeset
   912
                {
hgs
parents:
diff changeset
   913
                // Set index to found contact and increment the count.
hgs
parents:
diff changeset
   914
                curStoreIndex = i;
hgs
parents:
diff changeset
   915
                curStoreMatchCount++;
hgs
parents:
diff changeset
   916
                }
hgs
parents:
diff changeset
   917
            else
hgs
parents:
diff changeset
   918
                {
hgs
parents:
diff changeset
   919
                otherStoreMatchIndices.AppendL(i);
hgs
parents:
diff changeset
   920
                }
hgs
parents:
diff changeset
   921
            }
hgs
parents:
diff changeset
   922
        
hgs
parents:
diff changeset
   923
        delete currStoreArray;    
hgs
parents:
diff changeset
   924
        if ( curStoreMatchCount > 1)
hgs
parents:
diff changeset
   925
            {
hgs
parents:
diff changeset
   926
            /* Multiple matches found from current user selected store(s) 
hgs
parents:
diff changeset
   927
             * Delete match from other stores in aLinkArray. New aLinkArray should only contain 
hgs
parents:
diff changeset
   928
             * current store contact matches, so that next level pruning can be done(e.g, names can be 
hgs
parents:
diff changeset
   929
             * compared and displayed if they are identical).
hgs
parents:
diff changeset
   930
             */
hgs
parents:
diff changeset
   931
            for(TInt i = otherStoreMatchIndices.Count() - 1; i >= 0; i--)
hgs
parents:
diff changeset
   932
                {
hgs
parents:
diff changeset
   933
                aLinkArray.Delete( otherStoreMatchIndices[i] );
hgs
parents:
diff changeset
   934
                }
hgs
parents:
diff changeset
   935
            curStoreIndex = KErrMultipleMatchFound;
hgs
parents:
diff changeset
   936
            }
hgs
parents:
diff changeset
   937
        }
hgs
parents:
diff changeset
   938
    CleanupStack::PopAndDestroy( &otherStoreMatchIndices );
hgs
parents:
diff changeset
   939
    return curStoreIndex;
hgs
parents:
diff changeset
   940
    }
hgs
parents:
diff changeset
   941
hgs
parents:
diff changeset
   942
//  End of File