messagingappbase/obexmtms/btmtm/btserver/source/btsendop.cpp
changeset 31 ebfee66fde93
child 47 5b14749788d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/obexmtms/btmtm/btserver/source/btsendop.cpp	Fri Jun 04 10:25:39 2010 +0100
@@ -0,0 +1,258 @@
+// 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:
+// $Workfile: btsendop.cpp $
+// $Author: Stevep $
+// $Revision: 10 $
+// $Date: 25/03/02 9:32 $
+// 
+//
+
+//class include
+#include "btsendop.h"
+
+//system includes
+#include <btmsgtypeuid.h>	//KUidMsgTypeBt
+#include "btmtmcmds.h"	//EBtMtmCmdSend
+//#include <bttypes.h>
+
+//user includes
+//#include "btcmtm.h"	//EBtcCmdSend
+//#include "btmsgtypeuid.h" //KUidMsgTypeBt
+
+const TInt KPacketBufferSize=20000; // Packet buffer size
+
+CBtServerSendOperation* CBtServerSendOperation::NewL(CMsvServerEntry& aSendObj,	const TObexBluetoothProtocolInfo& aBtProtocolInfo, TInt aConnectTimeoutMicroSeconds, TInt aPutTimeoutMicroseconds, const TDesC* aConnectPassword, TRequestStatus& aObserverRequestStatus)
+/**
+ * Second phase constructor.
+ *
+ * @param aSendObj Reference to the object to send.
+ * @param aBtProtocolInfo Protocol info to initialise the CObexCleint
+ * @param aConnectTimeoutMicroSeconds Timeout period for Connect operation in microseconds.
+ * @param aPutTimeoutMicroseconds Timeout period for Put operation in microseconds.
+ * @param aConnectPassword Pointer to the password for Bluetooth validation.
+ * @param aObserverRequestStatus Canonical TRequestStatus for control of active object.
+ * @leave KErrXXX System-wide error codes
+ */
+	{
+	CBtServerSendOperation* self=new(ELeave) CBtServerSendOperation(aSendObj, aBtProtocolInfo, aConnectTimeoutMicroSeconds, aPutTimeoutMicroseconds, aObserverRequestStatus);
+	CleanupStack::PushL(self);
+	self->ConstructL(aConnectPassword);
+	CleanupStack::Pop(); //self
+	return self;
+	}
+
+CBtServerSendOperation::CBtServerSendOperation(CMsvServerEntry& aSendObj, const TObexBluetoothProtocolInfo& aBtProtocolInfo, TInt aConnectTimeoutMicroSeconds, TInt aPutTimeoutMicroSeconds, TRequestStatus& aObserverRequestStatus)
+	:CObexServerSendOperation(KUidMsgTypeBt, aSendObj, aConnectTimeoutMicroSeconds, aPutTimeoutMicroSeconds, aObserverRequestStatus),
+		iBtProtocolInfo(aBtProtocolInfo),iBTObexPortNumber(0)	//default bitwise copy constructor should suffice
+/**
+ * Constructor.
+ *
+ * @param aSendObj Reference to the object to send.
+ * @param aBtProtocolInfo Protocol info to initialise the CObexCleint
+ * @param aConnectTimeoutMicroSeconds Timeout period for Connect operation in microseconds.
+ * @param aPutTimeoutMicroseconds Timeout period for Put operation in microseconds.
+ * @param aConnectPassword Pointer to the password for Bluetooth validation.
+ * @param aTargetID Unsigned Int32 containing target ID if present.
+ * @param aSendTargetID TBool for flag to send target ID or not.
+ * @param aObserverRequestStatus Canonical TRequestStatus for control of active object.
+ */
+	{
+	}
+
+CBtServerSendOperation::~CBtServerSendOperation()
+	{
+	delete iSdpUtils;
+
+	iLinkAdapter.Close();
+	iSocketServ.Close();
+	}
+
+void CBtServerSendOperation::InitialiseObexClientL()
+/**
+ * Initialises the Obex client to use Bluetooth as the transport mechanism with the parameters as specified in the
+ * constructor.
+ *
+ * @leave KErrXXX System-wide error codes 
+ */
+
+	{
+	//Prevent the link from going into low power modes before the SDP query takes place. 
+	PreventLowPowerModes(); 
+	
+	// trigger SDP Lookup
+	iSdpUtils = CObexSdpUtils::NewL(*this);
+	
+	User::LeaveIfError(iSdpUtils != NULL);
+
+	TBTDevAddr devAddr = iBtProtocolInfo.iAddr.BTAddr();
+	iSdpUtils->RemoteBtObexQueryL(devAddr);
+
+	// tell the obex server module we're async
+	iAsyncInit = ETrue;
+	}
+
+
+
+
+void CBtServerSendOperation::RemoteBtObexQueryResult(TInt aError, TInt aPortNumber, TBool /*aObexObjectPushProfileSupported*/, 
+									 TInt /*aObexObjectPushProfileVersion*/, TObexSupportedFormatsList /*aSupportedFormats*/)
+	/**
+	 * SDP Query result, parameters have the following meaning:
+	 *
+	 * @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
+	 */
+	{
+
+	if(aError)
+		{
+		// finish the async init at this point
+		TRequestStatus* status = &iStatus;
+		User::RequestComplete(status, aError);
+		}
+	else
+		{
+		// remember the port number
+		iBTObexPortNumber = aPortNumber;
+
+		// finish the async init at this point
+		TRequestStatus* status = &iStatus;
+		User::RequestComplete(status, KErrNone);
+		}
+	}
+
+void CBtServerSendOperation::SecondPhaseObexClientInitL()
+/**
+ * Fills in the iBtProtocolInfo structure with the results of the SDP Lookup.
+ */
+	{
+	delete iSdpUtils;
+	iSdpUtils = NULL;
+
+	// use the port number to complete initialisation
+	TRfcommSockAddr& sockAddr = iBtProtocolInfo.iAddr;
+	sockAddr.SetPort(iBTObexPortNumber);
+
+	// setting of receive & transmit packet buffer size.
+	TObexProtocolPolicy obexProtocolPolicy;
+	obexProtocolPolicy.SetReceiveMtu(KPacketBufferSize);
+	obexProtocolPolicy.SetTransmitMtu(KPacketBufferSize);
+
+	// Initialise Obex client object.
+	iObexClient = CObexClient::NewL(iBtProtocolInfo,obexProtocolPolicy); 
+	}
+
+void CBtServerSendOperation::PreConnectOperations()
+	{
+	}
+
+void CBtServerSendOperation::PostConnectOperations()
+	{
+	// If the connection attempt has failed and we are not going to retry the connection,
+	// make sure that the link is allowed to go into low power modes.
+
+	const TDesC8* progressDes = NULL;
+ 	TRAPD(error, progressDes = &ProgressL());
+
+	if (error == KErrNone)
+		{
+		TPckgBuf<TObexMtmProgress> package;
+		package.Copy(*progressDes);
+
+		if (package().iSendState == TObexMtmProgress::ESendError)
+			{
+			AllowLowPowerModes();
+			}
+		}
+	}
+
+void CBtServerSendOperation::PreSendOperations()
+	{
+	// Try to ensure the link does not go into a low power mode.
+	// Note that we may already be preventing low power modes as a result of attempting
+	// to do this prior to the connection setup. In this case, calling it again does
+	// nothing.
+	// Note that as the obex connection is setup, this should not fail. If for some reason
+	// it does, this would result in a slower file transfer.
+	PreventLowPowerModes();
+	}
+
+void CBtServerSendOperation::PostSendOperations()
+	{
+	// Allow the link to go into low power modes
+	AllowLowPowerModes();
+	}
+
+void CBtServerSendOperation::DoCancel()
+	{
+	// As the transfer is being cancelled, allow the link to go into low power modes
+	AllowLowPowerModes();
+
+	delete iSdpUtils;
+	iSdpUtils = NULL;
+
+	CObexServerSendOperation::DoCancel();
+	}
+
+void CBtServerSendOperation::AllowLowPowerModes()
+	{
+	// Allow the link to go into low power modes
+	if (iPreventingLowPowerModes)
+		{
+		iLinkAdapter.AllowLowPowerModes(EAnyLowPowerMode);
+		iPreventingLowPowerModes = EFalse;
+		}
+
+	iLinkAdapter.Close();
+	iSocketServ.Close();
+	}
+
+void CBtServerSendOperation::PreventLowPowerModes()
+	{
+	// Prevent the link from going into low power modes. This means the connect and send
+	// operations will be much quicker.
+
+	if (iPreventingLowPowerModes)
+		{
+		return;
+		}
+
+	// Connect to the socket server
+	if (!iSocketServ.Handle())
+		{
+		if (iSocketServ.Connect() != KErrNone)
+			{
+			return;
+			}
+		}
+
+	// Open the bluetooth link adapter
+	if (!iLinkAdapter.IsOpen())
+		{
+		TBTDevAddr devAddr = iBtProtocolInfo.iAddr.BTAddr();
+			
+		if (iLinkAdapter.Open(iSocketServ, devAddr) != KErrNone)
+			{
+			return;
+			}
+		}
+
+	if (iLinkAdapter.PreventLowPowerModes(EAnyLowPowerMode) == KErrNone)
+		{
+		iPreventingLowPowerModes = ETrue;
+		}
+	}