--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwtools/preparedefaultcommsdatabase/Tools/ced/src/filedump.cpp Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,337 @@
+// Copyright (c) 2003-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
+*/
+
+#include "filedump.h"
+
+/*static*/ CFileDump* CFileDump::NewL(RFs& fsSession, TPtrC filename, TPtrC appname, TPtrC version, TInt bDebugOn, CConsoleBase* aConsole, TBool bWriteHeader)
+ {
+ CFileDump* fd = new (ELeave) CFileDump;
+ CleanupStack::PushL(fd);
+ fd->ConstructL(fsSession, filename, appname, version, bDebugOn, aConsole, bWriteHeader);
+ CleanupStack::Pop(fd);
+ return fd;
+ }
+
+CFileDump::~CFileDump()
+ {
+ file.Close();
+ bInitialised = EFalse;
+ }
+
+
+void CFileDump::ConstructL(RFs &fsSession, TPtrC filename, TPtrC appname, TPtrC version, TInt bDebugOn, CConsoleBase* aConsole, TBool bWriteHeader)
+/**
+Opens the output file
+
+@param fsSession A session with the file server
+@param filename
+@param appname
+@param version
+@param bDebugOn
+@param console
+@param bWriteHeader
+@return ETrue if successful or EFalse
+*/
+ {
+ if (oErr.Evaluate(file.Replace(fsSession, filename, EFileShareAny|EFileStream|EFileWrite)))
+ {
+ if (bWriteHeader)
+ {
+ buf.Format(_L("############################################################\r\n## AUTO-GENERATED CONFIGURATION FILE\r\n## %S\r\n## %S\r\n############################################################\r\n"),
+ &appname, &version);
+ WriteBufferToFile(buf, file);
+ }
+
+ bInitialised = ETrue;
+ }
+ bDebug = bDebugOn;
+ pConsole = aConsole;
+ }
+
+
+void CFileDump::WriteTableHeader(TPtrC table)
+/**
+Writes a table header to the internal buffer
+
+@param table A reference to a descriptor containing the name of a table
+*/
+ {
+ if (bInitialised && table.Length())
+ {
+ buf.Format(_L("\r\n############################################################\r\n## %S\r\n## \r\n[%S]\r\n"),
+ &table, &table);
+ WriteBufferToFile(buf, file);
+ }
+ }
+
+
+void CFileDump::WriteSectionHeader(TInt aCommDbId)
+/**
+Writes a section header to the internal buffer
+
+@param aCommDbId Unique Id of Communication database
+*/
+ {
+ if (bInitialised)
+ {
+ switch (aCommDbId)
+ {
+ case -1:
+ buf.Copy(_L("ADD_SECTION\r\n"));
+ break;
+ case 0:
+ buf.Copy(_L("ADD_TEMPLATE\r\n"));
+ break;
+ default:
+ buf.Format(_L("ADD_SECTION\r\n# COMMDB_ID = %d\r\n"),
+ aCommDbId);
+ break;
+ }
+ WriteBufferToFile(buf, file);
+ }
+ }
+
+
+void CFileDump::WriteFieldCount(TUint count)
+/**
+Writes a section header to the internal buffer
+
+@param count Field count
+*/
+ {
+ if (bInitialised)
+ {
+ buf.Format(_L("\tFIELD_COUNT=%d\r\n"), count);
+ WriteBufferToFile(buf, file);
+ }
+ }
+
+
+void CFileDump::WriteColumnValue(TPtrC &column, TPtrC &setting)
+/**
+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
+*/
+ {
+ if (bInitialised && column.Length() && setting.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<setting.Length();i++)
+ {
+ TUint16 x = setting[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;
+ }
+ }
+
+ setting.Set(TempValue);
+ buf.Format(_L("\t%S=%S\r\n"), &column, &TempValue);
+ WriteBufferToFile(buf, file);
+ }
+ }
+
+
+void CFileDump::WriteSectionFooter(TInt aCommDbId)
+/**
+Writes a section footer to the internal buffer
+
+@param aCommDbId Unique Id of Communication database
+*/
+ {
+ if (bInitialised)
+ {
+ if (aCommDbId == 0)
+ {
+ buf.Copy(_L("END_TEMPLATE\r\n\r\n"));
+ }
+ else
+ {
+ buf.Copy(_L("END_ADD\r\n\r\n"));
+ }
+ WriteBufferToFile(buf, file);
+ }
+ }
+
+
+void CFileDump::WriteErrorMessage(const TPtrC &message)
+/**
+Writes a message to the file
+
+@param message The error message
+*/
+ {
+ if (bInitialised && message.Length() && message.Length() < (MAX_COL_LONG_VAL_LEN - 140))
+ {
+ buf.Format(_L("############################################################\r\n## ERROR\r\n## %S\r\n############################################################\r\n"),
+ &message);
+ WriteBufferToFile(buf, file);
+ }
+ }
+
+void CFileDump::Msg(TPtrC text, ...)
+ {
+ if (text.Length() && text.Length() < MAX_COL_LONG_VAL_LEN)
+ {
+ VA_LIST list;
+ VA_START(list, text);
+
+ buf.FormatList(text, list);
+ buf.Append(_L("\r\n"));
+
+ // Only output to the console if the debug option is enabled
+ if (pConsole && bDebug)
+ pConsole->Printf(buf);
+
+ if (bInitialised)
+ {
+ // Always write to the log file
+ WriteBufferToFile(buf, file);
+ }
+
+ VA_END(list);
+ }
+ }
+
+void CFileDump::Dbg(TPtrC text, ...)
+ {
+ if (bDebug && text.Length() && text.Length() < MAX_COL_LONG_VAL_LEN)
+ {
+ VA_LIST list;
+ VA_START(list, text);
+
+ buf.FormatList(text, list);
+ buf.Append(_L("\r\n"));
+
+ // Always write to the console if available
+ if (pConsole)
+ pConsole->Printf(buf);
+
+ if (bInitialised)
+ {
+ // Always write to the log file
+ WriteBufferToFile(buf, file);
+ }
+
+ VA_END(list);
+ }
+ }
+
+void CFileDump::Error(TPtrC text, ...)
+ {
+ if (bInitialised && text.Length() && text.Length() < MAX_COL_LONG_VAL_LEN)
+ {
+ VA_LIST list;
+ VA_START(list, text);
+
+ buf.FormatList(text, list);
+ buf.Append(_L("\r\n"));
+
+ // Always write to the console if available
+ if (pConsole)
+ pConsole->Printf(buf);
+
+ if (bInitialised)
+ {
+ // Always write to the log file
+ WriteBufferToFile(buf, file);
+ }
+
+ VA_END(list);
+ }
+ }
+
+TBool CFileDump::WriteBufferToFile(TDesC16 &buffer, RFile &handle)
+ {
+ static TBuf8<1024> outputBuffer;
+ static TPtrC16 ptr;
+ static TInt consumed;
+ static TInt remainder = 0;
+
+ TBool valid = EFalse;
+
+ if (buffer.Length())
+ {
+ ptr.Set(buffer);
+ do
+ {
+ // get something to write
+ consumed = Min(outputBuffer.MaxLength(), ptr.Length());
+
+ // write it
+ outputBuffer.Copy(ptr.Left(consumed));
+ if (handle.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;
+ }