2222static const char * QGIS_URILIST_MIMETYPE = " application/x-vnd.qgis.qgis.uri" ;
2323
2424QgsMimeDataUtils::Uri::Uri ( QgsLayerItem* layerItem )
25- : providerKey( layerItem->providerKey () ), name( layerItem->layerName () ), uri( layerItem->uri () )
25+ : providerKey( layerItem->providerKey () )
26+ , name( layerItem->layerName () )
27+ , uri( layerItem->uri () )
28+ , supportedCrs( layerItem->supportedCRS () )
29+ , supportedFormats( layerItem->supportedFormats () )
2630{
2731 switch ( layerItem->mapLayerType () )
2832 {
@@ -36,66 +40,26 @@ QgsMimeDataUtils::Uri::Uri( QgsLayerItem* layerItem )
3640 layerType = " plugin" ;
3741 break ;
3842 }
39-
4043}
4144
4245QgsMimeDataUtils::Uri::Uri ( QString& encData )
4346{
44- QStringList parts;
45- QChar split = ' :' ;
46- QChar escape = ' \\ ' ;
47- QString part;
48- bool inEscape = false ;
49- if ( encData.isEmpty () )
50- return ;
51- for ( int i = 0 ; i < encData.length (); ++i )
52- {
53- if ( encData.at ( i ) == escape && !inEscape )
54- {
55- inEscape = true ;
56- }
57- else if ( encData.at ( i ) == split && !inEscape )
58- {
59- parts << part;
60- part = " " ;
61- }
62- else
63- {
64- part += encData.at ( i );
65- inEscape = false ;
66- }
67- }
68- if ( !part.isEmpty () )
47+ QStringList decoded = decode ( encData );
48+ if ( decoded.size () == 6 )
6949 {
70- parts << part;
71- }
72-
73- if ( parts.size () <= 5 ) // PostGISTRaster layers yields five parts
74- {
75- layerType = parts.value ( 0 );
76- providerKey = parts.value ( 1 );
77- name = parts.value ( 2 );
78- // fetchs PostGISRaster layers
79- if ( parts.value ( 3 ) == " PG" )
80- {
81- uri = parts.value ( 3 ) + " :" + parts.value ( 4 );
82- }
83- else
84- {
85- uri = parts.value ( 3 );
86- }
87- QgsDebugMsg ( " type: " + layerType + " key: " + providerKey + " name: " + name + " uri: " + uri );
50+ layerType = decoded[0 ];
51+ providerKey = decoded[1 ];
52+ name = decoded[2 ];
53+ uri = decoded[3 ];
54+ supportedCrs = decode ( decoded[4 ] );
55+ supportedFormats = decode ( decoded[5 ] );
56+ QgsDebugMsg ( " type: " + layerType + " key: " + providerKey + " name: " + name + " uri: " + uri + " supportedCRS: " + decoded[4 ] + " supportedFormats: " + decoded[5 ] );
8857 }
8958}
9059
9160QString QgsMimeDataUtils::Uri::data () const
9261{
93- QString escapedName = name;
94- QString escapeUri = uri;
95- escapedName.replace ( " :" , " \\ :" );
96- escapeUri.replace ( " \\ " , " \\\\ " );
97- escapeUri.replace ( " :" , " \\ :" );
98- return layerType + " :" + providerKey + " :" + escapedName + " :" + escapeUri;
62+ return encode ( QStringList () << layerType << providerKey << name << uri << encode ( supportedCrs ) << encode ( supportedFormats ) );
9963}
10064
10165// -----
@@ -135,3 +99,46 @@ QgsMimeDataUtils::UriList QgsMimeDataUtils::decodeUriList( const QMimeData* data
13599 }
136100 return list;
137101}
102+
103+ QString QgsMimeDataUtils::encode ( const QStringList& items )
104+ {
105+ QString encoded;
106+ foreach ( const QString& item, items )
107+ {
108+ QString str = item;
109+ str.replace ( " :" , " \\ :" );
110+ encoded += str + " :" ;
111+ }
112+ return encoded.left ( encoded.length () - 1 );
113+ }
114+
115+ QStringList QgsMimeDataUtils::decode ( const QString& encoded )
116+ {
117+ QStringList items;
118+ QString item;
119+ bool inEscape = false ;
120+ foreach ( const QChar& c, encoded )
121+ {
122+ if ( c == ' \\ ' && inEscape )
123+ {
124+ item += c;
125+ }
126+ else if ( c == ' \\ ' )
127+ {
128+ inEscape = true ;
129+ }
130+ else if ( c == ' :' && !inEscape )
131+ {
132+ items.append ( item );
133+ item = " " ;
134+ }
135+ else
136+ {
137+ item += c;
138+ inEscape = false ;
139+ }
140+ }
141+ items.append ( item );
142+ return items;
143+ }
144+
0 commit comments