ncdengine/provider/protocol/src/ncdrequestbase.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/protocol/src/ncdrequestbase.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,395 @@
+/*
+* Copyright (c) 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:   CNcdRequestBase declaration
+*
+*/
+
+ 
+#include "ncdrequestbase.h"
+#include "ncdrequestconfigurationdata.h"
+#include "ncdprotocolwords.h"
+#include "ncdprotocolutils.h"
+#include "ncd_cp_detail.h"
+#include "ncd_cp_cookie.h"
+#include "ncd_cp_queryresponse.h"
+#include "ncdqueryitem.h"
+#include "catalogsdebug.h"
+
+
+CNcdRequestBase* CNcdRequestBase::NewL()
+    {    
+    CNcdRequestBase* self = 
+        CNcdRequestBase::NewLC();
+    CleanupStack::Pop();    
+    return self;
+    }
+
+CNcdRequestBase* CNcdRequestBase::NewLC()
+    {    
+    CNcdRequestBase* self = new (ELeave) CNcdRequestBase();
+    CleanupStack::PushL(self);
+    self->ConstructL( KTagPreminetRequest );
+    return self;
+    }
+
+void CNcdRequestBase::ConstructL( const TDesC8& aRootName ) 
+    {
+    DLTRACEIN(( "aRootName=%S", &aRootName ));
+    iRootName = aRootName.AllocL();
+    
+    iPrefix = TXmlEngString();
+    iId = TXmlEngString();
+    iNamespace = TXmlEngString();
+    iVersion = TXmlEngString();
+    iSession = TXmlEngString();
+    
+#ifdef RD_XML_ENGINE_API_CHANGE
+    iDomImplementation.OpenL();
+#endif
+    InitializeDocumentL();
+    DLTRACEOUT((""));
+    }
+
+CNcdRequestBase::CNcdRequestBase()
+    {
+    }
+    
+CNcdRequestBase::~CNcdRequestBase()
+    {
+    DLTRACEIN((""));
+    delete iConfiguration;
+    
+    iCookies.ResetAndDestroy();
+    iQueryResponses.ResetAndDestroy();
+      
+    iDocument.Close();    // NOTE: leaks memory (S60 3.2 wk38 emulator)
+#ifdef RD_XML_ENGINE_API_CHANGE
+    iDomImplementation.Close();
+#endif
+
+    iId.Free();
+    iVersion.Free();
+    iSession.Free();
+    iNamespace.Free();
+    iPrefix.Free();
+
+    delete iRootName;
+    DLTRACEOUT((""));
+    }
+    
+HBufC8* CNcdRequestBase::ExternalizeL() 
+    {
+    DLTRACEIN((""));
+    
+    const TXmlEngSerializationOptions KSerializationOptions = 
+        TXmlEngSerializationOptions( 0x09, KSerializationOptionUtf8 );
+    
+#ifndef RD_XML_ENGINE_API_CHANGE
+    TXmlEngString str;
+    iDocument.SaveL(str, iRoot, KSerializationOptions);
+    
+    str.PushL();
+    
+    HBufC8* buf = HBufC8::NewL( str.Size() );
+    *buf = str.PtrC8();
+   
+    // Free the original C-string
+    CleanupStack::PopAndDestroy();        
+#else
+    
+    RBuf8 rbuf;
+    iDocument.SaveL( rbuf, iRoot, KSerializationOptions );
+
+    CleanupClosePushL( rbuf );
+    HBufC8* buf = rbuf.AllocL();
+    CleanupStack::PopAndDestroy();  // rbuf
+
+#endif
+    
+    DLTRACEOUT((""));
+    return buf;
+    }
+    
+HBufC8* CNcdRequestBase::CreateRequestL() 
+    {
+    DLTRACEIN((""));
+    // check required attributes
+    if (iNamespace.IsNull() || iVersion.IsNull()) 
+        {
+        DLERROR(("not creating request"));
+        DASSERT( 0 );
+        // do not create request if required attributes are not set
+        DLTRACEOUT(( "NULL" ));
+        return NULL;
+        }
+        
+    // namespace, required
+    NcdProtocolUtils::NewAttributeL( iRoot, KAttrNamespace, iNamespace);
+    
+    // id, optional
+    if (iId.NotNull()) 
+        {
+        NcdProtocolUtils::NewAttributeL( iRoot, KAttrId, iId );
+        }
+    
+    // version, required
+    NcdProtocolUtils::NewAttributeL( iRoot, KAttrVersion, iVersion);
+    
+    // session, optional
+    if (iSession.NotNull())
+        {
+        NcdProtocolUtils::NewAttributeL( iRoot, KAttrSession, iSession);
+        }
+
+    // configuration, optional    
+    if (iConfiguration) 
+        {
+        TXmlEngElement configuration = 
+            iConfiguration->GetConfigurationElementL(iDocument);
+        if (configuration.NotNull())
+            iRoot.AppendChildL(configuration);
+                
+        TXmlEngElement cookies = 
+            iConfiguration->GetCookiesElementL(iDocument);
+        if (cookies.NotNull())
+            iRoot.AppendChildL(cookies);
+        
+        TXmlEngElement queryResponse = 
+            iConfiguration->GetQueryResponseElementL(iDocument);
+        if (queryResponse.NotNull())
+            iRoot.AppendChildL(queryResponse);
+        }
+    
+    // cookies, optional
+    TXmlEngElement cookies = GetCookiesElementL(KCdpNamespacePrefix);
+    if ( cookies.NotNull() ) 
+        {
+        iRoot.AppendChildL(cookies);
+        }
+    
+    TXmlEngElement queryResponses = GetQueryResponsesElementL(KCdpNamespacePrefix);
+    if ( queryResponses.NotNull() ) 
+        {
+        iRoot.AppendChildL(queryResponses);
+        }        
+
+    // add element generated in the inheriting class, one of the following:
+    // browse / search / manageSubscriptions / purchase / 
+    //   installationReport / diffQuery
+    iRoot.AppendChildL(iRequestElement);
+    
+        
+    HBufC8* result = ExternalizeL();
+
+    DLTRACEOUT((""));
+    return result;
+    }
+    
+void CNcdRequestBase::InitializeDocumentL() 
+    {
+    DLTRACEIN((""));
+    if (iDocument.NotNull()) 
+        {
+        iDocument.Close(); // ! this leaks!
+        }
+
+#ifndef RD_XML_ENGINE_API_CHANGE
+    iDocument = RXmlEngDocument::NewL();
+#else
+    iDocument.OpenL( iDomImplementation );
+#endif
+    iRoot = iDocument.CreateDocumentElementL(*iRootName);
+    
+#ifndef RD_XML_ENGINE_API_CHANGE
+    TXmlEngString defNs;
+    NcdProtocolUtils::DesToStringL(defNs, KDefaultNamespaceUri);
+    iRoot.SetDefaultNamespaceL( defNs );
+    defNs.Free();
+
+    TXmlEngString cdpNs;
+    NcdProtocolUtils::DesToStringL(cdpNs, KCdpNamespaceUri);
+    TXmlEngString cdpNsPrefix;
+    NcdProtocolUtils::DesToStringL(cdpNsPrefix, KCdpNamespacePrefix);
+    iCdpNamespace = iRoot.AddNamespaceDeclarationL( cdpNs, cdpNsPrefix );
+    cdpNs.Free();
+    cdpNsPrefix.Free();
+    
+    TXmlEngString xsNs;
+    NcdProtocolUtils::DesToStringL(xsNs, KXsNamespaceUri);
+    TXmlEngString xsNsPrefix;
+    NcdProtocolUtils::DesToStringL(xsNsPrefix, KXsNamespacePrefix);
+    iXsNamespace = iRoot.AddNamespaceDeclarationL(xsNs, xsNsPrefix);
+    xsNs.Free();
+    xsNsPrefix.Free();
+    
+    TXmlEngString xsiNs;
+    NcdProtocolUtils::DesToStringL(xsiNs, KXsiNamespaceUri);
+    TXmlEngString xsiNsPrefix;
+    NcdProtocolUtils::DesToStringL(xsiNsPrefix, KXsiNamespacePrefix);
+    iXsiNamespace = iRoot.AddNamespaceDeclarationL(xsiNs, xsiNsPrefix);
+    xsiNs.Free();
+    xsiNsPrefix.Free();
+
+#else
+    iRoot.SetDefaultNamespaceL( KDefaultNamespaceUri );
+    iCdpNamespace = iRoot.AddNamespaceDeclarationL( KCdpNamespaceUri, KCdpNamespacePrefix );
+    iXsNamespace = iRoot.AddNamespaceDeclarationL( KXsNamespaceUri, KXsNamespacePrefix );
+    iXsiNamespace = iRoot.AddNamespaceDeclarationL( KXsiNamespaceUri, KXsiNamespacePrefix );
+#endif
+
+    DLTRACEOUT((""));
+    }
+    
+CNcdRequestConfigurationData* CNcdRequestBase::Configuration() 
+    {
+    return iConfiguration;
+    }
+    
+void CNcdRequestBase::SetConfigurationL(
+    CNcdRequestConfigurationData* aConfiguration) 
+    {
+    DLTRACEIN((""));
+    delete iConfiguration;
+    iConfiguration = aConfiguration;
+    }
+    
+void CNcdRequestBase::SetRequestIdL(TInt aId) 
+    {
+    TBuf<32> buf;
+    buf.AppendNum(aId);
+    TXmlEngString id;
+    id.SetL(buf);
+    iId = id;
+    }
+    
+void CNcdRequestBase::SetProtocolVersionL(const TDesC8& aVersion)
+    {
+    iVersion.SetL(aVersion);
+    }
+    
+void CNcdRequestBase::SetSessionL(const TDesC& aSession)
+    {
+    iSession.SetL(aSession);
+    }
+    
+void CNcdRequestBase::SetNamespaceL( const TDesC& aNamespace)
+    {
+    iNamespace.SetL(aNamespace);
+    }
+    
+HBufC* CNcdRequestBase::IdLC() const
+    {    
+    return iId.AllocLC();
+    }
+
+HBufC* CNcdRequestBase::SessionLC() const
+    {
+    return iSession.AllocLC();;
+    }
+
+HBufC* CNcdRequestBase::NamespaceLC() const
+    {
+    return iNamespace.AllocLC();    
+    }
+
+void CNcdRequestBase::AddQueryResponseL(MNcdConfigurationProtocolQueryResponse* aResponse)
+    {
+    iQueryResponses.AppendL(aResponse);
+    }
+
+void CNcdRequestBase::AddCookieL(MNcdConfigurationProtocolCookie* aCookie)
+    {
+    iCookies.AppendL(aCookie);
+    }
+
+TXmlEngElement CNcdRequestBase::GetCookiesElementL( const TDesC8& aPrefix ) 
+    {
+    TXmlEngElement cookies;
+    
+    if ( iCookies.Count() > 0 ) 
+        {
+        cookies = NcdProtocolUtils::NewElementL( iDocument, iRoot, KTagCookies );
+        for ( TInt i = 0; i < iCookies.Count(); ++i ) 
+            {
+            MNcdConfigurationProtocolCookie* cook = iCookies[i];
+            TXmlEngElement cookie = 
+                NcdProtocolUtils::NewElementL( iDocument, cookies, KTagCookie );
+            NcdProtocolUtils::NewAttributeL( cookie, KAttrKey, cook->Key() );
+            for ( TInt j = 0; j < cook->ValueCount(); ++j ) 
+                {
+                TXmlEngElement value = 
+                    NcdProtocolUtils::NewElementL( iDocument, cookie, KTagValue, aPrefix );
+#ifndef RD_XML_ENGINE_API_CHANGE
+                value.SetTextL( cook->Value(j) );
+#else
+                HBufC8* tempBuf = NcdProtocolUtils::ConvertUnicodeToUtf8L( cook->Value(j) );
+                CleanupStack::PushL( tempBuf );
+                value.SetTextL( *tempBuf );
+                CleanupStack::PopAndDestroy( tempBuf );
+#endif
+                }
+            }
+        }
+    return cookies;
+    }
+
+TXmlEngElement CNcdRequestBase::GetQueryResponsesElementL( const TDesC8& aPrefix ) 
+    {
+    TXmlEngElement queryResponse;
+    // queryResponses, optional
+    if ( iQueryResponses.Count() > 0 )
+        {
+        for (TInt i = 0; i < iQueryResponses.Count(); ++i)
+            {
+            MNcdConfigurationProtocolQueryResponse* resp = iQueryResponses[i];
+            queryResponse = NcdProtocolUtils::NewElementL(iDocument, iRoot, KTagQueryResponse);
+            if ( resp->Id() != KNullDesC ) 
+                NcdProtocolUtils::NewAttributeL(queryResponse, KAttrId, resp->Id());
+            if ( resp->Semantics() != MNcdQueryItem::ESemanticsNone )
+                NcdProtocolUtils::NewAttributeL(queryResponse, KAttrSemantics, resp->Semantics());
+            if ( resp->Cancel() )
+                NcdProtocolUtils::NewBoolAttributeL(queryResponse, KAttrCancel, resp->Cancel());
+
+            for (TInt j = 0; j < resp->ResponseCount(); ++j)
+                {
+                const MNcdConfigurationProtocolQueryResponseValue& val = resp->ResponseL(j);
+                TXmlEngElement response = NcdProtocolUtils::NewElementL(
+                    iDocument, queryResponse, KTagResponse, aPrefix);
+                NcdProtocolUtils::NewAttributeL(response, KAttrId, val.Id());
+                NcdProtocolUtils::NewAttributeL(response, KAttrSemantics, val.Semantics());
+                for (TInt k = 0; k < val.ValueCount(); ++k) 
+                    {
+                    TXmlEngElement value = NcdProtocolUtils::NewElementL(
+                        iDocument, response, KTagValue, aPrefix);
+#ifndef RD_XML_ENGINE_API_CHANGE
+                        value.SetTextL( val.ValueL(k) );
+#else
+                        HBufC8* tempBuf = NcdProtocolUtils::ConvertUnicodeToUtf8L( val.ValueL(k) );
+                        CleanupStack::PushL( tempBuf );
+                        value.SetTextL( *tempBuf );
+                        CleanupStack::PopAndDestroy( tempBuf );
+#endif
+                    }
+                }
+            }
+        }
+    return queryResponse;
+    }
+    
+
+TXmlEngElement CNcdRequestBase::GetDetailsElementL( const TDesC8& /*aPrefix*/ ) 
+    {
+    DLTRACEIN((""));
+    return TXmlEngElement();
+    }