Unity 8
windowstatestorage.cpp
1 /*
2  * Copyright 2015 Canonical Ltd.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation; version 3.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  */
16 
17 #include "windowstatestorage.h"
18 
19 #include <QtConcurrent>
20 #include <QDebug>
21 #include <QSqlQuery>
22 #include <QSqlError>
23 #include <QSqlResult>
24 #include <QRect>
25 
26 QMutex WindowStateStorage::s_mutex;
27 
28 WindowStateStorage::WindowStateStorage(QObject *parent):
29  QObject(parent)
30 {
31  QString dbPath = QDir::homePath() + "/.cache/unity8/";
32  m_db = QSqlDatabase::addDatabase("QSQLITE");
33  QDir dir;
34  dir.mkpath(dbPath);
35  m_db.setDatabaseName(dbPath + "windowstatestorage.sqlite");
36  initdb();
37 }
38 
39 void WindowStateStorage::saveGeometry(const QString &windowId, const QRect &rect)
40 {
41  QString queryString = QString("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values ('%1', '%2', '%3', '%4', '%5');")
42  .arg(windowId)
43  .arg(rect.x())
44  .arg(rect.y())
45  .arg(rect.width())
46  .arg(rect.height());
47 
48  QtConcurrent::run(executeAsyncQuery, queryString);
49 }
50 
51 void WindowStateStorage::executeAsyncQuery(const QString &queryString)
52 {
53  QMutexLocker l(&s_mutex);
54  QSqlQuery query;
55 
56  bool ok = query.exec(queryString);
57  if (!ok) {
58  qWarning() << "Error executing query" << queryString
59  << "Driver error:" << query.lastError().driverText()
60  << "Database error:" << query.lastError().databaseText();
61  }
62 }
63 
64 QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue)
65 {
66  QMutexLocker l(&s_mutex);
67  QString queryString = QString("SELECT * FROM geometry WHERE windowId = '%1';")
68  .arg(windowId);
69  QSqlQuery query;
70 
71  bool ok = query.exec(queryString);
72  if (!ok) {
73  qWarning() << "Error retrieving window state for" << windowId
74  << "Driver error:" << query.lastError().driverText()
75  << "Database error:" << query.lastError().databaseText();
76  return defaultValue;
77  }
78  if (!query.first()) {
79  return defaultValue;
80  }
81  return QRect(query.value("x").toInt(), query.value("y").toInt(), query.value("width").toInt(), query.value("height").toInt());
82 }
83 
84 void WindowStateStorage::initdb()
85 {
86  m_db.open();
87  if (!m_db.open()) {
88  qWarning() << "Error opening state database:" << m_db.lastError().driverText() << m_db.lastError().databaseText();
89  return;
90  }
91 
92  if (!m_db.tables().contains("geometry")) {
93  QSqlQuery query;
94  query.exec("CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);");
95  }
96 }