xml/cxmllibrary/src/wbxmlp/src/DictionaryContext.cpp
changeset 27 450972dee096
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/cxmllibrary/src/wbxmlp/src/DictionaryContext.cpp	Tue Jul 06 16:24:52 2010 +0300
@@ -0,0 +1,296 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 <e32std.h>
+#include "DictionaryContext.h"
+#include "cxml_internal.h"
+#include "featmgr.h"
+#include <xml/cxml/nw_wbxml_dictionary.h>
+
+/* There is possibility that dictionary initialize is called by the embedded
+ * application also. To make allocation/deallocation of dictionary possible.
+ * The NW_CONTEXT_REF_DICT_CNT variable is added. This variable of TLS context 
+ * will keep the reference count of the number of times dictionary 
+ * inialization/destroy is called. 
+ * 
+ * The dictionary is destroyed when NW_CONTEXT_REF_DICT_CNT is zero.
+ *
+ */
+
+typedef enum {
+  NW_CONTEXT_DICTIONARY             = 0,
+  NW_CONTEXT_DICTIONARY_COUNT       = 1,
+  NW_CONTEXT_REF_DICT_CNT           = 2, /*Number of times dictionary rerferenced*/
+
+  NW_CONTEXT_NUM_ENTRIES            = 3
+  
+} NW_DictionaryContext_Id_t;
+
+
+typedef struct {
+	NW_Uint16	numContexts;
+	void *contexts[NW_CONTEXT_NUM_ENTRIES];
+} NW_DictionaryContext_Array_t;
+
+
+/*****************************************************************
+
+  Name: NW_Ctx_Init()
+
+  Description:  Initialize the context manager
+
+  Parameters:   
+
+  Return Value: NW_STAT_SUCCESS or NW_STAT_OUT_OF_MEMORY
+
+******************************************************************/
+static NW_Status_t DictContext_Init()
+{
+  NW_DictionaryContext_Array_t* contextArray;
+  NW_Uint32 i;
+
+  /*lint --e{429} Custodial pointer has not been freed or returned */
+
+  /* Initialize the context manager once, and only once! */
+  if (Dll::Tls() == NULL) {
+    /* Allocate and init array to hold context pointers */  
+    contextArray = new NW_DictionaryContext_Array_t;
+
+    /*lint -e{774} Boolean within 'if' always evaluates to False */
+    if (contextArray == NULL) {
+      DestroyDictionaries();
+      return NW_STAT_OUT_OF_MEMORY;
+    }
+
+	contextArray->numContexts = NW_CONTEXT_NUM_ENTRIES;
+	
+    for (i = 0; i < NW_CONTEXT_NUM_ENTRIES; i++) {
+      contextArray->contexts[i] = NULL;
+    }
+
+    /* Store the pointer to the context array */
+    if( Dll::SetTls( contextArray ) != KErrNone)
+	{
+	  DestroyDictionaries();
+	}
+  }  
+
+  return NW_STAT_SUCCESS;
+}
+
+
+/*****************************************************************
+
+  Name: NW_Ctx_Set()
+
+  Description:  Set the context for the specified component
+
+  Parameters:   component - which context
+		        *ctx - pointer to the context to store
+
+  Return Value: NW_STAT_SUCCESS or NW_STAT_FAILURE
+
+******************************************************************/
+NW_Status_t DictContext_Set(const NW_DictionaryContext_Id_t aContextId,
+									 void *ctx)
+{
+  NW_Status_t status = NW_STAT_SUCCESS;
+  NW_DictionaryContext_Array_t* contextArray;
+
+  NW_ASSERT(aContextId < NW_CONTEXT_NUM_ENTRIES);
+
+  /* Get the pointer to the context array */  
+  contextArray = (NW_DictionaryContext_Array_t*)Dll::Tls();
+
+  if (contextArray == NULL) {
+    status = DictContext_Init();
+    if (status != NW_STAT_SUCCESS) {
+      return status;
+    }
+    contextArray = (NW_DictionaryContext_Array_t*)Dll::Tls();
+  }
+
+  /* Save the aContextId's context */
+  if (contextArray != NULL) {
+    /*lint -e{661} Possible access of out-of-bounds pointer */
+    contextArray->contexts[aContextId] = ctx;
+	return NW_STAT_SUCCESS;
+  }
+
+  return status;
+}
+
+
+/*****************************************************************
+
+  Name: DictContext_Get()
+
+  Description:  Get the context for the specified component
+
+  Parameters:   aContextId - which context
+
+  Return Value: pointer to the component's context or NULL
+
+******************************************************************/
+void *DictContext_Get(const NW_DictionaryContext_Id_t aContextId)
+{
+  NW_Status_t status;
+  NW_DictionaryContext_Array_t* contextArray;
+
+  /* Use "<=" rather than "<", as PushMtm tests last item for NULL */
+  NW_ASSERT(aContextId <= NW_CONTEXT_NUM_ENTRIES);
+
+  /* Get the pointer to the context array */
+  contextArray = (NW_DictionaryContext_Array_t*)Dll::Tls();
+
+  if (contextArray == NULL) {
+    status = DictContext_Init();
+    if (status != NW_STAT_SUCCESS) {
+      return NULL;
+    }
+    contextArray = (NW_DictionaryContext_Array_t*)Dll::Tls();
+  }
+
+  /* Return the component's context */
+  if (contextArray != NULL) {
+    /*lint --e{661} Possible access of out-of-bounds pointer */
+    /*lint --e{662} Possible creation of out-of-bounds pointer */
+    return contextArray->contexts[aContextId];
+  }
+
+  return NULL;
+}
+
+void DestroyDictionaries()
+{
+  NW_DictionaryContext_Array_t* contextArray = (NW_DictionaryContext_Array_t*)Dll::Tls();
+
+  if(contextArray)
+  {
+
+   /*Check the dictionary reference count. If it is zero 
+    * then free the dictionary.
+    */
+   if(contextArray->contexts[NW_CONTEXT_REF_DICT_CNT] == 0)
+   {
+    NW_WBXML_Dictionary_t **dictionaries = GetDictionaries();
+
+    NW_Mem_Free(dictionaries);
+    StoreDictionaries(NULL);
+    StoreDictionaryCount(0);
+
+   // Get the TLS pointer
+  
+    delete contextArray;
+    contextArray = NULL;
+    Dll::SetTls(contextArray);
+   }
+  }/*end if(contextArray)*/
+} 
+
+/* Temporary methods for storing dictionary & dictionary size inside the context.
+ */
+void StoreDictionaries(NW_WBXML_Dictionary_t** dictionaries)
+{
+    DictContext_Set(NW_CONTEXT_DICTIONARY, (void*)dictionaries);
+
+}
+
+NW_WBXML_Dictionary_t** GetDictionaries()
+{
+  return (NW_WBXML_Dictionary_t**)DictContext_Get(NW_CONTEXT_DICTIONARY);
+}
+
+void StoreDictionaryCount(NW_Uint32 dictionary_count)
+{
+    DictContext_Set(NW_CONTEXT_DICTIONARY_COUNT, (void*)dictionary_count);
+
+}
+
+NW_Uint32 GetDictionaryCount()
+{
+  NW_Uint32 count = (NW_Uint32)DictContext_Get(NW_CONTEXT_DICTIONARY_COUNT);
+
+  return count;
+
+}
+
+
+void UpdateDictRefCnt(CXML_DICT_REF_CNT updateVal)
+{
+ NW_DictionaryContext_Array_t* contextArray;
+ NW_Uint32 refCount = 0;
+
+   /* Get the pointer to the context array */  
+
+  contextArray = (NW_DictionaryContext_Array_t*)Dll::Tls();
+
+  if(contextArray != NULL)
+  {
+   refCount = (NW_Uint32) contextArray->contexts[NW_CONTEXT_REF_DICT_CNT];
+   if(updateVal == NW_CONTEXT_REF_DICT_CNT_INR)
+   {
+    contextArray->contexts[NW_CONTEXT_REF_DICT_CNT] =
+         (void*)++refCount;
+   }
+   else if(updateVal == NW_CONTEXT_REF_DICT_CNT_DCR)
+   {
+    contextArray->contexts[NW_CONTEXT_REF_DICT_CNT] =
+         (void*)--refCount;
+   }
+
+  }/*end if(contextArray != NULL)*/
+  return; 
+}/*end UpdateDictRefCnt(CXML_DICT_REF_CNT updateVal)*/
+
+
+//
+//For Non DTD element support and checking for other features in the release
+//
+
+EXPORT_C
+CXML_Int32 CXML_Additional_Feature_Supprted()
+{
+ 
+CXML_Int32 featureFlag = 0;
+
+featureFlag |= CXML_DTD_SUPPORT_ON;
+
+ /* The feature manager not supported. May be hook up for future use. 
+ 
+ CXML_Bool retVal = CXML_TRUE;
+
+ FeatureManager::InitializeLibL();
+
+ if(FeatureManager::FeatureSupported(KFeatureIdEcmaScript) )
+ {
+   retVal = CXML_TRUE;
+ }
+ else
+ {
+  retVal = CXML_FALSE;
+ }
+
+
+ retVal = CXML_TRUE;
+
+ return retVal; 
+ */
+
+ return featureFlag;
+
+}//end CXML_Non_DTD_supprted()
+