webservices/wsstar/wsstarplugin/src/wsstarmessagecontext.cpp
changeset 0 62f9d29f7211
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsstar/wsstarplugin/src/wsstarmessagecontext.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,491 @@
+/*
+* 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 "SenSoapEnvelope.h"
+#include "wsstarmessagecontext.h"
+#include "wsstarsessioncontext.h"
+#include "SenXmlReader.h"
+
+#include "senlogger.h"
+
+
+CWSStarMessageContext* CWSStarMessageContext::NewL(SenContext::TContextDirection aDirection, CSenXmlReader*& aParser)
+    {
+    CWSStarMessageContext* self = NewLC(aDirection, aParser);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CWSStarMessageContext* CWSStarMessageContext::NewLC(SenContext::TContextDirection aDirection, CSenXmlReader*& aParser)
+    {
+    CWSStarMessageContext* self = new (ELeave) CWSStarMessageContext(aDirection, aParser);
+    CleanupStack::PushL (self);
+    self->ConstructL();
+    return self;
+    }
+
+CWSStarMessageContext* CWSStarMessageContext::NewLC(
+        SenContext::TContextDirection aDirection, CSenXmlReader*& aParser,
+        CWSStarSessionContext& aSessionContext)
+    {
+    CWSStarMessageContext* self =
+            new (ELeave) CWSStarMessageContext(aDirection, aParser);
+    CleanupStack::PushL (self);
+    self->ConstructL(aSessionContext);
+    return self;
+    }
+
+// Constructor
+CWSStarMessageContext::CWSStarMessageContext(SenContext::TContextDirection aDirection, CSenXmlReader*& aParser)
+    :iDirection(aDirection),
+    iOwnedEnvelope(EFalse),
+    iParser(aParser),
+    iDescs(EFalse, ETrue),
+    iInts(EFalse, ETrue)
+    {
+    }
+
+// Constructor
+void CWSStarMessageContext::ConstructL()
+    {
+    }
+
+void CWSStarMessageContext::ConstructL(CWSStarSessionContext& aSessionContext)
+    {
+    UpdateFromSessionContextL(aSessionContext);
+    }
+
+// Destructor
+CWSStarMessageContext::~CWSStarMessageContext()
+    {
+    if (iOwnedEnvelope)
+        {
+        delete iCurrentEnvelope;
+        }
+    iDescs.Reset();
+    iInts.Reset();
+    }
+    
+//from SessionContext 
+
+CSenSoapMessage* CWSStarMessageContext::GetCurrentSoapMessage()
+    {
+    if (iCurrentEnvelope)
+        {
+        return (CSenSoapMessage*)iCurrentEnvelope;
+        }
+    else
+        {
+        return NULL;
+        }
+};
+TPtrC8 CWSStarMessageContext::GetMessageL()
+    {
+    return iCurrentEnvelopeTxt;
+    };
+void CWSStarMessageContext::UpdateDesC8L(CWSStarSessionContext& aSessionContext, const TDesC8& aKey)
+    {
+    const TDesC8* ptr =
+            aSessionContext.GetDesC8L(aKey);
+    if (ptr && !GetDesC8L(aKey))
+        {
+        User::LeaveIfError(Update(aKey, *ptr));
+        }
+    }
+void CWSStarMessageContext::UpdateIntL(CWSStarSessionContext& aSessionContext, const TDesC8& aKey)
+    {
+    const TInt* ptr =
+            aSessionContext.GetIntL(aKey);
+    if (ptr &&!GetIntL(aKey))
+        {
+        User::LeaveIfError(Update(aKey, *ptr));    
+        } 
+    }
+    
+void CWSStarMessageContext::UpdateFromSessionContextL( CWSStarSessionContext& aSessionContext )
+    {
+    //becouse of resending we need keep veen message specific stuff inside session ctx
+    // (see ASYNC handkleerror)
+    if (Direction() == SenContext::EOutgoing)
+        {
+        const TDesC8* ptr =
+        aSessionContext.GetDesC8L( WSStarContextKeys::KTo );
+        if ( ptr )
+            {
+            TInt error = Remove( WSStarContextKeys::KTo );
+            if( error )
+                {
+                TLSLOG_L( KSenCoreServiceManagerLogChannelBase, KMinLogLevel, "CWSStarMessageContext::UpdateFromSessionContextL( CWSStarSessionContext& aSessionContext ):" );
+                TLSLOG_FORMAT(( KSenCoreServiceManagerLogChannelBase, KMinLogLevel, _L8("- Remove( WSStarContextKeys::KTo ) returned an error(!): %d => going to 'throw a LEAVE'"), error ));
+                User::LeaveIfError( error );
+                }
+            }        
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KTo);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KAction);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KAddressingVersion);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KTimestampExpires);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KTimestampCreated);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KPhoneTimeWhenMTResolved);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KPOPBase64);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KBinaryType);
+        UpdateIntL(aSessionContext, WSStarContextKeys::KSoapVersion);
+        UpdateIntL(aSessionContext, WSStarContextKeys::KPassportEnabled);
+        UpdateIntL(aSessionContext, WSStarContextKeys::KMTIsReplacedBySCT);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KSecurityToken);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KBody);
+        iBody = aSessionContext.GetSenElementL(WSStarContextKeys::KBodyElement);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KSTR);
+        ipSignedParts = (RPointerArray<HBufC8>*)aSessionContext.GetAnyL( WSStarContextKeys::KSignedPartsArray );
+              
+#ifdef _SENDEBUG                
+        if( !ipSignedParts ) // ipSignedParts == NULL!
+            {
+            TLSLOG_L( KSenCoreServiceManagerLogChannelBase, KMinLogLevel, "CWSStarMessageContext::UpdateFromSessionContextL( CWSStarSessionContext& aSessionContext ):" );
+            TLSLOG_L( KSenCoreServiceManagerLogChannelBase, KMinLogLevel, "- aSessionContext.GetAnyL( WSStarContextKeys::KSignedPartsArray ) returned NULL(!)" );
+            }
+#endif // _SENDEBUG            
+        
+        UpdateIntL(aSessionContext, WSStarContextKeys::KAppInfoPresent);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KApplicationName);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KApplicationVendor);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KApplicationVersion);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KLocale);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KManufacturer);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KModel);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KDeviceName);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KDeviceVersion);
+        UpdateDesC8L(aSessionContext, WSStarContextKeys::KIMSI);
+        }
+    else
+        {
+        UpdateIntL(aSessionContext, WSStarContextKeys::KPassportEnabled);
+        }
+    }
+
+TInt CWSStarMessageContext::Add(const TDesC8& aKey, CSenSoapEnvelope* aValue)
+    {
+    TInt results = KErrNone;
+    if (aKey == SenContext::KSenCurrentSoapMessageCtxKey())
+        {
+        if (!iCurrentEnvelope)
+            {
+            iCurrentEnvelope = aValue;
+            }
+        else
+            {
+            results = KErrAlreadyExists;
+            }
+        
+        }
+    return results;
+    };
+TInt CWSStarMessageContext::Update(const TDesC8& aKey, CSenSoapEnvelope* aValue)
+    {
+    if (aKey == SenContext::KSenCurrentSoapMessageCtxKey())
+        {
+        if (iOwnedEnvelope)
+            {
+            delete iCurrentEnvelope;
+            }
+        iCurrentEnvelope = aValue;
+        }
+    return KErrNone;
+    };
+const CSenSoapEnvelope* CWSStarMessageContext::GetSenSoapEnvelopeL(const TDesC8& aKey)
+    {
+    if (aKey == SenContext::KSenCurrentSoapMessageCtxKey)
+        {
+        return iCurrentEnvelope;
+        }
+    else
+        {
+        return NULL;
+        }
+    };
+
+
+
+//from MContext       
+SenContext::TContextType CWSStarMessageContext::Type() const
+    {
+    return SenContext::EMessageContext;
+    }
+    
+SenContext::TContextDirection CWSStarMessageContext::Direction() const
+    {
+    return iDirection;
+    }
+//-----------------descs        
+TInt CWSStarMessageContext::Add(const TDesC8& aKey, const TDesC8& aValue)
+    {
+    if (aKey == SenContext::KSenCurrentSoapMessageCtxKey())
+        {
+        if (! iCurrentEnvelopeTxt.Length())
+            {
+            iCurrentEnvelopeTxt.Set(aValue);
+            return KErrNone;
+            }
+        else
+            {
+            return KErrAlreadyExists;
+            }
+        }
+        //version without copy
+        //return iDescs.Append(&aKey,&aValue);
+        
+        //version with making of copy
+        if (!aValue.Length()) return KErrUnderflow;
+        HBufC8* newValue = NULL;
+        TInt error(KErrNone);
+        TRAP(error, newValue = aValue.AllocL());
+        if (!error)
+            {
+            error = iDescs.Append(&aKey,newValue);
+            }            
+        return error;
+    }
+
+//it add(if not exist) or update. So , it is like Set
+TInt CWSStarMessageContext::Update(const TDesC8& aKey, const TDesC8& aValue)
+    {
+    if (aKey == SenContext::KSenCurrentSoapMessageCtxKey())
+        {
+        iCurrentEnvelopeTxt.Set(aValue);
+        return KErrNone;
+        }
+    
+    //version with makeing of copy
+    TInt error(KErrNone);
+    if (!aValue.Length()) 
+        {
+        error = Remove(aKey);
+        if (error == KErrNotFound)
+                return KErrNone;
+            else
+                return error;
+        }
+    HBufC8* newValue = NULL;
+    TRAP(error, newValue = aValue.AllocL());
+    
+    if (!error)
+        {
+        error = iDescs.UpdateValue(&aKey,newValue);
+        }
+    return error;
+    }
+
+const TDesC8* CWSStarMessageContext::GetDesC8L(const TDesC8& aKey)
+    {
+    if (aKey == SenContext::KSenCurrentSoapMessageCtxKey())
+        {
+        return NULL;
+        }
+    TInt index = iDescs.Find(aKey);
+    if (index != KErrNotFound)
+        {
+        return iDescs.ValueAt(index);
+        }
+    else
+        {
+        return NULL;
+        }
+    }
+
+TInt CWSStarMessageContext::Remove(const TDesC8& aKey)
+    {
+    if (aKey == WSStarContextKeys::KBodyElement)
+        {
+        iBody = NULL;
+        return KErrNone;
+        }
+    else
+        {
+        return iDescs.RemoveByKey(aKey);
+        }
+    }
+//-------------Ints
+TInt CWSStarMessageContext::Add(const TDesC8& aKey, TInt aValue)
+    {
+    TInt* a = NULL;
+    a = new TInt(aValue);
+    if (a)
+        {
+        return iInts.Append(&aKey, a);
+        }
+    else
+        {
+        return KErrNoMemory;
+        }
+    }
+
+TInt CWSStarMessageContext::Update(const TDesC8& aKey, TInt aValue)
+    {
+    TInt* a = NULL;
+    a = new TInt(aValue);
+    if (a)
+        {
+        return iInts.UpdateValue(&aKey, a);
+        }
+    else
+        {
+        return KErrNoMemory;
+        }
+    }
+
+const TInt* CWSStarMessageContext::GetIntL(const TDesC8& aKey)
+    {
+    TInt index = iInts.Find(aKey);
+    if (index!=KErrNotFound)
+        {
+        return iInts.ValueAt(index);
+        }
+    else
+        {
+        return NULL;
+        };        
+    }
+
+//-----------------elements
+TInt CWSStarMessageContext::Add(const TDesC8& aKey, CSenElement* aValue)
+    {
+    return Update(aKey,aValue);
+    }
+
+TInt CWSStarMessageContext::Update(const TDesC8& aKey, CSenElement* aValue)
+    {
+    if (aKey == WSStarContextKeys::KBodyElement)
+        {
+        iBody = aValue;
+        return KErrNone;
+        }
+    return KErrNotFound;
+    }
+
+const CSenElement* CWSStarMessageContext::GetSenElementL(const TDesC8& aKey)
+    {
+    if (aKey == WSStarContextKeys::KBodyElement)
+        {
+        return iBody;
+        }
+    return NULL;
+    }
+//-----------------TAnys
+TInt CWSStarMessageContext::Add(const TDesC8& /*aKey*/, TAny* /*aValue*/)
+    {
+    return KErrNotSupported;
+    }
+
+TInt CWSStarMessageContext::Update(const TDesC8& /*aKey*/, TAny* /*aValue*/)
+    {
+    return KErrNotSupported;
+    }
+
+TAny* CWSStarMessageContext::GetAnyL(const TDesC8& aKey)	//codescannerwarnings
+    {
+    if(aKey == WSStarContextKeys::KSignedPartsArray)
+        {
+        return ipSignedParts;
+        }
+     else
+        {
+        return NULL;
+        }
+    }
+
+const CSenXmlReader* CWSStarMessageContext::GetParser()
+    {
+    return iParser;
+    }
+
+TInt CWSStarMessageContext::Count() const
+    {
+    return KErrNotSupported;
+    }
+
+TPtrC8 CWSStarMessageContext::KeyAtL(TInt /*aIndex*/)
+    {
+    return KNullDesC8();
+    }
+        
+void CWSStarMessageContext::Reset() 
+    {
+    }
+    
+MSenMessage* CWSStarMessageContext::MessageL()	//codescannerwarnigs
+    {
+    return NULL;
+    }
+    
+TInt CWSStarMessageContext::SetMessage(MSenMessage* /* apMessage */, TBool /* aOwned */)
+    {
+    return KErrNotSupported;
+    }
+    
+TInt CWSStarMessageContext::SetProperties(MSenProperties* /* apTransportProperties */, TBool /* aOwned */)
+    {
+    return KErrNotSupported;
+    }
+    
+MSenProperties* CWSStarMessageContext::Properties()
+    {
+    return NULL;    
+    }
+    
+TInt CWSStarMessageContext::Add(const TDesC8& /* aKey */, MSenMessage* /* apMessage */, TBool /* aOwned */)
+    {
+    return KErrNotSupported;
+    }
+    
+TInt CWSStarMessageContext::Update(const TDesC8& /* aKey */, MSenMessage* /* apMessage */, TBool /* aOwned */)
+    {
+    return KErrNotSupported;
+    }
+    
+MSenMessage* CWSStarMessageContext::GetMessageL(const TDesC8& /* aKey */)	// codescannerwarnings
+    {
+    return NULL;
+    }
+    
+    
+CSenChunk* CWSStarMessageContext::ChunkL()	//codescannerwarnings
+    {
+    return NULL;
+    }
+    
+TInt CWSStarMessageContext::SetChunk(CSenChunk* /* apMsgAsChunk */, TBool /* aOwned */)
+    {
+    return KErrNotSupported;
+    }
+    
+TInt CWSStarMessageContext::SetDirection( SenContext::TContextDirection /* aDirection */ ) 
+    {
+    return KErrNotSupported; 
+    }
+    
+   
+// END OF FILE
+