dbgsrv/coredumpserver/ui/text/textcrashconfig.cpp
changeset 0 c6b0df440bee
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dbgsrv/coredumpserver/ui/text/textcrashconfig.cpp	Tue Mar 02 10:33:16 2010 +0530
@@ -0,0 +1,655 @@
+// Copyright (c) 2006-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:
+// $Change: $
+//
+
+#include <e32cons.h>
+#include <e32debug.h>
+#include <e32test.h>
+
+#include <plugindata.h>
+#include <threaddata.h>
+#include <processdata.h>
+#include <executabledata.h>
+
+#include <coredumpinterface.h>
+
+#include <optionconfig.h>
+#include <debuglogging.h>
+
+LOCAL_C void doTestL();   // the test code
+
+GLDEF_C TInt E32Main() // main function called by E32
+    {
+	__UHEAP_MARK;
+	// Because this is not an EIKON program we have to create our
+	// own clean-up stack.
+	CTrapCleanup* cleanup=CTrapCleanup::New();
+
+	__UHEAP_MARK;
+
+	// Trap any leaves that occur during test code
+	TRAPD(error,doTestL());
+	RDebug::Printf( "TRAPD(error,doTestL())=%d;\n", error);
+	// Handle any leaves that occured during the test code.
+	// Since this is a test program, we don't need any special error handling to
+	// handle leaves - just panic the test program.
+	
+	_LIT(KTxtTrainingTest,"Crash Configuration Tester");	
+
+	RDebug::Printf( "__ASSERT_ALWAYS(!error,User::Panic(KTxtTrainingTest,error));\n");
+	__ASSERT_ALWAYS(!error,User::Panic(KTxtTrainingTest,error));
+
+
+	RDebug::Printf( "__UHEAP_MARKEND; before deleting cleanup stack\n");
+	__UHEAP_MARKEND; // Check the test program doesn't leak memory.
+
+	RDebug::Printf( "delete cleanup;\n");
+	delete cleanup;
+
+	RDebug::Printf( "__UHEAP_MARKEND; before returning\n");
+	__UHEAP_MARKEND; // Check the test program doesn't leak memory.
+
+	RDebug::Printf( "__UHEAP_CHECK(0);\n");
+    __UHEAP_CHECK(0);
+
+	RDebug::Printf( "E32Main returning KErrNone; \n");
+	return KErrNone;
+	}
+
+
+
+_LIT(KCrashAppFileName,"z:\\Sys\\Bin\\crashapP.exe");
+
+#define KListGranularity (20)
+
+LOCAL_C void doTestL()
+	{
+
+	// Create an RTest object for performing the tests.
+	_LIT(KTestTitle, "Crash Config - Text UI");
+	RTest test(KTestTitle);
+	CleanupClosePushL(test);
+		
+	_LIT(KFormatString1,"Connecting to Server (correct result = KErrNone)");
+	test.Start( KFormatString1 );
+
+	RDebug::Printf( "__UHEAP_MARK; //before CCrashConfig::NewL( );\n");
+	__UHEAP_MARK; // crashConfig
+
+    RCoreDumpSession iSess;
+
+	RDebug::Printf( "__UHEAP_MARK; //after CCrashConfig::NewL( );\n");
+	__UHEAP_MARK; // crashConfig
+
+	// Now connect to the server.
+	test( iSess.Connect() == KErrNone );
+    RDebug::Printf("connected\n");
+
+
+	_LIT(KMainMenu, "\n Menu: \n  0: Save/Load Config\t 1:List Plugins\t2:Load Plugin\n a: List Plugin Infos\tb: Unload Plugin\tc:Bind Plugins\n 3:List Threads\t4:List Procs\t5:List Exes\n 6:Observe Proc by Name\t 7 : Leave Proc by Name\t 8 : Configure System\t 9 : Create Crashing Proc\n");
+	_LIT(KConfigMenu,     "\n            0: Save Config\t 1: Load Config\n");
+	_LIT(KProcObserveMenu, "\n            Type Process ID to observe:\n");
+	
+	TChar c;
+	TBool finish = EFalse;
+	TInt ret = KErrNone;
+
+	_LIT( KSaveConfigMsg,		"Save Current Configuration to File" );
+	_LIT( KLoadConfigMsg,		"Load Configuration From File" );
+
+
+	_LIT( KGetThreadMsg,		"Request Thread List" );
+	_LIT( KGetProcMsg,			"Request Proc List" );
+	_LIT( KGetExeMsg,			"Request Executable List" );
+	
+	_LIT( KObserveProcName,	    "Observe a Process by Name" );
+	_LIT( KLeaveProcName,	    "Leave a Process by Name" );
+
+
+	RPluginList pluginsList;
+	pluginsList.Reserve(KListGranularity);
+
+	RThreadPointerList threadPtrList;
+	threadPtrList.Reserve(KListGranularity);
+
+	RProcessPointerList procPtrList;
+	procPtrList.Reserve(KListGranularity);	
+
+	RExecutablePointerList executablePtrList;
+	executablePtrList.Reserve(KListGranularity);	
+
+    RPluginPointerList formatterPtrList;
+    formatterPtrList.Reserve(KListGranularity);
+
+    RPluginPointerList writerPtrList;
+    writerPtrList.Reserve(KListGranularity);
+
+	do
+		{
+		test.Printf(KMainMenu);
+		c=test.Getch();
+
+		switch(c)
+			{
+
+			case('0'):
+				{
+				test.Printf(KConfigMenu);
+				c=test.Getch();
+				if( c == '0' )
+					{
+					test.Next(KSaveConfigMsg);
+					RDebug::Printf( "doTestL() -> SaveConfig(KNullDesc==Default )\n");
+					TRAP(ret, iSess.SaveConfigL( KNullDesC ));
+					test( KErrNone == ret );
+					RDebug::Printf( "doTestL : <- SaveConfig() returned 0x%X\n", ret );
+					}
+				else
+					{
+					test.Next(KLoadConfigMsg);
+					RDebug::Printf( "doTestL() -> LoadConfig(KNullDesc==Dafault)\n");
+					TRAP(ret, iSess.LoadConfigL( KNullDesC ));
+					test( KErrNone == ret );
+					RDebug::Printf( "doTestL : <- LoadConfig() returned 0x%X\n", ret );
+					}
+				break;
+				}
+                
+			case('1'):
+				{
+	            _LIT( KGetPluginsMsg,		"Request Plugin List" );
+				test.Next(KGetPluginsMsg);
+				pluginsList.Reset();
+
+				RDebug::Printf( "doTestL() -> GetPlugins()\n");
+
+				TRAP(ret, iSess.GetPluginListL( pluginsList ));
+				test( KErrNone == ret );
+
+				RDebug::Printf( "doTestL : <- GetPlugins() returned 0x%X, pluginList.Count()=%d, with following names:\n", 
+					ret, pluginsList.Count() );
+				
+				for(TUint i = 0; i < pluginsList.Count(); i++ )
+					{
+
+					test.Printf(_L("   Plugin List[%d].iName=%S, UID=0x%X, type=%d, loaded=%d\n"), 
+						i, 
+						&(pluginsList[i].iName),
+						pluginsList[i].iUid,
+						pluginsList[i].iType, 
+						pluginsList[i].iLoaded );
+					}
+
+				break;
+
+				}
+
+			case('a'):
+				{
+	            _LIT( KGetPluginInfosMsg,		"Request Plugin Info List" );
+				test.Next(KGetPluginInfosMsg);
+
+				formatterPtrList.ResetAndDestroy();
+				RDebug::Print( _L("doTestL() -> GetFormattersL()\n"));
+				TRAP( ret, iSess.GetFormattersL( formatterPtrList ));
+				test( KErrNone == ret );
+				RDebug::Print( _L(" doTestL() : <- GetFormatters() returned 0x%X, formatterPtrList.Count()=%d, with following names:\n"), 
+					ret, formatterPtrList.Count() );
+
+				writerPtrList.ResetAndDestroy();
+				RDebug::Print( _L("doTestL() -> GetWritersL()\n"));
+				TRAP( ret, iSess.GetWritersL( writerPtrList ));
+				test( KErrNone == ret );
+				RDebug::Print( _L(" doTestL() : <- GetWriters() returned 0x%X, writerPtrList.Count()=%d, with following names:\n"), 
+					ret, writerPtrList.Count() );
+
+				for(TUint i = 0; i < formatterPtrList.Count(); i++ )
+					{
+
+					test.Printf(_L("   Formatter List[%d].iName=%S, UID=0x%X, version=%d, type=%d\n"), 
+						i, 
+						&(formatterPtrList[i]->Name()),
+						formatterPtrList[i]->Uid(),
+						formatterPtrList[i]->Version(), 
+						formatterPtrList[i]->Type() );
+					}
+
+				for(TUint i = 0; i < writerPtrList.Count(); i++ )
+					{
+
+					test.Printf(_L("   Writter List[%d].iName=%S, UID=0x%X, version=%d, type=%d\n"), 
+						i, 
+						&(writerPtrList[i]->Name()),
+						writerPtrList[i]->Uid(),
+						writerPtrList[i]->Version(), 
+						writerPtrList[i]->Type() );
+					}
+
+				break;
+
+				}
+
+			case('2'):
+				{
+	            _LIT( KLoadPluginMsg, "Load Plugin" );
+				test.Next(KLoadPluginMsg);
+
+	            _LIT(KPluginLoadMenu, "\n\t\t\tType Index of the plugin to load:\n");
+				test.Printf(KPluginLoadMenu);
+				c=test.Getch();
+				TInt pluginIndex = c.GetNumericValue();
+
+				RDebug::Print(_L("doTestL() ->  LoadPlugin[%d].iName=%S, UID=0x%X\n"),
+							  pluginIndex, &(pluginsList[pluginIndex].iName), pluginsList[pluginIndex].iUid ) ;
+
+                TPluginRequest req;
+                req.iUid = pluginsList[pluginIndex].iUid;
+                req.iPluginType = pluginsList[pluginIndex].iType;
+                req.iLoad = ETrue;
+
+                TRAP(ret, iSess.PluginRequestL( req ));
+                test(ret == KErrNone);
+                RDebug::Printf( " Plugin with UID = 0x%X has been loaded\n", req.iUid );
+                test.Printf( _L("   Plugin with UID = 0x%X has been loaded\n"), req.iUid ); 
+
+				break;
+
+				}
+            case('b'):
+                {
+	            _LIT( KLoadPluginMsg, "Unload Plugin" );
+				test.Next(KLoadPluginMsg);
+
+                TPluginRequest req;
+                req.iLoad = EFalse;
+
+	            _LIT(KPluginUnloadoadMenu, "\n\t\t\tType Index of the plugin to unload:\n");
+				test.Printf(KPluginUnloadoadMenu);
+				c=test.Getch();
+				TInt pluginIndex = c.GetNumericValue();
+
+	            _LIT(KPluginTypeUnloadMenu, "\n\t\t\tType type of the plugin to unload:[f/w]\n");
+				test.Printf(KPluginTypeUnloadMenu);
+				c=test.Getch();
+
+                if(c == 'f')
+                {
+				    RDebug::Print(_L("doTestL() ->  UnloadPlugin[%d].iName=%S, UID=0x%X\n"),
+							      pluginIndex, &(formatterPtrList[pluginIndex]->Name()), formatterPtrList[pluginIndex]->Uid() ) ;
+
+                    req.iPluginType = TPluginRequest::EFormatter;
+                    req.iUid = TUid::Uid(formatterPtrList[pluginIndex]->Uid());
+                }
+                else if(c == 'w')
+                {
+				    RDebug::Print(_L("doTestL() ->  UnloadPlugin[%d].iName=%S, UID=0x%X\n"),
+							      pluginIndex, &(writerPtrList[pluginIndex]->Name()), writerPtrList[pluginIndex]->Uid() ) ;
+                    req.iPluginType = TPluginRequest::EWriter;
+                    req.iUid = TUid::Uid(writerPtrList[pluginIndex]->Uid());
+                }
+                else
+                {
+                    test.Printf(_L("Unknown plugin type!\n"));
+                    break;
+                }
+
+                TRAP(ret, iSess.PluginRequestL( req ));
+                test(ret == KErrNone);
+                RDebug::Printf( " Plugin with UID = 0x%X has been unloaded\n", req.iUid );
+                test.Printf( _L("   Plugin with UID = 0x%X has been unloaded\n"), req.iUid ); 
+                break;
+                }
+
+            case('c'):
+                {
+	            _LIT( KBindPluginMsg, "Bind Plugins" );
+				test.Next(KBindPluginMsg);
+
+	            _LIT(KFormatterBindMenu, "\n\t\t\tType Index of the formatter plugin to bind:\n");
+				test.Printf(KFormatterBindMenu);
+				c=test.Getch();
+				TInt formatterIndex = c.GetNumericValue();
+
+	            _LIT(KWriterBindMenu, "\n\t\t\tType Index of the writer plugin to bind:\n");
+				test.Printf(KWriterBindMenu);
+				c=test.Getch();
+				TInt writerIndex = c.GetNumericValue();
+
+                TPluginRequest req;
+                req.iIndex = formatterIndex;
+                req.iPair = writerIndex;
+                req.iUid = TUid::Uid(0); 
+
+                TRAP(ret, iSess.PluginRequestL( req ));
+                test(ret == KErrNone);
+                RDebug::Printf( " Plugin %d and %d have been bound\n", req.iIndex, req.iPair );
+                test.Printf( _L(" Plugin %d and %d have been bound\n"), req.iIndex, req.iPair );
+                break;
+                }
+
+			case('3'):
+				{
+
+				test.Next(KGetThreadMsg);
+				threadPtrList.ResetAndDestroy();
+
+				RDebug::Print( _L("doTestL() -> GetThreads()\n"));
+
+				TRAP( ret, iSess.GetThreadsL( threadPtrList ));
+				test( KErrNone == ret );
+
+				RDebug::Print( _L(" doTestL() : <- GetThreads() returned 0x%X, threadPtrList.Count()=%d, with following names:\n"), 
+					ret, threadPtrList.Count() );
+
+				RBuf rPrintBuf;
+
+				TUint64 pId;
+				TUint32 pIdLow;
+				TUint32 pIdHigh;
+
+				for(TUint i = 0; i < threadPtrList.Count(); i++ )
+					{
+					pId = threadPtrList[i]->ProcessId();
+					pIdLow = I64LOW( pId );
+					pIdHigh = I64HIGH( pId );
+
+					test.Printf(_L("   threadList[%d].iName=%S, id=0x%X"), 
+						i, &(threadPtrList[i]->Name()), threadPtrList[i]->Id() );
+					test.Printf(_L("  owner=0x%X%X\n"), pIdHigh, pIdLow );
+                    }
+				}
+
+				break;
+
+			case('4'):
+				{
+
+				test.Next( KGetProcMsg );
+				procPtrList.ResetAndDestroy();
+
+				RDebug::Print( _L("doTestL() -> GetProcess()\n"));
+
+                TRAP( ret, iSess.GetProcessesL( procPtrList ));
+				test( KErrNone == ret );
+
+				RDebug::Printf( "doTestL() <- GetProcesses() returned 0x%X, procPtrList.Count()=%d, with following names:\n", 
+					ret, procPtrList.Count() );
+				
+				for(TUint i = 0; i < procPtrList.Count(); i++ )
+					{
+					test.Printf(_L("   procPtrList[%d].iName=%S, id=%d \n"), 
+						i, 
+						&(procPtrList[i]->Name()),
+						procPtrList[i]->Id() );
+					}
+
+				}
+
+				break;
+
+			case('5'):
+				{
+
+				test.Next( KGetExeMsg );
+
+				executablePtrList.ResetAndDestroy();
+
+				RDebug::Print( _L("doTestL() -> GetExecutable()\n"));
+
+                TRAP( ret, iSess.GetExecutablesL( executablePtrList ));
+				test( KErrNone == ret );
+
+				RDebug::Printf( "doTestL() <- GetExecutable() returned 0x%X, executablePtrList.Count()=%d, with following names:\n", 
+					ret, executablePtrList.Count() );
+				
+				for(TUint i = 0; i < executablePtrList.Count(); i++ )
+					{
+					test.Printf(_L("   executablePtrList[%d].iName=%S, active=%d, passive=%d, observed=%d\n"), 
+						i, 
+						&(executablePtrList[i]->Name()),
+						executablePtrList[i]->ActivelyDebugged(),
+						executablePtrList[i]->PassivelyDebugged(),
+						executablePtrList[i]->Observed() );
+					}		
+				}
+
+				break;
+
+
+			case('6'):
+				{
+
+				test.Next( KObserveProcName );
+				c=test.Getch();
+				TInt procId1 = c.GetNumericValue();
+				c=test.Getch();
+				TInt procId2 = c.GetNumericValue();
+				c=test.Getch();
+				TInt procId3 = c.GetNumericValue();
+
+				TInt procId = procId1 * 100 + 10 * procId2 + procId3;
+
+				TBool found = EFalse;
+				TUint i;
+				for( i = 0; i < procPtrList.Count(); i++ )
+					{
+
+					if( procId == procPtrList[i]->Id() )
+						{
+							found = ETrue;
+							break;
+						}
+					}
+
+				if( found )
+					{
+					RDebug::Print( _L("doTestL() : -> Observe( proc name: %S )\n"), &procPtrList[i]->Name() );
+
+                    TRAP(ret, iSess.ObservationRequestL( procPtrList[i]->Name(), procPtrList[i]->Name(), ETrue) );
+
+					RDebug::Printf( "doTestL() <- Observe() returned %d\n", ret );
+
+					test( KErrNone == ret );
+
+					}
+			
+				}
+
+				break;
+
+			case('7'):
+				{
+
+				test.Next( KLeaveProcName );
+
+				test.Printf( KProcObserveMenu );
+				c=test.Getch();
+				TInt procId1 = c.GetNumericValue();
+				c=test.Getch();
+				TInt procId2 = c.GetNumericValue();
+				c=test.Getch();
+				TInt procId3 = c.GetNumericValue();
+
+				TInt procId = procId1 * 100 + 10 * procId2 + procId3;
+
+				TBool found = EFalse;
+				TUint i;
+				for( i = 0; i < procPtrList.Count(); i++ )
+					{
+
+					if( procId == procPtrList[i]->Id() )
+						{
+							found = ETrue;
+							break;
+						}
+					}
+
+				if( found )
+					{
+					RDebug::Print( _L("doTestL() : -> Leave( proc name: %S )\n"), &procPtrList[i]->Name() );
+
+                    TRAP(ret, iSess.ObservationRequestL( procPtrList[i]->Name(), procPtrList[i]->Name(), EFalse) );
+
+					RDebug::Printf( "doTestL() <- Leave() returned %d\n", ret );
+
+					test( KErrNone == ret );
+
+					}
+			
+				}
+
+				break;
+                
+
+			case('8'):
+				{
+	            _LIT( KConfigureSystem,     "Configure the System Parameters" );
+				test.Next( KConfigureSystem );
+
+				TInt numConfigParams = -1;
+			
+				RPointerArray<COptionConfig> configParams;
+				COptionConfig * config = NULL;
+
+				numConfigParams = iSess.GetNumberConfigParametersL();
+				RDebug::Printf( "There are %d system params\n", numConfigParams );
+
+                for(TInt i = 0 ; i < numConfigParams; i++)
+                {
+				    config = iSess.GetConfigParameterL(i);
+                    configParams.AppendL(config);
+                }
+
+                for(TInt i = 0 ; i < numConfigParams; i++)
+                {
+                    config = configParams[i];
+                    RDebug::Printf("param[%d] index=%d, instance=%d, source=%d, type=%d, value=%d values=%S",
+                                   i, config->Index(), config->Instance(), config->Source(), config->Type(),
+                                   config->Value(), &config->ValueAsDesc() );
+                }
+
+                configParams.ResetAndDestroy();
+
+	            _LIT(KFormatterConfigMenu, "\n\t\t\tType Index of the parameter to change:\n");
+				test.Printf(KFormatterConfigMenu);
+				c=test.Getch();
+				TInt paramIndex = c.GetNumericValue();
+
+				config = iSess.GetConfigParameterL( paramIndex );
+				if(config)
+                {
+                    const TDesC & lastPrompt = config->Prompt();
+                    const TDesC & lastOpts = config->Options();
+
+                    RBuf printPromptBuf;
+                    printPromptBuf.Create( lastPrompt , lastPrompt.Length()+1 );
+                    //printPromptBuf.SetMax();
+                    char* clPrompt = (char*) printPromptBuf.Collapse().PtrZ();
+                    RDebug::Printf("  lastPrompt=%s, length=%d\n", clPrompt, printPromptBuf.Length() );
+                    printPromptBuf.Close();
+
+                    RBuf printOptsBuf;
+                    printOptsBuf.Create( lastOpts , lastOpts.Length()+1 );
+                    //printPromptBuf.SetMax();
+                    char* clOpts = (char*) printOptsBuf.Collapse().PtrZ();
+                    RDebug::Printf("  lastOpts=%s, length=%d\n", clOpts , printOptsBuf.Length() );
+                    printOptsBuf.Close();
+
+                    RDebug::Printf("  Enter param value:\n" );
+                    c=test.Getch();
+                    TInt paramValue = c.GetNumericValue();
+                    LOG_MSG3( "  ->SetConfigParameterL( paramIndex=%d, value=%d )\n", paramIndex, paramValue );
+                    config->ValueL( KNullDesC );//To let us change the value as an int
+                    config->Value( paramValue );
+                    TRAP(ret, iSess.SetConfigParameterL(*config) );
+                    delete config;
+				    config = iSess.GetConfigParameterL( paramIndex );
+                    if(config)
+                    {
+                        RDebug::Printf( "param[%d] index=%d, instance=%d, type=%d, source=%d, value=%d values=%S",
+                                config->Index(), config->Instance(), config->Type(), config->Source(),
+                                config->Value(), &config->ValueAsDesc() );
+                    }
+                    test(KErrNone == ret);
+                }
+				break;
+				}
+
+
+			case('9'):
+				{
+
+				// Create crashing app
+				RProcess iCrashProcess;
+				RDebug::Printf( "Creating crashing application\n" );
+				TInt err = iCrashProcess.Create( KCrashAppFileName, KNullDesC );
+				test( err == KErrNone );
+
+				User::After( 1000000 );
+				iCrashProcess.Resume();
+				//
+				
+				break;
+				}
+
+			case('q'):
+				{
+				iSess.Disconnect();
+				finish = ETrue;
+				break;
+				}
+
+			default:
+				{
+				break;
+				}
+
+			}// switch
+
+		}
+	while( finish == EFalse );
+
+	RDebug::Printf( "pluginsList.Close();\n");
+	pluginsList.Close();
+
+	RDebug::Printf( "threadPtrList.ResetAndDestroy();\n");
+	threadPtrList.ResetAndDestroy();
+
+	RDebug::Printf( "procPtrList.ResetAndDestroy();\n");
+	procPtrList.ResetAndDestroy();
+
+	RDebug::Printf( "executablePtrList.ResetAndDestroy();\n");
+	executablePtrList.ResetAndDestroy();
+
+
+	RDebug::Printf( "formatterPtrList.ResetAndDestroy();\n");
+	formatterPtrList.ResetAndDestroy();
+
+	RDebug::Printf( "writerPtrList.ResetAndDestroy();\n");
+	writerPtrList.ResetAndDestroy();
+
+	__UHEAP_MARKEND; 
+	__UHEAP_MARKEND; 
+
+	RDebug::Printf( "CleanupStack::Pop(); // test\n");
+	CleanupStack::Pop(); // test
+	RDebug::Printf( "test.End();\n");
+	test.End();
+	_LIT(KPressAnyKey, "\nPress any key\n");
+	test.Printf(KPressAnyKey);
+	RDebug::Printf( "test.Getch();\n");
+	test.Getch();
+	test.Close();
+	}