31using namespace Qt::StringLiterals;
37 QString makeServiceKey(
const QString &name,
const QString &version )
39 return QString(
"%1_%2" ).arg( name, version );
49 bool isVersionGreater(
const QString &v1,
const QString &v2 )
51 QStringList l1 = v1.split(
'.' );
52 QStringList l2 = v2.split(
'.' );
53 QStringList::iterator it1 = l1.begin();
54 QStringList::iterator it2 = l2.begin();
56 while ( it1 != l1.end() && it2 != l2.end() )
61 const int i1 = it1->toInt( &isint );
64 const int i2 = it2->toInt( &isint );
65 if ( isint && i1 != i2 )
99 const VersionTable::const_iterator v = mServiceVersions.constFind( name );
100 if ( v != mServiceVersions.constEnd() )
102 key = version.isEmpty() ? v->second : makeServiceKey( name, version );
103 const ServiceTable::const_iterator it = mServices.constFind( key );
104 if ( it != mServices.constEnd() )
112 service = mServices[v->second].get();
124 const QString name = service->
name();
125 const QString version = service->
version();
128 const QString key = makeServiceKey( name, version );
129 if ( mServices.constFind( key ) != mServices.constEnd() )
136 mServices.insert( key, std::shared_ptr<QgsService>( service ) );
143 const VersionTable::const_iterator v = mServiceVersions.constFind( name );
144 if ( v == mServiceVersions.constEnd() )
147 mServiceVersions.insert( name, VersionTable::mapped_type( version, key ) );
169 const VersionTable::const_iterator v = mApiVersions.constFind( name );
170 if ( v != mApiVersions.constEnd() )
172 if ( version.isEmpty() )
175 ApiTable::iterator it = mApis.begin();
176 while ( it != mApis.end() )
178 if ( ( *it )->name() == name )
181 it = mApis.erase( it );
190 mApiVersions.remove( name );
194 const QString key = makeServiceKey( name, version );
195 const ApiTable::iterator found = mApis.find( key );
196 if ( found != mApis.end() )
199 mApis.erase( found );
206 const std::function<void(
const ApiTable::mapped_type & )> findGreaterVersion = [name, &maxVer](
const ApiTable::mapped_type &api ) {
207 if ( api->name() == name && ( maxVer.isEmpty() || isVersionGreater( api->version(), maxVer ) ) )
208 maxVer = api->version();
211 mApiVersions.remove( name );
213 std::for_each( mApis.constBegin(), mApis.constEnd(), findGreaterVersion );
214 if ( !maxVer.isEmpty() )
217 const QString key = makeServiceKey( name, maxVer );
218 mApiVersions.insert( name, VersionTable::mapped_type( version, key ) );
228 for (
const auto &api : mApis )
231 if ( api->accept( request.
url() ) )
233 Q_ASSERT( !api->name().isEmpty() );
247 const VersionTable::const_iterator v = mApiVersions.constFind( name );
248 if ( v != mApiVersions.constEnd() )
250 key = version.isEmpty() ? v->second : makeServiceKey( name, version );
251 const ApiTable::const_iterator it = mApis.constFind( key );
252 if ( it != mApis.constEnd() )
260 api = mApis[v->second].get();
274 const VersionTable::const_iterator v = mServiceVersions.constFind( name );
275 if ( v != mServiceVersions.constEnd() )
277 if ( version.isEmpty() )
280 ServiceTable::iterator it = mServices.begin();
281 while ( it != mServices.end() )
283 if ( ( *it )->name() == name )
286 it = mServices.erase( it );
295 mServiceVersions.remove( name );
299 const QString key = makeServiceKey( name, version );
300 const ServiceTable::iterator found = mServices.find( key );
301 if ( found != mServices.end() )
304 mServices.erase( found );
311 const std::function<void(
const ServiceTable::mapped_type & )> findGreaterVersion = [name, &maxVer](
const ServiceTable::mapped_type &service ) {
312 if ( service->name() == name && ( maxVer.isEmpty() || isVersionGreater( service->version(), maxVer ) ) )
313 maxVer = service->version();
316 mServiceVersions.remove( name );
318 std::for_each( mServices.constBegin(), mServices.constEnd(), findGreaterVersion );
319 if ( !maxVer.isEmpty() )
322 const QString key = makeServiceKey( name, maxVer );
323 mServiceVersions.insert( name, VersionTable::mapped_type( version, key ) );
333 mNativeLoader.loadModules( nativeModulePath, *
this, serverIface );
339 mServiceVersions.clear();
342 mNativeLoader.unloadModules();
347 const QString name = api->
name();
348 const QString version = api->
version();
351 const QString key = makeServiceKey( name, version );
352 if ( mApis.constFind( key ) != mApis.constEnd() )
359 mApis.insert( key, std::shared_ptr<QgsServerApi>( api ) );
366 const VersionTable::const_iterator v = mApiVersions.constFind( name );
367 if ( v == mApiVersions.constEnd() )
370 mApiVersions.insert( name, VersionTable::mapped_type( version, key ) );
@ Warning
Warning message.
@ Critical
Critical/error message.
@ Info
Information message.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
Adds a message to the log instance (and creates it if necessary).
Server generic API endpoint abstract base class.
virtual const QString version() const
Returns the version of the service.
virtual const QString name() const =0
Returns the API name.
virtual const QString rootPath() const =0
Returns the root path for the API.
Defines interfaces exposed by QGIS Server and made available to plugins.
Defines requests passed to QgsService classes.
QUrl url() const
Returns the request URL as seen by QGIS server.
void cleanUp()
Clean up registered service and unregister modules.
bool registerApi(QgsServerApi *api)
Registers the QgsServerApi api.
int unregisterService(const QString &name, const QString &version=QString())
Unregister service from its name and version.
int unregisterApi(const QString &name, const QString &version=QString())
Unregisters API from its name and version.
QgsServerApi * apiForRequest(const QgsServerRequest &request) const
Searches the API register for an API matching the request and returns a (possibly NULL) pointer to it...
void init(const QString &nativeModulepath, QgsServerInterface *serverIface=nullptr)
Initialize registry, load modules and auto register services.
QgsService * getService(const QString &name, const QString &version=QString())
Retrieve a service from its name.
void registerService(QgsService *service)
Register a service by its name and version.
QgsServerApi * getApi(const QString &name, const QString &version=QString())
Retrieves an API from its name.
Defines interfaces for QGIS server services.
virtual QString name() const =0
Returns the name of the service.
virtual QString version() const =0
Returns the version of the service.