Skip to content

Commit d136e92

Browse files
committed
[afs] fix listing of afs services for saved servers starting in a sub-folder
1 parent be8438b commit d136e92

File tree

4 files changed

+55
-20
lines changed

4 files changed

+55
-20
lines changed

src/providers/arcgisrest/qgsafsdataitems.cpp

+5-6
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,14 @@ void addFolderItems( QVector< QgsDataItem * > &items, const QVariantMap &service
9696
}, serviceData, baseUrl );
9797
}
9898

99-
void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &baseUrl, const QString &authcfg, QgsDataItem *parent,
100-
const QString &parentName )
99+
void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &baseUrl, const QString &authcfg, QgsDataItem *parent )
101100
{
102101
QgsArcGisRestUtils::visitServiceItems(
103102
[&items, parent, authcfg]( const QString & name, const QString & url )
104103
{
105104
std::unique_ptr< QgsAfsServiceItem > serviceItem = qgis::make_unique< QgsAfsServiceItem >( parent, name, url, url, authcfg );
106105
items.append( serviceItem.release() );
107-
}, serviceData, baseUrl, parentName );
106+
}, serviceData, baseUrl );
108107
}
109108

110109
void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &parentUrl, const QString &authcfg, QgsDataItem *parent )
@@ -176,7 +175,7 @@ QVector<QgsDataItem *> QgsAfsConnectionItem::createChildren()
176175
}
177176

178177
addFolderItems( items, serviceData, url, authcfg, this );
179-
addServiceItems( items, serviceData, url, authcfg, this, QString() );
178+
addServiceItems( items, serviceData, url, authcfg, this );
180179
addLayerItems( items, serviceData, url, authcfg, this );
181180

182181
return items;
@@ -287,7 +286,7 @@ QVector<QgsDataItem *> QgsAfsFolderItem::createChildren()
287286
}
288287

289288
addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, this );
290-
addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, this, mName );
289+
addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, this );
291290
addLayerItems( items, serviceData, mPath, mAuthCfg, this );
292291
return items;
293292
}
@@ -328,7 +327,7 @@ QVector<QgsDataItem *> QgsAfsServiceItem::createChildren()
328327
}
329328

330329
addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, this );
331-
addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, this, mName );
330+
addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, this );
332331
addLayerItems( items, serviceData, mPath, mAuthCfg, this );
333332
return items;
334333
}

src/providers/arcgisrest/qgsafssourceselect.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )
4141
const QString authcfg = connection.uri().param( QStringLiteral( "authcfg" ) );
4242
const QString baseUrl = connection.uri().param( QStringLiteral( "url" ) );
4343

44-
std::function< bool( const QString &, QStandardItem *, const QString & )> visitItemsRecursive;
45-
visitItemsRecursive = [this, &visitItemsRecursive, baseUrl, authcfg, &errorTitle, &errorMessage]( const QString & baseItemUrl, QStandardItem * parentItem, const QString & parentName ) -> bool
44+
std::function< bool( const QString &, QStandardItem * )> visitItemsRecursive;
45+
visitItemsRecursive = [this, &visitItemsRecursive, baseUrl, authcfg, &errorTitle, &errorMessage]( const QString & baseItemUrl, QStandardItem * parentItem ) -> bool
4646
{
4747
const QVariantMap serviceInfoMap = QgsArcGisRestUtils::getServiceInfo( baseItemUrl, authcfg, errorTitle, errorMessage );
4848

@@ -62,7 +62,7 @@ bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )
6262
else
6363
mModel->appendRow( QList<QStandardItem *>() << nameItem );
6464

65-
if ( !visitItemsRecursive( url, nameItem, name ) )
65+
if ( !visitItemsRecursive( url, nameItem ) )
6666
res = false;
6767
}, serviceInfoMap, baseUrl );
6868

@@ -76,9 +76,9 @@ bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )
7676
else
7777
mModel->appendRow( QList<QStandardItem *>() << nameItem );
7878

79-
if ( !visitItemsRecursive( url, nameItem, name ) )
79+
if ( !visitItemsRecursive( url, nameItem ) )
8080
res = false;
81-
}, serviceInfoMap, baseUrl, parentName );
81+
}, serviceInfoMap, baseUrl );
8282

8383
QMap< QString, QList<QStandardItem *> > layerItems;
8484
QMap< QString, QString > parents;
@@ -143,7 +143,7 @@ bool QgsAfsSourceSelect::connectToService( const QgsOwsConnection &connection )
143143
return res;
144144
};
145145

146-
if ( !visitItemsRecursive( baseUrl, nullptr, QString() ) )
146+
if ( !visitItemsRecursive( baseUrl, nullptr ) )
147147
QMessageBox::warning( this, tr( "Error" ), tr( "Failed to retrieve service capabilities:\n%1: %2" ).arg( errorTitle, errorMessage ) );
148148

149149
return true;

src/providers/arcgisrest/qgsarcgisrestutils.cpp

+42-7
Original file line numberDiff line numberDiff line change
@@ -1056,18 +1056,50 @@ void QgsArcGisAsyncParallelQuery::handleReply()
10561056
}
10571057
}
10581058

1059+
void QgsArcGisRestUtils::adjustBaseUrl( QString &baseUrl, const QString name )
1060+
{
1061+
QStringList parts = name.split( '/' );
1062+
QString checkString;
1063+
for ( const QString &part : parts )
1064+
{
1065+
if ( !checkString.isEmpty() )
1066+
checkString += QString( '/' );
1067+
1068+
checkString += part;
1069+
if ( baseUrl.indexOf( QRegularExpression( checkString.replace( '/', QStringLiteral( "\\/" ) ) + QStringLiteral( "\\/?$" ) ) ) > -1 )
1070+
{
1071+
baseUrl = baseUrl.left( baseUrl.length() - checkString.length() - 1 );
1072+
break;
1073+
}
1074+
}
1075+
}
1076+
10591077
void QgsArcGisRestUtils::visitFolderItems( const std::function< void( const QString &, const QString & ) > &visitor, const QVariantMap &serviceData, const QString &baseUrl )
10601078
{
1079+
QString base( baseUrl );
1080+
bool baseChecked = false;
1081+
if ( !base.endsWith( '/' ) )
1082+
base += QStringLiteral( "/" );
1083+
10611084
const QStringList folderList = serviceData.value( QStringLiteral( "folders" ) ).toStringList();
10621085
for ( const QString &folder : folderList )
10631086
{
1064-
visitor( folder, baseUrl + ( baseUrl.endsWith( '/' ) ? QString() : QString( '/' ) ) + folder );
1087+
if ( !baseChecked )
1088+
{
1089+
adjustBaseUrl( base, folder );
1090+
baseChecked = true;
1091+
}
1092+
visitor( folder, base + folder );
10651093
}
10661094
}
10671095

1068-
void QgsArcGisRestUtils::visitServiceItems( const std::function< void( const QString &, const QString & ) > &visitor, const QVariantMap &serviceData, const QString &baseUrl,
1069-
const QString &parentName )
1096+
void QgsArcGisRestUtils::visitServiceItems( const std::function< void( const QString &, const QString & ) > &visitor, const QVariantMap &serviceData, const QString &baseUrl )
10701097
{
1098+
QString base( baseUrl );
1099+
bool baseChecked = false;
1100+
if ( !base.endsWith( '/' ) )
1101+
base += QStringLiteral( "/" );
1102+
10711103
const QVariantList serviceList = serviceData.value( QStringLiteral( "services" ) ).toList();
10721104
for ( const QVariant &service : serviceList )
10731105
{
@@ -1077,11 +1109,14 @@ void QgsArcGisRestUtils::visitServiceItems( const std::function< void( const QSt
10771109
continue;
10781110

10791111
const QString serviceName = serviceMap.value( QStringLiteral( "name" ) ).toString();
1080-
QString displayName = serviceName;
1081-
if ( displayName.startsWith( parentName + '/' ) )
1082-
displayName = displayName.mid( parentName.length() + 1 );
1112+
QString displayName = serviceName.split( '/' ).last();
1113+
if ( !baseChecked )
1114+
{
1115+
adjustBaseUrl( base, serviceName );
1116+
baseChecked = true;
1117+
}
10831118

1084-
visitor( displayName, baseUrl + ( baseUrl.endsWith( '/' ) ? QString() : QString( '/' ) ) + serviceName + '/' + serviceType );
1119+
visitor( displayName, base + serviceName + '/' + serviceType );
10851120
}
10861121
}
10871122

src/providers/arcgisrest/qgsarcgisrestutils.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ class QgsArcGisRestUtils
6666
static QDateTime parseDateTime( const QVariant &value );
6767

6868
static QUrl parseUrl( const QUrl &url );
69+
static void adjustBaseUrl( QString &baseUrl, const QString name );
6970
static void visitFolderItems( const std::function<void ( const QString &folderName, const QString &url )> &visitor, const QVariantMap &serviceData, const QString &baseUrl );
70-
static void visitServiceItems( const std::function<void ( const QString &serviceName, const QString &url )> &visitor, const QVariantMap &serviceData, const QString &baseUrl, const QString &parentName );
71+
static void visitServiceItems( const std::function<void ( const QString &serviceName, const QString &url )> &visitor, const QVariantMap &serviceData, const QString &baseUrl );
7172
static void addLayerItems( const std::function<void ( const QString &parentLayerId, const QString &layerId, const QString &name, const QString &description, const QString &url, bool isParentLayer, const QString &authid )> &visitor, const QVariantMap &serviceData, const QString &parentUrl );
7273
};
7374

0 commit comments

Comments
 (0)