www.pudn.com > S60_Platform_Bluetooth_OBEX_Example.rar > objectexchangeclient.cpp
/* Copyright (c) 2004, Nokia. All rights reserved */ // INCLUDE FILES #include#include #include "ObjectExchangeClient.h" #include "ObjectExchangeServiceSearcher.h" #include "BTObjectExchange.pan" #include "Log.h" // ============================ MEMBER FUNCTIONS ============================== // ---------------------------------------------------------------------------- // CObjectExchangeClient::NewL() // Symbian two-phased constructor. // ---------------------------------------------------------------------------- // CObjectExchangeClient* CObjectExchangeClient::NewL( MLog& aLog ) { CObjectExchangeClient* self = NewLC( aLog ); CleanupStack::Pop( self ); return self; } // ---------------------------------------------------------------------------- // CObjectExchangeClient::NewLC() // Symbian two-phased constructor. // ---------------------------------------------------------------------------- // CObjectExchangeClient* CObjectExchangeClient::NewLC( MLog& aLog ) { CObjectExchangeClient* self = new ( ELeave ) CObjectExchangeClient( aLog ); CleanupStack::PushL( self ); self->ConstructL(); return self; } // ---------------------------------------------------------------------------- // CObjectExchangeClient::CObjectExchangeClient() // Constructor. // ---------------------------------------------------------------------------- // CObjectExchangeClient::CObjectExchangeClient( MLog& aLog ) : CActive( CActive::EPriorityStandard ), iState( EWaitingToGetDevice ), iLog( aLog ) { CActiveScheduler::Add( this ); } // ---------------------------------------------------------------------------- // CObjectExchangeClient::~CObjectExchangeClient() // Destructor. // ---------------------------------------------------------------------------- // CObjectExchangeClient::~CObjectExchangeClient() { if ( iState != EWaitingToGetDevice && iClient ) { iClient->Abort(); iStatus = KErrNone; } Cancel(); delete iCurrObject; iCurrObject = NULL; delete iServiceSearcher; iServiceSearcher = NULL; delete iClient; iClient = NULL; } // ---------------------------------------------------------------------------- // CObjectExchangeClient::ConstructL() // Perform second phase construction of this object. // ---------------------------------------------------------------------------- // void CObjectExchangeClient::ConstructL() { iServiceSearcher = CObjectExchangeServiceSearcher::NewL( iLog ); } // ---------------------------------------------------------------------------- // CObjectExchangeClient::DoCancel() // Cancel any outstanding requests. // ---------------------------------------------------------------------------- // void CObjectExchangeClient::DoCancel() { } // ---------------------------------------------------------------------------- // CObjectExchangeClient::RunL() // Respond to an event. // ---------------------------------------------------------------------------- // void CObjectExchangeClient::RunL() { HBufC* textResource = NULL; if ( iStatus != KErrNone ) { switch ( iState ) { case EGettingDevice: if ( iStatus == KErrCancel ) { textResource = StringLoader::LoadLC ( R_BTOB_NO_DEVICE ); iLog.LogL( *textResource ); CleanupStack::PopAndDestroy ( textResource ); } iState = EWaitingToGetDevice; break; case EGettingService: case EGettingConnection: case EDisconnecting: textResource = StringLoader::LoadLC ( R_BTOB_CONNECTION_ERROR ); iLog.LogL( *textResource, iStatus.Int() ); CleanupStack::PopAndDestroy ( textResource ); iState = EWaitingToGetDevice; break; case EWaitingToSend: textResource = StringLoader::LoadLC ( R_BTOB_SEND_ERROR ); iLog.LogL( *textResource, iStatus.Int() ); CleanupStack::PopAndDestroy ( textResource ); iState = EWaitingToGetDevice; break; default: Panic( EBTObjectExchangeUnexpectedLogicState ); break; } } else { switch ( iState ) { case EGettingDevice: // found a device now search for a suitable service iLog.LogL( iServiceSearcher->ResponseParams().DeviceName() ); iState = EGettingService; iStatus = KRequestPending; // this means that the RunL can not be called until // this program does something to iStatus iServiceSearcher->FindServiceL( iStatus ); SetActive(); break; case EGettingService: textResource = StringLoader::LoadLC ( R_BTOB_FOUND_SERVICE ); iLog.LogL( *textResource ); CleanupStack::PopAndDestroy ( textResource ); iState = EGettingConnection; ConnectToServerL(); break; case EGettingConnection: textResource = StringLoader::LoadLC ( R_BTOB_CONNECTED ); iLog.LogL( *textResource ); CleanupStack::PopAndDestroy ( textResource ); iState = EWaitingToSend; break; case EWaitingToSend: textResource = StringLoader::LoadLC ( R_BTOB_SENT_OBJECT ); iLog.LogL( *textResource ); CleanupStack::PopAndDestroy ( textResource ); break; case EDisconnecting: textResource = StringLoader::LoadLC ( R_BTOB_DISCONNECTED ); iLog.LogL( *textResource); CleanupStack::PopAndDestroy ( textResource ); iState = EWaitingToGetDevice; break; default: Panic( EBTObjectExchangeSdpRecordDelete ); break; }; } } // ---------------------------------------------------------------------------- // CObjectExchangeClient::ConnectL() // Connect to a service. // ---------------------------------------------------------------------------- // void CObjectExchangeClient::ConnectL() { if ( iState == EWaitingToGetDevice && !IsActive() ) { iServiceSearcher->SelectDeviceByDiscoveryL( iStatus ); iState = EGettingDevice; SetActive(); } else { HBufC* strClientBusy = StringLoader::LoadLC( R_BTOB_CLIENT_BUSY ); iLog.LogL( *strClientBusy ); CleanupStack::PopAndDestroy ( strClientBusy ); User::Leave( KErrInUse ); } } // ---------------------------------------------------------------------------- // CObjectExchangeClient::ConnectToServerL() // Connect to the server. // ---------------------------------------------------------------------------- // void CObjectExchangeClient::ConnectToServerL() { TObexBluetoothProtocolInfo protocolInfo; protocolInfo.iTransport.Copy( KServerTransportName ); protocolInfo.iAddr.SetBTAddr( iServiceSearcher->BTDevAddr() ); protocolInfo.iAddr.SetPort( iServiceSearcher->Port() ); if ( iClient ) { delete iClient; iClient = NULL; } iClient = CObexClient::NewL( protocolInfo ); iClient->Connect( iStatus ); SetActive(); } // ---------------------------------------------------------------------------- // CObjectExchangeClient::SendObjectL() // Send a message to a service on a remote machine. // ---------------------------------------------------------------------------- // void CObjectExchangeClient::SendObjectL(TFileName& aName) { if ( iState != EWaitingToSend ) { User::Leave( KErrDisconnected ); } else if ( IsActive() ) { User::Leave( KErrInUse ); } delete iCurrObject; iCurrObject = NULL; iCurrObject = CObexFileObject::NewL(aName); TParsePtr parsePtr (aName); TPtrC ptr = parsePtr.NameAndExt(); iCurrObject->SetNameL( ptr ); iClient->Put( *iCurrObject, iStatus ); SetActive(); } // ---------------------------------------------------------------------------- // CObjectExchangeClient::StopL() // Aborts command. // ---------------------------------------------------------------------------- // void CObjectExchangeClient::StopL() { if ( iClient && iClient->IsConnected() ) { iClient->Abort(); iState = EWaitingToGetDevice; } } // ---------------------------------------------------------------------------- // CObjectExchangeClient::DisconnectL() // Disconnects from the remote machine. // ---------------------------------------------------------------------------- // void CObjectExchangeClient::DisconnectL() { if ( iState == EWaitingToGetDevice ) { return; } if ( iState == EWaitingToSend ) { HBufC* strDisconnecting = StringLoader::LoadLC( R_BTOB_DISCONNECTING ); iLog.LogL( *strDisconnecting ); CleanupStack::PopAndDestroy ( strDisconnecting ); iState = EDisconnecting; iClient->Disconnect( iStatus ); SetActive(); } else { User::Leave( KErrInUse ); } } // ---------------------------------------------------------------------------- // CObjectExchangeClient::IsBusy() // True, if the client is performing some operation.. // ---------------------------------------------------------------------------- // TBool CObjectExchangeClient::IsBusy() { return IsActive(); } // ---------------------------------------------------------------------------- // CObjectExchangeClient::IsConnected() // True, if the client is performing some operation.. // ---------------------------------------------------------------------------- // TBool CObjectExchangeClient::IsConnected() { return iState == EWaitingToSend; } // End of File