123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- /*=============================================================================
- Library: CTK
- Copyright (c) German Cancer Research Center,
- Division of Medical and Biological Informatics
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- =============================================================================*/
- #include "ctkServiceSlotEntry_p.h"
- #include "ctkLDAPExpr_p.h"
- #include "ctkPlugin.h"
- #include <QSharedData>
- #include <cstring>
- class ctkServiceSlotEntryData : public QSharedData
- {
- public:
- ctkServiceSlotEntryData(QSharedPointer<ctkPlugin> p, QObject* receiver,
- const char* slot)
- : plugin(p), receiver(receiver),
- slot(slot), removed(false)
- {
- }
- /**
- * The elements of "simple" filters are cached, for easy lookup.
- *
- * The grammar for simple filters is as follows:
- *
- * <pre>
- * Simple = '(' attr '=' value ')'
- * | '(' '|' Simple+ ')'
- * </pre>
- * where <code>attr</code> is one of {@link Constants#OBJECTCLASS},
- * {@link Constants#SERVICE_ID} or {@link Constants#SERVICE_PID}, and
- * <code>value</code> must not contain a wildcard character.
- * <p>
- * The index of the vector determines which key the cache is for
- * (see {@link ServiceListenerState#hashedKeys}). For each key, there is
- * a vector pointing out the values which are accepted by this
- * ServiceListenerEntry's filter. This cache is maintained to make
- * it easy to remove this service listener.
- */
- ctkLDAPExpr::LocalCache local_cache;
- ctkLDAPExpr ldap;
- QSharedPointer<ctkPlugin> plugin;
- QObject* receiver;
- const char* slot;
- bool removed;
- };
- ctkServiceSlotEntry::ctkServiceSlotEntry(
- QSharedPointer<ctkPlugin> p, QObject* receiver, const char* slot, const QString& filter)
- : d(new ctkServiceSlotEntryData(p, receiver, slot))
- {
- if (!filter.isNull())
- {
- d->ldap = ctkLDAPExpr(filter);
- }
- }
- ctkServiceSlotEntry::ctkServiceSlotEntry(const ctkServiceSlotEntry& other)
- : d(other.d)
- {
- }
- ctkServiceSlotEntry::ctkServiceSlotEntry()
- : d(new ctkServiceSlotEntryData(QSharedPointer<ctkPlugin>(0), 0, 0))
- {
- }
- ctkServiceSlotEntry& ctkServiceSlotEntry::operator=(const ctkServiceSlotEntry& other)
- {
- d = other.d;
- return *this;
- }
- ctkServiceSlotEntry::~ctkServiceSlotEntry()
- {
- }
- bool ctkServiceSlotEntry::operator==(const ctkServiceSlotEntry& other) const
- {
- return ((d->plugin == 0 || other.d->plugin == 0) || d->plugin == other.d->plugin) &&
- d->receiver == other.d->receiver &&
- ((d->slot == 0 || other.d->slot == 0) || std::strcmp(d->slot, other.d->slot) == 0);
- }
- void ctkServiceSlotEntry::invokeSlot(const ctkServiceEvent &event)
- {
- if (!QMetaObject::invokeMethod(d->receiver, d->slot,
- Qt::DirectConnection,
- Q_ARG(ctkServiceEvent, event)))
- {
- throw std::runtime_error(
- QString("Slot %1 of %2 could not be invoked. A call to "
- "ctkPluginContext::connectServiceListener() must only contain "
- "the slot name, not the whole signature.").
- arg(d->slot).arg(d->receiver->metaObject()->className()).toStdString());
- }
- }
- void ctkServiceSlotEntry::setRemoved(bool removed)
- {
- d->removed = removed;
- }
- bool ctkServiceSlotEntry::isRemoved() const
- {
- return d->removed;
- }
- QSharedPointer<ctkPlugin> ctkServiceSlotEntry::getPlugin() const
- {
- return d->plugin;
- }
- ctkLDAPExpr ctkServiceSlotEntry::getLDAPExpr() const
- {
- return d->ldap;
- }
- QString ctkServiceSlotEntry::getFilter() const
- {
- return d->ldap.isNull() ? QString() : d->ldap.toString();
- }
- ctkLDAPExpr::LocalCache& ctkServiceSlotEntry::getLocalCache() const
- {
- return d->local_cache;
- }
- uint qHash(const ctkServiceSlotEntry& serviceSlot)
- {
- return qHash(serviceSlot.getPlugin());
- }
|