homescreenapp/hsapplication/src/hsrecoverymanager.cpp
author hgs
Wed, 20 Oct 2010 15:25:39 +0300
changeset 101 ba1b7e218624
parent 81 7dd137878ff8
permissions -rw-r--r--
201042
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
63
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <e32property.h>
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
#include <QFile>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "hsrecoverymanager.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
const TInt KPSCategoryUid(0x20022F36);
hgs
parents:
diff changeset
    25
const TInt KPSCrashCountKey(1);
hgs
parents:
diff changeset
    26
const int KCrashCountThreshold(3);
hgs
parents:
diff changeset
    27
const int KResetCrashCountInterval(60000);
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
/*!
hgs
parents:
diff changeset
    30
    \class HsRecoveryManager
hgs
parents:
diff changeset
    31
    \ingroup group_hsapplication
hgs
parents:
diff changeset
    32
    \brief Used during homescreen startup for recovering from possible crash situations.
hgs
parents:
diff changeset
    33
*/
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
/*!
hgs
parents:
diff changeset
    36
    Constructs a new recovery manager with the given \a parent item.
hgs
parents:
diff changeset
    37
*/
hgs
parents:
diff changeset
    38
HsRecoveryManager::HsRecoveryManager(QObject *parent)
hgs
parents:
diff changeset
    39
  : QObject(parent)
hgs
parents:
diff changeset
    40
{    
hgs
parents:
diff changeset
    41
    mTimer.setInterval(KResetCrashCountInterval);
hgs
parents:
diff changeset
    42
    mTimer.setSingleShot(true);
hgs
parents:
diff changeset
    43
    connect(&mTimer, SIGNAL(timeout()), SLOT(resetCrashCount()));
hgs
parents:
diff changeset
    44
}
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
/*!
hgs
parents:
diff changeset
    47
    Destructor.
hgs
parents:
diff changeset
    48
*/
hgs
parents:
diff changeset
    49
HsRecoveryManager::~HsRecoveryManager()
hgs
parents:
diff changeset
    50
{
hgs
parents:
diff changeset
    51
}
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
/*!
hgs
parents:
diff changeset
    54
    Executes this recovery manager. If crash count exceeds the
hgs
parents:
diff changeset
    55
    threshold, the ROM configuration is selected. Otherwise,
hgs
parents:
diff changeset
    56
    the existing one is used.
hgs
parents:
diff changeset
    57
*/
hgs
parents:
diff changeset
    58
void HsRecoveryManager::execute()
hgs
parents:
diff changeset
    59
{
hgs
parents:
diff changeset
    60
    int count = crashCount();    
hgs
parents:
diff changeset
    61
    if (KCrashCountThreshold <= count) {
hgs
parents:
diff changeset
    62
        restoreRomDatabase();
hgs
parents:
diff changeset
    63
        resetCrashCount();
hgs
parents:
diff changeset
    64
        return;
hgs
parents:
diff changeset
    65
    }
hgs
parents:
diff changeset
    66
    if (0 < count) {
hgs
parents:
diff changeset
    67
        mTimer.start();
hgs
parents:
diff changeset
    68
    }
hgs
parents:
diff changeset
    69
}
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
/*!
hgs
parents:
diff changeset
    72
    Restores the ROM database to c: drive.
hgs
parents:
diff changeset
    73
*/
hgs
parents:
diff changeset
    74
void HsRecoveryManager::restoreRomDatabase()
hgs
parents:
diff changeset
    75
{
hgs
parents:
diff changeset
    76
    // If exists, remove the database from c:
hgs
parents:
diff changeset
    77
    QFile file("c:/private/20022f35/homescreen.db");
hgs
parents:
diff changeset
    78
    if (file.exists()) {        
hgs
parents:
diff changeset
    79
        file.remove();
hgs
parents:
diff changeset
    80
    }          
hgs
parents:
diff changeset
    81
    // Copy the rom database to c: and set permissions.
hgs
parents:
diff changeset
    82
    file.setFileName("z:/private/20022f35/homescreen.db");     
81
hgs
parents: 63
diff changeset
    83
    if (!file.copy("c:/private/20022f35/homescreen.db")) {
hgs
parents: 63
diff changeset
    84
        qDebug() << "copying of homescreen.db to c: drive failed";
hgs
parents: 63
diff changeset
    85
    } else {
hgs
parents: 63
diff changeset
    86
        file.setFileName("c:/private/20022f35/homescreen.db");
hgs
parents: 63
diff changeset
    87
        if (!file.setPermissions(QFile::ReadOwner | QFile::WriteOwner)) {
hgs
parents: 63
diff changeset
    88
            qDebug() << "setPermissions of homescreen.db failed";
hgs
parents: 63
diff changeset
    89
        }
hgs
parents: 63
diff changeset
    90
    }
63
hgs
parents:
diff changeset
    91
}
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
/*!
hgs
parents:
diff changeset
    94
    Resets the crash count to zero.
hgs
parents:
diff changeset
    95
*/
hgs
parents:
diff changeset
    96
void HsRecoveryManager::resetCrashCount()
hgs
parents:
diff changeset
    97
{
hgs
parents:
diff changeset
    98
    RProperty::Set(TUid::Uid(KPSCategoryUid), KPSCrashCountKey, 0); 
hgs
parents:
diff changeset
    99
}
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
/*!
hgs
parents:
diff changeset
   102
    Returns the current crash count.
hgs
parents:
diff changeset
   103
*/
hgs
parents:
diff changeset
   104
int HsRecoveryManager::crashCount()
hgs
parents:
diff changeset
   105
{
hgs
parents:
diff changeset
   106
    TInt count = 0;
hgs
parents:
diff changeset
   107
    RProperty::Get(TUid::Uid(KPSCategoryUid), KPSCrashCountKey, count);    
hgs
parents:
diff changeset
   108
    return count;
hgs
parents:
diff changeset
   109
}