• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdelibs API Reference
  • KDE Home
  • Contact Us
 

Nepomuk-Core

  • sources
  • kde-4.12
  • kdelibs
  • nepomuk-core
  • services
  • storage
  • query
queryservice.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2008-2010 Sebastian Trueg <trueg@kde.org>
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Library General Public
6  License version 2 as published by the Free Software Foundation.
7 
8  This library 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 GNU
11  Library General Public License for more details.
12 
13  You should have received a copy of the GNU Library General Public License
14  along with this library; see the file COPYING.LIB. If not, write to
15  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16  Boston, MA 02110-1301, USA.
17 */
18 
19 #include "queryservice.h"
20 #include "folder.h"
21 #include "folderconnection.h"
22 #include "dbusoperators_p.h"
23 
24 #include <QtCore/QThreadPool>
25 #include <QtDBus/QDBusConnection>
26 #include <QtDBus/QDBusConnectionInterface>
27 #include <QtDBus/QDBusObjectPath>
28 #include <QtDBus/QDBusMessage>
29 
30 #include <KPluginFactory>
31 #include <KUrl>
32 #include <KDebug>
33 #include <kdbusconnectionpool.h>
34 
35 #include "resourcemanager.h"
36 #include "types/property.h"
37 #include "query/query.h"
38 #include "query/queryparser.h"
39 
40 Q_DECLARE_METATYPE( QList<QUrl> )
41 
42 static QThreadPool* s_searchThreadPool = 0;
43 
44 Nepomuk2::Query::QueryService::QueryService( Soprano::Model* model, QObject* parent )
45  : QObject( parent ),
46  m_folderConnectionCnt( 0 ),
47  m_model( model )
48 {
49  // this looks wrong but there is only one QueryService instance at all time!
50  s_searchThreadPool = new QThreadPool( this );
51  s_searchThreadPool->setMaxThreadCount( 10 );
52 
53  // register types used in the DBus adaptor
54  Nepomuk2::Query::registerDBusTypes();
55 
56  // register type used to communicate removeEntries between threads
57  qRegisterMetaType<QList<QUrl> >();
58  qRegisterMetaType<QList<Nepomuk2::Query::Result> >();
59 
60  //Register the service
61  QLatin1String serviceName("nepomukqueryservice");
62  QString dbusName = QString::fromLatin1("org.kde.nepomuk.services.%1").arg( serviceName );
63 
64  QDBusConnection bus = KDBusConnectionPool::threadConnection();
65  if( !bus.registerService( dbusName ) ) {
66  kDebug() << "Failed to register the QueryService .. ";
67  }
68 
69  // register the service
70  // ====================================
71  bus.registerObject( '/' + serviceName,
72  this,
73  QDBusConnection::ExportScriptableSlots |
74  QDBusConnection::ExportScriptableProperties |
75  QDBusConnection::ExportAdaptors);
76 }
77 
78 
79 Nepomuk2::Query::QueryService::~QueryService()
80 {
81  // cannot use qDeleteAll since deleting a folder changes m_openQueryFolders
82  while ( !m_openQueryFolders.isEmpty() )
83  delete m_openQueryFolders.begin().value();
84  while ( !m_openSparqlFolders.isEmpty() )
85  delete m_openSparqlFolders.begin().value();
86 }
87 
88 
89 // static
90 QThreadPool* Nepomuk2::Query::QueryService::searchThreadPool()
91 {
92  return s_searchThreadPool;
93 }
94 
95 
96 QDBusObjectPath Nepomuk2::Query::QueryService::query( const QString& query, const QDBusMessage& msg )
97 {
98  Query q = Query::fromString( query );
99  if ( !q.isValid() ) {
100  // backwards compatibility: in KDE <= 4.5 query() was what desktopQuery() is now
101  return desktopQuery( query, msg );
102  }
103  else {
104  kDebug() << "Query request:" << q;
105  Folder* folder = getFolder( q );
106  return ( new FolderConnection( folder ) )->registerDBusObject( msg.service(), ++m_folderConnectionCnt );
107  }
108 }
109 
110 
111 QDBusObjectPath Nepomuk2::Query::QueryService::desktopQuery( const QString& query, const QDBusMessage& msg )
112 {
113  Query q = QueryParser::parseQuery( query );
114  if( !q.isValid() ) {
115  kDebug() << "Invalid desktop query:" << query;
116  QDBusConnection con = KDBusConnectionPool::threadConnection();
117  con.send( msg.createErrorReply( QDBusError::InvalidArgs, i18n("Invalid desktop query: '%1'", query) ) );
118  return QDBusObjectPath(QLatin1String("/non/existing/path"));
119  }
120  else {
121  kDebug() << "Query request:" << q;
122  Folder* folder = getFolder( q );
123  return ( new FolderConnection( folder ) )->registerDBusObject( msg.service(), ++m_folderConnectionCnt );
124  }
125 }
126 
127 
128 namespace {
129  Nepomuk2::Query::RequestPropertyMap decodeRequestPropertiesList( const RequestPropertyMapDBus& requestProps )
130  {
131  Nepomuk2::Query::RequestPropertyMap rpm;
132  for ( RequestPropertyMapDBus::const_iterator it = requestProps.constBegin();
133  it != requestProps.constEnd(); ++it )
134  rpm.insert( it.key(), KUrl( it.value() ) );
135  return rpm;
136  }
137 }
138 
139 QDBusObjectPath Nepomuk2::Query::QueryService::sparqlQuery( const QString& sparql, const RequestPropertyMapDBus& requestProps, const QDBusMessage& msg )
140 {
141  kDebug() << "Query request:" << sparql << requestProps;
142 
143  if( sparql.isEmpty() ) {
144  kDebug() << "Invalid SPARQL query:" << sparql;
145  QDBusConnection con = KDBusConnectionPool::threadConnection();
146  con.send( msg.createErrorReply( QDBusError::InvalidArgs, i18n("Invalid SPARQL query: '%1'", sparql) ) );
147  return QDBusObjectPath(QLatin1String("/non/existing/path"));
148  }
149  else {
150  // create query folder + connection
151  Folder* folder = getFolder( sparql, decodeRequestPropertiesList( requestProps ) );
152  return ( new FolderConnection( folder ) )->registerDBusObject( msg.service(), ++m_folderConnectionCnt );
153  }
154 }
155 
156 
157 Nepomuk2::Query::Folder* Nepomuk2::Query::QueryService::getFolder( const Query& query )
158 {
159  QHash<Query, Folder*>::const_iterator it = m_openQueryFolders.constFind( query );
160  if ( it != m_openQueryFolders.constEnd() ) {
161  kDebug() << "Recycling folder" << *it;
162  return *it;
163  }
164  else {
165  kDebug() << "Creating new search folder for query:" << query;
166  Folder* newFolder = new Folder( m_model, query, this );
167  connect( newFolder, SIGNAL( aboutToBeDeleted( Nepomuk2::Query::Folder* ) ),
168  this, SLOT( slotFolderAboutToBeDeleted( Nepomuk2::Query::Folder* ) ) );
169  m_openQueryFolders.insert( query, newFolder );
170  return newFolder;
171  }
172 }
173 
174 
175 Nepomuk2::Query::Folder* Nepomuk2::Query::QueryService::getFolder( const QString& query, const Nepomuk2::Query::RequestPropertyMap& requestProps )
176 {
177  QHash<QString, Folder*>::const_iterator it = m_openSparqlFolders.constFind( query );
178  if ( it != m_openSparqlFolders.constEnd() ) {
179  kDebug() << "Recycling folder" << *it;
180  return *it;
181  }
182  else {
183  kDebug() << "Creating new search folder for query:" << query;
184  Folder* newFolder = new Folder( m_model, query, requestProps, this );
185  connect( newFolder, SIGNAL( aboutToBeDeleted( Nepomuk2::Query::Folder* ) ),
186  this, SLOT( slotFolderAboutToBeDeleted( Nepomuk2::Query::Folder* ) ) );
187  m_openSparqlFolders.insert( query, newFolder );
188  return newFolder;
189  }
190 }
191 
192 
193 void Nepomuk2::Query::QueryService::slotFolderAboutToBeDeleted( Folder* folder )
194 {
195  kDebug() << folder;
196  if ( folder->isSparqlQueryFolder() )
197  m_openSparqlFolders.remove( folder->sparqlQuery() );
198  else
199  m_openQueryFolders.remove( folder->query() );
200 }
201 
202 #include "queryservice.moc"
Nepomuk2::Query::QueryService::query
Q_SCRIPTABLE QDBusObjectPath query(const QString &query, const QDBusMessage &msg)
Create a query folder from encoded query query.
Definition: queryservice.cpp:96
QHash
QObject
query.h
Nepomuk2::Query::QueryService::sparqlQuery
Q_SCRIPTABLE QDBusObjectPath sparqlQuery(const QString &query, const RequestPropertyMapDBus &requestProps, const QDBusMessage &msg)
Create a query folder from SPARQL query string query.
Definition: queryservice.cpp:139
Nepomuk2::Query::RequestPropertyMap
QHash< QString, Nepomuk2::Types::Property > RequestPropertyMap
Convinience definition for request property mappings as used in QueryServiceClient::sparqlQuery() and...
Definition: query.h:41
queryservice.h
Nepomuk2::Query::Query
A Nepomuk desktop query.
Definition: query.h:76
Nepomuk2::Query::FolderConnection
Definition: folderconnection.h:35
resourcemanager.h
Nepomuk2::Query::Query::isValid
bool isValid() const
Definition: query.cpp:275
folder.h
Nepomuk2::Query::QueryService::~QueryService
~QueryService()
Definition: queryservice.cpp:79
Nepomuk2::DBus::registerDBusTypes
void registerDBusTypes()
Definition: dbustypes.cpp:112
Nepomuk2::Query::QueryParser::parseQuery
static Query parseQuery(const QString &query)
Convenience method to quickly parse a query without creating an object.
Definition: queryparser.cpp:815
Nepomuk2::Query::Folder
One search folder which automatically updates itself.
Definition: folder.h:49
Nepomuk2::Query::QueryService::desktopQuery
Q_SCRIPTABLE QDBusObjectPath desktopQuery(const QString &query, const QDBusMessage &msg)
Create a query folder from desktop query string query which needs to be parsable by QueryParser...
Definition: queryservice.cpp:111
property.h
s_searchThreadPool
static QThreadPool * s_searchThreadPool
Definition: queryservice.cpp:42
folderconnection.h
Nepomuk2::Query::QueryService::searchThreadPool
static QThreadPool * searchThreadPool()
Definition: queryservice.cpp:90
queryparser.h
Nepomuk2::Query::QueryService
Definition: queryservice.h:43
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:48:08 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Nepomuk-Core

Skip menu "Nepomuk-Core"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal