diff -r 000000000000 -r dfb7c4ff071f commsfwtools/preparedefaultcommsdatabase/Tools/ceddump/src/filedump.cpp --- /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 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 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); + } + } +