diff -r 0ba996a9b75d -r 613943a21004 btobexprofiles/obexserviceman/plugins/src/bt/obexsmbtconnection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/btobexprofiles/obexserviceman/plugins/src/bt/obexsmbtconnection.cpp Tue Aug 31 15:25:10 2010 +0300 @@ -0,0 +1,295 @@ +/* +* Copyright (c) 2002-2007 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: This class handles service connections. +* +*/ + + +// INCLUDE FILES +#include +#include "obexsmbtconnection.h" +#include "debug.h" + +_LIT( KBTProtocol, "RFCOMM" ); + + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CObexSMBtConnection::CObexSMBtConnection() + { + } +// --------------------------------------------------------- +// Constructor +// --------------------------------------------------------- +// +CObexSMBtConnection::CObexSMBtConnection(TAny* aInitParams) + :iImplementationInfo((CImplementationInformation *)aInitParams), + iBtDiscovery(NULL) + { + } +// --------------------------------------------------------- +// Destructor +// --------------------------------------------------------- +// +CObexSMBtConnection::~CObexSMBtConnection() + { + // Cleanup + FLOG(_L("[SRCS]\tserver\tCSrcsBtConnection::~CSrcsBtConnection begin")); + + if(iPasskey) + { + iPasskey->Cancel(); + FLOG(_L("[SRCS]\tserver\tCSrcsBtConnection::~CSrcsBtConnection passkey query cancelled.")); + } + + if ( iBtDiscovery ) + { + iBtDiscovery->DeleteSdpRecord( iSDPHandle ); + delete iBtDiscovery; + } + + FTRACE( FPrint( _L( "[SRCS] CSrcsBtConnection::~CSrcsBtConnection: UnregisterSDPSettingsL" ) ) ); + + + if(iServer) + { + iServer->Stop(); + FLOG(_L("[SRCS]\tserver\tCSrcsBtConnection::~CSrcsBtConnection obex server stopped.")); + } + // Delete OBEX Server + if (iServer) + { + delete iServer; + FLOG(_L("[SRCS]\tserver\tCSrcsBtConnection::~CSrcsBtConnection obex server deleted.")); + iServer = NULL; + } + + // Delete passkey + delete iPasskey; + FLOG(_L("[SRCS]\tserver\tCSrcsBtConnection::~CSrcsBtConnection iPasskey deleted.")); + iPasskey = NULL; + + // Delete Service Controller callback + delete iController; + FLOG(_L("[SRCS]\tserver\tCSrcsBtConnection::~CSrcsBtConnection service controller deleted.")); + iController = NULL; + } + +// --------------------------------------------------------- +// NewL +// --------------------------------------------------------- +// +CObexSMBtConnection* CObexSMBtConnection::NewL(TAny* aInitParams) + { + FLOG(_L("[SRCS]\tserver\tCSrcsBtConnection: NewL")); + CObexSMBtConnection* self = new (ELeave) CObexSMBtConnection(aInitParams); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + + +// --------------------------------------------------------- +// ConstructL +// Method to create BT connections. +// --------------------------------------------------------- +// +void CObexSMBtConnection::ConstructL() + { + TLex8 lex; + // Create service controller implementation object + iController = CSrcsInterface::NewL(iImplementationInfo->ImplementationUid()); + + FLOG(_L("[SRCS] CSrcsBtConnection: ConstructL: CSrcsInterface::NewL\t")); + iController->SetMediaType( ESrcsMediaBT ); + // parsing opaque_data in iImplementationInfo + TPtrC8 res_string = iImplementationInfo->OpaqueData(); + + CObexUtilsOpaqueData res_data(res_string); + + TBuf8 op_LocalWho; + TUint op_Protocol, op_Authenticate, op_Authorise, op_Encrypt; + TUint op_ReceiveMtu(KSRCSDefaultReceiveMtu), op_TransmitMtu(KSRCSDefaultTransmitMtu); + + // skip 1st entry: USB interface string descriptor + User::LeaveIfError ( res_data.GetString(op_LocalWho) ); + + // get 2nd entry: OBEX local who + User::LeaveIfError ( res_data.GetString(op_LocalWho) ); + + // get 3rd to 7th entry + + // All service ID should be strings ! + TBuf8 serviceUUID; + User::LeaveIfError ( res_data.GetString(serviceUUID) ); + + FTRACE(FPrint(_L("[SRCS] CObexSMBtConnection::ConstructL() serviceUUID Length %d"), serviceUUID.Length())); + + if (serviceUUID.Length() < 6) + { + User::Leave( KErrArgument ); + } + + lex.Assign(serviceUUID); + + User::LeaveIfError ( res_data.GetNumber(op_Protocol) ); + User::LeaveIfError ( res_data.GetNumber(op_Authenticate) ); + User::LeaveIfError ( res_data.GetNumber(op_Authorise) ); + User::LeaveIfError ( res_data.GetNumber(op_Encrypt) ); + + // Get OBEX packet size: + if( res_data.GetNumber(op_ReceiveMtu) != KErrNone ) + { + op_ReceiveMtu = KSRCSDefaultReceiveMtu; // restore default value in case it is modified; + FLOG(_L("[SRCS] CSrcsBtConnection: ConstructL: op_ReceiveMtu not specified.\t")); + } + + if( res_data.GetNumber(op_TransmitMtu) != KErrNone ) + { + op_TransmitMtu = KSRCSDefaultTransmitMtu; // restore default value in case it is modified; + FLOG(_L("[SRCS] CSrcsBtConnection: ConstructL: op_TransmitMtu not specified.\t")); + } + + FLOG(_L("[SRCS] CSrcsBtConnection: ConstructL: Successfully get all data from opaque_data.\t")); + + // Create CBTEngDiscovery + + FLOG(_L("[SRCS] CSrcsBtConnection: ConstructL: CBTConnection::NewL\t")); + + // For handling Obex Passkey note + iPasskey = CObexSMPasskey::NewL(); + FLOG(_L("[SRCS] CSrcsBtConnection: ConstructL: CSrcsPasskey::NewL\t")); + + // For showing Error Notes + // iErrorUi = CErrorUI::NewL(); + + // set up the protocol stack... + TObexBluetoothProtocolInfo aObexBluetoothProtocolInfo; + aObexBluetoothProtocolInfo.iTransport = KBTProtocol ; + + // Configure security setting + FLOG(_L("[SRCS] CSrcsBtConnection: ConstructL: Setting Security\t")); + TBTServiceSecurity sec; + sec.SetAuthentication(op_Authenticate); + sec.SetAuthorisation(op_Authorise); + sec.SetEncryption(op_Encrypt); + + TUint32 serviceUID; + lex.Inc(2); + lex.Val(serviceUID,EHex); + sec.SetUid(TUid::Uid(serviceUID)); + aObexBluetoothProtocolInfo.iAddr.SetSecurity(sec); + if (serviceUUID.Length() == 34) + { + TUint32 HH; TUint32 HL; TUint32 LH; TUint32 LL; + lex = serviceUUID.Mid(2, 8); + lex.Val(HH, EHex); + lex = serviceUUID.Mid(10, 8); + lex.Val(HL, EHex); + lex = serviceUUID.Mid(18, 8); + lex.Val(LH, EHex); + lex = serviceUUID.Mid(26, 8); + lex.Val(LL, EHex); + iServiceUUID = TUUID(HH, HL, LH, LL); + } + else + { + iServiceUUID = TUUID(serviceUID); + } + + // Configure Obex packet size + TObexProtocolPolicy aObexProtocolPolicy; + aObexProtocolPolicy.SetReceiveMtu( static_cast(op_ReceiveMtu) ); + aObexProtocolPolicy.SetTransmitMtu( static_cast(op_TransmitMtu) ); + FTRACE(FPrint(_L("[SRCS] CSrcsBtConnection: ConstructL: op_ReceiveMtu[%x] op_TransmitMtu[%x]"), + aObexProtocolPolicy.ReceiveMtu(), aObexProtocolPolicy.TransmitMtu() )); + + // try to find a available channel to start OBEX server. + TUint channel=KRfcommPassiveAutoBind; + + aObexBluetoothProtocolInfo.iAddr.SetPort( channel ); + TRAPD(err,iServer = CObexServer::NewL(aObexBluetoothProtocolInfo, aObexProtocolPolicy);) + // Try to start server on this channel + if ( err == KErrNone ) + { + err=iController->SetObexServer( iServer ); + if ( err == KErrNone ) + { + // Set authentication handler + iServer->SetCallBack( *this ); + //If there is "local who" field, set it to OBEX server. + if(op_LocalWho.Size()) + { + User::LeaveIfError ( iServer->SetLocalWho( op_LocalWho ) ); + FLOG(_L("[SRCS] CSrcsBtConnection: ConstructL: SetLocalWho\t")); + } + FLOG(_L("[SRCS] CSrcsBtConnection: ConstructL: SetObexServer\t")); + + // Register SDP settings + + TObexBtTransportInfo *info=(TObexBtTransportInfo*)iServer->TransportInfo(); + channel=info->iAddr.Port(); + FTRACE(FPrint(_L("[SRCS] CSrcsBtConnection: ConstructL: CObexServer started on channel %d"), channel)); + iBtDiscovery = CBTEngDiscovery::NewL(); + User::LeaveIfError ( iBtDiscovery->RegisterSdpRecord(iServiceUUID, channel, iSDPHandle )); + } + else + { + // Failed to start Obex server. Delete server and try again + FLOG(_L("[SRCS] CSrcsBtConnection: ConstructL: Failed to start Obex server. Delete server and try again.\t")); + delete iServer; + iServer = NULL; + } + } + if ( !iServer ) + { + // Server did not start. + FLOG(_L("[SRCS] CSrcsBtConnection: ConstructL: Failed to start Obex server. Leave now! \t")); + User::Leave( KErrGeneral ); + } + + } + +// --------------------------------------------------------- +// GetUserPasswordL(const TDesC& ) +// Purpose: Get the Obex password from user with ObexPasskeyNotifier +// Parameters: +// Return value: +// --------------------------------------------------------- +// +void CObexSMBtConnection::GetUserPasswordL( const TDesC& ) + { + FLOG( _L( "[SRCS] CSrcsBtConnection: GetUserPassword\t" ) ); + iPasskey->StartPassKeyRequestL( iServer ); + } + +// --------------------------------------------------------- +// Check if OBEX service is still active. +// @return ETrue: OBEX service is still active. +// EFalse: OBEX service is inactive. +// --------------------------------------------------------- +// +TBool CObexSMBtConnection::IsOBEXActive() + { + FLOG( _L( "[SRCS] CSrcsBtConnection: IsOBEXActive\t" ) ); + return ETrue; + } + +// End of file