diff -r 000000000000 -r 72b543305e3a messagingappbase/obexmtms/irmtm/irserver/source/Irs.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/obexmtms/irmtm/irserver/source/Irs.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,201 @@ +// 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: IRS.CPP $ +// $Author: Stevep $ +// $Revision: 8 $ +// $Date: 25/03/02 8:49 $ +// +// + +//class include +#include "IRS.H" + +//system includes +#include +#include // For the send command + +//user includes +#include +#include "sendopn.h" +const TInt KErrIrObexClientSubsequentPutFailed = -5511; + +EXPORT_C CIrSrvMtm* CIrSrvMtm::NewL(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aEntry) +/** + * NewL factory function. Calls ReleaseLibrary() if construction fails. + * + * @param aRegisteredMtmDll Registration data for MTM DLL. + * @param aEntry Context on which to operate. + * @return Pointer to a newly constructed CIrSrvMtm. + * @leave KErrXXX System-wide error codes + */ + { + CIrSrvMtm* mysvrmtm = new CIrSrvMtm(aRegisteredMtmDll, aEntry); + if (mysvrmtm==NULL) + { + aRegisteredMtmDll.ReleaseLibrary(); + User::Leave(KErrNoMemory); + } + CleanupStack::PushL(mysvrmtm); + mysvrmtm->ConstructL(); + CleanupStack::Pop(); + return mysvrmtm; + } + +CIrSrvMtm::CIrSrvMtm(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aEntry): + CObexSrvMtm(aRegisteredMtmDll, aEntry) +/** + * Constructor. Calls CObexSrvMtm's constructor in initialisation list. + * @param aRegisteredMtmDll Registration data for MTM DLL. + * @param aEntry Context on which to operate. + */ + { + __DECLARE_NAME(_S("CIrSrvMtm")); + } + +/** + * Destructor. Deletes the header member + */ + +EXPORT_C CIrSrvMtm::~CIrSrvMtm() + { + delete iHeader; + } + +EXPORT_C void CIrSrvMtm::StartCommandL (CMsvEntrySelection& aSelection, + TInt aCommand, + const TDesC8& aParameter, + TRequestStatus& aStatus) +/** + * Instantiates and initiates a CIrServerSemdOperation class to begin sending the specified OBEX object + * via Infrared. Called in response to InvokeAsyncFunctionL() in the client MTM, and passes through + * all the arguments passed in to that function. Only supports aCommand==EIrMtmCmdSend + * @param aSelection Entry to operate on. + * @param aCommand Command to start. Only EIrMtmCmdSend is supported. + * @param aParameter Package buffer containing timeout, port and password info needed for the send operation. + * @param aStatus Used to notify observer of completion. + * @leave KErrNotSupported if aCommand!=EIrMtmCmdSend + * @leave KErrXXX if aCommand!= EIrMtmCmdSend + */ + { + switch (aCommand) + { + //The only supported command is EIrcCmdSend; switch statement used for potential future extension + case CIrClientMtm::EIrcCmdSend: + { + TPckgBuf sendParamsBuf; + sendParamsBuf.Copy(aParameter); + iTimeouts = sendParamsBuf(); + + //Zeroth selection is the TMsvId of the entry to send. + iEntry = iServerEntry->NewEntryL(aSelection[0]); + + TMsvEntry messageEntry=iEntry->Entry(); + messageEntry.SetSendingState(KMsvSendStateSending); + iEntry->ChangeEntry(messageEntry); + + //Construct a header + delete iHeader; + iHeader = NULL; + iHeader = CIrHeader::NewL(); + + //Get the entry's store + CMsvStore* store = iEntry->ReadStoreL(); + CleanupStack::PushL(store); + + //read the header from the store, and destroy the store + iHeader->RestoreL(*store); + CleanupStack::PopAndDestroy(); //store + + iProtocolInfo = iHeader->IrProtocolInfo(); + + iFirstSendAttempt = ETrue; + + aStatus = KRequestPending; + iReportStatus = &aStatus; + + SendL(); + + break; + } + default: + User::Leave(KErrNotSupported); + } + + } + +/** + * Creates a server send operation to perform the send + */ + + +void CIrSrvMtm::SendL() + { + // Password is not supported for IR + TPtrC connectPassword; + // connectPassword.Set(sendParamsBuf().iConnectPassword); + + //Now make the send operation, which will start automatically. aStatus is passed in to + //report completion. + + delete iSendOperation; + iSendOperation = NULL; + + //If NewL() leaves , the progress should be recorded + + iSendOperation = CIrServerSendOperation::NewL(*iEntry, iProtocolInfo, + iTimeouts.iConnectTimeout, iTimeouts.iPutTimeout, &connectPassword, iStatus, !iFirstSendAttempt); + + SetActive(); + } + +/** + * Obtains progress information, which, if valid, results in calling Send() + */ + +EXPORT_C void CIrSrvMtm::DoRunL() + { + // If the first attempt to send the message fails then retry with OBEX::IrXfer + + TPckgBuf package; + package.Copy(iSendOperation->ProgressL()); + TInt error = package().iError; + + if ((error != KErrNone) && (iFirstSendAttempt)) + { + // If we have made only one send attempt so far, we will retry now + + // If the error code indicates that we have not found the OBEX class + // name, change to use the OBEX:IrXfer class name as some older + // implementations only understand that one. + if (error == KErrIrObexClientPeerDoesNotHaveObex) + { + iProtocolInfo.iClassName = KIrXferClassName; + } + + iFirstSendAttempt = EFalse; + if(error == KErrIrObexClientSubsequentPutFailed) + { + User::RequestComplete(iReportStatus, KErrNone); + } + else + { + SendL(); + } + } + else + { + // Always report with a no error, any failure is recorded in the progress. + User::RequestComplete(iReportStatus, KErrNone); + } + }