epoc32/include/remconinterfaceselector.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 2 2fe1408b6811
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
     1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 /**
    17  @file
    18  @publishedAll
    19  @released
    20 */
    21 
    22 #ifndef REMCONINTERFACESELECTOR_H
    23 #define REMCONINTERFACESELECTOR_H
    24 
    25 #include <e32base.h>
    26 #include <remcon/messagetype.h>
    27 #include <remcon/clienttype.h>
    28 #include <remcon/playertype.h>
    29 #include <remcon/remconinterfaceif.h>
    30 #include <remconaddress.h>
    31 
    32 class CRemConInterfaceBase;
    33 class CBulkReceiver;
    34 class CReceiver;
    35 class MRemConErrorObserver;
    36 class RRemConInterfaceFeatures;
    37 class RSpecificThreadCallBack;
    38 class CRemConInterfaceDetailsArray;
    39 class RNestableLock;
    40 class RRemConController;
    41 class RRemConTarget;
    42 class RRemConBulk;
    43 class RRemCon;
    44 
    45 // Panic information
    46 _LIT(KRemConIfSelPanicCat, "RemConIfSel");
    47 enum 
    48 	{
    49 	/** The client has given a bad message type. */
    50 	ERemConIfSelBadMessageType = 0,
    51 
    52 	/** The client has already called OpenTargetL successfully.
    53 		
    54 	This is no longer an illegal condition and so the panic will never
    55 	be raised.
    56 	*/
    57 	ERemConIfSelTargetSessionAlreadyExists = 1,
    58 
    59 	/** The client has already called OpenControllerL successfully.
    60 		
    61 	This is no longer an illegal condition and so the panic will never
    62 	be raised.
    63 	*/
    64 	ERemConIfSelControllerSessionAlreadyExists = 2,
    65 
    66 	/** The client has created (and registered) an outer layer interface of a 
    67 	type which is already registered. */
    68 	ERemConIfSelInterfaceOfThatTypeAlreadyRegistered = 3,
    69 	
    70 	/** The client has not offended- there is a defect in some layer of the 
    71 	Remote Control system. */
    72 	ERemConIfSelInternalError = 4,
    73 
    74 	/** An outer-layer interface has been instantiated (and registered with 
    75 	the intermediate layer) after OpenControllerL or OpenTargetL has been 
    76 	successfully called. */
    77 	ERemConIfSelTardyInterfaceRegistration = 5,
    78 
    79 	/** OpenControllerL has not successfully been called before using an API 
    80 	which expects a controller session to have been created. */
    81 	ERemConIfSelNoControllerSession = 6,
    82 
    83 	/** OpenTargetL has not successfully been called before using an API which 
    84 	expects a target session to have been created. */
    85 	ERemConIfSelNoTargetSession = 7,
    86 
    87 	/** Neither OpenControllerL not OpenTargetL has been successfully called 
    88 	before using an API which expects either a controller or a target session 
    89 	to have been created. */
    90 	ERemConIfSelNoSession = 8,
    91 
    92 	/** An outer layer DLL has instantiated CRemConInterfaceBase with an 
    93 	illegal client type. */
    94 	ERemConIfSelUndefinedClientType = 9,
    95 
    96 	/** An implementation of CRemConInterfaceBase::GetInterface does not 
    97 	provide an implementation of MRemConInterfaceIf. */
    98 	ERemConIfSelNoInterfaceImplementation = 10,
    99 	
   100 	/** A client has created bulk interfaces in multiple different threads,
   101 	all bulk interfaces must be created in the same thread*/
   102 	ERemConIfSelMultipleBulkInterfaceThreads = 11,
   103 	};
   104 
   105 /**
   106 CRemConInterfaceSelector is only instantiable via its NewL function. It is not 
   107 derivable.
   108 */
   109 NONSHARABLE_CLASS(CRemConInterfaceSelector) : public CBase
   110 	{
   111 public: 
   112 	/**
   113 	Factory method.
   114 	@return Ownership of a new CRemConInterfaceSelector.
   115 	*/
   116 	IMPORT_C static CRemConInterfaceSelector* NewL();
   117 
   118 	/** Destructor. */
   119 	IMPORT_C ~CRemConInterfaceSelector();
   120 
   121 public:
   122 	/**
   123 	Register the interface with the selector. This is called by the 
   124 	interface's BaseConstructL. Takes ownership of aInterface.
   125 	 This function is not to be called outside of remconinterfacebase.dll. It is available for compatibility with previous
   126 	 versions, but it is intended to be called only by CRemConInterfaceBase::BaseConstructL.
   127 	 CRemConInterfaceBase-derived classes should indirectly perform a RegisterInterfaceL, by calling
   128 	 CRemConInterfaceBase::BaseConstructL from their construction functions.
   129 	@param aInterface The interface.
   130 	*/
   131 	IMPORT_C void RegisterInterfaceL(CRemConInterfaceBase& aInterface);
   132 	
   133 	/**
   134 	Register the interface with the selector. This is called by the 
   135 	interface's BaseConstructL. Takes ownership of aInterface.
   136 	 This function is not to be called outside of remconinterfacebase.dll. It is available for compatibility with previous
   137 	 versions, but it is intended to be called only by CRemConInterfaceBase::BaseConstructL.
   138 	 CRemConInterfaceBase-derived classes should indirectly perform a RegisterInterfaceL, by calling
   139 	 CRemConInterfaceBase::BaseConstructL from their construction functions.
   140 	@param aInterface The interface.
   141 	@param aRemConInterfaceFeatures The operation IDs of the interface.  Ownership is retained by the caller.  Any necessary
   142 			data will be copied by the interface selector.
   143 	*/
   144 	void RegisterInterfaceL(CRemConInterfaceBase& aInterface, RRemConInterfaceFeatures& aRemConInterfaceFeatures);
   145 	/** 
   146 	Register an error observer.  This is provided to allow the client to
   147 	discover when an error has occurred passively.
   148 	
   149 	@param aObserver An error observer to be notified on a passive error.
   150 					 NULL to stop receiving notifications.
   151 	*/
   152 	IMPORT_C void RegisterErrorObserver(MRemConErrorObserver* aObserver);
   153 
   154 	/**
   155 	Opens a controller session to RemCon. The session is connectionless until 
   156 	such time as GoConnectionOriented may be called.
   157 	@leave KErrInUse If a controller session is already open.
   158 	*/
   159 	IMPORT_C void OpenControllerL();
   160 
   161 	/**
   162 	Makes the controller session (which must already exist- use 
   163 	OpenControllerL) connection-oriented.
   164 	@param aConnection The remote to talk to. 
   165 	*/
   166 	IMPORT_C void GoConnectionOrientedL(const TRemConAddress& aConnection);
   167 
   168 	/**
   169 	Makes the controller session (which must already exist- use 
   170 	OpenControllerL) connectionless.
   171 	*/
   172 	IMPORT_C void GoConnectionlessL();
   173 
   174 	/**
   175 	Brings up a bearer-level connection.
   176 	The controller session must already exist (use OpenControllerL) and 
   177 	be connection-oriented.
   178 	@param aStatus TRequestStatus for asynchronous completion.
   179 	*/
   180 	IMPORT_C void ConnectBearer(TRequestStatus& aStatus);
   181 
   182 	/**
   183 	Cancels interest in the completion of a ConnectBearer request.
   184 	@return KErrNone.
   185 	*/
   186 	IMPORT_C TInt ConnectBearerCancel();
   187 
   188 	/**
   189 	Destroys a bearer-level connection. 
   190 	The controller session must already exist (use OpenControllerL) and be 
   191 	connection-oriented.
   192 	@param aStatus TRequestStatus for asynchronous completion.
   193 	*/
   194 	IMPORT_C void DisconnectBearer(TRequestStatus& aStat);
   195 
   196 	/**
   197 	Cancels interest in the completion of a DisconnectBearer request.
   198 	@return KErrNone.
   199 	*/
   200 	IMPORT_C TInt DisconnectBearerCancel();
   201 
   202 	/**
   203 	Opens a target session to RemCon.
   204 	@leave KErrInUse If a target session is already open.
   205 	*/
   206 	IMPORT_C void OpenTargetL();
   207 
   208 	/**
   209 	Opens a target session to RemCon.
   210 	@param aPlayerType The type of player
   211 	@param aPlayerSubType The sub-type of the player
   212 	@param aPlayerName  The name of the player in UTF-8.
   213 	@leave KErrInUse If a target session is already open.
   214 	*/
   215 	IMPORT_C void OpenTargetL(TPlayerType aPlayerType, TPlayerSubType aPlayerSubType, const TDesC8& aPlayerName);
   216 	/**
   217 	Sends a message to the remote device(s).
   218 	There should be only one command and response outstanding at any one time.
   219 	Send cannot be called again until aStatus is completed.
   220 	@panic RemConClient 4 If a send is already outstanding
   221 	@param aStatus TRequestStatus for asynchronous completion.
   222 	@param aInterfaceUid The UID of the concrete (outer-layer) interface 
   223 	sending the message.
   224 	@param aOperationId The interface-specific operation identifier.
   225 	@param aNumRemotes On success, the number of remotes the message was 
   226 	successfully sent to.
   227 	@param aMsgType Whether the message is a command or a response.
   228 	@param aData Any associated message data in interface-specific format.
   229 	*/
   230 	IMPORT_C void Send(TRequestStatus& aStatus, 
   231 		TUid aInterfaceUid,
   232 		TUint aOperationId, 
   233 		TUint& aNumRemotes,
   234 		TRemConMessageType aMsgType,
   235 		const TDesC8& aData = KNullDesC8());
   236 
   237 	/**
   238 	Sends a message to the remote device(s).
   239 	@param aStatus TRequestStatus for asynchronous completion.
   240 	@param aInterfaceUid The UID of the concrete (outer-layer) interface 
   241 	sending the message.
   242 	@param aOperationId The interface-specific operation identifier.
   243 	@param aNumRemotes On success, the number of remotes the message was 
   244 	successfully sent to.
   245 	@param aMsgType Whether the message is a command or a response.
   246 	@param aMsgSubType The subtype of the command of response
   247 	@param aData Any associated message data in interface-specific format.
   248 	*/
   249 	IMPORT_C void Send(TRequestStatus& aStatus, 
   250 		TUid aInterfaceUid,
   251 		TUint aOperationId, 
   252 		TUint& aNumRemotes,
   253 		TRemConMessageType aMsgType,
   254 		TRemConMessageSubType aMsgSubType,
   255 		const TDesC8& aData = KNullDesC8());
   256 
   257 	/**
   258 	Sends a 
   259 	*/
   260 	IMPORT_C void SendNotify(TRequestStatus& aStatus, 
   261 			TUid aInterfaceUid,
   262 			TUint aOperationId, 
   263 			TRemConMessageType aMsgType,
   264 			TRemConMessageSubType aMsgSubType,
   265 			const TDesC8& aData = KNullDesC8());
   266 	
   267 	/**
   268 	This method is for internal sub-system use only and should be not be used otherwise.
   269 	Sends a message to the remote device(s), without waiting for the send to complete
   270 	@param aInterfaceUid The UID of the concrete (outer-layer) interface 
   271 	sending the message.
   272 	@param aOperationId The interface-specific operation identifier.
   273 	@param aMsgType Whether the message is a command or a response.
   274 	@param aData Any associated message data in interface-specific format.
   275 	*/
   276 	IMPORT_C TInt SendUnreliable(
   277 		TUid aInterfaceUid,
   278 		TUint aOperationId, 
   279 		TRemConMessageType aMsgType,
   280 		const TDesC8& aData = KNullDesC8());
   281 	
   282 	/**
   283 	This method is for internal sub-system use only and should be not be used otherwise.
   284 	Sends a message to the remote device(s), without waiting for the send to complete
   285 	@param aInterfaceUid The UID of the concrete (outer-layer) interface 
   286 	sending the message.
   287 	@param aOperationId The interface-specific operation identifier.
   288 	@param aMsgType Whether the message is a command or a response.
   289 	@param aMsgSubType The subtype of the command of response
   290 	@param aData Any associated message data in interface-specific format.
   291 	*/
   292 	IMPORT_C TInt SendUnreliable(
   293 		TUid aInterfaceUid,
   294 		TUint aOperationId, 
   295 		TRemConMessageType aMsgType,
   296 		TRemConMessageSubType aMsgSubType,
   297 		const TDesC8& aData = KNullDesC8());
   298 	
   299 	/**
   300 	Cancels interest in the completion of a Send request.
   301 	@param aMsgType The type of the message, the completion of the send of 
   302 	which we are not interested in. This is needed because a single 
   303 	CRemConInterfaceSelector may have two sends outstanding at once, one on 
   304 	a controller session and another on a target session.
   305 	@return KErrNone.
   306 	*/
   307 	IMPORT_C TInt SendCancel(TRemConMessageType aMsgType);
   308 	
   309 	/**
   310 	This method is for internal sub-system use only and should be not be used otherwise.
   311 	Sends a message to the remote device(s) through the bulk path.
   312 	There should be only one response outstanding at any one time.
   313 	Send cannot be called again until aStatus is completed.
   314 	@panic RemConClient 4 If a send is already outstanding
   315 	@param aStatus TRequestStatus for asynchronous completion.
   316 	@param aInterfaceUid The UID of the concrete (outer-layer) interface 
   317 	sending the message.
   318 	@param aOperationId The interface-specific operation identifier.
   319 	@param aData Any associated message data in interface-specific format.
   320 	*/
   321 	IMPORT_C void SendBulk(TRequestStatus& aStatus, 
   322 		TUid aInterfaceUid,
   323 		TUint aOperationId,
   324 		const TDesC8& aData = KNullDesC8());
   325 	
   326 	/**
   327 	This method is for internal sub-system use only and should be not be used otherwise.
   328 	Sends a message to the remote device(s) through the bulk path, without 
   329 	waiting for the send to complete.
   330 	@param aInterfaceUid The UID of the concrete (outer-layer) interface 
   331 	sending the message.
   332 	@param aOperationId The interface-specific operation identifier.
   333 	@param aData Any associated message data in interface-specific format.
   334 	*/
   335 	IMPORT_C TInt SendBulkUnreliable(
   336 		TUid aInterfaceUid,
   337 		TUint aOperationId,
   338 		const TDesC8& aData = KNullDesC8());
   339 
   340 	/**
   341 	This method is for internal sub-system use only and should be not be used otherwise.
   342 	Cancels interest in the completion of a BulkSend request.
   343 	@return KErrNone.
   344 	*/
   345 	IMPORT_C TInt SendBulkCancel();
   346 
   347 	/**
   348 	Only called internally, by the Active Object which sucks messages out of 
   349 	RemCon. Note that the message type is not given- it is interpolated from 
   350 	the type of the session doing the receiving.
   351 	@param aInterfaceUid Interface UID of the new message.
   352 	@param aOperationId Operation ID of the new message.
   353 	@param aMsgSubType The message subtype.
   354 	@param aRemoteAddress The address of the remote which sent the message.
   355 	@param aData Data associated with the new message.
   356 	@param aType The type of session which received the message (from which 
   357 	the type of the message can be interpolated).
   358 	*/
   359 	void ReceiveComplete(TUid aInterfaceUid, 
   360 		TUint aOperationId, 
   361 		TRemConMessageSubType aMsgSubType,
   362 		const TRemConAddress& aRemoteAddress,
   363 		const TDesC8& aData,
   364 		TRemConClientType aType);
   365 	
   366 	/**
   367 	Only called internally, by the Active Object which sucks messages out of 
   368 	RemCon. Note that the message type is not given- it is interpolated from 
   369 	the type of the session doing the receiving.
   370 	@param aInterfaceUid Interface UID of the new message.
   371 	@param aOperationId Operation ID of the new message.
   372 	@param aData Data associated with the new message.
   373 	*/
   374 	void BulkReceiveComplete(TUid aInterfaceUid, 
   375 		TUint aOperationId,
   376 		const TDesC8& aData);
   377 
   378 	/**
   379 	Only called internally, by the Active Object which sucks messages out of 
   380 	RemCon.  This is called in the case of a session error.
   381 	
   382 	@param The error that has occurred.  If this is KErrServerTerminated, the
   383 		   error is fatal and the session must be restarted before any new 
   384 		   messages can be received.
   385 	*/
   386 	void Error(TInt aError);
   387 	
   388 	/**
   389 	Only called internally, by the Active Object which sucks messages out of 
   390 	RemCon Bulk Server.  This is called in the case of a session error.
   391 	
   392 	@param The error that has occurred.  If this is KErrServerTerminated, the
   393 		   error is fatal and the session must be restarted before any new 
   394 		   messages can be received.
   395 	*/
   396 	void BulkError(TInt aError);
   397 	
   398 	/**
   399 	Only called internally, by the Active Object which sucks messages out of
   400 	RemCon (bulk server).
   401 	*/
   402 	void BulkSessionConnectL();
   403 
   404 	/**
   405 	Getter for the current set of connections in the system (not just those 
   406 	associated with this session). The client is responsible for cleaning up 
   407 	aConnections- the addresses will be on the heap.
   408 	@param aConnections A collection of remote addresses, representing all the 
   409 	currently extant connections.
   410 	@return Error.
   411 	*/
   412 	IMPORT_C TInt GetConnections(TSglQue<TRemConAddress>& aConnections);
   413 
   414 	/**
   415 	Notification for changes in the set of connections.
   416 	@param aStatus TRequestStatus for asynchronous completion.
   417 	*/
   418 	IMPORT_C void NotifyConnectionsChange(TRequestStatus& aStatus);
   419 
   420 	/**
   421 	Cancels interest in the completion of an outstanding 
   422 	NotifyConnectionsChange operation.
   423 	@return KErrNone.
   424 	*/
   425 	IMPORT_C TInt NotifyConnectionsChangeCancel();
   426 	
   427 	/**
   428 	To determine if a target session has been opened.
   429 	@return EFalse if no session has been opened, ETrue otherwise.
   430 	*/
   431 	IMPORT_C TBool TargetOpened() const;
   432 
   433 	/**
   434 	To determine if a controller session has been opened.
   435 	@return EFalse if no session has been opened, ETrue otherwise.
   436 	*/	
   437 	IMPORT_C TBool ControllerOpened() const;
   438 
   439 private:
   440 	CRemConInterfaceSelector();
   441 	void ConstructL();
   442 
   443 private: // utility
   444 	void AssertSession(RRemCon* aSess, TInt aPanicCode) const;
   445 	TInt TryToReconnect();
   446 	TInt TryToReconnectBulk();
   447 	void OpenTargetCommonL();
   448 	void RegisterInterfaceCommonL(CRemConInterfaceBase& aInterface, const TDesC8& aFeatures);
   449 	void RegisterInterestedApisL(TRemConClientType aType);
   450 	
   451 	void EstablishBulkThreadBindingL();
   452 	
   453 	static TInt StaticBulkCleanup(TAny* aSelf);
   454 	void BulkCleanup();
   455 	TBool BulkOpened() const;
   456 
   457 private: // owned
   458 	CRemConInterfaceDetailsArray* iInterfaces;
   459 
   460 	RRemConController* iControllerSession;
   461 	RRemConTarget* iTargetSession;
   462 	RRemConBulk* iBulkSession;
   463 
   464 	CReceiver* iTargetReceiver;
   465 	CReceiver* iControllerReceiver;
   466 	CBulkReceiver* iBulkReceiver;
   467 
   468 	/** For all registered interfaces, this is the size of the biggest 
   469 	operation-associated data lump. */
   470 	TUint iControlMaxDataLength;
   471 	TUint iBulkMaxDataLength;
   472 
   473 	// The session to use for NotifyConnectionsChange and 
   474 	// NotifyConnectionsChangeCancel. It doesn't matter which we use- just one 
   475 	// that's connected will do. The only interesting bit is that the session 
   476 	// we called NotifyConnectionsChange on should be the one we call 
   477 	// NotifyConnectionsChangeCancel on, but as sessions are only closed when 
   478 	// 'this' comes down that's not a complication.
   479 	RRemCon* iNotificationSession;
   480 	
   481 	TRemConAddress iAddress;
   482 	
   483 	RHeap* iBulkHeap;
   484 	RThread iBulkThread;
   485 	RHeap* iSharedThreadHeap;
   486 	RSpecificThreadCallBack* iBulkCleanupCall;
   487 	RNestableLock*	iLock;
   488 private: // unowned	
   489 	MRemConErrorObserver* iErrorObserver;
   490 	};
   491 
   492 #endif // REMCONINTERFACESELECTOR_H