Source Code (Use browser search to find items of interest.)

Class Index

qt'QUriDrag (./qt-2.1.0/src/kernel/qdragobject.h:130)

class Q_EXPORT QUriDrag: public QStoredDrag {
    Q_OBJECT

public:
    QUriDrag( QStrList uris,
		QWidget * dragSource = 0, const char * name = 0 );
    QUriDrag( QWidget * dragSource = 0, const char * name = 0 );
    ~QUriDrag();

    void setFilenames( QStringList fnames );
    void setUnicodeUris( QStringList uuris );
    virtual void setUris( QStrList uris );

    static QString uriToLocalFile(const char*);
    static QCString localFileToUri(const QString&);
    static QString uriToUnicodeUri(const char*);
    static QCString unicodeUriToUri(const QString&);
    static bool canDecode( const QMimeSource* e );
    static bool decode( const QMimeSource* e, QStrList& i );
    static bool decodeToUnicodeUris( const QMimeSource* e, QStringList& i );
    static bool decodeLocalFiles( const QMimeSource* e, QStringList& i );
};


qt'QUriDrag::QUriDrag() (./qt-2.1.0/src/kernel/qdragobject.cpp:1000)

QUriDrag::QUriDrag( QStrList uris,
	    QWidget * dragSource, const char * name ) :
    QStoredDrag( "text/uri-list", dragSource, name )
{
    setUris(uris);
}

/*!
  Constructs a object to drag.  You will need to call
  setUris() before you start the drag().
*/

qt'QUriDrag::QUriDrag() (./qt-2.1.0/src/kernel/qdragobject.cpp:1011)

QUriDrag::QUriDrag( QWidget * dragSource, const char * name ) :
    QStoredDrag( "text/uri-list", dragSource, name )
{
}

/*!
  Destroys the object.
*/

qt'QUriDrag::~QUriDrag() (./qt-2.1.0/src/kernel/qdragobject.cpp:1019)

QUriDrag::~QUriDrag()
{
}

/*!
  Changes the list of \a uris to be dragged.
*/

qt'QUriDrag::setUris() (./qt-2.1.0/src/kernel/qdragobject.cpp:1026)

void QUriDrag::setUris( QStrList uris )
{
    QByteArray a;
    int c=0;
    for ( const char* s = uris.first(); s; s = uris.next() ) {
	int l = strlen(s);
	a.resize(c+l+2);
	memcpy(a.data()+c,s,l);
	memcpy(a.data()+c+l,"\r\n",2);
	c+=l+2;
    }
    setEncodedData(a);
}


/*!
  Returns TRUE if decode() would be able to decode \a e.
*/

qt'QUriDrag::canDecode() (./qt-2.1.0/src/kernel/qdragobject.cpp:1044)

bool QUriDrag::canDecode( const QMimeSource* e )
{
    return e->provides( "text/uri-list" );
}

/*!
  Decodes URIs from \a e, placing the result in \a l (which is first cleared).

  Returns TRUE if the event contained a valid list of URIs.
*/

qt'QUriDrag::decode() (./qt-2.1.0/src/kernel/qdragobject.cpp:1054)

bool QUriDrag::decode( const QMimeSource* e, QStrList& l )
{
    QByteArray payload = e->encodedData( "text/uri-list" );
    if ( payload.size() ) {
	l.clear();
	l.setAutoDelete(TRUE);
	uint c=0;
	char* d = payload.data();
	while (c < payload.size() && d[c]) {
	    uint f = c;
	    // Find line end
	    while (c < payload.size() && d[c] && d[c]!='\r'
		    && d[c] != '\n')
		c++;
	    QCString s(d+f,c-f+1);
	    if ( s[0] != '#' ) // non-comment?
		l.append( s );
	    // Skip junk
	    while (c < payload.size() && d[c] &&
		    (d[c]=='\n' || d[c]=='\r'))
		c++;
	}
	return TRUE;
    }
    return FALSE;
}

static

qt'QUriDrag::setFilenames() (./qt-2.1.0/src/kernel/qdragobject.cpp:1093)

void QUriDrag::setFilenames( QStringList fnames )
{
    QStrList uris;
    for (QStringList::Iterator i = fnames.begin();
	    i != fnames.end(); ++i )
	uris.append(localFileToUri(*i));
    setUris(uris);
}

/*!
  Sets the URIs to be the
  Unicode URIs (only useful for
  displaying to humans) \a uuris.

  \sa localFileToUri(), setUris()
*/

qt'QUriDrag::setUnicodeUris() (./qt-2.1.0/src/kernel/qdragobject.cpp:1109)

void QUriDrag::setUnicodeUris( QStringList uuris )
{
    QStrList uris;
    for (QStringList::Iterator i = uuris.begin();
	    i != uuris.end(); ++i )
	uris.append(unicodeUriToUri(*i));
    setUris(uris);
}

/*!
  Returns the URI equivalent to the Unicode URI (only useful for
  displaying to humans).
  \a uuri.

  \sa uriToLocalFile()
*/

qt'QUriDrag::unicodeUriToUri() (./qt-2.1.0/src/kernel/qdragobject.cpp:1125)

QCString QUriDrag::unicodeUriToUri(const QString& uuri)
{
    QCString utf8 = uuri.utf8();
    QCString escutf8;
    int n = utf8.length();
    for (int i=0; i<n; i++) {
	if ( utf8[i] >= 'a' && utf8[i] <= 'z'
	  || utf8[i] == '/'
	  || utf8[i] >= '0' && utf8[i] <= '9'
	  || utf8[i] >= 'A' && utf8[i] <= 'Z'

	  || utf8[i] == '-' || utf8[i] == '_'
	  || utf8[i] == '.' || utf8[i] == '!'
	  || utf8[i] == '~' || utf8[i] == '*'
	  || utf8[i] == '(' || utf8[i] == ')'
	  || utf8[i] == '\''

	  // Allow this through, so that all URI-references work.
	  || utf8[i] == '#'

	  || utf8[i] == ';'
	  || utf8[i] == '?' || utf8[i] == ':'
	  || utf8[i] == '@' || utf8[i] == '&'
	  || utf8[i] == '=' || utf8[i] == '+'
	  || utf8[i] == '$' || utf8[i] == ',' )
	{
	    escutf8 += utf8[i];
	} else {
	    // Everything else is escaped as %HH
	    QCString s(4);
	    s.sprintf("%%%02x",(uchar)utf8[i]);
	    escutf8 += s;
	}
    }
    return escutf8;
}

/*!
  Returns the URI equivalent to the absolute
  local file \a filename.

  \sa uriToLocalFile()
*/

qt'QUriDrag::localFileToUri() (./qt-2.1.0/src/kernel/qdragobject.cpp:1168)

QCString QUriDrag::localFileToUri(const QString& filename)
{
    QString r = filename;
#ifdef _WS_WIN_
    // Slosh -> Slash
    int slosh;
    while ( (slosh=r.find('\\')) >= 0 ) {
	r[slosh] = '/';
    }
    // Drive
    if ( r[0] != '/' ) {
	int colon = r.find(':');
	if ( colon >= 0 ) {
	    r[colon] = '|';
	    if ( r[colon+1] != '/' )
		r.insert(colon+1,'/');
	}
	r.insert(0,'/');
    }
#endif
    return unicodeUriToUri(QString("file://" + r));
}

/*!
  Returns the Unicode URI (only useful for
  displaying to humans) equivalent to \a uri.

  \sa localFileToUri()
*/

qt'QUriDrag::uriToUnicodeUri() (./qt-2.1.0/src/kernel/qdragobject.cpp:1197)

QString QUriDrag::uriToUnicodeUri(const char* uri)
{
    QCString utf8;

    while (*uri) {
	switch (*uri) {
	  case '%': {
		uint ch = uri[1];
		if ( ch && uri[2] ) {
		    ch = htod(ch)*16 + htod(uri[2]);
		    utf8 += char(ch);
		    uri += 2;
		}
	    }
	    break;
	  default:
	    utf8 += *uri;
	}
	++uri;
    }

    return QString::fromUtf8(utf8);
}

/*!
  Returns the name of a local file equivalent to \a uri,
  or a null string if \a uri is not a local file.

  \sa localFileToUri()
*/

qt'QUriDrag::uriToLocalFile() (./qt-2.1.0/src/kernel/qdragobject.cpp:1227)

QString QUriDrag::uriToLocalFile(const char* uri)
{
    QString file;

    if ( uri && 0==qstrnicmp(uri,"file:/",6) ) {
	uri += 6;
	if ( uri[0] != '/' || uri[1] == '/' ) {
	    // It is local.
	    file = uriToUnicodeUri(uri);
	    if ( uri[1] == '/' ) {
		file.remove(0,1);
	    } else {
		file.insert(0,'/');
	    }
#ifdef _WS_WIN_
	    if ( file.length() > 2 && file[0] == '/' && file[2] == '|' ) {
		file[2] = ':';
		file.remove(0,1);
	    }
	    // Leave slash as slashes.
#endif
	}
    }

    return file;
}

/*!
  Decodes URIs from \a e, converts them to local files if they refer to
  local files, and places them in \a l (which is first cleared).

  Returns TRUE if the event contained a valid list of URIs.
  The list will be empty if no URIs were local files.
*/

qt'QUriDrag::decodeLocalFiles() (./qt-2.1.0/src/kernel/qdragobject.cpp:1261)

bool QUriDrag::decodeLocalFiles( const QMimeSource* e, QStringList& l )
{
    QStrList u;
    if ( !decode( e, u ) )
	return FALSE;

    l.clear();
    for (const char* s=u.first(); s; s=u.next()) {
	QString lf = uriToLocalFile(s);
	if ( !lf.isNull() )
	    l.append( lf );
    }
    return TRUE;
}

/*!
  Decodes URIs from \a e, converts them to Unicode URIs (only useful for
  displaying to humans),
  placing them in \a l (which is first cleared).

  Returns TRUE if the event contained a valid list of URIs.
*/

qt'QUriDrag::decodeToUnicodeUris() (./qt-2.1.0/src/kernel/qdragobject.cpp:1283)

bool QUriDrag::decodeToUnicodeUris( const QMimeSource* e, QStringList& l )
{
    QStrList u;
    if ( !decode( e, u ) )
	return FALSE;

    l.clear();
    for (const char* s=u.first(); s; s=u.next())
	l.append( uriToUnicodeUri(s) );

    return TRUE;
}


/*!
  If the source of the drag operation is a widget in this application,
  this function returns that source, otherwise 0.  The source of the
  operation is the first parameter to to drag object subclass.

  This is useful if your widget needs special behavior when dragging
  to itelf, etc.

  See QDragObject::QDragObject() and subclasses.
*/