+ // we get data in the text/uri-list format, i.e. as a sequence of URIs
+ // (filenames prefixed by "file:") delimited by "\r\n"
+ wxString filename;
+ for ( const char *p = (const char *)buf; ; p++ )
+ {
+ // some broken programs (testdnd GTK+ sample!) omit the trailing
+ // "\r\n", so check for '\0' explicitly here instead of doing it in
+ // the loop statement to account for it
+ if ( (*p == '\r' && *(p+1) == '\n') || !*p )
+ {
+ size_t lenPrefix = 5; // strlen("file:")
+ if ( filename.Left(lenPrefix).MakeLower() == _T("file:") )
+ {
+ // sometimes the syntax is "file:filename", sometimes it's
+ // URL-like: "file://filename" - deal with both
+ if ( filename[lenPrefix] == _T('/') &&
+ filename[lenPrefix + 1] == _T('/') )
+ {
+ // skip the slashes
+ lenPrefix += 2;
+ }
+
+ AddFile(wxURI::Unescape(filename.c_str() + lenPrefix));
+ filename.Empty();
+ }
+ else if ( !filename.empty() )
+ {
+ wxLogDebug(_T("Unsupported URI \"%s\" in wxFileDataObject"),
+ filename.c_str());
+ }
+
+ if ( !*p )
+ break;
+
+ // skip '\r'
+ p++;
+ }
+ else
+ {
+ filename += *p;
+ }
+ }