604627d2a4466d36f4d011e4b7ef0bd7cf4f6be3
[harmattan/cameraplus] / src / trackerstore.cpp
1 /*!
2  * This file is part of CameraPlus.
3  *
4  * Copyright (C) 2012 Mohammed Sameer <msameer@foolab.org>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20
21 #include "trackerstore.h"
22 #include <QSparqlConnection>
23 #include <QSparqlQuery>
24 #include <QUrl>
25 #include <QDeclarativeInfo>
26 #include <QSparqlResult>
27 #include <QScopedPointer>
28 #include <QSparqlError>
29 #include <QDebug>
30 #include <QDateTime>
31
32 #define BEGIN_IMAGE "INSERT { _:x a nfo:Image, nmm:Photo"
33 #define BEGIN_VIDEO "INSERT { _:x a nfo:Video, nmm:Video"
34 #define QUERY_END ", nie:DataObject, nie:InformationElement, nfo:Media, nfo:Visual ; nie:url ?:file_url ; nfo:equipment ?:equipment^^xsd:string ; nie:contentCreated ?:contentCreated . }"
35
36 #define IMAGE_QUERY BEGIN_IMAGE QUERY_END
37 #define VIDEO_QUERY BEGIN_VIDEO QUERY_END
38
39 #define ADD_FAVORITE_QUERY "INSERT { ?u nao:hasTag nao:predefined-tag-favorite . } WHERE {?u nie:url <file://%1> . }"
40 #define REMOVE_FAVORITE_QUERY "DELETE { ?u nao:hasTag nao:predefined-tag-favorite . } WHERE {?u nie:url <file://%1> . }"
41
42 TrackerStore::TrackerStore(QObject *parent) :
43   QObject(parent),
44   m_connection(0) {
45
46 }
47
48 TrackerStore::~TrackerStore() {
49
50 }
51
52 bool TrackerStore::isActive() const {
53   return m_connection != 0;
54 }
55
56 void TrackerStore::setActive(bool active) {
57   if (isActive() == active) {
58     return;
59   }
60
61   m_connection = new QSparqlConnection("QTRACKER_DIRECT", QSparqlConnectionOptions(), this);
62
63   emit activeChanged();
64 }
65
66 QString TrackerStore::manufacturer() const {
67   return m_manufacturer;
68 }
69
70 void TrackerStore::setManufacturer(const QString& manufacturer) {
71   if (m_manufacturer != manufacturer) {
72     m_manufacturer = manufacturer;
73     emit manufacturerChanged();
74   }
75 }
76
77 QString TrackerStore::model() const {
78   return m_model;
79 }
80
81 void TrackerStore::setModel(const QString& model) {
82   if (m_model != model) {
83     m_model = model;
84     emit modelChanged();
85   }
86 }
87
88 bool TrackerStore::storeImage(const QString& path) {
89   return execQuery(IMAGE_QUERY, path);
90 }
91
92 bool TrackerStore::storeVideo(const QString& path) {
93   return execQuery(VIDEO_QUERY, path);
94 }
95
96 bool TrackerStore::execQuery(const QString& query, const QString& path) {
97   QDateTime dateTime = QDateTime::currentDateTime();
98
99   if (!isActive()) {
100     qmlInfo(this) << "TrackerStore is not active";
101     return false;
102   }
103
104   QString equipment = QString("urn:equipment:%1:%2:").arg(m_manufacturer).arg(m_model);
105
106   QSparqlQuery q(query, QSparqlQuery::InsertStatement);
107   q.bindValue("file_url", QUrl::fromLocalFile(path));
108   q.bindValue("equipment", equipment);
109   q.bindValue("contentCreated", dateTime.toString(Qt::ISODate) +
110                   "." + QString().sprintf("%.3d", dateTime.time().msec()));
111
112   return exec(q);
113 }
114
115 bool TrackerStore::addToFavorites(const QUrl& url) {
116   QString query = QString(ADD_FAVORITE_QUERY).arg(url.toLocalFile());
117
118   QSparqlQuery q(query, QSparqlQuery::InsertStatement);
119
120   return exec(q);
121 }
122
123 bool TrackerStore::removeFromFavorites(const QUrl& url) {
124   QString query = QString(REMOVE_FAVORITE_QUERY).arg(url.toLocalFile());
125
126   QSparqlQuery q(query, QSparqlQuery::DeleteStatement);
127
128   return exec(q);
129 }
130
131 bool TrackerStore::exec(QSparqlQuery& q) {
132   QScopedPointer<QSparqlResult> r(m_connection->syncExec(q));
133
134   if (!r->hasError()) {
135     return true;
136   }
137
138   while (r->next()) {
139     // Nothing
140   }
141
142   qmlInfo(this) << "QtSparql error:" << r->lastError().message();
143
144   return false;
145 }