Development/Tutorials/Services/Traders (de): Difference between revisions

From KDE TechBase
(Seite angelegt und erste Teile übersetzt/Page created)
 
No edit summary
(9 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Template:I18n/Language Navigation Bar|Development/Tutorials/Services/Traders}}
 
 
{{TutorialBrowser (de)|
 
series=Dienste|
 
name=Dienste finden mit Trader Queries|
 
pre=[[../Introduction (de)|Einführung in das Dienste Framework]]|
 
next=[[../Plugins (de)|Plugins mit KService erzeugen und laden]]|
 
}}
 


== Zusammenfassung ==
== Zusammenfassung ==
Oft ist es notwendig bestimmte Typen von Diensten oder Dienste mit bestimmten Eigenschaften oder Zwecken zu finden. KDE bietet eine einfacher und dennoch mächtige Anfragesprache um diesen Zweck zu erfüllen. Das ist die KTrader Query Sprache.


It is often desirable to be able to find specific types of services or services with specific features or designations. KDE provides a simple yet powerful query language to accomplish this called the KTrader Query Language.
== Die zwei Arten von "Tradern" ==


== Eine Geschichte von zwei Tradern ==
KDE bietet zwei Klassen an die sich als "Trader" (Händler, sie handeln quasi mit Diensten. Im weiteren Verlauf nennen wir sie aber Trader) verhalten können.  
 
Ein Trader nimmt eine Anfrage entgegen und gibt eine Liste von Diensten zurück, die den Anforderungen dieser Anfrage genügen. Es gibt einen Trader für Plugins und weitere Add-ons: {{class|KServiceTypeTrader}}. Daneben gibt es noch einen weiteren Trader für MimeTypes {{class|KMimeTypeTrader}}. Beide sind sich recht ähnlich: Sie benutzen die gleiche Syntax für Anfragen, sind als Singletons erreichbar (statische ::self()-Methoden), liefern {{class|KService}}::Ptrs als Ergebnis und weitere Gemeinsamkeiten. Während sich diese Anleitung primär auf {{class|KServiceTypeTrader}} konzentriert, ist vieles von dem Inhalt auch auf die MimeType Traders anwendbar.
KDE provides two classes that act as "traders". A trader takes a query and returns a set of services that match those constraints. There is one trader for plugins and other add-ons: {{class|KServiceTypeTrader}}, and one for mimetypes: {{class|KMimetypeTrader}}. Characteristics for both are similar: they have same syntax for querying, offer a singleton pattern accessor, return {{class|KService}}::Ptrs, as well as other similarities. So while this tutorial concentrates primarily on the {{class|KServiceTypeTrader}}, much of the content is applicable to the mimetype trader as well.


== Dienst Typen ==
== Dienst Typen ==


{{class|KServiceTypeTrader}} is used to locate individual components such as application plugins, screensavers, and control panels that are registered with the system. The primary concept used here, is that of the "service type". Each set of services has a unique service type, which makes it very easy to locate the sort of component needed.
{{class|KServiceTypeTrader}} wird benutzt um bestimmten Komponenten wie Plugins von Applikationen, Bildschirmschoner oder Kontrollleisten zu finden, die im System registriert sind. Das vordergründige Konzept ist, das es verschiedene Typen von Diensten gibt. Jede Menge von Diensten hat einen einzigartigen Dienst Typ, was es sehr einfach macht, die gewünschte Art der Komponente zu finden.


This means that, each kind of application plugin is uniquely namespaced within the set of all services. So, it is trivial to locate plugins for a given application, without having to worry about getting another application's plugin in the list.
Das bedeutet, dass alle Arten von Plugins von Applikationen einem eindeutigen Namensraum innerhalb der Menge aller Dienste besitzt. Es ist einfach ein Plugin für eine bestimmte Applikation zu finden, ohne sich sorgen zu müssen, dass die Plugins von anderen Applikationen auf der Liste erscheinen.


Examples of service types include:
Beispiele für Diensttypen beinhalten:
*KParts/ReadWritePart
*KParts/ReadWritePart
*KTextEditor/Document
*KTextEditor/Document
Line 24: Line 37:
*KDevelop/Plugin
*KDevelop/Plugin


There is no limit to the number of service types that a given application may use or register. Of course, service types are not limited to plugins and may be used for any sort of data component.  
Es gibt keine Limitierung der Anzahl von Diensttypen die eine bestimmte Applikation benutzen oder registrieren kann. Diensttypen sind natürlich nicht nur auf Plugins beschränkt sondern können auf alle Arten von Datenkomponenten benutzt werden.


Creating new service types is covered in the next tutorial of this series:
Einen neuen Servicetyp zu erzeugen wird im folgenden Kapitel dieser Serie erläutert:
[[Development/Tutorials/Services/Plugins|Creating and Loading Plugins Using KService]]
[[Development/Tutorials/Services/Plugins (de)|Plugins mit KService erzeugen und laden]]


== Benutzung von KServiceTypeTrader ==
== Benutzung von KServiceTypeTrader ==


The service trader is always accessed via the <tt>self()</tt> singleton accessor. With the {{class|KServiceTypeTrader}} in hand, we can then do one of three things:
Auf den "service trader" wird immer über <tt>self()</tt> zugegriffen. Mit der Klasse {{class|KServiceTypeTrader}} können wir dann einen von drei Schritten ausführen:
*'''query''':query for a list of services ordered according to the user's preferences (if any)
*'''query''':Anfrage einer Liste von Diensten die bestimmten (wenn überhaupt) Kriterien genügen, die der Benutzer vorgibt.
*'''defaultOffers''': request all services, unsorted
*'''defaultOffers''': Fragt alle Dienste unsortiert ab.
*'''preferredService''': request the preferred service of a given type
*'''preferredService''': Ermittelt den bevorzugten Dienst für einen bestimmten Typ.


The code to do this is very straight forward:
Der Code dazu ist relativ einfach:
<code cppqt>
<syntaxhighlight lang="cpp-qt">
KService::List services;
KService::List services;
KServiceTypeTrader* trader = KServiceTypeTrader::self();
KServiceTypeTrader* trader = KServiceTypeTrader::self();
Line 55: Line 68:
     kDebug() << "no preferred service found for KDevelop/Plugin";
     kDebug() << "no preferred service found for KDevelop/Plugin";
}
}
</code>
</syntaxhighlight>


In each case zero or more services are returned that are now usable for locating, describing and loading the item it represents.
In jedem Fall wird ein oder mehrere Dienste zurückgegeben, mit dem oden denen man verschiedene Operationen wie lokalisieren, beschreiben und laden durchführen kann.


== Die KTrader Query Sprache ==
== Die KTrader Query Sprache ==


The above examples are quite simplistic and are not detailed enough for many application needs. For instance, we may only want to list plugins for a certain category, that are associated with a particular mimetype, or that have a specific plugin name. This is where the query language comes in.
Die obigen Beispiele sind recht simpel und für die Anforderung vieler Applikationen nicht detailiert genug. Zum Beispiel könnten wir nur eine Liste von Plugins für eine bestimmte Kategorie benötigen, die mit einem bestimmten Mimetype assoziiert ist oder einen bestimmten Namen haben. Hier kommt die Anfragesprache ins Spiel.


The query language itself is designed to be human readable and flexible. <tt>{{class|KServiceTypeTrader}}::query</tt> optionally takes a query, in addition to the service type, and uses that to provide more fine-grained searches. So, for example, we'll modify the earlier example in the following way:
Die Anfragesprache selber ist so entworfen worden, dass sie für Menschen lesbar ist und gleichzeitig flexibel. <tt>{{class|KServiceTypeTrader}}::query</tt> nimmt wahlweise zusätzlich zum Diensttyp eine Anfrage entgegen und benutzt diese, um ein detailiertes Ergebnis zurückzugeben. So können wir das vorige Beispiel so abändern:


<code cppqt>
<syntaxhighlight lang="cpp-qt">
KService::List services ;
KService::List services ;
KServiceTypeTrader* trader = KServiceTypeTrader::self();
KServiceTypeTrader* trader = KServiceTypeTrader::self();
Line 77: Line 90:
     kDebug() << "read write part" << service->name();
     kDebug() << "read write part" << service->name();
}
}
</code>
</syntaxhighlight>


This code will look for a KPart that is both capable of reading/writing plain text files and is also a KOffice component, or can simply read ODF document formats.
Dieser Codeschnipsel sucht nach einem KPart welches sowohl einfache Textdateien lesen und schreiben kann und gleichzeitig eine KOffice-Komponente ist oder einfach ODF Dokumente lesen kann.  


Errors in queries are reported via debug output to console at runtime.
Fehler in Anfragen werden über die Debug-Ausgabe in der Konsole zur Laufzeit angezeigt.  


=== Reihenfolge der Operatoren ===
=== Reihenfolge der Operatoren ===


The query string is evaluated left to right, one section at a time. Sections are divided by boolean operators (see below) or by parentheses ('()'), which serve as grouping characters.
Die Anfragezeichenkette wird von links nach rechts ausgewertet, ein Abschitt nach dem anderen. Abschnitte werden durch boolsche Operatoren (siehe unten) oder Klammern unterteilt.


=== Basistypen ===
=== Basistypen ===
Line 95: Line 108:
*'''signed floating point numbers''': vorzeichenbehaftete Gleitkommazahlen
*'''signed floating point numbers''': vorzeichenbehaftete Gleitkommazahlen


=== Kennungen ===
=== Bezeichner ===
 
Identifiers in a query string are mapped to entries listed in the service's <tt>.desktop</tt> file. For example, "Name" is the name of the service, "ServiceTypes" is a list of the service types it supports.  
Bezeichner in einer Anfragezeichenkette werden auf Einträge abgebildet, welche in der zum Dienst gehörenden <tt>.desktop</tt> Datei stehen. So ist zum Beispiel "Name" der Name des Dienstes und "ServiceTypes" ist eine Liste von Dienstarten, die dieser Dienst unterstützt.


Identifiers may only contain alphanumeric characters and the '-' character.
Bezeichner dürfen nur alphanumerische Zeichen und das '-' Zeichen enthalten. Bezeichner, die nicht mit einem alphabetischen Zeichen oder welches nicht alphanumerische Zeichen enthält muss in eckigen Klammern eingeschlossen werden, z.B. [X-KDE-Init].
Identifiers that do not start with an alphabetical character or that contain non-alphanumeric characters must be enclosed in brackets, e.g. [X-KDE-Init].  


There are also three special identifiers:
Es gibt auch drei spezielle Bezeichner:


*'''DesktopEntryName''' stands for the filename of the service desktop entry without its extension. This can be useful to exclude some specific services.
*'''DesktopEntryName''' bezeichnet den Dateinamen der Dienst Desktop-Datei ohne dessen Erweiterung. Das kann nützlich sein, um bestimmte Dienste auszuschließen.
*'''DesktopEntryPath''' stands for the relative or full path to the .desktop file, see {{class|KService}}::desktopEntryPath.
*'''DesktopEntryPath''' bezeichnet den relativen oder vollen Pfad zur .desktop-Datei. Siehe auch {{class|KService}}::desktopEntryPath.
*'''Library''': a synonym for [X-KDE-Library] in the .desktop file.
*'''Library''': ist ein Synonym für [X-KDE-Library] in der .desktop Datei.


An identifier can be checked for existence with the '''exist''' operator, e.g. "exist [X-KDE-Library]". This is especially useful when checking for the value of an identifier with a default value. For example, if MyProp is a property with type boolean, one might write "not exist MyProp or MyProp" to match MyProp with a default of "true".
Ob ein Bezeichner existiert oder nicht kann mit dem '''exist''' Operator abgefragt werden, z.B. "exist [X-KDE-Library]". Das kann insbesondere dann nützlich sein, wenn man prüft, ob der Wert eines Bezeichners mit einem Vorgabewert gesetzt ist. Wenn zum Beispiel MyProp eine Eigenschaft mit einem boolschen Typ ist, kann man "not exist MyProp or MyProp" schreiben, um den Vorgabewert "true" zu erhalten.


=== Vergleichsoperatoren ===
=== Vergleichsoperatoren ===
Line 148: Line 160:
*'''!~''': Ungleichheit, Groß- und Kleinschreibung wird nicht beachtet
*'''!~''': Ungleichheit, Groß- und Kleinschreibung wird nicht beachtet


Sub-string matching can be accomplished by using the following operators:
Teilzeichenketten können in Zeichenketten durch folgende Operatoren gesucht werden:


* '''~''': contains, e.g. "'Bar' ~ 'FooBarBaz'" is true
* '''~''': enthält, z.B. "'Bar' ~ 'FooBarBaz'" ist wahr
* '''~~''': contains with case insensitive matching, e.g. "'Bar' ~~ 'FoobarBaz'" is true
* '''~~''': enthält und Groß und Kleinschreibung wird ignoriert, z.B. "'Bar' ~~ 'FoobarBaz'" ist wahr


Some properties, such as MimeTypes and ServiceTypes, are lists of strings. These lists can be searched using the following two operators:
Einige Eigenschaftem wie MimeTypes oder ServiceTypes sind Listen von Zeichenketten. Diese Listen können mit den folgenden zwei Operatoren durchsucht werden:


* '''in''': the list contains the string, e.g. "'MyApp/Plugin' in ServiceTypes'"
* '''in''': Die Liste enthält die Zeichenkette, z.B. "'MyApp/Plugin' in ServiceTypes'"
* '''~in''': the list contains the string, with case insensitive matching
* '''~in''': Die Liste enthält die Zeichenkette und Groß- und Kleinschreibung wird ignoriert.

Revision as of 14:30, 14 July 2012


Dienste finden mit Trader Queries
Anleitungsserie   Dienste
Voriges Kapitel   Einführung in das Dienste Framework
Nächstes Kapitel   Plugins mit KService erzeugen und laden
Weiterführende Texte   n/a
Navigation   Deutsche Startseite


Zusammenfassung

Oft ist es notwendig bestimmte Typen von Diensten oder Dienste mit bestimmten Eigenschaften oder Zwecken zu finden. KDE bietet eine einfacher und dennoch mächtige Anfragesprache um diesen Zweck zu erfüllen. Das ist die KTrader Query Sprache.

Die zwei Arten von "Tradern"

KDE bietet zwei Klassen an die sich als "Trader" (Händler, sie handeln quasi mit Diensten. Im weiteren Verlauf nennen wir sie aber Trader) verhalten können. Ein Trader nimmt eine Anfrage entgegen und gibt eine Liste von Diensten zurück, die den Anforderungen dieser Anfrage genügen. Es gibt einen Trader für Plugins und weitere Add-ons: KServiceTypeTrader. Daneben gibt es noch einen weiteren Trader für MimeTypes KMimeTypeTrader. Beide sind sich recht ähnlich: Sie benutzen die gleiche Syntax für Anfragen, sind als Singletons erreichbar (statische ::self()-Methoden), liefern KService::Ptrs als Ergebnis und weitere Gemeinsamkeiten. Während sich diese Anleitung primär auf KServiceTypeTrader konzentriert, ist vieles von dem Inhalt auch auf die MimeType Traders anwendbar.

Dienst Typen

KServiceTypeTrader wird benutzt um bestimmten Komponenten wie Plugins von Applikationen, Bildschirmschoner oder Kontrollleisten zu finden, die im System registriert sind. Das vordergründige Konzept ist, das es verschiedene Typen von Diensten gibt. Jede Menge von Diensten hat einen einzigartigen Dienst Typ, was es sehr einfach macht, die gewünschte Art der Komponente zu finden.

Das bedeutet, dass alle Arten von Plugins von Applikationen einem eindeutigen Namensraum innerhalb der Menge aller Dienste besitzt. Es ist einfach ein Plugin für eine bestimmte Applikation zu finden, ohne sich sorgen zu müssen, dass die Plugins von anderen Applikationen auf der Liste erscheinen.

Beispiele für Diensttypen beinhalten:

  • KParts/ReadWritePart
  • KTextEditor/Document
  • ScreenSaver
  • TerminalEmulator
  • UserAgentStrings
  • ThumbCreator
  • KDevelop/Plugin

Es gibt keine Limitierung der Anzahl von Diensttypen die eine bestimmte Applikation benutzen oder registrieren kann. Diensttypen sind natürlich nicht nur auf Plugins beschränkt sondern können auf alle Arten von Datenkomponenten benutzt werden.

Einen neuen Servicetyp zu erzeugen wird im folgenden Kapitel dieser Serie erläutert: Plugins mit KService erzeugen und laden

Benutzung von KServiceTypeTrader

Auf den "service trader" wird immer über self() zugegriffen. Mit der Klasse KServiceTypeTrader können wir dann einen von drei Schritten ausführen:

  • query:Anfrage einer Liste von Diensten die bestimmten (wenn überhaupt) Kriterien genügen, die der Benutzer vorgibt.
  • defaultOffers: Fragt alle Dienste unsortiert ab.
  • preferredService: Ermittelt den bevorzugten Dienst für einen bestimmten Typ.

Der Code dazu ist relativ einfach:

KService::List services;
KServiceTypeTrader* trader = KServiceTypeTrader::self();

services = trader->query("KParts/ReadWritePart");
foreach (KService::Ptr service, services) {
    kDebug() << "read write part" << service->name();
}

services = trader->defaultOffers("ThumbCreator");
if (services.isEmpty()) {
    kDebug() << "no services found for ThumbCreator!";
}

KService::Ptr service = trader->preferredService("KDevelop/Plugin");
if (!service) {
    kDebug() << "no preferred service found for KDevelop/Plugin";
}

In jedem Fall wird ein oder mehrere Dienste zurückgegeben, mit dem oden denen man verschiedene Operationen wie lokalisieren, beschreiben und laden durchführen kann.

Die KTrader Query Sprache

Die obigen Beispiele sind recht simpel und für die Anforderung vieler Applikationen nicht detailiert genug. Zum Beispiel könnten wir nur eine Liste von Plugins für eine bestimmte Kategorie benötigen, die mit einem bestimmten Mimetype assoziiert ist oder einen bestimmten Namen haben. Hier kommt die Anfragesprache ins Spiel.

Die Anfragesprache selber ist so entworfen worden, dass sie für Menschen lesbar ist und gleichzeitig flexibel. KServiceTypeTrader::query nimmt wahlweise zusätzlich zum Diensttyp eine Anfrage entgegen und benutzt diese, um ein detailiertes Ergebnis zurückzugeben. So können wir das vorige Beispiel so abändern:

KService::List services ;
KServiceTypeTrader* trader = KServiceTypeTrader::self();

QString constraint = "'text/plain' in MimeTypes and "
                     "('KOfficePart' in ServiceTypes or "
                     " 'oasis' ~ [X-KDE-ExtraNativeMimeTypes])";
services = trader->query("KParts/ReadWritePart", constraint);

foreach (KService::Ptr service, services) {
    kDebug() << "read write part" << service->name();
}

Dieser Codeschnipsel sucht nach einem KPart welches sowohl einfache Textdateien lesen und schreiben kann und gleichzeitig eine KOffice-Komponente ist oder einfach ODF Dokumente lesen kann.

Fehler in Anfragen werden über die Debug-Ausgabe in der Konsole zur Laufzeit angezeigt.

Reihenfolge der Operatoren

Die Anfragezeichenkette wird von links nach rechts ausgewertet, ein Abschitt nach dem anderen. Abschnitte werden durch boolsche Operatoren (siehe unten) oder Klammern unterteilt.

Basistypen

Drei Basistypen werden von der KTrader Query Sprache unterstützt:

  • strings: Zeichenketten, die einfachen Anführungsstrichen (') umschlossen sein müssen
  • booleans: Boolsche Werte (TRUE oder FALSE)
  • signed integers: vorzeichenbehaftete Ganzzahlen
  • signed floating point numbers: vorzeichenbehaftete Gleitkommazahlen

Bezeichner

Bezeichner in einer Anfragezeichenkette werden auf Einträge abgebildet, welche in der zum Dienst gehörenden .desktop Datei stehen. So ist zum Beispiel "Name" der Name des Dienstes und "ServiceTypes" ist eine Liste von Dienstarten, die dieser Dienst unterstützt.

Bezeichner dürfen nur alphanumerische Zeichen und das '-' Zeichen enthalten. Bezeichner, die nicht mit einem alphabetischen Zeichen oder welches nicht alphanumerische Zeichen enthält muss in eckigen Klammern eingeschlossen werden, z.B. [X-KDE-Init].

Es gibt auch drei spezielle Bezeichner:

  • DesktopEntryName bezeichnet den Dateinamen der Dienst Desktop-Datei ohne dessen Erweiterung. Das kann nützlich sein, um bestimmte Dienste auszuschließen.
  • DesktopEntryPath bezeichnet den relativen oder vollen Pfad zur .desktop-Datei. Siehe auch KService::desktopEntryPath.
  • Library: ist ein Synonym für [X-KDE-Library] in der .desktop Datei.

Ob ein Bezeichner existiert oder nicht kann mit dem exist Operator abgefragt werden, z.B. "exist [X-KDE-Library]". Das kann insbesondere dann nützlich sein, wenn man prüft, ob der Wert eines Bezeichners mit einem Vorgabewert gesetzt ist. Wenn zum Beispiel MyProp eine Eigenschaft mit einem boolschen Typ ist, kann man "not exist MyProp or MyProp" schreiben, um den Vorgabewert "true" zu erhalten.

Vergleichsoperatoren

Die folgenden Vergleichoperatoren können benutzt werden, um Werte von allen unterstützten Daten miteinander zu vergleichen:

  • ==: gleichheit
  • !=: ungleichheit
  • <: kleiner als
  • <=: kleiner oder gleich
  • >: größer als
  • >=: größer oder gleich

Mathematische Operatoren

Folgende mathematische Operatoren können auf Zahlentypen angewandt werden

  • +
  • -
  • *
  • /

Boolsche Operatoren

Folgende boolsche Operatoren werden unterstützt:

  • and: logisches und
  • or: logisches oder
  • not: logisches nicht

Operatoren für Zeichenketten

Die Operatoren, die auf Gleichheit von Zeichenketten prüfen, geben einen boolschen Wert zurück, der anzeigt, ob erfolgreich oder nicht.

Zeichenkettenvergleiche werden mit folgenden Operatoren erledigt:

  • ==: Gleichheit, Groß- und Kleinschreibung wird beachtet
  • =~: Gleichheit, Groß- und Kleinschreibung wird nicht beachtet
  • !=: Ungleichheit, Groß- und Kleinschreibung wird beachtet
  • !~: Ungleichheit, Groß- und Kleinschreibung wird nicht beachtet

Teilzeichenketten können in Zeichenketten durch folgende Operatoren gesucht werden:

  • ~: enthält, z.B. "'Bar' ~ 'FooBarBaz'" ist wahr
  • ~~: enthält und Groß und Kleinschreibung wird ignoriert, z.B. "'Bar' ~~ 'FoobarBaz'" ist wahr

Einige Eigenschaftem wie MimeTypes oder ServiceTypes sind Listen von Zeichenketten. Diese Listen können mit den folgenden zwei Operatoren durchsucht werden:

  • in: Die Liste enthält die Zeichenkette, z.B. "'MyApp/Plugin' in ServiceTypes'"
  • ~in: Die Liste enthält die Zeichenkette und Groß- und Kleinschreibung wird ignoriert.