--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/reszip/src/resdict.cpp Thu Dec 17 09:14:18 2009 +0200
@@ -0,0 +1,204 @@
+/*
+* Copyright (c) 1997-1999 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 <e32svr.h>
+
+#include "resdict.h"
+#include "resentry.h"
+
+// TDictEntry
+
+TDictEntry::TDictEntry()
+ {
+ iUses = 0;
+ iRef = 0;
+ iEmbedded = 0;
+ }
+
+void TDictEntry::Close()
+ {
+ delete iEmbedded;
+ iEmbedded = NULL;
+ }
+
+
+
+TDesC8& TDictEntry::Data()
+ {
+ return iData;
+ }
+
+TInt TDictEntry::Use()
+ {
+ return ((iUses + iRef - 1) * (Data().Length()-1));
+ }
+
+
+void TDictEntry::CreateEmbeddedDict(TInt aDictIndex,CDictArray* aDict)
+ {
+ // Create list of embedded dictionary strings
+ iEmbedded = new(ELeave)CResEntry(aDict);
+ iEmbedded->AddPlainDataL((TUint8*)iData.Ptr(), iData.Length());
+ iEmbedded->MatchDictL(aDictIndex);
+ }
+
+
+// CDictArray
+
+CDictArray::CDictArray()
+:CArrayFixFlat<TDictEntry>(10)
+ {
+ }
+
+CDictArray::~CDictArray()
+ {
+ TInt count = Count();
+ for (TInt ii=0; ii<count; ii++)
+ {
+ At(ii).Close();
+ }
+ }
+
+
+TInt CDictArray::AddEntryL(TDesC8& aEntry)
+ {
+ TInt size = aEntry.Size();
+ TInt pos = 0;
+ TInt count = Count();
+ for (TInt ii=0; ii<count; ii++)
+ {
+ TInt dSize = At(ii).Data().Size();
+ if (dSize < size)
+ {
+ break;
+ }
+ else
+ {
+ if (At(ii).Data().Compare(aEntry) == 0)
+ {
+ // Already in dict
+ return ii;
+ }
+ pos++;
+ }
+ }
+ TDictEntry entry;
+ entry.iData = aEntry;
+ entry.iUses=0;
+ InsertL(pos, entry);
+ return pos;
+ }
+
+
+void CDictArray::OrderedInsertL(TDictEntry& aEntry)
+ {
+ TInt use = aEntry.Use();
+ if (use < 1)
+ return; // Don't bother to insert entries that aren't used
+
+ TInt count = Count();
+ for (TInt ii=0; ii<count; ii++)
+ {
+ TInt entryUse = At(ii).Use();
+ if (entryUse < use)
+ {
+ InsertL(ii, aEntry);
+ return;
+ }
+ }
+ AppendL(aEntry);
+ }
+
+void CDictArray::SizedInsertL(TDictEntry& aEntry)
+ {
+ TInt len = aEntry.Data().Length();
+
+ TInt count = Count();
+ for (TInt ii=0; ii<count; ii++)
+ {
+ TInt entryLen = At(ii).Data().Length();
+ if (entryLen < len)
+ {
+ InsertL(ii, aEntry);
+ return;
+ }
+ }
+ AppendL(aEntry);
+ }
+
+TInt CDictArray::DictionarySize()
+ {
+ TInt count = Count();
+ TInt size = 0;
+ for (TInt jj=0; jj<count; jj++)
+ {
+ size += At(jj).iEmbedded->Size(iDictionaryBits);
+ }
+
+ size = (size + 7) / 8;
+
+ // Add dictionary index
+ size += (count * 2);
+
+ // Add dictionary header
+
+ size += 2;
+
+ return size;
+ }
+
+TInt CDictArray::DictionarySizeWithoutIndex()
+ {
+ TInt count = Count();
+ TInt size = 0;
+ for (TInt jj=0; jj<count; jj++)
+ {
+ size += At(jj).iEmbedded->Size(iDictionaryBits);
+ }
+ size = (size + 7) / 8;
+ return size;
+ }
+
+
+
+TInt CDictArray::BitSize(TInt aIndex)
+ {
+ return At(aIndex).iEmbedded->Size(iDictionaryBits);
+ }
+
+
+void CDictArray::WriteBitStreamL(TInt aIndex, TBitWriter& aWriter)
+ {
+ RDebug::Print(_L("Dictionary Entry: %d"), aIndex);
+ At(aIndex).iEmbedded->WriteBitStreamL(aWriter,iDictionaryBits);
+ }
+
+
+
+CDictArray* CDictArray::DuplicateL()
+ {
+ CDictArray* newDict = new(ELeave)CDictArray();
+ CleanupStack::PushL(newDict);
+ TInt count = Count();
+ for (TInt ii=0; ii<count; ii++)
+ {
+ newDict->AppendL(At(ii));
+ }
+ CleanupStack::Pop(); // newDict;
+ return newDict;
+ }
+