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

Solid

  • sources
  • kde-4.14
  • kdelibs
  • solid
  • solid
predicateparse.cpp
Go to the documentation of this file.
1 /*
2  Copyright 2006 Kevin Ottens <ervin@kde.org>
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Lesser General Public
6  License as published by the Free Software Foundation; either
7  version 2.1 of the License, or (at your option) version 3, or any
8  later version accepted by the membership of KDE e.V. (or its
9  successor approved by the membership of KDE e.V.), which shall
10  act as a proxy defined in Section 6 of version 3 of the license.
11 
12  This library is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  Lesser General Public License for more details.
16 
17  You should have received a copy of the GNU Lesser General Public
18  License along with this library. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 extern "C"
22 {
23 #include "predicateparse.h"
24 
25 void PredicateParse_mainParse(const char *_code);
26 }
27 
28 #include "predicate.h"
29 #include "soliddefs_p.h"
30 
31 #include <stdlib.h>
32 
33 #include <QtCore/QStringList>
34 #include <QtCore/QThreadStorage>
35 
36 namespace Solid
37 {
38 namespace PredicateParse
39 {
40 
41 struct ParsingData
42 {
43  ParsingData()
44  : result(0)
45  {}
46 
47  Solid::Predicate *result;
48  QByteArray buffer;
49 };
50 
51 }
52 }
53 
54 SOLID_GLOBAL_STATIC(QThreadStorage<Solid::PredicateParse::ParsingData *>, s_parsingData)
55 
56 Solid::Predicate Solid::Predicate::fromString(const QString &predicate)
57 {
58  Solid::PredicateParse::ParsingData *data = new Solid::PredicateParse::ParsingData();
59  s_parsingData->setLocalData(data);
60  data->buffer = predicate.toLatin1();
61  PredicateParse_mainParse(data->buffer.constData());
62  Predicate result;
63  if (data->result)
64  {
65  result = Predicate(*data->result);
66  delete data->result;
67  }
68  s_parsingData->setLocalData(0);
69  return result;
70 }
71 
72 
73 void PredicateParse_setResult(void *result)
74 {
75  Solid::PredicateParse::ParsingData *data = s_parsingData->localData();
76  data->result = (Solid::Predicate *) result;
77 }
78 
79 void PredicateParse_errorDetected(const char* s)
80 {
81  qWarning("ERROR from solid predicate parser: %s", s);
82  s_parsingData->localData()->result = 0;
83 }
84 
85 void PredicateParse_destroy(void *pred)
86 {
87  Solid::PredicateParse::ParsingData *data = s_parsingData->localData();
88  Solid::Predicate *p = (Solid::Predicate *) pred;
89  if (p != data->result) {
90  delete p;
91  }
92 }
93 
94 void *PredicateParse_newAtom(char *interface, char *property, void *value)
95 {
96  QString iface(interface);
97  QString prop(property);
98  QVariant *val = (QVariant *)value;
99 
100  Solid::Predicate *result = new Solid::Predicate(iface, prop, *val);
101 
102  delete val;
103  free(interface);
104  free(property);
105 
106  return result;
107 }
108 
109 void *PredicateParse_newMaskAtom(char *interface, char *property, void *value)
110 {
111  QString iface(interface);
112  QString prop(property);
113  QVariant *val = (QVariant *)value;
114 
115  Solid::Predicate *result = new Solid::Predicate(iface, prop, *val, Solid::Predicate::Mask);
116 
117  delete val;
118  free(interface);
119  free(property);
120 
121  return result;
122 }
123 
124 
125 void *PredicateParse_newIsAtom(char *interface)
126 {
127  QString iface(interface);
128 
129  Solid::Predicate *result = new Solid::Predicate(iface);
130 
131  free(interface);
132 
133  return result;
134 }
135 
136 
137 void *PredicateParse_newAnd(void *pred1, void *pred2)
138 {
139  Solid::Predicate *result = new Solid::Predicate();
140 
141  Solid::PredicateParse::ParsingData *data = s_parsingData->localData();
142  Solid::Predicate *p1 = (Solid::Predicate *)pred1;
143  Solid::Predicate *p2 = (Solid::Predicate *)pred2;
144 
145  if (p1==data->result || p2==data->result) {
146  data->result = 0;
147  }
148 
149  *result = *p1 & *p2;
150 
151  delete p1;
152  delete p2;
153 
154  return result;
155 }
156 
157 
158 void *PredicateParse_newOr(void *pred1, void *pred2)
159 {
160  Solid::Predicate *result = new Solid::Predicate();
161 
162  Solid::PredicateParse::ParsingData *data = s_parsingData->localData();
163  Solid::Predicate *p1 = (Solid::Predicate *)pred1;
164  Solid::Predicate *p2 = (Solid::Predicate *)pred2;
165 
166  if (p1==data->result || p2==data->result) {
167  data->result = 0;
168  }
169 
170  *result = *p1 | *p2;
171 
172  delete p1;
173  delete p2;
174 
175  return result;
176 }
177 
178 
179 void *PredicateParse_newStringValue(char *val)
180 {
181  QString s(val);
182 
183  free(val);
184 
185  return new QVariant(s);
186 }
187 
188 
189 void *PredicateParse_newBoolValue(int val)
190 {
191  bool b = (val != 0);
192  return new QVariant(b);
193 }
194 
195 
196 void *PredicateParse_newNumValue(int val)
197 {
198  return new QVariant(val);
199 }
200 
201 
202 void *PredicateParse_newDoubleValue(double val)
203 {
204  return new QVariant(val);
205 }
206 
207 
208 void *PredicateParse_newEmptyStringListValue()
209 {
210  return new QVariant(QStringList());
211 }
212 
213 
214 void *PredicateParse_newStringListValue(char *name)
215 {
216  QStringList list;
217  list << QString(name);
218 
219  free(name);
220 
221  return new QVariant(list);
222 }
223 
224 
225 void *PredicateParse_appendStringListValue(char *name, void *list)
226 {
227  QVariant *variant = (QVariant *)list;
228 
229  QStringList new_list = variant->toStringList();
230 
231  new_list << QString(name);
232 
233  delete variant;
234  free(name);
235 
236  return new QVariant(new_list);
237 }
238 
239 void PredicateLexer_unknownToken(const char* text)
240 {
241  qWarning("ERROR from solid predicate parser: unrecognized token '%s' in predicate '%s'\n",
242  text, s_parsingData->localData()->buffer.constData());
243 }
PredicateParse_newDoubleValue
void * PredicateParse_newDoubleValue(double val)
Definition: predicateparse.cpp:202
PredicateParse_newStringListValue
void * PredicateParse_newStringListValue(char *name)
Definition: predicateparse.cpp:214
QByteArray
PredicateParse_destroy
void PredicateParse_destroy(void *pred)
Definition: predicateparse.cpp:85
PredicateParse_newAnd
void * PredicateParse_newAnd(void *pred1, void *pred2)
Definition: predicateparse.cpp:137
SOLID_GLOBAL_STATIC
#define SOLID_GLOBAL_STATIC(TYPE, NAME)
Definition: soliddefs_p.h:77
PredicateParse_newOr
void * PredicateParse_newOr(void *pred1, void *pred2)
Definition: predicateparse.cpp:158
PredicateParse_newIsAtom
void * PredicateParse_newIsAtom(char *interface)
Definition: predicateparse.cpp:125
Solid::Predicate::Mask
Definition: predicate.h:54
PredicateParse_newNumValue
void * PredicateParse_newNumValue(int val)
Definition: predicateparse.cpp:196
PredicateParse_mainParse
void PredicateParse_mainParse(const char *_code)
PredicateParse_errorDetected
void PredicateParse_errorDetected(const char *s)
Definition: predicateparse.cpp:79
soliddefs_p.h
PredicateParse_newAtom
void * PredicateParse_newAtom(char *interface, char *property, void *value)
Definition: predicateparse.cpp:94
QString
PredicateParse_newMaskAtom
void * PredicateParse_newMaskAtom(char *interface, char *property, void *value)
Definition: predicateparse.cpp:109
QStringList
PredicateLexer_unknownToken
void PredicateLexer_unknownToken(const char *text)
Definition: predicateparse.cpp:239
predicateparse.h
QThreadStorage
PredicateParse_newStringValue
void * PredicateParse_newStringValue(char *val)
Definition: predicateparse.cpp:179
QVariant::toStringList
QStringList toStringList() const
PredicateParse_newBoolValue
void * PredicateParse_newBoolValue(int val)
Definition: predicateparse.cpp:189
predicate.h
Solid::Predicate
This class implements predicates for devices.
Definition: predicate.h:45
PredicateParse_newEmptyStringListValue
void * PredicateParse_newEmptyStringListValue()
Definition: predicateparse.cpp:208
PredicateParse_setResult
void PredicateParse_setResult(void *result)
Definition: predicateparse.cpp:73
PredicateParse_appendStringListValue
void * PredicateParse_appendStringListValue(char *name, void *list)
Definition: predicateparse.cpp:225
QVariant
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:23:26 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Solid

Skip menu "Solid"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • 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
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • 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