obex/obexprotocol/obex/public/obexbase.h
changeset 0 d0791faffa3f
child 6 f8e15b44d440
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/obex/obexprotocol/obex/public/obexbase.h	Tue Feb 02 01:11:40 2010 +0200
@@ -0,0 +1,235 @@
+// Copyright (c) 2003-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:
+//
+
+/**
+ @file
+ @publishedAll
+ @released
+*/
+
+#ifndef __OBEXBASE_H
+#define __OBEXBASE_H
+
+#include <obextypes.h>
+#include <mobexnotify.h>
+
+class CObexTransportControllerBase;
+class TObexTransportInfo;
+class CObexPacket;
+class CObexNotifyHandlerBase;
+
+/**
+@publishedAll
+@released
+
+This class is the common base class for any object which wishes
+to use the Obex Server or Client.
+The class which owns a CObexClient or CObexServer must be provide an object
+derived from this class to handle the call from the Server/Client for a request
+for a Password.
+@see CObex::SetCallBack
+*/
+class MObexAuthChallengeHandler
+	{
+public:
+	/**
+	Indicates that the server/client has received an Authentication challenge. The challenge
+	can only be responded to once a password has been retrieved by some means and passed
+	back to the calling class. The password is passed back via CObex::UserPasswordL
+	@param aRealm This will contain the Realm specified by the unit forcing the
+	Authentication, if no UserID was supplied then this parameter will be of zero length. 
+	*/
+	virtual void GetUserPasswordL(const TDesC& aRealm) = 0;
+		
+	/**
+ 	Returns a null aObject if the extension is not implemented, or a pointer to another interface if it is.
+	@param aInterface UID of the interface to return
+	@param aObject the container for another interface as specified by aInterface
+	*/
+	IMPORT_C virtual void MOACH_ExtensionInterfaceL(TUid aInterface, void*& aObject);
+	};
+
+/**
+This class is the common base class for CObexClient and CObexServer. It is 
+an abstract class and cannot be instantiated in itself. However, it does 
+contain user functionality common to both client and server connections.
+
+Provides the basic OBEX transport functionality (sending and receiving 
+files)
+Client and server provide the more specialied APIs for
+- initiation or response to puts & gets
+- (possible) handling of more generalised 'objects' (prob. with data buffered through a file).
+
+This class is not designed for user derivation
+
+@publishedAll
+@released
+*/
+NONSHARABLE_CLASS(CObex) : public CBase, protected MObexNotify
+	{
+public:
+	/**
+	Describes the information set or received in a SETPATH command.
+	
+	The first bit of iFlags, 0, can be set to indicate to the receiver of SETPATH to backup a level before applying the path name.
+	The second bit of iFlags, 1, can be set to indicate to the receiver of SETPATH to NOT create the directory if it doesn't exist.
+	The iConstants variable is always set to zero as it is reserved. 
+	The iName variable indicates the directory to create or go to, and does not include the root directory of the receiver (i.e. 
+	if the directory to be set is C:\notes then iName is set to "notes").
+	 If  a name is not set then set CObex::TSetPathInfo::iNamePresent to false. 
+	*/
+	NONSHARABLE_CLASS(TSetPathInfo)
+		{
+	public:
+		IMPORT_C TSetPathInfo();
+		TSetPathInfo(const TObexSetPathData& aData);
+		IMPORT_C TBool Parent() const;
+		TUint8 iFlags;
+		TUint8 iConstants;
+		TBuf<KObexObjectDescriptionSize> iName;
+		/** Whether iName is present in this SETPATH info */	
+		TBool iNamePresent;	
+	private:
+		// This data padding has been added to help prevent future binary compatibility breaks	
+		// Neither iPadding1 nor iPadding2 have been zero'd because they are currently not used
+		TUint32     iPadding1; 
+		TUint32     iPadding2; 				
+		};
+		
+	/**
+	Current obex connection state
+	In general, the further through the enum the values are,
+	the further through the connection process the state machine
+	will be.
+	*/
+	enum TConnectState 
+		{ 
+		EConnIdle,					/** Nothing is happening */
+		EConnTransport,				/** Transport Link connected not yet established true Link */
+		EConnObex,					/** full connection established */
+		ESimpleConnRequest,			/** Connect without Auth has been sent by ClientReceived by Server */
+		EConnChallRxed,				/**  Server has issued a challenge, to a Client cionnect */
+		ESimpleConnChallIssued,		/** Server, received Simple Connect but Server Challenge issued */
+		EChallConnRequested,		/** Connect with Auth has been sent by Client/Received by Server */
+		EChallConnChallIssued,		/** Server has sent a Challenge & Resp to a Client EChallConnRequest */
+		EWaitForFinalResponse,		/** Client, waiting for final success/fail not chall-response expected
+									    Server, Waiting for final Resp fromm Client to Challenge */
+		EFinalResponseReceived,		/** Server, the final response has been received */
+		EFinalChallRxed,			/** Server, Client connect with challenge, Server responds with challenge, Client re-issued original/new challenge */
+		EWaitForUserInput,			/** waiting for the user */
+		EDropLink					/** drop the link */
+		};
+
+	/**
+	The Obex operation currently being performed.
+	*/
+	enum TOperation 
+		{ 
+		EOpConnect		= 0x00, /** Connect */
+		EOpDisconnect	= 0x01, /** Disconnect */
+		EOpPut			= 0x02, /** Put */
+		EOpGet			= 0x03, /** Get */
+		EOpSetPath		= 0x05, /** SetPath */
+		EOpAbort		= 0xFF,	/** Abort - must fit in one pkt so final bit is always set */
+		EOpAbortNoFBit	= 0x7F, /** Abort (internal, never transmitted) */
+		EOpGetResponse  = 0xFD,	/** Internal - not actually an obex operation. */
+		EOpIdle			= 0xFE,	/** Internal - not actually an obex operation. */
+		};
+		
+	/**
+	Flags to suppress the authentication elements of the authentication challenge header.
+	*/
+	enum TObexSuppressedAuthElements
+		{
+		EObexNoSuppressedAuthElements				= 0x00,
+		EObexSuppressChallengeOptionsAuthElement	= 0x01,
+		EObexSuppressRealmAuthElement				= 0x02,
+		EObexSuppressAllAuthElements				= EObexSuppressChallengeOptionsAuthElement | EObexSuppressRealmAuthElement // Must be last
+		};
+	
+	virtual ~CObex();
+	IMPORT_C void SetCallBack(MObexAuthChallengeHandler& aCallBack);
+	IMPORT_C TBool IsConnected() const;
+	IMPORT_C TBool IsStrictPeer() const;
+	IMPORT_C const TObexConnectInfo& LocalInfo() const;
+	IMPORT_C TInt SetLocalWho(const TDesC8& aInfo); 
+    IMPORT_C const TObexConnectInfo& RemoteInfo() const;
+   	IMPORT_C void SuppressAuthenticationHeaderElements(TObexSuppressedAuthElements aSuppressedObexAuthElements);
+	
+	virtual void UserPasswordL( const TDesC& aPassword) = 0; 
+	IMPORT_C void RemoteAddr(TSockAddr& anAddr); 
+
+	TConnectState GetConnectState() const;
+
+	IMPORT_C TBool IsAuthenticating() const;
+	
+	// Handling notified events.
+	void NotifyProcess(CObexPacket& aPacket);
+	void NotifyError(TInt aError);
+	void NotifyTransportUp();
+	void NotifyTransportDown(TBool);
+	
+public: // Implementation of MObexNotify Interface (No longer used)
+	virtual void Process(CObexPacket& aPacket);
+	virtual void Error(TInt aError) ;
+	virtual void TransportUp();
+	virtual void TransportDown(TBool aForceTransportDeletion);
+	
+protected:
+	CObex();
+	virtual void ConstructL(TObexTransportInfo& aObexTransportInfo);
+	virtual TInt ParseConnectPacket(CObexPacket& aPacket) = 0;	
+	void SetConnectState(TConnectState aNewState);
+	IMPORT_C TConnectState ConnectState() const;	// same as GetConnectState - has to be maintained here for BC
+	virtual void OnPacketReceive(CObexPacket& aPacket) =0;
+	virtual void OnError(TInt aError) =0;
+	virtual void OnTransportUp() =0;
+	virtual void OnTransportDown() =0;
+	void ProcessChallengeL(const TObexInternalHeader& hdr);			//process the received challenge
+	void ProcessChallResponseL(const TObexInternalHeader& hdr);		//process the response to challenge
+	TInt GenerateChallenge(CObexPacket& aPacket);					//generate a challenge 
+	void PrepareChallResponseL(const TDesC& aPassword);				//generate a response to challenge
+																		//after user Password input
+	void ForcedTransportDown();
+	void ControlledTransportDown();
+	void RemoteInfoCleanup();
+	void CancelObexConnection();
+protected:
+	TConnectState iConnectState;
+	CObexTransportControllerBase* iTransportController;
+	TObexConnectInfo iLocalInfo;
+	TObexConnectInfo iRemoteInfo;
+	MObexAuthChallengeHandler* iCallBack;
+	TNonce iOutgoingNonce; //nonce used when challenging
+	TNonce iIncomingNonce; //nonce used when receiving a challenge
+	HBufC8* iChallPassword; //password used when challenging
+	HBufC8* iRespPassword; //password used when responding to a challenge
+	HBufC8* iRxChallenge;
+	TBuf8<KChallResponseSize> iOutgoingChallResp;//response to the previously issued challenge
+								//16 nonce, 16 digest resp, 20 UserID, 3*(tag+size)
+	TBuf8<KChallResponseSize> iIncomingChallResp;//response received from previous challenge
+	TBuf8<KObexRespSize> iIncomingRequestDigest;
+	HBufC* iRemoteUID; //UID of remote device
+	HBufC* iRemoteRealm;//Realm of remote device
+	CObexAuthenticator* iAuthEngine;
+	TBool iChallenge; //to challenge or not to challenge?
+	TBool iUserIDRequested; //does the challenge insist that a UserID is returned
+	TBool iReserved; //released boolean now available for future use
+	TOperation iCurrentOperation;
+	CObexNotifyHandlerBase* iNotifyHandler;
+	TUint iSuppressedObexAuthElements;
+	};
+
+#endif // __OBEXBASE_H