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 QStrList lst;
00090 QUriDrag::decode( e, lst );
00091 for (QStrListIterator it(lst); *it; ++it)
00092 {
00093 KURL url = stringToUrl( *it );
00094 if ( !url.isValid() )
00095 {
00096 uris.clear();
00097 break;
00098 }
00099 uris.append( url );
00100 }
00101 return !uris.isEmpty();
00102 }
00103
00104 bool KURLDrag::decode( const QMimeSource *e, KURL::List &uris, QMap<QString,QString>& metaData )
00105 {
00106 if ( decode( e, uris ) )
00107 {
00108 QByteArray ba = e->encodedData( "application/x-kio-metadata" );
00109 if ( ba.size() )
00110 {
00111 QString s = ba.data();
00112 QStringList l = QStringList::split( "$@@$", s );
00113 QStringList::ConstIterator it = l.begin();
00114 bool readingKey = true;
00115 QString key;
00116 for ( ; it != l.end(); ++it ) {
00117 if ( readingKey )
00118 key = *it;
00119 else
00120 metaData.replace( key, *it );
00121 readingKey = !readingKey;
00122 }
00123 Q_ASSERT( readingKey );
00124 }
00125 return true;
00126 }
00127 return false;
00128 }
00129
00130 #ifdef Q_WS_QWS
00131 bool KURLDrag::decode( QStringList const &e, KURL::List &uris )
00132 {
00133 for(QStringList::ConstIterator it=e.begin(); it!=e.end(); it++)
00134 {
00135 KURL url = KURL( *it, 106 );
00136 if ( !url.isValid() )
00137 {
00138 uris.clear();
00139 break;
00140 }
00141 uris.append( url );
00142 }
00143 return !uris.isEmpty();
00144 }
00145 #endif
00146
00148
00149 const char * KURLDrag::format( int i ) const
00150 {
00151 if ( i == 0 )
00152 return "text/uri-list";
00153 else if ( i == 1 )
00154 return "application/x-kio-metadata";
00155 if ( d && d->m_exportAsText == false )
00156 return 0;
00157 if ( i == 2 )
00158 return "text/plain";
00159 else if ( i == 3 )
00160 return "text/plain;charset=ISO-8859-1";
00161 else if ( i == 4 )
00162 return "text/plain;charset=UTF-8";
00163 else return 0;
00164 }
00165
00166 QByteArray KURLDrag::encodedData( const char* mime ) const
00167 {
00168 QByteArray a;
00169 QCString mimetype( mime );
00170 if ( mimetype == "text/uri-list" )
00171 return QUriDrag::encodedData( mime );
00172 else if ( mimetype == "text/plain" )
00173 {
00174 QStringList uris;
00175 for (QStrListIterator it(m_urls); *it; ++it)
00176 uris.append(stringToUrl(*it).prettyURL());
00177
00178 QCString s = uris.join( "\n" ).local8Bit();
00179 if( uris.count() > 1 )
00180 s.append( "\n" );
00181 a.resize( s.length());
00182 memcpy( a.data(), s.data(), s.length());
00183 }
00184 else if ( mimetype.lower() == "text/plain;charset=iso-8859-1")
00185 {
00186 QStringList uris;
00187 for (QStrListIterator it(m_urls); *it; ++it)
00188 for (QStrListIterator it(m_urls); *it; ++it)
00189 uris.append(stringToUrl(*it).url(0, 4));
00190
00191 QCString s = uris.join( "\n" ).latin1();
00192 if( uris.count() > 1 )
00193 s.append( "\n" );
00194 a.resize( s.length());
00195 memcpy( a.data(), s.data(), s.length());
00196 }
00197 else if ( mimetype.lower() == "text/plain;charset=utf-8")
00198 {
00199 QStringList uris;
00200 for (QStrListIterator it(m_urls); *it; ++it)
00201 uris.append(stringToUrl(*it).prettyURL());
00202
00203 QCString s = uris.join( "\n" ).utf8();
00204 if( uris.count() > 1 )
00205 s.append( "\n" );
00206 a.resize( s.length());
00207 memcpy( a.data(), s.data(), s.length());
00208 }
00209 else if ( mimetype == "application/x-kio-metadata" )
00210 {
00211 if ( !m_metaData.isEmpty() )
00212 {
00213 QString s;
00214 QMap<QString,QString>::ConstIterator it;
00215 for( it = m_metaData.begin(); it != m_metaData.end(); ++it )
00216 {
00217 s += it.key();
00218 s += "$@@$";
00219 s += it.data();
00220 s += "$@@$";
00221 }
00222 a.resize( s.length() + 1 );
00223 memcpy( a.data(), s.latin1(), a.size() );
00224 }
00225 }
00226 return a;
00227 }
00228
00229 KURL KURLDrag::stringToUrl(const QCString &s)
00230 {
00231 if (strncmp(s.data(), "file:", 5) == 0)
00232 return KURL(s, KGlobal::locale()->fileEncodingMib());
00233
00234 return KURL(s, 106);
00235 }
00236
00237 QString KURLDrag::urlToString(const KURL &url)
00238 {
00239 if (url.isLocalFile())
00240 {
00241 #if 1
00242 return url.url(0, KGlobal::locale()->fileEncodingMib());
00243 #else
00244
00245
00246
00247 QString s = url.url(0, KGlobal::locale()->fileEncodingMib());
00248 if( !s.startsWith( "file://" ))
00249 {
00250 char hostname[257];
00251 if ( gethostname( hostname, 255 ) == 0 )
00252 {
00253 hostname[256] = '\0';
00254 return QString( "file://" ) + hostname + s.mid( 5 );
00255 }
00256 }
00257 #endif
00258 }
00259
00260 if ( url.protocol() == "mailto" ) {
00261 return url.path();
00262 }
00263
00264 return url.url(0, 106);
00265 }
00266
00267
00268 KURLDrag::KURLDrag( const QStrList & urls, const QMap<QString,QString>& metaData,
00269 QWidget * dragSource, const char* name ) :
00270 QUriDrag( urls, dragSource, name ), m_urls( urls ), m_metaData( metaData ), d( 0 ) {}