webservices/wsstar/wsstarplugin/src/wsstarsessionconsumer.cpp
changeset 0 62f9d29f7211
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsstar/wsstarplugin/src/wsstarsessionconsumer.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,383 @@
+/*
+* Copyright (c) 2006-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:           
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+// INCLUDE FILES
+#include <SenXmlUtils.h>
+
+#include "wsstarsessionconsumer.h"
+#include "sendebug.h"
+#include <SenServiceConnection.h>
+#include "senlogger.h"
+#include "wsstarcons.h"
+
+CWSStarSessionConsumer* CWSStarSessionConsumer::NewL( MSenRemoteServiceConsumer& aServiceConsumer,
+                                                      RFileLogger& aLogger )
+    {
+    CWSStarSessionConsumer* pSelf =
+        CWSStarSessionConsumer::NewLC(aServiceConsumer, aLogger);
+    CleanupStack::Pop(pSelf);
+    return pSelf;
+    }
+
+CWSStarSessionConsumer* CWSStarSessionConsumer::NewLC( MSenRemoteServiceConsumer& aServiceConsumer,
+                                                       RFileLogger& aLogger )
+    {
+    CWSStarSessionConsumer* pSelf =
+                        new (ELeave) CWSStarSessionConsumer( aServiceConsumer, aLogger );
+    CleanupStack::PushL(pSelf);
+    pSelf->ConstructL();
+    return pSelf;
+    }
+
+CWSStarSessionConsumer::~CWSStarSessionConsumer()
+    {
+    //delete iSentMessageId;
+    //delete iReceivedMessageId;
+    iSentMessages.Reset();
+    iSendReplyTo.Reset();
+    iTranspProp.Reset();
+    }
+
+CWSStarSessionConsumer::CWSStarSessionConsumer( MSenRemoteServiceConsumer& aServiceConsumer,
+                                                RFileLogger& aLogger )
+:   iConsumer(aServiceConsumer),
+    iLogger(aLogger),
+    //iSentMessageId(NULL),
+    //iReceivedMessageId(NULL),
+    iSentMessages(ETrue, ETrue),
+    iSendReplyTo(ETrue, ETrue),
+    iTranspProp(ETrue, ETrue)
+    {
+    }
+
+
+const TDesC8& CWSStarSessionConsumer::Id() const
+    {
+    return iConsumer.Id();
+    }
+
+TInt CWSStarSessionConsumer::SetSessionL(MSenRemoteServiceSession& aServiceSession)
+    {
+    iConsumer.SetSessionL(aServiceSession);
+    return KErrNone;
+    }
+
+void CWSStarSessionConsumer::HandleSoapMessageL( CSenSoapMessage* apMessage,
+                                                 const TInt aTxnId,
+                                                 MSenProperties* aResponseTransportProperties,
+                                                 TBool aCompleteMessage )
+    {
+    TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CWSStarSessionConsumer::HandleSoapMessageL(CSenSoapMessage*)");
+    
+    if ( apMessage )
+        {
+        CleanupStack::PushL( apMessage ); // this method has the ownership, until passed forward(!)
+        
+        // fix for the error HTUR-6XDABN : Start
+        
+    	// After sending the message to Remote consumer, Corresponding message is not 
+    	// removed from the message queue. Due to this the message body sits in the 
+    	// queue (memory) till the session consumer object gets destroyed. 
+    	CSenElement& header = apMessage->HeaderL();
+    	// Response RelatesTo content=MessageId of the request
+        RPointerArray<CSenElement>& msgIdArray = header.ElementsL();
+    
+    	for(TInt i = 0; i < msgIdArray.Count(); i++)
+    		{
+    		CSenElement& idElement = *msgIdArray[i];
+    		
+    		if( idElement.LocalName() == WSStarContextKeys::KRelatesTo() )
+    			{
+            	// Remove the consumed message from the message queue 
+            	iSentMessages.RemoveByKey( idElement.Content() );
+            	iTranspProp.RemoveByKey( idElement.Content() ); 		
+            	break;
+    			}
+    		}
+    		
+    	// msgIdArray.Close(); // Must be removed (now commented out) OR otherwise regression 
+    	                       // (MMAA-6YFQ5V) will occur! The msgIdArray is a *reference*, 
+    	                       // and any modification to this array will MODIFY the actual
+    	                       // contents of that DOM tree(!). 
+    	                         
+    	// fix for the error HTUR-6XDABN : End
+    	
+        HBufC8* pMessageAsString = NULL;
+        if (aCompleteMessage)
+            {
+            TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"- Returning whole SOAP-ENV");
+            pMessageAsString = apMessage->AsXmlL();
+            }
+        else
+            {
+            TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"- Detaching SOAP body (calling BodyAsStringL).");
+            pMessageAsString = apMessage->BodyAsStringL();
+            }
+        CleanupStack::PopAndDestroy( apMessage ); // object has been serialized into a descriptor => de-alloc it
+        
+        if (pMessageAsString)
+            {
+            iConsumer.HandleMessageL(pMessageAsString, aTxnId, aResponseTransportProperties);
+            }
+        else
+            {
+            TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"- Fatal(!): pMessageAsString == NULL, invoking remote consumer's HandleErrorL.");
+            iConsumer.HandleErrorL(NULL, KErrSenNoSoapBody, aTxnId, aResponseTransportProperties);
+            }
+        }
+    else // apMessage == NULL
+        {
+        TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel,"- Fatal(!): WSStarSessionConsumer::HandleSoapMessageL, apMessage == NULL, sending KErrSenInternal to remote consumer via HandleErrorL.");
+        iConsumer.HandleErrorL(NULL, KErrSenInternal, aTxnId, aResponseTransportProperties);
+        }           
+    }
+
+TInt CWSStarSessionConsumer::HandleMessageL( HBufC8* apMessage,
+                                             const TInt aTxnId,
+                                             MSenProperties* aResponseTransportProperties )
+    {
+#ifdef _SENDEBUG
+    CleanupStack::PushL(apMessage);
+    TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CWSStarSessionConsumer::HandleMessageL");
+    CleanupStack::Pop(apMessage);
+#endif // _SENDEBUG    
+    return iConsumer.HandleMessageL(apMessage, aTxnId, aResponseTransportProperties);
+    }
+
+TInt CWSStarSessionConsumer::HandleErrorL( HBufC8* apError,
+                                           const TInt aErrorCode,
+                                           const TInt aTxnId,
+                                           MSenProperties* aResponseTransportProperties )
+    {
+#ifdef _SENDEBUG
+    CleanupStack::PushL(apError);
+    TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CWSStarSessionConsumer::HandleErrorL");
+    CleanupStack::Pop(apError);
+#endif // _SENDEBUG    
+    return iConsumer.HandleErrorL(apError, aErrorCode, aTxnId, aResponseTransportProperties);
+    }
+
+void CWSStarSessionConsumer::SetStatusL(const TInt status)
+    {
+    TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CWSStarSessionConsumer::SetStatusL");
+    //we will not inform consumers about  fact that credential is expired, 
+    // ws* has to obtain new ticket and keep connection valid
+    if (status == KSenConnectionStatusExpired) 
+        {
+        iConsumer.SetStatusL(KSenConnectionStatusReady);    
+        }
+    else
+        {
+        iConsumer.SetStatusL(status);
+        }
+    }
+
+TInt CWSStarSessionConsumer::MessageForSendingL(const TDesC8& aBody,
+                                           CWSStarMessageContext*& aCtx)
+    {
+    TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CWSStarSessionConsumer::MessageForSendingL");
+    
+    //do nothing with message. Message is preapred by session and handlers
+    //we need only set correlation id using context which travel with message
+    //------------SCHarF ------- glue with addressing to get messageId. We will expect some answer
+    const TDesC8* msgId = aCtx->GetDesC8L(WSStarContextKeys::KMessageID);
+    const TDesC8* replyTo = aCtx->GetDesC8L(WSStarContextKeys::KReplyTo);
+    if (msgId)
+        {
+        iSentMessages.Append(msgId->AllocL(), aBody.AllocL());    
+        if(replyTo)
+            {
+            iSendReplyTo.Append(msgId->AllocL(), replyTo->AllocL());
+            }
+        const TDesC8* transpProp =
+                aCtx->GetDesC8L(WSStarContextKeys::KWSStarTranspProp);
+        if (transpProp)
+            {
+            iTranspProp.Append(msgId->AllocL(), transpProp->AllocL());
+            }
+        }
+    //------------end SCHarF ------- 
+    
+    return KErrNone;
+    }
+
+void CWSStarSessionConsumer::ConstructL()
+    {
+    }
+
+/*void CWSStarSessionConsumer::SetSentMessageIdL(const TDesC8& aSentMessageId)
+    {
+    HBufC8* pNew = NULL;
+    if(aSentMessageId.Length()>0)
+        pNew = aSentMessageId.AllocL();
+    delete iSentMessageId;
+    iSentMessageId = pNew;
+    }
+
+TPtrC8 CWSStarSessionConsumer::SentMessageId()
+    {
+    if(iSentMessageId)
+        {
+        return *iSentMessageId;
+        }
+    else
+        {
+        return KNullDesC8();
+        }
+    }
+
+void CWSStarSessionConsumer::SetReceivedMessageIdL(
+                                            const TDesC8& aReceivedMessageId)
+    {
+    HBufC8* pNew =NULL;
+    if(aReceivedMessageId.Length()>0)
+        pNew = aReceivedMessageId.AllocL();
+    delete iReceivedMessageId;
+    iReceivedMessageId = pNew;
+    }
+
+TPtrC8 CWSStarSessionConsumer::ReceivedMessageId()
+    {
+    if(iReceivedMessageId)
+        return *iReceivedMessageId;
+    else
+        return KNullDesC8();
+    }
+*/
+TBool CWSStarSessionConsumer::Expects(const TDesC8& aRelatesTo, const TDesC8* aTo)
+    {
+    TInt index = iSentMessages.Find(aRelatesTo);
+    TBool result(EFalse);
+    TInt index2 = index; 
+    if (aTo)
+        index2 = iSendReplyTo.Find(aRelatesTo);
+    
+    if (index == index2 && index2 != KErrNotFound)
+        {
+        if (aTo)
+            {
+            const TDesC8* replyTo = iSendReplyTo.ValueAt(index);
+            if (*replyTo == *aTo)
+                {
+                result = ETrue;
+                }
+            else
+                {
+                TLSLOG(KSenFaultsLogChannel, KSenFaultsLogLevel, WSStarSessionConsumer::KFaultInvalidToTag);   
+                }
+            }
+        else
+            {
+            result = ETrue;
+            }
+        }
+    else
+        {
+        TLSLOG(KSenFaultsLogChannel, KSenFaultsLogLevel, WSStarSessionConsumer::KFaultInvalidRelatesToTag);   
+        }
+
+    return result;
+    }
+
+TDesC8* CWSStarSessionConsumer::BodyL(const TDesC8& aMessageID) const
+    {
+    HBufC8* pBody = NULL;
+
+    TInt index = iSentMessages.Find(aMessageID);
+    if (index != KErrNotFound)
+        {
+        pBody = (HBufC8*)iSentMessages.ValueAt(index);
+        }
+    return pBody;
+    }
+
+const TDesC8& CWSStarSessionConsumer::TransportProperties(
+        const TDesC8& aMessageID) const
+    {
+    TInt index = iTranspProp.Find(aMessageID);
+    if (index != KErrNotFound)
+        {
+        const TDesC8* tp = iTranspProp.ValueAt(index);
+        if (tp)
+            {
+            return *tp;
+            }
+        }
+    return KNullDesC8;
+    }
+
+MSenTransport& CWSStarSessionConsumer::TransportL()
+    {
+    return iConsumer.TransportL();
+    }
+    
+TInt CWSStarSessionConsumer::ChunkByTxnIdL(TInt aTxnId, CSenChunk*& aChunk)
+    {
+    return iConsumer.ChunkByTxnIdL(aTxnId, aChunk);
+    }
+
+void CWSStarSessionConsumer::FileProgress(TInt /*aTxnId*/, TBool /*aIncoming*/, TBool /*aIsSoap*/,
+                const TDesC8& /*aSoapOrCid*/, TInt /*aProgress*/)
+    {
+    }
+
+CSenIdentifier& CWSStarSessionConsumer::Identifier() const
+    {
+    return iConsumer.Identifier();
+    }
+
+
+// enable file logging (macros)
+RFileLogger* CWSStarSessionConsumer::Log() const
+    {
+    return (RFileLogger*) &iLogger;
+    }
+    
+TBool CWSStarSessionConsumer::HasAuthenticationCallback()
+    {
+    return iConsumer.HasAuthenticationCallback();
+    }
+
+TInt CWSStarSessionConsumer::ReauthenticationNeededL(CSenIdentityProvider*& aIdp)
+	{
+	return iConsumer.ReauthenticationNeededL(aIdp);
+	}
+void CWSStarSessionConsumer::SetDataTrafficDetails( TSenDataTrafficDetails&  aDetails)  
+	{
+	iConsumer.SetDataTrafficDetails(aDetails);
+	}
+
+TBool CWSStarSessionConsumer::HasCoBrandingCallback()
+    {
+    return iConsumer.HasCoBrandingCallback();
+    }
+
+TBool CWSStarSessionConsumer::OnGetBrandIdL(  const TDesC8& aBrandIdListAsXmlSnippet, RBuf8& aSelectedBrandId)
+    {
+    return iConsumer.OnGetBrandIdL(aBrandIdListAsXmlSnippet,aSelectedBrandId);
+    }
+// End of file