mmlibs/mmutilitylib/src/MmPluginUtils.cpp
author hgs
Tue, 02 Nov 2010 12:28:51 +0000
changeset 6 fe9d1bf55678
parent 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk46_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     1
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
// MmPluginUtils.cpp
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
// All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
// This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
// under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
// which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
// Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
// Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
// Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
// Description:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
#include <mm/mmpluginutils.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
#include <mm/mmcleanup.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
// MmPluginUtils
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
Find a plugin with the requested interfaceUid and whose match string matches
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
the default data field. Where there are more than one plugin, choose that
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
with highest version no.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
EXPORT_C TAny* MmPluginUtils::CreateImplementationL(TUid aInterfaceUid, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
									                TInt32 aKeyOffset, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
									                const TDesC8& aDefaultData,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
									                TUid aResolverUid)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
	RImplInfoPtrArray pluginArray;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
	CleanupResetAndDestroyPushL(pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
	FindImplementationsL(aInterfaceUid, pluginArray, aDefaultData, aResolverUid);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
	// Get higher version implementation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
	TAny* higherversionplugin = GetHigherVersionImplementationKeyOffsetL(pluginArray,aKeyOffset);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
	CleanupStack::PopAndDestroy(&pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
	return higherversionplugin;	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
Find a plugin with the requested interfaceUid and whose match string matches
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
the default data field. Where there are more than one plugin, choose that
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
with highest version no.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
EXPORT_C TAny* MmPluginUtils::CreateImplementationL(TUid aInterfaceUid, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
									                TInt32 aKeyOffset, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
									                const TDesC8& aDefaultData)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
	RImplInfoPtrArray pluginArray;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
	CleanupResetAndDestroyPushL(pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
	FindImplementationsL(aInterfaceUid, pluginArray, aDefaultData);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
	// Get higher version implementation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
	TAny* higherversionplugin = GetHigherVersionImplementationKeyOffsetL(pluginArray,aKeyOffset);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
	CleanupStack::PopAndDestroy(&pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
	return higherversionplugin;	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
Find a plugin with the requested interfaceUid and whose match string matches
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
the default data field. Where there are more than one plugin, choose that
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
with highest version no.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
EXPORT_C TAny* MmPluginUtils::CreateImplementationL(TUid aInterfaceUid, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
									                TInt32 aKeyOffset)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
	RImplInfoPtrArray pluginArray;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
	CleanupResetAndDestroyPushL(pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
	FindImplementationsL(aInterfaceUid, pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
	// Get higher version implementation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
	TAny* higherversionplugin = GetHigherVersionImplementationKeyOffsetL(pluginArray,aKeyOffset);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
	CleanupStack::PopAndDestroy(&pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
	return higherversionplugin;	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
Get the higher version of plugin passing keyoffset
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
TAny* MmPluginUtils::GetHigherVersionImplementationKeyOffsetL(RImplInfoPtrArray& pluginArray, TInt32 aKeyOffset)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
	TAny* self = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
	if (pluginArray.Count() == 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
		User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
	else if (pluginArray.Count() == 1)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
    	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
		self = REComSession::CreateImplementationL(pluginArray[0]->ImplementationUid(), aKeyOffset);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
    	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
	else 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
		// create each in turn, starting with the highest version, which is the start element
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
		for (TInt index = 0;  index < pluginArray.Count(); index++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
			TInt err=KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
			self = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
			TRAP(err, self = REComSession::CreateImplementationL(pluginArray[index]->ImplementationUid(), aKeyOffset))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
			if (err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
		    	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
		    	break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
		    	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
			if (err != KErrNotSupported)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
				User::Leave(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
		if (!self)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
			User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
	return self;		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
Similar but return destructor key via reference
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
EXPORT_C TAny* MmPluginUtils::CreateImplementationL(TUid aInterfaceUid, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
									                TUid& aDestructorKey,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
									                const TDesC8& aDefaultData,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
									                TUid aResolverUid)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
	RImplInfoPtrArray pluginArray;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
	CleanupResetAndDestroyPushL(pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
	FindImplementationsL(aInterfaceUid, pluginArray, aDefaultData, aResolverUid);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
    // Get higher version implementation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
    TAny* higherversionplugin = GetHigherVersionImplementationaDestructorKeyL(pluginArray, aDestructorKey);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
	CleanupStack::PopAndDestroy(&pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
	return higherversionplugin;	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
Similar but return destructor key via reference
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
EXPORT_C TAny* MmPluginUtils::CreateImplementationL(TUid aInterfaceUid, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
									                TUid& aDestructorKey,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
									                const TDesC8& aDefaultData)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
	RImplInfoPtrArray pluginArray;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
	CleanupResetAndDestroyPushL(pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
	FindImplementationsL(aInterfaceUid, pluginArray, aDefaultData);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
	// Get higher version implementation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
    TAny* higherversionplugin = GetHigherVersionImplementationaDestructorKeyL(pluginArray, aDestructorKey);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
	CleanupStack::PopAndDestroy(&pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
	return higherversionplugin;	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
Similar but return destructor key via reference
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
EXPORT_C TAny* MmPluginUtils::CreateImplementationL(TUid aInterfaceUid, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
									                TUid& aDestructorKey)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
	RImplInfoPtrArray pluginArray;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
	CleanupResetAndDestroyPushL(pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
	FindImplementationsL(aInterfaceUid, pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
	// Get higher version implementation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
    TAny* higherversionplugin = GetHigherVersionImplementationaDestructorKeyL(pluginArray, aDestructorKey);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
	CleanupStack::PopAndDestroy(&pluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
	return higherversionplugin;	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
Get the higher version of plugin passing destructorkey
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
TAny* MmPluginUtils::GetHigherVersionImplementationaDestructorKeyL(RImplInfoPtrArray& pluginArray, TUid& aDestructorKey)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
	TAny* self = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
	if (pluginArray.Count() == 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
		User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
	else if (pluginArray.Count() == 1)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
    	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
		self = REComSession::CreateImplementationL(pluginArray[0]->ImplementationUid(), aDestructorKey);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
    	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
	else 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
		// create each in turn, starting with the highest version, which is the start element
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
		for (TInt index = 0;  index < pluginArray.Count(); index++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
			TInt err = KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
			self = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
			TRAP(err, self = REComSession::CreateImplementationL(pluginArray[index]->ImplementationUid(), aDestructorKey))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
		    if (err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
		    	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   211
		    	break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   212
		    	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   213
			if (err != KErrNotSupported)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   214
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
				User::Leave(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
		if (!self)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
			User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
	return self;		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
The function is an implementation of the templated TLinearOrder so it can order implementation information
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
in an increasing version number.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
TInt VersionLinearOrderFunction(const CImplementationInformation& pluginA, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
                                const CImplementationInformation& pluginB)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
	if (pluginA.Version() == pluginB.Version())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
		return 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
	return (pluginA.Version() < pluginB.Version())? 1: -1;	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
EXPORT_C void MmPluginUtils::FindImplementationsL(TUid aInterfaceUid, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
						                RImplInfoPtrArray& aPluginArray)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
	REComSession::ListImplementationsL(aInterfaceUid, aPluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
	CheckAndSortL(aPluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
EXPORT_C void MmPluginUtils::FindImplementationsL(TUid aInterfaceUid, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
						                RImplInfoPtrArray& aPluginArray, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
				                        const TDesC8& aDefaultData,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
						                TUid aResolverUid)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
	TEComResolverParams resolverParams;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
	resolverParams.SetDataType(aDefaultData);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
	FindImplementationsL(aInterfaceUid, aPluginArray, resolverParams, aResolverUid);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
EXPORT_C void MmPluginUtils::FindImplementationsL(TUid aInterfaceUid, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
						                RImplInfoPtrArray& aPluginArray, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
				                        const TDesC8& aDefaultData)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
	TEComResolverParams resolverParams;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
	resolverParams.SetDataType(aDefaultData);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
	FindImplementationsL(aInterfaceUid, aPluginArray, resolverParams);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
void MmPluginUtils::FindImplementationsL(TUid aInterfaceUid, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
						                RImplInfoPtrArray& aPluginArray, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
				                        TEComResolverParams& aResolverParams)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   274
	REComSession::ListImplementationsL(aInterfaceUid, aResolverParams, aPluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   275
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   276
	CheckAndSortL(aPluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   277
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
void MmPluginUtils::FindImplementationsL(TUid aInterfaceUid, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
						                RImplInfoPtrArray& aPluginArray, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
				                        TEComResolverParams& aResolverParams,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
						                TUid aResolverUid)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   284
	REComSession::ListImplementationsL(aInterfaceUid, aResolverParams, aResolverUid, aPluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   285
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   286
	CheckAndSortL(aPluginArray);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   287
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   288
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   289
void MmPluginUtils::CheckAndSortL(RImplInfoPtrArray& aPluginArray)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   290
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   291
	// there must be at least one implementation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   292
	if (aPluginArray.Count() > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   293
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   294
		if (aPluginArray.Count() > 1)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   295
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   296
			aPluginArray.Sort(VersionLinearOrderFunction);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   297
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   298
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   299
		// if the highest version is zero there is no need to linger -- it should not be supported
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   300
		// and we will leave
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   301
		if (aPluginArray[0]->Version() == 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   302
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   303
			// plugins were found to be malformed, with 0 version numbers
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   304
			User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   305
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   306
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   307
	}