diff -r 000000000000 -r 62f9d29f7211 webservices/wsframework/src/sensyncrequester.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wsframework/src/sensyncrequester.cpp Thu Jan 07 16:19:19 2010 +0200 @@ -0,0 +1,245 @@ +/* +* Copyright (c) 2002-2005 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: +* +*/ + + + + + + + + + + + +// INCLUDE FILES +#include "sensyncrequester.h" +#include "msentransport.h" +#include "msencoreservicemanager.h" // internal: Core\inc +#include "senidentifier.h" +#include "senguidgen.h" // internal: Utils\inc +#include "MSenHostlet.h" +#include "MSenProperties.h" + +EXPORT_C CSenSyncRequester* CSenSyncRequester::NewL(MSenTransport& aTransport, + MSenCoreServiceManager& aManager) + { + CSenSyncRequester* pNew = CSenSyncRequester::NewLC(aTransport, aManager); + CleanupStack::Pop(); + return pNew; + } + +EXPORT_C CSenSyncRequester* CSenSyncRequester::NewLC(MSenTransport& aTransport, + MSenCoreServiceManager& aManager) + { + CSenSyncRequester* pNew = new (ELeave) CSenSyncRequester(aTransport, aManager); + CleanupStack::PushL(pNew); + pNew->BaseConstructL(); + return pNew; + } + +EXPORT_C CSenSyncRequester::~CSenSyncRequester() + { + delete ipResponse; + delete ipResponseProperties; + delete ipConsumerId; + delete ipIdentifier; + } + +EXPORT_C CSenSyncRequester::CSenSyncRequester(MSenTransport& aTransport, + MSenCoreServiceManager& aManager) + +: iTransport(aTransport), + iServiceManager(aManager), + ipIdentifier(NULL), + ipConsumerId(NULL), + ipResponse(NULL), + ipResponseProperties(NULL), + iResponsePropertiesType(MSenProperties::ESenXmlProperties), + iStatusCode(KErrNone) + { + } + +EXPORT_C void CSenSyncRequester::BaseConstructL() + { + ipConsumerId = iServiceManager.RandomGuidL(); + ipIdentifier = CSenIdentifier::NewL(SenIdentifier::ESession, *ipConsumerId); + } + +TInt CSenSyncRequester::SubmitL(const TDesC8& aEndpointUri, + const TDesC8& aMessage, + const TDesC8& aRequestTransportProperties, + HBufC8*& apResponseTo) + { + iStatusCode = KErrNone; + TInt txnId(KErrNone); + TInt retCode = iTransport.SendL(aEndpointUri, + aMessage, + aRequestTransportProperties, + *this, + *this, + txnId); + + if(retCode==KErrNone) + { + // Wait here until a callback from transport is received: + iSchedulerWait.Start(); + + // Now read the response and return code from member variables, + // and assign them to the references passed by the SubmitL caller: + + apResponseTo = ipResponse; + ipResponse = NULL; + //apResponseProperties = ipResponseProperties; // transport properties of the response. + //ipResponseProperties = NULL; + + // On success, always return the transaction ID received from the transport: + return txnId; + } + else // error occurred + { + // SendL failed, return the error immediately: + return retCode; + } + } + + +TInt CSenSyncRequester::SendToConsumerL(HBufC8* apMessage, + const TInt aTxnId, + MSenRemoteServiceConsumer& aConsumer, + MSenProperties* aResponseTransportProperties) + { + // SendToConsumerL method will be changed to provide reference to + // the transport properties which describe the RESPONSE, not request.. + return aConsumer.HandleMessageL(apMessage, aTxnId, aResponseTransportProperties); + } + +TInt CSenSyncRequester::SendErrorToConsumerL(const TInt aErrorCode, + HBufC8* apError, + const TInt aTxnId, + MSenRemoteServiceConsumer& aConsumer, + MSenProperties* aResponseTransportProperties) + { + // SendErrorToConsumerL method will be changed to provide reference to + // the transport properties which describe the RESPONSE, not request.. + return aConsumer.HandleErrorL(apError, aErrorCode, aTxnId, aResponseTransportProperties); + } + +// Note: this method is meant for those SESSION implementations, which +// actually are capable of handling certain errors between transport +// and session. +TInt CSenSyncRequester::HandleErrorL(const TInt aErrorCode, + HBufC8* apError, + const TInt /*aTxnId*/, + MSenRemoteServiceConsumer& /*aConsumer*/, + MSenProperties* /*aResponseTransportProperties*/) + { + // NONE of the errors between transport and session are handled in this level: + delete apError; + return aErrorCode; // simply bounce the error back to the caller + } + +const TDesC8& CSenSyncRequester::Id() const + { + return *ipConsumerId; + } + +TInt CSenSyncRequester::SetSessionL(MSenRemoteServiceSession& /*aServiceSession*/) + { + return KErrNone; + } + +// From MSenRemoteServiceConsumer +TInt CSenSyncRequester::HandleMessageL(HBufC8* apMessage, + const TInt aTxnId, + MSenProperties* aResponseTransportProperties) + { + iStatusCode = KErrNone; + ipResponse = apMessage; + if( aResponseTransportProperties ) + { + iResponsePropertiesType = aResponseTransportProperties->PropertiesClassType(); + ipResponseProperties = aResponseTransportProperties->AsUtf8L(); + } + // Now stop the SYNC wait in the SubmitL, so that the main thread + // of the Serene Core Active Scheduler can continue it's execution + iSchedulerWait.AsyncStop(); + return aTxnId; + } + +// From MSenServiceSession +TInt CSenSyncRequester::HandleErrorL(HBufC8* apError, + const TInt aErrorCode, + const TInt aTxnId, + MSenProperties* aResponseTransportProperties) + { + iStatusCode = aErrorCode; + ipResponse = apError; + if( aResponseTransportProperties ) + { + iResponsePropertiesType = aResponseTransportProperties->PropertiesClassType(); + ipResponseProperties = aResponseTransportProperties->AsUtf8L(); + } + // Now stop the SYNC wait in the SubmitL, so that the main thread + // of the Serene Core Active Scheduler can continue it's execution + iSchedulerWait.AsyncStop(); + return aTxnId; + } + +void CSenSyncRequester::SetStatusL(const TInt /*aStatus*/) + { + // not implemented + } + +MSenTransport& CSenSyncRequester::TransportL() + { + return (MSenTransport&)iTransport; + } + +CSenIdentifier& CSenSyncRequester::Identifier() const + { + return *ipIdentifier; + } + + +TInt CSenSyncRequester::ChunkByTxnIdL(TInt /* aTxnId */, CSenChunk*& /* aChunk */) + { + return KErrNotSupported; + } + +MSenRemoteHostlet* CSenSyncRequester::Hostlet() const + { + return NULL; + } + +TInt CSenSyncRequester::SendToHostletL(MSenRemoteHostlet& /* aReceiver */, + const TDesC8& /* aMessage */, + const TInt /* aTxnId */, + MSenRemoteServiceConsumer& /* aFrom */, + MSenProperties* /* aProperties */) + { + return KErrNotSupported; + } + +void CSenSyncRequester::FileProgress(TInt /*aTxnId*/, TBool /*aIncoming*/, TBool /*aIsSoap*/, + const TDesC8& /*aSoapOrCid*/, TInt /*aProgress*/) + { + } +void CSenSyncRequester::SetDataTrafficDetails( TSenDataTrafficDetails& /*aDetails*/) + { + } +// End of File +