remotecontrol/remotecontrolfw/server/inc/server.h
author hgs
Wed, 13 Oct 2010 16:20:29 +0300
changeset 51 20ac952a623c
permissions -rw-r--r--
201040_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
20ac952a623c 201040_02
hgs
parents:
diff changeset
     1
// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
20ac952a623c 201040_02
hgs
parents:
diff changeset
     2
// All rights reserved.
20ac952a623c 201040_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
20ac952a623c 201040_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
20ac952a623c 201040_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
20ac952a623c 201040_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
20ac952a623c 201040_02
hgs
parents:
diff changeset
     7
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
20ac952a623c 201040_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    10
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    11
// Contributors:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    12
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    13
// Description:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    14
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    15
20ac952a623c 201040_02
hgs
parents:
diff changeset
    16
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    17
 @file
20ac952a623c 201040_02
hgs
parents:
diff changeset
    18
 @internalComponent
20ac952a623c 201040_02
hgs
parents:
diff changeset
    19
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    20
20ac952a623c 201040_02
hgs
parents:
diff changeset
    21
#ifndef SERVER_H
20ac952a623c 201040_02
hgs
parents:
diff changeset
    22
#define SERVER_H
20ac952a623c 201040_02
hgs
parents:
diff changeset
    23
20ac952a623c 201040_02
hgs
parents:
diff changeset
    24
#include <e32base.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    25
#include <e32msgqueue.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    26
#include <remcon/remcontargetselectorpluginobserver.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    27
#include <remcon/clientid.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    28
20ac952a623c 201040_02
hgs
parents:
diff changeset
    29
#include "bulkservermsgqueue.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    30
#include "connectionstate.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    31
#include "tspv4stub.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    32
#include "utils.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    33
20ac952a623c 201040_02
hgs
parents:
diff changeset
    34
class REComSession;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    35
class CBearerManager;	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    36
class CConverterManager;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    37
class CRemConTargetClientProcess;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    38
class CRemConSession;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    39
class CRemConTargetSession;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    40
class CRemConControllerSession;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    41
class CMessageQueue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    42
class CRemConTargetSelectorPlugin;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    43
class CRemConMessage;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    44
class CRemConConverterPlugin;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    45
class CMessageRecipientsList;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    46
class TClientInfo;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    47
class TRemConAddress;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    48
class CConnectionHistory;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    49
class CConnections;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    50
class MRemConTargetSelectorPluginInterface;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    51
class MRemConTargetSelectorPluginInterfaceV2;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    52
class MRemConTargetSelectorPluginInterfaceV3;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    53
class MRemConTargetSelectorPluginInterfaceV4;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    54
class MRemConConverterInterface;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    55
20ac952a623c 201040_02
hgs
parents:
diff changeset
    56
// helper classes
20ac952a623c 201040_02
hgs
parents:
diff changeset
    57
class CBulkThreadWatcher;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    58
20ac952a623c 201040_02
hgs
parents:
diff changeset
    59
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    60
The server class for Rem Con.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    61
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    62
NONSHARABLE_CLASS(CRemConServer) : public CPolicyServer, public MRemConTargetSelectorPluginObserver
20ac952a623c 201040_02
hgs
parents:
diff changeset
    63
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    64
friend class CBulkThreadWatcher; // helper active object
20ac952a623c 201040_02
hgs
parents:
diff changeset
    65
public:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    66
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    67
	RemCon server construction.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    68
	@return Ownership of a new RemCon server object
20ac952a623c 201040_02
hgs
parents:
diff changeset
    69
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    70
	static CRemConServer* NewLC();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    71
20ac952a623c 201040_02
hgs
parents:
diff changeset
    72
	~CRemConServer();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    73
20ac952a623c 201040_02
hgs
parents:
diff changeset
    74
public: // called by controller session objects 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    75
20ac952a623c 201040_02
hgs
parents:
diff changeset
    76
	/** Called by a controller session when created. Cancels the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    77
	shutdown timer in accordance with transient server design. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
    78
	TInt ControllerClientOpened(CRemConControllerSession& aSession);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    79
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
    80
	/** Called by a controller session when it has had its features registered. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
    81
	void ControllerClientAvailable();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    82
20ac952a623c 201040_02
hgs
parents:
diff changeset
    83
	/** Called by a controller session when it has had its client go connection oriented
20ac952a623c 201040_02
hgs
parents:
diff changeset
    84
	Uses the bearer manager to inform bearers as appropriate
20ac952a623c 201040_02
hgs
parents:
diff changeset
    85
	aUid is the uid of the bearer we are going connection oriented on.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    86
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    87
	void ClientGoConnectionOriented(CRemConControllerSession& aSession, TUid aUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    88
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    89
	/** Called by a controller session when it has had its client go connection less.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    90
	 Uses the bearer manager to inform bearers as appropriate.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    91
	 aUid is the uid of the bearer we were connection oriented on,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    92
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    93
	void ClientGoConnectionless(CRemConControllerSession& aSession, TUid aUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    94
20ac952a623c 201040_02
hgs
parents:
diff changeset
    95
	/** Called by a controller session it is destroyed. Starts the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    96
	shutdown timer if necessary in accordance with transient server design. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    97
	Does not assume that the session successfully registered itself with the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    98
	server to begin with.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    99
	aUid is the bearer uid the session was on for connection oriented sessions,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   100
	if KNullUid the session was connectionless, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   101
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   102
	void ControllerClientClosed(CRemConControllerSession& aSession, TUid aUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   103
20ac952a623c 201040_02
hgs
parents:
diff changeset
   104
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   105
	Sends a command.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   106
	Puts the command on the 'pending TSP' queue so the TSP can either address 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   107
	it or give it permission to send.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   108
	Always takes ownership of aMsg. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   109
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   110
	void SendCommand(CRemConMessage& aMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   111
20ac952a623c 201040_02
hgs
parents:
diff changeset
   112
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   113
	Removes any current message from this controller session from the 'outgoing pending 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   114
	TSP' queue. If the message is that currently being dealt with by the TSP, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   115
	then cancels the TSP's operation.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   116
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   117
	void SendCancel(CRemConControllerSession& aSess);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   118
20ac952a623c 201040_02
hgs
parents:
diff changeset
   119
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   120
	Tries to complete a Receive request for a controller session.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   121
	Called by controller sessions when a Receive request is posted. The 'incoming pending 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   122
	delivery' queue is checked for commands waiting to be delivered to 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   123
	aSession. The controller session's request is completed with the first such found.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   124
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   125
	void ReceiveRequest(CRemConControllerSession& aSession);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   126
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   127
public:	// Called by target client objects (either CRemConTargetClientProcess or CRemConTargetSession)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   128
20ac952a623c 201040_02
hgs
parents:
diff changeset
   129
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   130
	Called by CRemConTargetClientProcess to cancel the servers shutdown timer when a new
20ac952a623c 201040_02
hgs
parents:
diff changeset
   131
	target session has been opened.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   132
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   133
	void CancelShutdownTimer();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   134
20ac952a623c 201040_02
hgs
parents:
diff changeset
   135
	/** Called by CRemConTargetClientProcess to notify the server that it is available.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   136
	This is done when the client has registered one or more interfaces. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   137
	void TargetClientAvailable(const CRemConTargetClientProcess& aClient);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   138
20ac952a623c 201040_02
hgs
parents:
diff changeset
   139
	/** Called by CRemConTargetClientProcess to notify the server that it has registered
20ac952a623c 201040_02
hgs
parents:
diff changeset
   140
	additional intefaces. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   141
	void TargetFeaturesUpdated(CRemConTargetClientProcess& aClient);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   142
20ac952a623c 201040_02
hgs
parents:
diff changeset
   143
	/** Called by CRemConTargetClientProcess to notify the server that a target session
20ac952a623c 201040_02
hgs
parents:
diff changeset
   144
	has closed. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   145
	void TargetSessionClosed(CRemConTargetClientProcess& aClient, CRemConTargetSession& aSession);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   146
20ac952a623c 201040_02
hgs
parents:
diff changeset
   147
	/** Called by CRemConTargetClientProcess to notify the server that a client session is closing.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   148
	Starts the shutdown timer if necessary in accordance with transient server design. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   149
	Does not assume that the session successfully registered itself with the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   150
	server to begin with.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   151
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   152
	void TargetClientClosed(CRemConTargetClientProcess& aClient);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   153
20ac952a623c 201040_02
hgs
parents:
diff changeset
   154
	/** Called by a client instance when a session is created. Makes an item 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   155
	for the session in the record of which points in the connection history 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   156
	sessions are interested in. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   157
	TInt RegisterTargetSessionPointerToConnHistory(const CRemConTargetSession& aSession);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   158
20ac952a623c 201040_02
hgs
parents:
diff changeset
   159
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   160
	Starts the process of sending a response, via the TSP
20ac952a623c 201040_02
hgs
parents:
diff changeset
   161
	Completes the client's send message with a bearer-level error.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   162
	Always takes ownership of aMsg. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   163
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   164
	void SendResponse(CRemConMessage& aMsg, CRemConTargetClientProcess& aClient);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   165
20ac952a623c 201040_02
hgs
parents:
diff changeset
   166
	/** Finishes the process of sending a response, after the TSP
20ac952a623c 201040_02
hgs
parents:
diff changeset
   167
	has permitted the response
20ac952a623c 201040_02
hgs
parents:
diff changeset
   168
	Always takes onwership of aMsg.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   169
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   170
	void CompleteSendResponse(CRemConMessage& aMsg, CRemConTargetClientProcess& aClient);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   171
20ac952a623c 201040_02
hgs
parents:
diff changeset
   172
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   173
	Sends a reject back to the bearer.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   174
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   175
	void SendReject (TRemConAddress aAddr, TUid aInterfaceUid, TUint aOperationId, TUint aTransactionId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   176
20ac952a623c 201040_02
hgs
parents:
diff changeset
   177
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   178
	Tries to complete a Receive request for a target client.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   179
	Called by clients when a Receive request is posted. The 'incoming pending 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   180
	delivery' queue is checked for commands waiting to be delivered to 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   181
	the client. A delivery attempt is made for each pending message.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   182
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   183
	void ReceiveRequest(CRemConTargetClientProcess& aClient);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   184
20ac952a623c 201040_02
hgs
parents:
diff changeset
   185
public:	// called by controller and target sessions
20ac952a623c 201040_02
hgs
parents:
diff changeset
   186
20ac952a623c 201040_02
hgs
parents:
diff changeset
   187
	/** Returns the current bearer-level connection state of the system. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   188
	CConnections& Connections();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   189
20ac952a623c 201040_02
hgs
parents:
diff changeset
   190
	/** Each session has a pointer into the connection history- pointing at 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   191
	the record in the history in which the session is interested. This 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   192
	function moves the pointer (for the given session) to the last item in the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   193
	history. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   194
	void SetConnectionHistoryPointer(TUint aSessionId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   195
20ac952a623c 201040_02
hgs
parents:
diff changeset
   196
	/** Gets the record in the connection history which the session is 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   197
	pointing to. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   198
	const CConnections& Connections(TUint aSessionId) const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   199
20ac952a623c 201040_02
hgs
parents:
diff changeset
   200
	/** Returns ETrue if the given session's currently flagged connection 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   201
	history record is the 'Last' connection history record, i.e. the current 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   202
	connection set. Returns EFalse otherwise. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   203
	TBool ConnectionHistoryPointerAtLatest(TUint aSessionId) const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   204
20ac952a623c 201040_02
hgs
parents:
diff changeset
   205
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   206
	Determines a state of a connection to the given remote address.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   207
	@param - aAddr, remote address of a connection
20ac952a623c 201040_02
hgs
parents:
diff changeset
   208
	@return - connection state 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   209
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   210
	TConnectionState ConnectionState(const TRemConAddress& aAddr);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   211
20ac952a623c 201040_02
hgs
parents:
diff changeset
   212
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   213
	Informs RemCon server that one of the interfaces being used by the calling
20ac952a623c 201040_02
hgs
parents:
diff changeset
   214
	session requires the use of the bulk server.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   215
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   216
	TInt BulkServerRequired();	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   217
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   218
public: // called by the bearer manager 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   219
20ac952a623c 201040_02
hgs
parents:
diff changeset
   220
	/** This function is called when a ConnectIndicate is handled by the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   221
	bearer manager (in which case aError will be KErrNone) and when 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   222
	ConnectConfirm is handled by the bearer manager (in which case aError will 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   223
	be the connection error). 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   224
	@return Error. If we cannot handle the new connection (if there is one) 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   225
	then the bearer must drop the connection. Note that if aError is not 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   226
	KErrNone the return value will be meaningless.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   227
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   228
	TInt HandleConnection(const TRemConAddress& aAddr, TInt aError);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   229
20ac952a623c 201040_02
hgs
parents:
diff changeset
   230
	/** This function is called when a connection goes away, either by 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   231
	indication (from the remote end) or confirmation (from our end). */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   232
	void RemoveConnection(const TRemConAddress& aAddr, TInt aError);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   233
20ac952a623c 201040_02
hgs
parents:
diff changeset
   234
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   235
	Handles a new incoming response. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   236
	Finds the (assumed single) command on the 'outgoing sent' queue matching 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   237
	it, to find the session which sent _that_. Gives the new response to that 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   238
	client session. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   239
	Always takes ownership of aMsg. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   240
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   241
	void NewResponse(CRemConMessage& aMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   242
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   243
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   244
	Handles a new incoming response for a notify command. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   245
	Finds the (assumed single) command on the 'outgoing sent' queue matching 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   246
	it, to find the session which sent _that_. Gives the new response to that 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   247
	client session. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   248
	Always takes ownership of aMsg. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   249
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   250
	void NewNotifyResponse(CRemConMessage& aMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   251
20ac952a623c 201040_02
hgs
parents:
diff changeset
   252
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   253
	Handles a new incoming command.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   254
	Puts the message on the 'incoming response pending' queue. If the TSP is 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   255
	not busy, asks it to address the message to target client(s). If the TSP 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   256
	is busy, then the queue will be checked (and the next message handled) 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   257
	when the TSP calls IncomingCommandAddressed. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   258
	Always takes ownership of aMsg.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   259
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   260
	void NewCommand(CRemConMessage& aMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   261
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   262
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   263
	Handles a new incoming notify command.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   264
	Puts the message on the 'incoming response pending' queue. If the TSP is 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   265
	not busy, asks it to address the message to target client. If the TSP 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   266
	is busy, then the queue will be checked (and the next message handled) 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   267
	when the TSP calls IncomingNotifyCommandAddressed. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   268
	Always takes ownership of aMsg.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   269
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   270
	void NewNotifyCommand(CRemConMessage& aMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   271
20ac952a623c 201040_02
hgs
parents:
diff changeset
   272
	/** Returns the converter interface which supports the given outer-layer 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   273
	API and bearer UIDs, or NULL if it does not exist. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   274
	MRemConConverterInterface* Converter(TUid aInterfaceUid, TUid aBearerUid) const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   275
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   276
	/** Returns the converter interface which supports the given outer-layer 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   277
	API and bearer UIDs, or NULL if it does not exist. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   278
	MRemConConverterInterface* Converter(const TDesC8& aInterfaceData, TUid aBearerUid) const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   279
20ac952a623c 201040_02
hgs
parents:
diff changeset
   280
	void CommandExpired(TUint aTransactionId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   281
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   282
	TInt SupportedInterfaces(const TRemConClientId& aId, RArray<TUid>& aUids);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   283
	TInt SupportedOperations(const TRemConClientId& aId, TUid aInterfaceUid, RArray<TUint>& aOperations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   284
	TInt ControllerSupportedInterfaces(RArray<TUid>& aSupportedInterfaces);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   285
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   286
	void SetRemoteAddressedClient(const TUid& aBearerUid, const TRemConClientId& aId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   287
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   288
	TInt RegisterLocalAddressedClientObserver(const TUid& aBearerUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   289
	TInt UnregisterLocalAddressedClientObserver(const TUid& aBearerUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   290
20ac952a623c 201040_02
hgs
parents:
diff changeset
   291
public: // called by bulk server
20ac952a623c 201040_02
hgs
parents:
diff changeset
   292
	TRemConClientId ClientIdByProcessId(TProcessId aProcessId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   293
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   294
	void BulkInterfacesForClientL(TRemConClientId aId, RArray<TUid>& aUids);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   295
20ac952a623c 201040_02
hgs
parents:
diff changeset
   296
private:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   297
	/** Constructor. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   298
	CRemConServer();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   299
20ac952a623c 201040_02
hgs
parents:
diff changeset
   300
	/** 2nd-phase construction. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   301
	void ConstructL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   302
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   303
private: // from CPolicyServer
20ac952a623c 201040_02
hgs
parents:
diff changeset
   304
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   305
	Called by the base class to create a new session.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   306
	@param aVersion Version of client
20ac952a623c 201040_02
hgs
parents:
diff changeset
   307
	@param aMessage Client's IPC message
20ac952a623c 201040_02
hgs
parents:
diff changeset
   308
	@return A new session to be used for the client. If this could not be made, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   309
	this function should leave.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   310
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   311
	CSession2* NewSessionL(const TVersion &aVersion, const RMessage2& aMessage) const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   312
20ac952a623c 201040_02
hgs
parents:
diff changeset
   313
private: // from MRemConTargetSelectorPluginObserver
20ac952a623c 201040_02
hgs
parents:
diff changeset
   314
	void MrctspoDoOutgoingCommandAddressed(TInt aError);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   315
	void MrctspoDoOutgoingCommandPermitted(TBool aIsPermitted);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   316
	void MrctspoDoOutgoingNotifyCommandPermitted(TBool aIsPermitted);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   317
	void MrctspoDoIncomingCommandAddressed(TInt aError);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   318
	TInt MrctspoDoGetConnections(TSglQue<TRemConAddress>& aConnections);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   319
	void MrctspoDoOutgoingResponsePermitted(TBool aIsPermitted);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   320
	void MrctspoDoIncomingNotifyAddressed(TClientInfo* aClientInfo, TInt aError);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   321
	void MrctspoDoReAddressNotifies();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   322
	void MrctspoDoOutgoingNotifyCommandAddressed(TRemConAddress* aConnection, TInt aError);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   323
	void MrctspoDoIncomingCommandPermitted(TBool aIsPermitted);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   324
	void MrctspoDoIncomingNotifyPermitted(TBool aIsPermitted);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   325
	TInt MrctspoSetLocalAddressedClient(const TUid& aBearerUid, const TClientInfo& aClientInfo);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   326
20ac952a623c 201040_02
hgs
parents:
diff changeset
   327
private: // utility
20ac952a623c 201040_02
hgs
parents:
diff changeset
   328
	CRemConControllerSession* CreateControllerSessionL(const RMessage2& aMessage);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   329
	CRemConTargetSession* CreateTargetSessionL(const RMessage2& aMessage);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   330
20ac952a623c 201040_02
hgs
parents:
diff changeset
   331
	/** Extracts a client's process ID and secure ID from a given RMessage2 and stores
20ac952a623c 201040_02
hgs
parents:
diff changeset
   332
	in a given TClientInfo. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   333
	void ClientProcessAndSecureIdL(TClientInfo& aClientInfo, const RMessage2& aMessage) const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   334
20ac952a623c 201040_02
hgs
parents:
diff changeset
   335
	void RemoveSessionFromConnHistory(const CRemConSession& aSession);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   336
20ac952a623c 201040_02
hgs
parents:
diff changeset
   337
	/** Removes connection history records which are no longer interesting and 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   338
	updates the indices in iSession2ConnHistory accordingly. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   339
	void UpdateConnectionHistoryAndPointers();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   340
20ac952a623c 201040_02
hgs
parents:
diff changeset
   341
	CRemConControllerSession* ControllerSession(TUint aSessionId) const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   342
	CRemConTargetClientProcess* TargetClient(TUint aClientId) const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   343
	CRemConTargetClientProcess* TargetClient(TProcessId aProcessId) const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   344
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   345
	void StartShutdownTimerIfNoClientsOrBulkThread();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   346
	void TryToDropClientProcess(TUint aClientIndex);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   347
	void LoadTspL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   348
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   349
	TBool FindDuplicateNotify(CRemConMessage& aMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   350
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   351
#ifdef __FLOG_ACTIVE
20ac952a623c 201040_02
hgs
parents:
diff changeset
   352
	void LogControllerSessions() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   353
	void LogTargetSessions() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   354
	void LogRemotes() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   355
	void LogConnectionHistoryAndInterest() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   356
	void LogOutgoingCmdPendingTsp() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   357
	void LogOutgoingNotifyCmdPendingTsp() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   358
	void LogOutgoingRspPendingTsp() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   359
	void LogOutgoingPendingSend() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   360
	void LogOutgoingSent() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   361
	void LogIncomingCmdPendingAddress() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   362
	void LogIncomingNotifyCmdPendingAddress() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   363
	void LogIncomingNotifyCmdPendingReAddress() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   364
	void LogIncomingPendingDelivery() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   365
	void LogIncomingDelivered() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   366
#endif // __FLOG_ACTIVE
20ac952a623c 201040_02
hgs
parents:
diff changeset
   367
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   368
	CMessageQueue& OutgoingCmdPendingTsp();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   369
	CMessageQueue& OutgoingNotifyCmdPendingTsp();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   370
	CMessageQueue& OutgoingRspPendingTsp();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   371
	CMessageQueue& OutgoingRspPendingSend();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   372
	CMessageQueue& OutgoingPendingSend();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   373
	CMessageQueue& OutgoingSent();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   374
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   375
	CMessageQueue& IncomingCmdPendingAddress();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   376
	CMessageQueue& IncomingNotifyCmdPendingAddress();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   377
	CMessageQueue& IncomingNotifyCmdPendingReAddress();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   378
	CMessageQueue& IncomingPendingDelivery();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   379
	CMessageQueue& IncomingDelivered();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   380
20ac952a623c 201040_02
hgs
parents:
diff changeset
   381
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   382
	Utility for sending a single outgoing command to a remote.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   383
	Takes a copy of aMsg and sets its Addr to aConn. If aConn exists as a 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   384
	bearer-level connection then it tries to send the message. If the send 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   385
	fails, the new message is destroyed and the function leaves. If the send 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   386
	succeeds, the new message is put on OutgoingSent. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   387
	If aConn does not exist as a bearer-level connection, the new message is 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   388
	put on OutgoingPendingSend and the bearer is requested to bring up the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   389
	connection.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   390
	Whatever happens, ownership of the new message is retained. Ownership of 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   391
	aMsg stays with the caller.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   392
	@param aSync If aConn exists as a bearer-level connection, this is set 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   393
	to ETrue, otherwise it is set to EFalse. It effectively indicates whether 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   394
	a send attempt was made synchronously (ETrue) or if we'll have to wait for 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   395
	a bearer-level connection to come up (EFalse). aSync is guaranteed to be 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   396
	set correctly whether the function leaves or not.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   397
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   398
	void SendCmdToRemoteL(const CRemConMessage& aMsg, const TRemConAddress& aConn, TBool& aSync);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   399
20ac952a623c 201040_02
hgs
parents:
diff changeset
   400
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   401
	Utility for delivering a single incoming command to a client session.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   402
	Takes a copy of aMsg, sets its SessionId, and delivers it to aSess, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   403
	putting it on the correct queue. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   404
	Does not take ownership of aMsg.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   405
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   406
	void DeliverCmdToClientL(const CRemConMessage& aMsg, CRemConTargetClientProcess& aClient);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   407
20ac952a623c 201040_02
hgs
parents:
diff changeset
   408
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   409
	Utility for delivering a single message to a controller client session.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   410
	If the session aSess has an outstanding Receive request, completes the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   411
	request with aMsg. Otherwise, puts aMsg in the 'incoming pending delivery' 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   412
	queue. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   413
	Always takes ownership of aMsg.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   414
	@return KErrNone if the message was successfully delivered or put on the
20ac952a623c 201040_02
hgs
parents:
diff changeset
   415
	incoming pending delivered queue, otherwise one of the system wide error codes
20ac952a623c 201040_02
hgs
parents:
diff changeset
   416
	Ownership of aMsg will be taken regardless of the error.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   417
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   418
	TInt DeliverMessageToClient(CRemConMessage& aMsg, CRemConControllerSession& aSess);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   419
20ac952a623c 201040_02
hgs
parents:
diff changeset
   420
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   421
	Utility for delivering a single message to a target client.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   422
	If the client aClient has an outstanding Receive request, completes the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   423
	request with aMsg and puts aMsg the 'incoming delivered' queue (since it
20ac952a623c 201040_02
hgs
parents:
diff changeset
   424
	shall be a command). Otherwise, puts aMsg in the 'incoming pending delivery' 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   425
	queue. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   426
	Always takes ownership of aMsg.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   427
	@return KErrNone if the message was successfully delivered or put on the
20ac952a623c 201040_02
hgs
parents:
diff changeset
   428
	incoming pending delivered queue, otherwise one of the system wide error codes
20ac952a623c 201040_02
hgs
parents:
diff changeset
   429
	Ownership of aMsg will be taken regardless of the error.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   430
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   431
	TInt DeliverMessageToClient(CRemConMessage& aMsg, CRemConTargetClientProcess& aClient);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   432
20ac952a623c 201040_02
hgs
parents:
diff changeset
   433
	/** Gives the head outgoing command to the TSP for (a) addressing to 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   434
	remote target(s), if its address is null, or (b) permission to send, if it 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   435
	has a remote address. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   436
	void TspOutgoingCommand();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   437
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   438
	void TspOutgoingNotifyCommand();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   439
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   440
	/** Gives the head incoming command to the TSP for addressing to target 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   441
	client(s). */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   442
	void AddressIncomingCommand();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   443
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   444
	/** Gives the head incoming notify command to the TSP for addressing to target 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   445
	client. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   446
	void AddressIncomingNotifyCommand();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   447
20ac952a623c 201040_02
hgs
parents:
diff changeset
   448
	/** Gives the head incoming notify command to the TSP for readdressing to target 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   449
	client. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   450
	void ReAddressIncomingNotifyCommand();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   451
20ac952a623c 201040_02
hgs
parents:
diff changeset
   452
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   453
	/** Gives the head outgoing response to the TSP for permission to send */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   454
	void PermitOutgoingResponse();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   455
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   456
	TClientInfo* TargetClientIdToClientInfo(TRemConClientId aId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   457
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   458
	void InitialiseBulkServerThreadL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   459
20ac952a623c 201040_02
hgs
parents:
diff changeset
   460
private: // called by the shutdown timer
20ac952a623c 201040_02
hgs
parents:
diff changeset
   461
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   462
	Called by the shutdown timer when it fires. Terminates the server thread. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   463
	@param aThis This. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   464
	@return KErrNone.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   465
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   466
	static TInt TimerFired(TAny* aThis);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   467
20ac952a623c 201040_02
hgs
parents:
diff changeset
   468
private: // owned
20ac952a623c 201040_02
hgs
parents:
diff changeset
   469
	// Holds the history of the connection states of the system.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   470
	CConnectionHistory* iConnectionHistory;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   471
20ac952a623c 201040_02
hgs
parents:
diff changeset
   472
	// NB This isn't really being used as a CPeriodic, but (a) it will do the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   473
	// job, and (b) it saves us writing our own concrete timer (there aren't 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   474
	// any other more suitable concrete timer classes).
20ac952a623c 201040_02
hgs
parents:
diff changeset
   475
	CPeriodic* iShutdownTimer;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   476
20ac952a623c 201040_02
hgs
parents:
diff changeset
   477
	// Shutdown delay (when there are no sessions) = 1 second- there's no 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   478
	// point hanging around.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   479
	static const TUint KShutdownDelay = 1 * 1000 * 1000;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   480
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   481
	// Not to be deleted, only closed (see ECOM API documentation).
20ac952a623c 201040_02
hgs
parents:
diff changeset
   482
	REComSession* iEcom; 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   483
20ac952a623c 201040_02
hgs
parents:
diff changeset
   484
	CBearerManager* iBearerManager;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   485
	CConverterManager* iConverterManager;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   486
20ac952a623c 201040_02
hgs
parents:
diff changeset
   487
	// Unique identifier seed for sessions and clients.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   488
	// Controller sessions, target clients and target sessions all need a unique ID.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   489
	TUint iSessionOrClientId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   490
20ac952a623c 201040_02
hgs
parents:
diff changeset
   491
	RPointerArray<CRemConControllerSession> iControllerSessions;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   492
	RPointerArray<CRemConTargetClientProcess> iTargetClients;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   493
	mutable RNestableLock iTargetClientsLock; 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   494
20ac952a623c 201040_02
hgs
parents:
diff changeset
   495
	// In the following discussion, mark carefully the difference between a 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   496
	// QUEUE of items awaiting serialised access to a resource, and a LOG of 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   497
	// things which have happened which we need to remember.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   498
	// There are nine collections of messages in the server:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   499
	// 1/ OutgoingCmdPendingTsp
20ac952a623c 201040_02
hgs
parents:
diff changeset
   500
	// This is a QUEUE of commands (a) from our connectionless controller 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   501
	// clients, waiting to be addressed by the TSP, and (b) from our 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   502
	// connection-oriented controller clients, waiting to be 'permitted' by 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   503
	// the TSP. On sending, commands move off this queue to OutgoingPendingSend
20ac952a623c 201040_02
hgs
parents:
diff changeset
   504
	// 2/ OutgoingRspPendingTsp
20ac952a623c 201040_02
hgs
parents:
diff changeset
   505
	// This is a QUEUE of responses (a) from our clients waiting to be 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   506
	// 'permitted' by the TSP. On sending, commands move off this queue to...
20ac952a623c 201040_02
hgs
parents:
diff changeset
   507
	// 3/ OutgoingPendingSend
20ac952a623c 201040_02
hgs
parents:
diff changeset
   508
	// This is a QUEUE of messages, waiting for the relevant 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   509
	// bearer connection to exist so they can be sent. On sending, commands 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   510
	// move off this queue to...
20ac952a623c 201040_02
hgs
parents:
diff changeset
   511
	// 4/ OutgoingSent
20ac952a623c 201040_02
hgs
parents:
diff changeset
   512
	// This is a LOG of commands sent by our controller clients. Items here 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   513
	// have been given to bearers and are awaiting responses from remotes. We 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   514
	// remember these commands in order to match responses to the controller 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   515
	// session which sent the originating command.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   516
	// 5/ IncomingCmdPendingAddress
20ac952a623c 201040_02
hgs
parents:
diff changeset
   517
	// This is a QUEUE of incoming commands (i.e. from remotes). Items here 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   518
	// are waiting to be given to the TSP for addressing. On being addressed 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   519
	// they move to IncomingPendingDelivery.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   520
	// 6/ IncomingNotifyCmdPendingAddress
20ac952a623c 201040_02
hgs
parents:
diff changeset
   521
	// This is a QUEUE of incoming Notify commands (i.e. from remotes). Items here 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   522
	// are waiting to be given to the TSP for addressing. On being addressed 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   523
	// they move to Incoming PendingDelivery
20ac952a623c 201040_02
hgs
parents:
diff changeset
   524
	// 7/ IncomingNotifyCmdPendingReAddress
20ac952a623c 201040_02
hgs
parents:
diff changeset
   525
	// This is a QUEUE of incmoing Notify commands (i.e. from remotes). Items here 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   526
	// are waiting to be given to the TSP for readdressing, after the TSP called
20ac952a623c 201040_02
hgs
parents:
diff changeset
   527
	// ReAddressNotifies. They are copied from IncomingDelivered, then the equivalent
20ac952a623c 201040_02
hgs
parents:
diff changeset
   528
	// command is removed from IncomingDelivered after the TSP has readdressed, and
20ac952a623c 201040_02
hgs
parents:
diff changeset
   529
	// moved to IncomingPendingDelivery
20ac952a623c 201040_02
hgs
parents:
diff changeset
   530
	// 8/ IncomingPendingDelivery
20ac952a623c 201040_02
hgs
parents:
diff changeset
   531
	// This is a QUEUE of incoming messages (commands and responses) waiting 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   532
	// to be given to our clients, i.e. for the client to post a Receive 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   533
	// request. (This is so that messages don't get dropped just because a 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   534
	// client hasn't reposted Receive quickly enough.) On being delivered, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   535
	// responses are destroyed, but commands move to...
20ac952a623c 201040_02
hgs
parents:
diff changeset
   536
	// 9/ IncomingDelivered
20ac952a623c 201040_02
hgs
parents:
diff changeset
   537
	// This is a LOG of delivered commands. We remember them in order to 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   538
	// address responses to the correct remote.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   539
	CMessageQueue* iOutgoingCmdPendingTsp;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   540
	CMessageQueue* iOutgoingNotifyCmdPendingTsp;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   541
	CMessageQueue* iOutgoingRspPendingTsp;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   542
	CMessageQueue* iOutgoingRspPendingSend;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   543
	CMessageQueue* iOutgoingPendingSend;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   544
	CMessageQueue* iOutgoingSent;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   545
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   546
	CMessageQueue* iIncomingCmdPendingAddress;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   547
	CMessageQueue* iIncomingNotifyCmdPendingAddress;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   548
	CMessageQueue* iIncomingNotifyCmdPendingReAddress;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   549
	CMessageQueue* iIncomingPendingDelivery;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   550
	CMessageQueue* iIncomingDelivered;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   551
20ac952a623c 201040_02
hgs
parents:
diff changeset
   552
	// NB IncomingPendingDelivery and IncomingDelivered would be more logical 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   553
	// as members of the session class, as we know which session these 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   554
	// messages are associated with. They are here in the server with the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   555
	// other queues in order to make the flow of messages through the whole 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   556
	// system clearer and therefore easier to maintain.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   557
20ac952a623c 201040_02
hgs
parents:
diff changeset
   558
	// The target selector plugin, which controls the flow of commands through 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   559
	// the server.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   560
	CRemConTargetSelectorPlugin* iTsp;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   561
	// This is the object supplied by the TSP which implements the TSP API. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   562
	// This is the mandatory base value and is guaranteed to exist once the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   563
	// TSP has been load.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   564
	MRemConTargetSelectorPluginInterface* iTspIf;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   565
20ac952a623c 201040_02
hgs
parents:
diff changeset
   566
	// This is the object supplied by the TSP which implements the TSP V2 API. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   567
	// The TSP may not support this interface so RemCon must handle this value
20ac952a623c 201040_02
hgs
parents:
diff changeset
   568
	// being NULL.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   569
	MRemConTargetSelectorPluginInterfaceV2* iTspIf2;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   570
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   571
	// This is the object supplied by the TSP which implements the TSP V3 API.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   572
	// The TSP may not support this interface, so RemCon must handle this 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   573
	// value being NULL
20ac952a623c 201040_02
hgs
parents:
diff changeset
   574
	MRemConTargetSelectorPluginInterfaceV3* iTspIf3;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   575
20ac952a623c 201040_02
hgs
parents:
diff changeset
   576
	// This is the object supplied by the TSP which implements the TSP V4 API.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   577
	// If the TSP does not implement it itself this points to a stub object
20ac952a623c 201040_02
hgs
parents:
diff changeset
   578
	// implementing default behaviour, so it is guaranteed to exist once the TSP
20ac952a623c 201040_02
hgs
parents:
diff changeset
   579
	// has been loaded.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   580
	MRemConTargetSelectorPluginInterfaceV4* iTspIf4;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   581
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   582
	// This is the object supplied by the TSP which implements the TSP V5 API.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   583
	// The TSP may not support this interface, so RemCon must handle this 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   584
	// value being NULL
20ac952a623c 201040_02
hgs
parents:
diff changeset
   585
	MRemConTargetSelectorPluginInterfaceV5* iTspIf5;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   586
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   587
	// Collections we pass to the TSP for it to indicate addressing 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   588
	// information back to us.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   589
	TSglQue<TRemConAddress> iTspConnections;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   590
	TSglQue<TClientInfo> iTspIncomingCmdClients;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   591
	TSglQue<TClientInfo> iTspIncomingNotifyCmdClients;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   592
20ac952a623c 201040_02
hgs
parents:
diff changeset
   593
	// List of which clients each message was delivered to	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   594
	CMessageRecipientsList* iMessageRecipientsList;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   595
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   596
	// Flags to control serialised access to the three parts of the TSP API.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   597
	TBool iTspHandlingOutgoingCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   598
	TBool iTspHandlingOutgoingNotifyCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   599
	TBool iTspAddressingIncomingCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   600
	TBool iTspAddressingIncomingNotifyCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   601
	TBool iTspReAddressingIncomingNotifyCommands;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   602
	TBool iTspHandlingOutgoingResponse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   603
20ac952a623c 201040_02
hgs
parents:
diff changeset
   604
	// Flags to control when a command is expired while being handled in TSP, so RemCon
20ac952a623c 201040_02
hgs
parents:
diff changeset
   605
	// knows to remove them when the TSP is finished
20ac952a623c 201040_02
hgs
parents:
diff changeset
   606
	TBool iTspDropIncomingCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   607
	TBool iTspDropIncomingNotifyCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   608
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   609
	/** We have an array of these records, one for each session. At any point 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   610
	in time, each session's record's iIndex is the index of the connection 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   611
	history record in which that session is currently interested. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   612
	struct TSessionPointerToConnectionHistory
20ac952a623c 201040_02
hgs
parents:
diff changeset
   613
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   614
		/** The session ID. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   615
		TUint iSessionId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   616
20ac952a623c 201040_02
hgs
parents:
diff changeset
   617
		/** The index of the connection history record. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   618
		TUint iIndex;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   619
		};
20ac952a623c 201040_02
hgs
parents:
diff changeset
   620
	RArray<TSessionPointerToConnectionHistory> iSession2ConnHistory;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   621
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   622
	TTspV4Stub iTspIf4Stub;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   623
20ac952a623c 201040_02
hgs
parents:
diff changeset
   624
	TBool iBulkThreadOpen;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   625
	RThread iBulkServerThread;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   626
	RMsgQueue<TBulkServerMsg> iBulkServerMsgQueue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   627
	CBulkThreadWatcher*	iBulkThreadWatcher;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   628
	};
20ac952a623c 201040_02
hgs
parents:
diff changeset
   629
20ac952a623c 201040_02
hgs
parents:
diff changeset
   630
// Inlines
20ac952a623c 201040_02
hgs
parents:
diff changeset
   631
20ac952a623c 201040_02
hgs
parents:
diff changeset
   632
NONSHARABLE_CLASS(CBulkThreadWatcher)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   633
	: public CActive
20ac952a623c 201040_02
hgs
parents:
diff changeset
   634
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   635
public:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   636
	CBulkThreadWatcher(CRemConServer& aServer);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   637
	~CBulkThreadWatcher();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   638
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   639
	void StartL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   640
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   641
private: // from CActive
20ac952a623c 201040_02
hgs
parents:
diff changeset
   642
	void RunL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   643
	void DoCancel();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   644
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   645
private: // unowned
20ac952a623c 201040_02
hgs
parents:
diff changeset
   646
	CRemConServer&	iServer;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   647
	};
20ac952a623c 201040_02
hgs
parents:
diff changeset
   648
20ac952a623c 201040_02
hgs
parents:
diff changeset
   649
#endif // SERVER_H