windowing/windowserverplugins/keyeventrouting/src/keyrouter.cpp
author hgs
Fri, 24 Sep 2010 16:44:34 +0300
changeset 188 1b081cb0800b
permissions -rw-r--r--
201026_1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
188
1b081cb0800b 201026_1
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
1b081cb0800b 201026_1
hgs
parents:
diff changeset
     2
// All rights reserved.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
1b081cb0800b 201026_1
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
1b081cb0800b 201026_1
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
1b081cb0800b 201026_1
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1b081cb0800b 201026_1
hgs
parents:
diff changeset
     7
//
1b081cb0800b 201026_1
hgs
parents:
diff changeset
     8
// Initial Contributors:
1b081cb0800b 201026_1
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    10
//
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    11
// Contributors:
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    12
//
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    13
// Description:
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    14
// Reference implementation of Key Event Routing plug-in
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    15
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    16
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    17
@file
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    18
@internalTechnology
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    19
@prototype
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    20
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    21
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    22
#include <e32cmn.h>
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    23
#include <e32debug.h>
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    24
#include "keyrouterimpl.h"
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    25
#include "keyaliases.h"
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    26
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    27
#ifdef KEYROUTER_TEST
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    28
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    29
Privileged application UIDs
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    30
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    31
const TInt KUidTAutoServer = 0x10205152;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    32
const TInt KUidReservedApp = 0x102872e3;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    33
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    34
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    35
Key Capture Translation Table
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    36
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    37
The following scan codes and key codes are translated at capture-request time.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    38
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    39
@note	The data in this table is for example/test purposes only.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    40
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    41
const TTranslationEntry KTranslations[] =
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    42
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    43
		// Entry for TEvent test case GRAPHICS-WSERV-0751.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    44
		// Capture requests for psuedo key Device0 are mapped to capture
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    45
		// the real key Device1.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    46
		// Req. scancode,	Capture scancode,	Req. keycode,	Capture keycode
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    47
		{ EStdKeyDevice0,	EStdKeyDevice1,		EKeyDevice0,	EKeyDevice1 }
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    48
	};
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    49
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    50
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    51
Restricted Key Table
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    52
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    53
The following keys may be captured only by the specified application.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    54
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    55
@note	The data in this table is for example/test purposes only.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    56
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    57
const TAppKeyEntry KRestrictedKeys[] =
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    58
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    59
		// Examples:
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    60
		// Only the Phone app is allowed to capture long End key events
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    61
		// { EKeyPhoneEnd,			ECaptureTypeLongKey,	KUidPhoneApp },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    62
		// Only the Home Screen app is allowed to capture short Apps key events
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    63
		// { EStdKeyApplication,	ECaptureTypeKeyUpDown,	KUidHomeScreenApp },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    64
		// { EKeyApplication,		ECaptureTypeKey,		KUidHomeScreenApp },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    65
		// Only SysApp is allowed to capture long Apps key events (for
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    66
		// launching the task switcher).
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    67
		// { EKeyApplication,		ECaptureTypeLongKey,	KUidSysApp },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    68
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    69
		// Test Case GRAPHICS-WSERV-0754. Only a reserved UID is allowed to
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    70
		// capture F20 key events.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    71
		{ EKeyF20,				ECaptureTypeKey,		KUidReservedApp },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    72
		{ EKeyF20,				ECaptureTypeLongKey,	KUidReservedApp },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    73
		{ EStdKeyF20,			ECaptureTypeKeyUpDown,	KUidReservedApp },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    74
		// Only TAuto tests are allowed to capture F21 key events
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    75
		{ EKeyF21,				ECaptureTypeKey,		KUidTAutoServer },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    76
		{ EKeyF21,				ECaptureTypeLongKey,	KUidTAutoServer },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    77
		{ EStdKeyF21,			ECaptureTypeKeyUpDown,	KUidTAutoServer }
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    78
	};
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    79
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    80
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    81
Priority Application Table
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    82
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    83
The following applications have priority over other applications for capture
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    84
of the specified key.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    85
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    86
@note	The data in this table is for example/test purposes only.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    87
		If a key should be never be delivered to any other application, then
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    88
		it should be placed in KRestrictedKeys[] instead.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    89
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    90
const TAppKeyEntry KPriorityAppKeys[] =
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    91
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    92
		// Example:
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    93
		// The Phone app has priority for capture of short Send and End
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    94
		// key events
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    95
		// { EStdKeyPhoneSend,	ECaptureTypeKeyUpDown,	KUidPhoneApp },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    96
		// { EKeyPhoneSend,		ECaptureTypeKey,		KUidPhoneApp },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    97
		// { EStdKeyPhoneEnd,	ECaptureTypeKeyUpDown,	KUidPhoneApp },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    98
		// { EKeyPhoneEnd,		ECaptureTypeKey,		KUidPhoneApp },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
    99
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   100
		// Test Case GRAPHICS-WSERV-0757. TAuto tests have priority for
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   101
		// capture of F22 key events.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   102
		{ EStdKeyF22,			ECaptureTypeKeyUpDown,	KUidTAutoServer },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   103
		{ EKeyF22,				ECaptureTypeKey,		KUidTAutoServer },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   104
		{ EKeyF22,				ECaptureTypeLongKey,	KUidTAutoServer }
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   105
	};
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   106
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   107
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   108
Blocked key table.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   109
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   110
The following keys are not routed by default.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   111
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   112
@note	The data in this table is for example/test purposes only.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   113
		Since long key events are never routed by default, there is no need
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   114
		to list them here.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   115
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   116
const TBlockedKeyEntry KBlockedKeys[] =
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   117
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   118
		// Entries for TEvent test case GRAPHICS-WSERV-0760
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   119
		{ EStdKeyDevice3,	ECaptureTypeKeyUpDown },
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   120
		{ EKeyDevice3,		ECaptureTypeKey }
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   121
	};
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   122
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   123
const TInt KNumTranslations = TABLE_SIZE(KTranslations);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   124
const TInt KNumRestrictedKeys = TABLE_SIZE(KRestrictedKeys);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   125
const TInt KNumPriorityAppKeys = TABLE_SIZE(KPriorityAppKeys);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   126
const TInt KNumBlockedKeys = TABLE_SIZE(KBlockedKeys);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   127
#endif // KEYROUTER_TEST
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   128
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   129
const TInt KCaptureKeyArrayGranularity = 5;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   130
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   131
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   132
Create and return an instance of CKeyEventRouter
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   133
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   134
@return	Pointer to new router instance
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   135
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   136
EXPORT_C CKeyEventRouter* CKeyEventRouter::NewL()
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   137
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   138
	return new(ELeave) CKeyEventRouterImpl;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   139
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   140
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   141
CKeyEventRouterImpl::CKeyEventRouterImpl()
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   142
: iCaptureKeys(KCaptureKeyArrayGranularity, _FOFF(TKeyCaptureRequest, iHandle))
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   143
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   144
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   145
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   146
CKeyEventRouterImpl::~CKeyEventRouterImpl()
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   147
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   148
	iCaptureKeys.Close();
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   149
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   150
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   151
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   152
Add a new key capture request
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   153
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   154
@param	aRequest	Capture request details
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   155
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   156
@see CKeyEventRouter::AddCaptureKeyL
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   157
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   158
void CKeyEventRouterImpl::AddCaptureKeyL(const TKeyCaptureRequest& aRequest)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   159
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   160
	CheckCaptureKeyL(aRequest);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   161
	iCaptureKeys.InsertL(aRequest, 0);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   162
#ifdef KEYROUTER_TEST
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   163
	TranslateCaptureKey(aRequest.iType, iCaptureKeys[0].iInputCode);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   164
#endif
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   165
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   166
   
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   167
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   168
Update an existing key capture request
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   169
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   170
@param	aRequest	Updated capture request details
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   171
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   172
@see CKeyEventRouter::UpdateCaptureKeyL
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   173
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   174
void CKeyEventRouterImpl::UpdateCaptureKeyL(const TKeyCaptureRequest& aRequest)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   175
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   176
	CheckCaptureKeyL(aRequest);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   177
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   178
	TInt index = iCaptureKeys.Find(aRequest);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   179
	ASSERT(index != KErrNotFound);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   180
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   181
	if (index != KErrNotFound)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   182
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   183
		iCaptureKeys[index] = aRequest;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   184
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   185
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   186
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   187
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   188
Cancel a key capture request
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   189
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   190
@param	aType		Capture type
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   191
@param	aHandle		Opaque handle of request to be cancelled
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   192
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   193
@see CKeyEventRouter::CancelCaptureKey
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   194
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   195
Note: aType is unused in this implementation, but is present to permit
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   196
implementations that use separate lists for each of the three capture types.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   197
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   198
void CKeyEventRouterImpl::CancelCaptureKey(TKeyCaptureType /*aType*/, TAny* aHandle)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   199
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   200
	TKeyCaptureRequest request;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   201
	request.iHandle = aHandle;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   202
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   203
	TInt index = iCaptureKeys.Find(request);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   204
	if (index != KErrNotFound)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   205
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   206
		iCaptureKeys.Remove(index);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   207
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   208
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   209
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   210
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   211
Route the key event described by aInput and return its destination in iOutput
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   212
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   213
@param	aInput		Input data with key event to be routed
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   214
@param	aOutput		Output key event and routing results
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   215
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   216
@see CKeyEventRouter::RouteKey
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   217
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   218
void CKeyEventRouterImpl::RouteKey(const TKeyEventRouterInput& aInput, TKeyEventRouterOutput& aOutput)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   219
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   220
	TUint inputCode = (aInput.iType == ECaptureTypeKeyUpDown) ?
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   221
						aInput.iKeyEvent.iScanCode : aInput.iKeyEvent.iCode;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   222
#ifdef KEYROUTER_TEST
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   223
	TInt priUid = PriorityAppUid(aInput.iType, inputCode);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   224
#endif
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   225
	TInt priority = KMinTInt;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   226
	TInt captureCount = iCaptureKeys.Count();
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   227
	TKeyCaptureRequest* matchRequest = NULL;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   228
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   229
	// Find the highest priority matching capture request. If there are
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   230
	// multiple entries with the same priority then use the first one, i.e.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   231
	// the most recent request. Capture priorities are overridden if a
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   232
	// particular application has precedence for capture of the key.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   233
	for (TInt index = 0; index < captureCount; index++)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   234
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   235
		TKeyCaptureRequest& request = iCaptureKeys[index];
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   236
		if (request.iType == aInput.iType &&
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   237
			request.iInputCode == inputCode &&
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   238
		    (aInput.iKeyEvent.iModifiers & request.iModifierMask) == request.iModifiers &&
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   239
			(request.iPriority > priority
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   240
#ifdef KEYROUTER_TEST
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   241
			 || priUid != 0 && request.iAppUid.iUid == priUid
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   242
#endif
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   243
			 ))
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   244
			{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   245
			matchRequest = &request;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   246
#ifdef KEYROUTER_TEST
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   247
			if (priUid != 0 && request.iAppUid.iUid == priUid)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   248
				{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   249
				break;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   250
				}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   251
#endif
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   252
			priority = request.iPriority;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   253
			}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   254
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   255
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   256
	if (matchRequest)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   257
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   258
		// Found matching capture request. Route the key event to the window
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   259
		// group that made the capture request.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   260
		aOutput.iWindowGroup = matchRequest->iWindowGroup;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   261
		if (aInput.iType == ECaptureTypeKeyUpDown)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   262
			{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   263
			aOutput.iKeyEvent.iScanCode = matchRequest->iOutputCode;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   264
			aOutput.iKeyEvent.iCode = aInput.iKeyEvent.iCode;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   265
			}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   266
		else
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   267
			{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   268
			aOutput.iKeyEvent.iScanCode = aInput.iKeyEvent.iScanCode;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   269
			aOutput.iKeyEvent.iCode = matchRequest->iOutputCode;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   270
			}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   271
		aOutput.iKeyEvent.iModifiers = aInput.iKeyEvent.iModifiers;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   272
		aOutput.iCaptureHandle = matchRequest->iHandle;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   273
		aOutput.iResult = ECaptured;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   274
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   275
#ifdef KEYROUTER_TEST
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   276
	else if (IsKeyBlocked(aInput.iType, inputCode))
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   277
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   278
		// No matching capture request and key is blocked. Do not route.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   279
		aOutput.iResult = EConsumed;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   280
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   281
#endif
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   282
	else
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   283
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   284
		// No matching capture request. Route the key event to the current
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   285
		// focussed window group.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   286
		aOutput.iWindowGroup = aInput.iFocusWindowGroup;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   287
		aOutput.iKeyEvent = aInput.iKeyEvent;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   288
		aOutput.iCaptureHandle = NULL;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   289
		aOutput.iResult = ERouted;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   290
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   291
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   292
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   293
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   294
Check that capture request arguments are sane and capture is allowed
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   295
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   296
@param	aRequest	Capture request details
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   297
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   298
@leave	KErrArgument if modifier state contains bits that are not in the
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   299
		modifier mask or modifier mask contains EModifierLongKey or priority
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   300
		is KMinTInt.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   301
		KErrPermissionDenied if key is restricted to capture by a specific
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   302
		application UID and the UID of the requesting app does not match.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   303
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   304
@note	Requests with a priority of KMinTint would never be captured: this was
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   305
		also true of the previous implementation in ektran.dll but was ignored.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   306
		Client code must use the appropriate API function to capture short or
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   307
		long key events, so including EModifierLongKey in the modifier mask is
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   308
		not allowed. (Hotkeys are excepted since a mask of 0xffffffff is used
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   309
		to disable them).
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   310
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   311
void CKeyEventRouterImpl::CheckCaptureKeyL(const TKeyCaptureRequest& aRequest)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   312
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   313
	if ((aRequest.iModifiers & ~aRequest.iModifierMask) != 0 ||
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   314
		(aRequest.iModifierMask & EModifierLongKey) != 0 && aRequest.iWindowGroup != NULL ||
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   315
		aRequest.iPriority == KMinTInt)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   316
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   317
		User::Leave(KErrArgument);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   318
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   319
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   320
#ifdef KEYROUTER_TEST
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   321
	if (aRequest.iWindowGroup != NULL && IsRestrictedKey(aRequest))
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   322
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   323
		User::Leave(KErrPermissionDenied);
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   324
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   325
#endif
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   326
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   327
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   328
#ifdef KEYROUTER_TEST
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   329
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   330
Check if the requested key capture is restricted by application UID
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   331
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   332
@param	aRequest	Capture request details
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   333
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   334
@return	ETrue if key is restricted and requesting UID does not match,
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   335
		otherwise EFalse.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   336
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   337
TBool CKeyEventRouterImpl::IsRestrictedKey(const TKeyCaptureRequest& aRequest)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   338
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   339
	for (const TAppKeyEntry* entry = KRestrictedKeys; entry < &KRestrictedKeys[KNumRestrictedKeys]; entry++)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   340
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   341
		if (entry->iCode == aRequest.iInputCode &&
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   342
			entry->iType == aRequest.iType &&
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   343
			entry->iAppUidValue != aRequest.iAppUid.iUid)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   344
			{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   345
			return ETrue;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   346
			}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   347
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   348
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   349
		return EFalse;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   350
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   351
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   352
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   353
Return the UID of the application with priority for capture of the specified
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   354
key.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   355
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   356
@param	aType	Key capture type
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   357
@param	aCode	Key code or scan code
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   358
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   359
@return	UID3 of the privileged application or zero if none.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   360
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   361
TInt CKeyEventRouterImpl::PriorityAppUid(TKeyCaptureType aType, TUint aCode)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   362
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   363
	for (const TAppKeyEntry* entry = KPriorityAppKeys; entry < &KPriorityAppKeys[KNumPriorityAppKeys]; entry++)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   364
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   365
		if (entry->iCode == aCode && entry->iType == aType)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   366
			{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   367
			return entry->iAppUidValue;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   368
			}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   369
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   370
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   371
		return 0;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   372
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   373
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   374
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   375
Check if the specified key is blocked from default routing
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   376
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   377
@param	aType		Key capture type
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   378
@param	aCode		Scan code or key code
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   379
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   380
@return	ETrue if key is blocked, otherwise EFalse.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   381
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   382
TBool CKeyEventRouterImpl::IsKeyBlocked(TKeyCaptureType aType, TUint aCode)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   383
	{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   384
	for (const TBlockedKeyEntry* entry = KBlockedKeys; entry < &KBlockedKeys[KNumBlockedKeys]; entry++)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   385
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   386
		if (entry->iCode == aCode && entry->iType == aType)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   387
			{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   388
			return ETrue;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   389
			}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   390
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   391
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   392
		return EFalse;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   393
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   394
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   395
/**
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   396
Translate the scan or key code of a capture request
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   397
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   398
@param	aType	Key capture type
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   399
@param	aCode	Key code or scan code, updated to translated value (if any)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   400
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   401
@note	This function is used to translate the input key or scan code of a
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   402
		capture request on addition to the capture list. When a key event that
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   403
		matches the list entry is routed, the output code will be taken from
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   404
		TKeyCaptureRequest.iOutputCode and hence automatically translated again
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   405
		(typically back to the original input code of the request, unless the
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   406
		input and output codes were different). For example, a request to
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   407
		capture key code A will be translated to key code B in the capture list.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   408
		When RouteKey() processes an event with key code B and selects that
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   409
		list entry, it will output key code A for delivery to the application.
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   410
*/
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   411
void CKeyEventRouterImpl::TranslateCaptureKey(TKeyCaptureType aType, TUint& aCode)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   412
{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   413
	for (const TTranslationEntry* entry = KTranslations; entry < &KTranslations[KNumTranslations]; entry++)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   414
		{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   415
		if (aType == ECaptureTypeKeyUpDown)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   416
			{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   417
			if (aCode == entry->iRequestScanCode)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   418
				{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   419
				aCode = entry->iCaptureScanCode;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   420
				}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   421
			}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   422
		else
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   423
			{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   424
			if (aCode == entry->iRequestKeyCode)
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   425
				{
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   426
				aCode = entry->iCaptureKeyCode;
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   427
				}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   428
			}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   429
		}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   430
	}
1b081cb0800b 201026_1
hgs
parents:
diff changeset
   431
#endif // KEYROUTER_TEST