browsercore/appfw/Api/Managers/HistoryManager.cpp
author hgs
Fri, 17 Sep 2010 12:11:40 -0400
changeset 12 afcd8e6d025b
child 14 6aeb7a756187
permissions -rw-r--r--
201037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12
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
*
hgs
parents:
diff changeset
     5
* This program is free software: you can redistribute it and/or modify
hgs
parents:
diff changeset
     6
* it under the terms of the GNU Lesser General Public License as published by
hgs
parents:
diff changeset
     7
* the Free Software Foundation, version 2.1 of the License.
hgs
parents:
diff changeset
     8
* 
hgs
parents:
diff changeset
     9
* This program is distributed in the hope that it will be useful,
hgs
parents:
diff changeset
    10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
hgs
parents:
diff changeset
    12
* GNU Lesser General Public License for more details.
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* You should have received a copy of the GNU Lesser General Public License
hgs
parents:
diff changeset
    15
* along with this program.  If not, 
hgs
parents:
diff changeset
    16
* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
* Description:
hgs
parents:
diff changeset
    19
*
hgs
parents:
diff changeset
    20
*/
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
#include <QtCore/QDir>
hgs
parents:
diff changeset
    24
#include <QtCore/QFile>
hgs
parents:
diff changeset
    25
#include <QtGui/QIcon>
hgs
parents:
diff changeset
    26
#include <QtGui>
hgs
parents:
diff changeset
    27
#include <QtCore/QDebug>
hgs
parents:
diff changeset
    28
#include <QtCore/QUrl>
hgs
parents:
diff changeset
    29
#include <QString>
hgs
parents:
diff changeset
    30
#include "actionjsobject.h"
hgs
parents:
diff changeset
    31
#include "HistoryManager_p.h"
hgs
parents:
diff changeset
    32
#include "HistoryManager.h"
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
//#include "wrtsettings.h"
hgs
parents:
diff changeset
    35
#include "bedrockprovisioning.h"
hgs
parents:
diff changeset
    36
#include <browsercontentdll.h>
hgs
parents:
diff changeset
    37
#include "webpagecontroller.h"
hgs
parents:
diff changeset
    38
#include "wrtbrowsercontainer.h"
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
namespace WRT {
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
HistoryManagerPrivate::HistoryManagerPrivate(HistoryManager * mgr) :
hgs
parents:
diff changeset
    44
    q(mgr),
hgs
parents:
diff changeset
    45
    m_connectedToHistory(false),
hgs
parents:
diff changeset
    46
    m_maxUrls(10) // TODO: read from settings
hgs
parents:
diff changeset
    47
{
hgs
parents:
diff changeset
    48
    QFileInfo dbFile("browserContent.db");
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
#ifdef Q_WS_MAEMO_5
hgs
parents:
diff changeset
    51
    m_import = false;    
hgs
parents:
diff changeset
    52
    if (dbFile.exists()){
hgs
parents:
diff changeset
    53
      m_import = false;
hgs
parents:
diff changeset
    54
    }
hgs
parents:
diff changeset
    55
    else {
hgs
parents:
diff changeset
    56
      m_import = true;
hgs
parents:
diff changeset
    57
    }
hgs
parents:
diff changeset
    58
#endif
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
    m_historySession=new BrowserContent("Bedrock");
hgs
parents:
diff changeset
    61
    if (m_historySession) {
hgs
parents:
diff changeset
    62
        m_connectedToHistory = true;
hgs
parents:
diff changeset
    63
    } else {
hgs
parents:
diff changeset
    64
        qDebug() << "HistoryManagerPrivate: Failed to connect to history database";
hgs
parents:
diff changeset
    65
    }
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
    m_actionsParent = new QObject(mgr);
hgs
parents:
diff changeset
    68
    m_actionsParent->setObjectName("actions");
hgs
parents:
diff changeset
    69
    
hgs
parents:
diff changeset
    70
    m_actionClearHistory = new QAction("clearHistory", m_actionsParent);
hgs
parents:
diff changeset
    71
    
hgs
parents:
diff changeset
    72
    m_actionClearJSO  = new ActionJSObject(m_actionsParent, m_actionClearHistory);
hgs
parents:
diff changeset
    73
    
hgs
parents:
diff changeset
    74
    m_actionClearHistory->setObjectName("clearHistory");
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
}
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
HistoryManagerPrivate::~HistoryManagerPrivate()
hgs
parents:
diff changeset
    79
{
hgs
parents:
diff changeset
    80
    delete m_historySession;
hgs
parents:
diff changeset
    81
    delete m_actionClearHistory;
hgs
parents:
diff changeset
    82
    delete m_actionClearJSO;
hgs
parents:
diff changeset
    83
}
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
/*!
hgs
parents:
diff changeset
    86
 * \class HistoryManager
hgs
parents:
diff changeset
    87
 *
hgs
parents:
diff changeset
    88
 * This class is responsible for managing history, This class could be used
hgs
parents:
diff changeset
    89
 * mainly for Creating, adding history, adding recent history items, deleting
hgs
parents:
diff changeset
    90
 * and editing history.
hgs
parents:
diff changeset
    91
 *
hgs
parents:
diff changeset
    92
 */
hgs
parents:
diff changeset
    93
 
hgs
parents:
diff changeset
    94
/*!
hgs
parents:
diff changeset
    95
 * Basic constructor
hgs
parents:
diff changeset
    96
 * @param parent : parent widget (Defaulted to NULL ) if not specified
hgs
parents:
diff changeset
    97
 */
hgs
parents:
diff changeset
    98
HistoryManager::HistoryManager(QWidget *parent) :
hgs
parents:
diff changeset
    99
    QObject(parent),
hgs
parents:
diff changeset
   100
    d(new HistoryManagerPrivate(this))
hgs
parents:
diff changeset
   101
{
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
    m_isHistoryDbreadRequired=true;
hgs
parents:
diff changeset
   104
    connect(d->m_actionClearHistory, SIGNAL(triggered()), this, SIGNAL(confirmHistoryClear()));
hgs
parents:
diff changeset
   105
     
hgs
parents:
diff changeset
   106
}
hgs
parents:
diff changeset
   107
/*
hgs
parents:
diff changeset
   108
void HistoryManager::actionClearHistory()
hgs
parents:
diff changeset
   109
{
hgs
parents:
diff changeset
   110
    emit confirmClearHistory();
hgs
parents:
diff changeset
   111
}
hgs
parents:
diff changeset
   112
*/
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
HistoryManager::~HistoryManager()
hgs
parents:
diff changeset
   115
{
hgs
parents:
diff changeset
   116
    disconnect(d->m_actionClearHistory, SIGNAL(triggered()), this, SIGNAL(historyCleared()));
hgs
parents:
diff changeset
   117
    delete d;
hgs
parents:
diff changeset
   118
}
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
HistoryManager* HistoryManager::getSingleton()
hgs
parents:
diff changeset
   121
 {
hgs
parents:
diff changeset
   122
    static HistoryManager* singleton = 0;
hgs
parents:
diff changeset
   123
  
hgs
parents:
diff changeset
   124
    if(!singleton){
hgs
parents:
diff changeset
   125
           singleton = new HistoryManager;
hgs
parents:
diff changeset
   126
           singleton->setObjectName("historyManager");
hgs
parents:
diff changeset
   127
    }
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
    //assert(singleton);
hgs
parents:
diff changeset
   130
    return singleton;    
hgs
parents:
diff changeset
   131
 }
hgs
parents:
diff changeset
   132
}
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
QString HistoryManager::getHistoryFoldersJSON(QString folderName)
hgs
parents:
diff changeset
   135
    {
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
    bool flag = true;
hgs
parents:
diff changeset
   138
  
hgs
parents:
diff changeset
   139
    QString historyFolders = "[";
hgs
parents:
diff changeset
   140
    if (folderName == "")
hgs
parents:
diff changeset
   141
        {
hgs
parents:
diff changeset
   142
    m_historyMap.clear();
hgs
parents:
diff changeset
   143
    m_folderVector.clear();
hgs
parents:
diff changeset
   144
    d->m_historySession->fetchSerializedHistory(m_folderVector, m_historyMap);
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
    for (int i = m_folderVector.size() - 1; i >= 0; i--)
hgs
parents:
diff changeset
   147
        {
hgs
parents:
diff changeset
   148
        //check for folder nodes
hgs
parents:
diff changeset
   149
        historyFolders.append("\"");
hgs
parents:
diff changeset
   150
        historyFolders.append(m_folderVector[i]);
hgs
parents:
diff changeset
   151
        historyFolders.append("\"");
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
        if (i != 0)
hgs
parents:
diff changeset
   155
            historyFolders.append(",");
hgs
parents:
diff changeset
   156
        if (flag)
hgs
parents:
diff changeset
   157
            {
hgs
parents:
diff changeset
   158
            if (m_folderVector[i].count() > 0)
hgs
parents:
diff changeset
   159
                {
hgs
parents:
diff changeset
   160
                d->m_actionClearHistory->setEnabled(true);
hgs
parents:
diff changeset
   161
                flag=false;
hgs
parents:
diff changeset
   162
                }
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
            }
hgs
parents:
diff changeset
   165
        }
hgs
parents:
diff changeset
   166
     if (flag)
hgs
parents:
diff changeset
   167
        {
hgs
parents:
diff changeset
   168
        d->m_actionClearHistory->setEnabled(false);
hgs
parents:
diff changeset
   169
        }
hgs
parents:
diff changeset
   170
    historyFolders.append("]");
hgs
parents:
diff changeset
   171
    m_folderVector.clear();
hgs
parents:
diff changeset
   172
        }
hgs
parents:
diff changeset
   173
    if (folderName == "")
hgs
parents:
diff changeset
   174
        {
hgs
parents:
diff changeset
   175
        return historyFolders;
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
        }
hgs
parents:
diff changeset
   178
    else
hgs
parents:
diff changeset
   179
        {
hgs
parents:
diff changeset
   180
        return m_historyMap[folderName];
hgs
parents:
diff changeset
   181
        }
hgs
parents:
diff changeset
   182
    }
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
/*!
hgs
parents:
diff changeset
   185
 * Add the  node to the folder in proxy model. If the folder doesnt exist in proxy, create
hgs
parents:
diff changeset
   186
 * the folder  and add the node to it
hgs
parents:
diff changeset
   187
 */
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
/*!
hgs
parents:
diff changeset
   190
 * Add to recent urls
hgs
parents:
diff changeset
   191
 * @param url: url to be added to recent url list
hgs
parents:
diff changeset
   192
 * @param title: title for this item in recent url list
hgs
parents:
diff changeset
   193
 * @param icon: icon to be added for this item in recent url list
hgs
parents:
diff changeset
   194
 */
hgs
parents:
diff changeset
   195
Q_DECL_EXPORT void HistoryManager::addHistory(const QString &url, const QString &title)
hgs
parents:
diff changeset
   196
{
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
    //Check for a valid history entry
hgs
parents:
diff changeset
   199
    if (url.isEmpty() || title.isEmpty())
hgs
parents:
diff changeset
   200
        return;
hgs
parents:
diff changeset
   201
    
hgs
parents:
diff changeset
   202
    bool enabled = (bool) BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsInt("SaveHistory");
hgs
parents:
diff changeset
   203
    if(!enabled)
hgs
parents:
diff changeset
   204
      return;
hgs
parents:
diff changeset
   205
    
hgs
parents:
diff changeset
   206
    QDateTime currentDateTime = QDateTime::currentDateTime();
hgs
parents:
diff changeset
   207
    
hgs
parents:
diff changeset
   208
    HistoryLeaf* leaf=new HistoryLeaf();
hgs
parents:
diff changeset
   209
    leaf->setTitle(title);
hgs
parents:
diff changeset
   210
    leaf->setUrl(url);
hgs
parents:
diff changeset
   211
    leaf->setDate(currentDateTime.date());
hgs
parents:
diff changeset
   212
    leaf->setLastVisited(currentDateTime.time());
hgs
parents:
diff changeset
   213
    
hgs
parents:
diff changeset
   214
    if (d->m_connectedToHistory){
hgs
parents:
diff changeset
   215
        if(ErrNone == d->m_historySession->addHistory(leaf)){
hgs
parents:
diff changeset
   216
          d->m_actionClearHistory->setEnabled(true);
hgs
parents:
diff changeset
   217
        }
hgs
parents:
diff changeset
   218
    }
hgs
parents:
diff changeset
   219
    delete leaf;
hgs
parents:
diff changeset
   220
}
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
/*!
hgs
parents:
diff changeset
   223
 * Add to recent urls
hgs
parents:
diff changeset
   224
 * @param url: url to be added to recent url list
hgs
parents:
diff changeset
   225
 * @param title: title for this item in recent url list
hgs
parents:
diff changeset
   226
 * @param icon: icon to be added for this item in recent url list
hgs
parents:
diff changeset
   227
 */
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
void HistoryManager::addHistory(const QUrl &url, const QString &title)
hgs
parents:
diff changeset
   230
{
hgs
parents:
diff changeset
   231
    addHistory(url.toString(), title);
hgs
parents:
diff changeset
   232
}
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
/*!
hgs
parents:
diff changeset
   236
 * delete recent urls
hgs
parents:
diff changeset
   237
 * clears all the recent url list.
hgs
parents:
diff changeset
   238
 */
hgs
parents:
diff changeset
   239
void HistoryManager::clearHistory()
hgs
parents:
diff changeset
   240
{
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
    if (d->m_connectedToHistory) {
hgs
parents:
diff changeset
   243
        d->m_historySession->clearHistory();
hgs
parents:
diff changeset
   244
    }
hgs
parents:
diff changeset
   245
    
hgs
parents:
diff changeset
   246
    d->m_actionClearHistory->setEnabled(false);
hgs
parents:
diff changeset
   247
    
hgs
parents:
diff changeset
   248
    emit historyCleared();
hgs
parents:
diff changeset
   249
}
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
QAction * HistoryManager::getActionClearHistory()
hgs
parents:
diff changeset
   252
{
hgs
parents:
diff changeset
   253
    return d->m_actionClearHistory;
hgs
parents:
diff changeset
   254
}
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
int HistoryManager::getPageRank(const QString &url)
hgs
parents:
diff changeset
   257
{
hgs
parents:
diff changeset
   258
 //Check for a valid entry
hgs
parents:
diff changeset
   259
    if (url.isNull())
hgs
parents:
diff changeset
   260
        return 0;
hgs
parents:
diff changeset
   261
hgs
parents:
diff changeset
   262
    int rank = 0;
hgs
parents:
diff changeset
   263
	QList<HistoryLeaf*> historyNodes = d->m_historySession->fetchHistory();
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
    for (int i=0; i < historyNodes.count(); i++) {
hgs
parents:
diff changeset
   266
      //Update rank if there is a history for this URL.
hgs
parents:
diff changeset
   267
        if (!historyNodes[i]->getUrl().compare(url))
hgs
parents:
diff changeset
   268
           rank++;
hgs
parents:
diff changeset
   269
    }
hgs
parents:
diff changeset
   270
hgs
parents:
diff changeset
   271
	while (!historyNodes.isEmpty())
hgs
parents:
diff changeset
   272
     delete historyNodes.takeFirst();
hgs
parents:
diff changeset
   273
hgs
parents:
diff changeset
   274
    return rank;
hgs
parents:
diff changeset
   275
}