bluetoothcommsprofiles/btpan/panagt/panagtutils.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 25 May 2010 13:54:55 +0300
branchRCL_3
changeset 17 32ba20339036
parent 0 29b1cd4cb562
permissions -rw-r--r--
Revision: 201018 Kit: 2010121

// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
//

#ifndef PANAGTUTILS_H
#define PANAGTUTILS_H

#include <e32std.h>
#include <e32base.h>

/**
@file
@note Global panic function and async event helper class for role state machine
The async event helper class is used because the main agent class cannot be derived from CActive, so the helper class is just a small proxy to allow the role state machine to handle async events
*/

namespace PanAgent
/**
@internalComponent
@released
@since v8.1
*/
{

_LIT(KPanAgentName, "PanAgent");
_LIT(KPanAgentPanic, "PanAgentPanic");

enum TPanAgentPanic
/**
PAN agent panic codes
@internalComponent
*/
	{
	// General panics
	ENullNifmanNotifyPointer = 0,								//< Attempt to use iNotify pointer to nifman when it was null
	ENullCommdbHandle = 1,										//< Attempt to access commdb when the agent has not got a handle yet
	ENullBnepConnectionManager = 2,								//< Attempt to use the BNEP connection manager before the handle has been fetched from the BNEP packet driver
	EPanAgentDeletedWithDevicesStillAttached = 3,				//< Attempt to delete the pan agent when there are still devices in the device array
	ENullDeviceSelector = 4,									//< Attempt to use the device selector when is doesn't exist
	ENullTAnyPointer = 5,										//< Someone's tried to perform a callback with a NULL pointer instead of the this pointer
	EOldFormatPanRoleBeingUsedInCommdb = 6,						//< An old format commdb is being used, which contains a PAN role of 0xffff. This was removed during development (there was no need for EPanRoleUnknown and EPanRoleNone, so they were folded into one). This panic is here purely to stop people using those old commdb databases by mistake.
	ESomeoneLeftWithoutGivingAReason = 7,						//< A state has left, but no-one recorded an error code to indicate what the problem was!
	EAttemptToDisconnectBeforeConnectComplete = 8,				//< Attempt to use the wrong error path - before ConnectComplete() has been called on nifman, all errors should be signalled via there; only once connected should we try to disconnect
	EAsyncOperationOnOutgoingConnectionStarterWhenItsNotPerformingAnAsyncRequest = 9, //< Attempt to call RunL() or DoCancel() on the outgoing connection starter when it's not doing anything that requires an async operation - this suggests it has got into an incorrect state
	EDelayedOpenHelperActiveWhenBothListeningAndAcceptingSocketsAreOpen = 10,
	// PAN role state machine related panics
	ENoState = 11,												//< Attempted call to state when there isn't one
	EPanAgentRoleStateMachineSelectedUnknownAsLocalRole = 12,	//< The PAN agent role state machine selected an illegal role as the local role
	EPanAgentRoleStateMachineInvalidLocalRole = 13,				//< The PAN agent role state machine selected an invalid local role.
	EDeviceInNegotiatingModeOnEntryToUState = 14,				//< Suggests that the negotiating state forgot to update the state of the device in the array when negotiation completed
	EDeviceInNegotiatingModeOnEntryToGnOrNapState = 15,				//< Suggests that the negotiating state forgot to update the state of the device in the array when negotiation completed
	EDeviceAttemptingToNegotiateThatIsNotInArray = 16,			//< Attempt to negotiate by a device that is not in the array
	EIncomingConnectionListenerStillActiveAtShutdown = 17,		//< No-one's cancelled the incoming connection listener before shutting down
	EActiveDevicesInArrayInInitialisingState = 18,				//< There are active devices in the array when the role state machine is in the initialising state (so either there was an incorrect transition to this state in the role state machine, or someone's put entries in the device array in the wrong state)
	ENegotiatingDevicesInArrayInInitialisingState = 19,			//< There are negotiating devices in the array when the role state machine is in the initialising state (so either there was an incorrect transition to this state in the role state machine, or someone's put entries in the device array in the wrong state)
	EActiveDevicesInArrayInNegotiatingPanUState = 20,			//< There are active devices in the array when we are negotiating PAN-U role (in which case we shouldn't be negotiating PAN-U role)
	EActiveDevicesInArrayInRenegActConnToGnOrNapRoleAtOurBehest = 21, //< There is an active device in the array, and since we negotiating with a device to go to GN/NAP state, there shouldn't be (we're not in GN/NAP state yet!)
	ENoActiveDeviceInArrayInRenegActConnToURoleAtPeersBehest = 22, //< There is NOT an active device in the array
	ENoActiveDevicesInArrayInRenegActConnToGnOrNapRoleAtPeersBehest = 23, //< There is NOT an active device in the array
	EMoreThanOneDeviceInNegotiatingModeInArray = 24,				//< There is more than one negotiating device in the array (which there shouldn't be, as negotiation should be serialised)
	EUnexpectedDeviceInNegotiatingModeInArray = 25,				//< A local device is in the negotiating state when it shouldn't be.
	EDeletingRemoteDeviceWithoutDisconnecting = 26,				//< The remote device object has been deleted without disconnecting the remote device first (suggests an incorrect state transition in remote device state machine)
	ETooManyDevicesAttachedInURole = 27,							//< Attempt to enter a PAN-U role with more than one device attached
	EUnexpectedDeviceActiveReceivedByState = 28,					//< DeviceActive() received by state that does not allow active devices
	EUnexpectedDeviceRoleChangeFailedReceivedByState = 29,		//< DeviceRoleChangeFailed() received by state in which devices should not be changing roles 
	EUnexpectedDeviceDisconnectedReceivedByState = 30,			//< DeviceDisconnected() received by state that does not allow devices to disconnect
	EUnexpectedIncomingConnectionFromPeerReceivedByState = 31,	//< Incoming connection from peer received by state in which devices should not be receiving incoming connections
	EUnexpectedRoleChangeRequestFromPeerReceivedByState = 32,	//< Role change request from peer received by state in which devices should not be receiving incoming role changes from the peer device
	EUnexpectedInitiateOutgoingConnectionReceivedByState = 33,	//< Initiate outgoing connectionreceived by state in which devices should not be initiating an outgoing connection
	EUnexpectedPerformLocalRoleChangeRequestReceivedByState = 34, //< Local r	ole change request received by state in which devices should not be perfroming a local role change
	EDeviceActiveCalledByDeviceNotInActiveState = 35,			//< A device has sent a DeviceActive() message, but it is not in the Active state
	EDeviceDisconnectedThatWasNotInArray = 36,
	ETooManyDevicesAttachedWhenRenegotiatingActiveConnectionForGnOrNapUpgrade = 37, //< The renegotiating active connection for GN/NAP upgrade state can only be used from U role
	ENoActiveDeviceInArray = 38,									//< We're trying to find an active device and there isn't one in the array
	EShutdownStateNotLastState = 39,								//< The PAN agent was deleted without the shutdown state being the last state used.
	ENoActiveDeviceAfterNegotiationCompleted = 40,				//< A DeviceActive() was received, but there is no active device in the array
	EMoreThanOneActiveDeviceWhenTryingToRenegotiateUToGnOrNapRoleChange = 41, //< We're attempt to upgrade from U to GN/NAP, but there's more than one active device in the array (which is wrong if we've just come out of U role)
	ETryingToLockBasebandRolesWhenDevicesAreNegotiating = 42,	//< Don't want to do this - we should only try locking roles when we're in a non-negotiating state
	EFixedLocalRoleUForListeningIap = 43,							//< A fixed local role is set for a listening IAP.
	EActiveDeviceThatIsNotInArray = 44,
	EDeviceNotActive = 45,
	EInvalidLocalRoleFromRoleChangeRequestFromPeer = 46,			//< Invalid role provide to RoleChangeRequestFromPeer method
	EInvalidRoleForIncomingConnectionFromPeerL = 47,				//< Invalid role provide to IncomingConnectionFromPeerL method
	// PAN remote device state machine related panics
	ENoRemDevState = 48,											//< Attempted call to state when there isn't one
	ESendingUnknownRoleInRoleRequest = 49,						//< Attempt to send EPanRoleUnknown in a role request - this is an absolute no-no
	ECallToBnepChannelBeforeChannelSetup = 50,					//< Attempt to use BNEP channel to remote device before it has been created
	EUnexpectedAsyncEventReceivedByState = 51,					//< A state has received an asynchronous event (from someone signalling the state machine's TRequestStatus), but wasn't expecting to (ie. there's something wrong with the sequence of states)
	EInvalidReadyForRoleRequestReceived = 52,					//< The remote device object has been incorrectly signalled by the main role state machine (the remote device is not in a state where it can performing role negotiation)
	EInvalidBnepRoleResponseReceived = 53,						//< The remote device object has been incorrectly signalled by BNEP indicating the remote device has responded to a role request (this occurs in states where the remote device has not been connected yet)
	EInvalidBnepRoleRequestReceived = 54,						//< The remote device object has been incorrectly signalled by BNEP indicating the remote device has sent us a role request (this occurs in states where the remote device has not been connected yet)
	EInvalidRemoteDeviceDisconnectReceived = 55,					//< The remote device object has been incorrectly signalled by BNEP indicating the remote device has disconnected (this occurs in states where the remote device has not been connected yet)
	ENoStateOnExit = 56,											//< The remote device object is being deleted without being in any state (this suggests a serious problem - why was it created in the first place?)
	EPanAgentRoleStateMachineReturnedUnexpectedErrorCode = 57,	//< The RoleRequest() returned an unexpected error code which we could not handle
	EChannelControllerAlreadyExists = 58,						//< The remote device object is trying to create a BNEP channel when it already has one
	ETryingToDecideWhetherToBecomePiconetMasterBasedOnInvalidRole = 59, //< like it says, the local role was not U, GN, or NAP
	ENullRemoteDeviceAddress = 60,								//< The address of the remote device is not set
	EDoubleShutdownAttemptOnDevice = 61,							//< Two attempts have been made to use the preallocated shutdown state (perhaps the shutdown state itself left?)
	ERemoteDeviceDidNotUsePreallocatedShutdownState = 62,		//< Attempt to shutdown by using something other than the state machine's internally held shutdown state (someone's new'ed up a shutdown state themselves)
	ENoNextStateSet = 63,										//< No state was chosen as the next state
	ERoleStateMachineRequestedWeRenegotiateRolesThenReturnedLocked = 64, //< If the role state machine triggers renegotiation on a device it should ensure it is ready to accept a role request (if it isn't, then something's gone very wrong)
	ERoleStateMachineCalledReadyForRoleRequestThenReturnedLocked = 65, //< The role state machine told us it was unlocked, then returned locked!  Must be bug in the role state machine
	EStillActiveOnExit = 66,										//< There's still a request outstanding when we're being deleted!
	EInvalidResultCodeFromNapUplinkAuthorisationNotifier = 67,		//< Invalid result code received from Local Role selection notifier
	// Local SDP helper class panics
	EAttemptToRegisterIllegalPanRoleInLocalSdpDatabase = 68, 	//< Someone's trying to register a local role other than PAN U, GN, or NAP
	EPanRoleOutOfBounds = 69,									//< The PAN role were were sent is invalid, and therefore cannot be used as an index to the SDP registration array
	// CPanAgtRemDevSelector panics
	EPanAgtRemDevSelectorNoDevicesToConnect = 70,				//The dev selector is asked to make a connection while there is no devices in the list
	
	EPanAgtUnexpectedMessage = 71,                               // An sync message was received from somewhere that was not expected
	EPanAgtUnexpectedStateChange = 72,                           // A response from BNEP was received but the state machine was not in a Paused state (meaning something else unexpectedly changed it while we waited)
	EPanAgtMissingBinding = 73,                                  // There is probably a binding missing between ESock_IP and ESock_BT (also worth checking that there is one between ESock_DIP and ESock_BT)

	EInvalidRemoteDeviceState = 74,

	//RNDIS&BT P&S panics
	EIPBearerCoexistancePropertyIsNotDefined = 75,                // The property is not defined when we require it, maybe it's deleted by mistakes.
	EBTPanIsAlreadyActive = 76,								     // BT PAN is active in a improper situation.
	ERndisIsActiveWhenBTPanTriesToBeActive = 77,                  // Rndis is allready active when BT Pan tries to be active
	EInvalidIPBearerCoexistanceProperty = 78,                     // Facing an invalid IP bearer property
	EClearKeyWhenNoneIsActive = 79,		                         // BT PAN is going to clear the property, but non-service is active
	EIPBearerCoexistancePropertyCanNotBeDefined = 80,             // The property define returns error other than KErrAlreadyExists
	EIPBearerCoexistancePropertySetFailed = 81,                   // Setting Property failed 
	EIPBearerCoexistancePropertyGetFailed = 82,	                 // Getting Property failed
	EPropertyIsNoneIsActiveWhenBTPanIsActive = 83,                // Property is none active when BT Pan is active
	EImproperSituationToSetPropertyToBTPanIsActive = 84,          // Set property to BT PAN is active in an improper situation
	EBTPanInitiateDirectTransitionToRndis = 85,                   // BT PAN Initiate a direct transition to Rndis
	ECreatePanCoexistenceConnectionControllerFailed = 86,         // Contruct PAN Coexistence connection controller failed during the contruction time
	EIPBearerCoexistancePropertyShouldnotBePanIsActive = 87,      // The P&S key should not be BT PAN active
	ENoPanConnectionExistsWhileInPanIsActiveCoexistencePandSState = 88, //P&S key is BT PAN active when there is no BT PAN connection existing
	};

/**
Panics raised by state machine default behaviour are multiplied by this
factor.  The less signifigant digits are then available to carry a state
index, allowing more information when fixing defects.

For example, a unexpected device active passed to the PAN local state machine may 
raise panic 'PanAgentPanic 321008' if it occurs in the 'Negotiating Gn Role' state.
*/
const TInt KStatePanicMultiplier = 10000;

/**
A delimiter to prevent a panic code of 0 creating ambigious panics.
Without this panic code 0 in state 8 and panic code 8 (not in the state 
machine) would be identical.
*/
const TInt KStatePanicDelimiter = 1000; // '1' is the delimiter

void PanAgentPanic(TPanAgentPanic aPanicCode);
void PanAgentPanic(TPanAgentPanic aPanicCode, TInt aState);
	
class MPanAgtTimerCallback
/**
Callback from timer helper class
@internalComponent
*/
	{
public:
	virtual void TimerComplete() = 0;
	virtual void TimerError(TInt aError) = 0;
	
protected:
	virtual ~MPanAgtTimerCallback() {};
	};
	
NONSHARABLE_CLASS(CPanAgtTimerHelper) : public CActive
/**
A helper class for a state that is already using its TRS-type async event for something else
@internalComponent
*/
	{
public:
	static CPanAgtTimerHelper* NewL(MPanAgtTimerCallback& aCallback);
	void SetTimer(TTimeIntervalMicroSeconds32 aInterval);
	
	// CActive-derived methods
	virtual void RunL();
	virtual void DoCancel();

private:
	CPanAgtTimerHelper(MPanAgtTimerCallback& aCallback);
	void ConstructL();

private:
	RTimer iTimer;
	MPanAgtTimerCallback& iCallback;
	};

}	// PanAgent
#endif // PANAGTUTILS_H