diff -r 000000000000 -r 72b543305e3a messagingappbase/obexmtms/obexmtm/obexutil/include/ObexSdpUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/obexmtms/obexmtm/obexutil/include/ObexSdpUtils.h Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,347 @@ +// Copyright (c) 2001-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 __OBEXSDPUTILS_H__ +#define __OBEXSDPUTILS_H__ + +#include +#include +#include + + +const TInt KMaxObexSupportedFormats = 7; //SDP Query will complete with KErrTooBig if remote device returns more than KMaxObexSupportedFormats format codes +typedef TBuf8 TObexSupportedFormatsList; + +/** +* Observer class for CObexSdpUtils. Contains one method which indicates the results of +* an SDP query. +*/ +class MObexSdpUtilsObserver +/** +@internalTechnology +@released +*/ + { +public: +/** + * SDP Query result + * + * @param aError If this is anything but KErrNone then the query has not completed correctly and all other parameters are meaningless. + * @param aPortNumber The RFCOMM port number that the remote device supports OBEX on + * @param aObexObjectPushProfileSupported ETrue if the remote device supports the Bluetooth OBEX Push Profile + * @param aObexObjectPushProfileVersion Version of Bluetooth OBEX Push Profile supported (only valid if aObexObjectPushProfileSupported == ETrue) + * @param aSupportedFormats Structure containing a list of the OBEX Object formats supported by the remote device + */ + virtual void RemoteBtObexQueryResult(TInt aError, + TInt aPortNumber, + TBool aObexObjectPushProfileSupported, + TInt aObexObjectPushProfileVersion, + TObexSupportedFormatsList aSupportedFormats) = 0; + }; + + +/** + * This class provides a single exported method to perform an SDP Query on a remote Bluetooth + * device, the results of which are returned via the MObexSdpUtilsObserver observer. + * + * This class uses a CSdpAgent object (and it's various observers) to process SDP records + * received from the remote Bluetooth device. Each SDP record is made up of attributes which + * in turn contain attribute components. CObexSdpUtils simply goes through these attribute + * components checking that we receive what we expect to and logging important information + * (e.g. port number OBEX is supported on). + */ +class CObexSdpUtils : public CBase, public MSdpAgentNotifier, public MSdpElementBuilder +/** +@internalTechnology +@released +*/ + { +public: + + /** + * Leave safe constructor + * + * @param aObserver Used to indicate results of SDP query + */ + + IMPORT_C static CObexSdpUtils* NewL(MObexSdpUtilsObserver& aObserver); + + /** + * Leave safe constructor (which adds the newly created object to the cleanup stack) + * + * @param aObserver Used to indicate results of SDP query + */ + + IMPORT_C static CObexSdpUtils* NewLC(MObexSdpUtilsObserver& aObserver); + + /** + * Destructor. This can be called before the SDP Query completes to safely cancel the + * query - N.B. this is the only way to cancel a pending query + */ + + ~CObexSdpUtils(); + + /** + * Perform SDP query on a remote bluetooth device. Result is returned through the MObexSdpUtilsObserver + * observer class. The query can be cancelled at any time by destroying this CObexSdpUtils + * object. + * + * @param aBtDevAddr The address of the bluetooth device + */ + + IMPORT_C void RemoteBtObexQueryL(TBTDevAddr aBtDevAddr); + +public: //from MSdpAgentNotifier + + /** + * Got an SDP record from the remote device, so check for errors and then request the + * first attribute. + * + * @param aError Error code + * @param aHandle Handle to the service recorde + * @param aTotalRecordsCount The total number of records + */ + + virtual void NextRecordRequestComplete(TInt aError, TSdpServRecordHandle aHandle, TInt aTotalRecordsCount); + + /** + * The overload of AttributeRequestL() that we are using in NextRecordRequestComplete() + * should NOT result in this function being called, if it does then halt the query with an + * error. + * + * @param aHandle The handle to the service record + * @param aAttrID The SDP Attribute ID + * @param aAttrValue The SDP Attribute Value + */ + + virtual void AttributeRequestResult(TSdpServRecordHandle aHandle, TSdpAttributeID aAttrID, CSdpAttrValue* aAttrValue); + + /** + * Called after we have got all the attribute components for current attribute being + * processed. If everything is OK get the next attribute or record. + * + * @param aHandle The handle to the service record + * @param aError The error code + */ + + virtual void AttributeRequestComplete(TSdpServRecordHandle, TInt aError); + +public: //from MSdpElementBuilder + + /** + * Not required for our SDP query, so we provide an empty implementation. + */ + + virtual MSdpElementBuilder* BuildUnknownL(TUint8 aType, TUint8 aSizeDesc, const TDesC8& aData); + + /** + * Not required for our SDP query, so we provide an empty implementation. + */ + + virtual MSdpElementBuilder* BuildNilL(); + + /** + * Got a Uint attribute componet. Check it is what we expected to receive. Get the next attribute component. + * + * @param aUint Attribute as Uint contained in a descriptor + */ + + virtual MSdpElementBuilder* BuildUintL(const TDesC8& aUint); + + /** + * Not required for our SDP query, so we provide an empty implementation. + */ + + virtual MSdpElementBuilder* BuildIntL(const TDesC8& aInt); + + /** + * Got a UUID attribute component. Check it is what we expected to receive. Get the next attribute component. + * + * @param aUUID The Bluetooth UUID of attribute + */ + + virtual MSdpElementBuilder* BuildUUIDL(const TUUID& aUUID); + + /** + * Not required for our SDP query, so we provide an empty implementation. + */ + + virtual MSdpElementBuilder* BuildBooleanL(TBool aBool); + + /** + * Not required for our SDP query, so we provide an empty implementation. + */ + + virtual MSdpElementBuilder* BuildStringL(const TDesC8& aString); + + /** + * Not required for our SDP query, so we provide an empty implementation. + */ + + virtual MSdpElementBuilder* BuildDESL(); + + /** + * Not required for our SDP query, so we provide an empty implementation. + */ + + virtual MSdpElementBuilder* BuildDEAL(); + + /** + * Not required for our SDP query, so we provide an empty implementation. + */ + + virtual MSdpElementBuilder* StartListL(); + + /** + * Not required for our SDP query, so we provide an empty implementation. + */ + + virtual MSdpElementBuilder* EndListL(); + + /** + * Not required for our SDP query, so we provide an empty implementation. + */ + + virtual MSdpElementBuilder* BuildURLL(const TDesC8& aURL); + +private: + + /** + * Simple constructor + * + * @param aObserver Used to indicate results of SDP query + */ + + CObexSdpUtils(MObexSdpUtilsObserver& aObserver); + + /** + * Necessary initial construction - Creates various structures used to check + * results obtained through CSdpAgent + */ + + void ConstructL(); + + /** + * Halt the current SDP query by destroying the CSdpAgent. + */ + + void HaltQuery(); + + /** + * Halt the current SDP query by destroying the CSdpAgent. Inform MObexSdpUtilsObserver + * observer that query has completed with an error. + * + * @param aError The error code + */ + + void HaltQueryWithError(TInt aError); + + /** + * Convert descriptor containing Uint to a numeric Uint. + * + * The Uints can be 1, 2, 4, 8 or 16 bytes long in theory. It is doubtful + * that the 8 or 16 byte variety would actually be used in our Obex Object + * Push Service case. The attribute Id will always be a 2 byte Uint but it + * is unclear from the spec what size the the port number should be. It is + * implied that it should only be 1 byte but in the EPOC implementation, it + * is returned as whatever size is it registered as (there is no type/size + * checking carried out in the SDP server). + * + * @param aUint The Uint as a descriptor + */ + + TUint32 UInt32(const TDesC8& aUint); + + /** + * Get next attribute if we are expecting another attribute. + * + * @param aHandle The handle to the service records + */ + + void RequestNextAttribute(TSdpServRecordHandle aHandle); + + /** + * Get next attribute component if we are expecting another attribute component. Set + * internal expectations for the next attribute component we receive. + */ + + void NextAttributeComponent(); + +public: + enum TType + { + ENoComponent, + EAnythingUntilNextExpectedValue, + EUUID, + EUint, + EUintPossible, + EUintListUntilEnd, //expected to get a list Uints for the rest of this attribute + EAnythingUntilEnd //not interested in what we get for this attribute anymore + }; + +private: + class TAttributeComponent + { + public: + TType iType; + TBool iSpecificValue; + TUint32 iValue; + }; + + class CAttribute + { + public: + + /** + * Simple constructor + */ + + CAttribute(); + + /** + * Destructor deletes array of attributes + */ + + ~CAttribute(); + + TUint16 iAttributeId; + CArrayFixFlat* iAttributeComponentArray; + }; + +private: + MObexSdpUtilsObserver& iObserver; //< Observer used to indicate result of SDP query + CSdpAgent* iSdpAgent; //< Makes SDP requests from remote SDP server + TBool iIsActiveSDPQuery; //< Indicates an SDP query has yet to complete + TInt iSdpRecordCount; //< Index of current record in the SDP query + TBool iNotThisSdpRecord; //< Indicates in remote device complies fully with obex object push profile + + CArrayPtrFlat* iAttributeArray; //< + TInt iAttribute; //< + TInt iAttributeComponent; //< + TUUID iCurrentUUID; //< + TUint32 iCurrentAttributeId; //< + TType iExpectedType; //< + TBool iExpectingSpecific; //< + TUint32 iExpectedValue; //< + TType iNextExpectedType; //< + TUint32 iNextExpectedValue; //< + + TInt iRemoteObexPort; //< Port for sending obex message + TBool iFullComplianceWithObexObjectPush; //< + TInt iObexObjectPushProfileVersion; //< + TObexSupportedFormatsList iSupportedFormatsList; //< + }; + +#endif // __OBEXSDPUTILS_H__