perfsrv/piprofiler/engine/src/ProfilerEngine.cpp
author hgs
Tue, 26 Oct 2010 16:20:32 +0300
changeset 62 1c2bb2fc7c87
parent 51 98307c651589
permissions -rw-r--r--
201043
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include <e32cons.h>
hgs
parents:
diff changeset
    20
#include <e32base.h>
hgs
parents:
diff changeset
    21
#include <f32file.h>
hgs
parents:
diff changeset
    22
#include <c32comm.h>
hgs
parents:
diff changeset
    23
#include <s32file.h>
hgs
parents:
diff changeset
    24
#include <pathinfo.h>
hgs
parents:
diff changeset
    25
#include <s32mem.h>
hgs
parents:
diff changeset
    26
#include <bautils.h>
hgs
parents:
diff changeset
    27
#include <sysutil.h>
hgs
parents:
diff changeset
    28
#include <piprofiler/ProfilerConfig.h>
hgs
parents:
diff changeset
    29
#include "ProfilerEngine.h"
hgs
parents:
diff changeset
    30
#include <piprofiler/ProfilerTraces.h>
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// properties
hgs
parents:
diff changeset
    33
const TUid KEngineStatusPropertyCat={0x2001E5AD};
hgs
parents:
diff changeset
    34
enum TEnginePropertyKeys
hgs
parents:
diff changeset
    35
	{
hgs
parents:
diff changeset
    36
	EProfilerEngineStatus = 8,
hgs
parents:
diff changeset
    37
	EProfilerErrorStatus
hgs
parents:
diff changeset
    38
	};
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
static _LIT_SECURITY_POLICY_PASS( KAllowAllPolicy );
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
// CONSTANTS 
hgs
parents:
diff changeset
    43
const TInt KStreamBufferSize = 32768;
hgs
parents:
diff changeset
    44
const TInt KSavedLineCount = 64;
hgs
parents:
diff changeset
    45
const TInt KFileNameBufSize = 128;
hgs
parents:
diff changeset
    46
// Use this UID if plugin belongs to DebOutWriterPlugin:
hgs
parents:
diff changeset
    47
const TUid KDebOutWriterPluginUid = { 0x2001E5BA };
hgs
parents:
diff changeset
    48
// Use this UID if plugin belongs to MmcOutWriterPlugin:
hgs
parents:
diff changeset
    49
const TUid KDiskWriterPluginUid = { 0x2001E5BB };
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
// LITERALS
hgs
parents:
diff changeset
    52
_LIT8(KGenericTraceOutput, "output_type");
hgs
parents:
diff changeset
    53
_LIT8(KGenericTraceFilePrefix, "file_prefix");
hgs
parents:
diff changeset
    54
_LIT8(KGenericTraceFileSaveDrive, "save_file_location");
hgs
parents:
diff changeset
    55
_LIT8(KGenericTimedProfilingPeriod, "profiling_period");
hgs
parents:
diff changeset
    56
_LIT8(KEquals, "=");
hgs
parents:
diff changeset
    57
_LIT8(KNewLineSeparator, "\n");
hgs
parents:
diff changeset
    58
_LIT8(KProfilerVersionTag, "version");
hgs
parents:
diff changeset
    59
_LIT8(KEndMark, "[end]");
hgs
parents:
diff changeset
    60
_LIT8(KOutputToDebugOutput, "debug_output");
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
/** 
hgs
parents:
diff changeset
    63
 * 
hgs
parents:
diff changeset
    64
 * The controller class used to provide the Profiler functions. 
hgs
parents:
diff changeset
    65
 * This runs as a server in the engine thread
hgs
parents:
diff changeset
    66
 * 
hgs
parents:
diff changeset
    67
 */
hgs
parents:
diff changeset
    68
class CPServer : public CServer2, public MProfilerController
hgs
parents:
diff changeset
    69
    {
hgs
parents:
diff changeset
    70
public:
hgs
parents:
diff changeset
    71
    static MProfilerController*		NewL(TInt aPriority, MProfilerEngine& aEngine);
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
private:
hgs
parents:
diff changeset
    74
                        CPServer(TInt aPriority, MProfilerEngine& aEngine);
hgs
parents:
diff changeset
    75
    void				Release();
hgs
parents:
diff changeset
    76
    CSession2*			NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const;
hgs
parents:
diff changeset
    77
    
hgs
parents:
diff changeset
    78
public:
hgs
parents:
diff changeset
    79
    static TInt         iClientCount;
hgs
parents:
diff changeset
    80
    };
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
TInt CPServer::iClientCount = 0;
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
// The session class used by the server controller
hgs
parents:
diff changeset
    85
class CPSession : public CSession2
hgs
parents:
diff changeset
    86
    {
hgs
parents:
diff changeset
    87
private:
hgs
parents:
diff changeset
    88
    inline const CPServer&	Server() const;
hgs
parents:
diff changeset
    89
    void					ServiceL(const RMessage2& aMessage);
hgs
parents:
diff changeset
    90
    };
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
/*
hgs
parents:
diff changeset
    93
 *
hgs
parents:
diff changeset
    94
 *	CProfiler class implementation
hgs
parents:
diff changeset
    95
 *
hgs
parents:
diff changeset
    96
 */
hgs
parents:
diff changeset
    97
// --------------------------------------------------------------------------------------------
62
hgs
parents: 51
diff changeset
    98
CProfiler* CProfiler::NewLC(const TDesC& aSettingsFile, TBool aBootMode)
51
hgs
parents:
diff changeset
    99
    {
62
hgs
parents: 51
diff changeset
   100
	CProfiler* self = new(ELeave) CProfiler(aSettingsFile ,aBootMode);
51
hgs
parents:
diff changeset
   101
	CleanupStack::PushL(self);
hgs
parents:
diff changeset
   102
	self->ConstructL();
62
hgs
parents: 51
diff changeset
   103
	
hgs
parents: 51
diff changeset
   104
	LOGTEXT(_L("CProfiler::NewLC - done"));
51
hgs
parents:
diff changeset
   105
	return self;
hgs
parents:
diff changeset
   106
    }
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
// --------------------------------------------------------------------------------------------
62
hgs
parents: 51
diff changeset
   109
CProfiler::CProfiler(const TDesC& aSettingsFile, TBool aBootMode) : 
hgs
parents: 51
diff changeset
   110
    iSettingsFileLocation(aSettingsFile),
hgs
parents: 51
diff changeset
   111
    iBootMode(aBootMode)
51
hgs
parents:
diff changeset
   112
	{
hgs
parents:
diff changeset
   113
	// define property for Profiler Engine status, UI may read it for control purposes
hgs
parents:
diff changeset
   114
	if ( RProperty::Define(KEngineStatusPropertyCat, 
hgs
parents:
diff changeset
   115
	        EProfilerEngineStatus, 
hgs
parents:
diff changeset
   116
	        RProperty::EInt, 
hgs
parents:
diff changeset
   117
	        KAllowAllPolicy, 
hgs
parents:
diff changeset
   118
	        KAllowAllPolicy, 
hgs
parents:
diff changeset
   119
	        0) != KErrAlreadyExists )
hgs
parents:
diff changeset
   120
	    {
hgs
parents:
diff changeset
   121
	    LOGTEXT(_L("CProfiler::CProfiler - status property already defined"));
hgs
parents:
diff changeset
   122
	    }
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
	if ( RProperty::Define(KEngineStatusPropertyCat, 
hgs
parents:
diff changeset
   125
	        EProfilerErrorStatus, 
hgs
parents:
diff changeset
   126
            RProperty::EInt, 
hgs
parents:
diff changeset
   127
            KAllowAllPolicy, 
hgs
parents:
diff changeset
   128
            KAllowAllPolicy, 
hgs
parents:
diff changeset
   129
            0) != KErrAlreadyExists )
hgs
parents:
diff changeset
   130
        {
hgs
parents:
diff changeset
   131
        LOGTEXT(_L("CProfiler::CProfiler - status property already defined"));
hgs
parents:
diff changeset
   132
        }
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
	// attach to own property
hgs
parents:
diff changeset
   135
	iEngineStatus.Attach(KEngineStatusPropertyCat, EProfilerEngineStatus);
hgs
parents:
diff changeset
   136
	// set status idle
hgs
parents:
diff changeset
   137
	iEngineStatus.Set(KEngineStatusPropertyCat, EProfilerEngineStatus, RProfiler::EIdle);
hgs
parents:
diff changeset
   138
	
hgs
parents:
diff changeset
   139
    // attach to own property
hgs
parents:
diff changeset
   140
    iUpdateStatus.Attach(KEngineStatusPropertyCat, EProfilerErrorStatus);
hgs
parents:
diff changeset
   141
    // set status idle
hgs
parents:
diff changeset
   142
    iUpdateStatus.Set(KEngineStatusPropertyCat, EProfilerErrorStatus, EFalse);
hgs
parents:
diff changeset
   143
	}
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   146
CProfiler::~CProfiler()
hgs
parents:
diff changeset
   147
    {
hgs
parents:
diff changeset
   148
	LOGTEXT(_L("CProfiler::~CProfiler - Enter"));
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
	// delete error checker
hgs
parents:
diff changeset
   151
    if(iErrorChecker)
hgs
parents:
diff changeset
   152
        {
hgs
parents:
diff changeset
   153
        iErrorChecker->Cancel();
hgs
parents:
diff changeset
   154
        delete iErrorChecker;
hgs
parents:
diff changeset
   155
        iErrorChecker = NULL;
hgs
parents:
diff changeset
   156
        }
hgs
parents:
diff changeset
   157
	
hgs
parents:
diff changeset
   158
	// delete settings array
hgs
parents:
diff changeset
   159
	if(iDefaultSamplerAttributesArray)
hgs
parents:
diff changeset
   160
	    {
hgs
parents:
diff changeset
   161
	    iDefaultSamplerAttributesArray->Reset();
hgs
parents:
diff changeset
   162
	    delete iDefaultSamplerAttributesArray;
hgs
parents:
diff changeset
   163
	    iDefaultSamplerAttributesArray = NULL;
hgs
parents:
diff changeset
   164
	    }
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
    // delete settings file raw line array
hgs
parents:
diff changeset
   167
    if(iSavedLineArray)
hgs
parents:
diff changeset
   168
        {
hgs
parents:
diff changeset
   169
        iSavedLineArray->Reset();
hgs
parents:
diff changeset
   170
        delete iSavedLineArray;
hgs
parents:
diff changeset
   171
        iSavedLineArray = NULL;
hgs
parents:
diff changeset
   172
        }
hgs
parents:
diff changeset
   173
		
hgs
parents:
diff changeset
   174
	// delete sampler controller, cleans up the sampler plugin instances
hgs
parents:
diff changeset
   175
	if(iSamplerHandler)
hgs
parents:
diff changeset
   176
		{
hgs
parents:
diff changeset
   177
		delete iSamplerHandler;
hgs
parents:
diff changeset
   178
		iSamplerHandler = NULL;
hgs
parents:
diff changeset
   179
		}
hgs
parents:
diff changeset
   180
	// delete writer controller, cleans up the writer plugin instances
hgs
parents:
diff changeset
   181
	if(iWriterHandler)
hgs
parents:
diff changeset
   182
		{
hgs
parents:
diff changeset
   183
		delete iWriterHandler;
hgs
parents:
diff changeset
   184
		iWriterHandler = NULL;
hgs
parents:
diff changeset
   185
		}
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
    // delete user side sampler stream 
hgs
parents:
diff changeset
   188
	if(iUserStream)
hgs
parents:
diff changeset
   189
		{
hgs
parents:
diff changeset
   190
		delete iUserStream;
hgs
parents:
diff changeset
   191
		iUserStream = NULL;
hgs
parents:
diff changeset
   192
		}
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
	// close engine status property
hgs
parents:
diff changeset
   195
	iEngineStatus.Close();
62
hgs
parents: 51
diff changeset
   196
	TInt ret = RProperty::Delete(KEngineStatusPropertyCat, EProfilerEngineStatus);
hgs
parents: 51
diff changeset
   197
	if ( ret != KErrNone)
51
hgs
parents:
diff changeset
   198
	    {
62
hgs
parents: 51
diff changeset
   199
	    LOGSTRING2("CProfiler::~CProfiler - cannot close status property %d", ret);
hgs
parents: 51
diff changeset
   200
51
hgs
parents:
diff changeset
   201
	    }
hgs
parents:
diff changeset
   202
    // close engine update property
hgs
parents:
diff changeset
   203
    iUpdateStatus.Close();
62
hgs
parents: 51
diff changeset
   204
    ret = RProperty::Delete(KEngineStatusPropertyCat, EProfilerErrorStatus); 
hgs
parents: 51
diff changeset
   205
    if (ret != KErrNone)
51
hgs
parents:
diff changeset
   206
        {
62
hgs
parents: 51
diff changeset
   207
        LOGSTRING2("CProfiler::~CProfiler - cannot close update property %d",ret);
51
hgs
parents:
diff changeset
   208
        }
hgs
parents:
diff changeset
   209
    
hgs
parents:
diff changeset
   210
    // close server process
hgs
parents:
diff changeset
   211
    if (iServer)
hgs
parents:
diff changeset
   212
        {
hgs
parents:
diff changeset
   213
        LOGTEXT(_L("CProfiler::~CProfiler - Releasing server"));
hgs
parents:
diff changeset
   214
        iServer->Release();        
hgs
parents:
diff changeset
   215
        }
hgs
parents:
diff changeset
   216
    
hgs
parents:
diff changeset
   217
    if( iTimer )
hgs
parents:
diff changeset
   218
        {
hgs
parents:
diff changeset
   219
        iTimer->Cancel();
hgs
parents:
diff changeset
   220
        delete iTimer;
hgs
parents:
diff changeset
   221
        iTimer = 0;
hgs
parents:
diff changeset
   222
        }
hgs
parents:
diff changeset
   223
    
hgs
parents:
diff changeset
   224
	LOGTEXT(_L("CProfiler::~CProfiler - Finished"));
hgs
parents:
diff changeset
   225
    }
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   228
void CProfiler::ConstructL()
hgs
parents:
diff changeset
   229
    {
hgs
parents:
diff changeset
   230
	LOGTEXT(_L("CProfiler::ConstructL - Enter"));
62
hgs
parents: 51
diff changeset
   231
    TInt err(0);
51
hgs
parents:
diff changeset
   232
	TLex lex;
62
hgs
parents: 51
diff changeset
   233
hgs
parents: 51
diff changeset
   234
	if(iBootMode)
hgs
parents: 51
diff changeset
   235
	    {
hgs
parents: 51
diff changeset
   236
        LOGSTRING("boot mode enabled");
hgs
parents: 51
diff changeset
   237
	    }
hgs
parents: 51
diff changeset
   238
	else
hgs
parents: 51
diff changeset
   239
	    {
hgs
parents: 51
diff changeset
   240
        LOGSTRING("normal mode enabled");
hgs
parents: 51
diff changeset
   241
	    }
51
hgs
parents:
diff changeset
   242
	
hgs
parents:
diff changeset
   243
	if ( iSettingsFileLocation.CompareF(KNullDesC) != 0 )
hgs
parents:
diff changeset
   244
	    {
hgs
parents:
diff changeset
   245
        lex=(iSettingsFileLocation);
hgs
parents:
diff changeset
   246
        // parse the first command line argument, the command itself
hgs
parents:
diff changeset
   247
        lex.Mark();
hgs
parents:
diff changeset
   248
        lex.SkipCharacters();
hgs
parents:
diff changeset
   249
        if(lex.TokenLength() != 0)
hgs
parents:
diff changeset
   250
            {
hgs
parents:
diff changeset
   251
            // there is another item in the list
hgs
parents:
diff changeset
   252
            TPtrC filename = lex.MarkedToken();
hgs
parents:
diff changeset
   253
            LOGSTRING2("filename %S", &filename);
62
hgs
parents: 51
diff changeset
   254
hgs
parents: 51
diff changeset
   255
           }
hgs
parents: 51
diff changeset
   256
	    }
hgs
parents: 51
diff changeset
   257
	else
hgs
parents: 51
diff changeset
   258
	    {
hgs
parents: 51
diff changeset
   259
        LOGSTRING("CProfiler::ConstructL - Enter - settingsfilelocation null");
51
hgs
parents:
diff changeset
   260
	    }
hgs
parents:
diff changeset
   261
	
hgs
parents:
diff changeset
   262
    // create new sampler stream instance
hgs
parents:
diff changeset
   263
    iUserStream = CProfilerSampleStream::NewL(KStreamBufferSize);
hgs
parents:
diff changeset
   264
    if(!iUserStream)
hgs
parents:
diff changeset
   265
        {
hgs
parents:
diff changeset
   266
        LOGTEXT(_L("Profiler engine cannot reserve memory"));
hgs
parents:
diff changeset
   267
        User::Leave(KErrCancel);   // operation cancelled
hgs
parents:
diff changeset
   268
        }
hgs
parents:
diff changeset
   269
	
hgs
parents:
diff changeset
   270
    // engine status checker
hgs
parents:
diff changeset
   271
    iErrorChecker = CProfilerErrorChecker::NewL();
hgs
parents:
diff changeset
   272
    iErrorChecker->SetObserver(this);
hgs
parents:
diff changeset
   273
62
hgs
parents: 51
diff changeset
   274
    // create and initiate plug-in controller instances
hgs
parents: 51
diff changeset
   275
    iSamplerHandler = CSamplerController::NewL(*iUserStream, iBootMode);
hgs
parents: 51
diff changeset
   276
    LOGSTRING("CSamplerController started from ProfilerEngine");
hgs
parents: 51
diff changeset
   277
    iWriterHandler = CWriterController::NewL(*iUserStream, iBootMode);
hgs
parents: 51
diff changeset
   278
    LOGSTRING("CWriterController started from ProfilerEngine");
51
hgs
parents:
diff changeset
   279
    iWriterHandler->InitialiseWriterListL();
62
hgs
parents: 51
diff changeset
   280
    LOGSTRING("WriterList initialised started from ProfilerEngine");
51
hgs
parents:
diff changeset
   281
    // set engine as an observer to sampler controller to get the notification of plugin load has ended
hgs
parents:
diff changeset
   282
    iSamplerHandler->SetObserver(this);
hgs
parents:
diff changeset
   283
    
hgs
parents:
diff changeset
   284
    // default settings from sampler plugins, maximum 20 sampler plugins
hgs
parents:
diff changeset
   285
    iDefaultSamplerAttributesArray = new(ELeave) CArrayFixFlat<TSamplerAttributes>(20); 
hgs
parents:
diff changeset
   286
    
hgs
parents:
diff changeset
   287
    // set profiler status to initializing
hgs
parents:
diff changeset
   288
    iState = RProfiler::EInitializing;
hgs
parents:
diff changeset
   289
	iEngineStatus.Set(RProfiler::EInitializing);
hgs
parents:
diff changeset
   290
	
hgs
parents:
diff changeset
   291
	// set default general settings, will be overdriven if changed in settings file
hgs
parents:
diff changeset
   292
	iGeneralAttributes.iTraceOutput.Copy(KDefaultTraceOutput);
hgs
parents:
diff changeset
   293
	iGeneralAttributes.iTraceFilePrefix.Copy(KDefaultTraceFilePrefix);
hgs
parents:
diff changeset
   294
	iGeneralAttributes.iSaveFileDrive.Copy(KDefaultTraceFileSaveDrive);
hgs
parents:
diff changeset
   295
	iGeneralAttributes.iTimedSamplingPeriod = KDefaultTimedSamplingPeriod;
hgs
parents:
diff changeset
   296
	
hgs
parents:
diff changeset
   297
	RThread me;
hgs
parents:
diff changeset
   298
	
hgs
parents:
diff changeset
   299
	me.SetPriority(EPriorityRealTime);
hgs
parents:
diff changeset
   300
hgs
parents:
diff changeset
   301
	err = KErrGeneral;
hgs
parents:
diff changeset
   302
	TInt count = 0;
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
	while(err != KErrNone && count < 30)
hgs
parents:
diff changeset
   305
	    {
hgs
parents:
diff changeset
   306
		err = User::RenameThread(KProfilerName);
hgs
parents:
diff changeset
   307
		if(err != KErrNone)
hgs
parents:
diff changeset
   308
		    {
hgs
parents:
diff changeset
   309
		    LOGSTRING2("CProfiler: error renaming the thread, err %d", err);
hgs
parents:
diff changeset
   310
			User::Leave(err);
hgs
parents:
diff changeset
   311
		    }
hgs
parents:
diff changeset
   312
		else break;
hgs
parents:
diff changeset
   313
	    }
hgs
parents:
diff changeset
   314
62
hgs
parents: 51
diff changeset
   315
	if(err != KErrNone) 
hgs
parents: 51
diff changeset
   316
	    {
hgs
parents: 51
diff changeset
   317
		User::Leave(err);
hgs
parents: 51
diff changeset
   318
	    }
hgs
parents: 51
diff changeset
   319
51
hgs
parents:
diff changeset
   320
	// set settings file loading preferences
hgs
parents:
diff changeset
   321
	iSettingsFileLoaded = EFalse;
hgs
parents:
diff changeset
   322
hgs
parents:
diff changeset
   323
	// change status property to idle since initialization successfull
hgs
parents:
diff changeset
   324
	iState = RProfiler::EIdle;
hgs
parents:
diff changeset
   325
	if( iEngineStatus.Set((TInt)RProfiler::EIdle) != KErrNone )
hgs
parents:
diff changeset
   326
	    {
hgs
parents:
diff changeset
   327
	    LOGTEXT(_L("CProfiler::ConstructL - engine status property change failed"));
hgs
parents:
diff changeset
   328
	    }
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
    if( iUpdateStatus.Set(EFalse) != KErrNone )
hgs
parents:
diff changeset
   331
        {
hgs
parents:
diff changeset
   332
        LOGTEXT(_L("CProfiler::ConstructL - engine status property change failed"));
hgs
parents:
diff changeset
   333
        }
hgs
parents:
diff changeset
   334
hgs
parents:
diff changeset
   335
	// create a server instance for clients to communicate with 
hgs
parents:
diff changeset
   336
	iServer = CPServer::NewL(10,*this);
hgs
parents:
diff changeset
   337
	
hgs
parents:
diff changeset
   338
	// close the handle 
hgs
parents:
diff changeset
   339
	me.Close();
hgs
parents:
diff changeset
   340
	
hgs
parents:
diff changeset
   341
	iTimer = CProfilerTimer::NewL(CActive::EPriorityStandard, *this);
hgs
parents:
diff changeset
   342
	
hgs
parents:
diff changeset
   343
	LOGTEXT(_L("CProfiler::ConstructL - Exit"));
hgs
parents:
diff changeset
   344
	
hgs
parents:
diff changeset
   345
    }
hgs
parents:
diff changeset
   346
hgs
parents:
diff changeset
   347
CProfilerSampleStream* CProfiler::GetSamplerStream()
hgs
parents:
diff changeset
   348
    {
hgs
parents:
diff changeset
   349
    return iUserStream;
hgs
parents:
diff changeset
   350
    }
hgs
parents:
diff changeset
   351
hgs
parents:
diff changeset
   352
void CProfiler::HandleSamplerControllerReadyL()
hgs
parents:
diff changeset
   353
    {
hgs
parents:
diff changeset
   354
    // load settings
hgs
parents:
diff changeset
   355
    // check if settings file already loaded
hgs
parents:
diff changeset
   356
    if(!iSettingsFileLoaded)
hgs
parents:
diff changeset
   357
        {
hgs
parents:
diff changeset
   358
        // load default settings file
hgs
parents:
diff changeset
   359
        LoadSettingsL();
hgs
parents:
diff changeset
   360
hgs
parents:
diff changeset
   361
        iSettingsFileLoaded = ETrue;
hgs
parents:
diff changeset
   362
        }
62
hgs
parents: 51
diff changeset
   363
    LOGSTRING("CProfiler::HandleSamplerControllerReadyL rendezvous");
51
hgs
parents:
diff changeset
   364
    // notify engine's launcher(UI or PIProfilerLauncher) to continue launch
hgs
parents:
diff changeset
   365
    RProcess::Rendezvous(KErrNone); 
hgs
parents:
diff changeset
   366
    }
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
void CProfiler::NotifyRequesterForSettingsUpdate()
hgs
parents:
diff changeset
   369
    {
hgs
parents:
diff changeset
   370
    // set update status P&S property true => update needed on UI side
hgs
parents:
diff changeset
   371
    iUpdateStatus.Set(ETrue);
hgs
parents:
diff changeset
   372
    }
hgs
parents:
diff changeset
   373
hgs
parents:
diff changeset
   374
void CProfiler::HandleProfilerErrorChangeL(TInt aError)
hgs
parents:
diff changeset
   375
    {
hgs
parents:
diff changeset
   376
    LOGSTRING2("CProfiler::HandleProfilerErrorChangeL() - error received, %d", aError);
hgs
parents:
diff changeset
   377
    
hgs
parents:
diff changeset
   378
    // check if profiler running
hgs
parents:
diff changeset
   379
    if(iState == RProfiler::ERunning)
hgs
parents:
diff changeset
   380
        {
hgs
parents:
diff changeset
   381
        // stop profiler if error occurred during the trace
hgs
parents:
diff changeset
   382
        iEngineStatus.Set(aError);
hgs
parents:
diff changeset
   383
        
hgs
parents:
diff changeset
   384
        // stop samplers, NOTE! Writer plugins not stopped since 
hgs
parents:
diff changeset
   385
        iSamplerHandler->StopSamplerPlugins();
hgs
parents:
diff changeset
   386
hgs
parents:
diff changeset
   387
        // stop debug output plugin and write the rest of the trace data to output
hgs
parents:
diff changeset
   388
        if(iGeneralAttributes.iTraceOutput.CompareF(KOutputToDebugOutput) == 0)   
hgs
parents:
diff changeset
   389
            {
hgs
parents:
diff changeset
   390
            // write the rest of trace data only if debug output selected
hgs
parents:
diff changeset
   391
            iWriterHandler->StopSelectedPlugin();
hgs
parents:
diff changeset
   392
            }
hgs
parents:
diff changeset
   393
        LOGSTRING2("CProfiler::HandleProfilerErrorChangeL - sampling stopped, going to state %d", RProfiler::EIdle);
hgs
parents:
diff changeset
   394
        }
hgs
parents:
diff changeset
   395
    }
hgs
parents:
diff changeset
   396
hgs
parents:
diff changeset
   397
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   398
// Gets a value from settings file for certain attribute.
hgs
parents:
diff changeset
   399
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   400
void CProfiler::DoGetValueFromSettingsArray(CDesC8ArrayFlat* aLineArray, const TDesC8& aAttribute, TDes8& aValue)
hgs
parents:
diff changeset
   401
    {
62
hgs
parents: 51
diff changeset
   402
    LOGTEXT(_L("CProfiler::DoGetValueFromSettingsArray()"));
51
hgs
parents:
diff changeset
   403
    _LIT8(KSettingItemSeparator, "=");
hgs
parents:
diff changeset
   404
    
hgs
parents:
diff changeset
   405
    // read a line of given array
hgs
parents:
diff changeset
   406
    for (TInt i=0; i<aLineArray->MdcaCount(); i++)
hgs
parents:
diff changeset
   407
        {
hgs
parents:
diff changeset
   408
        // check if this line has a separator
hgs
parents:
diff changeset
   409
        TInt sepPos = aLineArray->MdcaPoint(i).Find(KSettingItemSeparator);
hgs
parents:
diff changeset
   410
        if (sepPos > 0)
hgs
parents:
diff changeset
   411
            {
hgs
parents:
diff changeset
   412
            // check that the element matches
hgs
parents:
diff changeset
   413
            if (aLineArray->MdcaPoint(i).Left(sepPos).CompareF(aAttribute) == 0)
hgs
parents:
diff changeset
   414
                {
hgs
parents:
diff changeset
   415
                // get the value
hgs
parents:
diff changeset
   416
                aValue.Copy(aLineArray->MdcaPoint(i).Right(aLineArray->MdcaPoint(i).Length()-sepPos-1));
hgs
parents:
diff changeset
   417
                break;
hgs
parents:
diff changeset
   418
                }
hgs
parents:
diff changeset
   419
            }
hgs
parents:
diff changeset
   420
        }
hgs
parents:
diff changeset
   421
    }
hgs
parents:
diff changeset
   422
hgs
parents:
diff changeset
   423
void CProfiler::DoGetValueFromSettingsArray(CDesC8ArrayFlat* aLineArray, const TDesC8& aAttribute, TInt& aValue)
hgs
parents:
diff changeset
   424
    {
62
hgs
parents: 51
diff changeset
   425
    LOGTEXT(_L("CProfiler::DoGetValueFromSettingsFile() TLex"));
51
hgs
parents:
diff changeset
   426
    _LIT8(KSettingItemSeparator, "=");
hgs
parents:
diff changeset
   427
    
hgs
parents:
diff changeset
   428
    // read a line of given array
hgs
parents:
diff changeset
   429
    for (TInt i=0; i<aLineArray->MdcaCount(); i++)
hgs
parents:
diff changeset
   430
        {
hgs
parents:
diff changeset
   431
        // check if this line has a separator
hgs
parents:
diff changeset
   432
        TInt sepPos = aLineArray->MdcaPoint(i).Find(KSettingItemSeparator);
hgs
parents:
diff changeset
   433
        if (sepPos > 0)
hgs
parents:
diff changeset
   434
            {
hgs
parents:
diff changeset
   435
            // check that the element matches
hgs
parents:
diff changeset
   436
            if (aLineArray->MdcaPoint(i).Left(sepPos).CompareF(aAttribute) == 0)
hgs
parents:
diff changeset
   437
                {
hgs
parents:
diff changeset
   438
                // get the value                
hgs
parents:
diff changeset
   439
                TLex8 parser(aLineArray->MdcaPoint(i).Right(aLineArray->MdcaPoint(i).Length()-sepPos-1));
hgs
parents:
diff changeset
   440
                parser.Val(aValue);
hgs
parents:
diff changeset
   441
                break;
hgs
parents:
diff changeset
   442
                }
hgs
parents:
diff changeset
   443
            }
hgs
parents:
diff changeset
   444
        }
hgs
parents:
diff changeset
   445
    }
hgs
parents:
diff changeset
   446
hgs
parents:
diff changeset
   447
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   448
TInt CProfiler::GetSamplerAttributesL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   449
    {
hgs
parents:
diff changeset
   450
    TInt err(KErrNone);
hgs
parents:
diff changeset
   451
    TInt pos(0);
hgs
parents:
diff changeset
   452
hgs
parents:
diff changeset
   453
    // get sampler count
hgs
parents:
diff changeset
   454
    TInt count(iDefaultSamplerAttributesArray->Count());
hgs
parents:
diff changeset
   455
hgs
parents:
diff changeset
   456
    // write each of the default sampler plugin setting attributes over client-server session 
hgs
parents:
diff changeset
   457
    for (TInt i(0); i<count; ++i)
hgs
parents:
diff changeset
   458
       {
hgs
parents:
diff changeset
   459
       TSamplerAttributes attr = iDefaultSamplerAttributesArray->At(i);
hgs
parents:
diff changeset
   460
       TPckgC<TSamplerAttributes> attrPckg(attr);
hgs
parents:
diff changeset
   461
       
hgs
parents:
diff changeset
   462
       // write a TSamplerAttributes container at a time
hgs
parents:
diff changeset
   463
       aMessage.WriteL(0, attrPckg, pos);
hgs
parents:
diff changeset
   464
       pos += attrPckg.Length();
hgs
parents:
diff changeset
   465
       }
hgs
parents:
diff changeset
   466
hgs
parents:
diff changeset
   467
    aMessage.Complete(err);
hgs
parents:
diff changeset
   468
    return err;
hgs
parents:
diff changeset
   469
    }
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   472
TInt CProfiler::SetSamplerAttributesL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   473
    {
hgs
parents:
diff changeset
   474
    TSamplerAttributes attr;
hgs
parents:
diff changeset
   475
    TPckg<TSamplerAttributes> inAttr(attr);
hgs
parents:
diff changeset
   476
    
hgs
parents:
diff changeset
   477
    TInt err = aMessage.Read(0, inAttr, 0);    
hgs
parents:
diff changeset
   478
    
hgs
parents:
diff changeset
   479
    // apply the changes directly to a plugin
hgs
parents:
diff changeset
   480
    iSamplerHandler->SetSamplerSettingsL(attr.iUid, attr);
hgs
parents:
diff changeset
   481
    
hgs
parents:
diff changeset
   482
    aMessage.Complete(err);
hgs
parents:
diff changeset
   483
    return err;
hgs
parents:
diff changeset
   484
    }
hgs
parents:
diff changeset
   485
hgs
parents:
diff changeset
   486
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   487
TInt CProfiler::GetGeneralAttributesL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   488
    {
hgs
parents:
diff changeset
   489
    TPckgBuf<TGeneralAttributes> generalSettings( iGeneralAttributes );
hgs
parents:
diff changeset
   490
    
hgs
parents:
diff changeset
   491
    // write general attributes over client-server session
hgs
parents:
diff changeset
   492
    TInt err = aMessage.Write(0, generalSettings);
hgs
parents:
diff changeset
   493
    
hgs
parents:
diff changeset
   494
    aMessage.Complete(err);
hgs
parents:
diff changeset
   495
    return err;
hgs
parents:
diff changeset
   496
    }
hgs
parents:
diff changeset
   497
hgs
parents:
diff changeset
   498
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   499
TInt CProfiler::SetGeneralAttributesL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   500
    {
hgs
parents:
diff changeset
   501
    // read the general settings from message
hgs
parents:
diff changeset
   502
    TGeneralAttributes attr;
hgs
parents:
diff changeset
   503
    TPckg<TGeneralAttributes> inPckg(attr);
hgs
parents:
diff changeset
   504
    TInt err = aMessage.Read(0, inPckg, 0);
hgs
parents:
diff changeset
   505
    
hgs
parents:
diff changeset
   506
    // copy to the general attributes
hgs
parents:
diff changeset
   507
    iGeneralAttributes.iSaveFileDrive.Copy(attr.iSaveFileDrive);
hgs
parents:
diff changeset
   508
    iGeneralAttributes.iTraceFilePrefix.Copy(attr.iTraceFilePrefix);
hgs
parents:
diff changeset
   509
    iGeneralAttributes.iTraceOutput.Copy(attr.iTraceOutput);
hgs
parents:
diff changeset
   510
    iGeneralAttributes.iTimedSamplingPeriod = attr.iTimedSamplingPeriod;
hgs
parents:
diff changeset
   511
    
hgs
parents:
diff changeset
   512
    aMessage.Complete(err);
hgs
parents:
diff changeset
   513
    return err;
hgs
parents:
diff changeset
   514
    }
hgs
parents:
diff changeset
   515
hgs
parents:
diff changeset
   516
TInt CProfiler::GetSamplerAttributeCountL(const RMessage2& aMessage)
hgs
parents:
diff changeset
   517
    {
hgs
parents:
diff changeset
   518
    // get the plugin array count and wrap it to TPckgBuf<>
hgs
parents:
diff changeset
   519
    TPckgBuf<TInt> attributeCount(iDefaultSamplerAttributesArray->Count());
hgs
parents:
diff changeset
   520
    
hgs
parents:
diff changeset
   521
    // write general attributes over client-server session
hgs
parents:
diff changeset
   522
    TInt err = aMessage.Write(0, attributeCount);
hgs
parents:
diff changeset
   523
    
hgs
parents:
diff changeset
   524
    aMessage.Complete(err);
hgs
parents:
diff changeset
   525
    return err;
hgs
parents:
diff changeset
   526
    }
hgs
parents:
diff changeset
   527
hgs
parents:
diff changeset
   528
TInt CProfiler::RefreshStatus(const RMessage2& aMessage)
hgs
parents:
diff changeset
   529
    {
hgs
parents:
diff changeset
   530
    TInt err(KErrNone);
hgs
parents:
diff changeset
   531
    
hgs
parents:
diff changeset
   532
    // update profiler status for requester
hgs
parents:
diff changeset
   533
    iEngineStatus.Set(iState);
hgs
parents:
diff changeset
   534
    
hgs
parents:
diff changeset
   535
    aMessage.Complete(err);
hgs
parents:
diff changeset
   536
    return err;
hgs
parents:
diff changeset
   537
    }
hgs
parents:
diff changeset
   538
hgs
parents:
diff changeset
   539
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   540
TInt CProfiler::LoadSettingsL(/*const TDesC& configFile*/)
hgs
parents:
diff changeset
   541
    {
hgs
parents:
diff changeset
   542
	RFs fileServer;
hgs
parents:
diff changeset
   543
	RFile file;
hgs
parents:
diff changeset
   544
	TInt err(KErrNone);
hgs
parents:
diff changeset
   545
    
hgs
parents:
diff changeset
   546
	// connect to file server 
hgs
parents:
diff changeset
   547
	err = fileServer.Connect();
hgs
parents:
diff changeset
   548
	
hgs
parents:
diff changeset
   549
	// check if file server can be connected
hgs
parents:
diff changeset
   550
	if (err != KErrNone)
hgs
parents:
diff changeset
   551
	    {
hgs
parents:
diff changeset
   552
		// file server couldn't be connected
hgs
parents:
diff changeset
   553
		return KErrGeneral;
hgs
parents:
diff changeset
   554
	    }
hgs
parents:
diff changeset
   555
hgs
parents:
diff changeset
   556
	// check if settings file location length reasonable
hgs
parents:
diff changeset
   557
	if ( iSettingsFileLocation.CompareF(KNullDesC) == 0 )
hgs
parents:
diff changeset
   558
	    {
hgs
parents:
diff changeset
   559
		// open the file with the default path and name
hgs
parents:
diff changeset
   560
		TBuf<256> pathAndName;
hgs
parents:
diff changeset
   561
		pathAndName.Append(PathInfo::PhoneMemoryRootPath());
hgs
parents:
diff changeset
   562
		pathAndName.Append(KProfilerSettingsFileName);
hgs
parents:
diff changeset
   563
		iSettingsFileLocation.Copy(pathAndName);
hgs
parents:
diff changeset
   564
		LOGTEXT(_L("CProfiler::LoadSettings - Opening settings file with name (with the default path)"));
hgs
parents:
diff changeset
   565
		LOGTEXT(pathAndName);
hgs
parents:
diff changeset
   566
	    }
hgs
parents:
diff changeset
   567
hgs
parents:
diff changeset
   568
    // open the file with the given path and name
hgs
parents:
diff changeset
   569
    err = file.Open(fileServer,iSettingsFileLocation,EFileRead);
hgs
parents:
diff changeset
   570
hgs
parents:
diff changeset
   571
	
hgs
parents:
diff changeset
   572
	// check if RFile::Open() returned error
hgs
parents:
diff changeset
   573
	if (err != KErrNone)
hgs
parents:
diff changeset
   574
	    {
hgs
parents:
diff changeset
   575
		// file couldn't be opened
hgs
parents:
diff changeset
   576
		LOGTEXT(_L("CProfiler::LoadSettings - Failed to open settings, using default"));
hgs
parents:
diff changeset
   577
hgs
parents:
diff changeset
   578
		// check if settings already loaded
hgs
parents:
diff changeset
   579
		if(iDefaultSamplerAttributesArray->Count() > 0)
hgs
parents:
diff changeset
   580
		    {
hgs
parents:
diff changeset
   581
		    // reset default settings array
hgs
parents:
diff changeset
   582
		    iDefaultSamplerAttributesArray->Reset();
hgs
parents:
diff changeset
   583
		    }
hgs
parents:
diff changeset
   584
		
hgs
parents:
diff changeset
   585
		// load default settings, instead of settings file ones
hgs
parents:
diff changeset
   586
		iSamplerHandler->GetSamplerAttributesL(iDefaultSamplerAttributesArray);
hgs
parents:
diff changeset
   587
		
hgs
parents:
diff changeset
   588
		fileServer.Close();
hgs
parents:
diff changeset
   589
		return KErrNone;
hgs
parents:
diff changeset
   590
	    }
hgs
parents:
diff changeset
   591
	
hgs
parents:
diff changeset
   592
	// initialize iSavedLineArray, initial settings file lines 64
hgs
parents:
diff changeset
   593
	if(iSavedLineArray)
hgs
parents:
diff changeset
   594
	    {
hgs
parents:
diff changeset
   595
        iSavedLineArray->Reset();
hgs
parents:
diff changeset
   596
	    }
hgs
parents:
diff changeset
   597
	else
hgs
parents:
diff changeset
   598
	    {
hgs
parents:
diff changeset
   599
        iSavedLineArray = new (ELeave) CDesC8ArrayFlat(KSavedLineCount);
hgs
parents:
diff changeset
   600
	    }
hgs
parents:
diff changeset
   601
	
hgs
parents:
diff changeset
   602
	iSavedLinesCount = KSavedLineCount;
hgs
parents:
diff changeset
   603
	
hgs
parents:
diff changeset
   604
    // get size of the file
hgs
parents:
diff changeset
   605
    TInt fileSize(0);
hgs
parents:
diff changeset
   606
    err = file.Size(fileSize);
hgs
parents:
diff changeset
   607
    // check if an error occurred reading the file size
hgs
parents:
diff changeset
   608
    if(err != KErrNone)
hgs
parents:
diff changeset
   609
        {
hgs
parents:
diff changeset
   610
        return KErrGeneral; // could not find the size
hgs
parents:
diff changeset
   611
        }
hgs
parents:
diff changeset
   612
        
hgs
parents:
diff changeset
   613
    // sanity check for the file size
hgs
parents:
diff changeset
   614
    if (fileSize < 3 || fileSize > 20000)
hgs
parents:
diff changeset
   615
        {
hgs
parents:
diff changeset
   616
        fileSize = KSettingsFileSize;
hgs
parents:
diff changeset
   617
        return KErrNotSupported;
hgs
parents:
diff changeset
   618
        }
hgs
parents:
diff changeset
   619
    
hgs
parents:
diff changeset
   620
	// read the contents of the file to buffer. 
hgs
parents:
diff changeset
   621
	iSettingsBuffer.Zero();
hgs
parents:
diff changeset
   622
	file.Read(iSettingsBuffer, fileSize);
hgs
parents:
diff changeset
   623
	file.Close();
hgs
parents:
diff changeset
   624
	fileServer.Close();
hgs
parents:
diff changeset
   625
	LOGSTRING2("CProfiler::LoadSettings: read %d bytes",iSettingsBuffer.Length());
hgs
parents:
diff changeset
   626
hgs
parents:
diff changeset
   627
	// append end mark "[end]"
hgs
parents:
diff changeset
   628
    iSettingsBuffer.Append(KEndMark);
hgs
parents:
diff changeset
   629
	// force an ending newline
hgs
parents:
diff changeset
   630
	iSettingsBuffer.Append('\n');
hgs
parents:
diff changeset
   631
hgs
parents:
diff changeset
   632
	// next fill the saved settings array (CDesC8ArrayFlat) for further comparison with changes and default values
hgs
parents:
diff changeset
   633
    TBuf8<384> tmpBuf;
hgs
parents:
diff changeset
   634
    TInt lineCount(0);
hgs
parents:
diff changeset
   635
    TBool commentFound(EFalse);
hgs
parents:
diff changeset
   636
    for (TInt i(0); i<iSettingsBuffer.Length(); i++)  // loop all chars
hgs
parents:
diff changeset
   637
        {
hgs
parents:
diff changeset
   638
        // if new line char found, create a new text line
hgs
parents:
diff changeset
   639
        if (iSettingsBuffer[i]=='\r' || iSettingsBuffer[i]=='\n')
hgs
parents:
diff changeset
   640
            {
hgs
parents:
diff changeset
   641
            // check if collected string has reasonable length
hgs
parents:
diff changeset
   642
            if (tmpBuf.Length() > 0)
hgs
parents:
diff changeset
   643
                {
hgs
parents:
diff changeset
   644
                // remove extra spaces
hgs
parents:
diff changeset
   645
                tmpBuf.TrimAll();
hgs
parents:
diff changeset
   646
                // check if the size of the array too small
hgs
parents:
diff changeset
   647
                if(lineCount >= iSavedLinesCount)
hgs
parents:
diff changeset
   648
                    {
hgs
parents:
diff changeset
   649
                    iSavedLineArray->ExpandL(20);   // expand by 20 lines
hgs
parents:
diff changeset
   650
                    iSavedLinesCount += 20;
hgs
parents:
diff changeset
   651
                    }
hgs
parents:
diff changeset
   652
                iSavedLineArray->AppendL(tmpBuf);
hgs
parents:
diff changeset
   653
                tmpBuf.Copy(KNullDesC8);
hgs
parents:
diff changeset
   654
                lineCount++;
hgs
parents:
diff changeset
   655
                }
hgs
parents:
diff changeset
   656
            commentFound = EFalse;
hgs
parents:
diff changeset
   657
            }
hgs
parents:
diff changeset
   658
        // check if comment mark ';' is found on the line, skip the rest of the line
hgs
parents:
diff changeset
   659
        else if(iSettingsBuffer[i]==';')
hgs
parents:
diff changeset
   660
            {
hgs
parents:
diff changeset
   661
            commentFound = ETrue;
hgs
parents:
diff changeset
   662
            }
hgs
parents:
diff changeset
   663
        // otherwise append a char to the temp line buffer if it is a wanted ASCII char
hgs
parents:
diff changeset
   664
        else if (iSettingsBuffer[i]>=32 && iSettingsBuffer[i]<=127 && !commentFound)
hgs
parents:
diff changeset
   665
            {
hgs
parents:
diff changeset
   666
            tmpBuf.Append(iSettingsBuffer[i]);
hgs
parents:
diff changeset
   667
            }
hgs
parents:
diff changeset
   668
        }
hgs
parents:
diff changeset
   669
    
hgs
parents:
diff changeset
   670
    // empty tmpBuf
hgs
parents:
diff changeset
   671
    tmpBuf.Copy(KNullDesC8);
hgs
parents:
diff changeset
   672
    // check settings file version
hgs
parents:
diff changeset
   673
    DoGetValueFromSettingsArray(iSavedLineArray, KProfilerVersionTag, tmpBuf); 
hgs
parents:
diff changeset
   674
hgs
parents:
diff changeset
   675
    TBuf8<32> version;
hgs
parents:
diff changeset
   676
    version.Copy(PROFILER_VERSION_SHORT);
hgs
parents:
diff changeset
   677
    
hgs
parents:
diff changeset
   678
    // check if settings file version is 
hgs
parents:
diff changeset
   679
    if(tmpBuf.CompareF(version) >= 0)
hgs
parents:
diff changeset
   680
        {
hgs
parents:
diff changeset
   681
        // update general attributes
hgs
parents:
diff changeset
   682
        UpdateSavedGeneralAttributes(iSavedLineArray);
hgs
parents:
diff changeset
   683
        
hgs
parents:
diff changeset
   684
        // update settings to sampler plugins and save the attributes to default array
hgs
parents:
diff changeset
   685
        iSamplerHandler->UpdateSavedSamplerAttributesL(iSavedLineArray, iDefaultSamplerAttributesArray);
hgs
parents:
diff changeset
   686
        }
hgs
parents:
diff changeset
   687
    else
hgs
parents:
diff changeset
   688
        {
hgs
parents:
diff changeset
   689
        // check if settings already loaded
hgs
parents:
diff changeset
   690
        if(iDefaultSamplerAttributesArray)
hgs
parents:
diff changeset
   691
            {
hgs
parents:
diff changeset
   692
            // reset default settings array
hgs
parents:
diff changeset
   693
            iDefaultSamplerAttributesArray->Reset();
hgs
parents:
diff changeset
   694
hgs
parents:
diff changeset
   695
			// get the default settings if settings file version too old
hgs
parents:
diff changeset
   696
			iSamplerHandler->GetSamplerAttributesL(iDefaultSamplerAttributesArray);
hgs
parents:
diff changeset
   697
			}
hgs
parents:
diff changeset
   698
        }
hgs
parents:
diff changeset
   699
    
hgs
parents:
diff changeset
   700
	return err; 
hgs
parents:
diff changeset
   701
    }
hgs
parents:
diff changeset
   702
hgs
parents:
diff changeset
   703
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   704
void CProfiler::UpdateSavedGeneralAttributes(CDesC8ArrayFlat* aSavedAttributes)
hgs
parents:
diff changeset
   705
    {
hgs
parents:
diff changeset
   706
    // get saved general settings
62
hgs
parents: 51
diff changeset
   707
    LOGSTRING("CProfiler::UpdateSavedGeneralAttributes");
51
hgs
parents:
diff changeset
   708
    DoGetValueFromSettingsArray(aSavedAttributes, KGenericTraceOutput, iGeneralAttributes.iTraceOutput);
hgs
parents:
diff changeset
   709
    DoGetValueFromSettingsArray(aSavedAttributes, KGenericTraceFilePrefix, iGeneralAttributes.iTraceFilePrefix);
hgs
parents:
diff changeset
   710
    DoGetValueFromSettingsArray(aSavedAttributes, KGenericTraceFileSaveDrive, iGeneralAttributes.iSaveFileDrive);
hgs
parents:
diff changeset
   711
    DoGetValueFromSettingsArray(aSavedAttributes, KGenericTimedProfilingPeriod, iGeneralAttributes.iTimedSamplingPeriod);
hgs
parents:
diff changeset
   712
    }
hgs
parents:
diff changeset
   713
hgs
parents:
diff changeset
   714
TBool CProfiler::CheckLocationSanity(RFs& fs, const TDesC8& aLocation)
hgs
parents:
diff changeset
   715
    {
hgs
parents:
diff changeset
   716
    TBool ret(EFalse);
hgs
parents:
diff changeset
   717
    TBool noDiskSpace(EFalse);
hgs
parents:
diff changeset
   718
    TBuf<32> drive;
hgs
parents:
diff changeset
   719
    
hgs
parents:
diff changeset
   720
    CnvUtfConverter::ConvertToUnicodeFromUtf8(drive, aLocation);
hgs
parents:
diff changeset
   721
    TDriveUnit driveUnit = TDriveUnit(drive);
hgs
parents:
diff changeset
   722
    
hgs
parents:
diff changeset
   723
    // check that the root folder is correct
hgs
parents:
diff changeset
   724
    if (drive.Length() > 2 && BaflUtils::CheckFolder(fs, drive.Left(3)) == KErrNone)
hgs
parents:
diff changeset
   725
        {
hgs
parents:
diff changeset
   726
        // test available disk space 
hgs
parents:
diff changeset
   727
        TRAP_IGNORE((noDiskSpace = SysUtil::DiskSpaceBelowCriticalLevelL(&fs, 0, driveUnit)));
hgs
parents:
diff changeset
   728
        if(!noDiskSpace)
hgs
parents:
diff changeset
   729
            ret = ETrue;
hgs
parents:
diff changeset
   730
        }
hgs
parents:
diff changeset
   731
    
hgs
parents:
diff changeset
   732
    return ret;
hgs
parents:
diff changeset
   733
    }
hgs
parents:
diff changeset
   734
hgs
parents:
diff changeset
   735
TInt CProfiler::HandleGeneralSettingsChange()
hgs
parents:
diff changeset
   736
    {
hgs
parents:
diff changeset
   737
    // local literals
hgs
parents:
diff changeset
   738
    _LIT8(KBackSlash, "\\");
hgs
parents:
diff changeset
   739
    _LIT8(KTraceFileExtension, ".dat");
hgs
parents:
diff changeset
   740
    
hgs
parents:
diff changeset
   741
    TBuf8<KFileNameBufSize> fileNameBuf;
hgs
parents:
diff changeset
   742
    TBuf8<10> number;
hgs
parents:
diff changeset
   743
    TInt result(0);
hgs
parents:
diff changeset
   744
    TInt index(1);
hgs
parents:
diff changeset
   745
    TInt hashLocation(0);
hgs
parents:
diff changeset
   746
    TParse parse;
hgs
parents:
diff changeset
   747
hgs
parents:
diff changeset
   748
    // check if plugin writer changed
hgs
parents:
diff changeset
   749
    if(iGeneralAttributes.iTraceOutput.CompareF(KOutputToDebugOutput) == 0)
hgs
parents:
diff changeset
   750
        {
hgs
parents:
diff changeset
   751
        iWriterHandler->SetPluginActive( KDebOutWriterPluginUid, EWriterPluginEnabled );
hgs
parents:
diff changeset
   752
        }
hgs
parents:
diff changeset
   753
    else
hgs
parents:
diff changeset
   754
        {
hgs
parents:
diff changeset
   755
        RFs fileServer;
hgs
parents:
diff changeset
   756
        RFile file;
hgs
parents:
diff changeset
   757
        
hgs
parents:
diff changeset
   758
        // connect to the file server
hgs
parents:
diff changeset
   759
        result = fileServer.Connect();
hgs
parents:
diff changeset
   760
        if(result == KErrNone)
hgs
parents:
diff changeset
   761
            {
hgs
parents:
diff changeset
   762
            // disk writer plugin will be activated
hgs
parents:
diff changeset
   763
            iWriterHandler->SetPluginActive( KDiskWriterPluginUid, EWriterPluginEnabled );
hgs
parents:
diff changeset
   764
            
hgs
parents:
diff changeset
   765
            // fix the trace data file location as well
hgs
parents:
diff changeset
   766
            iTotalPrefix.Zero();
hgs
parents:
diff changeset
   767
            iTotalPrefix.Append(iGeneralAttributes.iSaveFileDrive);
hgs
parents:
diff changeset
   768
            
hgs
parents:
diff changeset
   769
            // check that trace file location sane
hgs
parents:
diff changeset
   770
            if(!CProfiler::CheckLocationSanity(fileServer, iTotalPrefix))
hgs
parents:
diff changeset
   771
                {
hgs
parents:
diff changeset
   772
                fileServer.Close();
hgs
parents:
diff changeset
   773
                return KErrPathNotFound;
hgs
parents:
diff changeset
   774
                }
hgs
parents:
diff changeset
   775
            
hgs
parents:
diff changeset
   776
            // remove extra spaces
hgs
parents:
diff changeset
   777
            iTotalPrefix.TrimAll();
hgs
parents:
diff changeset
   778
            
hgs
parents:
diff changeset
   779
            // check the directory contains a trailing backlash
hgs
parents:
diff changeset
   780
            if(iTotalPrefix.Right(1) != _L8("\\") && 
hgs
parents:
diff changeset
   781
                    iTotalPrefix.Right(1) != _L8("/"))
hgs
parents:
diff changeset
   782
                {
hgs
parents:
diff changeset
   783
                // append backslash to end
hgs
parents:
diff changeset
   784
                iTotalPrefix.Append(KBackSlash);
hgs
parents:
diff changeset
   785
                }
hgs
parents:
diff changeset
   786
            
hgs
parents:
diff changeset
   787
            // append trace file name prefix e.g. PIProfiler_#
hgs
parents:
diff changeset
   788
            iTotalPrefix.Append(iGeneralAttributes.iTraceFilePrefix);
hgs
parents:
diff changeset
   789
    
hgs
parents:
diff changeset
   790
            // locate '#' mark for finding the next free trace file name, e.g. E:\data\PIProfiler_4.dat
hgs
parents:
diff changeset
   791
            hashLocation = iTotalPrefix.Locate('#');
hgs
parents:
diff changeset
   792
            if( hashLocation == KErrNotFound )
hgs
parents:
diff changeset
   793
                {
hgs
parents:
diff changeset
   794
                // append simply at the end of the trace file prefix, no need to inform user
hgs
parents:
diff changeset
   795
                iTotalPrefix.Append('#');
hgs
parents:
diff changeset
   796
                // get new hash mark location
hgs
parents:
diff changeset
   797
                hashLocation = iTotalPrefix.Locate('#');
hgs
parents:
diff changeset
   798
                }
hgs
parents:
diff changeset
   799
    
hgs
parents:
diff changeset
   800
            // add the file extension
hgs
parents:
diff changeset
   801
            iTotalPrefix.Append(KTraceFileExtension);
hgs
parents:
diff changeset
   802
hgs
parents:
diff changeset
   803
            // search for files with different indices
hgs
parents:
diff changeset
   804
            // until a free filename is found
hgs
parents:
diff changeset
   805
            while(result != KErrNotFound)
hgs
parents:
diff changeset
   806
                {
hgs
parents:
diff changeset
   807
                fileNameBuf.Zero();
hgs
parents:
diff changeset
   808
                // start with the original prefix
hgs
parents:
diff changeset
   809
                fileNameBuf.Append(iTotalPrefix);
hgs
parents:
diff changeset
   810
                // convert the number to a descriptor
hgs
parents:
diff changeset
   811
                number.Num(index);
hgs
parents:
diff changeset
   812
                // replace the hashmark with the real number
hgs
parents:
diff changeset
   813
                fileNameBuf.Replace(hashLocation,1,number);
hgs
parents:
diff changeset
   814
                
hgs
parents:
diff changeset
   815
                // make a copy to the iFileNameStream descriptor
hgs
parents:
diff changeset
   816
                iFileNameStream.Zero();
hgs
parents:
diff changeset
   817
                CnvUtfConverter::ConvertToUnicodeFromUtf8(iFileNameStream, fileNameBuf);
hgs
parents:
diff changeset
   818
                
hgs
parents:
diff changeset
   819
                LOGSTRING2("CProfiler::HandleGeneralSettingsChange() - trying to open files %S ",&iFileNameStream);
hgs
parents:
diff changeset
   820
hgs
parents:
diff changeset
   821
                if((result = parse.Set(iFileNameStream, NULL, NULL)) != KErrNone)
hgs
parents:
diff changeset
   822
                    {
hgs
parents:
diff changeset
   823
                    // break loop if fails, problems in file name => change to log into debug output
hgs
parents:
diff changeset
   824
                    break;
hgs
parents:
diff changeset
   825
                    }
hgs
parents:
diff changeset
   826
                
hgs
parents:
diff changeset
   827
                // create directory for trace files if not exists
hgs
parents:
diff changeset
   828
                result = fileServer.MkDirAll(parse.FullName());
hgs
parents:
diff changeset
   829
hgs
parents:
diff changeset
   830
                // check that file server responded with KErrNone or KErrAlreadyExists
hgs
parents:
diff changeset
   831
                if( result != KErrNone && result != KErrAlreadyExists)
hgs
parents:
diff changeset
   832
                    {
hgs
parents:
diff changeset
   833
                    // if some other result, e.g. memory full => break
hgs
parents:
diff changeset
   834
                    break;
hgs
parents:
diff changeset
   835
                    }
hgs
parents:
diff changeset
   836
hgs
parents:
diff changeset
   837
                // attempt opening the file
hgs
parents:
diff changeset
   838
                result = file.Open(fileServer,parse.FullName(),EFileShareReadersOnly);
hgs
parents:
diff changeset
   839
                if(result != KErrNotFound)
hgs
parents:
diff changeset
   840
                    {
hgs
parents:
diff changeset
   841
                    if( result != KErrNotReady && 
hgs
parents:
diff changeset
   842
                        result != KErrServerBusy ) 
hgs
parents:
diff changeset
   843
                        {
hgs
parents:
diff changeset
   844
                        // close the file if it could be opened
hgs
parents:
diff changeset
   845
                        LOGSTRING2("Found STREAM file with index %d",index);
hgs
parents:
diff changeset
   846
                        index++;
hgs
parents:
diff changeset
   847
                        }
hgs
parents:
diff changeset
   848
                    else 
hgs
parents:
diff changeset
   849
                        {
hgs
parents:
diff changeset
   850
                        // in boot measurements the file system might not be ready yet.
hgs
parents:
diff changeset
   851
                        LOGSTRING2("Problem in opening STREAM file %d",index);
hgs
parents:
diff changeset
   852
                        }
hgs
parents:
diff changeset
   853
                    file.Close();
hgs
parents:
diff changeset
   854
                    }
hgs
parents:
diff changeset
   855
                } // while
hgs
parents:
diff changeset
   856
            }
hgs
parents:
diff changeset
   857
        else
hgs
parents:
diff changeset
   858
            {
hgs
parents:
diff changeset
   859
            // return error code
hgs
parents:
diff changeset
   860
            return result;
hgs
parents:
diff changeset
   861
            }
hgs
parents:
diff changeset
   862
        
hgs
parents:
diff changeset
   863
        TUint32 id(iWriterHandler->GetActiveWriter()->GetWriterType());
hgs
parents:
diff changeset
   864
        
hgs
parents:
diff changeset
   865
        // check if a file name is one that does not exist and selected plugin is disk writer
hgs
parents:
diff changeset
   866
        if(result == KErrNotFound && id == KDiskWriterPluginUid.iUid)
hgs
parents:
diff changeset
   867
            {
hgs
parents:
diff changeset
   868
            // write right trace data file name to disk writer plugin
hgs
parents:
diff changeset
   869
            iWriterHandler->SetPluginSettings( KDiskWriterPluginUid, iFileNameStream );
hgs
parents:
diff changeset
   870
            }
hgs
parents:
diff changeset
   871
        else
hgs
parents:
diff changeset
   872
            {
hgs
parents:
diff changeset
   873
            // return error if could not create trace log file
hgs
parents:
diff changeset
   874
            return result;
hgs
parents:
diff changeset
   875
            }
hgs
parents:
diff changeset
   876
        // close file server
hgs
parents:
diff changeset
   877
        fileServer.Close();
hgs
parents:
diff changeset
   878
        }   // if output == KOutputToDebugOutput
hgs
parents:
diff changeset
   879
    return KErrNone;
hgs
parents:
diff changeset
   880
    }
hgs
parents:
diff changeset
   881
hgs
parents:
diff changeset
   882
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   883
void CProfiler::HandleTimerExpiresL(TInt aError)
hgs
parents:
diff changeset
   884
    {
hgs
parents:
diff changeset
   885
    LOGSTRING2("CProfiler::HandleTimerExpiresL - Error: %d", aError);
hgs
parents:
diff changeset
   886
    this->ControlL(RProfiler::EStopSampling);
hgs
parents:
diff changeset
   887
    if( CPServer::iClientCount <= 0 )
hgs
parents:
diff changeset
   888
        {
hgs
parents:
diff changeset
   889
        LOGSTRING("CProfiler::HandleTimerExpiresL - No clients attached, shutting down server...");
hgs
parents:
diff changeset
   890
        this->ControlL(RProfiler::EExitProfiler);                
hgs
parents:
diff changeset
   891
        }
hgs
parents:
diff changeset
   892
    }
hgs
parents:
diff changeset
   893
hgs
parents:
diff changeset
   894
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   895
void CProfiler::SaveSettingsL()
hgs
parents:
diff changeset
   896
    {
hgs
parents:
diff changeset
   897
    LOGTEXT(_L("CProfiler::SaveSettings()"));
hgs
parents:
diff changeset
   898
    
hgs
parents:
diff changeset
   899
    // local literal
hgs
parents:
diff changeset
   900
    _LIT(KGeneralHeader, "[general]");
hgs
parents:
diff changeset
   901
    _LIT(KVersionHeader, "version");
hgs
parents:
diff changeset
   902
    _LIT8(KPIProfilerSettingsHeader, "; PI Profiler Settings File");
hgs
parents:
diff changeset
   903
    _LIT8(KGeneralSettingsHeader, "; general settings");
hgs
parents:
diff changeset
   904
    _LIT8(KOutputFileDescription,"; \"output_type=file_system\" writes *.dat file to external memory");
hgs
parents:
diff changeset
   905
    _LIT8(KOutputDebugDescription,"; \"output_type=debug_output\" writes *.dat file to debug port");
hgs
parents:
diff changeset
   906
    _LIT8(KOutputFilePrefixDescription,"; if writing to file, prefix of the *.dat file\r\n; first '#' in the prefix is replaced with an integer");
hgs
parents:
diff changeset
   907
    _LIT8(KOutputSaveDriveDescription,"; if writing to file, the location to store the *.dat file");
hgs
parents:
diff changeset
   908
    _LIT8(KTimedProfilingPeriod,"; period (in seconds) used when using timed profiling");
hgs
parents:
diff changeset
   909
    
hgs
parents:
diff changeset
   910
    RFs fs;
hgs
parents:
diff changeset
   911
    RFile settingsFile;
hgs
parents:
diff changeset
   912
    TInt err(KErrNone);
hgs
parents:
diff changeset
   913
    TBuf8<384> line;
hgs
parents:
diff changeset
   914
    
hgs
parents:
diff changeset
   915
    // connect to file server
hgs
parents:
diff changeset
   916
    err = fs.Connect();
hgs
parents:
diff changeset
   917
    if( err != KErrNone )
62
hgs
parents: 51
diff changeset
   918
    {
51
hgs
parents:
diff changeset
   919
        // failed to write settings to settings file
62
hgs
parents: 51
diff changeset
   920
        RDebug::Printf("FS connect failed");
51
hgs
parents:
diff changeset
   921
        return;
62
hgs
parents: 51
diff changeset
   922
    }
51
hgs
parents:
diff changeset
   923
    
hgs
parents:
diff changeset
   924
    // create and set the private path
hgs
parents:
diff changeset
   925
    fs.CreatePrivatePath(EDriveC);
hgs
parents:
diff changeset
   926
    fs.SetSessionToPrivate(EDriveC);
hgs
parents:
diff changeset
   927
  
hgs
parents:
diff changeset
   928
    // create the new settings file
hgs
parents:
diff changeset
   929
    err = settingsFile.Replace(fs, iSettingsFileLocation, EFileWrite);
hgs
parents:
diff changeset
   930
    if(err != KErrNone)
62
hgs
parents: 51
diff changeset
   931
        {
hgs
parents: 51
diff changeset
   932
        RDebug::Printf("Settingsfile replace failed");
hgs
parents: 51
diff changeset
   933
        fs.Close();
hgs
parents: 51
diff changeset
   934
        return;     
hgs
parents: 51
diff changeset
   935
        }
51
hgs
parents:
diff changeset
   936
    
hgs
parents:
diff changeset
   937
    // write the header
hgs
parents:
diff changeset
   938
    line.Copy(KPIProfilerSettingsHeader);
hgs
parents:
diff changeset
   939
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   940
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   941
    settingsFile.Write(line);
hgs
parents:
diff changeset
   942
    
hgs
parents:
diff changeset
   943
    // write the header
hgs
parents:
diff changeset
   944
    line.Copy(KGeneralSettingsHeader);
hgs
parents:
diff changeset
   945
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   946
    settingsFile.Write(line);
hgs
parents:
diff changeset
   947
hgs
parents:
diff changeset
   948
    // write all generic settings
hgs
parents:
diff changeset
   949
    line.Copy(KGeneralHeader);
hgs
parents:
diff changeset
   950
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   951
    settingsFile.Write(line);
hgs
parents:
diff changeset
   952
hgs
parents:
diff changeset
   953
    // write version info
hgs
parents:
diff changeset
   954
    line.Copy(KVersionHeader);
hgs
parents:
diff changeset
   955
    line.Append(KEquals);
hgs
parents:
diff changeset
   956
    line.Append(PROFILER_VERSION_SHORT);
hgs
parents:
diff changeset
   957
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   958
    settingsFile.Write(line);
hgs
parents:
diff changeset
   959
hgs
parents:
diff changeset
   960
    // output explanation
hgs
parents:
diff changeset
   961
    line.Copy(KOutputFileDescription);
hgs
parents:
diff changeset
   962
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   963
    line.Append(KOutputDebugDescription);
hgs
parents:
diff changeset
   964
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   965
    settingsFile.Write(line);
hgs
parents:
diff changeset
   966
    
hgs
parents:
diff changeset
   967
    // write trace output
hgs
parents:
diff changeset
   968
    line.Copy(KGenericTraceOutput);
hgs
parents:
diff changeset
   969
    line.Append(KEquals);
hgs
parents:
diff changeset
   970
    line.Append(iGeneralAttributes.iTraceOutput);
hgs
parents:
diff changeset
   971
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   972
    settingsFile.Write(line);
hgs
parents:
diff changeset
   973
    
hgs
parents:
diff changeset
   974
    // file prefix explanation
hgs
parents:
diff changeset
   975
    line.Copy(KOutputFilePrefixDescription);
hgs
parents:
diff changeset
   976
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   977
    settingsFile.Write(line);
hgs
parents:
diff changeset
   978
hgs
parents:
diff changeset
   979
    // write trace file prefix
hgs
parents:
diff changeset
   980
    line.Copy(KGenericTraceFilePrefix);
hgs
parents:
diff changeset
   981
    line.Append(KEquals);
hgs
parents:
diff changeset
   982
    line.Append(iGeneralAttributes.iTraceFilePrefix);
hgs
parents:
diff changeset
   983
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   984
    settingsFile.Write(line);
hgs
parents:
diff changeset
   985
    
hgs
parents:
diff changeset
   986
    // file prefix explanation
hgs
parents:
diff changeset
   987
    line.Copy(KOutputSaveDriveDescription);
hgs
parents:
diff changeset
   988
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   989
    settingsFile.Write(line);
hgs
parents:
diff changeset
   990
hgs
parents:
diff changeset
   991
    // write trace file location
hgs
parents:
diff changeset
   992
    line.Copy(KGenericTraceFileSaveDrive);
hgs
parents:
diff changeset
   993
    line.Append(KEquals);
hgs
parents:
diff changeset
   994
    line.Append(iGeneralAttributes.iSaveFileDrive);
hgs
parents:
diff changeset
   995
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
   996
    settingsFile.Write(line);
hgs
parents:
diff changeset
   997
    
hgs
parents:
diff changeset
   998
    // timed profiling period explanation
hgs
parents:
diff changeset
   999
    line.Copy(KTimedProfilingPeriod);
hgs
parents:
diff changeset
  1000
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
  1001
    settingsFile.Write(line);
hgs
parents:
diff changeset
  1002
    
hgs
parents:
diff changeset
  1003
    // Write timed profiling period value
hgs
parents:
diff changeset
  1004
    line.Copy(KGenericTimedProfilingPeriod);
hgs
parents:
diff changeset
  1005
    line.Append(KEquals);
hgs
parents:
diff changeset
  1006
    TBuf<16> tmpNum;
hgs
parents:
diff changeset
  1007
    tmpNum.AppendNum(iGeneralAttributes.iTimedSamplingPeriod);
hgs
parents:
diff changeset
  1008
    line.Append(tmpNum);
hgs
parents:
diff changeset
  1009
    line.Append(KNewLineSeparator);
hgs
parents:
diff changeset
  1010
    settingsFile.Write(line);
hgs
parents:
diff changeset
  1011
        
hgs
parents:
diff changeset
  1012
    // reset the default attributes array
hgs
parents:
diff changeset
  1013
    iDefaultSamplerAttributesArray->Reset();
hgs
parents:
diff changeset
  1014
    
hgs
parents:
diff changeset
  1015
    // update the latest changes from plugins
hgs
parents:
diff changeset
  1016
    iSamplerHandler->GetSamplerAttributesL(iDefaultSamplerAttributesArray);
hgs
parents:
diff changeset
  1017
    
hgs
parents:
diff changeset
  1018
    // call CSamplerController to write all sampler settings
hgs
parents:
diff changeset
  1019
    iSamplerHandler->ComposeAttributesToSettingsFileFormat(settingsFile, iDefaultSamplerAttributesArray);
hgs
parents:
diff changeset
  1020
    
62
hgs
parents: 51
diff changeset
  1021
    settingsFile.Close();
51
hgs
parents:
diff changeset
  1022
    // close file
hgs
parents:
diff changeset
  1023
    fs.Close();
hgs
parents:
diff changeset
  1024
    }
hgs
parents:
diff changeset
  1025
hgs
parents:
diff changeset
  1026
TInt CProfiler::CheckOldProfilerRunning()
hgs
parents:
diff changeset
  1027
    {
hgs
parents:
diff changeset
  1028
    TFindProcess procName;
hgs
parents:
diff changeset
  1029
    procName.Find(_L("BappeaProf.exe*"));
hgs
parents:
diff changeset
  1030
    TFullName aResult;
hgs
parents:
diff changeset
  1031
    TInt err(KErrNone);
hgs
parents:
diff changeset
  1032
    RProcess proc;    
hgs
parents:
diff changeset
  1033
    
hgs
parents:
diff changeset
  1034
    // now check if old Profiler is still running on
hgs
parents:
diff changeset
  1035
    err = procName.Next(aResult);
hgs
parents:
diff changeset
  1036
    // check if old profiler process found 
hgs
parents:
diff changeset
  1037
    if(err == KErrNone)
hgs
parents:
diff changeset
  1038
        {
hgs
parents:
diff changeset
  1039
        // other process found, i.e. right process to communicate with, in case started from eshell
hgs
parents:
diff changeset
  1040
        err = proc.Open(procName);
hgs
parents:
diff changeset
  1041
        if(err == KErrNone)
hgs
parents:
diff changeset
  1042
            {
hgs
parents:
diff changeset
  1043
            if(proc.ExitCategory().Length() > 0)
hgs
parents:
diff changeset
  1044
                {
hgs
parents:
diff changeset
  1045
                proc.Close();
hgs
parents:
diff changeset
  1046
                // process already exited => create a new one
hgs
parents:
diff changeset
  1047
                return KErrNotFound;
hgs
parents:
diff changeset
  1048
                }
hgs
parents:
diff changeset
  1049
            proc.Close();
hgs
parents:
diff changeset
  1050
            }
hgs
parents:
diff changeset
  1051
        // return error for error handling
hgs
parents:
diff changeset
  1052
        return KErrAlreadyExists;
hgs
parents:
diff changeset
  1053
        }
hgs
parents:
diff changeset
  1054
    return err;
hgs
parents:
diff changeset
  1055
    }
hgs
parents:
diff changeset
  1056
hgs
parents:
diff changeset
  1057
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1058
void CProfiler::HandleError(TInt aErr)
hgs
parents:
diff changeset
  1059
    {
hgs
parents:
diff changeset
  1060
    // write error to status property to inform requester
hgs
parents:
diff changeset
  1061
    TInt err(iEngineStatus.Set(KEngineStatusPropertyCat, EProfilerEngineStatus, aErr));
hgs
parents:
diff changeset
  1062
    if(err != KErrNone)
hgs
parents:
diff changeset
  1063
        RDebug::Print(_L("CProfiler::HandleError() - error setting status: %d"), err);
hgs
parents:
diff changeset
  1064
    }
hgs
parents:
diff changeset
  1065
hgs
parents:
diff changeset
  1066
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1067
TInt CProfiler::ControlDataL(TInt aCommand,TAny* value1,TAny* /*value2*/)
hgs
parents:
diff changeset
  1068
    {
hgs
parents:
diff changeset
  1069
	LOGSTRING3("CProfiler::ControlData %d, 0x%x",aCommand,value1);
hgs
parents:
diff changeset
  1070
hgs
parents:
diff changeset
  1071
	_LIT(KDebugOutput, "debug_output");
hgs
parents:
diff changeset
  1072
	_LIT(KFileOutput, "file_system");
hgs
parents:
diff changeset
  1073
	_LIT8(KOutputToDebugOutput, "debug_output");
hgs
parents:
diff changeset
  1074
	
hgs
parents:
diff changeset
  1075
	TDes* desc;
hgs
parents:
diff changeset
  1076
	TPtrC ptrDesc;
hgs
parents:
diff changeset
  1077
	
hgs
parents:
diff changeset
  1078
	switch(aCommand)
hgs
parents:
diff changeset
  1079
	    {
hgs
parents:
diff changeset
  1080
		// new controls
hgs
parents:
diff changeset
  1081
	    case RProfiler::EGetFileName:
hgs
parents:
diff changeset
  1082
	        {
hgs
parents:
diff changeset
  1083
            LOGTEXT(_L("Profiler::EGetFileName - start"));
hgs
parents:
diff changeset
  1084
            LOGSTRING2("Profiler::EGetFileName - total file name is: %S",(TDes*)value1);
hgs
parents:
diff changeset
  1085
            desc = (TDes*)value1;
hgs
parents:
diff changeset
  1086
            desc->Zero();
hgs
parents:
diff changeset
  1087
            desc->Append(iFileNameStream);
hgs
parents:
diff changeset
  1088
            LOGSTRING2("Profiler::EGetFileName - now total file name is: %S",(TDes*)value1);
hgs
parents:
diff changeset
  1089
            return KErrNone;
hgs
parents:
diff changeset
  1090
	        }
hgs
parents:
diff changeset
  1091
        case RProfiler::EGetActiveWriter:
hgs
parents:
diff changeset
  1092
            {
hgs
parents:
diff changeset
  1093
            LOGTEXT(_L("Profiler::EGetActiveWriter - start"));
hgs
parents:
diff changeset
  1094
            desc = (TDes*)value1;
hgs
parents:
diff changeset
  1095
            desc->Zero();
hgs
parents:
diff changeset
  1096
            if(iGeneralAttributes.iTraceOutput.CompareF(KOutputToDebugOutput) == 0)
hgs
parents:
diff changeset
  1097
                {
hgs
parents:
diff changeset
  1098
                desc->Append(KDebugOutput);
hgs
parents:
diff changeset
  1099
                }
hgs
parents:
diff changeset
  1100
            else
hgs
parents:
diff changeset
  1101
                {
hgs
parents:
diff changeset
  1102
                desc->Append(KFileOutput);
hgs
parents:
diff changeset
  1103
                }
hgs
parents:
diff changeset
  1104
            return KErrNone;
hgs
parents:
diff changeset
  1105
            }
hgs
parents:
diff changeset
  1106
	    }
hgs
parents:
diff changeset
  1107
hgs
parents:
diff changeset
  1108
	return KErrNone;
hgs
parents:
diff changeset
  1109
    }
hgs
parents:
diff changeset
  1110
hgs
parents:
diff changeset
  1111
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1112
TInt CProfiler::ControlL(TInt aCommand)
hgs
parents:
diff changeset
  1113
    {
hgs
parents:
diff changeset
  1114
	LOGSTRING2("CProfiler::Control - Controlling ProfilerEngine %d",aCommand);
hgs
parents:
diff changeset
  1115
	TInt err(KErrNone);
hgs
parents:
diff changeset
  1116
	
hgs
parents:
diff changeset
  1117
	switch (aCommand)
hgs
parents:
diff changeset
  1118
	    {
hgs
parents:
diff changeset
  1119
		case RProfiler::EStartSampling:
hgs
parents:
diff changeset
  1120
		case RProfiler::EStartTimedSampling:
hgs
parents:
diff changeset
  1121
		    {
hgs
parents:
diff changeset
  1122
		    // check first if old Profiler already running
hgs
parents:
diff changeset
  1123
		    err = CheckOldProfilerRunning();
hgs
parents:
diff changeset
  1124
		    if(err == KErrAlreadyExists)
hgs
parents:
diff changeset
  1125
		        {
hgs
parents:
diff changeset
  1126
		        // if exists do not start a profiling process since corrupts the collected trace data  
hgs
parents:
diff changeset
  1127
		        HandleError(err);
hgs
parents:
diff changeset
  1128
		        err = KErrNone;
hgs
parents:
diff changeset
  1129
		        return err;
hgs
parents:
diff changeset
  1130
		        }
hgs
parents:
diff changeset
  1131
		    
hgs
parents:
diff changeset
  1132
		    // save settings before launching the profiler
hgs
parents:
diff changeset
  1133
		    // reason: the profiling may have set to the background => need for get right settings
hgs
parents:
diff changeset
  1134
		    SaveSettingsL();
hgs
parents:
diff changeset
  1135
		    
hgs
parents:
diff changeset
  1136
		    // set the general settings to writer plugins to reflect the latest changes
hgs
parents:
diff changeset
  1137
		    err = HandleGeneralSettingsChange();
hgs
parents:
diff changeset
  1138
		    if(err == KErrNone)
hgs
parents:
diff changeset
  1139
		        {
hgs
parents:
diff changeset
  1140
                // reset the buffers before new profiling
hgs
parents:
diff changeset
  1141
                iUserStream->ResetBuffers();
hgs
parents:
diff changeset
  1142
    
hgs
parents:
diff changeset
  1143
                // give the CProfilerSampleStream a handle to current writer
hgs
parents:
diff changeset
  1144
                iUserStream->SetWriter(*iWriterHandler->GetActiveWriter());
hgs
parents:
diff changeset
  1145
                
hgs
parents:
diff changeset
  1146
                // set initially debug output writer active
hgs
parents:
diff changeset
  1147
                err = iWriterHandler->StartSelectedPlugin();
hgs
parents:
diff changeset
  1148
    
hgs
parents:
diff changeset
  1149
                // check that writer plugin started
hgs
parents:
diff changeset
  1150
                if(err != KErrNone)
hgs
parents:
diff changeset
  1151
                    {
hgs
parents:
diff changeset
  1152
                    // if not started handle error
hgs
parents:
diff changeset
  1153
                    HandleError(err);
hgs
parents:
diff changeset
  1154
                    }
hgs
parents:
diff changeset
  1155
                else
hgs
parents:
diff changeset
  1156
                    {
hgs
parents:
diff changeset
  1157
                    // start activated sampler plug-in, NOTE: plugins check if errors occur in startup for some reason
hgs
parents:
diff changeset
  1158
                    iSamplerHandler->StartSamplerPluginsL();
hgs
parents:
diff changeset
  1159
        
hgs
parents:
diff changeset
  1160
                    // set engine state P&S property to running, e.g. for PIProfiler UI to read
hgs
parents:
diff changeset
  1161
                    iState = RProfiler::ERunning;
hgs
parents:
diff changeset
  1162
        
hgs
parents:
diff changeset
  1163
                    // set the engine into running mode
hgs
parents:
diff changeset
  1164
                    iEngineStatus.Set(iState);
hgs
parents:
diff changeset
  1165
                    }
hgs
parents:
diff changeset
  1166
                }
hgs
parents:
diff changeset
  1167
		    else
hgs
parents:
diff changeset
  1168
		        {
hgs
parents:
diff changeset
  1169
		        // handle error and notify requester
hgs
parents:
diff changeset
  1170
		        HandleError(err);
hgs
parents:
diff changeset
  1171
		        }
hgs
parents:
diff changeset
  1172
		    
hgs
parents:
diff changeset
  1173
		    if( aCommand == RProfiler::EStartTimedSampling )
hgs
parents:
diff changeset
  1174
		        {
hgs
parents:
diff changeset
  1175
                iTimer->After(iGeneralAttributes.iTimedSamplingPeriod);
hgs
parents:
diff changeset
  1176
                LOGTEXT(_L("CProfiler::Control - Finished processing EStartTimedSampling!"));
hgs
parents:
diff changeset
  1177
		        }
hgs
parents:
diff changeset
  1178
		    else
hgs
parents:
diff changeset
  1179
		        {
hgs
parents:
diff changeset
  1180
                LOGTEXT(_L("CProfiler::Control - Finished processing EStartSampling!"));
hgs
parents:
diff changeset
  1181
		        }
hgs
parents:
diff changeset
  1182
hgs
parents:
diff changeset
  1183
			return err;
hgs
parents:
diff changeset
  1184
		    }
hgs
parents:
diff changeset
  1185
		case RProfiler::EStopSampling:
hgs
parents:
diff changeset
  1186
			LOGTEXT(_L("CProfiler::Control - Starting to stop sampling..."));
hgs
parents:
diff changeset
  1187
			// stop sampler plugins
hgs
parents:
diff changeset
  1188
			if(iState == RProfiler::ERunning)
hgs
parents:
diff changeset
  1189
				{
hgs
parents:
diff changeset
  1190
				iState = RProfiler::EStopping;
hgs
parents:
diff changeset
  1191
				iEngineStatus.Set(RProfiler::EStopping);
hgs
parents:
diff changeset
  1192
				
hgs
parents:
diff changeset
  1193
				iSamplerHandler->StopSamplerPlugins();
hgs
parents:
diff changeset
  1194
	
hgs
parents:
diff changeset
  1195
				// finalize the filled buffer writing
hgs
parents:
diff changeset
  1196
				iUserStream->Finalise();
hgs
parents:
diff changeset
  1197
				
hgs
parents:
diff changeset
  1198
				// stop output plugin and write the rest of the trace data to output
hgs
parents:
diff changeset
  1199
				LOGTEXT(_L("CProfiler::Control - stopping writer"));
hgs
parents:
diff changeset
  1200
				iWriterHandler->StopSelectedPlugin();
hgs
parents:
diff changeset
  1201
	
hgs
parents:
diff changeset
  1202
				// set engine state P&S property idle 
hgs
parents:
diff changeset
  1203
				iState = RProfiler::EIdle;
hgs
parents:
diff changeset
  1204
				iEngineStatus.Set(RProfiler::EIdle);
hgs
parents:
diff changeset
  1205
				
hgs
parents:
diff changeset
  1206
				LOGSTRING2("CProfiler::Control - sampling stopped, going to state %d", RProfiler::EIdle);
hgs
parents:
diff changeset
  1207
				}
hgs
parents:
diff changeset
  1208
			return KErrNone;
hgs
parents:
diff changeset
  1209
hgs
parents:
diff changeset
  1210
		case RProfiler::EExitProfiler:
hgs
parents:
diff changeset
  1211
		    {
hgs
parents:
diff changeset
  1212
		    // save settings into settings file when exiting
hgs
parents:
diff changeset
  1213
		    SaveSettingsL();
hgs
parents:
diff changeset
  1214
hgs
parents:
diff changeset
  1215
            if(iUserStream)
hgs
parents:
diff changeset
  1216
                {
hgs
parents:
diff changeset
  1217
                delete iUserStream;
hgs
parents:
diff changeset
  1218
                iUserStream = NULL;
hgs
parents:
diff changeset
  1219
                }
hgs
parents:
diff changeset
  1220
		    
hgs
parents:
diff changeset
  1221
            // set engine state P&S property idle 
hgs
parents:
diff changeset
  1222
            iState = RProfiler::EIdle;
hgs
parents:
diff changeset
  1223
            iEngineStatus.Set(RProfiler::EIdle);
hgs
parents:
diff changeset
  1224
               
hgs
parents:
diff changeset
  1225
            LOGTEXT(_L("Stopping Activer Scheduler"));
hgs
parents:
diff changeset
  1226
            CActiveScheduler::Stop();
hgs
parents:
diff changeset
  1227
            LOGTEXT(_L("Stopped Activer Scheduler"));
hgs
parents:
diff changeset
  1228
hgs
parents:
diff changeset
  1229
            return KErrNone;
hgs
parents:
diff changeset
  1230
		    }
hgs
parents:
diff changeset
  1231
		    
hgs
parents:
diff changeset
  1232
		case RProfiler::EAttachClient:
hgs
parents:
diff changeset
  1233
		    {
hgs
parents:
diff changeset
  1234
		    // Increase client reference count
hgs
parents:
diff changeset
  1235
		    ++CPServer::iClientCount;
hgs
parents:
diff changeset
  1236
		    LOGSTRING2("Increased client reference count to: %d", CPServer::iClientCount);
hgs
parents:
diff changeset
  1237
		    return KErrNone;
hgs
parents:
diff changeset
  1238
		    }
hgs
parents:
diff changeset
  1239
		case RProfiler::ERemoveClient:
hgs
parents:
diff changeset
  1240
		    {
hgs
parents:
diff changeset
  1241
		    // Decrease client reference count
hgs
parents:
diff changeset
  1242
		    --CPServer::iClientCount;
hgs
parents:
diff changeset
  1243
		    LOGSTRING2("Decreasing client reference count to: %d", CPServer::iClientCount);
hgs
parents:
diff changeset
  1244
		    return KErrNone;
hgs
parents:
diff changeset
  1245
		    }
hgs
parents:
diff changeset
  1246
	    }
hgs
parents:
diff changeset
  1247
hgs
parents:
diff changeset
  1248
	LOGTEXT(_L("CProfiler::Control - returning"));
hgs
parents:
diff changeset
  1249
hgs
parents:
diff changeset
  1250
	return err;
hgs
parents:
diff changeset
  1251
    }
hgs
parents:
diff changeset
  1252
hgs
parents:
diff changeset
  1253
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1254
void CProfiler::Finalise()
hgs
parents:
diff changeset
  1255
    {	
hgs
parents:
diff changeset
  1256
	LOGTEXT(_L("CProfiler::Finalise - Finished processing EStopSampling!"));
hgs
parents:
diff changeset
  1257
    }
hgs
parents:
diff changeset
  1258
hgs
parents:
diff changeset
  1259
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1260
RProfiler::TSamplerState CProfiler::State() const
hgs
parents:
diff changeset
  1261
    {
hgs
parents:
diff changeset
  1262
	return iState;
hgs
parents:
diff changeset
  1263
    }
hgs
parents:
diff changeset
  1264
hgs
parents:
diff changeset
  1265
/*
hgs
parents:
diff changeset
  1266
 *
hgs
parents:
diff changeset
  1267
 *	Class CPServer definition
hgs
parents:
diff changeset
  1268
 *
hgs
parents:
diff changeset
  1269
 */
hgs
parents:
diff changeset
  1270
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1271
inline const CPServer& CPSession::Server() const
hgs
parents:
diff changeset
  1272
    {
hgs
parents:
diff changeset
  1273
	return *static_cast<const CPServer*>(CSession2::Server());
hgs
parents:
diff changeset
  1274
    }
hgs
parents:
diff changeset
  1275
hgs
parents:
diff changeset
  1276
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1277
void CPSession::ServiceL(const RMessage2& aMessage)
hgs
parents:
diff changeset
  1278
    {
hgs
parents:
diff changeset
  1279
	LOGTEXT(_L("CPSession::ServiceL - Starting to process message"));
hgs
parents:
diff changeset
  1280
	TInt err(KErrNone);
hgs
parents:
diff changeset
  1281
	
hgs
parents:
diff changeset
  1282
	if(aMessage.Function() == RProfiler::EGetGeneralAttributes)
hgs
parents:
diff changeset
  1283
	    {
hgs
parents:
diff changeset
  1284
	    Server().GetGeneralAttributesL(aMessage);
hgs
parents:
diff changeset
  1285
	    }
hgs
parents:
diff changeset
  1286
	else if(aMessage.Function() == RProfiler::ESetGeneralAttributes)
hgs
parents:
diff changeset
  1287
	    {
hgs
parents:
diff changeset
  1288
        Server().SetGeneralAttributesL(aMessage);
hgs
parents:
diff changeset
  1289
	    }
hgs
parents:
diff changeset
  1290
	else if(aMessage.Function() == RProfiler::EGetSamplerAttributes)
hgs
parents:
diff changeset
  1291
	    {
hgs
parents:
diff changeset
  1292
        Server().GetSamplerAttributesL(aMessage);
hgs
parents:
diff changeset
  1293
	    }
hgs
parents:
diff changeset
  1294
    else if(aMessage.Function() == RProfiler::EGetSamplerAttributeCount)
hgs
parents:
diff changeset
  1295
        {
hgs
parents:
diff changeset
  1296
        Server().GetSamplerAttributeCountL(aMessage);
hgs
parents:
diff changeset
  1297
        }
hgs
parents:
diff changeset
  1298
    else if(aMessage.Function() == RProfiler::ESetSamplerAttributes)
hgs
parents:
diff changeset
  1299
        {
hgs
parents:
diff changeset
  1300
        Server().SetSamplerAttributesL(aMessage);
hgs
parents:
diff changeset
  1301
        }
hgs
parents:
diff changeset
  1302
    else if(aMessage.Function() == RProfiler::ERefreshProfilerStatus)
hgs
parents:
diff changeset
  1303
        {
hgs
parents:
diff changeset
  1304
        Server().RefreshStatus(aMessage);
hgs
parents:
diff changeset
  1305
        }
hgs
parents:
diff changeset
  1306
	else if(aMessage.Ptr0() == 0 && aMessage.Ptr1() == 0 && aMessage.Ptr2() == 0)
hgs
parents:
diff changeset
  1307
		{	
hgs
parents:
diff changeset
  1308
		LOGTEXT(_L("Ptr0 && Ptr1 == 0 && Ptr2 == 0"));
hgs
parents:
diff changeset
  1309
		aMessage.Complete(Server().ControlL(RProfiler::TCommand(aMessage.Function())));
hgs
parents:
diff changeset
  1310
		LOGTEXT(_L("CPSession::ServiceL - Message completed"));
hgs
parents:
diff changeset
  1311
		} 
hgs
parents:
diff changeset
  1312
	else if(aMessage.Ptr0() != 0 && aMessage.Ptr1() != 0 && aMessage.Ptr2() != 0)
hgs
parents:
diff changeset
  1313
		{
hgs
parents:
diff changeset
  1314
		LOGTEXT(_L("Error with message, all pointers contain data!"));
hgs
parents:
diff changeset
  1315
		}
hgs
parents:
diff changeset
  1316
		
hgs
parents:
diff changeset
  1317
	else if (aMessage.Ptr0() != 0)
hgs
parents:
diff changeset
  1318
		{
hgs
parents:
diff changeset
  1319
		if(aMessage.Ptr1() == 0)
hgs
parents:
diff changeset
  1320
			{
hgs
parents:
diff changeset
  1321
			LOGTEXT(_L("ServiceL: Ptr0 != 0 && Ptr1 == 0"));
hgs
parents:
diff changeset
  1322
			// provided value is a descriptor
hgs
parents:
diff changeset
  1323
			TBuf<64>* dst = new TBuf<64>;
hgs
parents:
diff changeset
  1324
			aMessage.ReadL(0,*dst,0);
hgs
parents:
diff changeset
  1325
	
hgs
parents:
diff changeset
  1326
			err = Server().ControlDataL(aMessage.Function(),(TAny*)dst);
hgs
parents:
diff changeset
  1327
			delete dst;
hgs
parents:
diff changeset
  1328
			aMessage.Complete(err);
hgs
parents:
diff changeset
  1329
			LOGTEXT(_L("CPSession::ServiceL - Message completed"));
hgs
parents:
diff changeset
  1330
			}
hgs
parents:
diff changeset
  1331
		else
hgs
parents:
diff changeset
  1332
			{
hgs
parents:
diff changeset
  1333
			LOGTEXT(_L("ServiceL: Ptr0 != 0 && Ptr1 != 0"));
hgs
parents:
diff changeset
  1334
			// provided value is a descriptor
hgs
parents:
diff changeset
  1335
			TBuf<64>* dst = new TBuf<64>;
hgs
parents:
diff changeset
  1336
			aMessage.ReadL(0,*dst,0);
hgs
parents:
diff changeset
  1337
			
hgs
parents:
diff changeset
  1338
			TUint32 num1 = (TUint32)aMessage.Ptr1();
hgs
parents:
diff changeset
  1339
			
hgs
parents:
diff changeset
  1340
			err = Server().ControlDataL(aMessage.Function(),(TAny*)dst, (TAny*)num1);
hgs
parents:
diff changeset
  1341
			delete dst;
hgs
parents:
diff changeset
  1342
			aMessage.Complete(err);
hgs
parents:
diff changeset
  1343
			LOGTEXT(_L("CPSession::ServiceL - Message completed"));
hgs
parents:
diff changeset
  1344
			}
hgs
parents:
diff changeset
  1345
		}
hgs
parents:
diff changeset
  1346
	else if (aMessage.Ptr1() != 0)
hgs
parents:
diff changeset
  1347
		{
hgs
parents:
diff changeset
  1348
		LOGTEXT(_L("ServiceL: Ptr1 != 0"));
hgs
parents:
diff changeset
  1349
		// provided value is a TUint32
hgs
parents:
diff changeset
  1350
		if( ((TUint32)aMessage.Ptr3()) == 0xffffffff)
hgs
parents:
diff changeset
  1351
			{
hgs
parents:
diff changeset
  1352
			TUint32 num = (TUint32)aMessage.Ptr1();
hgs
parents:
diff changeset
  1353
			err = Server().ControlDataL(aMessage.Function(),(TAny*)num);
hgs
parents:
diff changeset
  1354
			aMessage.Complete(err);
hgs
parents:
diff changeset
  1355
			LOGTEXT(_L("CPSession::ServiceL - Message completed"));
hgs
parents:
diff changeset
  1356
			}
hgs
parents:
diff changeset
  1357
		else
hgs
parents:
diff changeset
  1358
			{
hgs
parents:
diff changeset
  1359
			LOGTEXT(_L("ServiceL: Ptr3 != 0xffffffff"));
hgs
parents:
diff changeset
  1360
			TUint32 num1 = (TUint32)aMessage.Ptr1();
hgs
parents:
diff changeset
  1361
			TUint32 num2 = (TUint32)aMessage.Ptr3();
hgs
parents:
diff changeset
  1362
			err = Server().ControlDataL(aMessage.Function(),(TAny*)num1,(TAny*)num2);
hgs
parents:
diff changeset
  1363
			aMessage.Complete(err);
hgs
parents:
diff changeset
  1364
			LOGTEXT(_L("CPSession::ServiceL - Message completed"));
hgs
parents:
diff changeset
  1365
			}
hgs
parents:
diff changeset
  1366
		}
hgs
parents:
diff changeset
  1367
	else if (aMessage.Ptr2() != 0)
hgs
parents:
diff changeset
  1368
		{
hgs
parents:
diff changeset
  1369
		// command requests for data, provided 
hgs
parents:
diff changeset
  1370
		// value should be a descriptor
hgs
parents:
diff changeset
  1371
		if( ((TUint32)aMessage.Ptr3()) == 0xffffffff)
hgs
parents:
diff changeset
  1372
			{
hgs
parents:
diff changeset
  1373
			LOGTEXT(_L("ServiceL: Ptr2 != 0 && Ptr3 == 0xffffffff"));
hgs
parents:
diff changeset
  1374
	
hgs
parents:
diff changeset
  1375
			TBuf<256>* src = new TBuf<256>;
hgs
parents:
diff changeset
  1376
			src->Zero();
hgs
parents:
diff changeset
  1377
			err = Server().ControlDataL(aMessage.Function(),(TAny*)src);
hgs
parents:
diff changeset
  1378
	
hgs
parents:
diff changeset
  1379
			LOGSTRING2("Got sampler data %S",src);
hgs
parents:
diff changeset
  1380
			
hgs
parents:
diff changeset
  1381
			aMessage.WriteL(2, *src, 0);
hgs
parents:
diff changeset
  1382
	
hgs
parents:
diff changeset
  1383
			delete src;
hgs
parents:
diff changeset
  1384
			aMessage.Complete(err);
hgs
parents:
diff changeset
  1385
			LOGTEXT(_L("CPSession::ServiceL - Message completed"));
hgs
parents:
diff changeset
  1386
			}
hgs
parents:
diff changeset
  1387
		else 
hgs
parents:
diff changeset
  1388
			{
hgs
parents:
diff changeset
  1389
			LOGTEXT(_L("ServiceL: Ptr2 != 0 && Ptr3 != 0xffffffff"));
hgs
parents:
diff changeset
  1390
			
hgs
parents:
diff changeset
  1391
			TUint32 num1 = (TUint32)aMessage.Ptr2();	// containing id
hgs
parents:
diff changeset
  1392
			TBuf<256>* buffer = new TBuf<256>;		// Text data, e.g. plug-in name or description
hgs
parents:
diff changeset
  1393
hgs
parents:
diff changeset
  1394
			LOGSTRING3("Getting data for sampler: 0x%X, buffer max len %d",num1, aMessage.GetDesMaxLength(3));
hgs
parents:
diff changeset
  1395
hgs
parents:
diff changeset
  1396
			err = Server().ControlDataL(aMessage.Function(), (TAny*)num1, (TAny*)buffer);
hgs
parents:
diff changeset
  1397
hgs
parents:
diff changeset
  1398
			LOGSTRING2("Got sampler data %S",&buffer);
hgs
parents:
diff changeset
  1399
			
hgs
parents:
diff changeset
  1400
			// write back to same parameter
hgs
parents:
diff changeset
  1401
			aMessage.WriteL(3, *buffer, 0);
hgs
parents:
diff changeset
  1402
			
hgs
parents:
diff changeset
  1403
			delete buffer;
hgs
parents:
diff changeset
  1404
			aMessage.Complete(err);
hgs
parents:
diff changeset
  1405
			LOGTEXT(_L("CPSession::ServiceL - Message completed"));	
hgs
parents:
diff changeset
  1406
			}
hgs
parents:
diff changeset
  1407
		}
hgs
parents:
diff changeset
  1408
	LOGTEXT(_L("CPSession::ServiceL - Message processed"));
hgs
parents:
diff changeset
  1409
    }
hgs
parents:
diff changeset
  1410
hgs
parents:
diff changeset
  1411
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1412
MProfilerController* CPServer::NewL(TInt aPriority, MProfilerEngine& aEngine)
hgs
parents:
diff changeset
  1413
    {
hgs
parents:
diff changeset
  1414
	LOGTEXT(_L("CPServer::NewL - Enter"));
hgs
parents:
diff changeset
  1415
	CPServer* self = new(ELeave) CPServer(aPriority, aEngine);
hgs
parents:
diff changeset
  1416
	CleanupStack::PushL(self);
hgs
parents:
diff changeset
  1417
	self->StartL(KProfilerName);
hgs
parents:
diff changeset
  1418
	CleanupStack::Pop();
62
hgs
parents: 51
diff changeset
  1419
	LOGTEXT(_L("CPServer::NewL - Exit "));
51
hgs
parents:
diff changeset
  1420
	return self;
hgs
parents:
diff changeset
  1421
    }
hgs
parents:
diff changeset
  1422
hgs
parents:
diff changeset
  1423
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1424
CPServer::CPServer(TInt aPriority, MProfilerEngine& aEngine)
hgs
parents:
diff changeset
  1425
	: CServer2(aPriority), MProfilerController(aEngine)
hgs
parents:
diff changeset
  1426
    {
hgs
parents:
diff changeset
  1427
hgs
parents:
diff changeset
  1428
    }
hgs
parents:
diff changeset
  1429
hgs
parents:
diff changeset
  1430
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1431
void CPServer::Release()
hgs
parents:
diff changeset
  1432
    {
hgs
parents:
diff changeset
  1433
	delete this;
hgs
parents:
diff changeset
  1434
    }
hgs
parents:
diff changeset
  1435
hgs
parents:
diff changeset
  1436
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1437
CSession2* CPServer::NewSessionL(const TVersion&,const RMessage2&) const
hgs
parents:
diff changeset
  1438
    {
hgs
parents:
diff changeset
  1439
	return new(ELeave) CPSession();
hgs
parents:
diff changeset
  1440
    }
hgs
parents:
diff changeset
  1441
hgs
parents:
diff changeset
  1442
/*
hgs
parents:
diff changeset
  1443
 *
hgs
parents:
diff changeset
  1444
 * Static methods for controlling the profiler
hgs
parents:
diff changeset
  1445
 * through command line
hgs
parents:
diff changeset
  1446
 *
hgs
parents:
diff changeset
  1447
 */
hgs
parents:
diff changeset
  1448
// --------------------------------------------------------------------------------------------
62
hgs
parents: 51
diff changeset
  1449
static void RunEngineServerL(const TDesC& aSettingsFile, TBool aBoot)
51
hgs
parents:
diff changeset
  1450
    {
62
hgs
parents: 51
diff changeset
  1451
	LOGSTRING("Profiler: RunEngineServerL() - Install active scheduler");
51
hgs
parents:
diff changeset
  1452
	CActiveScheduler* pS = new CActiveScheduler;
hgs
parents:
diff changeset
  1453
	CActiveScheduler::Install(pS);
62
hgs
parents: 51
diff changeset
  1454
	CProfiler* p = CProfiler::NewLC(aSettingsFile, aBoot);
hgs
parents: 51
diff changeset
  1455
	
hgs
parents: 51
diff changeset
  1456
	LOGSTRING("Profiler: RunEngineServerL() - Starting active scheduler");
51
hgs
parents:
diff changeset
  1457
	CActiveScheduler::Start();
hgs
parents:
diff changeset
  1458
	p->Finalise();
62
hgs
parents: 51
diff changeset
  1459
	LOGSTRING("Profiler: RunEngineServerL() - profiler finalised");
51
hgs
parents:
diff changeset
  1460
	CleanupStack::PopAndDestroy(p);
hgs
parents:
diff changeset
  1461
	delete pS;
62
hgs
parents: 51
diff changeset
  1462
	LOGSTRING("Profiler: RunEngineServerL() - done");
51
hgs
parents:
diff changeset
  1463
    }
hgs
parents:
diff changeset
  1464
hgs
parents:
diff changeset
  1465
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1466
static TInt TestSettingsFile(const TDesC& configFile)
hgs
parents:
diff changeset
  1467
    {
hgs
parents:
diff changeset
  1468
    RFs fs;
hgs
parents:
diff changeset
  1469
    LOGSTRING2("TestSettingsFile: entry %S", &configFile);
hgs
parents:
diff changeset
  1470
    // check if file server can be connected
hgs
parents:
diff changeset
  1471
    if (fs.Connect() != KErrNone)
hgs
parents:
diff changeset
  1472
        {
hgs
parents:
diff changeset
  1473
        LOGTEXT(_L("TestSettingsFile: could not connect file server"));
hgs
parents:
diff changeset
  1474
        // file server couldn't be connected, return false
hgs
parents:
diff changeset
  1475
        return KErrNotFound;
hgs
parents:
diff changeset
  1476
        }
hgs
parents:
diff changeset
  1477
hgs
parents:
diff changeset
  1478
    // check if config file name length is > 0
hgs
parents:
diff changeset
  1479
    if (configFile.Length() > 0)
hgs
parents:
diff changeset
  1480
        {
hgs
parents:
diff changeset
  1481
        LOGTEXT(_L("TestSettingsFile: checking location sanity"));
hgs
parents:
diff changeset
  1482
        // check sanity of settings file location
hgs
parents:
diff changeset
  1483
        if(BaflUtils::CheckFolder(fs, configFile) != KErrNone)
hgs
parents:
diff changeset
  1484
            {
hgs
parents:
diff changeset
  1485
            LOGTEXT(_L("TestSettingsFile: location sanity check failed"));
hgs
parents:
diff changeset
  1486
            fs.Close();
hgs
parents:
diff changeset
  1487
            return KErrGeneral;
hgs
parents:
diff changeset
  1488
            }
hgs
parents:
diff changeset
  1489
        }
hgs
parents:
diff changeset
  1490
    else
hgs
parents:
diff changeset
  1491
        {
hgs
parents:
diff changeset
  1492
        // configFile length 0, return false
hgs
parents:
diff changeset
  1493
        LOGTEXT(_L("TestSettingsFile: config file string null length"));
hgs
parents:
diff changeset
  1494
        fs.Close();
hgs
parents:
diff changeset
  1495
        return KErrNotFound;
hgs
parents:
diff changeset
  1496
        }
hgs
parents:
diff changeset
  1497
    // return true if tests passed
hgs
parents:
diff changeset
  1498
    LOGTEXT(_L("TestSettingsFile: exiting..."));
hgs
parents:
diff changeset
  1499
    fs.Close();
hgs
parents:
diff changeset
  1500
    return KErrNone;
hgs
parents:
diff changeset
  1501
    }
hgs
parents:
diff changeset
  1502
hgs
parents:
diff changeset
  1503
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1504
GLDEF_C TInt E32Main()
hgs
parents:
diff changeset
  1505
    {
62
hgs
parents: 51
diff changeset
  1506
    LOGSTRING("Profiler: E32Main()");
51
hgs
parents:
diff changeset
  1507
    // parse command line arguments 
hgs
parents:
diff changeset
  1508
    TBuf<256> c;
hgs
parents:
diff changeset
  1509
    TInt err(KErrNone);
62
hgs
parents: 51
diff changeset
  1510
    _LIT(KBootMeasurement,"*boot");
51
hgs
parents:
diff changeset
  1511
    
62
hgs
parents: 51
diff changeset
  1512
    TBool myBoot(EFalse);
51
hgs
parents:
diff changeset
  1513
    // copy the full command line with arguments into a buffer
hgs
parents:
diff changeset
  1514
    User::CommandLine(c);
hgs
parents:
diff changeset
  1515
62
hgs
parents: 51
diff changeset
  1516
    // parse command line for boot mode. filename boot
hgs
parents: 51
diff changeset
  1517
    
hgs
parents: 51
diff changeset
  1518
            
hgs
parents: 51
diff changeset
  1519
    if (c.Match(KBootMeasurement) != KErrNotFound)
hgs
parents: 51
diff changeset
  1520
       {
hgs
parents: 51
diff changeset
  1521
       LOGTEXT(_L("ParseCommandAndExecute Found keyword boot"));
hgs
parents: 51
diff changeset
  1522
       myBoot = ETrue;
hgs
parents: 51
diff changeset
  1523
       }    
hgs
parents: 51
diff changeset
  1524
    
hgs
parents: 51
diff changeset
  1525
    TBuf<256> temp;
hgs
parents: 51
diff changeset
  1526
    temp.Append(c);
hgs
parents: 51
diff changeset
  1527
    TLex lex(temp);
hgs
parents: 51
diff changeset
  1528
    lex.Mark();
hgs
parents: 51
diff changeset
  1529
    lex.SkipCharacters();
hgs
parents: 51
diff changeset
  1530
    
hgs
parents: 51
diff changeset
  1531
    TPtrC token;
51
hgs
parents:
diff changeset
  1532
    TBuf<256> fileName;
62
hgs
parents: 51
diff changeset
  1533
    
hgs
parents: 51
diff changeset
  1534
    if(lex.TokenLength() != 0)
51
hgs
parents:
diff changeset
  1535
        {
62
hgs
parents: 51
diff changeset
  1536
        TPtrC token = lex.MarkedToken();
hgs
parents: 51
diff changeset
  1537
        LOGSTRING2("E32 Main Token 1 %S",&token);
hgs
parents: 51
diff changeset
  1538
        fileName.Append(token); // only one settings param should be
hgs
parents: 51
diff changeset
  1539
        LOGSTRING3("Filename is #%S#, response %d 1", &fileName, err);
hgs
parents: 51
diff changeset
  1540
        err = TestSettingsFile(fileName);
hgs
parents: 51
diff changeset
  1541
        if(err != KErrNone)
hgs
parents: 51
diff changeset
  1542
            {
hgs
parents: 51
diff changeset
  1543
            LOGSTRING3("Filename is #%S#, response %d 2", &fileName, err);
hgs
parents: 51
diff changeset
  1544
            // settings file does not exist, copy null desc to file name
hgs
parents: 51
diff changeset
  1545
            fileName.Copy(KNullDesC);
hgs
parents: 51
diff changeset
  1546
            }
hgs
parents: 51
diff changeset
  1547
        }
hgs
parents: 51
diff changeset
  1548
    else
hgs
parents: 51
diff changeset
  1549
        {
hgs
parents: 51
diff changeset
  1550
        LOGTEXT(_L("E32 Main Problem 1 in parsing command line"));
51
hgs
parents:
diff changeset
  1551
        }
hgs
parents:
diff changeset
  1552
hgs
parents:
diff changeset
  1553
    // if no command line arguments found just start the profiler process
hgs
parents:
diff changeset
  1554
    __UHEAP_MARK;
hgs
parents:
diff changeset
  1555
    CTrapCleanup* cleanup = CTrapCleanup::New();
hgs
parents:
diff changeset
  1556
    TInt ret(KErrNoMemory);
62
hgs
parents: 51
diff changeset
  1557
    err = KErrNoMemory;
51
hgs
parents:
diff changeset
  1558
    if( cleanup )
hgs
parents:
diff changeset
  1559
        {
62
hgs
parents: 51
diff changeset
  1560
        TRAPD(err ,RunEngineServerL(fileName, myBoot));
hgs
parents: 51
diff changeset
  1561
        LOGSTRING3("Profiler: E32Main() - ret %d err %d", ret,err);
hgs
parents: 51
diff changeset
  1562
        if(err != KErrNone)
hgs
parents: 51
diff changeset
  1563
            {
hgs
parents: 51
diff changeset
  1564
            RDebug::Print(_L("if Profiler: E32Main() - ret %d err %d"), ret,err);
hgs
parents: 51
diff changeset
  1565
            ret = err;
hgs
parents: 51
diff changeset
  1566
            delete cleanup;
hgs
parents: 51
diff changeset
  1567
            }
hgs
parents: 51
diff changeset
  1568
        else
hgs
parents: 51
diff changeset
  1569
            {
hgs
parents: 51
diff changeset
  1570
            LOGSTRING3("else Profiler: E32Main() - ret %d err %d", ret,err);
hgs
parents: 51
diff changeset
  1571
            ret = err;
hgs
parents: 51
diff changeset
  1572
            delete cleanup;    
hgs
parents: 51
diff changeset
  1573
            }
51
hgs
parents:
diff changeset
  1574
        } 
hgs
parents:
diff changeset
  1575
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  1576
hgs
parents:
diff changeset
  1577
    return ret;
hgs
parents:
diff changeset
  1578
    } 
hgs
parents:
diff changeset
  1579
hgs
parents:
diff changeset
  1580