utilityapps/screengrabber/src/sgengine.cpp
author hgs
Mon, 18 Oct 2010 16:30:05 +0300
changeset 55 2d9cac8919d3
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 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 <s32file.h> 
hgs
parents:
diff changeset
    19
#include <bautils.h>
hgs
parents:
diff changeset
    20
#include <pathinfo.h>
hgs
parents:
diff changeset
    21
#include <apparc.h> 
hgs
parents:
diff changeset
    22
#include <imageconversion.h>
hgs
parents:
diff changeset
    23
#include <textresolver.h>
hgs
parents:
diff changeset
    24
#include <apgtask.h> 
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include <hblabel.h>
hgs
parents:
diff changeset
    27
#include <hbmessagebox.h>
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
#include "mainview.h"
hgs
parents:
diff changeset
    30
#include "sgengine.h"
hgs
parents:
diff changeset
    31
#include "enginewrapper.h"
hgs
parents:
diff changeset
    32
#include "gifanimator.h"
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
#define SC_PRINTS
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
    #ifdef SC_PRINTS
hgs
parents:
diff changeset
    38
     #define SC_DEBUG(a) RDebug::Print(a)
hgs
parents:
diff changeset
    39
     #define SC_DEBUG2(a,b) RDebug::Print(a,b)
hgs
parents:
diff changeset
    40
    #else
hgs
parents:
diff changeset
    41
     #define SC_DEBUG(a) 
hgs
parents:
diff changeset
    42
     #define SC_DEBUG2(a,b)
hgs
parents:
diff changeset
    43
    #endif
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
_LIT(KDefaultImageFileName, "Shot");
hgs
parents:
diff changeset
    49
_LIT(KDefaultVideoFileName, "Video");
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
#define HIGH_QUALITY_JPEG 97
hgs
parents:
diff changeset
    52
#define LOW_QUALITY_JPEG 60
hgs
parents:
diff changeset
    53
#define DEFAULT_SEQ_CAPTURE_DELAY_MS 5000   // 5.000 secs
hgs
parents:
diff changeset
    54
#define VIDEO_CAPTURE_DELAY 250             // 0.25 secs
hgs
parents:
diff changeset
    55
#define VIDEO_CAPTURE_MINIMUM_DELAY 200     // 0.20 secs
hgs
parents:
diff changeset
    56
const TInt KSettingsDrive = EDriveC;
hgs
parents:
diff changeset
    57
_LIT(KSettingsFileName, "screengrabber_settings.ini");
hgs
parents:
diff changeset
    58
_LIT(KScreenShotsSubDirectory, "Screen Shots\\");
hgs
parents:
diff changeset
    59
_LIT(KSGTemporaryDirectory, "\\system\\temp\\screengrabber\\");
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
#define KEY_CAPTURE_PRIORITY 100            // do not change, this is for window server
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
SGEngine::SGEngine() : CActive(EPriorityStandard)
hgs
parents:
diff changeset
    67
    {
hgs
parents:
diff changeset
    68
    // No implementation required
hgs
parents:
diff changeset
    69
    }
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
SGEngine::~SGEngine()
hgs
parents:
diff changeset
    74
    {
hgs
parents:
diff changeset
    75
 
hgs
parents:
diff changeset
    76
    TRAP_IGNORE( CleanTemporaryFilesL() );
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
    if (iFrameImageData)
hgs
parents:
diff changeset
    80
        delete iFrameImageData;
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
    if (iPreviouslyCapturedBitmap)
hgs
parents:
diff changeset
    83
        delete iPreviouslyCapturedBitmap;
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
    if (iImageEncoder)
hgs
parents:
diff changeset
    86
        delete iImageEncoder;
hgs
parents:
diff changeset
    87
     
hgs
parents:
diff changeset
    88
    delete iVideoFrameArray;
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
    Cancel();
hgs
parents:
diff changeset
    91
    iTimer.Close();
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
    iFileSession.Close(); 
hgs
parents:
diff changeset
    94
    
hgs
parents:
diff changeset
    95
    }
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
SGEngine* SGEngine::NewLC(EngineWrapper *aEngineWrapper)
hgs
parents:
diff changeset
   100
    {
hgs
parents:
diff changeset
   101
    SGEngine* self = new (ELeave) SGEngine();
hgs
parents:
diff changeset
   102
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
   103
    self->ConstructL(aEngineWrapper);
hgs
parents:
diff changeset
   104
    return self;
hgs
parents:
diff changeset
   105
    }
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
SGEngine* SGEngine::NewL(EngineWrapper *aEngineWrapper)
hgs
parents:
diff changeset
   110
    {
hgs
parents:
diff changeset
   111
    SGEngine* self = SGEngine::NewLC(aEngineWrapper);
hgs
parents:
diff changeset
   112
    CleanupStack::Pop(); // self;
hgs
parents:
diff changeset
   113
    return self;
hgs
parents:
diff changeset
   114
    }
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
void SGEngine::ConstructL(EngineWrapper *aEngineWrapper)
hgs
parents:
diff changeset
   119
    {
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
    iEngineWrapper = aEngineWrapper;
hgs
parents:
diff changeset
   122
   
hgs
parents:
diff changeset
   123
    iHashKeyCapturingActivated = EFalse; // Check this
hgs
parents:
diff changeset
   124
   
hgs
parents:
diff changeset
   125
    User::LeaveIfError(iTimer.CreateLocal());
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
    iVideoFrameArray = new(ELeave) CVideoFrameArray(10000);
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
    iPreviouslyCapturedBitmap = new(ELeave) CFbsBitmap;
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    iCapturingInProgress = EFalse;
hgs
parents:
diff changeset
   132
    iStopCapturing = EFalse;
hgs
parents:
diff changeset
   133
    iNumberOfTakenShots = 0;
hgs
parents:
diff changeset
   134
    iCurrentFrameNumber = 0;
hgs
parents:
diff changeset
   135
    iHashKeyDown = EFalse;
hgs
parents:
diff changeset
   136
	
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
	CActiveScheduler::Add(this);
hgs
parents:
diff changeset
   139
	User::LeaveIfError(iFileSession.Connect());  
hgs
parents:
diff changeset
   140
	
hgs
parents:
diff changeset
   141
	// create window group.
hgs
parents:
diff changeset
   142
    iRootWin = CEikonEnv::Static()->RootWin();
hgs
parents:
diff changeset
   143
	iRootWin.EnableReceiptOfFocus(EFalse);
hgs
parents:
diff changeset
   144
    
hgs
parents:
diff changeset
   145
    }
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
void SGEngine::RunL(){
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- RunL begin"));
hgs
parents:
diff changeset
   153
    
hgs
parents:
diff changeset
   154
    switch (iState) 
hgs
parents:
diff changeset
   155
        {
hgs
parents:
diff changeset
   156
        // encoding of the image is now finished
hgs
parents:
diff changeset
   157
        case EEncodingImage: 
hgs
parents:
diff changeset
   158
            {
hgs
parents:
diff changeset
   159
            if (iGrabSettings.iCaptureMode == ECaptureModeSingleCapture)
hgs
parents:
diff changeset
   160
                {
hgs
parents:
diff changeset
   161
                // single shot done
hgs
parents:
diff changeset
   162
                CapturingFinishedL( iStatus.Int() );
hgs
parents:
diff changeset
   163
                }
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
            else if (iGrabSettings.iCaptureMode == ECaptureModeSequantialCapture)
hgs
parents:
diff changeset
   166
                {
hgs
parents:
diff changeset
   167
                // increase the counter    
hgs
parents:
diff changeset
   168
                iNumberOfTakenShots++;
hgs
parents:
diff changeset
   169
                
hgs
parents:
diff changeset
   170
                // check if we can take more shots or just finish
hgs
parents:
diff changeset
   171
                if (!iStopCapturing && iStatus.Int()==KErrNone)
hgs
parents:
diff changeset
   172
                    {
hgs
parents:
diff changeset
   173
        
hgs
parents:
diff changeset
   174
                    // some delay before the next shot can be taken    
hgs
parents:
diff changeset
   175
                    iState = ESequenceDelay;
hgs
parents:
diff changeset
   176
                    
hgs
parents:
diff changeset
   177
                    // some checking that the value of delay is valid
hgs
parents:
diff changeset
   178
                    TInt delay(iGrabSettings.iSequantialCaptureDelay); //ms
hgs
parents:
diff changeset
   179
                    if (delay<0 || delay > 999999)
hgs
parents:
diff changeset
   180
                        delay = DEFAULT_SEQ_CAPTURE_DELAY_MS;
hgs
parents:
diff changeset
   181
                      
hgs
parents:
diff changeset
   182
                    iTimer.After(iStatus, delay*1000);
hgs
parents:
diff changeset
   183
                    SetActive();  
hgs
parents:
diff changeset
   184
                    }
hgs
parents:
diff changeset
   185
                else
hgs
parents:
diff changeset
   186
                    {
hgs
parents:
diff changeset
   187
                    // finished
hgs
parents:
diff changeset
   188
                    CapturingFinishedL( iStatus.Int() );
hgs
parents:
diff changeset
   189
                    }                       
hgs
parents:
diff changeset
   190
               }
hgs
parents:
diff changeset
   191
            else
hgs
parents:
diff changeset
   192
                User::Panic(_L("Wrong mode"), 32);            
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
            break;
hgs
parents:
diff changeset
   195
            }
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
        // delay finished, ready to take the next shot
hgs
parents:
diff changeset
   198
        case ESequenceDelay: 
hgs
parents:
diff changeset
   199
            {
hgs
parents:
diff changeset
   200
            TakeScreenShotAndSaveL();
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
            break;
hgs
parents:
diff changeset
   203
            }
hgs
parents:
diff changeset
   204
            
hgs
parents:
diff changeset
   205
        // asked to cancel capturing    
hgs
parents:
diff changeset
   206
        case ECancelCapturing:
hgs
parents:
diff changeset
   207
            {
hgs
parents:
diff changeset
   208
            // finished
hgs
parents:
diff changeset
   209
            CapturingFinishedL( iStatus.Int() );
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
            break;
hgs
parents:
diff changeset
   212
            }
hgs
parents:
diff changeset
   213
            
hgs
parents:
diff changeset
   214
        case ENextVideoFrame:
hgs
parents:
diff changeset
   215
            {
hgs
parents:
diff changeset
   216
            // increase the counter
hgs
parents:
diff changeset
   217
            iCurrentFrameNumber++;
hgs
parents:
diff changeset
   218
            
hgs
parents:
diff changeset
   219
            // check if we can take more frames or just finish
hgs
parents:
diff changeset
   220
            if (!iStopCapturing && iStatus.Int()==KErrNone)
hgs
parents:
diff changeset
   221
                {
hgs
parents:
diff changeset
   222
                // take next frame
hgs
parents:
diff changeset
   223
                CaptureFrameForVideoL();
hgs
parents:
diff changeset
   224
                }
hgs
parents:
diff changeset
   225
            else
hgs
parents:
diff changeset
   226
                {
hgs
parents:
diff changeset
   227
                // finished, save video
hgs
parents:
diff changeset
   228
                SaveVideoL( iStatus.Int() );
hgs
parents:
diff changeset
   229
                }               
hgs
parents:
diff changeset
   230
            }
hgs
parents:
diff changeset
   231
            break;
hgs
parents:
diff changeset
   232
hgs
parents:
diff changeset
   233
        case ECancelVideoCapturing:
hgs
parents:
diff changeset
   234
            {
hgs
parents:
diff changeset
   235
            // finished, save video
hgs
parents:
diff changeset
   236
            SaveVideoL( iStatus.Int() );                
hgs
parents:
diff changeset
   237
            }
hgs
parents:
diff changeset
   238
            break;
hgs
parents:
diff changeset
   239
                                
hgs
parents:
diff changeset
   240
        default:
hgs
parents:
diff changeset
   241
            {
hgs
parents:
diff changeset
   242
            break;
hgs
parents:
diff changeset
   243
            }
hgs
parents:
diff changeset
   244
        }
hgs
parents:
diff changeset
   245
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- RunL end"));
hgs
parents:
diff changeset
   246
    
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
}
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
void SGEngine::EnableRcpOfFoc(TBool aState)
hgs
parents:
diff changeset
   252
	{
hgs
parents:
diff changeset
   253
	iRootWin.EnableReceiptOfFocus(aState);
hgs
parents:
diff changeset
   254
	}
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
void SGEngine::DoCancel(){
hgs
parents:
diff changeset
   260
    iTimer.Cancel();
hgs
parents:
diff changeset
   261
}
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
void SGEngine::LoadDFSValueL(CDictionaryFileStore* aDicFS, const TUid& aUid, TInt& aValue)
hgs
parents:
diff changeset
   266
    {
hgs
parents:
diff changeset
   267
    if (aDicFS->IsPresentL(aUid))
hgs
parents:
diff changeset
   268
        {
hgs
parents:
diff changeset
   269
        RDictionaryReadStream in;
hgs
parents:
diff changeset
   270
        in.OpenLC(*aDicFS, aUid);
hgs
parents:
diff changeset
   271
        aValue = in.ReadInt16L();
hgs
parents:
diff changeset
   272
        CleanupStack::PopAndDestroy(); // in        
hgs
parents:
diff changeset
   273
        }
hgs
parents:
diff changeset
   274
    }
hgs
parents:
diff changeset
   275
hgs
parents:
diff changeset
   276
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   277
hgs
parents:
diff changeset
   278
void SGEngine::LoadDFSValueL(CDictionaryFileStore* aDicFS, const TUid& aUid, TDes& aValue)
hgs
parents:
diff changeset
   279
    {
hgs
parents:
diff changeset
   280
    if (aDicFS->IsPresentL(aUid))
hgs
parents:
diff changeset
   281
        {
hgs
parents:
diff changeset
   282
        RDictionaryReadStream in;
hgs
parents:
diff changeset
   283
        in.OpenLC(*aDicFS, aUid);
hgs
parents:
diff changeset
   284
        TInt bufLength = in.ReadInt16L();   // get length of descriptor
hgs
parents:
diff changeset
   285
        in.ReadL(aValue, bufLength);        // get the descriptor itself
hgs
parents:
diff changeset
   286
        CleanupStack::PopAndDestroy(); // in
hgs
parents:
diff changeset
   287
        }
hgs
parents:
diff changeset
   288
    }
hgs
parents:
diff changeset
   289
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
void SGEngine::LoadSettingsL()
hgs
parents:
diff changeset
   292
    {
hgs
parents:
diff changeset
   293
	 
hgs
parents:
diff changeset
   294
    // set defaults
hgs
parents:
diff changeset
   295
    iGrabSettings.iCaptureMode = ECaptureModeSingleCapture;
hgs
parents:
diff changeset
   296
    
hgs
parents:
diff changeset
   297
    iGrabSettings.iSingleCaptureHotkey = EHotkeySendKey;
hgs
parents:
diff changeset
   298
    iGrabSettings.iSingleCaptureImageFormat = EImageFormatPNG;
hgs
parents:
diff changeset
   299
    iGrabSettings.iSingleCaptureMemoryInUseMultiDrive = EPhoneMemory;
hgs
parents:
diff changeset
   300
    iGrabSettings.iSingleCaptureFileName.Copy( KDefaultImageFileName );
hgs
parents:
diff changeset
   301
hgs
parents:
diff changeset
   302
    iGrabSettings.iSequantialCaptureHotkey = EHotkeySendKey;
hgs
parents:
diff changeset
   303
    iGrabSettings.iSequantialCaptureImageFormat = EImageFormatPNG;
hgs
parents:
diff changeset
   304
    iGrabSettings.iSequantialCaptureDelay = DEFAULT_SEQ_CAPTURE_DELAY_MS;
hgs
parents:
diff changeset
   305
    iGrabSettings.iSequantialCaptureMemoryInUseMultiDrive = EPhoneMemory;
hgs
parents:
diff changeset
   306
    iGrabSettings.iSequantialCaptureFileName.Copy( KDefaultImageFileName );
hgs
parents:
diff changeset
   307
hgs
parents:
diff changeset
   308
    iGrabSettings.iVideoCaptureHotkey = EHotkeySendKey;
hgs
parents:
diff changeset
   309
    iGrabSettings.iVideoCaptureVideoFormat = EVideoFormatAnimatedGIF;
hgs
parents:
diff changeset
   310
    iGrabSettings.iVideoCaptureMemoryInUseMultiDrive = EPhoneMemory;    
hgs
parents:
diff changeset
   311
    iGrabSettings.iVideoCaptureFileName.Copy( KDefaultVideoFileName );
hgs
parents:
diff changeset
   312
       
hgs
parents:
diff changeset
   313
        
hgs
parents:
diff changeset
   314
    // make sure that the private path of this app in c-drive exists
hgs
parents:
diff changeset
   315
    
hgs
parents:
diff changeset
   316
	iFileSession.CreatePrivatePath( KSettingsDrive ); // c:\\private\\101fb751\\
hgs
parents:
diff changeset
   317
    
hgs
parents:
diff changeset
   318
    // handle settings always in the private directory 
hgs
parents:
diff changeset
   319
    
hgs
parents:
diff changeset
   320
	if (iFileSession.SetSessionToPrivate( KSettingsDrive ) == KErrNone)
hgs
parents:
diff changeset
   321
        {
hgs
parents:
diff changeset
   322
        // open or create a dictionary file store
hgs
parents:
diff changeset
   323
        CDictionaryFileStore* settingsStore = CDictionaryFileStore::OpenLC(iFileSession, KSettingsFileName, KUidScreenGrabber);
hgs
parents:
diff changeset
   324
hgs
parents:
diff changeset
   325
        LoadDFSValueL(settingsStore, KSGSettingCaptureMode,                             iGrabSettings.iCaptureMode);
hgs
parents:
diff changeset
   326
        
hgs
parents:
diff changeset
   327
        LoadDFSValueL(settingsStore, KSGSettingSingleCaptureHotkey,                     iGrabSettings.iSingleCaptureHotkey);
hgs
parents:
diff changeset
   328
        LoadDFSValueL(settingsStore, KSGSettingSingleCaptureImageFormat,                iGrabSettings.iSingleCaptureImageFormat);
hgs
parents:
diff changeset
   329
        LoadDFSValueL(settingsStore, KSGSettingSingleCaptureMemoryInUseMultiDrive,      iGrabSettings.iSingleCaptureMemoryInUseMultiDrive);
hgs
parents:
diff changeset
   330
        LoadDFSValueL(settingsStore, KSGSettingSingleCaptureFileName,                   iGrabSettings.iSingleCaptureFileName);
hgs
parents:
diff changeset
   331
        
hgs
parents:
diff changeset
   332
        LoadDFSValueL(settingsStore, KSGSettingSequantialCaptureHotkey,                 iGrabSettings.iSequantialCaptureHotkey);
hgs
parents:
diff changeset
   333
        LoadDFSValueL(settingsStore, KSGSettingSequantialCaptureImageFormat,            iGrabSettings.iSequantialCaptureImageFormat);
hgs
parents:
diff changeset
   334
        LoadDFSValueL(settingsStore, KSGSettingSequantialCaptureDelay,                  iGrabSettings.iSequantialCaptureDelay);
hgs
parents:
diff changeset
   335
        LoadDFSValueL(settingsStore, KSGSettingSequantialCaptureMemoryInUseMultiDrive,  iGrabSettings.iSequantialCaptureMemoryInUseMultiDrive);
hgs
parents:
diff changeset
   336
        LoadDFSValueL(settingsStore, KSGSettingSequantialCaptureFileName,               iGrabSettings.iSequantialCaptureFileName);
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
        LoadDFSValueL(settingsStore, KSGSettingVideoCaptureHotkey,                      iGrabSettings.iVideoCaptureHotkey);
hgs
parents:
diff changeset
   339
        LoadDFSValueL(settingsStore, KSGSettingVideoCaptureVideoFormat,                 iGrabSettings.iVideoCaptureVideoFormat);
hgs
parents:
diff changeset
   340
        LoadDFSValueL(settingsStore, KSGSettingVideoCaptureMemoryInUseMultiDrive,       iGrabSettings.iVideoCaptureMemoryInUseMultiDrive);
hgs
parents:
diff changeset
   341
        LoadDFSValueL(settingsStore, KSGSettingVideoCaptureFileName,                    iGrabSettings.iVideoCaptureFileName);
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
        CleanupStack::PopAndDestroy(); // settingsStore         
hgs
parents:
diff changeset
   344
        }
hgs
parents:
diff changeset
   345
//chesk if all settings are in range - for safety reason, not to set some controls out of range - it causes the crash
hgs
parents:
diff changeset
   346
	if (!(iGrabSettings.iCaptureMode >= ECaptureModeSingleCapture && iGrabSettings.iCaptureMode <= ECaptureModeVideoCapture))
hgs
parents:
diff changeset
   347
	    { //give it default value
hgs
parents:
diff changeset
   348
        iGrabSettings.iCaptureMode = ECaptureModeSingleCapture;
hgs
parents:
diff changeset
   349
	    }
hgs
parents:
diff changeset
   350
	if (!(iGrabSettings.iSingleCaptureHotkey >= EHotkeySendKey && iGrabSettings.iSingleCaptureHotkey <= EHotkeyCameraKey1))
hgs
parents:
diff changeset
   351
	    {
hgs
parents:
diff changeset
   352
        iGrabSettings.iSingleCaptureHotkey = EHotkeySendKey;
hgs
parents:
diff changeset
   353
	    }
hgs
parents:
diff changeset
   354
	if (!(iGrabSettings.iSingleCaptureImageFormat >= EImageFormatPNG && iGrabSettings.iSingleCaptureImageFormat <= EImageFormatGIF))
hgs
parents:
diff changeset
   355
	    {
hgs
parents:
diff changeset
   356
        iGrabSettings.iSingleCaptureImageFormat = EImageFormatPNG;
hgs
parents:
diff changeset
   357
	    }
hgs
parents:
diff changeset
   358
	if (!(iGrabSettings.iSingleCaptureMemoryInUseMultiDrive >= EPhoneMemory && iGrabSettings.iSingleCaptureMemoryInUseMultiDrive <= EMemoryCard))
hgs
parents:
diff changeset
   359
	    {
hgs
parents:
diff changeset
   360
        iGrabSettings.iSingleCaptureMemoryInUseMultiDrive = EPhoneMemory;
hgs
parents:
diff changeset
   361
	    }
hgs
parents:
diff changeset
   362
	
hgs
parents:
diff changeset
   363
    if (!(iGrabSettings.iSequantialCaptureHotkey >= EHotkeySendKey && iGrabSettings.iSequantialCaptureHotkey <= EHotkeyCameraKey1))
hgs
parents:
diff changeset
   364
        {
hgs
parents:
diff changeset
   365
        iGrabSettings.iSequantialCaptureHotkey = EHotkeySendKey;
hgs
parents:
diff changeset
   366
        }
hgs
parents:
diff changeset
   367
    if (!(iGrabSettings.iSequantialCaptureImageFormat >= EImageFormatPNG && iGrabSettings.iSequantialCaptureImageFormat <= EImageFormatGIF))
hgs
parents:
diff changeset
   368
        {
hgs
parents:
diff changeset
   369
        iGrabSettings.iSequantialCaptureImageFormat = EImageFormatPNG;
hgs
parents:
diff changeset
   370
        }
hgs
parents:
diff changeset
   371
    if (!(iGrabSettings.iSequantialCaptureMemoryInUseMultiDrive >= EPhoneMemory && iGrabSettings.iSequantialCaptureMemoryInUseMultiDrive <= EMemoryCard))
hgs
parents:
diff changeset
   372
        {
hgs
parents:
diff changeset
   373
        iGrabSettings.iSequantialCaptureMemoryInUseMultiDrive = EPhoneMemory;
hgs
parents:
diff changeset
   374
        }
hgs
parents:
diff changeset
   375
hgs
parents:
diff changeset
   376
    if (!(iGrabSettings.iVideoCaptureHotkey >= EHotkeySendKey && iGrabSettings.iVideoCaptureHotkey <= EHotkeyCameraKey1))
hgs
parents:
diff changeset
   377
        {
hgs
parents:
diff changeset
   378
        iGrabSettings.iVideoCaptureHotkey = EHotkeySendKey;
hgs
parents:
diff changeset
   379
        }
hgs
parents:
diff changeset
   380
    if (iGrabSettings.iVideoCaptureVideoFormat != EVideoFormatAnimatedGIF)
hgs
parents:
diff changeset
   381
        {
hgs
parents:
diff changeset
   382
        iGrabSettings.iVideoCaptureVideoFormat = EVideoFormatAnimatedGIF;
hgs
parents:
diff changeset
   383
        }
hgs
parents:
diff changeset
   384
    if (!(iGrabSettings.iVideoCaptureMemoryInUseMultiDrive >= EPhoneMemory && iGrabSettings.iVideoCaptureMemoryInUseMultiDrive <= EMemoryCard))
hgs
parents:
diff changeset
   385
        {
hgs
parents:
diff changeset
   386
        iGrabSettings.iVideoCaptureMemoryInUseMultiDrive = EPhoneMemory;
hgs
parents:
diff changeset
   387
        }
hgs
parents:
diff changeset
   388
	
hgs
parents:
diff changeset
   389
    }
hgs
parents:
diff changeset
   390
hgs
parents:
diff changeset
   391
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
void SGEngine::SaveDFSValueL(CDictionaryFileStore* aDicFS, const TUid& aUid, const TInt& aValue)
hgs
parents:
diff changeset
   394
    {
hgs
parents:
diff changeset
   395
    RDictionaryWriteStream out;
hgs
parents:
diff changeset
   396
    out.AssignLC(*aDicFS, aUid);
hgs
parents:
diff changeset
   397
    out.WriteInt16L(aValue);
hgs
parents:
diff changeset
   398
    out.CommitL();  
hgs
parents:
diff changeset
   399
    CleanupStack::PopAndDestroy(1);// out
hgs
parents:
diff changeset
   400
    }
hgs
parents:
diff changeset
   401
hgs
parents:
diff changeset
   402
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   403
hgs
parents:
diff changeset
   404
void SGEngine::SaveDFSValueL(CDictionaryFileStore* aDicFS, const TUid& aUid, const TDes& aValue)
hgs
parents:
diff changeset
   405
    {
hgs
parents:
diff changeset
   406
    RDictionaryWriteStream out;
hgs
parents:
diff changeset
   407
    out.AssignLC(*aDicFS, aUid);
hgs
parents:
diff changeset
   408
    out.WriteInt16L(aValue.Length());       // write length of the descriptor
hgs
parents:
diff changeset
   409
    out.WriteL(aValue, aValue.Length());    // write the descriptor itself
hgs
parents:
diff changeset
   410
    out.CommitL();  
hgs
parents:
diff changeset
   411
    CleanupStack::PopAndDestroy(1);// out
hgs
parents:
diff changeset
   412
    }
hgs
parents:
diff changeset
   413
    
hgs
parents:
diff changeset
   414
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   415
void SGEngine::SaveSettingsL(const TGrabSettings& aGrabSettings)
hgs
parents:
diff changeset
   416
    {
hgs
parents:
diff changeset
   417
hgs
parents:
diff changeset
   418
	
hgs
parents:
diff changeset
   419
    // set the new settings
hgs
parents:
diff changeset
   420
    iGrabSettings = aGrabSettings;
hgs
parents:
diff changeset
   421
hgs
parents:
diff changeset
   422
    // handle settings always in c:\\private\\101fb751\\
hgs
parents:
diff changeset
   423
    if (iFileSession.SetSessionToPrivate( KSettingsDrive ) == KErrNone)
hgs
parents:
diff changeset
   424
        {
hgs
parents:
diff changeset
   425
        // delete existing store to make sure that it is clean and not eg corrupted
hgs
parents:
diff changeset
   426
        if (BaflUtils::FileExists(iFileSession, KSettingsFileName))
hgs
parents:
diff changeset
   427
            {
hgs
parents:
diff changeset
   428
            iFileSession.Delete(KSettingsFileName);
hgs
parents:
diff changeset
   429
            }
hgs
parents:
diff changeset
   430
        
hgs
parents:
diff changeset
   431
        // create a dictionary file store
hgs
parents:
diff changeset
   432
        CDictionaryFileStore* settingsStore = CDictionaryFileStore::OpenLC(iFileSession, KSettingsFileName, KUidScreenGrabber);
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
        SaveDFSValueL(settingsStore, KSGSettingCaptureMode,                             iGrabSettings.iCaptureMode);
hgs
parents:
diff changeset
   435
        
hgs
parents:
diff changeset
   436
        SaveDFSValueL(settingsStore, KSGSettingSingleCaptureHotkey,                     iGrabSettings.iSingleCaptureHotkey);
hgs
parents:
diff changeset
   437
        SaveDFSValueL(settingsStore, KSGSettingSingleCaptureImageFormat,                iGrabSettings.iSingleCaptureImageFormat);
hgs
parents:
diff changeset
   438
        SaveDFSValueL(settingsStore, KSGSettingSingleCaptureMemoryInUseMultiDrive,      iGrabSettings.iSingleCaptureMemoryInUseMultiDrive);
hgs
parents:
diff changeset
   439
        SaveDFSValueL(settingsStore, KSGSettingSingleCaptureFileName,                   iGrabSettings.iSingleCaptureFileName);
hgs
parents:
diff changeset
   440
        
hgs
parents:
diff changeset
   441
        SaveDFSValueL(settingsStore, KSGSettingSequantialCaptureHotkey,                 iGrabSettings.iSequantialCaptureHotkey);
hgs
parents:
diff changeset
   442
        SaveDFSValueL(settingsStore, KSGSettingSequantialCaptureImageFormat,            iGrabSettings.iSequantialCaptureImageFormat);
hgs
parents:
diff changeset
   443
        SaveDFSValueL(settingsStore, KSGSettingSequantialCaptureDelay,                  iGrabSettings.iSequantialCaptureDelay);
hgs
parents:
diff changeset
   444
        SaveDFSValueL(settingsStore, KSGSettingSequantialCaptureMemoryInUseMultiDrive,  iGrabSettings.iSequantialCaptureMemoryInUseMultiDrive);
hgs
parents:
diff changeset
   445
        SaveDFSValueL(settingsStore, KSGSettingSequantialCaptureFileName,               iGrabSettings.iSequantialCaptureFileName);
hgs
parents:
diff changeset
   446
hgs
parents:
diff changeset
   447
        SaveDFSValueL(settingsStore, KSGSettingVideoCaptureHotkey,                      iGrabSettings.iVideoCaptureHotkey);
hgs
parents:
diff changeset
   448
        SaveDFSValueL(settingsStore, KSGSettingVideoCaptureVideoFormat,                 iGrabSettings.iVideoCaptureVideoFormat);
hgs
parents:
diff changeset
   449
        SaveDFSValueL(settingsStore, KSGSettingVideoCaptureMemoryInUseMultiDrive,       iGrabSettings.iVideoCaptureMemoryInUseMultiDrive);
hgs
parents:
diff changeset
   450
        SaveDFSValueL(settingsStore, KSGSettingVideoCaptureFileName,                    iGrabSettings.iVideoCaptureFileName);
hgs
parents:
diff changeset
   451
        
hgs
parents:
diff changeset
   452
        settingsStore->CommitL();
hgs
parents:
diff changeset
   453
        CleanupStack::PopAndDestroy(); // settingsStore             
hgs
parents:
diff changeset
   454
        }
hgs
parents:
diff changeset
   455
		
hgs
parents:
diff changeset
   456
    }
hgs
parents:
diff changeset
   457
        
hgs
parents:
diff changeset
   458
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   459
hgs
parents:
diff changeset
   460
void SGEngine::ActivateCaptureKeysL(TBool aChangeKey)
hgs
parents:
diff changeset
   461
    {
hgs
parents:
diff changeset
   462
	
hgs
parents:
diff changeset
   463
    // if changing the capture key, capturing needs to be cancelled first
hgs
parents:
diff changeset
   464
    if (aChangeKey)
hgs
parents:
diff changeset
   465
        {
hgs
parents:
diff changeset
   466
        CancelCapturing();
hgs
parents:
diff changeset
   467
        }
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
    // get hotkey of the capture
hgs
parents:
diff changeset
   470
    TInt captureHotkey(0);
hgs
parents:
diff changeset
   471
    if (iGrabSettings.iCaptureMode == ECaptureModeSingleCapture)
hgs
parents:
diff changeset
   472
        captureHotkey = iGrabSettings.iSingleCaptureHotkey;
hgs
parents:
diff changeset
   473
    else if (iGrabSettings.iCaptureMode == ECaptureModeSequantialCapture)
hgs
parents:
diff changeset
   474
        captureHotkey = iGrabSettings.iSequantialCaptureHotkey;
hgs
parents:
diff changeset
   475
    else if (iGrabSettings.iCaptureMode == ECaptureModeVideoCapture)
hgs
parents:
diff changeset
   476
        captureHotkey = iGrabSettings.iVideoCaptureHotkey;
hgs
parents:
diff changeset
   477
    else
hgs
parents:
diff changeset
   478
        User::Panic(_L("Wrong mode"), 40);
hgs
parents:
diff changeset
   479
    
hgs
parents:
diff changeset
   480
    
hgs
parents:
diff changeset
   481
hgs
parents:
diff changeset
   482
    // start capturing based on user selected key
hgs
parents:
diff changeset
   483
    switch (captureHotkey)
hgs
parents:
diff changeset
   484
        {
hgs
parents:
diff changeset
   485
        case EHotkeySendKey:
hgs
parents:
diff changeset
   486
            {
hgs
parents:
diff changeset
   487
            iCapturedKey    = iRootWin.CaptureKey(EStdKeyYes, EModifierCtrl|EModifierShift|EModifierFunc, 0, KEY_CAPTURE_PRIORITY);
hgs
parents:
diff changeset
   488
            iCapturedKeyUnD = iRootWin.CaptureKeyUpAndDowns(EStdKeyYes, EModifierCtrl|EModifierShift|EModifierFunc, 0, KEY_CAPTURE_PRIORITY);
hgs
parents:
diff changeset
   489
            break;
hgs
parents:
diff changeset
   490
            }
hgs
parents:
diff changeset
   491
        case EHotkeyPowerKey:
hgs
parents:
diff changeset
   492
            {
hgs
parents:
diff changeset
   493
            iCapturedKey    = iRootWin.CaptureKey(EStdKeyDevice2, EModifierCtrl|EModifierShift|EModifierFunc, 0, KEY_CAPTURE_PRIORITY);
hgs
parents:
diff changeset
   494
            iCapturedKeyUnD = iRootWin.CaptureKeyUpAndDowns(EStdKeyDevice2, EModifierCtrl|EModifierShift|EModifierFunc, 0, KEY_CAPTURE_PRIORITY);
hgs
parents:
diff changeset
   495
            break;
hgs
parents:
diff changeset
   496
            }
hgs
parents:
diff changeset
   497
        case EHotkeySideKey:
hgs
parents:
diff changeset
   498
            {
hgs
parents:
diff changeset
   499
            iCapturedKey    = iRootWin.CaptureKey(EStdKeyDevice6, EModifierCtrl|EModifierShift|EModifierFunc, 0, KEY_CAPTURE_PRIORITY);
hgs
parents:
diff changeset
   500
            iCapturedKeyUnD = iRootWin.CaptureKeyUpAndDowns(EStdKeyDevice6, EModifierCtrl|EModifierShift|EModifierFunc, 0, KEY_CAPTURE_PRIORITY);
hgs
parents:
diff changeset
   501
            break;            
hgs
parents:
diff changeset
   502
            }
hgs
parents:
diff changeset
   503
        case EHotkeyCameraKey1:
hgs
parents:
diff changeset
   504
            {
hgs
parents:
diff changeset
   505
            iCapturedKey    = iRootWin.CaptureKey(EStdKeyDevice7, EModifierCtrl|EModifierShift|EModifierFunc, 0, KEY_CAPTURE_PRIORITY);
hgs
parents:
diff changeset
   506
            iCapturedKeyUnD = iRootWin.CaptureKeyUpAndDowns(EStdKeyDevice7, EModifierCtrl|EModifierShift|EModifierFunc, 0, KEY_CAPTURE_PRIORITY);
hgs
parents:
diff changeset
   507
            break;            
hgs
parents:
diff changeset
   508
            }
hgs
parents:
diff changeset
   509
        default:
hgs
parents:
diff changeset
   510
            {
hgs
parents:
diff changeset
   511
            User::Panic(_L("Key not supported"), 100);
hgs
parents:
diff changeset
   512
            break;
hgs
parents:
diff changeset
   513
            }
hgs
parents:
diff changeset
   514
        }
hgs
parents:
diff changeset
   515
		
hgs
parents:
diff changeset
   516
    }
hgs
parents:
diff changeset
   517
hgs
parents:
diff changeset
   518
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   519
hgs
parents:
diff changeset
   520
hgs
parents:
diff changeset
   521
void SGEngine::CancelCapturing()
hgs
parents:
diff changeset
   522
    {
hgs
parents:
diff changeset
   523
	
hgs
parents:
diff changeset
   524
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- CancelCapturing start"));
hgs
parents:
diff changeset
   525
    // cancel all captures
hgs
parents:
diff changeset
   526
    iRootWin.CancelCaptureKey(iCapturedKey);
hgs
parents:
diff changeset
   527
    iRootWin.CancelCaptureKeyUpAndDowns(iCapturedKeyUnD);
hgs
parents:
diff changeset
   528
    
hgs
parents:
diff changeset
   529
    if (iHashKeyCapturingActivated)
hgs
parents:
diff changeset
   530
        {
hgs
parents:
diff changeset
   531
        iRootWin.CancelCaptureKey(iCapturedKeyHash);
hgs
parents:
diff changeset
   532
        iRootWin.CancelCaptureKeyUpAndDowns(iCapturedKeyHashUnD);
hgs
parents:
diff changeset
   533
        
hgs
parents:
diff changeset
   534
        iHashKeyCapturingActivated = EFalse;
hgs
parents:
diff changeset
   535
        }
hgs
parents:
diff changeset
   536
    
hgs
parents:
diff changeset
   537
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- CancelCapturing end"));
hgs
parents:
diff changeset
   538
	
hgs
parents:
diff changeset
   539
    }
hgs
parents:
diff changeset
   540
hgs
parents:
diff changeset
   541
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   542
hgs
parents:
diff changeset
   543
bool SGEngine::TakeScreenShotAndSaveL()
hgs
parents:
diff changeset
   544
    {
hgs
parents:
diff changeset
   545
	
hgs
parents:
diff changeset
   546
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- TakeSsAndSave start"));
hgs
parents:
diff changeset
   547
    if ( IsActive() )
hgs
parents:
diff changeset
   548
        {
hgs
parents:
diff changeset
   549
        SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- TakeSsAndSave already active, ignored"));
hgs
parents:
diff changeset
   550
        return false;
hgs
parents:
diff changeset
   551
        }
hgs
parents:
diff changeset
   552
    
hgs
parents:
diff changeset
   553
    // take a screen shot
hgs
parents:
diff changeset
   554
    CWsScreenDevice* screenDevice = new( ELeave ) CWsScreenDevice(CEikonEnv::Static()->WsSession() );
hgs
parents:
diff changeset
   555
    CleanupStack::PushL( screenDevice );
hgs
parents:
diff changeset
   556
	
hgs
parents:
diff changeset
   557
    User::LeaveIfError( screenDevice->Construct( CEikonEnv::Static()->WsSession().GetFocusScreen() ) );
hgs
parents:
diff changeset
   558
hgs
parents:
diff changeset
   559
	
hgs
parents:
diff changeset
   560
    User::LeaveIfError( iPreviouslyCapturedBitmap->Create(screenDevice->SizeInPixels(), screenDevice->DisplayMode()) );
hgs
parents:
diff changeset
   561
    User::LeaveIfError( screenDevice->CopyScreenToBitmap(iPreviouslyCapturedBitmap) );
hgs
parents:
diff changeset
   562
    CleanupStack::PopAndDestroy(); // screenDevice
hgs
parents:
diff changeset
   563
hgs
parents:
diff changeset
   564
hgs
parents:
diff changeset
   565
    // get memory in use & image format of the screen capture
hgs
parents:
diff changeset
   566
    TDriveNumber memoryInUse(EDriveC);
hgs
parents:
diff changeset
   567
    TInt intMemInUse(0);
hgs
parents:
diff changeset
   568
    TInt imageFormat(0);
hgs
parents:
diff changeset
   569
    TFileName fileName;
hgs
parents:
diff changeset
   570
    
hgs
parents:
diff changeset
   571
    if (iGrabSettings.iCaptureMode == ECaptureModeSingleCapture)
hgs
parents:
diff changeset
   572
        {        
hgs
parents:
diff changeset
   573
//        memoryInUse = iGrabSettings.iSingleCaptureMemoryInUseMultiDrive;
hgs
parents:
diff changeset
   574
        intMemInUse = iGrabSettings.iSingleCaptureMemoryInUseMultiDrive;
hgs
parents:
diff changeset
   575
        
hgs
parents:
diff changeset
   576
        imageFormat = iGrabSettings.iSingleCaptureImageFormat;
hgs
parents:
diff changeset
   577
        fileName = iGrabSettings.iSingleCaptureFileName;
hgs
parents:
diff changeset
   578
        }
hgs
parents:
diff changeset
   579
    else if (iGrabSettings.iCaptureMode == ECaptureModeSequantialCapture)
hgs
parents:
diff changeset
   580
        {          
hgs
parents:
diff changeset
   581
//        memoryInUse = iGrabSettings.iSequantialCaptureMemoryInUseMultiDrive;
hgs
parents:
diff changeset
   582
        intMemInUse = iGrabSettings.iSequantialCaptureMemoryInUseMultiDrive;
hgs
parents:
diff changeset
   583
        
hgs
parents:
diff changeset
   584
        imageFormat = iGrabSettings.iSequantialCaptureImageFormat;
hgs
parents:
diff changeset
   585
        fileName = iGrabSettings.iSequantialCaptureFileName;
hgs
parents:
diff changeset
   586
        }
hgs
parents:
diff changeset
   587
    else
hgs
parents:
diff changeset
   588
        User::Panic(_L("Wrong mode"), 30);  
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
hgs
parents:
diff changeset
   591
    // init the path for saving the file
hgs
parents:
diff changeset
   592
	
hgs
parents:
diff changeset
   593
	iSaveFileName.Copy( PathInfo::PhoneMemoryRootPath() );
hgs
parents:
diff changeset
   594
	
hgs
parents:
diff changeset
   595
//    if (memoryInUse != EDriveC)//something different as PhoneMemory (memory card or mass memory)
hgs
parents:
diff changeset
   596
    if (intMemInUse != 0)//something different as PhoneMemory (memory card or mass memory)
hgs
parents:
diff changeset
   597
    	{
hgs
parents:
diff changeset
   598
		memoryInUse = EDriveY;	    
hgs
parents:
diff changeset
   599
		if (PathInfo::GetRootPath(iSaveFileName, memoryInUse) != KErrNone || !DriveOK(memoryInUse))
hgs
parents:
diff changeset
   600
			{
hgs
parents:
diff changeset
   601
			//we need to find first available memory card in EDriveE - EDriveY range
hgs
parents:
diff changeset
   602
			for (TInt i = EDriveY; i>=EDriveE; i--)
hgs
parents:
diff changeset
   603
				{
hgs
parents:
diff changeset
   604
				if ( DriveOK((TDriveNumber)(i)))
hgs
parents:
diff changeset
   605
					{
hgs
parents:
diff changeset
   606
					if (IsDriveMMC((TDriveNumber)(i)))
hgs
parents:
diff changeset
   607
						{
hgs
parents:
diff changeset
   608
						PathInfo::GetRootPath(iSaveFileName, (TDriveNumber)(i));
hgs
parents:
diff changeset
   609
						break;
hgs
parents:
diff changeset
   610
						}    
hgs
parents:
diff changeset
   611
					}
hgs
parents:
diff changeset
   612
				}
hgs
parents:
diff changeset
   613
			}
hgs
parents:
diff changeset
   614
    	}
hgs
parents:
diff changeset
   615
hgs
parents:
diff changeset
   616
    iSaveFileName.Append( PathInfo::ImagesPath() );
hgs
parents:
diff changeset
   617
    iSaveFileName.Append( KScreenShotsSubDirectory );
hgs
parents:
diff changeset
   618
    
hgs
parents:
diff changeset
   619
    
hgs
parents:
diff changeset
   620
    // a quick check that filename is valid
hgs
parents:
diff changeset
   621
    if (fileName.Length() > 0 && fileName.Length() <= 255) 
hgs
parents:
diff changeset
   622
        iSaveFileName.Append( fileName );
hgs
parents:
diff changeset
   623
    else
hgs
parents:
diff changeset
   624
        iSaveFileName.Append( KDefaultImageFileName );
hgs
parents:
diff changeset
   625
hgs
parents:
diff changeset
   626
    iSaveFileName.Append( _L(".") );
hgs
parents:
diff changeset
   627
hgs
parents:
diff changeset
   628
hgs
parents:
diff changeset
   629
    // reset the encoder
hgs
parents:
diff changeset
   630
    if (iImageEncoder)
hgs
parents:
diff changeset
   631
        {
hgs
parents:
diff changeset
   632
        delete iImageEncoder;
hgs
parents:
diff changeset
   633
        iImageEncoder = NULL;
hgs
parents:
diff changeset
   634
        }
hgs
parents:
diff changeset
   635
        
hgs
parents:
diff changeset
   636
    
hgs
parents:
diff changeset
   637
    switch (imageFormat)
hgs
parents:
diff changeset
   638
        {
hgs
parents:
diff changeset
   639
        case EImageFormatPNG:
hgs
parents:
diff changeset
   640
            {
hgs
parents:
diff changeset
   641
            // set filename
hgs
parents:
diff changeset
   642
            iSaveFileName.Append(_L("png"));
hgs
parents:
diff changeset
   643
            CApaApplication::GenerateFileName(iFileSession, iSaveFileName );  // unique filename
hgs
parents:
diff changeset
   644
hgs
parents:
diff changeset
   645
            // init & convert
hgs
parents:
diff changeset
   646
            iImageEncoder = CImageEncoder::FileNewL(iFileSession, iSaveFileName, CImageEncoder::EOptionAlwaysThread, KImageTypePNGUid);
hgs
parents:
diff changeset
   647
			
hgs
parents:
diff changeset
   648
            iImageEncoder->Convert( &iStatus, *iPreviouslyCapturedBitmap );
hgs
parents:
diff changeset
   649
            }
hgs
parents:
diff changeset
   650
            break;
hgs
parents:
diff changeset
   651
        
hgs
parents:
diff changeset
   652
        case EImageFormatJPGHQ:
hgs
parents:
diff changeset
   653
        case EImageFormatJPGLQ:
hgs
parents:
diff changeset
   654
            {
hgs
parents:
diff changeset
   655
            // reset frameimagedata
hgs
parents:
diff changeset
   656
            if (iFrameImageData)
hgs
parents:
diff changeset
   657
                {
hgs
parents:
diff changeset
   658
                delete iFrameImageData;
hgs
parents:
diff changeset
   659
                iFrameImageData = NULL;
hgs
parents:
diff changeset
   660
                }
hgs
parents:
diff changeset
   661
            
hgs
parents:
diff changeset
   662
            // set filename
hgs
parents:
diff changeset
   663
            iSaveFileName.Append(_L("jpg"));
hgs
parents:
diff changeset
   664
            CApaApplication::GenerateFileName(iFileSession, iSaveFileName );  // unique filename
hgs
parents:
diff changeset
   665
hgs
parents:
diff changeset
   666
            // init 
hgs
parents:
diff changeset
   667
            iImageEncoder = CImageEncoder::FileNewL(iFileSession, iSaveFileName, CImageEncoder::EOptionAlwaysThread, KImageTypeJPGUid);
hgs
parents:
diff changeset
   668
hgs
parents:
diff changeset
   669
            // JPEG properties
hgs
parents:
diff changeset
   670
            TJpegImageData* imageData = new(ELeave) TJpegImageData;
hgs
parents:
diff changeset
   671
            imageData->iSampleScheme = TJpegImageData::EColor444;
hgs
parents:
diff changeset
   672
            imageData->iQualityFactor = (imageFormat==EImageFormatJPGHQ) ? HIGH_QUALITY_JPEG : LOW_QUALITY_JPEG;
hgs
parents:
diff changeset
   673
            iFrameImageData = CFrameImageData::NewL();
hgs
parents:
diff changeset
   674
            User::LeaveIfError(iFrameImageData->AppendImageData(imageData));  //ownership of imageData is transferred
hgs
parents:
diff changeset
   675
hgs
parents:
diff changeset
   676
            // convert
hgs
parents:
diff changeset
   677
            iImageEncoder->Convert( &iStatus, *iPreviouslyCapturedBitmap, iFrameImageData );
hgs
parents:
diff changeset
   678
            }
hgs
parents:
diff changeset
   679
            break;
hgs
parents:
diff changeset
   680
        
hgs
parents:
diff changeset
   681
        case EImageFormatBMP:
hgs
parents:
diff changeset
   682
            {
hgs
parents:
diff changeset
   683
            // set filename
hgs
parents:
diff changeset
   684
            iSaveFileName.Append(_L("bmp"));
hgs
parents:
diff changeset
   685
            CApaApplication::GenerateFileName(iFileSession, iSaveFileName );  // unique filename
hgs
parents:
diff changeset
   686
hgs
parents:
diff changeset
   687
            // init & convert
hgs
parents:
diff changeset
   688
            iImageEncoder = CImageEncoder::FileNewL(iFileSession, iSaveFileName, CImageEncoder::EOptionAlwaysThread, KImageTypeBMPUid);
hgs
parents:
diff changeset
   689
            iImageEncoder->Convert( &iStatus, *iPreviouslyCapturedBitmap );
hgs
parents:
diff changeset
   690
            }
hgs
parents:
diff changeset
   691
            break;
hgs
parents:
diff changeset
   692
hgs
parents:
diff changeset
   693
        case EImageFormatGIF:
hgs
parents:
diff changeset
   694
            {
hgs
parents:
diff changeset
   695
            // set filename
hgs
parents:
diff changeset
   696
            iSaveFileName.Append(_L("gif"));
hgs
parents:
diff changeset
   697
            CApaApplication::GenerateFileName(iFileSession, iSaveFileName );  // unique filename
hgs
parents:
diff changeset
   698
hgs
parents:
diff changeset
   699
            // init & convert
hgs
parents:
diff changeset
   700
            iImageEncoder = CImageEncoder::FileNewL(iFileSession, iSaveFileName, CImageEncoder::EOptionAlwaysThread, KImageTypeGIFUid);
hgs
parents:
diff changeset
   701
            iImageEncoder->Convert( &iStatus, *iPreviouslyCapturedBitmap );
hgs
parents:
diff changeset
   702
            }
hgs
parents:
diff changeset
   703
            break;
hgs
parents:
diff changeset
   704
            
hgs
parents:
diff changeset
   705
        case EImageFormatMBM:
hgs
parents:
diff changeset
   706
            {
hgs
parents:
diff changeset
   707
            // set filename
hgs
parents:
diff changeset
   708
            iSaveFileName.Append(_L("mbm"));
hgs
parents:
diff changeset
   709
            CApaApplication::GenerateFileName(iFileSession, iSaveFileName );  // unique filename
hgs
parents:
diff changeset
   710
hgs
parents:
diff changeset
   711
            // init & convert
hgs
parents:
diff changeset
   712
            iImageEncoder = CImageEncoder::FileNewL(iFileSession, iSaveFileName, CImageEncoder::EOptionAlwaysThread, KImageTypeMBMUid);
hgs
parents:
diff changeset
   713
            iImageEncoder->Convert( &iStatus, *iPreviouslyCapturedBitmap );
hgs
parents:
diff changeset
   714
            }
hgs
parents:
diff changeset
   715
            break;
hgs
parents:
diff changeset
   716
            
hgs
parents:
diff changeset
   717
        default:
hgs
parents:
diff changeset
   718
            {
hgs
parents:
diff changeset
   719
            User::Panic(_L("Invalid Img Type"), 20);
hgs
parents:
diff changeset
   720
            }
hgs
parents:
diff changeset
   721
        }
hgs
parents:
diff changeset
   722
hgs
parents:
diff changeset
   723
    // set the state of the active object
hgs
parents:
diff changeset
   724
    iState = EEncodingImage;
hgs
parents:
diff changeset
   725
hgs
parents:
diff changeset
   726
    // indicate an outstanding request
hgs
parents:
diff changeset
   727
    SetActive();
hgs
parents:
diff changeset
   728
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- TakeSsAndSave end"));
hgs
parents:
diff changeset
   729
	return true;
hgs
parents:
diff changeset
   730
    }
hgs
parents:
diff changeset
   731
    
hgs
parents:
diff changeset
   732
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   733
hgs
parents:
diff changeset
   734
hgs
parents:
diff changeset
   735
TBool SGEngine::DriveOK(TDriveNumber aNumber)
hgs
parents:
diff changeset
   736
    {
hgs
parents:
diff changeset
   737
	
hgs
parents:
diff changeset
   738
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- Driveok start"));
hgs
parents:
diff changeset
   739
    TBool isOK(EFalse);
hgs
parents:
diff changeset
   740
hgs
parents:
diff changeset
   741
    TVolumeInfo vInfo;
hgs
parents:
diff changeset
   742
hgs
parents:
diff changeset
   743
    // check if we can access the drive
hgs
parents:
diff changeset
   744
    if (iFileSession.Volume(vInfo, aNumber) == KErrNone)
hgs
parents:
diff changeset
   745
        isOK = ETrue;
hgs
parents:
diff changeset
   746
hgs
parents:
diff changeset
   747
    // returns ETrue if memory card working properly
hgs
parents:
diff changeset
   748
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- DriveOK end"));
hgs
parents:
diff changeset
   749
    return isOK;
hgs
parents:
diff changeset
   750
	
hgs
parents:
diff changeset
   751
    }
hgs
parents:
diff changeset
   752
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   753
hgs
parents:
diff changeset
   754
hgs
parents:
diff changeset
   755
TBool SGEngine::IsDriveMMC(TDriveNumber aDrive)
hgs
parents:
diff changeset
   756
    {
hgs
parents:
diff changeset
   757
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- IsDriveMMC start"));
hgs
parents:
diff changeset
   758
    TBool isOK(EFalse);
hgs
parents:
diff changeset
   759
hgs
parents:
diff changeset
   760
    TDriveInfo ii;   
hgs
parents:
diff changeset
   761
    if (iFileSession.Drive(ii, aDrive)==KErrNone) 
hgs
parents:
diff changeset
   762
        {      
hgs
parents:
diff changeset
   763
            if (ii.iType!=EMediaNotPresent &&
hgs
parents:
diff changeset
   764
                ii.iType!=EMediaUnknown &&           
hgs
parents:
diff changeset
   765
                ii.iType!=EMediaCdRom &&         
hgs
parents:
diff changeset
   766
                ii.iType!=EMediaRom) 
hgs
parents:
diff changeset
   767
                {           // memory card          
hgs
parents:
diff changeset
   768
                    isOK=ETrue;      
hgs
parents:
diff changeset
   769
                }   
hgs
parents:
diff changeset
   770
        }    
hgs
parents:
diff changeset
   771
                
hgs
parents:
diff changeset
   772
    
hgs
parents:
diff changeset
   773
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- IsDriveMMC end"));
hgs
parents:
diff changeset
   774
    return isOK;
hgs
parents:
diff changeset
   775
    }
hgs
parents:
diff changeset
   776
hgs
parents:
diff changeset
   777
hgs
parents:
diff changeset
   778
void SGEngine::CapturingFinishedL(TInt aErr)
hgs
parents:
diff changeset
   779
    {
hgs
parents:
diff changeset
   780
	
hgs
parents:
diff changeset
   781
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- CapturingFinished start"));
hgs
parents:
diff changeset
   782
    // display a global query to show the results
hgs
parents:
diff changeset
   783
    
hgs
parents:
diff changeset
   784
    if (aErr == KErrNone)
hgs
parents:
diff changeset
   785
        {
hgs
parents:
diff changeset
   786
        switch (iGrabSettings.iCaptureMode)
hgs
parents:
diff changeset
   787
            {
hgs
parents:
diff changeset
   788
            case ECaptureModeSingleCapture:
hgs
parents:
diff changeset
   789
                {
hgs
parents:
diff changeset
   790
                iEngineWrapper->ShowImageCapturedNote();
hgs
parents:
diff changeset
   791
                }
hgs
parents:
diff changeset
   792
                break;
hgs
parents:
diff changeset
   793
            
hgs
parents:
diff changeset
   794
            case ECaptureModeSequantialCapture:
hgs
parents:
diff changeset
   795
                {
hgs
parents:
diff changeset
   796
                iEngineWrapper->ShowSequantialImagesCapturedNote(iNumberOfTakenShots);
hgs
parents:
diff changeset
   797
                }
hgs
parents:
diff changeset
   798
                break;            
hgs
parents:
diff changeset
   799
    
hgs
parents:
diff changeset
   800
            case ECaptureModeVideoCapture:
hgs
parents:
diff changeset
   801
                {
hgs
parents:
diff changeset
   802
                iEngineWrapper->ShowVideoCapturedNote();
hgs
parents:
diff changeset
   803
                }
hgs
parents:
diff changeset
   804
                break;             
hgs
parents:
diff changeset
   805
    
hgs
parents:
diff changeset
   806
            default:
hgs
parents:
diff changeset
   807
                User::Panic(_L("Inv.capt.mode"), 51);
hgs
parents:
diff changeset
   808
                break;
hgs
parents:
diff changeset
   809
            }            
hgs
parents:
diff changeset
   810
       
hgs
parents:
diff changeset
   811
        }
hgs
parents:
diff changeset
   812
    else
hgs
parents:
diff changeset
   813
        {
hgs
parents:
diff changeset
   814
        
hgs
parents:
diff changeset
   815
        // Get error message with CTextResolver
hgs
parents:
diff changeset
   816
        CTextResolver* textResolver = CTextResolver::NewLC();
hgs
parents:
diff changeset
   817
        iEngineWrapper->ShowErrorMessage(textResolver->ResolveErrorString(aErr));
hgs
parents:
diff changeset
   818
hgs
parents:
diff changeset
   819
        CleanupStack::PopAndDestroy();  //textResolver    
hgs
parents:
diff changeset
   820
        
hgs
parents:
diff changeset
   821
        }
hgs
parents:
diff changeset
   822
hgs
parents:
diff changeset
   823
    // capturing can now be restarted
hgs
parents:
diff changeset
   824
    iState = EIdle;
hgs
parents:
diff changeset
   825
    iCapturingInProgress = EFalse;
hgs
parents:
diff changeset
   826
    iStopCapturing = EFalse;
hgs
parents:
diff changeset
   827
    
hgs
parents:
diff changeset
   828
    // reset values
hgs
parents:
diff changeset
   829
    iNumberOfTakenShots = 0;
hgs
parents:
diff changeset
   830
    iCurrentFrameNumber = 0;
hgs
parents:
diff changeset
   831
    iVideoFrameArray->Reset();
hgs
parents:
diff changeset
   832
    
hgs
parents:
diff changeset
   833
    
hgs
parents:
diff changeset
   834
    iState = EQueryDelay;
hgs
parents:
diff changeset
   835
    iTimer.After(iStatus, 2000000);
hgs
parents:
diff changeset
   836
    SetActive(); 
hgs
parents:
diff changeset
   837
    
hgs
parents:
diff changeset
   838
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- capturingfinished end"));
hgs
parents:
diff changeset
   839
	
hgs
parents:
diff changeset
   840
    }
hgs
parents:
diff changeset
   841
hgs
parents:
diff changeset
   842
hgs
parents:
diff changeset
   843
#if defined(HB_QT_S60_EVENT_FILTER)
hgs
parents:
diff changeset
   844
    TBool SGEngine::HandleCaptureCommandsL(const TWsEvent* aEvent)
hgs
parents:
diff changeset
   845
	{
hgs
parents:
diff changeset
   846
#else
hgs
parents:
diff changeset
   847
    TBool SGEngine::HandleCaptureCommandsL(const QSymbianEvent *event)
hgs
parents:
diff changeset
   848
	{
hgs
parents:
diff changeset
   849
    if (event->type() != QSymbianEvent::WindowServerEvent) {
hgs
parents:
diff changeset
   850
        return ETrue; //continueEventLoop
hgs
parents:
diff changeset
   851
    }
hgs
parents:
diff changeset
   852
    const TWsEvent *aEvent = event->windowServerEvent();
hgs
parents:
diff changeset
   853
#endif
hgs
parents:
diff changeset
   854
	
hgs
parents:
diff changeset
   855
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- HandleCaptureCommand start"));
hgs
parents:
diff changeset
   856
	
hgs
parents:
diff changeset
   857
	
hgs
parents:
diff changeset
   858
    TBool continueEventLoop(ETrue);
hgs
parents:
diff changeset
   859
    
hgs
parents:
diff changeset
   860
    // get hotkey of the capture
hgs
parents:
diff changeset
   861
    TInt captureHotkey(0);
hgs
parents:
diff changeset
   862
    if (iGrabSettings.iCaptureMode == ECaptureModeSingleCapture)
hgs
parents:
diff changeset
   863
        captureHotkey = iGrabSettings.iSingleCaptureHotkey;
hgs
parents:
diff changeset
   864
    else if (iGrabSettings.iCaptureMode == ECaptureModeSequantialCapture)
hgs
parents:
diff changeset
   865
        captureHotkey = iGrabSettings.iSequantialCaptureHotkey;
hgs
parents:
diff changeset
   866
    else if (iGrabSettings.iCaptureMode == ECaptureModeVideoCapture)
hgs
parents:
diff changeset
   867
        captureHotkey = iGrabSettings.iVideoCaptureHotkey;
hgs
parents:
diff changeset
   868
    else
hgs
parents:
diff changeset
   869
        User::Panic(_L("Wrong mode"), 41);
hgs
parents:
diff changeset
   870
    
hgs
parents:
diff changeset
   871
    // ignore any errors
hgs
parents:
diff changeset
   872
    if (aEvent->Type()==EEventErrorMessage)
hgs
parents:
diff changeset
   873
        {
hgs
parents:
diff changeset
   874
        // error
hgs
parents:
diff changeset
   875
        }
hgs
parents:
diff changeset
   876
    
hgs
parents:
diff changeset
   877
            
hgs
parents:
diff changeset
   878
    // handle captured keys, we are interested here only of the keydown events
hgs
parents:
diff changeset
   879
    else
hgs
parents:
diff changeset
   880
        
hgs
parents:
diff changeset
   881
        if (
hgs
parents:
diff changeset
   882
              ( captureHotkey == EHotkeySendKey &&
hgs
parents:
diff changeset
   883
                aEvent->Type()==EEventKeyDown && aEvent->Key()->iScanCode==EStdKeyYes )
hgs
parents:
diff changeset
   884
            ||
hgs
parents:
diff changeset
   885
              ( captureHotkey == EHotkeyPowerKey &&
hgs
parents:
diff changeset
   886
                aEvent->Type()==EEventKeyDown && aEvent->Key()->iScanCode==EStdKeyDevice2 )
hgs
parents:
diff changeset
   887
            ||
hgs
parents:
diff changeset
   888
              ( captureHotkey == EHotkeySideKey &&
hgs
parents:
diff changeset
   889
                aEvent->Type()==EEventKeyDown && aEvent->Key()->iScanCode==EStdKeyDevice6 )
hgs
parents:
diff changeset
   890
            ||
hgs
parents:
diff changeset
   891
              ( captureHotkey == EHotkeyCameraKey1 &&
hgs
parents:
diff changeset
   892
                aEvent->Type()==EEventKeyDown && aEvent->Key()->iScanCode==EStdKeyDevice7 )
hgs
parents:
diff changeset
   893
            )
hgs
parents:
diff changeset
   894
        {
hgs
parents:
diff changeset
   895
        
hgs
parents:
diff changeset
   896
        // check if already capturing images in sequence
hgs
parents:
diff changeset
   897
        if ( iCapturingInProgress && !iStopCapturing && iNumberOfTakenShots!=0 && iGrabSettings.iCaptureMode == ECaptureModeSequantialCapture )
hgs
parents:
diff changeset
   898
            {
hgs
parents:
diff changeset
   899
            // asking to stop capturing
hgs
parents:
diff changeset
   900
            iStopCapturing = ETrue; 
hgs
parents:
diff changeset
   901
            
hgs
parents:
diff changeset
   902
            // cancel the active object, this will cancel any timer delays and ICL stuff
hgs
parents:
diff changeset
   903
            Cancel();
hgs
parents:
diff changeset
   904
            
hgs
parents:
diff changeset
   905
            // set status
hgs
parents:
diff changeset
   906
            iState = ECancelCapturing; 
hgs
parents:
diff changeset
   907
            
hgs
parents:
diff changeset
   908
            // jump smoothly to RunL()
hgs
parents:
diff changeset
   909
            iTimer.After(iStatus, 50);
hgs
parents:
diff changeset
   910
            SetActive(); 
hgs
parents:
diff changeset
   911
hgs
parents:
diff changeset
   912
            // do not continue the event loop in HandleWsEventL for these events
hgs
parents:
diff changeset
   913
            continueEventLoop = EFalse;
hgs
parents:
diff changeset
   914
            }
hgs
parents:
diff changeset
   915
hgs
parents:
diff changeset
   916
        // check if already capturing video
hgs
parents:
diff changeset
   917
        else if ( iCapturingInProgress && !iStopCapturing && iGrabSettings.iCaptureMode == ECaptureModeVideoCapture )
hgs
parents:
diff changeset
   918
            {
hgs
parents:
diff changeset
   919
            // asking to stop capturing
hgs
parents:
diff changeset
   920
            iStopCapturing = ETrue;
hgs
parents:
diff changeset
   921
            
hgs
parents:
diff changeset
   922
            // cancel the active object, this will cancel any timer delays and ICL stuff
hgs
parents:
diff changeset
   923
            Cancel();
hgs
parents:
diff changeset
   924
hgs
parents:
diff changeset
   925
            // set status
hgs
parents:
diff changeset
   926
            iState = ECancelVideoCapturing;
hgs
parents:
diff changeset
   927
            
hgs
parents:
diff changeset
   928
            // jump smoothly to RunL()
hgs
parents:
diff changeset
   929
            iTimer.After(iStatus, 50);
hgs
parents:
diff changeset
   930
            SetActive(); 
hgs
parents:
diff changeset
   931
hgs
parents:
diff changeset
   932
            // do not continue the event loop in HandleWsEventL for these events
hgs
parents:
diff changeset
   933
            continueEventLoop = EFalse;
hgs
parents:
diff changeset
   934
            }        
hgs
parents:
diff changeset
   935
        else if (!iCapturingInProgress && (iGrabSettings.iCaptureMode == ECaptureModeSingleCapture || iGrabSettings.iCaptureMode == ECaptureModeSequantialCapture ))
hgs
parents:
diff changeset
   936
            {
hgs
parents:
diff changeset
   937
            
hgs
parents:
diff changeset
   938
            // take a screen shot and save it
hgs
parents:
diff changeset
   939
           if( TakeScreenShotAndSaveL())
hgs
parents:
diff changeset
   940
               {
hgs
parents:
diff changeset
   941
               // not capturing anything, so start doing that
hgs
parents:
diff changeset
   942
               iCapturingInProgress = ETrue;    
hgs
parents:
diff changeset
   943
               // do not continue the event loop in HandleWsEventL for these events
hgs
parents:
diff changeset
   944
               continueEventLoop = EFalse;
hgs
parents:
diff changeset
   945
               }
hgs
parents:
diff changeset
   946
            }
hgs
parents:
diff changeset
   947
        
hgs
parents:
diff changeset
   948
        else if (!iCapturingInProgress && iGrabSettings.iCaptureMode == ECaptureModeVideoCapture )
hgs
parents:
diff changeset
   949
            {
hgs
parents:
diff changeset
   950
            // not capturing anything, so start doing that
hgs
parents:
diff changeset
   951
            iCapturingInProgress = ETrue;
hgs
parents:
diff changeset
   952
            
hgs
parents:
diff changeset
   953
            // clean temporary files
hgs
parents:
diff changeset
   954
            TRAP_IGNORE( CleanTemporaryFilesL() );
hgs
parents:
diff changeset
   955
            
hgs
parents:
diff changeset
   956
            // get initial dimensions for the video
hgs
parents:
diff changeset
   957
            CWsScreenDevice* screenDevice = new(ELeave) CWsScreenDevice ( CEikonEnv::Static()->WsSession() );
hgs
parents:
diff changeset
   958
            CleanupStack::PushL(screenDevice);
hgs
parents:
diff changeset
   959
			
hgs
parents:
diff changeset
   960
            User::LeaveIfError( screenDevice->Construct( CEikonEnv::Static()->WsSession().GetFocusScreen() ) );
hgs
parents:
diff changeset
   961
			
hgs
parents:
diff changeset
   962
            iVideoDimensions = screenDevice->SizeInPixels();
hgs
parents:
diff changeset
   963
            iPreviousFrameScreenDimension = screenDevice->SizeInPixels();
hgs
parents:
diff changeset
   964
            CleanupStack::PopAndDestroy(); // screenDevice
hgs
parents:
diff changeset
   965
hgs
parents:
diff changeset
   966
            // capture the first frame
hgs
parents:
diff changeset
   967
            CaptureFrameForVideoL();              
hgs
parents:
diff changeset
   968
hgs
parents:
diff changeset
   969
            // do not continue the event loop in HandleWsEventL for these events
hgs
parents:
diff changeset
   970
            continueEventLoop = EFalse;
hgs
parents:
diff changeset
   971
            }
hgs
parents:
diff changeset
   972
hgs
parents:
diff changeset
   973
        }
hgs
parents:
diff changeset
   974
hgs
parents:
diff changeset
   975
    // catch other event types as well so that we can ignore them
hgs
parents:
diff changeset
   976
    else if (
hgs
parents:
diff changeset
   977
              ( captureHotkey == EHotkeySendKey &&
hgs
parents:
diff changeset
   978
                aEvent->Key()->iScanCode==EStdKeyYes )
hgs
parents:
diff changeset
   979
            ||
hgs
parents:
diff changeset
   980
              ( captureHotkey == EHotkeyPowerKey &&
hgs
parents:
diff changeset
   981
                aEvent->Key()->iScanCode==EStdKeyDevice2 )
hgs
parents:
diff changeset
   982
            ||
hgs
parents:
diff changeset
   983
              ( captureHotkey == EHotkeySideKey &&
hgs
parents:
diff changeset
   984
                aEvent->Key()->iScanCode==EStdKeyDevice6 )
hgs
parents:
diff changeset
   985
            ||
hgs
parents:
diff changeset
   986
              ( captureHotkey == EHotkeyCameraKey1 &&
hgs
parents:
diff changeset
   987
                aEvent->Key()->iScanCode==EStdKeyDevice7 )
hgs
parents:
diff changeset
   988
           )
hgs
parents:
diff changeset
   989
        {
hgs
parents:
diff changeset
   990
        // do not continue the event loop in HandleWsEventL for these events
hgs
parents:
diff changeset
   991
        continueEventLoop = EFalse;
hgs
parents:
diff changeset
   992
        }
hgs
parents:
diff changeset
   993
hgs
parents:
diff changeset
   994
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- HandleCapturcommand end"));
hgs
parents:
diff changeset
   995
hgs
parents:
diff changeset
   996
    
hgs
parents:
diff changeset
   997
    return continueEventLoop;
hgs
parents:
diff changeset
   998
    
hgs
parents:
diff changeset
   999
    }
hgs
parents:
diff changeset
  1000
hgs
parents:
diff changeset
  1001
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1002
hgs
parents:
diff changeset
  1003
void SGEngine::CleanTemporaryFilesL()
hgs
parents:
diff changeset
  1004
    {
hgs
parents:
diff changeset
  1005
	
hgs
parents:
diff changeset
  1006
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- CleanTempFiles start"));
hgs
parents:
diff changeset
  1007
    
hgs
parents:
diff changeset
  1008
    // delete temporary files from C and D drives    
hgs
parents:
diff changeset
  1009
    CFileMan* fileMan = CFileMan::NewL(iFileSession);
hgs
parents:
diff changeset
  1010
hgs
parents:
diff changeset
  1011
    TFileName delFilesPath;
hgs
parents:
diff changeset
  1012
        
hgs
parents:
diff changeset
  1013
    for (TInt i=0; i<1; i++)
hgs
parents:
diff changeset
  1014
        {
hgs
parents:
diff changeset
  1015
        delFilesPath.Copy(KNullDesC);
hgs
parents:
diff changeset
  1016
        delFilesPath.Append('C'+i);
hgs
parents:
diff changeset
  1017
        delFilesPath.Append(_L(":"));
hgs
parents:
diff changeset
  1018
        delFilesPath.Append(KSGTemporaryDirectory);
hgs
parents:
diff changeset
  1019
        delFilesPath.Append(_L("*.$$$"));
hgs
parents:
diff changeset
  1020
        
hgs
parents:
diff changeset
  1021
        fileMan->Delete(delFilesPath);
hgs
parents:
diff changeset
  1022
        }
hgs
parents:
diff changeset
  1023
hgs
parents:
diff changeset
  1024
    delete fileMan;    
hgs
parents:
diff changeset
  1025
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- CleanTempfile end"));
hgs
parents:
diff changeset
  1026
	
hgs
parents:
diff changeset
  1027
    }
hgs
parents:
diff changeset
  1028
hgs
parents:
diff changeset
  1029
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1030
hgs
parents:
diff changeset
  1031
void SGEngine::ActivateModelL()
hgs
parents:
diff changeset
  1032
    {
hgs
parents:
diff changeset
  1033
    // clean temporary files
hgs
parents:
diff changeset
  1034
    TRAP_IGNORE( CleanTemporaryFilesL() );
hgs
parents:
diff changeset
  1035
            
hgs
parents:
diff changeset
  1036
    // load settings
hgs
parents:
diff changeset
  1037
    TRAP_IGNORE( LoadSettingsL() );
hgs
parents:
diff changeset
  1038
hgs
parents:
diff changeset
  1039
    // start capturing
hgs
parents:
diff changeset
  1040
    ActivateCaptureKeysL();
hgs
parents:
diff changeset
  1041
    }
hgs
parents:
diff changeset
  1042
hgs
parents:
diff changeset
  1043
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1044
hgs
parents:
diff changeset
  1045
void SGEngine::DeActivateModelL()
hgs
parents:
diff changeset
  1046
    {
hgs
parents:
diff changeset
  1047
	
hgs
parents:
diff changeset
  1048
    CancelCapturing();
hgs
parents:
diff changeset
  1049
hgs
parents:
diff changeset
  1050
    // for a faster exit, send the application to background
hgs
parents:
diff changeset
  1051
    TApaTask selfTask(CEikonEnv::Static()->WsSession());
hgs
parents:
diff changeset
  1052
    selfTask.SetWgId(iRootWin.Identifier());
hgs
parents:
diff changeset
  1053
    selfTask.SendToBackground();
hgs
parents:
diff changeset
  1054
	
hgs
parents:
diff changeset
  1055
	
hgs
parents:
diff changeset
  1056
    }
hgs
parents:
diff changeset
  1057
    
hgs
parents:
diff changeset
  1058
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1059
hgs
parents:
diff changeset
  1060
hgs
parents:
diff changeset
  1061
void SGEngine::CaptureFrameForVideoL()
hgs
parents:
diff changeset
  1062
    {
hgs
parents:
diff changeset
  1063
    
hgs
parents:
diff changeset
  1064
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- CaptureFrameforvide start"));
hgs
parents:
diff changeset
  1065
    // record time
hgs
parents:
diff changeset
  1066
    TTime timeNow;
hgs
parents:
diff changeset
  1067
    timeNow.HomeTime();
hgs
parents:
diff changeset
  1068
    
hgs
parents:
diff changeset
  1069
    // take a screen shot   
hgs
parents:
diff changeset
  1070
    CFbsBitmap* currentCapturedBitmap = new(ELeave) CFbsBitmap;
hgs
parents:
diff changeset
  1071
    CleanupStack::PushL(currentCapturedBitmap);
hgs
parents:
diff changeset
  1072
hgs
parents:
diff changeset
  1073
    CWsScreenDevice* screenDevice = new(ELeave) CWsScreenDevice( CEikonEnv::Static()->WsSession() );
hgs
parents:
diff changeset
  1074
    CleanupStack::PushL( screenDevice );
hgs
parents:
diff changeset
  1075
    User::LeaveIfError( screenDevice->Construct( CEikonEnv::Static()->WsSession().GetFocusScreen() ) );
hgs
parents:
diff changeset
  1076
    
hgs
parents:
diff changeset
  1077
    TSize currentScreenSize = screenDevice->SizeInPixels();
hgs
parents:
diff changeset
  1078
hgs
parents:
diff changeset
  1079
    User::LeaveIfError( currentCapturedBitmap->Create(currentScreenSize, EColor256) );
hgs
parents:
diff changeset
  1080
    User::LeaveIfError( screenDevice->CopyScreenToBitmap(currentCapturedBitmap) );
hgs
parents:
diff changeset
  1081
    CleanupStack::PopAndDestroy(); // screenDevice
hgs
parents:
diff changeset
  1082
hgs
parents:
diff changeset
  1083
    // grow video's dimensions if the size has changed
hgs
parents:
diff changeset
  1084
    if (currentScreenSize.iWidth > iVideoDimensions.iWidth)
hgs
parents:
diff changeset
  1085
        {
hgs
parents:
diff changeset
  1086
        iVideoDimensions.iWidth = currentScreenSize.iWidth;
hgs
parents:
diff changeset
  1087
        }
hgs
parents:
diff changeset
  1088
    if (currentScreenSize.iHeight > iVideoDimensions.iHeight)
hgs
parents:
diff changeset
  1089
        {
hgs
parents:
diff changeset
  1090
        iVideoDimensions.iHeight = currentScreenSize.iHeight;
hgs
parents:
diff changeset
  1091
        }
hgs
parents:
diff changeset
  1092
hgs
parents:
diff changeset
  1093
    TInt64 currentDelay(0);
hgs
parents:
diff changeset
  1094
 
hgs
parents:
diff changeset
  1095
hgs
parents:
diff changeset
  1096
    // create a new frame
hgs
parents:
diff changeset
  1097
    TVideoFrame frame;
hgs
parents:
diff changeset
  1098
    frame.iDelay = 500; // use default delay 5.00 secs
hgs
parents:
diff changeset
  1099
    
hgs
parents:
diff changeset
  1100
    // get info of the RAM drive
hgs
parents:
diff changeset
  1101
    TDriveNumber ramDrive = EDriveD;
hgs
parents:
diff changeset
  1102
    TVolumeInfo ramDriveInfo;
hgs
parents:
diff changeset
  1103
    iFileSession.Volume(ramDriveInfo, ramDrive);
hgs
parents:
diff changeset
  1104
    
hgs
parents:
diff changeset
  1105
    // init the directory for saving the file, preferably use ram drive if there is enough disk space, otherwise use always C drive
hgs
parents:
diff changeset
  1106
    TFileName tempDirectory;
hgs
parents:
diff changeset
  1107
    TFileName sessionPath;
hgs
parents:
diff changeset
  1108
    
hgs
parents:
diff changeset
  1109
    if (ramDriveInfo.iFree > (iVideoDimensions.iWidth*iVideoDimensions.iHeight+50000))
hgs
parents:
diff changeset
  1110
        sessionPath.Copy( _L("D:") );
hgs
parents:
diff changeset
  1111
    else
hgs
parents:
diff changeset
  1112
        sessionPath.Copy( _L("C:") );
hgs
parents:
diff changeset
  1113
    
hgs
parents:
diff changeset
  1114
    sessionPath.Append(KSGTemporaryDirectory);
hgs
parents:
diff changeset
  1115
    tempDirectory.Copy(KSGTemporaryDirectory);
hgs
parents:
diff changeset
  1116
    
hgs
parents:
diff changeset
  1117
    iFileSession.MkDirAll(sessionPath);
hgs
parents:
diff changeset
  1118
    iFileSession.SetSessionPath(sessionPath);
hgs
parents:
diff changeset
  1119
hgs
parents:
diff changeset
  1120
    // create a temp file, path to the bitmap is saved automatically to frame.iFileStorePath
hgs
parents:
diff changeset
  1121
    RFile file;
hgs
parents:
diff changeset
  1122
    User::LeaveIfError( file.Temp(iFileSession, tempDirectory, frame.iFileStorePath, EFileWrite) );
hgs
parents:
diff changeset
  1123
    RFileWriteStream writeStream(file);
hgs
parents:
diff changeset
  1124
    
hgs
parents:
diff changeset
  1125
    TBool ignoreFrame(EFalse);
hgs
parents:
diff changeset
  1126
    
hgs
parents:
diff changeset
  1127
    // check if is this the first frame
hgs
parents:
diff changeset
  1128
    if (iCurrentFrameNumber == 0)
hgs
parents:
diff changeset
  1129
        {
hgs
parents:
diff changeset
  1130
        // first frame is always the full one
hgs
parents:
diff changeset
  1131
        frame.iWidth = currentScreenSize.iWidth;    
hgs
parents:
diff changeset
  1132
        frame.iHeight = currentScreenSize.iHeight;  
hgs
parents:
diff changeset
  1133
        frame.iXPos = 0;
hgs
parents:
diff changeset
  1134
        frame.iYPos = 0;
hgs
parents:
diff changeset
  1135
        frame.iEnableTransparency = EFalse;
hgs
parents:
diff changeset
  1136
        frame.iFillsWholeScreen = ETrue;
hgs
parents:
diff changeset
  1137
        
hgs
parents:
diff changeset
  1138
        currentCapturedBitmap->ExternalizeL(writeStream);  
hgs
parents:
diff changeset
  1139
hgs
parents:
diff changeset
  1140
        }
hgs
parents:
diff changeset
  1141
    
hgs
parents:
diff changeset
  1142
    else
hgs
parents:
diff changeset
  1143
        {
hgs
parents:
diff changeset
  1144
        // next frame is a difference between the previous one
hgs
parents:
diff changeset
  1145
        currentDelay = timeNow.MicroSecondsFrom(iPreviousFrameTaken).Int64();
hgs
parents:
diff changeset
  1146
        
hgs
parents:
diff changeset
  1147
        // get reference to previos frame
hgs
parents:
diff changeset
  1148
        TVideoFrame& prevFrame = iVideoFrameArray->At(iVideoFrameArray->Count()-1);
hgs
parents:
diff changeset
  1149
        
hgs
parents:
diff changeset
  1150
        
hgs
parents:
diff changeset
  1151
        // check if video dimensions have changed
hgs
parents:
diff changeset
  1152
        if (currentScreenSize.iWidth != iPreviousFrameScreenDimension.iWidth
hgs
parents:
diff changeset
  1153
            || currentScreenSize.iHeight != iPreviousFrameScreenDimension.iHeight)
hgs
parents:
diff changeset
  1154
            {
hgs
parents:
diff changeset
  1155
            // dimensions have changed -> save a full bitmap
hgs
parents:
diff changeset
  1156
            frame.iWidth = currentScreenSize.iWidth;    
hgs
parents:
diff changeset
  1157
            frame.iHeight = currentScreenSize.iHeight;  
hgs
parents:
diff changeset
  1158
            frame.iXPos = 0;
hgs
parents:
diff changeset
  1159
            frame.iYPos = 0;
hgs
parents:
diff changeset
  1160
            frame.iEnableTransparency = EFalse;
hgs
parents:
diff changeset
  1161
            frame.iFillsWholeScreen = ETrue;
hgs
parents:
diff changeset
  1162
            
hgs
parents:
diff changeset
  1163
            currentCapturedBitmap->ExternalizeL(writeStream);            
hgs
parents:
diff changeset
  1164
hgs
parents:
diff changeset
  1165
            // update the previous frame to contain the new delay value
hgs
parents:
diff changeset
  1166
            prevFrame.iDelay = TUint( (double) currentDelay / 10000 );
hgs
parents:
diff changeset
  1167
            }
hgs
parents:
diff changeset
  1168
hgs
parents:
diff changeset
  1169
        else
hgs
parents:
diff changeset
  1170
            {
hgs
parents:
diff changeset
  1171
            // compare the bitmaps
hgs
parents:
diff changeset
  1172
            TUint bufSize = currentScreenSize.iWidth*3;
hgs
parents:
diff changeset
  1173
            HBufC8* curImgScanLineBuf = HBufC8::NewLC(bufSize);
hgs
parents:
diff changeset
  1174
            TPtr8 curImgScanLinePtr = curImgScanLineBuf->Des();
hgs
parents:
diff changeset
  1175
            HBufC8* prevImgScanLineBuf = HBufC8::NewLC(bufSize);
hgs
parents:
diff changeset
  1176
            TPtr8 prevImgScanLinePtr = prevImgScanLineBuf->Des();
hgs
parents:
diff changeset
  1177
            
hgs
parents:
diff changeset
  1178
            TPoint pt(0,0);
hgs
parents:
diff changeset
  1179
            TBool differenceFound(EFalse);
hgs
parents:
diff changeset
  1180
            TPoint leftTopDifferencePoint(0,0);
hgs
parents:
diff changeset
  1181
            TPoint rightBottomDifferencePoint(currentScreenSize.iWidth,currentScreenSize.iHeight);
hgs
parents:
diff changeset
  1182
            
hgs
parents:
diff changeset
  1183
            // scan the image from top to bottom
hgs
parents:
diff changeset
  1184
            for (TInt i=0; i<currentScreenSize.iHeight; i++)
hgs
parents:
diff changeset
  1185
                {
hgs
parents:
diff changeset
  1186
                pt.iY = i;
hgs
parents:
diff changeset
  1187
                
hgs
parents:
diff changeset
  1188
                currentCapturedBitmap->GetScanLine(curImgScanLinePtr, pt, currentScreenSize.iWidth, EColor256);
hgs
parents:
diff changeset
  1189
                iPreviouslyCapturedBitmap->GetScanLine(prevImgScanLinePtr, pt, currentScreenSize.iWidth, EColor256);
hgs
parents:
diff changeset
  1190
                
hgs
parents:
diff changeset
  1191
                if (curImgScanLinePtr != prevImgScanLinePtr)
hgs
parents:
diff changeset
  1192
                    {
hgs
parents:
diff changeset
  1193
                    differenceFound = ETrue;
hgs
parents:
diff changeset
  1194
                    
hgs
parents:
diff changeset
  1195
                    // get the y-coordinate
hgs
parents:
diff changeset
  1196
                    leftTopDifferencePoint.iY = i;
hgs
parents:
diff changeset
  1197
hgs
parents:
diff changeset
  1198
                    break;    
hgs
parents:
diff changeset
  1199
                    }
hgs
parents:
diff changeset
  1200
                }
hgs
parents:
diff changeset
  1201
                
hgs
parents:
diff changeset
  1202
            if (differenceFound)
hgs
parents:
diff changeset
  1203
                {
hgs
parents:
diff changeset
  1204
                // now we know that there is some difference between those two captured frames,
hgs
parents:
diff changeset
  1205
                // get the bottom value by scaning from bottom to top
hgs
parents:
diff changeset
  1206
                for (TInt i=currentScreenSize.iHeight-1; i>=0; i--)
hgs
parents:
diff changeset
  1207
                    {
hgs
parents:
diff changeset
  1208
                    pt.iY = i;
hgs
parents:
diff changeset
  1209
                    
hgs
parents:
diff changeset
  1210
                    currentCapturedBitmap->GetScanLine(curImgScanLinePtr, pt, currentScreenSize.iWidth, EColor256);
hgs
parents:
diff changeset
  1211
                    iPreviouslyCapturedBitmap->GetScanLine(prevImgScanLinePtr, pt, currentScreenSize.iWidth, EColor256);
hgs
parents:
diff changeset
  1212
                    
hgs
parents:
diff changeset
  1213
                    if (curImgScanLinePtr != prevImgScanLinePtr)
hgs
parents:
diff changeset
  1214
                        {
hgs
parents:
diff changeset
  1215
                        // get the y-coordinate
hgs
parents:
diff changeset
  1216
                        rightBottomDifferencePoint.iY = i+1;
hgs
parents:
diff changeset
  1217
hgs
parents:
diff changeset
  1218
                        break;    
hgs
parents:
diff changeset
  1219
                        }
hgs
parents:
diff changeset
  1220
                    }
hgs
parents:
diff changeset
  1221
                    
hgs
parents:
diff changeset
  1222
                // check that the height of the cropped image will be at least 1
hgs
parents:
diff changeset
  1223
                if (rightBottomDifferencePoint.iY <= leftTopDifferencePoint.iY)
hgs
parents:
diff changeset
  1224
                    rightBottomDifferencePoint.iY = leftTopDifferencePoint.iY+1;  
hgs
parents:
diff changeset
  1225
                
hgs
parents:
diff changeset
  1226
                      
hgs
parents:
diff changeset
  1227
                // get also the x-coordinates by scanning vertical scan lines
hgs
parents:
diff changeset
  1228
                bufSize = currentScreenSize.iHeight*3;
hgs
parents:
diff changeset
  1229
                HBufC8* curImgVerticalScanLineBuf = HBufC8::NewLC(bufSize);
hgs
parents:
diff changeset
  1230
                TPtr8 curImgVerticalScanLinePtr = curImgVerticalScanLineBuf->Des();
hgs
parents:
diff changeset
  1231
                HBufC8* prevImgVerticalScanLineBuf = HBufC8::NewLC(bufSize);
hgs
parents:
diff changeset
  1232
                TPtr8 prevImgVerticalScanLinePtr = prevImgVerticalScanLineBuf->Des();
hgs
parents:
diff changeset
  1233
                
hgs
parents:
diff changeset
  1234
                // first scan by from left to right
hgs
parents:
diff changeset
  1235
                for (TInt i=0; i<currentScreenSize.iWidth; i++)
hgs
parents:
diff changeset
  1236
                    {
hgs
parents:
diff changeset
  1237
                    currentCapturedBitmap->GetVerticalScanLine(curImgVerticalScanLinePtr, i, EColor256);
hgs
parents:
diff changeset
  1238
                    iPreviouslyCapturedBitmap->GetVerticalScanLine(prevImgVerticalScanLinePtr, i, EColor256);
hgs
parents:
diff changeset
  1239
                    
hgs
parents:
diff changeset
  1240
                    if (curImgVerticalScanLinePtr != prevImgVerticalScanLinePtr)
hgs
parents:
diff changeset
  1241
                        {
hgs
parents:
diff changeset
  1242
                        leftTopDifferencePoint.iX = i;
hgs
parents:
diff changeset
  1243
                        break;
hgs
parents:
diff changeset
  1244
                        }
hgs
parents:
diff changeset
  1245
                    }
hgs
parents:
diff changeset
  1246
hgs
parents:
diff changeset
  1247
                // finally scan from right to left
hgs
parents:
diff changeset
  1248
                for (TInt i=currentScreenSize.iWidth-1; i>=0; i--)
hgs
parents:
diff changeset
  1249
                    {
hgs
parents:
diff changeset
  1250
                    currentCapturedBitmap->GetVerticalScanLine(curImgVerticalScanLinePtr, i, EColor256);
hgs
parents:
diff changeset
  1251
                    iPreviouslyCapturedBitmap->GetVerticalScanLine(prevImgVerticalScanLinePtr, i, EColor256);
hgs
parents:
diff changeset
  1252
                    
hgs
parents:
diff changeset
  1253
                    if (curImgVerticalScanLinePtr != prevImgVerticalScanLinePtr)
hgs
parents:
diff changeset
  1254
                        {
hgs
parents:
diff changeset
  1255
                        rightBottomDifferencePoint.iX = i+1;
hgs
parents:
diff changeset
  1256
                        break;
hgs
parents:
diff changeset
  1257
                        }
hgs
parents:
diff changeset
  1258
                    }
hgs
parents:
diff changeset
  1259
                    
hgs
parents:
diff changeset
  1260
                CleanupStack::PopAndDestroy(2); //curImgVerticalScanLineBuf,prevImgVerticalScanLineBuf               
hgs
parents:
diff changeset
  1261
hgs
parents:
diff changeset
  1262
                
hgs
parents:
diff changeset
  1263
                // check that the width of the cropped image will be at least 1
hgs
parents:
diff changeset
  1264
                if (rightBottomDifferencePoint.iX <= leftTopDifferencePoint.iX)
hgs
parents:
diff changeset
  1265
                    rightBottomDifferencePoint.iX = leftTopDifferencePoint.iX+1;
hgs
parents:
diff changeset
  1266
                   
hgs
parents:
diff changeset
  1267
                
hgs
parents:
diff changeset
  1268
                // record dimensions and position of the image           
hgs
parents:
diff changeset
  1269
                frame.iWidth = rightBottomDifferencePoint.iX - leftTopDifferencePoint.iX;    
hgs
parents:
diff changeset
  1270
                frame.iHeight = rightBottomDifferencePoint.iY - leftTopDifferencePoint.iY;  
hgs
parents:
diff changeset
  1271
                frame.iXPos = leftTopDifferencePoint.iX;
hgs
parents:
diff changeset
  1272
                frame.iYPos = leftTopDifferencePoint.iY;
hgs
parents:
diff changeset
  1273
                frame.iEnableTransparency = ETrue;
hgs
parents:
diff changeset
  1274
                frame.iFillsWholeScreen = EFalse;
hgs
parents:
diff changeset
  1275
            
hgs
parents:
diff changeset
  1276
            
hgs
parents:
diff changeset
  1277
                // take a copy of the current frame
hgs
parents:
diff changeset
  1278
                CFbsBitmap* workingBitmap = new(ELeave) CFbsBitmap;
hgs
parents:
diff changeset
  1279
                CleanupStack::PushL(workingBitmap);
hgs
parents:
diff changeset
  1280
                User::LeaveIfError( workingBitmap->Create(currentScreenSize, EColor256) );
hgs
parents:
diff changeset
  1281
hgs
parents:
diff changeset
  1282
                bufSize = currentScreenSize.iWidth*3;
hgs
parents:
diff changeset
  1283
                HBufC8* tempScanLineBuf = HBufC8::NewLC(bufSize);
hgs
parents:
diff changeset
  1284
                TPtr8 tempScanLinePtr = tempScanLineBuf->Des();
hgs
parents:
diff changeset
  1285
                
hgs
parents:
diff changeset
  1286
                for (TInt i=0; i<currentScreenSize.iHeight; i++)
hgs
parents:
diff changeset
  1287
                    {
hgs
parents:
diff changeset
  1288
                    pt.iY = i;
hgs
parents:
diff changeset
  1289
                    currentCapturedBitmap->GetScanLine(tempScanLinePtr, pt, currentScreenSize.iWidth, EColor256);
hgs
parents:
diff changeset
  1290
                    workingBitmap->SetScanLine(tempScanLinePtr, i);
hgs
parents:
diff changeset
  1291
                    }
hgs
parents:
diff changeset
  1292
                    
hgs
parents:
diff changeset
  1293
                CleanupStack::PopAndDestroy(); //tempScanLineBuf
hgs
parents:
diff changeset
  1294
                
hgs
parents:
diff changeset
  1295
                
hgs
parents:
diff changeset
  1296
                // mark the non-changed areas with transparency color
hgs
parents:
diff changeset
  1297
                TUint8* curPtr = NULL;
hgs
parents:
diff changeset
  1298
                TUint8* prevPtr = NULL;
hgs
parents:
diff changeset
  1299
                for (TInt i=frame.iYPos; i<frame.iYPos+frame.iHeight; i++)
hgs
parents:
diff changeset
  1300
                    {
hgs
parents:
diff changeset
  1301
                    pt.iY = i;
hgs
parents:
diff changeset
  1302
                    
hgs
parents:
diff changeset
  1303
                    workingBitmap->GetScanLine(curImgScanLinePtr, pt, currentScreenSize.iWidth, EColor256);
hgs
parents:
diff changeset
  1304
                    iPreviouslyCapturedBitmap->GetScanLine(prevImgScanLinePtr, pt, currentScreenSize.iWidth, EColor256);
hgs
parents:
diff changeset
  1305
                    
hgs
parents:
diff changeset
  1306
                    // check single pixels in the scanline
hgs
parents:
diff changeset
  1307
                    for (TInt j=frame.iXPos; j<frame.iXPos+frame.iWidth; j++)
hgs
parents:
diff changeset
  1308
                        {
hgs
parents:
diff changeset
  1309
                        curPtr = &curImgScanLinePtr[j];
hgs
parents:
diff changeset
  1310
                        prevPtr = &prevImgScanLinePtr[j];
hgs
parents:
diff changeset
  1311
                        
hgs
parents:
diff changeset
  1312
                        // check that our transparency index isn't already in use
hgs
parents:
diff changeset
  1313
                        if (curPtr[0] == TRANSPARENCY_INDEX)
hgs
parents:
diff changeset
  1314
                            curPtr[0] = TRANSPARENCY_ALTERNATIVE_INDEX;
hgs
parents:
diff changeset
  1315
                        
hgs
parents:
diff changeset
  1316
                        // replace with transparency index if there is no change compared to the previous frame
hgs
parents:
diff changeset
  1317
                        if (curPtr[0] == prevPtr[0])
hgs
parents:
diff changeset
  1318
                            curPtr[0] = TRANSPARENCY_INDEX;
hgs
parents:
diff changeset
  1319
                        }
hgs
parents:
diff changeset
  1320
                        
hgs
parents:
diff changeset
  1321
                    // set new scanline    
hgs
parents:
diff changeset
  1322
                    workingBitmap->SetScanLine(curImgScanLinePtr, i);
hgs
parents:
diff changeset
  1323
                    }
hgs
parents:
diff changeset
  1324
hgs
parents:
diff changeset
  1325
hgs
parents:
diff changeset
  1326
                // externalize the bitmap
hgs
parents:
diff changeset
  1327
                TRect changedRect(leftTopDifferencePoint, rightBottomDifferencePoint);
hgs
parents:
diff changeset
  1328
                workingBitmap->ExternalizeRectangleL(writeStream, changedRect);
hgs
parents:
diff changeset
  1329
                
hgs
parents:
diff changeset
  1330
                CleanupStack::PopAndDestroy(); //workingBitmap
hgs
parents:
diff changeset
  1331
 
hgs
parents:
diff changeset
  1332
                // update the previous frame to contain the new delay value
hgs
parents:
diff changeset
  1333
                prevFrame.iDelay = TUint( (double) currentDelay / 10000 );
hgs
parents:
diff changeset
  1334
                }
hgs
parents:
diff changeset
  1335
hgs
parents:
diff changeset
  1336
            else
hgs
parents:
diff changeset
  1337
                {
hgs
parents:
diff changeset
  1338
                // frames are identical, we can just ignore this one
hgs
parents:
diff changeset
  1339
                ignoreFrame = ETrue;     
hgs
parents:
diff changeset
  1340
                }
hgs
parents:
diff changeset
  1341
            
hgs
parents:
diff changeset
  1342
            CleanupStack::PopAndDestroy(2); //curImgScanLineBuf,prevImgScanLineBuf
hgs
parents:
diff changeset
  1343
hgs
parents:
diff changeset
  1344
            } // if (videoDimensionsHaveChanged)
hgs
parents:
diff changeset
  1345
hgs
parents:
diff changeset
  1346
        } //if (iCurrentFrameNumber == 0)
hgs
parents:
diff changeset
  1347
            
hgs
parents:
diff changeset
  1348
    // close the stream
hgs
parents:
diff changeset
  1349
    writeStream.CommitL();
hgs
parents:
diff changeset
  1350
    writeStream.Close();
hgs
parents:
diff changeset
  1351
    file.Close();
hgs
parents:
diff changeset
  1352
    
hgs
parents:
diff changeset
  1353
hgs
parents:
diff changeset
  1354
    if (ignoreFrame)
hgs
parents:
diff changeset
  1355
        {
hgs
parents:
diff changeset
  1356
        // delete the temp file since we don't need that
hgs
parents:
diff changeset
  1357
            iFileSession.Delete(frame.iFileStorePath);
hgs
parents:
diff changeset
  1358
        }
hgs
parents:
diff changeset
  1359
    else
hgs
parents:
diff changeset
  1360
        {
hgs
parents:
diff changeset
  1361
        // remember for the next frame when this frame was taken
hgs
parents:
diff changeset
  1362
        iPreviousFrameTaken = timeNow;
hgs
parents:
diff changeset
  1363
hgs
parents:
diff changeset
  1364
        // take a copy of currentCapturedBitmap to iPreviouslyCapturedBitmap
hgs
parents:
diff changeset
  1365
        User::LeaveIfError( iPreviouslyCapturedBitmap->Create(iVideoDimensions, EColor256) );
hgs
parents:
diff changeset
  1366
hgs
parents:
diff changeset
  1367
        TPoint pt(0,0);
hgs
parents:
diff changeset
  1368
        HBufC8* tempScanLineBuf = HBufC8::NewMaxLC(iVideoDimensions.iWidth);
hgs
parents:
diff changeset
  1369
        TPtr8 tempScanLinePtr = tempScanLineBuf->Des();
hgs
parents:
diff changeset
  1370
        
hgs
parents:
diff changeset
  1371
        for (TInt i=0; i<iVideoDimensions.iHeight; i++)
hgs
parents:
diff changeset
  1372
            {
hgs
parents:
diff changeset
  1373
            pt.iY = i;
hgs
parents:
diff changeset
  1374
            currentCapturedBitmap->GetScanLine(tempScanLinePtr, pt, iVideoDimensions.iWidth, EColor256);
hgs
parents:
diff changeset
  1375
            iPreviouslyCapturedBitmap->SetScanLine(tempScanLinePtr, i);
hgs
parents:
diff changeset
  1376
            }
hgs
parents:
diff changeset
  1377
            
hgs
parents:
diff changeset
  1378
        CleanupStack::PopAndDestroy(); //tempScanLineBuf
hgs
parents:
diff changeset
  1379
        
hgs
parents:
diff changeset
  1380
        // append frame information to the array
hgs
parents:
diff changeset
  1381
        iVideoFrameArray->AppendL(frame);
hgs
parents:
diff changeset
  1382
        
hgs
parents:
diff changeset
  1383
        // remember screen size
hgs
parents:
diff changeset
  1384
        iPreviousFrameScreenDimension = currentScreenSize;
hgs
parents:
diff changeset
  1385
        }    
hgs
parents:
diff changeset
  1386
hgs
parents:
diff changeset
  1387
    
hgs
parents:
diff changeset
  1388
    CleanupStack::PopAndDestroy(); //currentCapturedBitmap
hgs
parents:
diff changeset
  1389
    
hgs
parents:
diff changeset
  1390
hgs
parents:
diff changeset
  1391
    // set the state of the active object
hgs
parents:
diff changeset
  1392
    iState = ENextVideoFrame;
hgs
parents:
diff changeset
  1393
    
hgs
parents:
diff changeset
  1394
    // check time spent on the work above (probably this is not so important)
hgs
parents:
diff changeset
  1395
    TTime timeNow2;
hgs
parents:
diff changeset
  1396
    timeNow2.HomeTime();
hgs
parents:
diff changeset
  1397
    TInt64 handlingDelay = timeNow2.MicroSecondsFrom(timeNow).Int64();
hgs
parents:
diff changeset
  1398
    
hgs
parents:
diff changeset
  1399
    // calculate delay till next frame
hgs
parents:
diff changeset
  1400
    TUint idealDelay = VIDEO_CAPTURE_DELAY*1000;
hgs
parents:
diff changeset
  1401
    TInt usedDelay; 
hgs
parents:
diff changeset
  1402
    if (currentDelay > idealDelay)
hgs
parents:
diff changeset
  1403
        usedDelay = idealDelay - (currentDelay - idealDelay) - handlingDelay;
hgs
parents:
diff changeset
  1404
    else
hgs
parents:
diff changeset
  1405
        usedDelay = idealDelay - handlingDelay;
hgs
parents:
diff changeset
  1406
    
hgs
parents:
diff changeset
  1407
    // check that the delay is atleast minimum delay anyway
hgs
parents:
diff changeset
  1408
    if (usedDelay < VIDEO_CAPTURE_MINIMUM_DELAY*1000)
hgs
parents:
diff changeset
  1409
        usedDelay = VIDEO_CAPTURE_MINIMUM_DELAY*1000;
hgs
parents:
diff changeset
  1410
    
hgs
parents:
diff changeset
  1411
    iTimer.After(iStatus, usedDelay);
hgs
parents:
diff changeset
  1412
hgs
parents:
diff changeset
  1413
    // indicate an outstanding request
hgs
parents:
diff changeset
  1414
    SetActive();
hgs
parents:
diff changeset
  1415
    
hgs
parents:
diff changeset
  1416
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- Captureframeforvideo end"));
hgs
parents:
diff changeset
  1417
	
hgs
parents:
diff changeset
  1418
    }
hgs
parents:
diff changeset
  1419
hgs
parents:
diff changeset
  1420
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1421
hgs
parents:
diff changeset
  1422
void SGEngine::SaveVideoL(TInt aErr)
hgs
parents:
diff changeset
  1423
    {
hgs
parents:
diff changeset
  1424
hgs
parents:
diff changeset
  1425
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- SaveVideo start"));
hgs
parents:
diff changeset
  1426
    
hgs
parents:
diff changeset
  1427
    if (aErr)
hgs
parents:
diff changeset
  1428
        CapturingFinishedL(aErr);   
hgs
parents:
diff changeset
  1429
   
hgs
parents:
diff changeset
  1430
    else if (iGrabSettings.iVideoCaptureVideoFormat == EVideoFormatAnimatedGIF)
hgs
parents:
diff changeset
  1431
        {
hgs
parents:
diff changeset
  1432
        TInt err(KErrNone);
hgs
parents:
diff changeset
  1433
hgs
parents:
diff changeset
  1434
        
hgs
parents:
diff changeset
  1435
			iSaveFileName.Copy( PathInfo::PhoneMemoryRootPath() );
hgs
parents:
diff changeset
  1436
            if (iGrabSettings.iVideoCaptureMemoryInUseMultiDrive != 0)//something different as PhoneMemory (memory card or mass memory)
hgs
parents:
diff changeset
  1437
            	{
hgs
parents:
diff changeset
  1438
        		if (PathInfo::GetRootPath(iSaveFileName,EDriveY) != KErrNone || !DriveOK(EDriveY))
hgs
parents:
diff changeset
  1439
        			{
hgs
parents:
diff changeset
  1440
        			//we need to find first available memory card in EDriveE - EDriveY range
hgs
parents:
diff changeset
  1441
        			for (TInt i = EDriveY; i>=EDriveE; i--)
hgs
parents:
diff changeset
  1442
        				{
hgs
parents:
diff changeset
  1443
        				if ( DriveOK((TDriveNumber)(i)))
hgs
parents:
diff changeset
  1444
        					{
hgs
parents:
diff changeset
  1445
        					if (IsDriveMMC((TDriveNumber)(i)))
hgs
parents:
diff changeset
  1446
        						{
hgs
parents:
diff changeset
  1447
        						PathInfo::GetRootPath(iSaveFileName, (TDriveNumber)(i));
hgs
parents:
diff changeset
  1448
        						break;
hgs
parents:
diff changeset
  1449
        						}    
hgs
parents:
diff changeset
  1450
        					}
hgs
parents:
diff changeset
  1451
        				}
hgs
parents:
diff changeset
  1452
        			}
hgs
parents:
diff changeset
  1453
            	}
hgs
parents:
diff changeset
  1454
hgs
parents:
diff changeset
  1455
        
hgs
parents:
diff changeset
  1456
        iSaveFileName.Append( PathInfo::ImagesPath() );     // animated gif is actually an image, not a video
hgs
parents:
diff changeset
  1457
        iSaveFileName.Append( KScreenShotsSubDirectory );
hgs
parents:
diff changeset
  1458
        
hgs
parents:
diff changeset
  1459
        // a quick check that filename is valid
hgs
parents:
diff changeset
  1460
        if (iGrabSettings.iVideoCaptureFileName.Length() > 0 && iGrabSettings.iVideoCaptureFileName.Length() <= 255) 
hgs
parents:
diff changeset
  1461
            iSaveFileName.Append( iGrabSettings.iVideoCaptureFileName );
hgs
parents:
diff changeset
  1462
        else
hgs
parents:
diff changeset
  1463
            iSaveFileName.Append( KDefaultVideoFileName );
hgs
parents:
diff changeset
  1464
hgs
parents:
diff changeset
  1465
        iSaveFileName.Append( _L(".gif") );
hgs
parents:
diff changeset
  1466
hgs
parents:
diff changeset
  1467
        CApaApplication::GenerateFileName(iFileSession, iSaveFileName );  // unique filename
hgs
parents:
diff changeset
  1468
hgs
parents:
diff changeset
  1469
        // create and save the gif animation
hgs
parents:
diff changeset
  1470
        err = CGifAnimator::CreateGifAnimation(iSaveFileName, iVideoDimensions, iVideoFrameArray, *iEngineWrapper);
hgs
parents:
diff changeset
  1471
        
hgs
parents:
diff changeset
  1472
        // remove the saved file in case of errors since it's likely corrupted
hgs
parents:
diff changeset
  1473
        if (err != KErrNone)
hgs
parents:
diff changeset
  1474
            iFileSession.Delete(iSaveFileName);
hgs
parents:
diff changeset
  1475
        
hgs
parents:
diff changeset
  1476
        CapturingFinishedL(err);   
hgs
parents:
diff changeset
  1477
        }
hgs
parents:
diff changeset
  1478
        
hgs
parents:
diff changeset
  1479
    else
hgs
parents:
diff changeset
  1480
        CapturingFinishedL(KErrNotSupported);
hgs
parents:
diff changeset
  1481
    
hgs
parents:
diff changeset
  1482
    SC_DEBUG(_L("SCREENGRABBER ------------------------------------------------------- SaveVideo end"));
hgs
parents:
diff changeset
  1483
    }
hgs
parents:
diff changeset
  1484
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1485