perfsrv/piprofiler/engine/src/ProfilerEshell.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
#include <f32file.h>
hgs
parents:
diff changeset
    19
#include <e32cons.h>
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include "ProfilerEshell.h"
hgs
parents:
diff changeset
    22
#include <piprofiler/ProfilerSession.h>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
_LIT(KProfilerEngineExe, "PIProfilerEngine.exe");
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
/*
hgs
parents:
diff changeset
    29
 *
hgs
parents:
diff changeset
    30
 * Static methods for controlling the profiler
hgs
parents:
diff changeset
    31
 * through command line
hgs
parents:
diff changeset
    32
 *
hgs
parents:
diff changeset
    33
 */
hgs
parents:
diff changeset
    34
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
    35
static void PrintUsageInfo(const TDesC& aAdditionalInfo)
hgs
parents:
diff changeset
    36
    {
hgs
parents:
diff changeset
    37
    _LIT(KConsoleName, "Console");
62
hgs
parents: 51
diff changeset
    38
    _LIT(KLegalNote, "PIProfiler Version 2.2.0.3 Copyright @ 2009 Nokia\n");
51
hgs
parents:
diff changeset
    39
    _LIT(KUsageNote, "Usage: PIProfiler [start/end/timed] settingsfile [time to run]\n");
hgs
parents:
diff changeset
    40
    _LIT(KExample, "Example: PIProfiler timed C:\\data\\piprofilersettings.txt 60\n");
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
    TRAP_IGNORE(CConsoleBase* console = Console::NewL(KConsoleName,TSize(KConsFullScreen,KConsFullScreen));
hgs
parents:
diff changeset
    43
        console->Printf(KLegalNote);
hgs
parents:
diff changeset
    44
        console->Printf(KUsageNote);
hgs
parents:
diff changeset
    45
        console->Printf(KExample);
hgs
parents:
diff changeset
    46
        console->Write(aAdditionalInfo);
hgs
parents:
diff changeset
    47
    
hgs
parents:
diff changeset
    48
        console->Printf(_L("\n[Press any key]"));
hgs
parents:
diff changeset
    49
        console->Getch();
hgs
parents:
diff changeset
    50
        delete console;);
hgs
parents:
diff changeset
    51
    }
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
    54
static TInt FindProcess()
hgs
parents:
diff changeset
    55
    {
hgs
parents:
diff changeset
    56
    TFindProcess procName;
hgs
parents:
diff changeset
    57
    procName.Find(_L("PIProfilerEngine.exe*"));
hgs
parents:
diff changeset
    58
    TFullName aResult;
hgs
parents:
diff changeset
    59
    
hgs
parents:
diff changeset
    60
    // find the first appearance, i.e. "myself"...
hgs
parents:
diff changeset
    61
    TInt err(procName.Next(aResult));  // the first appearance
hgs
parents:
diff changeset
    62
    if(err == KErrNotFound)
hgs
parents:
diff changeset
    63
        {
hgs
parents:
diff changeset
    64
        // now check if old Profiler is still running on
hgs
parents:
diff changeset
    65
        procName.Find(_L("BappeaProf.exe*"));
hgs
parents:
diff changeset
    66
        err = procName.Next(aResult);
hgs
parents:
diff changeset
    67
        // check if old profiler process found 
hgs
parents:
diff changeset
    68
        if(err == KErrNone)
hgs
parents:
diff changeset
    69
            {
hgs
parents:
diff changeset
    70
            // return error for error handling
hgs
parents:
diff changeset
    71
            return KErrAlreadyExists;
hgs
parents:
diff changeset
    72
            }
hgs
parents:
diff changeset
    73
        // return KErrNotFound and a new profiler engine process can be started
hgs
parents:
diff changeset
    74
        return KErrNotFound;
hgs
parents:
diff changeset
    75
        }
hgs
parents:
diff changeset
    76
    return err;
hgs
parents:
diff changeset
    77
    }
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
/**
hgs
parents:
diff changeset
    80
 * Function for starting profiler engine in the background,
hgs
parents:
diff changeset
    81
 * call profiler to load settings
hgs
parents:
diff changeset
    82
 * and start sampling process
hgs
parents:
diff changeset
    83
 * 
hgs
parents:
diff changeset
    84
 * @param configFile name and location of settings file
hgs
parents:
diff changeset
    85
 * @param aRunTimeInSeconds run time in seconds
hgs
parents:
diff changeset
    86
 * @param aBootTime run boot time sampling or not.
hgs
parents:
diff changeset
    87
 */
hgs
parents:
diff changeset
    88
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
    89
static TInt StartProfilerProcess(const TDesC& configFile, TInt aRunTimeInSeconds, TBool aBootTime)
hgs
parents:
diff changeset
    90
    {
hgs
parents:
diff changeset
    91
    TInt err(KErrNone);
hgs
parents:
diff changeset
    92
    RProcess proc;
hgs
parents:
diff changeset
    93
    TRequestStatus status = KRequestPending;
hgs
parents:
diff changeset
    94
    TBuf<256> conf;
hgs
parents:
diff changeset
    95
    conf.Zero();
hgs
parents:
diff changeset
    96
    conf.Append(configFile);
hgs
parents:
diff changeset
    97
    if(aBootTime)
hgs
parents:
diff changeset
    98
        {
62
hgs
parents: 51
diff changeset
    99
        RDebug::Printf("PIProfiler: StartProfilerProcess: boot time measurement");
51
hgs
parents:
diff changeset
   100
        conf.Append(_L(" "));
hgs
parents:
diff changeset
   101
        conf.Append(_L("boot"));
hgs
parents:
diff changeset
   102
        }
hgs
parents:
diff changeset
   103
    RDebug::RawPrint(conf);
62
hgs
parents: 51
diff changeset
   104
    RDebug::Printf("PIProfiler: StartProfilerProcess run time is %d", aRunTimeInSeconds);
51
hgs
parents:
diff changeset
   105
    // check if process exists
hgs
parents:
diff changeset
   106
    err = FindProcess();
hgs
parents:
diff changeset
   107
    LOGSTRING2("PIProfiler: tried to find process, response %d", err); 
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
    // check if already exists and don't start a new eshell profiling
hgs
parents:
diff changeset
   110
    if( err == KErrNotFound )
hgs
parents:
diff changeset
   111
        {
hgs
parents:
diff changeset
   112
        // try create new process
hgs
parents:
diff changeset
   113
        err = proc.Create(KProfilerEngineExe, conf);
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
        LOGSTRING2("PIProfiler: created process, response %d", err); 
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
        // check if RProcess::Create() succeeded
hgs
parents:
diff changeset
   118
        if( err == KErrNone )
hgs
parents:
diff changeset
   119
            {
62
hgs
parents: 51
diff changeset
   120
            LOGSTRING("PI Profiler start rendezvous ");
51
hgs
parents:
diff changeset
   121
            // Trigger rendezvous on the supplied TRequestStatus object
hgs
parents:
diff changeset
   122
            proc.Rendezvous(status); 
62
hgs
parents: 51
diff changeset
   123
            LOGSTRING("PI Profiler start resume ");
51
hgs
parents:
diff changeset
   124
            // kick off the engine process
hgs
parents:
diff changeset
   125
            proc.Resume();
62
hgs
parents: 51
diff changeset
   126
            LOGSTRING("PI Profiler start waitforrequest ");
51
hgs
parents:
diff changeset
   127
            // wait for the constructor to complete 
hgs
parents:
diff changeset
   128
            User::WaitForRequest(status); 
62
hgs
parents: 51
diff changeset
   129
            LOGSTRING("PI Profiler start close ");
51
hgs
parents:
diff changeset
   130
            // just lose the handle
hgs
parents:
diff changeset
   131
            proc.Close();
62
hgs
parents: 51
diff changeset
   132
            LOGSTRING("PI Profiler start: closed");
51
hgs
parents:
diff changeset
   133
            // start sampling, using settings found in settings file or if not found the default settings
hgs
parents:
diff changeset
   134
            err = RProfiler::StartSampling();
62
hgs
parents: 51
diff changeset
   135
            LOGSTRING2("PI Profiler start: err %d", err);
51
hgs
parents:
diff changeset
   136
            // check if command succesful
hgs
parents:
diff changeset
   137
            if( err != KErrNone )
hgs
parents:
diff changeset
   138
                {
hgs
parents:
diff changeset
   139
                LOGSTRING2("PI Profiler start: err %d", err);
hgs
parents:
diff changeset
   140
                _LIT(KNoteProfilerCannotStart, "PI Profiler: cannot start PI Profiler, check settings!");
hgs
parents:
diff changeset
   141
                PrintUsageInfo(KNoteProfilerCannotStart);
hgs
parents:
diff changeset
   142
                
hgs
parents:
diff changeset
   143
                // check if process still alive
hgs
parents:
diff changeset
   144
                if(err != KErrNotFound)
hgs
parents:
diff changeset
   145
                    {
hgs
parents:
diff changeset
   146
                    // exit the profiler process since process was started
hgs
parents:
diff changeset
   147
                    RProfiler::ExitProfiler();
hgs
parents:
diff changeset
   148
                    }
hgs
parents:
diff changeset
   149
                return err;
hgs
parents:
diff changeset
   150
                }
hgs
parents:
diff changeset
   151
            
hgs
parents:
diff changeset
   152
            if(aRunTimeInSeconds > 0)
hgs
parents:
diff changeset
   153
                {
hgs
parents:
diff changeset
   154
                RDebug::Print(_L("Profiler running for %d s... "), aRunTimeInSeconds);
hgs
parents:
diff changeset
   155
                User::After(aRunTimeInSeconds*1000000);
hgs
parents:
diff changeset
   156
                RDebug::Print(_L("************* Profiler process closing *********"));
hgs
parents:
diff changeset
   157
        
hgs
parents:
diff changeset
   158
                // stop sampling process
hgs
parents:
diff changeset
   159
                err = RProfiler::StopSampling();
hgs
parents:
diff changeset
   160
                // check if command succesfull
hgs
parents:
diff changeset
   161
                if( err != KErrNone )
hgs
parents:
diff changeset
   162
                    {
hgs
parents:
diff changeset
   163
                    LOGTEXT(_L("Profiler: could not connect engine, stop failed"));
hgs
parents:
diff changeset
   164
                    return err;
hgs
parents:
diff changeset
   165
                    }
hgs
parents:
diff changeset
   166
                
hgs
parents:
diff changeset
   167
                // exit the profiler process
hgs
parents:
diff changeset
   168
                err = RProfiler::ExitProfiler();
hgs
parents:
diff changeset
   169
                // check if command succesfull
hgs
parents:
diff changeset
   170
                if( err != KErrNone )
hgs
parents:
diff changeset
   171
                    {
hgs
parents:
diff changeset
   172
                    LOGTEXT(_L("Profiler: could not connect engine, exit failed"));
hgs
parents:
diff changeset
   173
                    return err;
hgs
parents:
diff changeset
   174
                    }
hgs
parents:
diff changeset
   175
                }
hgs
parents:
diff changeset
   176
            } 
hgs
parents:
diff changeset
   177
        else
hgs
parents:
diff changeset
   178
            {
hgs
parents:
diff changeset
   179
            _LIT(KNoteCannotFindProfiler, "PI Profiler: could not find PIProfilerEngine.exe");
hgs
parents:
diff changeset
   180
            PrintUsageInfo(KNoteCannotFindProfiler);
hgs
parents:
diff changeset
   181
            }
hgs
parents:
diff changeset
   182
        }
hgs
parents:
diff changeset
   183
    // check if old Profiler is already running
hgs
parents:
diff changeset
   184
    else if( err == KErrAlreadyExists )
hgs
parents:
diff changeset
   185
        {
hgs
parents:
diff changeset
   186
        _LIT(KNoteAlreadyRunning, "PI Profiler: old Profiler process already running, close it down before launching the new!");
hgs
parents:
diff changeset
   187
        PrintUsageInfo(KNoteAlreadyRunning);
hgs
parents:
diff changeset
   188
        }
hgs
parents:
diff changeset
   189
    // otherwise show error note
hgs
parents:
diff changeset
   190
    else
hgs
parents:
diff changeset
   191
        {
hgs
parents:
diff changeset
   192
        _LIT(KNoteAlreadyRunning, "PI Profiler: already running, not able to launch new one. NOTE: check if UI running!");
hgs
parents:
diff changeset
   193
        PrintUsageInfo(KNoteAlreadyRunning);
hgs
parents:
diff changeset
   194
        }
hgs
parents:
diff changeset
   195
    return KErrNone;
hgs
parents:
diff changeset
   196
    }
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   199
static TInt EndProfilerProcess()
hgs
parents:
diff changeset
   200
    {
hgs
parents:
diff changeset
   201
    LOGTEXT(_L("EndProfilerProcess() ..."));
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
    // call profiler to stop sampling
hgs
parents:
diff changeset
   204
    TInt err = RProfiler::StopSampling();
hgs
parents:
diff changeset
   205
    
hgs
parents:
diff changeset
   206
    // check if command succesfull
hgs
parents:
diff changeset
   207
    if( err != KErrNone )
hgs
parents:
diff changeset
   208
        {
hgs
parents:
diff changeset
   209
        LOGTEXT(_L("Profiler: could not connect engine, stop failed"));
hgs
parents:
diff changeset
   210
        return err;
hgs
parents:
diff changeset
   211
        }
hgs
parents:
diff changeset
   212
    
hgs
parents:
diff changeset
   213
    // exit the profiler process
hgs
parents:
diff changeset
   214
    err = RProfiler::ExitProfiler();
hgs
parents:
diff changeset
   215
    // check if command succesfull
hgs
parents:
diff changeset
   216
    if( err != KErrNone )
hgs
parents:
diff changeset
   217
        {
hgs
parents:
diff changeset
   218
        LOGTEXT(_L("Profiler: could not connect engine, exit failed"));
hgs
parents:
diff changeset
   219
        return err;
hgs
parents:
diff changeset
   220
        }
hgs
parents:
diff changeset
   221
    
hgs
parents:
diff changeset
   222
    return KErrNone;
hgs
parents:
diff changeset
   223
    }
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   226
static TInt TestSettingsFile(const TDesC& configFile)
hgs
parents:
diff changeset
   227
    {
hgs
parents:
diff changeset
   228
    RFs fs;
hgs
parents:
diff changeset
   229
    RFile file;
hgs
parents:
diff changeset
   230
    TInt err(KErrNone);
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
    // check if file server can be connected
hgs
parents:
diff changeset
   233
    if (fs.Connect() != KErrNone)
hgs
parents:
diff changeset
   234
        {
hgs
parents:
diff changeset
   235
        // file server couldn't be connected, return false
hgs
parents:
diff changeset
   236
        return KErrNotFound;
hgs
parents:
diff changeset
   237
        }
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
    // check if config file name length is > 0
hgs
parents:
diff changeset
   240
    if (configFile.Length() > 0)
hgs
parents:
diff changeset
   241
        {
hgs
parents:
diff changeset
   242
        // open the file with the given path and name
hgs
parents:
diff changeset
   243
        err = file.Open(fs,configFile,EFileRead);
hgs
parents:
diff changeset
   244
        // check if file open was succesfull 
hgs
parents:
diff changeset
   245
        if(err != KErrNone)
hgs
parents:
diff changeset
   246
            {
hgs
parents:
diff changeset
   247
            // return false if failed
hgs
parents:
diff changeset
   248
            fs.Close();
hgs
parents:
diff changeset
   249
            return err;
hgs
parents:
diff changeset
   250
            }
hgs
parents:
diff changeset
   251
        
hgs
parents:
diff changeset
   252
        }
hgs
parents:
diff changeset
   253
    else
hgs
parents:
diff changeset
   254
        {
hgs
parents:
diff changeset
   255
        // configFile length 0, return false
hgs
parents:
diff changeset
   256
        fs.Close();
hgs
parents:
diff changeset
   257
        return KErrNotFound;
hgs
parents:
diff changeset
   258
        }
hgs
parents:
diff changeset
   259
    // return true if tests passed
hgs
parents:
diff changeset
   260
    file.Close();
hgs
parents:
diff changeset
   261
    fs.Close();
hgs
parents:
diff changeset
   262
    return KErrNone;
hgs
parents:
diff changeset
   263
    }
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   266
static TInt ParseCommandAndExecute()
hgs
parents:
diff changeset
   267
    {
hgs
parents:
diff changeset
   268
    // commands literals for finding the right keyword 
hgs
parents:
diff changeset
   269
    _LIT(KAutomatedTestStart,"start*");
hgs
parents:
diff changeset
   270
    _LIT(KAutomatedTestEnd,"end*");
hgs
parents:
diff changeset
   271
    _LIT(KAutomatedTestTimed,"timed*");
hgs
parents:
diff changeset
   272
    _LIT(KBootMeasurement,"boot*");
hgs
parents:
diff changeset
   273
    TBuf<256> c;
hgs
parents:
diff changeset
   274
    TInt match(KErrNotFound);
hgs
parents:
diff changeset
   275
    TInt bootmatch(KErrNotFound);
hgs
parents:
diff changeset
   276
    TBool myBoot=false;
hgs
parents:
diff changeset
   277
    // copy the full command line with arguments into a buffer
hgs
parents:
diff changeset
   278
    User::CommandLine(c);
62
hgs
parents: 51
diff changeset
   279
    LOGSTRING2("ParseCommandAndExecute command: %S", &c);
51
hgs
parents:
diff changeset
   280
hgs
parents:
diff changeset
   281
    // try to match with each of the literals defined above
hgs
parents:
diff changeset
   282
    // (commands in atf format)
hgs
parents:
diff changeset
   283
    
hgs
parents:
diff changeset
   284
    // check if command is "start"
hgs
parents:
diff changeset
   285
    match = c.Match(KAutomatedTestStart);
hgs
parents:
diff changeset
   286
    if (match != KErrNotFound)
hgs
parents:
diff changeset
   287
        {
62
hgs
parents: 51
diff changeset
   288
        LOGTEXT(_L("ParseCommandAndExecute Found keyword start"));
51
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
        TBuf<256> fileName;
hgs
parents:
diff changeset
   291
        fileName.Append(c.Right(c.Length()-6));
62
hgs
parents: 51
diff changeset
   292
        LOGSTRING2("ParseCommandAndExecute Filename is %S", &fileName);
51
hgs
parents:
diff changeset
   293
        if(TestSettingsFile(fileName) != KErrNone)
hgs
parents:
diff changeset
   294
            {
hgs
parents:
diff changeset
   295
            _LIT(KSettingsFileFailed, "False settings file");
hgs
parents:
diff changeset
   296
            PrintUsageInfo(KSettingsFileFailed);
hgs
parents:
diff changeset
   297
            return -2;
hgs
parents:
diff changeset
   298
            }
hgs
parents:
diff changeset
   299
        // execute Profile process 
hgs
parents:
diff changeset
   300
        if( StartProfilerProcess(fileName, 0, myBoot) == KErrNone )
hgs
parents:
diff changeset
   301
            {
hgs
parents:
diff changeset
   302
            return -10;
hgs
parents:
diff changeset
   303
            }
hgs
parents:
diff changeset
   304
        return -2;
hgs
parents:
diff changeset
   305
        }
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
    // check if command is "end"
hgs
parents:
diff changeset
   308
    match = c.Match(KAutomatedTestEnd);
hgs
parents:
diff changeset
   309
    if (match != KErrNotFound)
hgs
parents:
diff changeset
   310
        {
hgs
parents:
diff changeset
   311
        LOGTEXT(_L("Found keyword end"));
hgs
parents:
diff changeset
   312
hgs
parents:
diff changeset
   313
        // stop the profiling process
hgs
parents:
diff changeset
   314
        EndProfilerProcess();
hgs
parents:
diff changeset
   315
        return -10;
hgs
parents:
diff changeset
   316
        }
hgs
parents:
diff changeset
   317
hgs
parents:
diff changeset
   318
    // check if command is "timed"
hgs
parents:
diff changeset
   319
    match = c.Match(KAutomatedTestTimed);
hgs
parents:
diff changeset
   320
    // check if command is "boot"
hgs
parents:
diff changeset
   321
    bootmatch = c.Match(KBootMeasurement);
hgs
parents:
diff changeset
   322
    if ((match!= KErrNotFound) || (bootmatch != KErrNotFound))
hgs
parents:
diff changeset
   323
        {
hgs
parents:
diff changeset
   324
        // command "timed" or " boot" found, need for finding settings file and run time next
hgs
parents:
diff changeset
   325
        if(bootmatch != KErrNotFound)
hgs
parents:
diff changeset
   326
            {
62
hgs
parents: 51
diff changeset
   327
            LOGTEXT(_L("ParseCommandAndExecute Found keyword boot"));
51
hgs
parents:
diff changeset
   328
            myBoot = TRUE;
hgs
parents:
diff changeset
   329
            }
hgs
parents:
diff changeset
   330
        if(match != KErrNotFound)
hgs
parents:
diff changeset
   331
            {
62
hgs
parents: 51
diff changeset
   332
            LOGTEXT(_L("ParseCommandAndExecute Found keyword timed"));
51
hgs
parents:
diff changeset
   333
            }
hgs
parents:
diff changeset
   334
        
hgs
parents:
diff changeset
   335
        TBuf<256> temp;
hgs
parents:
diff changeset
   336
        temp.Append(c);
hgs
parents:
diff changeset
   337
        TLex lex(temp);
hgs
parents:
diff changeset
   338
        
hgs
parents:
diff changeset
   339
        TBuf<256> fileName;
hgs
parents:
diff changeset
   340
        TInt seconds;
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
        // parse the first command line argument, the command itself
hgs
parents:
diff changeset
   343
        lex.Mark();
hgs
parents:
diff changeset
   344
        lex.SkipCharacters();
hgs
parents:
diff changeset
   345
        if(lex.TokenLength() != 0)
hgs
parents:
diff changeset
   346
            {
hgs
parents:
diff changeset
   347
            #ifdef PIPROFILER_PRINTS
hgs
parents:
diff changeset
   348
            TPtrC token = lex.MarkedToken();
hgs
parents:
diff changeset
   349
            LOGSTRING2("Token 1 %S",&token);
hgs
parents:
diff changeset
   350
            #endif
hgs
parents:
diff changeset
   351
            }
hgs
parents:
diff changeset
   352
        else
hgs
parents:
diff changeset
   353
            {
hgs
parents:
diff changeset
   354
            LOGTEXT(_L("Problem 1 in parsing command line"));
hgs
parents:
diff changeset
   355
            _LIT(KSettingsFileFailed, "Failure: False argument");
hgs
parents:
diff changeset
   356
            PrintUsageInfo(KSettingsFileFailed);
hgs
parents:
diff changeset
   357
            return -2;
hgs
parents:
diff changeset
   358
            }
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
        // parse the second command line argument, the settings file name
hgs
parents:
diff changeset
   361
        lex.SkipSpace();
hgs
parents:
diff changeset
   362
        lex.Mark();
hgs
parents:
diff changeset
   363
        lex.SkipCharacters();
hgs
parents:
diff changeset
   364
        if(lex.TokenLength() != 0)
hgs
parents:
diff changeset
   365
            {
hgs
parents:
diff changeset
   366
            TPtrC token2 = lex.MarkedToken();
hgs
parents:
diff changeset
   367
            LOGSTRING2("Token 2 %S",&token2);
hgs
parents:
diff changeset
   368
            fileName.Append(token2);
hgs
parents:
diff changeset
   369
            LOGSTRING2("Value of fileName is %S",&fileName);
hgs
parents:
diff changeset
   370
//            if(TestSettingsFile(fileName) != KErrNone)
hgs
parents:
diff changeset
   371
//                {
hgs
parents:
diff changeset
   372
//                _LIT(KSettingsFileFailed, "Failure: False settings file");
hgs
parents:
diff changeset
   373
//                PrintUsageInfo(KSettingsFileFailed);
hgs
parents:
diff changeset
   374
//                return -2;
hgs
parents:
diff changeset
   375
//                }
hgs
parents:
diff changeset
   376
            }
hgs
parents:
diff changeset
   377
        else
hgs
parents:
diff changeset
   378
            {
hgs
parents:
diff changeset
   379
            LOGTEXT(_L("Problem 2 in parsing command line"));
hgs
parents:
diff changeset
   380
            _LIT(KSettingsFileFailed, "Failure: No settings file specified");
hgs
parents:
diff changeset
   381
            PrintUsageInfo(KSettingsFileFailed);
hgs
parents:
diff changeset
   382
            return -2;
hgs
parents:
diff changeset
   383
            }
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
        // parse the third command line argument, the run time in seconds
hgs
parents:
diff changeset
   386
        lex.SkipSpace();
hgs
parents:
diff changeset
   387
        lex.Mark();
hgs
parents:
diff changeset
   388
        lex.SkipCharacters();
hgs
parents:
diff changeset
   389
        if(lex.TokenLength() != 0)
hgs
parents:
diff changeset
   390
            {
hgs
parents:
diff changeset
   391
            // third token ok, try to convert into TInt value
hgs
parents:
diff changeset
   392
            TPtrC token3 = lex.MarkedToken();
hgs
parents:
diff changeset
   393
            LOGSTRING2("Token 3 %S",&token3);
hgs
parents:
diff changeset
   394
            TLex num(token3);
hgs
parents:
diff changeset
   395
            TInt err = num.Val(seconds);
hgs
parents:
diff changeset
   396
            // check if given time value acceptable 
hgs
parents:
diff changeset
   397
            if (err != KErrNone)
hgs
parents:
diff changeset
   398
                {
hgs
parents:
diff changeset
   399
                // value parsing failed, show info note to user
hgs
parents:
diff changeset
   400
                _LIT(KSecondsFailed, "Failure: False time value");
hgs
parents:
diff changeset
   401
                PrintUsageInfo(KSecondsFailed);
hgs
parents:
diff changeset
   402
                return -2;
hgs
parents:
diff changeset
   403
                }
hgs
parents:
diff changeset
   404
            }
hgs
parents:
diff changeset
   405
        else
hgs
parents:
diff changeset
   406
            {
hgs
parents:
diff changeset
   407
            LOGTEXT(_L("Problem 3 in parsing command line"));
hgs
parents:
diff changeset
   408
            _LIT(KSecondsFailed, "Failure: False time value");
hgs
parents:
diff changeset
   409
            PrintUsageInfo(KSecondsFailed);
hgs
parents:
diff changeset
   410
            return -2;
hgs
parents:
diff changeset
   411
            }           
hgs
parents:
diff changeset
   412
        
hgs
parents:
diff changeset
   413
        LOGSTRING3("Filename is %S, seconds is %d", &fileName, seconds);
hgs
parents:
diff changeset
   414
        // execute Profile process 
hgs
parents:
diff changeset
   415
        if( StartProfilerProcess(fileName, seconds, myBoot) == KErrNone )
hgs
parents:
diff changeset
   416
            {
hgs
parents:
diff changeset
   417
            return -10;
hgs
parents:
diff changeset
   418
            }
hgs
parents:
diff changeset
   419
        return -2;
hgs
parents:
diff changeset
   420
        }
hgs
parents:
diff changeset
   421
    
hgs
parents:
diff changeset
   422
    // check if space character in the middle of command line string 
hgs
parents:
diff changeset
   423
    if( c.LocateReverse(' ') != KErrNotFound)
hgs
parents:
diff changeset
   424
        {
hgs
parents:
diff changeset
   425
        _LIT(KWrongParameters, "Failure: Check command line parameters");
hgs
parents:
diff changeset
   426
        PrintUsageInfo(KWrongParameters);
hgs
parents:
diff changeset
   427
        return -2;
hgs
parents:
diff changeset
   428
        }
hgs
parents:
diff changeset
   429
    
hgs
parents:
diff changeset
   430
    // return -1 if no command found
hgs
parents:
diff changeset
   431
    LOGTEXT(_L("No keyword found"));
hgs
parents:
diff changeset
   432
    return -1;
hgs
parents:
diff changeset
   433
    }
hgs
parents:
diff changeset
   434
hgs
parents:
diff changeset
   435
// --------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
   436
GLDEF_C TInt E32Main()
hgs
parents:
diff changeset
   437
    {
hgs
parents:
diff changeset
   438
    // parse command line arguments
hgs
parents:
diff changeset
   439
    ParseCommandAndExecute();
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
    return KErrNone;
hgs
parents:
diff changeset
   442
hgs
parents:
diff changeset
   443
    }