00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kurldrag.h"
00021 #include <qstrlist.h>
00022 #include <qdragobject.h>
00023 #include <qfont.h>
00024 #include <unistd.h>
00025
00026 #include <kdeversion.h>
00027 #include <kglobal.h>
00028 #include <klocale.h>
00029 #include <kdebug.h>
00030
00031 class KURLDragPrivate
00032 {
00033 public:
00034 bool m_exportAsText;
00035 };
00036
00037 KURLDrag::KURLDrag( const KURL::List &urls, QWidget* dragSource, const char * name )
00038 : QUriDrag(dragSource, name), m_metaData(), d( 0 )
00039 {
00040 init(urls);
00041 }
00042
00043 KURLDrag::KURLDrag( const KURL::List &urls, const QMap<QString,QString>& metaData,
00044 QWidget* dragSource, const char * name )
00045 : QUriDrag(dragSource, name), m_metaData(metaData), d( 0 )
00046 {
00047 init(urls);
00048 }
00049
00050 KURLDrag::~KURLDrag()
00051 {
00052 delete d;
00053 }
00054
00055 void KURLDrag::init(const KURL::List &urls)
00056 {
00057 KURL::List::ConstIterator uit = urls.begin();
00058 KURL::List::ConstIterator uEnd = urls.end();
00059
00060
00061 for ( ; uit != uEnd ; ++uit )
00062 {
00063 m_urls.append( urlToString(*uit).latin1() );
00064 }
00065 setUris(m_urls);
00066 }
00067
00068 void KURLDrag::setExportAsText( bool exp )
00069 {
00070
00071 if ( !d )
00072 d = new KURLDragPrivate;
00073 d->m_exportAsText = exp;
00074 }
00075
00076 KURLDrag * KURLDrag::newDrag( const KURL::List &urls, QWidget* dragSource, const char * name )
00077 {
00078 return new KURLDrag( urls, QMap<QString, QString>(), dragSource, name );
00079 }
00080
00081 KURLDrag * KURLDrag::newDrag( const KURL::List &urls, const QMap<QString, QString>& metaData,
00082 QWidget* dragSource, const char * name )
00083 {
00084 return new KURLDrag( urls, metaData, dragSource, name );
00085 }
00086
00087 bool KURLDrag::decode( const QMimeSource *e, KURL::List &uris )
00088 {
00089 if ( e->provides( "application/x-kde-urilist" ) ) {
00090 QByteArray payload = e->encodedData( "application/x-kde-urilist" );
00091 if ( payload.size() ) {
00092 uint c=0;
00093 const char* d = payload.data();
00094 while (c < payload.size() && d[c]) {
00095 uint f = c;
00096
00097 while (c < payload.size() && d[c] && d[c]!='\r'
00098 && d[c] != '\n')
00099 c++;
00100 QCString s(d+f,c-f+1);
00101 if ( s[0] != '#' )
00102 uris.append(stringToUrl(s));
00103
00104 while (c < payload.size() && d[c] &&
00105 (d[c]=='\n' || d[c]=='\r'))
00106 c++;
00107 }
00108 return !uris.isEmpty();
00109 }
00110 }
00111
00112 QStrList lst;
00113 QUriDrag::decode( e, lst );
00114 for (QStrListIterator it(lst); *it; ++it)
00115 {
00116 KURL url = stringToUrl( *it );
00117 if ( !url.isValid() )
00118 {
00119 uris.clear();
00120 break;
00121 }
00122 uris.append( url );
00123 }
00124 return !uris.isEmpty();
00125 }
00126
00127 bool KURLDrag::decode( const QMimeSource *e, KURL::List &uris, QMap<QString,QString>& metaData )
00128 {
00129 if ( decode( e, uris ) )
00130 {
00131 QByteArray ba = e->encodedData( "application/x-kio-metadata" );
00132 if ( ba.size() )
00133 {
00134 QString s = ba.data();
00135 QStringList l = QStringList::split( "$@@$", s );
00136 QStringList::ConstIterator it = l.begin();
00137 bool readingKey = true;
00138 QString key;
00139 for ( ; it != l.end(); ++it ) {
00140 if ( readingKey )
00141 key = *it;
00142 else
00143 metaData.replace( key, *it );
00144 readingKey = !readingKey;
00145 }
00146 Q_ASSERT( readingKey );
00147 }
00148 return true;
00149 }
00150 return false;
00151 }
00152
00153 #ifdef Q_WS_QWS
00154 bool KURLDrag::decode( QStringList const &e, KURL::List &uris )
00155 {
00156 QStringList::ConstIterator end(e.end());
00157 for(QStringList::ConstIterator it=e.begin(); it!=end; ++it)
00158 {
00159 KURL url = KURL( *it, 106 );
00160 if ( !url.isValid() )
00161 {
00162 uris.clear();
00163 break;
00164 }
00165 uris.append( url );
00166 }
00167 return !uris.isEmpty();
00168 }
00169 #endif
00170
00172
00173 const char * KURLDrag::format( int i ) const
00174 {
00175 if ( i == 0 )
00176 return "text/uri-list";
00177 else if ( i == 1 )
00178 return "application/x-kio-metadata";
00179 if ( d && d->m_exportAsText == false )
00180 return 0;
00181 if ( i == 2 )
00182 return "text/plain";
00183 else if ( i == 3 )
00184 return "text/plain;charset=ISO-8859-1";
00185 else if ( i == 4 )
00186 return "text/plain;charset=UTF-8";
00187 else return 0;
00188 }
00189
00190 QByteArray KURLDrag::encodedData( const char* mime ) const
00191 {
00192 QByteArray a;
00193 QCString mimetype( mime );
00194 if ( mimetype == "text/uri-list" )
00195 return QUriDrag::encodedData( mime );
00196 else if ( mimetype == "text/plain" )
00197 {
00198 QStringList uris;
00199 for (QStrListIterator it(m_urls); *it; ++it)
00200 uris.append(stringToUrl(*it).prettyURL());
00201
00202 QCString s = uris.join( "\n" ).local8Bit();
00203 if( uris.count() > 1 )
00204 s.append( "\n" );
00205 a.resize( s.length());
00206 memcpy( a.data(), s.data(), s.length());
00207 }
00208 else if ( mimetype.lower() == "text/plain;charset=iso-8859-1")
00209 {
00210 QStringList uris;
00211 for (QStrListIterator it(m_urls); *it; ++it)
00212 for (QStrListIterator it(m_urls); *it; ++it)
00213 uris.append(stringToUrl(*it).url(0, 4));
00214
00215 QCString s = uris.join( "\n" ).latin1();
00216 if( uris.count() > 1 )
00217 s.append( "\n" );
00218 a.resize( s.length());
00219 memcpy( a.data(), s.data(), s.length());
00220 }
00221 else if ( mimetype.lower() == "text/plain;charset=utf-8")
00222 {
00223 QStringList uris;
00224 for (QStrListIterator it(m_urls); *it; ++it)
00225 uris.append(stringToUrl(*it).prettyURL());
00226
00227 QCString s = uris.join( "\n" ).utf8();
00228 if( uris.count() > 1 )
00229 s.append( "\n" );
00230 a.resize( s.length());
00231 memcpy( a.data(), s.data(), s.length());
00232 }
00233 else if ( mimetype == "application/x-kio-metadata" )
00234 {
00235 if ( !m_metaData.isEmpty() )
00236 {
00237 QString s;
00238 QMap<QString,QString>::ConstIterator it;
00239 for( it = m_metaData.begin(); it != m_metaData.end(); ++it )
00240 {
00241 s += it.key();
00242 s += "$@@$";
00243 s += it.data();
00244 s += "$@@$";
00245 }
00246 a.resize( s.length() + 1 );
00247 memcpy( a.data(), s.latin1(), a.size() );
00248 }
00249 }
00250 return a;
00251 }
00252
00253 KURL KURLDrag::stringToUrl(const QCString &s)
00254 {
00255 if (strncmp(s.data(), "file:", 5) == 0)
00256 return KURL(s, KGlobal::locale()->fileEncodingMib());
00257
00258 return KURL(s, 106);
00259 }
00260
00261 QString KURLDrag::urlToString(const KURL &url)
00262 {
00263 if (url.isLocalFile())
00264 {
00265 #if 1
00266 return url.url(0, KGlobal::locale()->fileEncodingMib());
00267 #else
00268
00269
00270
00271 QString s = url.url(0, KGlobal::locale()->fileEncodingMib());
00272 if( !s.startsWith( "file://" ))
00273 {
00274 char hostname[257];
00275 if ( gethostname( hostname, 255 ) == 0 )
00276 {
00277 hostname[256] = '\0';
00278 return QString( "file://" ) + hostname + s.mid( 5 );
00279 }
00280 }
00281 #endif
00282 }
00283
00284 if ( url.protocol() == "mailto" ) {
00285 return url.path();
00286 }
00287
00288 return url.url(0, 106);
00289 }
00290
00291
00292 KURLDrag::KURLDrag( const QStrList & urls, const QMap<QString,QString>& metaData,
00293 QWidget * dragSource, const char* name ) :
00294 QUriDrag( urls, dragSource, name ), m_urls( urls ), m_metaData( metaData ), d( 0 ) {}