messagingfw/msgtest/tools/copylogs/src/CopyLogs.cpp
changeset 22 bde600d88860
parent 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgtest/tools/copylogs/src/CopyLogs.cpp	Fri Jun 04 10:32:16 2010 +0100
@@ -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 <f32file.h>
+#include <e32cons.h>
+
+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<KMaxLineSize> line1;
+	_LIT(KLine1, "Copy file: '%S'");
+	line1.Format(KLine1, &aSrcFile);
+
+	// Generate line 2
+	TBuf<KMaxLineSize> 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<KBufferSize> 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);
+	}
+
+
+