messagingfw/msgsrvnstore/server/src/MTSR.CPP
author hgs
Wed, 03 Nov 2010 22:41:46 +0530
changeset 62 db3f5fa34ec7
permissions -rw-r--r--
201044_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     1
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     2
// All rights reserved.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     7
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    10
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    11
// Contributors:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    12
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    13
// Description:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    14
// MTSR.CPP
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    15
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    16
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    17
#include "MSVRUIDS.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    18
#include "MTSR.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    19
#include "MTSRUT.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    20
#include "MSVPANIC.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    21
#include "MSVENTRY.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    22
#include "MsvSecurityCapabilitySet.h"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    23
#include <tmsvsystemprogress.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    24
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    25
#include <e32uid.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    26
#include <s32file.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    27
#include <barsc.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    28
#include <barsread.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    29
#include <bautils.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    30
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS  
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    31
#include "cinstalledmtmgroup.h"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    32
#include "msvconsts.h"				
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    33
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    34
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    35
_LIT(KDefaultRegistryFileStoreName, "\\private\\1000484b\\Mtm Registry v2");
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    36
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    37
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    38
const TUid KUidRegistryFileStore={0x10003C6A};
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    39
const TUid KUidRegistryRootStream={268439422};
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    40
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    41
const TInt KMtmInfoFileResourceId = 1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    42
const TInt KMtmCapabilitiesResourceId = 2;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    43
const TInt KMtmSecurityCapabilitySetResourceId = 3;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    44
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    45
EXPORT_C CBaseServerMtm::~CBaseServerMtm()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    46
/** Destructor.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    47
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    48
This cleans up the base class. CBaseServerMtm-derived objects are deleted by the 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    49
Message Server when they are no longer required. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    50
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    51
Derived classes can implement a destructor to do any additional clean up tasks 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    52
that they require. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    53
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    54
	iRegisteredMtmDll.ReleaseLibrary();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    55
	delete iServerEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    56
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    57
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    58
/** Constructor. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    59
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    60
The function is passed a CMsvServerEntry object in aServerEntry. This object is used to access
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    61
and change Message Server entries. Its context is initially set either to the
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    62
parent of the entry or selection being operated on, or the entry itself. The
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    63
constructor stores it in the protected iServerEntry member.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    64
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    65
Derived classes can implement a constructor to perform any additional MTM-specific 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    66
setup that can be safely carried out in a constructor. Such constructors must call the 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    67
base class constructor function.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    68
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    69
@param aRegisteredMtmDll Registration data for the MTM DLL
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    70
@param aServerEntry Context on which to operate
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    71
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    72
EXPORT_C CBaseServerMtm::CBaseServerMtm(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aServerEntry):
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    73
	CActive(EPriorityStandard),	iServerEntry(aServerEntry), iRegisteredMtmDll(aRegisteredMtmDll)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    74
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    75
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    76
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    77
EXPORT_C void CBaseServerMtm::RunL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    78
/** Provides a simple implementation of CActive::RunL() that calls the derived 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    79
class's DoRunL() function. If that function leaves, then the leave is trapped, 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    80
and DoComplete() is called to handle the error.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    81
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    82
This implementation ensures that derived classes handle leave errors in RunL(), 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    83
rather than the default of the error being passed to the active scheduler. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    84
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    85
	DoRunL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    86
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    87
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    88
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    89
/** Handles the cases where RunL is leaving.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    90
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    91
EXPORT_C TInt CBaseServerMtm::RunError(TInt aError)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    92
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    93
	DoComplete(aError);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    94
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    95
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    96
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    97
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    98
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    99
Returns a pointer to the interface with the specified Uid. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   100
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   101
This method is the first part of an extension pattern to allow for 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   102
more functionality to be supported without adding virtual methods 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   103
to this base class.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   104
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   105
The default implementation returns a NULL pointer.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   106
 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   107
@param	aUid  
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   108
Uid of the extension interface
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   109
@return
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   110
Pointer to the extension interface
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   111
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   112
EXPORT_C TAny* CBaseServerMtm::GetInterface(TUid /*aUid*/)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   113
 	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   114
	return NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   115
 	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   116
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   117
/** 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   118
This call leads to calling one of the server Mtms to populate the 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   119
TMsvSystemProgress structure.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   120
@param aOutSysProg The TMsvSystemProgress structure to be populated by the server
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   121
@return the error of the Extension_ method call
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   122
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   123
EXPORT_C TInt CBaseServerMtm::SystemProgress(TMsvSystemProgress& aOutSysProg)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   124
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   125
	TAny* ptrNull = NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   126
	return Extension_(KUIDMsgMsvSystemProgress, ptrNull, &aOutSysProg);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   127
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   128
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   129
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   130
Call to this method leads to call Extension_ method of server MTMs, to which
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   131
the thread handle of the client application is passed.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   132
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   133
#if (defined SYMBIAN_USER_PROMPT_SERVICE)	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   134
TInt CBaseServerMtm::ClientThreadInfo(TThreadId aClientInfo, TBool aCapabilityCheck)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   135
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   136
	TAny* ptrNull = &aCapabilityCheck;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   137
	return Extension_(KUIDMsgClientThreadInfo, ptrNull, &aClientInfo);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   138
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   139
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   140
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   141
TInt CBaseServerMtm::GetNonOperationMtmData(TNonOperationMtmDataType& aMtmDataType, TPtrC8& aResultBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   142
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   143
	TAny* mtmDataTypePtr = &aMtmDataType;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   144
	return Extension_(KUidMsgNonOperationMtmData, mtmDataTypePtr, &aResultBuffer);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   145
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   146
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   147
/** The extension method provides a polymorphic behaviour to call the correct
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   148
SystemProgress function.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   149
@param aExtensionId The Uid passed in as KUIDMsgMsvSystemProgress to obtain the
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   150
System Progress.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   151
@return KErrExtensionNotSupported retuned if no Extension_ function is overriddden
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   152
by the derived class.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   153
*/	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   154
EXPORT_C TInt CBaseServerMtm::Extension_(TUint aExtensionId, TAny *&a0, TAny *a1)	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   155
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   156
	TInt ret = KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   157
	switch(aExtensionId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   158
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   159
		case KUIDMsgMsvSystemProgress:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   160
		case KUidMsgNonOperationMtmData:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   161
#if (defined SYMBIAN_USER_PROMPT_SERVICE)	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   162
		case KUIDMsgClientThreadInfo:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   163
#endif		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   164
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   165
			ret = KErrExtensionNotSupported;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   166
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   167
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   168
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   169
		default:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   170
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   171
		// Chain to base class
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   172
			ret = CActive::Extension_(aExtensionId, a0, a1);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   173
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   174
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   175
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   176
	return ret;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   177
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   178
// Empty declaration
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   179
EXPORT_C TInt CBaseServerMtm::ChangeEntriesL( const CMsvEntrySelection& /*aSelection*/,TInt /*aMark*/, TRequestStatus& aStatus )
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   180
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   181
    //Empty declaration. Respective MTM implementation should be call .
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   182
    TRequestStatus aEmptyStatus;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   183
    aEmptyStatus = aStatus ;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   184
    
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   185
    return KErrNotSupported; // Specific to MTM. Base return Not supported.  
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   186
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   187
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   188
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   189
EXPORT_C CServerMtmDllRegistry* CServerMtmDllRegistry::NewL(RFs& aFs,TTimeIntervalMicroSeconds32 aTimeoutMicroSeconds32)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   190
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   191
	return new(ELeave) CServerMtmDllRegistry(aFs,aTimeoutMicroSeconds32); 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   192
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   193
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   194
EXPORT_C CServerMtmDllRegistry::~CServerMtmDllRegistry()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   195
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   196
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   197
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   198
EXPORT_C CBaseServerMtm* CServerMtmDllRegistry::NewServerMtmL(TUid aMtmTypeUid, CMsvServerEntry* aInitialEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   199
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   200
	CleanupStack::PushL(aInitialEntry); // Take ownership of the server entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   201
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   202
	if(!IsPresent(aMtmTypeUid))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   203
		User::Leave(KErrNotFound);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   204
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   205
	TInt index=MtmTypeUidToIndex(aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   206
	CRegisteredMtmDll* registeredmtmdll=iRegisteredMtmDllArray[index];
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   207
	RLibrary mtmdlllibrary;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   208
	User::LeaveIfError(registeredmtmdll->GetLibrary(iFs, mtmdlllibrary));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   209
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   210
	TInt refcount = registeredmtmdll->MtmDllRefCount();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   211
	CBaseServerMtm* servermtm = NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   212
	CleanupStack::Pop(); // aInitialEntry - function takes ownership of this
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   213
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   214
	TRAPD(ret, servermtm = NewMtmL(mtmdlllibrary, aInitialEntry, *registeredmtmdll));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   215
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   216
	if ((ret!=KErrNone) && (registeredmtmdll->MtmDllRefCount()==refcount))  //  Library not released in mtm destructor
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   217
		registeredmtmdll->ReleaseLibrary();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   218
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   219
	User::LeaveIfError(ret);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   220
	return servermtm;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   221
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   222
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   223
CBaseServerMtm* CServerMtmDllRegistry::NewMtmL(const RLibrary& aLib, CMsvServerEntry* aServerEntry, CRegisteredMtmDll& aReg) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   224
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   225
	CleanupStack::PushL(aServerEntry); // Take ownership of the server entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   226
	typedef CBaseServerMtm*(*NewServerMtmL)(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aInitialEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   227
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   228
	TInt ordinal = aReg.MtmDllInfo().iEntryPointOrdinalNumber;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   229
	TLibraryFunction libFunc = aLib.Lookup(ordinal);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   230
	if (!libFunc)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   231
		User::Leave(KErrBadLibraryEntryPoint);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   232
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   233
	NewServerMtmL pFunc = (NewServerMtmL)libFunc;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   234
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   235
	CleanupStack::Pop(); // aServerEntry - mtm should take ownership of this
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   236
	return (*pFunc)(aReg, aServerEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   237
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   238
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   239
CServerMtmDllRegistry::CServerMtmDllRegistry(RFs& aFs,TTimeIntervalMicroSeconds32 aTimeoutMicroSeconds32):
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   240
	CMtmDllRegistry(aFs,KUidMtmServerComponent,aTimeoutMicroSeconds32)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   241
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   242
	__DECLARE_NAME(_S("CServerMtmDllRegistry"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   243
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   244
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   245
CInstalledMtmGroupArray::CInstalledMtmGroupArray():
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   246
	CArrayPtrFlat<CInstalledMtmGroup>(8)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   247
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   248
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   249
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   250
CInstalledMtmGroupArray::~CInstalledMtmGroupArray()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   251
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   252
	ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   253
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   254
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   255
void CInstalledMtmGroupArray::AddInstalledMtmGroupL(CInstalledMtmGroup* aInstalledMtmGroup)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   256
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   257
	CleanupStack::PushL(aInstalledMtmGroup);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   258
	AppendL(aInstalledMtmGroup);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   259
	CleanupStack::Pop();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   260
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   261
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   262
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   263
EXPORT_C CMtmRegistryControl* CMtmRegistryControl::NewL(RFs& anFs,CServerMtmDllRegistry& aServerMtmDllRegistry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   264
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   265
	CMtmRegistryControl* mtmregistrycontrol=new(ELeave) CMtmRegistryControl(anFs,aServerMtmDllRegistry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   266
	CleanupStack::PushL(mtmregistrycontrol);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   267
	mtmregistrycontrol->ConstructL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   268
	CleanupStack::Pop();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   269
	return mtmregistrycontrol;	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   270
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   271
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   272
EXPORT_C CMtmRegistryControl::~CMtmRegistryControl()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   273
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   274
	delete iInstalledMtmGroupArray;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   275
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   276
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   277
EXPORT_C TInt CMtmRegistryControl::InstallMtmGroup(const TDesC& aFullName,TUid& aMtmTypeUid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   278
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   279
	aMtmTypeUid=KNullUid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   280
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   281
	// Install the mtm
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   282
	TRAPD(ret, DoInstallMtmGroupL(aFullName, aMtmTypeUid));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   283
	if ((ret!=KErrNone) && (aMtmTypeUid!=KNullUid))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   284
		RemoveInstalledMtmGroup(aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   285
	return ret;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   286
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   287
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   288
EXPORT_C TInt CMtmRegistryControl::FullNameToMtmTypeUid(const TDesC& aFullName,TUid& aMtmTypeUid) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   289
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   290
	aMtmTypeUid=KNullUid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   291
	TRAPD(ret, aMtmTypeUid = DoFindMtmTypeUidL(aFullName));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   292
	if (ret==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   293
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   294
		TUidType uidtype(KPermanentFileStoreLayoutUid, KUidMsvDataComponent, aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   295
		TInt index=UidTypeToIndex(uidtype);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   296
		if (index==iInstalledMtmGroupArray->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   297
			ret=KErrNotFound;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   298
		else 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   299
			aMtmTypeUid=iInstalledMtmGroupArray->At(index)->iMtmGroupData->MtmTypeUid();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   300
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   301
	return ret;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   302
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   303
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   304
TBool CMtmRegistryControl::IsResFileL(const TDesC& aFullName) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   305
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   306
	// Check the extension to see if it's a resource file
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   307
	TParse parse;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   308
	User::LeaveIfError(parse.Set(aFullName, NULL, NULL));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   309
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   310
	// If first alpha character of extension is 'r' assume we're dealing with a resource file
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   311
	TPtrC ext(parse.Ext());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   312
	return ext.Length() > 1 && TCharF(ext[1]) == TCharF('r');
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   313
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   314
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   315
TUid CMtmRegistryControl::DoFindMtmTypeUidL(const TDesC& aFullName) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   316
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   317
	TUid mtmTypeUid = KNullUid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   318
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   319
	// Is the file a resource file?
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   320
	if (!IsResFileL(aFullName))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   321
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   322
		// Get the third Uid
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   323
		TEntry entry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   324
		User::LeaveIfError(iFs.Entry(aFullName, entry));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   325
		mtmTypeUid = entry[2];
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   326
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   327
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   328
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   329
		// Open the resource file
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   330
		RResourceFile file;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   331
		file.OpenL(iFs, aFullName);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   332
		CleanupClosePushL(file);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   333
		HBufC8* res = file.AllocReadLC(1);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   334
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   335
		// Interpret the resource buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   336
		TResourceReader reader;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   337
		reader.SetBuffer(res);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   338
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   339
		// Get the mtm type
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   340
		mtmTypeUid = TUid::Uid(reader.ReadInt32());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   341
		CleanupStack::PopAndDestroy(2); // res, file
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   342
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   343
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   344
	// Return the Uid Type
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   345
	return mtmTypeUid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   346
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   347
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   348
EXPORT_C TInt CMtmRegistryControl::DeInstallMtmGroup(TUid aMtmTypeUid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   349
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   350
	TRAPD(ret,DoDeInstallMtmGroupL(aMtmTypeUid));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   351
	if (ret!=KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   352
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   353
		TInt index=MtmTypeUidToIndex(aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   354
		iInstalledMtmGroupArray->At(index)->iIsInstalled=ETrue;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   355
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   356
	return ret;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   357
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   358
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   359
EXPORT_C TInt CMtmRegistryControl::UseMtmGroup(TUid aMtmTypeUid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   360
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   361
	TInt index=MtmTypeUidToIndex(aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   362
	__ASSERT_DEBUG(index<iInstalledMtmGroupArray->Count(),PanicServer(EMtsrInstalledMtmGroupNotPresent));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   363
	iInstalledMtmGroupArray->At(index)->iClientUsageCount++;	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   364
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   365
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   366
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   367
EXPORT_C TInt CMtmRegistryControl::ReleaseMtmGroup(TUid aMtmTypeUid)  
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   368
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   369
	TInt index=MtmTypeUidToIndex(aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   370
	__ASSERT_DEBUG(index<iInstalledMtmGroupArray->Count(),PanicServer(EMtsrInstalledMtmGroupNotPresent));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   371
	iInstalledMtmGroupArray->At(index)->iClientUsageCount--;	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   372
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   373
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   374
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   375
EXPORT_C TBool CMtmRegistryControl::IsInUse(TUid aMtmTypeUid) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   376
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   377
	TInt index=MtmTypeUidToIndex(aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   378
	__ASSERT_DEBUG(index<iInstalledMtmGroupArray->Count(),PanicServer(EMtsrInstalledMtmGroupNotPresent));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   379
	return (*iInstalledMtmGroupArray->At(index)).iClientUsageCount>0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   380
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   381
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   382
EXPORT_C TInt CMtmRegistryControl::FillRegisteredMtmDllArray(TUid aMtmDllTypeUid,CRegisteredMtmDllArray& aRegisteredMtmDllArray,TTimeIntervalMicroSeconds32 aTimeoutMicroSeconds32)  // Fill array with Dlls whose second uid is aMtmDllTypeUid
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   383
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   384
	aRegisteredMtmDllArray.ResetAndDestroy();  //  Trash the array
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   385
	TUid mtmdlltypeuid[KMsvNumMtmDllTypes];  //  There must be an easier way to construct the array
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   386
	mtmdlltypeuid[EMtsrServerComponentIndex]	=KUidMtmServerComponent;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   387
	mtmdlltypeuid[EMtsrClientComponentIndex]	=KUidMtmClientComponent;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   388
	mtmdlltypeuid[EMtsrUiComponentIndex]		=KUidMtmUiComponent;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   389
	mtmdlltypeuid[EMtsrUiDataComponentIndex]	=KUidMtmUiDataComponent;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   390
/*
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   391
	mtmdlltypeuid[EMtsrDllTupe1Index]=KMsvDllType1Uid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   392
	mtmdlltypeuid[EMtsrDllType2Index]=KMsvDllType2Uid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   393
	mtmdlltypeuid[EMtsrDllType3Index]=KMsvDllType3Uid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   394
	mtmdlltypeuid[EMtsrDllType4Index]=KMsvDllType4Uid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   395
	mtmdlltypeuid[EMtsrDllType5Index]=KMsvDllType5Uid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   396
	mtmdlltypeuid[EMtsrDllType6Index]=KMsvDllType6Uid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   397
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   398
	TInt index=0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   399
	for (; (index<KMsvNumMtmDllTypes) && (aMtmDllTypeUid!=mtmdlltypeuid[index]); index++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   400
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   401
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   402
	if (index==KMsvNumMtmDllTypes)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   403
		return KErrNotSupported;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   404
	TInt ret=KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   405
	TInt count1=iInstalledMtmGroupArray->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   406
	for (TInt i=0; i<count1; i++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   407
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   408
		CMtmGroupData* mtmgroupdata=iInstalledMtmGroupArray->At(i)->iMtmGroupData;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   409
		TInt count2=mtmgroupdata->MtmDllInfoArray().Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   410
		if (index<count2)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   411
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   412
			CMtmDllInfo* mtmdllinfo=mtmgroupdata->MtmDllInfoArray()[index];
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   413
			if (mtmdllinfo->iUidType[2]!=KNullUid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   414
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   415
				TRAP(ret,
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   416
					{	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   417
					CRegisteredMtmDll* registeredmtmdll=CRegisteredMtmDll::NewL(mtmgroupdata->MtmTypeUid(),mtmgroupdata->TechnologyTypeUid(),*mtmdllinfo,aTimeoutMicroSeconds32,*this);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   418
					
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   419
					// The following takes ownership of registeredmtmdll
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   420
					aRegisteredMtmDllArray.AddRegisteredMtmDllL(registeredmtmdll);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   421
					});
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   422
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   423
				if (ret!=KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   424
					{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   425
					aRegisteredMtmDllArray.ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   426
					break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   427
					}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   428
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   429
			}			
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   430
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   431
	return ret;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   432
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   433
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   434
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   435
const CMtmGroupData& CMtmRegistryControl::GetMtmGroupDataReferenceL(TUid aMtmTypeUid) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   436
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   437
	TInt index=MtmTypeUidToIndex(aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   438
	if (index==iInstalledMtmGroupArray->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   439
		User::Leave(KErrNotFound);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   440
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   441
	return *(iInstalledMtmGroupArray->At(index)->iMtmGroupData);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   442
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   443
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   444
EXPORT_C CMtmGroupData* CMtmRegistryControl::GetMtmGroupDataL(TUid aMtmTypeUid) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   445
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   446
	return CMtmGroupData::NewL(GetMtmGroupDataReferenceL(aMtmTypeUid));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   447
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   448
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   449
EXPORT_C void CMtmRegistryControl::StoreRegistryL() const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   450
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   451
	TParse parsedname;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   452
	User::LeaveIfError(parsedname.Set(iPathName,NULL,NULL));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   453
	TInt ret=iFs.MkDirAll(parsedname.DriveAndPath());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   454
	if (ret!=KErrAlreadyExists)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   455
		User::LeaveIfError(ret);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   456
	CDictionaryFileStore* registryfilestore = CDictionaryFileStore::OpenLC(iFs,parsedname.FullName(),KUidRegistryFileStore);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   457
	RDictionaryWriteStream writestream;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   458
	writestream.AssignLC(*registryfilestore,KUidRegistryRootStream);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   459
	ExternalizeL(writestream);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   460
	writestream.CommitL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   461
	writestream.Close();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   462
	registryfilestore->CommitL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   463
	CleanupStack::PopAndDestroy(2);	// writestream and registryfilestore
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   464
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   465
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   466
EXPORT_C void CMtmRegistryControl::RestoreRegistryL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   467
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   468
	TParse parsedname;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   469
	User::LeaveIfError(parsedname.Set(iPathName,NULL,NULL));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   470
	TEntry entry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   471
	User::LeaveIfError(iFs.Entry(parsedname.FullName(),entry));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   472
	CDictionaryFileStore* registryfilestore = CDictionaryFileStore::OpenLC(iFs,parsedname.FullName(),KUidRegistryFileStore);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   473
	RDictionaryReadStream readstream;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   474
	readstream.OpenLC(*registryfilestore,KUidRegistryRootStream);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   475
	InternalizeL(readstream);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   476
	readstream.Close();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   477
	CleanupStack::PopAndDestroy();// readstream
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   478
	CleanupStack::PopAndDestroy();	// registryfilestore
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   479
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   480
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   481
EXPORT_C void CMtmRegistryControl::InternalizeL(RReadStream& aStream)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   482
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   483
	__ASSERT_DEBUG(iInstalledMtmGroupArray->Count()==0,PanicServer(EMtsrRegistryControlStillInUse));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   484
	TRAPD(ret,DoInternalizeL(aStream))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   485
	if (ret!=KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   486
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   487
		iInstalledMtmGroupArray->ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   488
		iServerMtmDllRegistry.RemoveAllRegisteredMtmDlls();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   489
		User::Leave(ret);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   490
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   491
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   492
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   493
EXPORT_C void CMtmRegistryControl::ExternalizeL(RWriteStream& aStream) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   494
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   495
	TInt count1=iInstalledMtmGroupArray->Count(),count2=0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   496
	TInt i=0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   497
	for (; i<count1; i++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   498
		if ((*iInstalledMtmGroupArray->At(i)).iIsInstalled)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   499
			count2++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   500
	aStream.WriteInt32L(count2);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   501
	for (i=0; i<count1; i++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   502
		if ((*iInstalledMtmGroupArray->At(i)).iIsInstalled)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   503
			aStream << *(iInstalledMtmGroupArray->At(i)->iFilename);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   504
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   505
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   506
CMtmRegistryControl::CMtmRegistryControl(RFs& anFs,CServerMtmDllRegistry& aServerMtmDllRegistry):
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   507
	iFs(anFs),
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   508
	iInstalledMtmGroupArray(),
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   509
	iServerMtmDllRegistry(aServerMtmDllRegistry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   510
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   511
	__DECLARE_NAME(_S("CMtmRegistryControl"));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   512
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   513
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   514
void CMtmRegistryControl::ConstructL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   515
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   516
	iInstalledMtmGroupArray = new(ELeave) CInstalledMtmGroupArray();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   517
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   518
	TChar iDriveChar= iFs.GetSystemDriveChar();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   519
	TBuf<2> systemDrive;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   520
	systemDrive.Append(iDriveChar);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   521
	systemDrive.Append(KDriveDelimiter);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   522
	iPathName=systemDrive;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   523
	iPathName.Append(KDefaultRegistryFileStoreName);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   524
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   525
	TRAPD(ret,RestoreRegistryL());  
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   526
	//should not delete registry if in use
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   527
	if ((ret!=KErrNone) && (ret!=KErrInUse))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   528
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   529
		//ignore error if we can't delete a corrupt file; StoreRegistryL will leave
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   530
		iFs.SetAtt(iPathName,0,KEntryAttReadOnly|KEntryAttHidden|KEntryAttSystem);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   531
		iFs.Delete(iPathName);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   532
		StoreRegistryL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   533
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   534
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   535
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   536
TInt CMtmRegistryControl::MtmTypeUidToIndex(TUid aMtmTypeUid) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   537
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   538
	TInt count=iInstalledMtmGroupArray->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   539
	TInt index=0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   540
	for (; (index<count) && (iInstalledMtmGroupArray->At(index)->iMtmGroupData->MtmTypeUid()!=aMtmTypeUid); index++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   541
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   542
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   543
	return index;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   544
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   545
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   546
TInt CMtmRegistryControl::UidTypeToIndex(TUidType aUidType) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   547
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   548
	TInt count=iInstalledMtmGroupArray->Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   549
	TInt index=0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   550
	for (; (index<count) && (iInstalledMtmGroupArray->At(index)->iUidType!=aUidType); index++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   551
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   552
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   553
	return index;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   554
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   555
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   556
CMtmGroupData *CMtmRegistryControl::LoadMTMFileL(const TDesC& aFullName, TUid &aUid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   557
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   558
	if(IsResFileL(aFullName)==EFalse)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   559
		return(LoadDatFileL(aFullName, aUid));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   560
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   561
		return(LoadResFileL(aFullName, aUid));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   562
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   563
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   564
CMtmGroupData *CMtmRegistryControl::LoadDatFileL(const TDesC& aFullName, TUid &aUid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   565
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   566
	TEntry entry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   567
	User::LeaveIfError(iFs.Entry(aFullName,entry));  //  Check file exists
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   568
	if ((entry[0]!=KPermanentFileStoreLayoutUid) || (entry[1]!=KUidMsvDataComponent))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   569
		User::Leave(KErrNotSupported);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   570
	aUid=entry[2];
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   571
	CMtmGroupData* mtmgroupdata=ReadDataFileStoreL(aFullName);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   572
	return(mtmgroupdata);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   573
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   574
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   575
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   576
CMtmGroupData *CMtmRegistryControl::LoadResFileL(const TDesC& aFullName, TUid &aUid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   577
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   578
	TFileName fileName(aFullName);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   579
	_LIT(KRssFileExtension, ".rsc");
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   580
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   581
	TParsePtrC filenamePPtr(fileName);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   582
	TPtrC ext =filenamePPtr.Ext();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   583
	if(ext!=(KRssFileExtension)) 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   584
		{ //if ext is not .rsc, replace with rsc.  Always pass *.rsc to the BaflUtils::NearestLanguageFile
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   585
		TInt pos=fileName.FindF(ext);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   586
		fileName.Replace(pos,fileName.Length()-pos,KRssFileExtension);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   587
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   588
	BaflUtils::NearestLanguageFile(iFs, fileName);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   589
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   590
	// Open the resource file	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   591
	RResourceFile file;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   592
	file.OpenL(iFs, fileName);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   593
	CleanupClosePushL(file);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   594
	HBufC8* res = file.AllocReadLC(KMtmInfoFileResourceId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   595
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   596
	// Attempt to get the capabilities resource
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   597
	HBufC8* cap = NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   598
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   599
	TRAPD(error,cap = file.AllocReadL(KMtmCapabilitiesResourceId));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   600
	TBool capAvailable = EFalse;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   601
	TBool capSend = EFalse;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   602
	TBool capBody = EFalse;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   603
	if (error == KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   604
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   605
		CleanupStack::PushL(cap);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   606
		capAvailable = ETrue;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   607
		TResourceReader capReader;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   608
		capReader.SetBuffer(cap);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   609
		// Get the send capability
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   610
		capSend = capReader.ReadInt8();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   611
		// Get the body capability
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   612
		capBody = capReader.ReadInt8();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   613
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   614
		CleanupStack::PopAndDestroy(cap);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   615
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   616
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   617
	// Interpret the resource buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   618
	TResourceReader reader;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   619
	reader.SetBuffer(res);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   620
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   621
	// Get the mtm type
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   622
	TUid mtmTypeUid = { reader.ReadInt32() };
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   623
	aUid=mtmTypeUid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   624
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   625
	CMtmDllInfoArray* mtmDllInfoArray = new(ELeave) CMtmDllInfoArray();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   626
	CleanupStack::PushL(mtmDllInfoArray);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   627
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   628
	// Get technology type
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   629
	TUid technologyTypeUid = { reader.ReadInt32() };
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   630
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   631
	// Get number of mtm components
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   632
	TInt components(reader.ReadInt16());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   633
	while(components--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   634
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   635
		// Get the name of the component
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   636
		TPtrC name(reader.ReadTPtrC());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   637
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   638
		// Get the type of component
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   639
		TUid componentUid = { reader.ReadInt32() };
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   640
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   641
		// Get specific Uid of the Dll
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   642
		TUid specificUid = { reader.ReadInt32() };
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   643
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   644
		// Get the Dll entry point
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   645
		TInt entryPoint(reader.ReadInt16());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   646
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   647
		// Get version number
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   648
		TInt major = reader.ReadInt16();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   649
		TInt minor = reader.ReadInt16();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   650
		TInt build = reader.ReadInt16();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   651
		TVersion version(major, minor, build);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   652
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   653
		// Generate uid type
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   654
		TUidType componentUidType(KDynamicLibraryUid, componentUid, specificUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   655
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   656
		TPtrC mtmFilename;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   657
		if (specificUid.iUid == KUidMtmDefaultSpecificVal)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   658
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   659
			// We can assume the MTM resource file has been updated.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   660
			// The version number should be <= 2.0.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   661
			__ASSERT_DEBUG((version.iMajor < KMtmComponentCurrentMajorVersionNumber) || (version.iMajor == KMtmComponentCurrentMajorVersionNumber && version.iMinor == KMtmComponentCurrentMinorVersionNumber), PanicServer(EMsvBadMtmVersionNumber));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   662
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   663
			// Get filename
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   664
			mtmFilename.Set(reader.ReadTPtrC());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   665
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   666
		// Add component info
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   667
		CMtmDllInfo* mtmDllInfo = CMtmDllInfo::NewL(name, componentUidType, mtmFilename, entryPoint, version);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   668
		mtmDllInfo->SetMessagingCapability(capSend);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   669
		mtmDllInfo->SetSendBodyCapability(capBody);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   670
		mtmDllInfo->SetCapabilitiesAvailable(capAvailable);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   671
		mtmDllInfoArray->AddMtmDllInfoL(mtmDllInfo);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   672
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   673
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   674
	// Are there any components?
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   675
	if (mtmDllInfoArray->Count() == 0)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   676
		User::Leave(KErrNotFound);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   677
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   678
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   679
	// The resource file *must* contain a security capability set once __SUPPORT_MESSAGING_API_V1__ is no longer defined
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   680
	__ASSERT_DEBUG(file.OwnsResourceId(KMtmSecurityCapabilitySetResourceId), PanicServer(EMsvSecurityCapabilitySetResourceIsNotPresent));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   681
	HBufC8* securityResBuf = file.AllocReadLC(KMtmSecurityCapabilitySetResourceId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   682
	reader.SetBuffer(securityResBuf);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   683
	TCapabilitySet mtmRequiredCaps;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   684
	MsvSecurityCapabilitySetUtils::ReadFromResourceL(reader,mtmRequiredCaps);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   685
	CleanupStack::PopAndDestroy(securityResBuf);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   686
	CleanupStack::Pop(mtmDllInfoArray);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   687
	// Generate the group data - transfer ownership of mtmDllInfoArray and mtmRequiredCaps
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   688
	CMtmGroupData* mtmgroupdata = CMtmGroupData::NewL(mtmTypeUid, technologyTypeUid, mtmDllInfoArray, mtmRequiredCaps);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   689
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   690
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   691
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   692
	CleanupStack::PopAndDestroy(res);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   693
	CleanupStack::PopAndDestroy(&file);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   694
	return(mtmgroupdata);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   695
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   696
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   697
void CMtmRegistryControl::DoInstallMtmGroupL(const TDesC& aFullName,TUid& aMtmTypeUid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   698
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   699
	aMtmTypeUid=KNullUid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   700
	TUid uid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   701
	CMtmGroupData* mtmgroupdata = LoadMTMFileL(aFullName,uid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   702
	TInt index=MtmTypeUidToIndex(mtmgroupdata->MtmTypeUid());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   703
	if (index<iInstalledMtmGroupArray->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   704
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   705
		delete mtmgroupdata;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   706
		User::Leave(KErrAlreadyExists);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   707
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   708
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   709
	// The following takes ownership of the group data
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   710
	TUidType uidtype(KPermanentFileStoreLayoutUid, KUidMsvDataComponent, uid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   711
	CInstalledMtmGroup* installedmtmgroup=CInstalledMtmGroup::NewL(uidtype,mtmgroupdata,aFullName);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   712
	aMtmTypeUid=mtmgroupdata->MtmTypeUid();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   713
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   714
	// Install the Mtm
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   715
	AddInstalledMtmGroupL(installedmtmgroup);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   716
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   717
	//  Attempt to store registry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   718
	StoreRegistryL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   719
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   720
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   721
CMtmGroupData* CMtmRegistryControl::ReadDataFileStoreL(const TDesC& aFullName) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   722
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   723
	CFileStore* filestore = CPermanentFileStore::OpenLC(iFs,aFullName,EFileStream|EFileRead|EFileShareExclusive);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   724
	TStreamId streamid=filestore->Root();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   725
	RStoreReadStream readstream;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   726
	readstream.OpenLC(*filestore,streamid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   727
	CMtmGroupData* mtmgroupdata=CMtmGroupData::NewL(readstream);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   728
	CleanupStack::PopAndDestroy(2);	// readstream, filestore
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   729
	return mtmgroupdata;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   730
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   731
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   732
void CMtmRegistryControl::DoDeInstallMtmGroupL(TUid aMtmTypeUid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   733
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   734
	TInt index=MtmTypeUidToIndex(aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   735
	__ASSERT_DEBUG(index<iInstalledMtmGroupArray->Count(),PanicServer(EMtsrInstalledMtmGroupNotPresent));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   736
	__ASSERT_DEBUG(!IsInUse(aMtmTypeUid),PanicServer(EMtsrInstalledMtmGroupStillInUse));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   737
	CInstalledMtmGroup* installedmtmgroup=iInstalledMtmGroupArray->At(index);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   738
	installedmtmgroup->iIsInstalled=EFalse;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   739
	StoreRegistryL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   740
	RemoveInstalledMtmGroup(aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   741
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   742
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   743
void CMtmRegistryControl::DoInternalizeL(RReadStream& aStream)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   744
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   745
	iInstalledMtmGroupArray->ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   746
	iServerMtmDllRegistry.RemoveAllRegisteredMtmDlls();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   747
	TInt count=aStream.ReadInt32L();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   748
	for (TInt i=0; i<count; i++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   749
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   750
		HBufC *filename=HBufC::NewLC(aStream,KMaxFileName);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   751
		TUid uid=KNullUid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   752
		CMtmGroupData *mtmgroupdata=NULL;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   753
		TRAPD(error,mtmgroupdata=LoadMTMFileL(*filename,uid));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   754
		if(error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   755
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   756
			TUidType uidtype(KPermanentFileStoreLayoutUid, KUidMsvDataComponent, uid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   757
			CInstalledMtmGroup* installedmtmgroup=CInstalledMtmGroup::NewL(uidtype,mtmgroupdata,*filename);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   758
			AddInstalledMtmGroupL(installedmtmgroup);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   759
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   760
		else if(error!=KErrNotFound)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   761
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   762
			User::Leave(error);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   763
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   764
		CleanupStack::PopAndDestroy(filename);		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   765
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   766
	User::LeaveIfError(FillRegisteredMtmDllArray(iServerMtmDllRegistry.iMtmDllTypeUid,iServerMtmDllRegistry.iRegisteredMtmDllArray,iServerMtmDllRegistry.iTimeoutMicroSeconds32));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   767
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   768
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   769
void CMtmRegistryControl::AddInstalledMtmGroupL(CInstalledMtmGroup* aInstalledMtmGroup)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   770
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   771
	iInstalledMtmGroupArray->AddInstalledMtmGroupL(aInstalledMtmGroup);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   772
	CMtmDllInfo* mtmdllinfo=aInstalledMtmGroup->iMtmGroupData->MtmDllInfoArray()[EMtsrServerComponentIndex];
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   773
	if (mtmdllinfo->FileName().Length() > 0)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   774
		User::LeaveIfError(iServerMtmDllRegistry.AddRegisteredMtmDll(aInstalledMtmGroup->iMtmGroupData->MtmTypeUid(),aInstalledMtmGroup->iMtmGroupData->TechnologyTypeUid(),*mtmdllinfo,*this));	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   775
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   776
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   777
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   778
void CMtmRegistryControl::RemoveInstalledMtmGroup(TUid aMtmTypeUid)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   779
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   780
	TInt index=MtmTypeUidToIndex(aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   781
	if (index<iInstalledMtmGroupArray->Count())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   782
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   783
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   784
		delete iInstalledMtmGroupArray->At(index);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   785
		iInstalledMtmGroupArray->Delete(index);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   786
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   787
	if (iServerMtmDllRegistry.IsPresent(aMtmTypeUid))
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   788
		iServerMtmDllRegistry.RemoveRegisteredMtmDll(aMtmTypeUid);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   789
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   790
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   791