+ m_filenames.Empty();
+
+ // 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;
+ }
+
+ // It would probably be nicer to use a GTK or Glib
+ // function to unescape the 8-bit strings pointed to
+ // by buf, but this does the same in wx code.
+ wxString filename_unicode = wxURI::Unescape(filename.c_str() + lenPrefix);
+ wxCharBuffer filename_8bit = wxConvISO8859_1.cWX2MB( filename_unicode );
+ filename_unicode = wxConvFileName->cMB2WX( filename_8bit );
+ AddFile( filename_unicode );
+ filename.Empty();
+ }
+ else if ( !filename.empty() )
+ {
+ wxLogDebug(_T("Unsupported URI \"%s\" in wxFileDataObject"),
+ filename.c_str());
+ }
+
+ if ( !*p )
+ break;
+
+ // skip '\r'
+ p++;
+ }
+ else
+ {
+ // The string is in ISO-8859-1 according to XDND spec
+ filename += *p;
+ }
+ }
+
+ return true;