syncmlfw/common/obex/obexclient/src/NSmlBTServiceSearcher.cpp
changeset 0 b497e44ab2fc
child 25 b183ec05bd8c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/common/obex/obexclient/src/NSmlBTServiceSearcher.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,261 @@
+/*
+* Copyright (c) 2002 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:  SyncML Obex client
+*
+*/
+
+
+#include "NSmlBTServiceSearcher.h"
+
+//============================================================
+// CNSmlBTServiceSearcher definition
+//============================================================
+
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::CNSmlBTServiceSearcher()
+//------------------------------------------------------------
+CNSmlBTServiceSearcher::CNSmlBTServiceSearcher( const TBTConnInfo& aBTConnInfo )
+:  iIsDeviceSelectorConnected(EFalse),
+   iBTConnInfo( aBTConnInfo )
+    {
+	iResponse().SetDeviceAddress( aBTConnInfo.iDevAddr );
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::~CNSmlBTServiceSearcher()
+//------------------------------------------------------------
+CNSmlBTServiceSearcher::~CNSmlBTServiceSearcher()
+    {
+    if( iIsDeviceSelectorConnected )
+        {
+        iDeviceSelector.CancelNotifier( KDeviceSelectionNotifierUid );
+        iDeviceSelector.Close();
+        }
+	Finished();
+    delete iSdpSearchPattern;
+    iSdpSearchPattern = NULL;
+
+    delete iAgent;
+    iAgent = NULL;
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::SelectDeviceByDiscoveryL( TRequestStatus& aObserverRequestStatus )
+//------------------------------------------------------------
+void CNSmlBTServiceSearcher::SelectDeviceByDiscoveryL( TRequestStatus& aObserverRequestStatus )
+    {
+     if( !iIsDeviceSelectorConnected )
+        {
+        User::LeaveIfError( iDeviceSelector.Connect() );
+        iIsDeviceSelectorConnected = ETrue;
+        }
+
+    //  Request a device selection 
+	TBTDeviceClass deviceClass(0 ,0 ,0);
+	
+    TBTDeviceSelectionParams parameters;
+    parameters.SetDeviceClass(deviceClass);
+	
+    TBTDeviceSelectionParamsPckg pckg(parameters);
+
+	pckg().SetUUID( iBTConnInfo.iServiceClass );
+
+    iDeviceSelector.StartNotifierAndGetResponse(
+         aObserverRequestStatus, 
+         KDeviceSelectionNotifierUid, 
+         /*selectionFilter*/pckg, 
+         iResponse);
+
+
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::FindServiceL( TRequestStatus& aObserverRequestStatus )
+//------------------------------------------------------------
+void CNSmlBTServiceSearcher::FindServiceL( TRequestStatus& aObserverRequestStatus )
+    {
+    if( !iResponse().IsValidBDAddr() )
+        {
+        User::Leave( KErrNotFound );
+        }
+			
+	iHasFoundService = EFalse;
+
+	// delete any existing agent and search pattern
+	delete iSdpSearchPattern;
+	iSdpSearchPattern = NULL;
+
+	delete iAgent;
+	iAgent = NULL;
+
+	iAgent = CSdpAgent::NewL( *this, BTDevAddr() );
+
+	iSdpSearchPattern = CSdpSearchPattern::NewL();
+	iSdpSearchPattern->AddL( iBTConnInfo.iServiceClass ); 
+
+	iAgent->SetRecordFilterL( *iSdpSearchPattern );
+
+	iStatusObserver = &aObserverRequestStatus;
+
+	iAgent->NextRecordRequestL();
+	}
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::NextRecordRequestComplete( TInt aError, TSdpServRecordHandle aHandle, TInt aTotalRecordsCount )
+//------------------------------------------------------------
+void CNSmlBTServiceSearcher::NextRecordRequestComplete( TInt aError, TSdpServRecordHandle aHandle, TInt aTotalRecordsCount )
+    {
+    TRAPD( error, NextRecordRequestCompleteL( aError, aHandle, aTotalRecordsCount) );
+    if ( error != KErrNone ) 
+        {
+        Panic( EBTServiceSearcherNextRecordRequestComplete );
+        }
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::NextRecordRequestCompleteL( TInt aError, TSdpServRecordHandle aHandle, TInt aTotalRecordsCount )
+//------------------------------------------------------------
+void CNSmlBTServiceSearcher::NextRecordRequestCompleteL( TInt aError, TSdpServRecordHandle aHandle, TInt aTotalRecordsCount )
+    {
+    if ( aError == KErrEof )
+        {
+        Finished();
+        return;
+        }
+
+    if ( aError != KErrNone )
+        {
+        Finished( aError );
+        return;
+        }
+
+    if ( aTotalRecordsCount == 0 )
+        {
+        Finished( KErrNotFound );
+        return;
+        }
+
+    //  Request its attributes
+    iAgent->AttributeRequestL( aHandle, KSdpAttrIdProtocolDescriptorList );
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::AttributeRequestResult()
+//------------------------------------------------------------
+void CNSmlBTServiceSearcher::AttributeRequestResult(
+    TSdpServRecordHandle aHandle, 
+    TSdpAttributeID aAttrID, 
+    CSdpAttrValue* aAttrValue)
+    {
+    TRAPD( error, AttributeRequestResultL( aHandle, aAttrID, aAttrValue ) );
+    
+    //deleted because ownership has been transferred    
+    delete aAttrValue;
+    aAttrValue = NULL;
+    
+    if( error != KErrNone )
+        {
+        Panic(EBTServiceSearcherAttributeRequestResult);
+        }
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::AttributeRequestResultL()
+//------------------------------------------------------------
+void CNSmlBTServiceSearcher::AttributeRequestResultL(
+    TSdpServRecordHandle /*aHandle*/, 
+    TSdpAttributeID aAttrID, 
+    CSdpAttrValue* aAttrValue)
+    {
+    
+    ASSERT( aAttrID == KSdpAttrIdProtocolDescriptorList );
+
+    TSdpAttributeParser parser( ProtocolList(), *this );
+
+    // Validate the attribute value, and extract the RFCOMM channel
+    aAttrValue->AcceptVisitorL( parser );
+
+    if ( parser.HasFinished() )
+        {
+        // Found a suitable record so change state
+        iHasFoundService = ETrue;
+        }
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::AttributeRequestComplete()
+//------------------------------------------------------------
+void CNSmlBTServiceSearcher::AttributeRequestComplete(TSdpServRecordHandle aHandle, TInt aError)
+    {
+    TRAPD( error, AttributeRequestCompleteL( aHandle, aError ) );
+    if( error != KErrNone )
+        {
+        Panic( EBTServiceSearcherAttributeRequestComplete );
+        }
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::AttributeRequestCompleteL()
+//------------------------------------------------------------
+void CNSmlBTServiceSearcher::AttributeRequestCompleteL(TSdpServRecordHandle /*aHandle*/, TInt aError)
+    {
+    if ( aError != KErrNone )
+        {
+        }
+    else if( !HasFinishedSearching() )
+        {
+        // have not found a suitable record so request another
+        iAgent->NextRecordRequestL();
+        }
+    else
+        {
+        Finished();
+        }
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::Finished()
+//------------------------------------------------------------
+void CNSmlBTServiceSearcher::Finished(TInt aError /* default = KErrNone */)
+    {
+    if( aError == KErrNone && !HasFoundService() )
+        {
+        aError = KErrNotFound;
+        }
+	if ( iStatusObserver )
+		{
+		if ( *iStatusObserver == KRequestPending )
+			{
+			User::RequestComplete( iStatusObserver, aError );
+			}
+		}
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::HasFinishedSearching()
+//------------------------------------------------------------
+TBool CNSmlBTServiceSearcher::HasFinishedSearching() const
+    {
+    return EFalse;
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::BTDevAddr()
+//------------------------------------------------------------
+const TBTDevAddr& CNSmlBTServiceSearcher::BTDevAddr()
+    {
+    return iResponse().BDAddr();
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::ResponseParams()
+//------------------------------------------------------------
+const TBTDeviceResponseParams& CNSmlBTServiceSearcher::ResponseParams()
+    {
+    return iResponse();
+    }
+//------------------------------------------------------------
+// CNSmlBTServiceSearcher::HasFoundService()
+//------------------------------------------------------------
+TBool CNSmlBTServiceSearcher::HasFoundService() const
+    {
+    return iHasFoundService;
+    }