loggingservices/eventlogger/LogServ/src/LogServResourceInterpreter.cpp
changeset 0 08ec8eefde2f
child 31 ba1c4f4a893f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/eventlogger/LogServ/src/LogServResourceInterpreter.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,246 @@
+// Copyright (c) 2002-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:
+//
+
+
+#include <bautils.h>
+#include "logservpanic.h"
+#include "LogServResourceInterpreter.h"
+
+// Constants
+const TInt KLogResourceFileGranularity = 2;
+
+// Literal constants
+_LIT(KResourceFileClient,"\\private\\101f401d\\logserv.rsc");
+_LIT(KResourceFileWrapper,"\\resource\\logeng\\logwrap.rsc");
+
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// -----> CLogServResourceInterpreter (source)
+/////////////////////////////////////////////////////////////////////////////////////////
+CLogServResourceInterpreter::CLogServResourceInterpreter(RFs& aFsSession) :	
+	iFsSession(aFsSession), iResourceFiles(KLogResourceFileGranularity),
+	iResourceStringCache(CResourceStringCacheEntry::Offset()),
+	iResourceStringCacheIter(iResourceStringCache) 
+	{
+	}
+
+CLogServResourceInterpreter::~CLogServResourceInterpreter()
+	{
+	const TInt count = iResourceFiles.Count();
+	for(TInt i=0; i<count; i++)
+		{
+		TResourceFileEntry& entry = iResourceFiles[i];
+		entry.iFile.Close();
+		}
+	iResourceFiles.Close();
+
+	// Iterate through list of cache entries deleting them in turn.	
+	CResourceStringCacheEntry* item ;
+	iResourceStringCacheIter.SetToFirst() ;
+	while ((item = iResourceStringCacheIter++) != NULL)
+      {
+        iResourceStringCache.Remove(*item);
+        delete item;
+        }
+    }
+
+void CLogServResourceInterpreter::ConstructL()
+	{
+	// Load standard resource files
+	LoadResourceFileL(KResourceFileClient, ELogServer);
+	LoadResourceFileL(KResourceFileWrapper, ELogWrap);
+	}
+
+CLogServResourceInterpreter* CLogServResourceInterpreter::NewL(RFs& aFsSession)
+	{
+	CLogServResourceInterpreter* self = new(ELeave) CLogServResourceInterpreter(aFsSession);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CLogServResourceInterpreter::CreateResourceReaderLC(TResourceReader& aReader, TInt aId, TResourceType aType)
+	{
+	HBufC8* buf = GetResourceBufferL(aId, aType) ;		
+
+	// Resource reader needs to be created with a copy of the cache buffer as otherwise
+	// our cache buffer will be deleted when the resource reader is deleted!
+	aReader.SetBuffer(buf->AllocLC());
+	}
+	
+HBufC8* CLogServResourceInterpreter::GetResourceBufferL(TInt aId, TResourceType aType)
+	{
+
+	// Attempt to find the requested resource in the cache
+	CResourceStringCacheEntry* cacheEntry = FindCachedResourceString(aId, aType) ;	
+
+	HBufC8* buf ;
+	if (!cacheEntry)
+		{
+		// Not found in cache, load from resource file and add to the
+		// linked list which forms the cache. 
+		buf = ResourceFileForType(aType).AllocReadLC(aId);
+		cacheEntry = CResourceStringCacheEntry::NewL(aId, aType, buf) ;
+		iResourceStringCache.AddLast(*cacheEntry) ;
+		
+		// buf is now the responsibility of iResourceStringCache and
+		// will be tidied up by the destructor...
+		CleanupStack::Pop(buf);
+		}
+	else
+		{
+		buf = cacheEntry->ResourceString();
+		}
+	return buf ;
+	}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void CLogServResourceInterpreter::LoadResourceFileL(const TDesC& aName, TResourceType aType)
+	{
+	LOGTEXT3("CLogServResourceInterpreter::LoadResourceFileL(%S, %d)", &aName, aType);
+
+	// Find the resource file
+    TFileName fileName;
+	fileName.Copy(RProcess().FileName());
+
+    TParse parse;
+    parse.Set(aName, &fileName, NULL);
+	fileName = parse.FullName();
+
+	// Get language of resource file
+	BaflUtils::NearestLanguageFile(iFsSession, fileName);
+
+	// Check the entry exists on this drive (e.g. if we are running the log server
+	// from RAM, then default to the ROM if no RSC on the current drive exists).
+	TEntry fsEntry;
+	if	(iFsSession.Entry(fileName, fsEntry) == KErrNotFound)
+		{
+		// Switch to ROM (we might already have been launching from the ROM,
+		// in which case this will have no effect anyway).
+		fileName[0] = 'Z';
+		}
+
+	// Open resource file
+	TResourceFileEntry entry;
+	entry.iType = aType;
+	CleanupClosePushL(entry.iFile);
+
+	LOGTEXT2("CLogServResourceInterpreter::LoadResourceFileL() - localized name is: %S", &fileName);
+	
+	entry.iFile.OpenL(iFsSession, fileName);
+	
+	LOGTEXT("CLogServResourceInterpreter::LoadResourceFileL() - resource file open");
+
+	// I'm leaving this in just in case somebody decides to try and add this code
+	// without realising the consequences...
+#ifdef __CAN_BREAK_BC__
+	//
+	// Can't use BAFL 'NAME' support in resource file, since this
+	// will break data compatibility with old software using the existing
+	// logwrap and logcli RSG header files :((
+	entry.iFile.ConfirmSignatureL();
+	__ASSERT_ALWAYS(entry.iFile.Offset() != 0, Panic(ELogNoResourceName));
+#endif
+
+	User::LeaveIfError(iResourceFiles.Append(entry));
+	CleanupStack::Pop(&entry.iFile);
+
+	LOGTEXT("CLogServResourceInterpreter::LoadResourceFileL() - end");
+	}
+
+const RResourceFile& CLogServResourceInterpreter::ResourceFileForType(TResourceType aType) const
+	{
+	const RResourceFile* ret = NULL;
+	//
+	const TInt count = iResourceFiles.Count();
+	for(TInt i=0; i<count; i++)
+		{
+		const TResourceFileEntry& entry = iResourceFiles[i];
+		if	(entry.iType == aType)
+			{
+			ret = &entry.iFile;
+			break;
+			}
+		}
+	__ASSERT_ALWAYS(ret != NULL, Panic(ELogNoResourceForId));
+	return *ret;
+	}
+
+
+CLogServResourceInterpreter::CResourceStringCacheEntry * CLogServResourceInterpreter::FindCachedResourceString(const TInt aId, TResourceType aType)
+	{
+	CLogServResourceInterpreter::CResourceStringCacheEntry* item ;
+	
+	// Iterate through linked list of cache entries looking for a 
+	// match - if no match found will drop out with a NULL pointer.
+	iResourceStringCacheIter.SetToFirst() ;
+	while ((item = iResourceStringCacheIter++) != NULL)
+		{
+		if ((item->ResourceType() == aType) && (item->ResourceId() == aId))
+			{
+			break ;
+			}
+		};
+	return item ;
+	}
+	
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// -----> CLogServResourceInterpreter::CResourceStringCacheEntry (source)
+/////////////////////////////////////////////////////////////////////////////////////////	
+CLogServResourceInterpreter::CResourceStringCacheEntry::CResourceStringCacheEntry(TInt aResourceId, CLogServResourceInterpreter::TResourceType aType, HBufC8* aResourceString) : iResourceId (aResourceId), iResourceType (aType), iResourceString(aResourceString)
+	{
+	}
+
+
+CLogServResourceInterpreter::CResourceStringCacheEntry::~CResourceStringCacheEntry()
+	{
+	delete iResourceString ;
+	}
+
+
+CLogServResourceInterpreter::CResourceStringCacheEntry* CLogServResourceInterpreter::CResourceStringCacheEntry::NewL(TInt aResourceId, CLogServResourceInterpreter::TResourceType aType, HBufC8* aResourceString)
+	{
+	return new(ELeave) CResourceStringCacheEntry(aResourceId, aType, aResourceString);
+	}
+	
+TUint CLogServResourceInterpreter::CResourceStringCacheEntry::ResourceId(void)
+	{
+	return iResourceId ;
+	}
+	
+CLogServResourceInterpreter::TResourceType CLogServResourceInterpreter::CResourceStringCacheEntry::ResourceType(void)
+	{
+	return iResourceType ;
+	}
+
+HBufC8* CLogServResourceInterpreter::CResourceStringCacheEntry::ResourceString (void)
+	{
+	return iResourceString ;
+	}
+	
+TInt CLogServResourceInterpreter::CResourceStringCacheEntry::Offset() 
+	{
+    return (_FOFF(CLogServResourceInterpreter::CResourceStringCacheEntry, iLink));	
+	}
+