--- /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);
+ }
+ }
+