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
00030 KURLDrag::KURLDrag(
const KURL::List &urls,
QWidget* dragSource,
const char * name )
00031 :
QUriDrag(dragSource, name), m_metaData()
00032 {
00033 init(urls);
00034 }
00035
00036 KURLDrag::KURLDrag(
const KURL::List &urls,
const QMap<QString,QString>& metaData,
00037
QWidget* dragSource,
const char * name )
00038 :
QUriDrag(dragSource, name), m_metaData(metaData)
00039 {
00040 init(urls);
00041 }
00042
00043 KURLDrag::~KURLDrag()
00044 {
00045 }
00046
00047
void KURLDrag::init(
const KURL::List &urls)
00048 {
00049
KURL::List::ConstIterator uit = urls.
begin();
00050
KURL::List::ConstIterator uEnd = urls.
end();
00051
00052
00053
for ( ; uit != uEnd ; ++uit )
00054 {
00055 m_urls.append(
urlToString(*uit).
latin1() );
00056 }
00057
setUris(m_urls);
00058 }
00059
00060 KURLDrag *
KURLDrag::newDrag(
const KURL::List &urls,
QWidget* dragSource,
const char * name )
00061 {
00062
return new KURLDrag( urls,
QMap<QString, QString>(), dragSource, name );
00063 }
00064
00065 KURLDrag *
KURLDrag::newDrag(
const KURL::List &urls,
const QMap<QString, QString>& metaData,
00066
QWidget* dragSource,
const char * name )
00067 {
00068
return new KURLDrag( urls, metaData, dragSource, name );
00069 }
00070
00071 bool KURLDrag::decode(
const QMimeSource *e,
KURL::List &uris )
00072 {
00073
QStrList lst;
00074 QUriDrag::decode( e, lst );
00075
for (
QStrListIterator it(lst); *it; ++it)
00076 {
00077
KURL url =
stringToUrl( *it );
00078
if ( !url.
isValid() )
00079 {
00080 uris.
clear();
00081
break;
00082 }
00083 uris.
append( url );
00084 }
00085
return !uris.
isEmpty();
00086 }
00087
00088 bool KURLDrag::decode(
const QMimeSource *e,
KURL::List &uris,
QMap<QString,QString>& metaData )
00089 {
00090
if (
decode( e, uris ) )
00091 {
00092
QByteArray ba = e->
encodedData(
"application/x-kio-metadata" );
00093
if ( ba.size() )
00094 {
00095
QString s = ba.data();
00096
QStringList l = QStringList::split(
"$@@$", s );
00097 QStringList::ConstIterator it = l.begin();
00098
bool readingKey =
true;
00099
QString key;
00100
for ( ; it != l.end(); ++it ) {
00101
if ( readingKey )
00102 key = *it;
00103
else
00104 metaData.
replace( key, *it );
00105 readingKey = !readingKey;
00106 }
00107 Q_ASSERT( readingKey );
00108 }
00109
return true;
00110 }
00111
return false;
00112 }
00113
00114
#ifdef Q_WS_QWS
00115
bool KURLDrag::decode(
QStringList const &e,
KURL::List &uris )
00116 {
00117
for(QStringList::ConstIterator it=e.begin(); it!=e.end(); it++)
00118 {
00119
KURL url =
KURL( *it, 106 );
00120
if ( !url.
isValid() )
00121 {
00122 uris.
clear();
00123
break;
00124 }
00125 uris.
append( url );
00126 }
00127
return !uris.
isEmpty();
00128 }
00129
#endif
00130
00132
00133
const char * KURLDrag::format(
int i )
const
00134
{
00135
if ( i == 0 )
00136
return "text/uri-list";
00137
else if ( i == 1 )
00138
return "text/plain";
00139
else if ( i == 2 )
00140
return "application/x-kio-metadata";
00141
else if ( i == 3 )
00142
return "text/plain;charset=ISO-8859-1";
00143
else if ( i == 4 )
00144
return "text/plain;charset=UTF-8";
00145
else return 0;
00146 }
00147
00148
QByteArray KURLDrag::encodedData(
const char* mime )
const
00149
{
00150
QByteArray a;
00151
QCString mimetype( mime );
00152
if (
mimetype ==
"text/uri-list" )
00153
return QUriDrag::encodedData( mime );
00154
else if (
mimetype ==
"text/plain" )
00155 {
00156
QStringList uris;
00157
for (
QStrListIterator it(m_urls); *it; ++it)
00158 uris.append(
stringToUrl(*it).
prettyURL());
00159
00160
QCString s = uris.
join(
"\n" ).local8Bit();
00161
if( uris.count() > 1 )
00162 s.
append(
"\n" );
00163 a.resize( s.
length());
00164 memcpy( a.data(), s.data(), s.
length());
00165 }
00166
else if (
mimetype.lower() ==
"text/plain;charset=iso-8859-1")
00167 {
00168
QStringList uris;
00169
for (
QStrListIterator it(m_urls); *it; ++it)
00170
for (
QStrListIterator it(m_urls); *it; ++it)
00171 uris.append(
stringToUrl(*it).
url(0, 4));
00172
00173
QCString s = uris.
join(
"\n" ).latin1();
00174
if( uris.count() > 1 )
00175 s.
append(
"\n" );
00176 a.resize( s.
length());
00177 memcpy( a.data(), s.data(), s.
length());
00178 }
00179
else if (
mimetype.lower() ==
"text/plain;charset=utf-8")
00180 {
00181
QStringList uris;
00182
for (
QStrListIterator it(m_urls); *it; ++it)
00183 uris.append(
stringToUrl(*it).
prettyURL());
00184
00185
QCString s = uris.
join(
"\n" ).utf8();
00186
if( uris.count() > 1 )
00187 s.
append(
"\n" );
00188 a.resize( s.
length());
00189 memcpy( a.data(), s.data(), s.
length());
00190 }
00191
else if (
mimetype ==
"application/x-kio-metadata" )
00192 {
00193
if ( !m_metaData.
isEmpty() )
00194 {
00195
QString s;
00196
QMap<QString,QString>::ConstIterator it;
00197
for( it = m_metaData.
begin(); it != m_metaData.
end(); ++it )
00198 {
00199 s += it.key();
00200 s +=
"$@@$";
00201 s += it.data();
00202 s +=
"$@@$";
00203 }
00204 a.resize( s.
length() + 1 );
00205 memcpy( a.data(), s.
latin1(), a.size() );
00206 }
00207 }
00208
return a;
00209 }
00210
00211 KURL KURLDrag::stringToUrl(
const QCString &s)
00212 {
00213
if (strncmp(s.data(),
"file:", 5) == 0)
00214
return KURL(s, KGlobal::locale()->fileEncodingMib());
00215
00216
return KURL(s, 106);
00217 }
00218
00219 QString KURLDrag::urlToString(
const KURL &url)
00220 {
00221
if (url.
isLocalFile())
00222 {
00223
#if 1
00224
return url.
url(0, KGlobal::locale()->fileEncodingMib());
00225
#else
00226
00227
00228
00229
QString s = url.
url(0, KGlobal::locale()->fileEncodingMib());
00230
if( !s.
startsWith(
"file://" ))
00231 {
00232
char hostname[257];
00233
if ( gethostname( hostname, 255 ) == 0 )
00234 {
00235 hostname[256] =
'\0';
00236
return QString(
"file://" ) + hostname + s.
mid( 5 );
00237 }
00238 }
00239
#endif
00240
}
00241
00242
return url.
url(0, 106);
00243 }
00244
00245
00246 KURLDrag::KURLDrag(
const QStrList & urls,
const QMap<QString,QString>& metaData,
00247
QWidget * dragSource,
const char* name ) :
00248
QUriDrag( urls, dragSource, name ), m_urls( urls ), m_metaData( metaData ) {}
00249