controlpanel/src/cpframework/src/cpwatchdog.cpp
author hgs
Thu, 01 Apr 2010 03:17:51 +0800
changeset 31 2c9d3aa5bea2
child 32 20bd089f4aaa
permissions -rw-r--r--
201003_2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
     1
/*
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
     3
* All rights reserved.
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0""
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
     8
*
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
     9
* Initial Contributors:
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    11
*
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    12
* Contributors:
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    13
*
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    14
* Description:  
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    15
*
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    16
*/
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    17
#include "CpWatchDog.h"
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    18
#include <qcoreapplication>
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    19
#include <qsettings>
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    20
#include <qdebug>
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    21
#include "cplogger.h"
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    22
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    23
//const value definition
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    24
const int DefaultMaxPluginBlackListedRuns = 5;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    25
const int DefaultWatchdogActivationLimit  = 1;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    26
const int WatchdogActivationDisabled      = -1;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    27
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    28
//Key definition for QSettings
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    29
const QString KeyWatchDogStatus                   = "WatchDog";
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    30
const QString KeyWatchDogCpRunning                = "cprunning";
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    31
const QString KeyWatchDogCrashCounter             = "crashcounter";
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    32
const QString KeyWatchDogMaxPluginBlackListedRuns = "maxpluginblacklistedruns";
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    33
const QString KeyWatchDogActivationLimit          = "activationlimit";
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    34
const QString KeyWatchDogQuarantine               = "Quarantine";
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    35
const QString KeyWatchDogQuarantineUid            = "uid";
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    36
const QString KeyWatchDogBlackList                = "BlackList";
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    37
const QString KeyWatchDogBlackListUid             = "uid";
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    38
const QString KeyWatchDogBlackListRunsAfterCrash  = "runsaftercrash";
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    39
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    40
CpWatchDog *CpWatchDog::self = 0;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    41
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    42
CpWatchDog::PluginQuarantine::PluginQuarantine()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    43
: mUid(0), mRunsAfterCrash(0)
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    44
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    45
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    46
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    47
void CpWatchDog::PluginQuarantine::read(QSettings &settings)
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    48
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    49
    mUid = settings.value(KeyWatchDogBlackListUid,0).toInt();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    50
    mRunsAfterCrash = settings.value(KeyWatchDogBlackListRunsAfterCrash,0).toInt();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    51
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    52
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    53
void CpWatchDog::PluginQuarantine::store(QSettings &settings)
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    54
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    55
    settings.setValue(KeyWatchDogBlackListUid,mUid);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    56
    settings.setValue(KeyWatchDogBlackListRunsAfterCrash,mRunsAfterCrash);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    57
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    58
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    59
CpWatchDog *CpWatchDog::instance()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    60
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    61
    if (!self) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    62
        self = new CpWatchDog;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    63
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    64
    return self;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    65
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    66
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    67
CpWatchDog::CpWatchDog()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    68
    : mActive(true),
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    69
      mCrashCounter(0),
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    70
      mAppRunning(true),
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    71
      mMaxPluginBlackListedRuns(DefaultMaxPluginBlackListedRuns),
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    72
      mWatchdogActivationLimit(DefaultWatchdogActivationLimit)
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    73
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    74
    //delete watch dog when application is about to quit.
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    75
    connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(destroy()));
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    76
    init();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    77
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    78
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    79
CpWatchDog::~CpWatchDog()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    80
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    81
    reportCleanExit();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    82
    updateBlackListedPluginRunCounters();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    83
    storeState();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    84
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    85
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    86
void CpWatchDog::destroy()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    87
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    88
    delete this;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    89
    self = 0;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    90
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    91
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    92
void CpWatchDog::quarantine(int uid)
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    93
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    94
    if (isActive()) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    95
        mQuarantine.append(uid);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    96
        storeQuarantine();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    97
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    98
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
    99
void CpWatchDog::removeFromQuarantine(int uid)
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   100
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   101
    if (isActive()) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   102
        int index = mQuarantine.indexOf(uid);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   103
        if (index >= 0) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   104
            mQuarantine.remove(index);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   105
            storeQuarantine();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   106
        }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   107
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   108
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   109
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   110
bool CpWatchDog::isActive() const
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   111
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   112
    return mActive;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   113
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   114
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   115
bool CpWatchDog::wasCleanExit() const
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   116
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   117
    return !mAppRunning;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   118
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   119
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   120
void CpWatchDog::reportCleanExit()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   121
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   122
    mAppRunning = false;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   123
    
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   124
    QSettings settings;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   125
    settings.beginGroup(KeyWatchDogStatus);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   126
    settings.setValue(KeyWatchDogCpRunning,mAppRunning);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   127
    settings.endGroup();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   128
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   129
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   130
bool CpWatchDog::isInBlackList(int uid)
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   131
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   132
    bool found = false;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   133
    if (isActive()) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   134
        foreach(const PluginQuarantine &quarantine,mBlackList) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   135
            if (quarantine.mUid == uid) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   136
                found = true;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   137
                break;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   138
            }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   139
        }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   140
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   141
    
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   142
    if (found) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   143
        CpLogger() << "Plugin " << QString("0x%1").arg(uid,0,16) << "is in black list." << "\r\n";
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   144
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   145
    
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   146
    return found;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   147
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   148
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   149
void CpWatchDog::init()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   150
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   151
    readState();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   152
    
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   153
    if (!wasCleanExit() 
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   154
        && mWatchdogActivationLimit != WatchdogActivationDisabled) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   155
        mCrashCounter++;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   156
        mActive = true;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   157
        
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   158
        for (int i(0); i < mQuarantine.size(); i++) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   159
            if (!isInBlackList(mQuarantine[i])) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   160
                PluginQuarantine quarantine;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   161
                quarantine.mUid = mQuarantine[i];
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   162
                quarantine.mRunsAfterCrash = 0;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   163
                mBlackList.append(quarantine);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   164
                mQuarantine.remove(i);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   165
                i--;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   166
            }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   167
        }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   168
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   169
    else {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   170
        mActive = false;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   171
        mCrashCounter = 0;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   172
        mQuarantine.clear();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   173
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   174
    
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   175
    mAppRunning = true;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   176
    storeState();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   177
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   178
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   179
void CpWatchDog::readState()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   180
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   181
    QSettings settings;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   182
    settings.beginGroup(KeyWatchDogStatus);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   183
    int appRunning = settings.value(KeyWatchDogCpRunning,0).toInt();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   184
    mAppRunning = (appRunning != 0);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   185
    mCrashCounter = settings.value(KeyWatchDogCrashCounter,0).toInt();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   186
    mMaxPluginBlackListedRuns = settings.value(
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   187
            KeyWatchDogMaxPluginBlackListedRuns,DefaultMaxPluginBlackListedRuns).toInt();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   188
    mWatchdogActivationLimit = settings.value(
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   189
            KeyWatchDogActivationLimit,DefaultWatchdogActivationLimit).toInt();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   190
    settings.endGroup();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   191
    
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   192
    readQuarantine();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   193
    readBlackList();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   194
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   195
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   196
void CpWatchDog::storeState()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   197
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   198
    {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   199
        QSettings settings;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   200
        settings.beginGroup(KeyWatchDogStatus);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   201
        settings.setValue(KeyWatchDogCpRunning, mAppRunning ? 1 : 0);  
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   202
        settings.setValue(KeyWatchDogCrashCounter,mCrashCounter);   
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   203
        settings.setValue(KeyWatchDogMaxPluginBlackListedRuns,mMaxPluginBlackListedRuns);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   204
        settings.setValue(KeyWatchDogActivationLimit,mWatchdogActivationLimit);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   205
        settings.endGroup();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   206
    } //Destructor of QSettings: writes any unsaved changes to permanent storage
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   207
    
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   208
    storeQuarantine();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   209
    storeBlackList();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   210
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   211
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   212
void CpWatchDog::readQuarantine()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   213
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   214
    QSettings settings;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   215
    int size = settings.beginReadArray(KeyWatchDogQuarantine);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   216
    for (int i(0); i < size; i++) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   217
        settings.setArrayIndex(i);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   218
        int uid = settings.value(KeyWatchDogQuarantineUid,0).toInt();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   219
        if (uid != 0) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   220
            mQuarantine.append(uid);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   221
        }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   222
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   223
    settings.endArray();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   224
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   225
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   226
void CpWatchDog::storeQuarantine()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   227
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   228
    QSettings settings;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   229
    
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   230
    //remove old array data before updating
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   231
    settings.beginGroup(KeyWatchDogQuarantine);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   232
    settings.remove(QString());
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   233
    settings.endGroup();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   234
    
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   235
    settings.beginWriteArray(KeyWatchDogQuarantine);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   236
    int size = mQuarantine.size();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   237
    for (int i(0); i < size; i++) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   238
        settings.setArrayIndex(i);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   239
        settings.setValue(KeyWatchDogQuarantineUid,mQuarantine[i]);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   240
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   241
    settings.endArray();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   242
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   243
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   244
void CpWatchDog::readBlackList()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   245
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   246
    QSettings settings;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   247
    int size = settings.beginReadArray(KeyWatchDogBlackList);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   248
    for (int i(0); i < size; i++) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   249
        settings.setArrayIndex(i);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   250
        PluginQuarantine quarantine;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   251
        quarantine.read(settings);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   252
        if (quarantine.mUid != 0) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   253
            mBlackList.append(quarantine);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   254
        }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   255
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   256
    settings.endArray();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   257
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   258
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   259
void CpWatchDog::storeBlackList()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   260
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   261
    QSettings settings;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   262
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   263
    //remove old array data before updating
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   264
    settings.beginGroup(KeyWatchDogBlackList);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   265
    settings.remove(QString());
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   266
    settings.endGroup();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   267
    
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   268
    settings.beginWriteArray(KeyWatchDogBlackList);    
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   269
    int size = mBlackList.size();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   270
    for (int i(0); i < size; i++) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   271
        settings.setArrayIndex(i);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   272
        mBlackList[i].store(settings);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   273
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   274
    settings.endArray();
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   275
}
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   276
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   277
void CpWatchDog::updateBlackListedPluginRunCounters()
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   278
{
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   279
    for (int i(0); i < mBlackList.size(); i++) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   280
        mBlackList[i].mRunsAfterCrash++;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   281
        if (mBlackList[i].mRunsAfterCrash > mMaxPluginBlackListedRuns) {
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   282
            mBlackList.remove(i);
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   283
            i--;
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   284
        }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   285
    }
2c9d3aa5bea2 201003_2
hgs
parents:
diff changeset
   286
}