bluetooth/btstack/inc/blogger.h
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/inc/blogger.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,401 @@
+// Copyright (c) 1999-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 BLOGGER_H__
+#define BLOGGER_H__
+
+#include "debug.h"
+
+#ifndef BLOGGING__
+NONSHARABLE_CLASS(CBlogger): public CBase
+	{
+public:
+	IMPORT_C TAny* GetFloggerInfo();
+	};
+#endif
+
+#ifdef BLOGGING__
+
+// Stack Blogging Layers
+const TInt KBlogLayerLinkLayer =1;
+const TInt KBlogLayerL2CAP     =2;
+const TInt KBlogBadLayerChoice =3;
+const TInt KBlogLayerRFComm    =4;
+
+// Stack Layers Logging Masks
+const TInt KBlogNoLayer   =0x00000000;
+const TInt KBLogLinkLayer =0x00000001;
+const TInt KBlogL2CAP     =0x00000002;
+const TInt KBLogRFComm    =0x00000004;
+const TInt KBlogAllLayers =0x7fffffff;
+
+//Blogging Verbosity Levels
+const TInt KBlogVerbosityOff          =0x00000000; 
+const TInt KBlogVerbosityTimeCritical =0x00000001; 
+const TInt KBlogVerbosityMinimal      =0x00000002; 
+const TInt KBlogVerbosityNormal       =0x00000003; 
+const TInt KBlogVerbosityBTQualLevel  =0x00000004;
+const TInt KBlogVerbosityLoud         =0x00000005; 
+const TInt KBlogVerbosityAllLevels    =0x00000006;
+
+
+//BLogging Type Masks
+const TInt KBlogTypeLogAllMask          = 0xffffffff;
+const TInt KBlogTypeProtocol	        = 0x00000001;
+const TInt KBlogTypeTimestamp           = 0x00000002;
+const TInt KBlogTypeTimeout             = 0x00000004;
+const TInt KBlogTypeTestAppContext      = 0x00000008;
+const TInt KBlogTypeFCS                 = 0x00000010;
+const TInt KBlogTypeBaseband            = 0x00000020;
+const TInt KBlogTypeChannelNumber       = 0x00000040;
+const TInt KBlogTypePSMNumber           = 0x00000080;
+const TInt KBlogTypeIncomingPacket      = 0x00000100;
+const TInt KBlogTypeOutgoingPacket      = 0x00000200;
+const TInt KBlogTypeRawFrames           = 0x00000400;
+const TInt KBlogTypeL2CAPSignallerState = 0x00000800;
+const TInt KBlogTypeRFCOMMMuxState      = 0x00001000;
+const TInt KBlogTypeSapState            = 0x00002000;
+const TInt KBlogTypeCurrentState        = 0x00004000;
+const TInt KBlogTypeStateChange         = 0x00008000;
+const TInt KBlogTypeRequest             = 0x00010000;
+const TInt KBlogTypeExpectedResponse    = 0x00020000;
+const TInt KBlogTypeActualResponse      = 0x00040000;
+const TInt KBlogTypeInquiry             = 0x00080000;
+const TInt KBlogTypeInquiryResult       = 0x00100000;
+const TInt KBlogTypeKeyRegistration     = 0x00200000;
+const TInt KBlogTypeKeyFailure          = 0x00400000;
+const TInt KBlogTypeLinkKeyInteraction  = 0x00800000;
+const TInt KBlogTypeCtrlFrames          = 0x01000000;
+const TInt KBlogTypeUIHFrames           = 0x02000000;
+const TInt KBlogTypeMuxCtrlFrames       = 0x04000000;
+const TInt KBlogTypeCtrlFrameBits       = 0x08000000; 
+const TInt KBlogTypeOutgoingFrames		= 0x10000000; 
+const TInt KBlogTypeCreditAccounting    = 0x20000000;
+const TInt KBlogTypeSecurity            = 0x40000000;
+const TInt KBLogTypeLocalHCPokes        = 0x80000000;
+
+//Logging LITs
+
+
+_LIT(KBlogCommand, "command");
+_LIT(KBlogResponse, "response");
+
+
+_LIT(KBlogBluetoothAddrLit,"Bluetooth Address:");
+
+//Layer/Protocol dependent
+_LIT(KBlogIncomingPacket, "Incoming packet, Type %d, Size %d, Payload %08x"); //received data pkt with size and type of pkt
+_LIT(KBlogOutgoingPacket, "Outgoing packet, Type %d, Size %d, Payload %08x"); //sent data pkt with size and type of pkt
+_LIT(KBlogRawFrames, "Frame Type %d, 0x%8x");// frame type and content - different specific info required from different types of Frame
+_LIT(KBlogSapId, "%d SAP %08x"); //type of SAP (RFCOMM/L2CAP) and sap id
+_LIT(KBlogSapState, "SAP State %d");
+_LIT(KBlogCurrentState, "Current State %d");
+_LIT(KBlogStateChange, "State %d");
+_LIT(KBlogInquiryResult, "Inquiry Result");
+
+//L2CAP
+_LIT(KBlogChannelNumber, "Channel %d");
+_LIT(KBlogL2CAPSignallerState, "Signaller State %d");
+_LIT(KBlogPSMNumber, "PSM %d");
+_LIT(KBlogL2, "L2: ");
+_LIT(KBlogL2Test, "Test");
+_LIT(KBlogTest, "L2: TEST NUMBER is %d");
+
+
+
+
+//RFCOMM
+
+_LIT(KBlogMuxId, "MUX %08x");
+_LIT(KBlogFrameid, "Frame id %08x");
+//States
+_LIT(KBlogRFCOMMMuxState, "Mux State %d");
+//Frame Parts
+_LIT(KBlogDLCI, "         DLCI %d");
+_LIT(KBlogPFSet, "         P/F bit = %d");
+_LIT(KBlogEASet, "         EA  bit = %d");
+_LIT(KBlogCRSet, "         C/R bit = %d");
+_LIT(KBlogActualFCS, "         Actual PDU FCS %d");
+_LIT(KBlogComputedFCS, "         Computed FCS %d - (should be 0xCF)");
+_LIT(KBlogComparedFCS, "         Compared FCS %d");
+_LIT(KBlogSignals, "         Signals 0x%02x");
+
+//Timeouts
+_LIT(KBlogTimeout, "T1 timer expired awaiting response for ");
+//Ctrl Frames
+_LIT(KBlogSABM, "SABM");
+_LIT(KBlogDM, "DM");
+_LIT(KBlogUA, "UA");
+_LIT(KBlogDISC, "DISC");
+//Frame Types
+_LIT(KBlogFrameType, "Frame of type %d");
+_LIT(KBlogCtrlFrame, "Ctrl Frame: ");
+_LIT(KBlogUIHCtrlFrame, "UIH Ctrl Frame");
+_LIT(KBlogSimpleUIH, "UIH simple data frame");
+_LIT(KBlogShortUIH, "UIH simple data frame");
+_LIT(KBlogLongUIH, "UIH simple data frame");
+_LIT(KBlogCreditUIH, "UIH credit data frame");
+_LIT(KBlogLongCreditUIH, "Tx :Long UIH credit data frame with %d credits");
+_LIT(KBlogShortCreditUIH, "Tx: Short UIH credit data frame with %d credits");
+_LIT(KBlogMuxCtrlFrame, "Mux Ctrlframe");
+//MuxCtrlCommands
+_LIT(KBlogTestCommand, "TestCommand");
+_LIT(KBlogFcOn, "FcOn");
+_LIT(KBlogFcOff, "FcOff");
+_LIT(KBlogMSC, "MSC");
+_LIT(KBlogRPN, "RPN");
+_LIT(KBlogRLS, "RLS");
+_LIT(KBlogPN, "PN");
+_LIT(KBlogNSC, "NSC");
+//Data
+_LIT(KBlogNewData, "New packet of data arrived from L2CAP, count %d");
+_LIT(KBlogNewDataFrame, "Creating new datapacket for outbound queue, dlci %d, data length %d, sap %08x, ");
+_LIT(KBlogWriteData, "Writing data, 0x%x");
+_LIT(KBlogNonZeroLength, "with non-zero length");
+
+//Link Layer
+_LIT(KBlogNewLinkConnectionEvent,"LL: Connection complete event. Code %d, link type=%d ");
+_LIT(KBlogNewLinkConnectionReqEvent, "LL: Incoming connection request event"); 
+_LIT(KBlogNewLinkDisconnectionEvent,"LL: Disconnection complete event. Handle %x, Code %d, Reason %d");
+_LIT(KBlogHCSendPacketsOK,"LL: Notifying DataQ Controller of %d Completed packets from HC to remote");
+_LIT(KBlogLLDataIn ,"LL: Data received for handle %d, flags %d, length %d");
+_LIT(KBlogACLFrame,"LL: ACL Frame:");
+_LIT(KBlogLLDataIn2Null,"LL: Warning!! Data received with no datalink notifier in place");
+_LIT(KBlogLLScanEnableResult,"LL: ReadScanEnableResult received, with error code %d, value %d");
+_LIT(KBlogHCBufferSizeResult,"LL: ReadBufferSizeResult - aErr %d, aAclMaxLen %d, aNoACL %d");
+_LIT(KBlogHCReadTimeoutResult,"LL: Warning!! Unhandled ReadTimeoutResult (EConnectionAcceptTimeout)");
+_LIT(KBlogVendorEvent,"LL: Warning!! Just received a Vendor Specific Debug Event !");
+_LIT(KBlogHardwareError,"LL: Error! HardwareErrorEvent Received: %d");
+_LIT(KBlogHCIBufferNewCredits,"LL: HCI Buffer Strategy, Credit available, trying to issue.");
+_LIT(KBlogLLTransportFreed,"LL: LinkMgr, Transport is now free");
+_LIT(KBlogHCIssuedCmdCredits,"LL: LinkMgr, HC issued %d command credits");
+_LIT(KBlogLLSetLocalNameComplete,"LL: SetLocalName Command Complete Event");
+_LIT(KBlogLLWritePageTOComplete,"LL: WritePageTimeout Command Complete Event");
+_LIT(KBlogLLWriteCoDComplete,"LL: WriteClassOfDevice Command Complete Event");
+_LIT(KBlogLLWriteVoiceSettingComplete,"LL: WriteVoiceSetting Command Complete Event");
+_LIT(KBlogLLWriteScanEnable,"LL: WriteScanEnable Command Complete Event");
+_LIT(KBlogLLWriteCurrentIACLAPComplete,"LL: WriteCurrentIACLAP Command Complete Event");
+_LIT(KBlogLLSetHC2HostFCComplete,"LL: SetHostControllerToHostFlow Command Complete Event");
+_LIT(KBlogLLCommandWarning,"LL: Warning, Unhandled Command complete event! Opcode %d error code %d");
+_LIT(KBlogLLWriteAFHHostChannelClassification,"LL: WriteAFHHostChannelClassificationComplete Command Complete Event");
+_LIT(KBlogLLReadAFHChannelAssessmentModeComplete,"LL: ReadAFHChannelAssessmentModeComplete Command Complete Event");
+_LIT(KBlogLLWriteAFHChannelAssessmentModeComplete,"LL: WriteAFHChannelAssessmentModeComplete Command Complete Event");
+
+//MISC
+_LIT(KKeyRegistration, "Key Registration");
+_LIT(KKeyFailure, "Key Failure");
+_LIT(KPINKeyInteraction, "PIN Key");
+
+// Const Lit Lengths for the predifined Lits
+//255 is the max RDebug::Print size
+const TInt KRDBMaxLit=255;
+const TInt KBlogDateTimeLitLength=36; //depends on date, time formating lits
+const TInt KBlogTCPreambleLitLength=20;
+const TInt KBlogTestCaseMaxLitLength=KRDBMaxLit+KBlogDateTimeLitLength+KBlogTCPreambleLitLength;
+const TInt KBlogTestCaseResultPreambleLitLength=36;
+const TInt KBlogTestCaseResultMaxLitLength=KBlogTestCaseResultPreambleLitLength+KBlogDateTimeLitLength+KRDBMaxLit;
+const TInt KBlogTesterMessageInfoLitLength=100;
+const TInt KBlogTesterMessageInfoMaxLitLength=KBlogDateTimeLitLength+KBlogTesterMessageInfoLitLength;
+const TInt KBlogMessageMaxLitLength=512;
+
+//Blogging Output Resource Types
+// if we ever need to put more than 2 then implement it with dynamic binding
+const TInt KBlogOutputTypeIsRDebug  =0;
+const TInt KBlogOutputTypeIsFlogger =1;
+
+// The number of chars to be printed on single line over COM1 or on a file
+const TInt KBlogOutputWindowDefault=80;
+
+
+// Common Lits
+
+// need to be in sync with KBlogDateTimeLitLength
+_LIT(KBlogTimeFormat,"%J%:1%T%:2%S      "); 
+_LIT(KBlogDateFormat,"%1%/1%2%/2%3      ");
+_LIT(KBlogBlankDate,"--:--:----      ");
+_LIT(KBlogBlankTime,"--:--:--      ");
+_LIT(KBlogTestCaseLit,"Test Case Running:  ");
+// need to be in sync with KBlogTesterMessageInfoLitLength
+//_LIT(KBlogTesterMessageInfoLit,"[Message from the tester follows:]"); 
+_LIT(KBlogTesterMessageInfoLit,"Tester: "); 
+
+// Test Case Result Consts
+// these should be used with the KBloggerSetTestCaseResult option
+const TInt KBlogTestCaseResultPassed       = 0;
+const TInt KBlogTestCaseResultFailed       = 1;
+const TInt KBlogTestCaseResultInconclusive = 2;
+const TInt KBlogTestCaseResultSkipped      = 3;
+const TInt KBlogTestCaseResultUpperNo      = 3; // for bounds checking
+
+// Test Case Result Lits
+// these should be used with the KBloggerSetTestCaseResult option
+// remember to cjheck with KBlogTestCaseResultPreambleLitLength
+// if any of the below Lits gets changed
+_LIT(KBlogTestCaseResultLitPass,"[PASSED] test for test case : ");
+_LIT(KBlogTestCaseResultLitFailed, "[FAILED] test for test case : ");
+_LIT(KBlogTestCaseResultLitInconclusive, "[INCONCLUSIVE] test for test case : ");
+_LIT(KBlogTestCaseResultLitSkipped,"[SKIPPED] test for test case : ");
+
+enum TBTBloggingOptions
+	{
+	KBloggerSetLayers,
+	KBloggerSetVerbosity,
+	KBloggerSetLoggingMask,
+	KBloggerSetMedium,
+	KBloggerSetTestCaseName,
+	KBloggerSetOutputWindow,
+	KBloggerSetTestCaseResult, // to be used with the appropriate lits to indicate result
+	KBloggerSetTesterMessage,  // to be formated according to the corresponding lit
+	KBloggerSetAllOptions //should use TBlogSettings
+	};
+
+struct TBlogSettings
+	{
+	TInt iLayersToLog;
+	TInt iVerbosity;
+	TInt iLoggingMask;
+	TInt iMediumToLog;
+	TInt iOutputWindowSize;
+	TBuf<255> iTestCaseLit;
+	};
+typedef TPckgBuf<TBlogSettings> TBlogSettingsPckg;
+
+typedef TBuf<255>  TBlogTestCaseLit;
+
+enum TBloggerPanic
+	{
+	EBloggerLayerRegistrationOutOfRange    =0,
+	EBloggerLayerBloggetteAlreadyRegistered=1,
+	EBloggerLayerRequestedOutOfRange       =2,
+	EBloggerResourceTypeIsBogus            =3,
+	EBloggerTestCaseResultIsBogus          =4, // check your KBlogTestCaseResultUpperNo
+	EBloggerDescriptorLengthWasShorter     =5,
+	EBloggerMessageLengthTooLong           =6
+	};
+
+class CRfcommSAP;
+class CRfcommMuxCtrlFrame;
+class CRfcommMuxer;
+class CRfcommFrame;
+class CRfcommCtrlFrame;
+class CBloggette;
+
+NONSHARABLE_CLASS(CBlogger) : public CBase
+	{
+public:
+	~CBlogger();
+	static CBlogger* NewL();
+	void ConstructL();
+	TInt LoggingMask(TInt aLayer, TInt aVerbosity) const;
+	CBloggette* GetLayerBloggette(TInt aLayer); //only one per layer please
+	void Register(CBloggette* aLayerBloggette);
+	void Blog(const TDesC& aMessage, TInt aFrameWindow);
+	void Blog(const TDesC& aMessage);
+	void HexDump(const TDesC& aDescription,const TDesC8& aHexFrame,TInt aFrameWindow=KBlogOutputWindowDefault);
+	// to be used by the protocol layer which receives the SetOp
+	TInt UpdateLoggingSettings(TUint aOptionType,const TDesC8& aOption);
+	void StoreFloggerInfo(TAny* aLogInfo);
+	IMPORT_C TAny* GetFloggerInfo();
+private:
+	CBlogger();
+	void Panic(TBloggerPanic aPanic);
+	// Blogging calls
+	void BlogTestCase(TDesC& aTestCaseName);
+	void BlogTestCaseResult(TInt aTestCaseResult);
+	void BlogTesterMessage(TDesC& aTesterMessage);	
+	void DoBlog(const TDesC& aMessage, TInt aFrameWindow=KBlogOutputWindowDefault);
+	// Output and formating
+	void DoOutputToResourceL(const TDesC& aMessage);
+	void CreateBlogFileL();
+	void DoFileL();
+	void MakefilenameL(const TDesC &aFileName);
+	TInt DoDateTimeFormat(TDes& aDesToPrepend);
+	//for testing and debugging only
+	void DoBloggerTests(); 
+private:
+	friend class CHCILinkMgr; // for testing
+	CBloggette* iLLBloggette;
+	CBloggette* iL2Bloggette;
+	CBloggette* iRFBloggette;
+
+	TInt  iOutputWindowSize;
+	TInt  iVerbosityLevel;
+	TInt  iLayersToLogMask;
+	TInt  iLoggingMask;
+	TInt  iMediumType;  // 0 for port 0, 1 for Flogger - defaults to zero because member of C Class.
+	TBuf<KRDBMaxLit> iTestCaseLit;
+
+	TAny* iFloggerInfo; // when flogging is compiled in
+	RFs	  ifileserv;
+	RFile ifile;
+	TBool iFileExists;
+	HBufC* ifilename;
+	};
+
+NONSHARABLE_CLASS(CBloggette) : public CBase
+	{
+public:
+	~CBloggette();
+	inline TInt Layer() const;
+	void Log(TRefByValue<const TDesC> aFormatingLit, ...);
+	void HexDump(TRefByValue<const TDesC> aDescription,const TDesC8& aHexFrame, TInt aFrameWindow=80);
+	virtual TDesC NameDes()=0;
+protected:
+	CBloggette(CBlogger* aProvider, TInt aLayer);
+	TInt	  iLayer;
+	CBlogger* iBlogger;
+	};
+
+NONSHARABLE_CLASS(CLLBloggette) : public CBloggette
+	{
+public:
+	static CLLBloggette* NewL(CBlogger* aProvider, TInt aLayer); //only one per layer please
+	~CLLBloggette();
+	virtual TDesC NameDes();
+private:
+	CLLBloggette(CBlogger* aProvider, TInt aLayer);
+	};
+
+NONSHARABLE_CLASS(CL2Bloggette) : public CBloggette
+	{
+public:
+	static CL2Bloggette* NewL(CBlogger* aProvider, TInt aLayer);
+	~CL2Bloggette();
+	virtual TDesC NameDes();
+private:
+	CL2Bloggette(CBlogger* aProvider, TInt aLayer);
+	};
+
+NONSHARABLE_CLASS(CRFBloggette) : public CBloggette
+	{
+	friend class CRfcommCtrlFrame;
+public:
+	static CRFBloggette* NewL(CBlogger* aProvider, TInt aLayer);
+	~CRFBloggette();
+	virtual TDesC NameDes();
+private:
+	CRFBloggette(CBlogger* aProvider, TInt aLayer);
+	friend class CRfcommFrame; //Shehla
+	friend class CRfcommMuxer; //Shehla	
+	void Timeout(/*CRfcommSAP* aSAP, CRfcommMuxer* aMux,  */CRfcommFrame* aFrm );
+	void ExplainOutgoingFrame(CRfcommFrame* aFrm, CRfcommMuxer* aMux);
+	void ExplainIncomingFrame(TUint8 addr, TUint8 ctrl, TBool poll);
+	void LogMuxCommand(CRfcommSAP* aSAP, CRfcommMuxer* aMux, TUint8 aCommand);
+	void IncomingCtrlMessage(TUint8 aCtrlmessage, TInt aLength);
+	};
+
+#endif
+#endif
+