reszip/src/resdict.cpp
changeset 0 f58d6ec98e88
child 9 7c80ebddf816
--- /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;
+	}
+