diff -r 000000000000 -r ba25891c3a9e ncdengine/debuglogger/obex/src/objectexchangeclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/debuglogger/obex/src/objectexchangeclient.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,326 @@ +/* +* Copyright (c) 2006 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: +* +*/ + + +/** Add TRAP harnesses for leaving functions such as iServiceSearcher->ConnectL +Decide what to do with Copyrighted Nokia code */ + + +#include "ObjectExchangeClient.h" +#include "ObjectExchangeServiceSearcher.h" +#include "BTObjectExchange.pan" + +#include + +// Define DEBUG trace for debug builds +#ifdef _DEBUG +#define TRACE(a) RDebug::Print a +#else +#define TRACE(a) +#endif + +CObjectExchangeClient* CObjectExchangeClient::NewL() +{ + CObjectExchangeClient* self = NewLC(); + CleanupStack::Pop(self); + return self; +} + +CObjectExchangeClient* CObjectExchangeClient::NewLC() +{ + CObjectExchangeClient* self = new (ELeave) CObjectExchangeClient(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; +} + +CObjectExchangeClient::CObjectExchangeClient() +: CActive(CActive::EPriorityStandard), +iState(EWaitingToGetDevice) // Go to initial state and wait for ConnectL function call +{ + CActiveScheduler::Add(this); +} + +void CObjectExchangeClient::ConstructL() +{ + iServiceSearcher = CObjectExchangeServiceSearcher::NewL(); +} + + +CObjectExchangeClient::~CObjectExchangeClient() +{ + Cancel(); // Cancel any outstanding request on this object + + delete iCurrObject; + iCurrObject = NULL; + + delete iServiceSearcher; // iServiceSearcher's destructor completes any outstanding request + iServiceSearcher = NULL; + + delete iClient; + iClient = NULL; + +} + +void CObjectExchangeClient::DoCancel() +{ + + // Add Cancelling for outstanding request caused by + // iServiceSearcher->SelectDeviceByDiscoveryL(iStatus) + // and iServiceSearcher->FindServiceL(iStatus); + // NOTE: works now if the iServiceSearcher is deleted, but not if cancelled + // SOLUTION: delete and recreate iServiceSearcher in DoCancel? Or implement + // Cancel to iServiceSearcer! + + if (iState != EWaitingToGetDevice && iClient) + { + iClient->Abort(); + + + delete iClient; // must be deleted so that connection is not left open + // if sender cancels before receiver accepts connection + iClient = NULL; + + } + + + iServiceSearcher->Cancel(); + + iStatus = KErrNone; // At least emulated version does not work without this + + iState = EWaitingToGetDevice; + User::RequestComplete( iObserverStatus, KErrCancel ); +} + + +void CObjectExchangeClient::RunL() +{ + + if (iStatus != KErrNone) + { + switch (iState) + { + case EGettingDevice: + case EGettingService: + case EGettingConnection: + case EDisconnecting: + case EWaitingToSend: + User::RequestComplete(iObserverStatus, iStatus.Int()); // Relay error codes + iState = EWaitingToGetDevice; // Return always to initial state + break; + + default: + Panic(EBTObjectExchangeUnexpectedLogicState); + break; + } + } + else + { + switch (iState) + { + case EGettingDevice: + + iState = EGettingService; + iStatus = KRequestPending; // NOTE: Setting this should be the responsibility + // of the called function + // move to CBTServiceSearcher::FindServiceL? + + iServiceSearcher->FindServiceL(iStatus); // Find the OBEX service on the target device + SetActive(); + break; + + case EGettingService: + iState = EGettingConnection; + ConnectToServerL(); // Connect to the OBEX service port on the target device + break; + + case EGettingConnection: + iState = EWaitingToSend; + User::RequestComplete(iObserverStatus, KErrNone); // ConnectL was succesfull + break; + + case EWaitingToSend: + User::RequestComplete(iObserverStatus, KErrNone); // SendObjectL was successfull + break; + + case EDisconnecting: + iState = EWaitingToGetDevice; + User::RequestComplete(iObserverStatus, KErrNone); // DisconnectL succeeded + break; + + default: + Panic(EBTObjectExchangeSdpRecordDelete); + break; + }; + } +} + +void CObjectExchangeClient::ConnectL(TRequestStatus& aObsRequestStatus) +{ + aObsRequestStatus = KRequestPending; // Have the observer wait for this request to complete + iObserverStatus = &aObsRequestStatus; // Store the observer's TRequestStatus for later use + + if (iState == EWaitingToGetDevice && !IsActive()) + { + iState = EGettingDevice; + iServiceSearcher->SelectDeviceByDiscoveryL(iStatus); // Show a device selection dialog + SetActive(); + + } + else + { + // Inform the observer that connection cannot be initiated + User::RequestComplete(iObserverStatus, KErrInUse ); + return; + } +} + +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(); + +} + +void CObjectExchangeClient::SendObjectL( const TDesC& aFileName, TRequestStatus& aObsRequestStatus) +{ + aObsRequestStatus = KRequestPending; // Have the observer wait for this request to complete + iObserverStatus = &aObsRequestStatus; // Store the observer's TRequestStatus for later use + + if (iState != EWaitingToSend) + { + // Inform the user that sending is not possible because there is no connection + User::RequestComplete(iObserverStatus, KErrDisconnected); + return; + + } + else if (IsActive()) + { + // Inform the user that there is already an outstanding request on this object + User::RequestComplete(iObserverStatus, KErrInUse); + return; + } + + delete iCurrObject; + iCurrObject = NULL; + + TRACE((aFileName)); + + iParse.Set( aFileName, NULL, NULL ); + + // Create the OBEX object from the file + TRAPD(err, iCurrObject = CObexFileObject::NewL(aFileName)); + if (err) + { + TRACE((_L("_DEBUG: Error creating CObexFileObject"))); + + // Inform the observer that file was not found + User::RequestComplete(iObserverStatus, err); + return; + + } + else + { + + /* Set proper values for the object info ? */ + + // Fill in the object info + iCurrObject->SetDescriptionL(_L("OBEX file object")); + iCurrObject->SetNameL( iParse.NameAndExt()); + iCurrObject->SetTypeL(_L8("text/plain")); // NOTE: Sending everything as text/plain + + // Update the header mask + TObexHeaderMask headermask = iCurrObject->HeaderMask(); // get current header mask + headermask = headermask | KObexHdrName | KObexHdrType | KObexHdrDescription; + iCurrObject->SetHeaderMask(headermask); + + + } + + // Send the object + iClient->Put(*iCurrObject, iStatus); + SetActive(); + +} + + +void CObjectExchangeClient::StopL() +{ + + if (iClient && iClient->IsConnected()) + { + iClient->Abort(); + iState = EWaitingToGetDevice; + } +} + +void CObjectExchangeClient::DisconnectL(TRequestStatus& aObsRequestStatus) +{ + aObsRequestStatus = KRequestPending; // Have the observer wait for this request to complete + iObserverStatus = &aObsRequestStatus; // Store the observer's TRequestStatus for later use + + if (iState == EWaitingToGetDevice) + { + // Not connected, inform the observer + User::RequestComplete(iObserverStatus, KErrNone); + return; + } + + if (iState == EWaitingToSend) + { + iState = EDisconnecting; + iClient->Disconnect(iStatus); + SetActive(); + + } + + + else + { + // Busy connecting or disconnecting + User::RequestComplete(iObserverStatus, KErrInUse); + return; + + + } +} + +TBool CObjectExchangeClient::IsBusy() +{ + return IsActive(); +} + +TBool CObjectExchangeClient::IsConnected() +{ + return iState == EWaitingToSend; + +} +