commsfwtools/preparedefaultcommsdatabase/Tools/ceddump/src/filedump.cpp
changeset 0 dfb7c4ff071f
child 25 9d7ce34704c8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwtools/preparedefaultcommsdatabase/Tools/ceddump/src/filedump.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,340 @@
+// Copyright (c) 2004-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:
+//
+
+/**
+ @file 
+ @internalTechnology
+*/
+
+#include "filedump.h"
+
+#ifndef __TOOLS2__
+_LIT(DEFAULT_SESSION_PATH, "c:\\");
+#endif
+
+/*static*/ CFileDump* CFileDump::NewL(TPtrC aFilename, TPtrC aAppname, TPtrC aVersion, TBool aDebugOn, CConsoleBase* aConsole, TBool aWriteHeader)
+	{
+	CFileDump* fdump = new (ELeave) CFileDump(aDebugOn, aConsole);
+	CleanupStack::PushL(fdump);
+	fdump->ConstructL(aFilename, aAppname, aVersion, aWriteHeader);
+	CleanupStack::Pop(fdump);
+	return fdump;
+	}
+
+CFileDump::CFileDump(TInt aDebugOn, CConsoleBase* aConsole)
+	:iDebug(aDebugOn), iConsole(aConsole)
+	{
+	}
+
+void CFileDump::ConstructL(TPtrC aFilename, TPtrC aAppname, TPtrC aVersion, TBool aWriteHeader)
+/**
+Opens the output file
+*/
+	{
+	User::LeaveIfError(iFsSession.Connect());
+	
+#ifndef __TOOLS2__
+	// Set up the session path for WINSCW / ARMv5 incase the log file name has no path.
+	iFsSession.SetSessionPath( DEFAULT_SESSION_PATH );
+#endif
+
+	User::LeaveIfError(iFile.Replace(iFsSession, aFilename, EFileShareAny|EFileStream|EFileWrite));
+	if (aWriteHeader)
+		{
+		iBuffer.Format(_L("############################################################\r\n## AUTO-GENERATED CONFIGURATION FILE\r\n## %S\r\n## %S\r\n############################################################\r\n"),
+			&aAppname, &aVersion);
+		WriteBufferToFile(iBuffer, iFile);
+		}
+	iInitialised = ETrue;
+	}
+
+CFileDump::~CFileDump()
+	{
+	iFile.Close();
+	iFsSession.Close();
+	}
+
+void CFileDump::WriteTableHeader(TPtrC aTable)
+/**
+Writes a table header to the internal buffer
+
+@param table A reference to a descriptor containing the name of a table
+*/
+	{
+	if (iInitialised && aTable.Length())
+		{
+		iBuffer.Format(_L("\r\n############################################################\r\n## %S\r\n## \r\n[%S]\r\n"),
+			&aTable, &aTable);
+		WriteBufferToFile(iBuffer, iFile);
+		}
+	}
+
+
+void CFileDump::WriteSectionHeader(TInt aCommDbId)
+/**
+Writes a section header to the internal buffer
+
+@param aCommDbId Unique Id of Communication database
+*/
+	{
+	if (iInitialised)
+		{
+		switch (aCommDbId)
+			{
+			case -1:
+				iBuffer.Copy(_L("ADD_SECTION\r\n"));
+				break;
+			case 0:
+				iBuffer.Copy(_L("ADD_TEMPLATE\r\n"));
+				break;
+			default:
+				iBuffer.Format(_L("ADD_SECTION\r\n# COMMDB_ID = %d\r\n"),
+					aCommDbId);
+				break;
+			}
+		WriteBufferToFile(iBuffer, iFile);
+		}
+	}
+
+
+void CFileDump::WriteFieldCount(TUint aCount)
+/**
+Writes a section header to the internal buffer
+
+@param count Field count
+*/
+	{
+	if (iInitialised)
+		{
+		iBuffer.Format(_L("\tFIELD_COUNT=%d\r\n"), aCount);
+		WriteBufferToFile(iBuffer, iFile);
+		}
+	}
+
+
+TBool CFileDump::WriteColumnValue(TPtrC &aColumn, TPtrC &aSetting)
+/**
+Writes a column value to the internal buffer
+
+@param column A reference to a descriptor containing the name of a column
+@param setting The setting
+@return ETrue if value was written
+*/
+	{
+	TBool write=EFalse;
+	if (iInitialised && aColumn.Length() && aSetting.Length())
+		{
+		// Theoretical worst case is longest field is populated with non-ASCII
+		static TBuf<KMaxExpandedFieldLen> TempValue;	// static to keep it off the stack
+		TempValue.SetLength(0);
+		
+		/* replace any special chars with a portable representation that's re-importable
+		* Special characters are escaped in the 'C' language fashion with backslash.
+		* Specials are: 
+		*	\t = TAB 
+		*	\n = LF 
+		*	\[ = [		- Need for escaping is to prevent INI file processing presuming
+		*	\] = ]		- them to be start of section block
+		*	\\ = \
+		*	\xHHHH 		- Hex value for any other character falling outside the normal
+		*				  ASCII range of 32 - 126. This is because we're most likely 
+		*				  writing to an ASCII file, so absolutely can't trust that
+		*				  UniCode will get preserved on a round-trip through an editor
+		*/
+		
+		TInt i = 0;
+		for (i=0;i<aSetting.Length();i++)
+			{
+			TUint16 x = aSetting[i];
+			switch(x)
+				{
+				case '\n':
+					TempValue.Append(_L("\\n"));
+					break;
+				case '\t':
+					TempValue.Append(_L("\\t"));
+					break;
+				case '[':
+					TempValue.Append(_L("\\["));
+					break;
+				case ']':
+					TempValue.Append(_L("\\]"));
+					break;
+				case '\\':
+					TempValue.Append(_L("\\\\"));
+					break;
+				default:
+					if(x < 32 || x > 126)
+						{
+						TempValue.AppendFormat(_L("\\x%04X"), x);
+						}
+					else
+						{
+						TempValue.Append(x);
+						}
+					break;
+				}
+			}
+		
+		aSetting.Set(TempValue);
+		iBuffer.Format(_L("\t%S=%S\r\n"), &aColumn, &TempValue);
+		WriteBufferToFile(iBuffer, iFile);
+		write=ETrue;;
+		}
+	return write;
+	}
+
+
+void CFileDump::WriteSectionFooter(TInt aCommDbId)
+/**
+Writes a section footer to the internal buffer
+
+@param aCommDbId Unique Id of Communication database
+*/
+	{
+	if (iInitialised)
+		{
+		if (aCommDbId == 0)
+			{
+			iBuffer.Copy(_L("END_TEMPLATE\r\n\r\n"));
+			}
+		else
+			{
+			iBuffer.Copy(_L("END_ADD\r\n\r\n"));
+			}
+		WriteBufferToFile(iBuffer, iFile);
+		}
+	}
+
+
+void CFileDump::WriteErrorMessage(const TPtrC &aMessage)
+/**
+Writes a message to the file
+
+@param message The error message 
+*/
+	{
+	if (iInitialised && aMessage.Length() && aMessage.Length() < (MAX_COL_LONG_VAL_LEN - 140))
+		{
+		iBuffer.Format(_L("############################################################\r\n## ERROR\r\n## %S\r\n############################################################\r\n"),
+			&aMessage);
+		WriteBufferToFile(iBuffer, iFile);
+		}
+	}
+
+void CFileDump::Msg(TPtrC aText, ...)
+	{
+	if (iInitialised && aText.Length() && aText.Length() < MAX_COL_LONG_VAL_LEN)
+		{
+		VA_LIST list;
+		VA_START(list, aText);
+		
+		iBuffer.FormatList(aText, list);
+		iBuffer.Append(_L("\r\n"));
+		
+		if (iConsole)
+			{
+			iConsole->Printf(iBuffer);
+			}
+		
+		WriteBufferToFile(iBuffer, iFile);
+		
+		VA_END(list);
+		}
+	}
+
+void CFileDump::Dbg(TPtrC aText, ...)
+	{
+	if (iInitialised && iDebug && aText.Length() && aText.Length() < MAX_COL_LONG_VAL_LEN)
+		{
+		VA_LIST list;
+		VA_START(list, aText);
+		
+		iBuffer.FormatList(aText, list);
+		iBuffer.Append(_L("\r\n"));
+		
+		if (iConsole)
+		    {
+			iConsole->Printf(iBuffer);
+			}
+		
+		WriteBufferToFile(iBuffer, iFile);
+		
+		VA_END(list);
+		}
+	}
+
+TBool CFileDump::WriteBufferToFile(TDesC16 &aBuffer, RFile &aHandle)
+	{
+	// keep buffer small to reduce memory usage
+	static TBuf8<5> outputBuffer;
+	static TPtrC16 ptr;
+	static TInt consumed;
+	static TInt remainder = 0;
+	
+	TBool valid = EFalse;
+	
+	if (aBuffer.Length())
+		{
+		ptr.Set(aBuffer);
+		do
+			{
+			// get something to write
+			consumed = Min(outputBuffer.MaxLength(), ptr.Length());
+			
+			// write it
+			outputBuffer.Copy(ptr.Left(consumed));
+			if (aHandle.Write(outputBuffer) != KErrNone)
+			    {
+				return EFalse;
+				}
+			
+			// get the next chunk
+			remainder = ptr.Length() - consumed;
+			if (remainder > 0)
+				{
+				ptr.Set(ptr.Right(remainder));
+				}
+			
+			} 
+		while (remainder > 0);
+			
+		valid = ETrue;
+		}
+	
+	return valid;
+	}
+
+/**
+Writes attribute section header to the output file
+*/
+void CFileDump::WriteAttributeSectionHeader()
+	{
+	iBuffer.Copy(_L("ADD_ATTRIBUTES\r\n"));
+	WriteBufferToFile(iBuffer, iFile);
+	}
+
+/**
+Writes attributes to the output file
+*/
+void CFileDump::WriteAttributes(TPtrC &aColumn)
+	{
+	if (iInitialised && aColumn.Length())
+		{
+		iBuffer.Format(_L("\t%S\r\n"), &aColumn);
+		WriteBufferToFile(iBuffer, iFile);
+		}	
+	}
+