remotecontrol/remotecontrolfw/server/inc/bulkserver.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) 2008-2009 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
20ac952a623c 201040_02
hgs
parents:
diff changeset
    18
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    19
 @file
20ac952a623c 201040_02
hgs
parents:
diff changeset
    20
 @internalComponent
20ac952a623c 201040_02
hgs
parents:
diff changeset
    21
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    22
20ac952a623c 201040_02
hgs
parents:
diff changeset
    23
#ifndef BULKSERVER_H
20ac952a623c 201040_02
hgs
parents:
diff changeset
    24
#define BULKSERVER_H
20ac952a623c 201040_02
hgs
parents:
diff changeset
    25
20ac952a623c 201040_02
hgs
parents:
diff changeset
    26
#include <e32base.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    27
#include <e32msgqueue.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    28
#include "bulkservermsgqueue.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    29
20ac952a623c 201040_02
hgs
parents:
diff changeset
    30
class CBulkBearerInterface;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    31
class CMessageQueue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    32
class CRemConBulkSession;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    33
class CRemConMessage;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    34
class TRemConAddress;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    35
20ac952a623c 201040_02
hgs
parents:
diff changeset
    36
class CRemConServer;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    37
20ac952a623c 201040_02
hgs
parents:
diff changeset
    38
20ac952a623c 201040_02
hgs
parents:
diff changeset
    39
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    40
The bulk server class for Rem Con.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    41
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    42
NONSHARABLE_CLASS(CRemConBulkServer) : public CPolicyServer
20ac952a623c 201040_02
hgs
parents:
diff changeset
    43
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    44
public:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    45
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    46
	RemCon bulk server construction.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    47
	@return Ownership of a new RemCon bulk server object
20ac952a623c 201040_02
hgs
parents:
diff changeset
    48
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    49
	static CRemConBulkServer* NewLC(RMsgQueue<TBulkServerMsg>& aMsgQueue);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    50
20ac952a623c 201040_02
hgs
parents:
diff changeset
    51
	/** Destructor. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
    52
	~CRemConBulkServer();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    53
20ac952a623c 201040_02
hgs
parents:
diff changeset
    54
public: // called by session objects 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    55
	/** Called by a session when a client session is created. Cancels the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    56
	shutdown timer in accordance with transient server design. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
    57
	TInt ClientOpened(CRemConBulkSession& aSession, TProcessId aProcessId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    58
20ac952a623c 201040_02
hgs
parents:
diff changeset
    59
	/** Called by a session when a client session is destroyed. Starts the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    60
	shutdown timer if necessary in accordance with transient server design. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    61
	Does not assume that the session successfully registered itself with the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    62
	server to begin with.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    63
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    64
	void ClientClosed(CRemConBulkSession& aSession);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    65
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    66
	/** Called by a session when a client session has issued a receive.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    67
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    68
	void ReceiveRequest(CRemConBulkSession& aSession);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    69
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    70
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    71
	Starts the process of sending a response.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    72
	Always takes ownership of aMsg.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    73
	@return error
20ac952a623c 201040_02
hgs
parents:
diff changeset
    74
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    75
	TInt SendResponse(CRemConMessage& aMsg, CRemConBulkSession& aSess);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    76
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    77
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    78
	Sends a reject back to the bearer.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    79
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    80
	void SendReject(TRemConAddress aAddr, TUid aInterfaceUid, TUint aOperationId, TUint aTransactionId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    81
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    82
	inline CBulkBearerInterface& BulkBearerInterface();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    83
20ac952a623c 201040_02
hgs
parents:
diff changeset
    84
public: // called by the bearer manager 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    85
	inline RPointerArray<CRemConBulkSession>& Sessions();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    86
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    87
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    88
	Handles a new incoming command.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    89
	Always takes ownership of aMsg.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    90
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    91
	void NewCommand(CRemConMessage& aMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    92
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    93
	void CommandExpired(TUint aTransactionId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    94
20ac952a623c 201040_02
hgs
parents:
diff changeset
    95
private:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    96
	/** Constructor. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
    97
	CRemConBulkServer(RMsgQueue<TBulkServerMsg>& aMsgQueue);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    98
20ac952a623c 201040_02
hgs
parents:
diff changeset
    99
	/** 2nd-phase construction. */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   100
	void ConstructL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   101
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   102
private: // from CPolicyServer
20ac952a623c 201040_02
hgs
parents:
diff changeset
   103
	/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   104
	Called by the base class to create a new session.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   105
	@param aVersion Version of client
20ac952a623c 201040_02
hgs
parents:
diff changeset
   106
	@param aMessage Client's IPC message
20ac952a623c 201040_02
hgs
parents:
diff changeset
   107
	@return A new session to be used for the client. If this could not be made, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   108
	this function should leave.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   109
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   110
	CSession2* NewSessionL(const TVersion &aVersion, const RMessage2& aMessage) const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   111
20ac952a623c 201040_02
hgs
parents:
diff changeset
   112
private: // utility	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   113
	CRemConBulkSession* Session(TUint aSessionId) const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   114
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   115
	void StartShutdownTimerIfNoSessions();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   116
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   117
#ifdef __FLOG_ACTIVE
20ac952a623c 201040_02
hgs
parents:
diff changeset
   118
	void LogSessions() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   119
	void LogIncomingPendingDelivery() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   120
	void LogIncomingDelivered() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   121
#endif // __FLOG_ACTIVE
20ac952a623c 201040_02
hgs
parents:
diff changeset
   122
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   123
	CMessageQueue& IncomingPendingDelivery();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   124
	CMessageQueue& IncomingDelivered();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   125
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   126
	void DeliverCmdToClient(const CRemConMessage& aMsg, CRemConBulkSession& aSess);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   127
	void DeliverMessageToClient(CRemConMessage& aMsg, CRemConBulkSession& aSess);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   128
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   129
private: // called by the shutdown timer
20ac952a623c 201040_02
hgs
parents:
diff changeset
   130
	/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   131
	Called by the shutdown timer when it fires. Terminates the server thread. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   132
	@param aThis This. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   133
	@return KErrNone.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   134
	*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   135
	static TInt TimerFired(TAny* aThis);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   136
20ac952a623c 201040_02
hgs
parents:
diff changeset
   137
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   138
private: // owned
20ac952a623c 201040_02
hgs
parents:
diff changeset
   139
20ac952a623c 201040_02
hgs
parents:
diff changeset
   140
	// NB This isn't really being used as a CPeriodic, but (a) it will do the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   141
	// job, and (b) it saves us writing our own concrete timer (there aren't 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   142
	// any other more suitable concrete timer classes).
20ac952a623c 201040_02
hgs
parents:
diff changeset
   143
	CPeriodic* iShutdownTimer;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   144
20ac952a623c 201040_02
hgs
parents:
diff changeset
   145
	// Shutdown delay (when there are no sessions) = 1 second- there's no 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   146
	// point hanging around.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   147
	static const TUint KShutdownDelay = 1 * 1000 * 1000;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   148
20ac952a623c 201040_02
hgs
parents:
diff changeset
   149
	RPointerArray<CRemConBulkSession> iSessions;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   150
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   151
	CMessageQueue* iIncomingPendingDelivery;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   152
	CMessageQueue* iIncomingDelivered;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   153
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   154
	CBulkBearerInterface* iBulkBearerInterface;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   155
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   156
	RMsgQueue<TBulkServerMsg> iRemConMsgQueue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   157
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   158
	CRemConServer* iControlServer; //unowned.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   159
	};
20ac952a623c 201040_02
hgs
parents:
diff changeset
   160
20ac952a623c 201040_02
hgs
parents:
diff changeset
   161
// Inlines
20ac952a623c 201040_02
hgs
parents:
diff changeset
   162
20ac952a623c 201040_02
hgs
parents:
diff changeset
   163
RPointerArray<CRemConBulkSession>& CRemConBulkServer::Sessions()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   164
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   165
	return iSessions;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   166
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   167
20ac952a623c 201040_02
hgs
parents:
diff changeset
   168
CBulkBearerInterface& CRemConBulkServer::BulkBearerInterface()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   169
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   170
	return *iBulkBearerInterface;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   171
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   172
20ac952a623c 201040_02
hgs
parents:
diff changeset
   173
#endif // BULKSERVER_H