omadrm/drmengine/utils/src/DrmRel2_1StringDict00.cpp
changeset 0 95b198f216e5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omadrm/drmengine/utils/src/DrmRel2_1StringDict00.cpp	Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,279 @@
+/*
+* Copyright (c) 2007-2009 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:  Implementation class for OMA 2.1 Drm String Dictionary
+*
+*/
+
+
+#include <e32std.h>
+#include <ecom/implementationproxy.h>
+#include <xml/plugins/dictionarycodepage.h>
+#include <xml/xmlframeworkerrors.h>
+
+#include "drmrel2_1stringdict00.h"
+#include "drmrel2_1stringdict00tagtable.h"
+#include "drmrel2_1stringdict00attributetable.h"
+#include "drmrel2_1stringdict00attributevaluetable.h"
+
+using namespace Xml;
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::NewL
+// -----------------------------------------------------------------------------
+//
+MStringDictionary* CDrmRel2_1StringDict00::NewL( TAny* aStringPool )
+    {
+    CDrmRel2_1StringDict00* self(
+       new(ELeave) CDrmRel2_1StringDict00( 
+                            reinterpret_cast<RStringPool*>( aStringPool ) ) );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return ( static_cast<MStringDictionary*>( self ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::CDrmRel2_1StringDict00
+// -----------------------------------------------------------------------------
+//
+CDrmRel2_1StringDict00::CDrmRel2_1StringDict00( RStringPool* aStringPool )
+    : iStringPool( *aStringPool ), iCodePage( 0 )
+    {
+    // do nothing;
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CDrmRel2_1StringDict00::ConstructL()
+    {
+    // we don't own this stringpool
+    iStringPool.OpenL( DrmRel2_1StringDict00TagTable::Table );
+    iStringPool.OpenL( DrmRel2_1StringDict00AttributeTable::Table );
+    iStringPool.OpenL( DrmRel2_1StringDict00AttributeValueTable::Table );
+
+    iCodepage00Table = CDictionaryCodePage::NewL(
+        &DrmRel2_1StringDict00TagTable::Table, 
+        &DrmRel2_1StringDict00AttributeTable::Table, 
+        &DrmRel2_1StringDict00AttributeValueTable::Table, 
+        0 ); // codepage
+
+    // Construct the correlation mapping
+    iCodepage00Table->ConstructIndexMappingL( 
+                            iTagCodePage00,
+                            CDictionaryCodePage::EStringTypeElement );
+
+    iCodepage00Table->ConstructIndexMappingL( 
+                            iAttributeCodePage00,
+                            CDictionaryCodePage::EStringTypeAttribute );
+
+    iCodepage00Table->ConstructIndexMappingL( 
+                            iAttributeValueCodePage00,
+                            CDictionaryCodePage::EStringTypeAttributeValue );
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::Release
+// -----------------------------------------------------------------------------
+//
+void CDrmRel2_1StringDict00::Release()
+    {
+    delete ( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::~CCDrmRel2_1StringDict00
+// -----------------------------------------------------------------------------
+//
+CDrmRel2_1StringDict00::~CDrmRel2_1StringDict00()
+    {
+    if ( iCodepage00Table )
+        {
+        delete iCodepage00Table;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::ElementL
+// -----------------------------------------------------------------------------
+//
+void CDrmRel2_1StringDict00::ElementL(
+    TInt aToken, 
+    RString& aElement) const
+    {
+    TInt index( iCodepage00Table->StringPoolIndexFromToken(
+                                aToken, 
+                                CDictionaryCodePage::EStringTypeElement ) );
+
+    if ( index == KErrXmlStringPoolTableNotFound )
+       {
+       User::Leave( KErrXmlUnsupportedElement );
+       }
+
+    aElement = iStringPool.String(
+                    index,
+                    *( iCodepage00Table->StringTable( 
+                                CDictionaryCodePage::EStringTypeElement ) ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::AttributeL
+// -----------------------------------------------------------------------------
+//
+void CDrmRel2_1StringDict00::AttributeL(
+    TInt aToken, 
+    RString& aAttribute) const
+    {
+    TInt index( iCodepage00Table->StringPoolIndexFromToken(
+                           aToken, 
+                           CDictionaryCodePage::EStringTypeAttribute ) );
+
+    if ( index == KErrXmlStringPoolTableNotFound )
+        {
+        User::Leave( KErrXmlUnsupportedAttribute );
+        }
+
+    aAttribute = iStringPool.String( 
+                        index,
+                        *(iCodepage00Table->StringTable( 
+                            CDictionaryCodePage::EStringTypeAttribute ) ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::AttributeValuePairL
+// -----------------------------------------------------------------------------
+//
+void CDrmRel2_1StringDict00::AttributeValuePairL(
+    TInt aToken, 
+    RString& aAttribute, 
+    RString& aValue) const
+    {
+    AttributeL( aToken, aAttribute );
+    AttributeValueL( aToken, aValue );
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::AttributeValueL
+// -----------------------------------------------------------------------------
+//
+void CDrmRel2_1StringDict00::AttributeValueL( 
+    TInt aToken, 
+    RString& aValue ) const
+    {
+
+    TInt index( iCodepage00Table->StringPoolIndexFromToken(
+                    aToken, CDictionaryCodePage::EStringTypeAttributeValue ) );
+
+    if ( index == KErrXmlStringPoolTableNotFound )
+        {
+        User::Leave( KErrXmlUnsupportedAttributeValue );
+        }
+
+    aValue = iStringPool.String( 
+                    index,
+                    *(iCodepage00Table->StringTable(
+                           CDictionaryCodePage::EStringTypeAttributeValue ) ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::CompareThisDictionary
+// -----------------------------------------------------------------------------
+//
+TBool CDrmRel2_1StringDict00::CompareThisDictionary(
+    const RString& aDictionaryDescription ) const
+    {
+    // If this string dictionary has many codepages then all these comparisons 
+    // should go here.Remember, the string dictionary loads up all the 
+    // RStringTables into its RStringPool on construction. So if the comparison 
+    // fails we do not have it.
+    return ( ( aDictionaryDescription == 
+                            iStringPool.String( 
+                                DrmRel2_1StringDict00TagTable::EUri,
+                                DrmRel2_1StringDict00TagTable::Table ) ) ||
+
+             ( aDictionaryDescription == 
+                            iStringPool.String( 
+                                 DrmRel2_1StringDict00TagTable::EPublicId, 
+                                 DrmRel2_1StringDict00TagTable::Table ) ) ||
+
+            ( aDictionaryDescription == 
+                            iStringPool.String(
+                                DrmRel2_1StringDict00TagTable::EFormalPublicId, 
+                                DrmRel2_1StringDict00TagTable::Table ) ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::SwitchCodePage
+// -----------------------------------------------------------------------------
+//
+TInt CDrmRel2_1StringDict00::SwitchCodePage(TInt aCodePage)
+    {
+    // We only have one codepage so can't switch
+    if ( aCodePage != iCodePage )
+        {
+        return KErrXmlMissingStringDictionary;
+        }
+    return iCodePage;
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::PublicIdentifier
+// This method obtains the public identifier from the StringTable.
+// Either the formal or non formal public id will do.
+// The stringDictionary .rss files must list both these as Wbxml
+// documents have one or the other.
+//
+// @param aPubId The public identifier for this string dictionary.
+// -----------------------------------------------------------------------------
+//
+void CDrmRel2_1StringDict00::PublicIdentifier( RString& aPubId )
+    {
+    aPubId = iStringPool.String(
+        DrmRel2_1StringDict00TagTable::EFormalPublicId,
+        *( iCodepage00Table->StringTable( 
+                                CDictionaryCodePage::EStringTypeElement ) ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CDrmRel2_1StringDict00::NamespaceUri
+// The element types in the Device Information DTD are defined within
+// a namespace associated with the Uri/Urn available from the StringTable.
+// The RString need not be closed, but closing is harmless. 
+//
+// @param aUri The associated namespace for this string dictionary.
+// -----------------------------------------------------------------------------
+//
+void CDrmRel2_1StringDict00::NamespaceUri( RString& aUri )
+    {
+    aUri = iStringPool.String(
+           DrmRel2_1StringDict00TagTable::EUri,
+           *( iCodepage00Table->StringTable( 
+                                CDictionaryCodePage::EStringTypeElement ) ) );
+    }
+
+// Exported proxy for instantiation method resolution
+// Define the interface UIDs
+const TImplementationProxy ImplementationTable[] = { 
+                IMPLEMENTATION_PROXY_ENTRY( 0x2000B490, 
+                                            CDrmRel2_1StringDict00::NewL ) };
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( 
+    TInt& aTableCount )
+    {
+    aTableCount = sizeof( ImplementationTable ) / 
+                  sizeof( TImplementationProxy );
+
+    return ImplementationTable;
+    }