accessoryservices/remotecontrolfw/server/inc/targetclientprocess.h
author hgs
Fri, 08 Oct 2010 14:33:25 +0300
changeset 76 cb32bcc88bad
parent 70 653a8b91b95e
permissions -rw-r--r--
201039
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
70
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     2
// All rights reserved.
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     7
//
hgs
parents:
diff changeset
     8
// Initial Contributors:
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    10
//
hgs
parents:
diff changeset
    11
// Contributors:
hgs
parents:
diff changeset
    12
//
hgs
parents:
diff changeset
    13
// Description:
hgs
parents:
diff changeset
    14
// Server-side representation of a target client, which may have multiple 
hgs
parents:
diff changeset
    15
// sessions associated with it.
hgs
parents:
diff changeset
    16
// 
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
/**
hgs
parents:
diff changeset
    19
 @file
hgs
parents:
diff changeset
    20
 @internalComponent
hgs
parents:
diff changeset
    21
*/
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
#ifndef TARGETCLIENTPROCESS_H
hgs
parents:
diff changeset
    24
#define TARGETCLIENTPROCESS_H
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include <e32base.h>
hgs
parents:
diff changeset
    27
#include <remcon/clientinfo.h>
hgs
parents:
diff changeset
    28
#include <remcon/clientid.h>
hgs
parents:
diff changeset
    29
#include <remcon/playertype.h>
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
#include "messagesendobserver.h"
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
/**
hgs
parents:
diff changeset
    35
The maximum number of target sessions permitted for a single client process
hgs
parents:
diff changeset
    36
*/
hgs
parents:
diff changeset
    37
const TUint KMaxNumberTargetSessions = 2;
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
class CRemConServer;
hgs
parents:
diff changeset
    40
class CBearerManager;
hgs
parents:
diff changeset
    41
class CRemConTargetSession;
hgs
parents:
diff changeset
    42
class CRemConInterfaceDetails;
hgs
parents:
diff changeset
    43
class CRemConMessage;
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
/**
hgs
parents:
diff changeset
    46
Represents a target client process and manages that clients sessions.
hgs
parents:
diff changeset
    47
*/
hgs
parents:
diff changeset
    48
NONSHARABLE_CLASS(CRemConTargetClientProcess) : public CBase, public MRemConMessageSendObserver
hgs
parents:
diff changeset
    49
	{
hgs
parents:
diff changeset
    50
public:
hgs
parents:
diff changeset
    51
	static CRemConTargetClientProcess* NewLC(TClientInfo& aClientInfo, TRemConClientId aClientId, CRemConServer& aServer, CBearerManager& aBearerManager);
hgs
parents:
diff changeset
    52
	~CRemConTargetClientProcess();
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
	/**
hgs
parents:
diff changeset
    55
	Returns the unique client ID for this client.
hgs
parents:
diff changeset
    56
	@return The client ID.
hgs
parents:
diff changeset
    57
	*/
hgs
parents:
diff changeset
    58
	inline TRemConClientId Id() const;
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
	/**
hgs
parents:
diff changeset
    61
	Returns a description of the client represented by this CRemConTargetClientProcess instance.
hgs
parents:
diff changeset
    62
	@return A TClientInfo instance describing the client.
hgs
parents:
diff changeset
    63
	*/
hgs
parents:
diff changeset
    64
	inline TClientInfo& ClientInfo();
hgs
parents:
diff changeset
    65
	inline const TClientInfo& ClientInfo() const;
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
	/**
hgs
parents:
diff changeset
    68
	Indicates whether or not this CRemConTargetClientProcess represents a client described by a given TClientInfo instance.
hgs
parents:
diff changeset
    69
	@param aClientInfo The TClientInfo instance describing the client.
hgs
parents:
diff changeset
    70
	@return ETrue if the client described by aClientInfo is that represented by this CRemConTargetClientProcess instance.
hgs
parents:
diff changeset
    71
	*/
hgs
parents:
diff changeset
    72
	inline TBool IsClient(const TClientInfo& aClientInfo) const;
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
	/**
hgs
parents:
diff changeset
    75
	Indicates whether or not this client has been registered as available with the server.
hgs
parents:
diff changeset
    76
	@return ETrue if this client has been marked as available.
hgs
parents:
diff changeset
    77
	*/
hgs
parents:
diff changeset
    78
	inline TBool ClientAvailable() const;
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
	/**
hgs
parents:
diff changeset
    81
	Creates a new target session for the client with a given unique session ID.
hgs
parents:
diff changeset
    82
	If the client already has KMaxNumberTargetSessions sessions open, then this will leave with KErrOverflow.
hgs
parents:
diff changeset
    83
	@param aSessionId The session ID for the new session.
hgs
parents:
diff changeset
    84
	*/
hgs
parents:
diff changeset
    85
	CRemConTargetSession* NewSessionL(TUint aSessionId);
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
	/**
hgs
parents:
diff changeset
    88
	Called by CRemConTargetSession to provide notification of the opening of a new session.
hgs
parents:
diff changeset
    89
	@param aSession The CRemConTargetSession that is opening.
hgs
parents:
diff changeset
    90
	@return KErrNone on success, otherwise one of the other system-wide error codes.
hgs
parents:
diff changeset
    91
	*/
hgs
parents:
diff changeset
    92
	TInt TargetSessionOpened(CRemConTargetSession& aSession);
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
	/**
hgs
parents:
diff changeset
    95
	Called by CRemConTargetSession to provide notificaton of session closure.
hgs
parents:
diff changeset
    96
	@param aSession The CRemConTargetSession that is closing.
hgs
parents:
diff changeset
    97
	*/
hgs
parents:
diff changeset
    98
	void TargetSessionClosed(CRemConTargetSession& aSession);
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
	/**
hgs
parents:
diff changeset
   101
	Returns the number of target sessions currently open on this client.
hgs
parents:
diff changeset
   102
	@return The number of open target sessions.
hgs
parents:
diff changeset
   103
	*/
hgs
parents:
diff changeset
   104
	inline TInt TargetSessionCount() const;
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
	/**
hgs
parents:
diff changeset
   107
	Sets the player information for this client.
hgs
parents:
diff changeset
   108
	This information can only be set once for the client.
hgs
parents:
diff changeset
   109
	@param aPlayerType The player type.
hgs
parents:
diff changeset
   110
	@param aPlayerName The player name.
hgs
parents:
diff changeset
   111
	*/
hgs
parents:
diff changeset
   112
	void SetPlayerInformationL(const TPlayerTypeInformation& aPlayerType, const TDesC8& aPlayerName);
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
	/**
hgs
parents:
diff changeset
   115
	Indicates whether or not player information has been set for this client.
hgs
parents:
diff changeset
   116
	@return ETrue if player information has been set.
hgs
parents:
diff changeset
   117
	*/
hgs
parents:
diff changeset
   118
	inline TBool HasPlayerInformation() const;
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
	/**
hgs
parents:
diff changeset
   121
	Returns the player type set for this client.
hgs
parents:
diff changeset
   122
	This is only valid if HasPlayerInformation() returns ETrue.
hgs
parents:
diff changeset
   123
	@return The player type.
hgs
parents:
diff changeset
   124
	*/
hgs
parents:
diff changeset
   125
	inline TPlayerType PlayerType() const;
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
	/**
hgs
parents:
diff changeset
   128
	Returns the player subtype set for this client.
hgs
parents:
diff changeset
   129
	This is only valid if HasPlayerInformation() returns ETrue.
hgs
parents:
diff changeset
   130
	@return The player subtype.
hgs
parents:
diff changeset
   131
	*/
hgs
parents:
diff changeset
   132
	inline TPlayerSubType PlayerSubType() const;
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
	/**
hgs
parents:
diff changeset
   135
	Returns the player name set for this client.
hgs
parents:
diff changeset
   136
	This is only valid if HasPlayerInformation() returns ETrue.
hgs
parents:
diff changeset
   137
	@return The player name.
hgs
parents:
diff changeset
   138
	*/
hgs
parents:
diff changeset
   139
	inline const TDesC8& Name() const;
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
	/**
hgs
parents:
diff changeset
   142
	Indicates whether or not the given player information matches that set for this client.
hgs
parents:
diff changeset
   143
	This is only valid if HasPlayerInformation() returns ETrue.
hgs
parents:
diff changeset
   144
	@return ETrue if the player information matches.
hgs
parents:
diff changeset
   145
	*/
hgs
parents:
diff changeset
   146
	inline TBool PlayerInformationMatches(const TPlayerTypeInformation& aPlayerType, const TDesC8& aPlayerName) const;
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
	/**
hgs
parents:
diff changeset
   149
	Called by CRemConTargetSession to provide notification that the session has registered a new interface.
hgs
parents:
diff changeset
   150
	@param aSession The CRemConTargetSession that has registered the new interface.
hgs
parents:
diff changeset
   151
	*/
hgs
parents:
diff changeset
   152
	void InterfacesRegistered();
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
	/**
hgs
parents:
diff changeset
   155
	Determines whether or not an interface of the same type as that given has already been registered
hgs
parents:
diff changeset
   156
	in a session owned by this client, other than the given session.
hgs
parents:
diff changeset
   157
	@param aSession The target session to exclude from the interface search.
hgs
parents:
diff changeset
   158
	@param aInterface The interface type to test for.
hgs
parents:
diff changeset
   159
	@return Whether or not a registered interface of this type exists for the client.
hgs
parents:
diff changeset
   160
	**/
hgs
parents:
diff changeset
   161
	TBool IsInterfaceTypeRegisteredByAnotherSession(CRemConTargetSession& aSession, TUid aInterfaceUid) const;
hgs
parents:
diff changeset
   162
	
hgs
parents:
diff changeset
   163
	/**
hgs
parents:
diff changeset
   164
	Called by CRemConServer when a message has been received for this client.
hgs
parents:
diff changeset
   165
	The client will attempt to deliver the message to the appropriate session. If no session
hgs
parents:
diff changeset
   166
	supports the message, KErrArgument is returned. Otherwise, if the supporting session is
hgs
parents:
diff changeset
   167
	not ready to receive the message, KErrNotReady is returned. Any other error code is returned
hgs
parents:
diff changeset
   168
	by the session as it processes the message.
hgs
parents:
diff changeset
   169
	@param aMessage The message for this client.
hgs
parents:
diff changeset
   170
	@return KErrArgument if no session supports this message, KErrNotReady if the message cannot be handled yet, or an error
hgs
parents:
diff changeset
   171
	code returned by the session as it processes the message.
hgs
parents:
diff changeset
   172
	*/
hgs
parents:
diff changeset
   173
	TInt ReceiveMessage(CRemConMessage& aMessage);
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
	/**
hgs
parents:
diff changeset
   176
	Indicates that a connection has come up or down.
hgs
parents:
diff changeset
   177
	This notifies each session held by this client.
hgs
parents:
diff changeset
   178
	*/
hgs
parents:
diff changeset
   179
	void ConnectionsChanged();
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
	/**
hgs
parents:
diff changeset
   182
	Provides a list of interfaces supported by this client.
hgs
parents:
diff changeset
   183
	@param aUids An RArray to hold the UIDs of the supported interfaces.
hgs
parents:
diff changeset
   184
	@return KErrNone on success, otherwise one of the system-wide error codes.
hgs
parents:
diff changeset
   185
	*/
hgs
parents:
diff changeset
   186
	TInt SupportedInterfaces(RArray<TUid>& aUids);
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
	/**
hgs
parents:
diff changeset
   189
	Provides a list of interfaces supported by this client that require the bulk server.
hgs
parents:
diff changeset
   190
	@param aUids An RArray to hold the UIDs of the interfaces.
hgs
parents:
diff changeset
   191
	@return KErrNone on success, otherwise one of the system-wide error codes.
hgs
parents:
diff changeset
   192
	*/
hgs
parents:
diff changeset
   193
	TInt SupportedBulkInterfaces(RArray<TUid>& aUids);
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
	/**
hgs
parents:
diff changeset
   196
	Provides a list of operations supported by a particular interface.
hgs
parents:
diff changeset
   197
	@param aInterfaceUid The UID of the interface of interest.
hgs
parents:
diff changeset
   198
	@param aOperations An RArray to hold the supported operations.
hgs
parents:
diff changeset
   199
	@return KErrNone on success, otherwise one of the system-wide error codes.
hgs
parents:
diff changeset
   200
	*/
hgs
parents:
diff changeset
   201
	TInt SupportedOperations(TUid aInterfaceUid, RArray<TUint>& aOperations);
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
public:	// From MRenConMessageSendObserver
hgs
parents:
diff changeset
   204
	void MrcmsoMessageSendResult(const CRemConMessage& aMessage, TInt aError);	// Not supported
hgs
parents:
diff changeset
   205
	void MrcmsoMessageSendOneOrMoreAttempt(const CRemConMessage& aMessage, TUint aNumRemotes);
hgs
parents:
diff changeset
   206
	void MrcmsoMessageSendOneOrMoreIncremental(const CRemConMessage& aMessage, TUint aNumRemotes);
hgs
parents:
diff changeset
   207
	void MrcmsoMessageSendOneOrMoreAttemptFailed(const CRemConMessage& aMessage, TInt aError);
hgs
parents:
diff changeset
   208
	void MrcmsoMessageSendOneOrMoreResult(const CRemConMessage& aMessage, TInt aError);
hgs
parents:
diff changeset
   209
	void MrcmsoMessageSendOneOrMoreAbandoned(const CRemConMessage& aMessage);
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
private:
hgs
parents:
diff changeset
   212
	CRemConTargetClientProcess(TClientInfo& aClientInfo, TRemConClientId aClientId, CRemConServer& aServer, CBearerManager& aBearerManager);
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
	/**
hgs
parents:
diff changeset
   215
	Returns the target session that supports a given RemCon message.
hgs
parents:
diff changeset
   216
	Since no two sessions may register the same interface, there is a maximum of one possible session that could support the message.
hgs
parents:
diff changeset
   217
	@param aMessage The RemCon message.
hgs
parents:
diff changeset
   218
	@return The supporting CRemConTargetSession instance or NULL if no supporting session could be found.
hgs
parents:
diff changeset
   219
	*/
hgs
parents:
diff changeset
   220
	CRemConTargetSession* FindSessionForMessage(const CRemConMessage& aMessage);
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
	/**
hgs
parents:
diff changeset
   223
	Returns an index to a target session held by this client that supports a particular interface.
hgs
parents:
diff changeset
   224
	@param aInterface The UID of the interface of interest.
hgs
parents:
diff changeset
   225
	@return If found, the index of the relevent target session. Otherwise, KErrNotFound or one of the other system-wide error codes.
hgs
parents:
diff changeset
   226
	*/
hgs
parents:
diff changeset
   227
	TInt FindSessionForInterface(TUid aInterface) const;
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
	/**
hgs
parents:
diff changeset
   230
	Utility method to complete a given RemCon message for a particular target session.
hgs
parents:
diff changeset
   231
	@param aMessage The RemCon message
hgs
parents:
diff changeset
   232
	@param aSession The target session
hgs
parents:
diff changeset
   233
	*/
hgs
parents:
diff changeset
   234
	void CompleteMessageForSession(const CRemConMessage& aMessage, CRemConTargetSession& aSession);
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
private:
hgs
parents:
diff changeset
   237
	// Client information
hgs
parents:
diff changeset
   238
	TClientInfo iClientInfo;
hgs
parents:
diff changeset
   239
	TRemConClientId iClientId;
hgs
parents:
diff changeset
   240
	TBool iClientAvailable;
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
	CRemConServer& iServer;
hgs
parents:
diff changeset
   243
	CBearerManager& iBearerManager;
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
	// Player information
hgs
parents:
diff changeset
   246
	TPlayerTypeInformation iPlayerType;
hgs
parents:
diff changeset
   247
	RBuf8 iPlayerName;
hgs
parents:
diff changeset
   248
	TBool iPlayerInfoSet;
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
	// Target sessions for this client
hgs
parents:
diff changeset
   251
	RPointerArray<CRemConTargetSession> iTargetSessions;
hgs
parents:
diff changeset
   252
	
hgs
parents:
diff changeset
   253
	};
hgs
parents:
diff changeset
   254
hgs
parents:
diff changeset
   255
#include "targetclientprocess.inl"
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
#endif // TARGETCLIENTPROCESS_H