coreapplicationuis/SysAp/Src/SysApTaskList.cpp
author hgs
Tue, 29 Jun 2010 10:40:11 +0300
changeset 46 eea20ed08f4b
permissions -rw-r--r--
201025_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
     1
/*
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
     3
* All rights reserved.
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
     8
*
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
     9
* Initial Contributors:
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    11
*
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    12
* Contributors:
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    13
*
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    14
* Description:
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    15
*
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    16
*/
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    17
#include "SysApTaskList.h"
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    18
#include <apgwgnam.h>
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    19
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    20
CSysApTaskList* CSysApTaskList::NewL(RWsSession& aWsSession)
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    21
	{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    22
	CSysApTaskList* self = NewLC(aWsSession);
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    23
	CleanupStack::Pop(self);
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    24
	return self;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    25
	}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    26
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    27
 CSysApTaskList* CSysApTaskList::NewLC(RWsSession& aWsSession)
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    28
	{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    29
	CSysApTaskList* self = new(ELeave) CSysApTaskList(aWsSession);
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    30
	CleanupStack::PushL(self);
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    31
	self->ConstructL();
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    32
	return self;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    33
	}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    34
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    35
CSysApTaskList::CSysApTaskList(RWsSession& aWsSession)
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    36
: iWs(aWsSession)
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    37
	{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    38
	}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    39
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    40
void CSysApTaskList::ConstructL()
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    41
	{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    42
	UpdateListL();
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    43
	}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    44
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    45
 CSysApTaskList::~CSysApTaskList()
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    46
	{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    47
	iWgs.Close();
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    48
	}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    49
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    50
 void CSysApTaskList::UpdateListL()
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    51
	{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    52
	User::LeaveIfError(iWs.WindowGroupList(0, &iWgs));
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    53
	}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    54
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    55
 const RArray<RWsSession::TWindowGroupChainInfo>& CSysApTaskList::WgArray() const
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    56
	{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    57
	return iWgs;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    58
	}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    59
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    60
 TApaTask CSysApTaskList::FindRootApp(TUid aAppUid) const
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    61
	{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    62
	TApaTask task(iWs);
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    63
	task.SetWgId(0);		// initialise task to non-existant task
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    64
	// wgId = 0 tells FindAppByUid to start looking for apps
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    65
	TInt wgId=0;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    66
	FOREVER
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    67
		{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    68
	 	CApaWindowGroupName::FindByAppUid(aAppUid, iWs, wgId);
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    69
	 	// KErrNotFound means that no more apps can be found
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    70
	 	if (wgId == KErrNotFound)
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    71
	 		break;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    72
	 	if (IsRootWindowGroup(wgId))
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    73
	 		{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    74
	 		// Found a root wg with the right app UID, return it.
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    75
	 		task.SetWgId(wgId);
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    76
	 		break;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    77
	 		}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    78
		}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    79
	return task;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    80
	}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    81
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    82
 TBool CSysApTaskList::IsRootWindowGroup(TInt aWgId) const
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    83
	{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    84
	TInt count = iWgs.Count();
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    85
	for (TInt ii=0; ii<count; ii++)
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    86
		{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    87
        const RWsSession::TWindowGroupChainInfo& info = iWgs[ii];
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    88
        // find the window group id and check that it has no parent
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    89
        if (info.iId == aWgId)
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    90
        	return (info.iParentId <= 0);
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    91
		}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    92
	return EFalse;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    93
	}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    94
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    95
 TInt CSysApTaskList::FindParentWgId(TInt aWgId) const
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    96
	{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    97
	TInt count = iWgs.Count();
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    98
	for (TInt ii=0; ii<count; ii++)
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
    99
		{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   100
        const RWsSession::TWindowGroupChainInfo& info = iWgs[ii];
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   101
        if (info.iId == aWgId && info.iParentId > 0 && info.iParentId != info.iId)
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   102
        	return info.iParentId;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   103
		}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   104
	return 0;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   105
	}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   106
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   107
 TInt CSysApTaskList::FindChildWgId(TInt aWgId) const
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   108
	{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   109
	TInt count = iWgs.Count();
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   110
	for (TInt ii=0; ii<count; ii++)
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   111
		{
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   112
        const RWsSession::TWindowGroupChainInfo& info = iWgs[ii];
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   113
        if (info.iParentId == aWgId && info.iId > 0 && info.iParentId != info.iId)
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   114
        	return info.iId;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   115
		}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   116
	return 0;
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   117
	}
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   118
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   119
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   120
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   121
eea20ed08f4b 201025_02
hgs
parents:
diff changeset
   122