diff -r 000000000000 -r 8e480a14352b messagingfw/msgtest/tools/copylogs/src/CopyLogs.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgtest/tools/copylogs/src/CopyLogs.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,209 @@ +// Copyright (c) 2000-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 +#include + +LOCAL_C TBool AskL(const TDesC& aSrcFile, const TDesC& aDstFile) + { + const TInt KMaxLineSize = 256; + + // Open connection to notify server + RNotifier notifier; + User::LeaveIfError(notifier.Connect()); + CleanupClosePushL(notifier); + + // Generate line1 + TBuf line1; + _LIT(KLine1, "Copy file: '%S'"); + line1.Format(KLine1, &aSrcFile); + + // Generate line 2 + TBuf line2; + _LIT(KLine2, "To: '%S'?"); + line2.Format(KLine2, &aDstFile); + + // Button text + _LIT(KYesButton, "Yes"); + _LIT(KNoButton, "No"); + + // Display the dialog + TInt button; + TRequestStatus status; + notifier.Notify(line1, line2, KNoButton, KYesButton, button, status); + User::WaitForRequest(status); + + CleanupStack::PopAndDestroy(); // notifier + + // Did they click yes? + return button == 1; + } + +LOCAL_C void CopyFileL(RFs& aFs, const TDesC& aSrcFile, const TDesC& aDstFile) + { + // Buffer size + const TInt KBufferSize = 1; + + // Check if want to copy the file + if (!AskL(aSrcFile, aDstFile)) + return; + + // Get source file size + TEntry entry; + User::LeaveIfError(aFs.Entry(aSrcFile, entry)); + + // Create a buffer to hold file data + HBufC8* contents = HBufC8::NewLC(entry.iSize); + + // Make sure destination directory exists + TInt error = aFs.MkDirAll(aDstFile); + if (error != KErrAlreadyExists) + User::LeaveIfError(error); + + // Create progress window + _LIT(KProgressTitle, "Copy Progress"); + CConsoleBase* console = Console::NewL(KProgressTitle, TSize(KConsFullScreen, KConsFullScreen)); + CleanupStack::PushL(console); + + // Read in the data + TInt pos = 0; + while(pos < entry.iSize) + { + TBuf8 buf; + User::LeaveIfError(aFs.ReadFileSection(aSrcFile, pos, buf, Min(KBufferSize, entry.iSize - pos))); + + contents->Des().Append(buf); + pos += KBufferSize; + + // Display Progress + if (pos % (1<<10) == 0) + console->Printf(_L("Copied %dk of %dk\n"), pos>>10, entry.iSize>>10); + } + + CleanupStack::PopAndDestroy(); // console + + // Open the file + RFile file; + User::LeaveIfError(file.Replace(aFs, aDstFile, EFileShareExclusive | EFileWrite)); + CleanupClosePushL(file); + + // Dump the data to file + User::LeaveIfError(file.Write(*contents)); + User::LeaveIfError(file.Flush()); + + CleanupStack::PopAndDestroy(2); // file, contents + } + +LOCAL_C void CopyDirL(RFs& aFs, const TDesC& aSrcDir, const TDesC& aDstDir) + { + // Generate file specification + TParse spec; + User::LeaveIfError(spec.Set(_L("*"), &aSrcDir, NULL)); + + TFindFile find(aFs); + CDir* dir; + + // Find the files + TInt error = find.FindWildByPath(spec.FullName(), NULL, dir); + if (error == KErrNone) + { + CleanupStack::PushL(dir); + + // Iterate through all the files + for(TInt i = 0; i < dir->Count(); i++) + { + if (!(*dir)[i].IsDir()) + { + // Generate source path + TParse srcParse; + User::LeaveIfError(srcParse.Set((*dir)[i].iName, &aSrcDir, NULL)); + + // Generate destination path + TParse dstParse; + User::LeaveIfError(dstParse.Set((*dir)[i].iName, &aDstDir, NULL)); + + // Copy the file + CopyFileL(aFs, srcParse.FullName(), dstParse.FullName()); + } + } + + CleanupStack::PopAndDestroy(); // dir + } + + // Did an error occur? + if (error != KErrNotFound) + User::LeaveIfError(error); + } + +LOCAL_C void CopyLogsL(RFs& aFs, const TDesC& aSrcDir, const TDesC& aDstDir) + { + // Copy any files from root folder + CopyDirL(aFs, aSrcDir, aDstDir); + + // Setup directory scan + CDirScan* scan = CDirScan::NewLC(aFs); + scan->SetScanDataL(aSrcDir, KEntryAttDir|KEntryAttMatchExclusive, ESortNone, CDirScan::EScanUpTree); + + // Iterate through all the directories + FOREVER + { + // Get next directory list + CDir* dir = NULL; + TRAPD(error, scan->NextL(dir)); + delete dir; + + if (!(error == KErrNone && dir)) + break; + + // Copy the directory + CopyDirL(aFs, scan->FullPath(), aDstDir); + }; + + CleanupStack::PopAndDestroy(); // scan + } + +LOCAL_C void DoMainL() + { + // Create scheduler + CActiveScheduler* scheduler = new(ELeave)CActiveScheduler; + CleanupStack::PushL(scheduler); + CActiveScheduler::Install(scheduler); + + // Create file session + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + _LIT(KSrcLogFolder, "c:\\logs\\"); + + // Copy the logs + CopyLogsL(fs, KSrcLogFolder(), RProcess().FileName()); + + CleanupStack::PopAndDestroy(2); // fs, scheduler + } + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + __ASSERT_ALWAYS(cleanup, User::Invariant()); + TRAPD(error, DoMainL()); + delete cleanup; + __UHEAP_MARKEND; + return(KErrNone); + } + + +