webservices/idwsfplugin/src/idwsfsaslmessage.cpp
changeset 0 62f9d29f7211
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/idwsfplugin/src/idwsfsaslmessage.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,372 @@
+/*
+* 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 <SenXmlElement.h> // check if this include is needed(?)
+#include <SenXmlUtils.h>
+
+#include "idwsfsaslmessage.h"
+
+#include "sendebug.h"
+#include "senlogger.h"
+#include "senpasswordtransform.h"
+
+namespace
+    {
+    _LIT8(KContinue, "continue");
+    _LIT8(KAbort, "abort");
+
+    _LIT8(KPasswordTransformsName, "PasswordTransforms");
+    _LIT8(KTransformName, "Transform");
+    _LIT8(KParameterName, "Parameter");
+
+    _LIT8(KDataName, "Data");
+    _LIT8(KNameAttr, "name");
+    _LIT8(KAuthzIdName, "authzID");
+    _LIT8(KAdvisoryAuthnIdName, "advisoryAuthnID");
+    _LIT8(KServerMechanismName, "serverMechanism");
+    _LIT8(KMechanismName, "mechanism");
+    }
+
+CIdWsfSaslMessage* CIdWsfSaslMessage::NewL(
+                                    MSenCoreServiceManager& aServiceManager)
+    {
+    CIdWsfSaslMessage* pNew = new (ELeave) CIdWsfSaslMessage(aServiceManager);
+    CleanupStack::PushL(pNew);
+    pNew->ConstructL();
+    CleanupStack::Pop();
+    return pNew;
+    }
+
+CIdWsfSaslMessage* CIdWsfSaslMessage::NewL(
+    MSenCoreServiceManager& aServiceManager,
+    const TDesC8& aXmlns,
+    const TDesC8& aLocalName,
+    const TDesC8& aQName
+    )
+    {
+    CIdWsfSaslMessage* pNew = new (ELeave) CIdWsfSaslMessage(aServiceManager);
+    CleanupStack::PushL(pNew);
+    pNew->ConstructL(aXmlns, aLocalName, aQName);
+    CleanupStack::Pop();
+    return pNew;
+    }
+
+CIdWsfSaslMessage::CIdWsfSaslMessage(MSenCoreServiceManager& aServiceManager)
+:   iServiceManager(aServiceManager),
+    ipMechanism(NULL),
+    ipParameterName(NULL)
+    {
+    }
+
+void CIdWsfSaslMessage::ConstructL()
+    {
+    BaseConstructL(KSaslXmlns, KSaslResponseName, KSaslResponseQName);
+    }
+
+void CIdWsfSaslMessage::ConstructL(
+    const TDesC8& aXmlns,
+    const TDesC8& aLocalName,
+    const TDesC8& aQName
+    )
+    {
+    BaseConstructL(aXmlns, aLocalName, aQName);
+    }
+
+CIdWsfSaslMessage::~CIdWsfSaslMessage()
+    {
+    delete ipMechanism;
+    delete ipParameterName;
+    }
+
+TInt CIdWsfSaslMessage::ConstructInitRequestFromL(
+                                              const TDesC8& aAllMechanismNames,
+                                              CSenIdentityProvider& aAccount)
+    {
+    // fresh start
+    delete ipMechanism;
+    ipMechanism=NULL;
+    delete ipParameterName;
+    ipParameterName=NULL;
+
+    MSenElement& element = AsElement();
+    element.AddAttrL(KMechanismName, aAllMechanismNames);
+
+    TPtrC8 authzId = aAccount.AuthzID();
+    if (authzId.Length() > 0)
+        {
+        element.AddAttrL(KAuthzIdName, authzId);
+        }
+
+    TPtrC8 advisoryAuthnId = aAccount.AdvisoryAuthnID();
+    if (advisoryAuthnId.Length() > 0)
+        {
+        element.AddAttrL(KAdvisoryAuthnIdName, advisoryAuthnId);
+        }
+    return KErrNone;
+    }
+
+TInt CIdWsfSaslMessage::ConstructRequestFromL(
+    const TDesC8& aMech)
+    {
+    // fresh start
+    delete ipMechanism;
+    ipMechanism=NULL;
+    delete ipParameterName;
+    ipParameterName=NULL;
+
+    AsElement().AddAttrL(KMechanismName, aMech);
+    return KErrNone;
+    }
+
+TInt CIdWsfSaslMessage::ConstructRequestFromL(
+    const TDesC8& aMech,
+    const TDesC8& aData
+    )
+    {
+    // fresh start
+    delete ipMechanism;
+    ipMechanism=NULL;
+    delete ipParameterName;
+    ipParameterName=NULL;
+
+    TInt retVal = ConstructRequestFromL(aMech);
+    HBufC8* pDataBase64 = iServiceManager.EncodeToBase64LC(aData);
+
+    AsElement().AddElementL(
+        AsElement().NamespaceURI(), KDataName).SetContentL(*pDataBase64);
+
+    CleanupStack::PopAndDestroy(); // delete pDataBase64;
+    return retVal;
+    }
+
+TBool CIdWsfSaslMessage::IsContinue()
+    {
+    if(!ipStatus)
+        {
+        return EFalse;
+        }
+    else
+        {
+        return SenXmlUtils::EndsWith(*ipStatus, KContinue);
+        }
+    }
+
+TBool CIdWsfSaslMessage::IsAbort()
+    {
+    if (ipStatus == NULL)
+        {
+        return EFalse;
+        }
+    else
+        {
+        return SenXmlUtils::EndsWith(*ipStatus, KAbort);
+        }
+    }
+
+TPtrC8 CIdWsfSaslMessage::Mechanism()
+    {
+    if (!ipMechanism)
+        {
+        return KNullDesC8();
+        }
+    else
+        {
+        return *ipMechanism;
+        }
+    }
+
+TPtrC8 CIdWsfSaslMessage::ParameterName()
+    {
+    if (!ipParameterName)
+        {
+        return KNullDesC8();
+        }
+    else
+        {
+        return *ipParameterName;
+        }
+    }
+
+TPtrC8 CIdWsfSaslMessage::Data()
+    {
+    MSenElement* pDataElement = AsElement().Element(KDataName);
+    if(pDataElement)
+        {
+        return pDataElement->Content();
+        }
+    return KNullDesC8();
+    }
+
+// @return NULL if list is empty
+CSenPasswordTransform* CIdWsfSaslMessage::LastParsedPasswordTransform()
+    {
+    TInt count(iTransforms.Count());
+    if(count>0)
+        {
+        return iTransforms[count-1];
+        }
+    else
+        {
+        return NULL;
+        }
+    }
+
+
+
+void CIdWsfSaslMessage::StartElementL(
+    const TDesC8& aNsUri,
+    const TDesC8& aLocalName,
+    const TDesC8& aQName,
+    const RAttributeArray& aAttributes )
+    {
+    if (IsOk())
+        {
+        CIdWsfDsQueryResponse::StartElementL(aNsUri, aLocalName, aQName,
+                                                aAttributes);
+        }
+    else
+        {
+        switch (iState)
+            {
+            case KStateIgnore:
+                {
+                if (aLocalName == KSaslResponseName)
+                    {
+                    HBufC8* pNew = SenXmlUtils::AllocAttrValueL(
+                        aAttributes,
+                        KServerMechanismName
+                        );
+                    delete ipMechanism;
+                    ipMechanism = pNew;
+                    }
+                else if (aLocalName == KStatusName)
+                    {
+                    HBufC8* pNew = SenXmlUtils::AllocAttrValueL(
+                        aAttributes,
+                        KStatusCodeName
+                        );
+                    delete ipStatus;
+                    ipStatus = pNew;
+                    }
+                else if (aLocalName == KDataName)
+                    {
+                    DelegateParsingL(aNsUri, aLocalName, aQName, aAttributes);
+                    }
+                else if (aLocalName == KPasswordTransformsName)
+                    {
+                    iTransforms.Reset(); // NOT owned..
+                    iState = KStateParsingPwTransforms;
+                    }
+                break;
+                }
+            case KStateParsingPwTransforms:
+                {
+                if (aLocalName == KTransformName)
+                    {
+
+                    TPtrC8 name = SenXmlUtils::AttrValue(aAttributes, 
+                                                            KNameAttr);
+                    CSenPasswordTransform* pTransform =
+                        CSenPasswordTransform::NewL(name, iServiceManager);
+
+                    if(pTransform)
+                        {
+                        TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase   , KMinLogLevel  ,
+                            _L8("CIdWsfSaslMessage::StartElementL - \
+                            appending password transform: '%S'"), &name));
+                        iTransforms.Append(pTransform);
+                        }
+                    }
+                else if (aLocalName == KParameterName)
+                    {
+                    HBufC8* pNew = SenXmlUtils::AllocAttrValueL(
+                        aAttributes,
+                        KNameAttr
+                        );
+                    delete ipParameterName; // free memory
+                    ipParameterName = pNew;
+                    TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase   , KMinLogLevel  ,
+                        _L("CIdWsfSaslMessage::StartElementL - \
+                        parsing PasswordTransform parameter: '%S'"),
+                            ipParameterName));
+                    ResetContentL();
+                    }
+                break;
+                }
+            }
+        }
+    }
+
+void CIdWsfSaslMessage::EndElementL(
+    const TDesC8& aNsUri,
+    const TDesC8& aLocalName,
+    const TDesC8& aQName
+    )
+    {
+    if (IsOk())
+        {
+        CIdWsfDsQueryResponse::EndElementL(aNsUri, aLocalName, aQName);
+        }
+    else
+        {
+        switch (iState)
+            {
+            case KStateParsingPwTransforms:
+                {
+                if (aLocalName == KParameterName)
+                    {
+                    CSenPasswordTransform* pLast =
+                            LastParsedPasswordTransform();
+                    if(pLast)
+                        {
+                        pLast->SetParameterL(*ipParameterName, Content());
+                        }
+                    }
+                else if (aLocalName == KPasswordTransformsName)
+                    {
+                    ResetContentL();
+                    iState = KStateIgnore;
+                    }
+                break;
+                }
+            default:
+                break;
+            }
+        }
+    }
+
+RPointerArray<CSenPasswordTransform> CIdWsfSaslMessage::Transforms()
+    {
+    return iTransforms;
+    }
+
+
+RFileLogger* CIdWsfSaslMessage::Log() const
+    {
+    return iServiceManager.Log();
+    }
+
+// End of File
+