]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/fs_mem.cpp
fixed wxXmlResource::Load's detection of filenames to be done as early as possible
[wxWidgets.git] / src / common / fs_mem.cpp
index 41cc0944343b84228d0151a20c0e8d0fbcd66bf0..9cd5628f86cee4063583a3b131a1a8d66b11f36c 100644 (file)
@@ -70,7 +70,7 @@ private:
 #endif // wxUSE_DATETIME
     }
 
 #endif // wxUSE_DATETIME
     }
 
-    DECLARE_NO_COPY_CLASS(wxMemoryFSFile)
+    wxDECLARE_NO_COPY_CLASS(wxMemoryFSFile);
 };
 
 #if wxUSE_BASE
 };
 
 #if wxUSE_BASE
@@ -122,19 +122,51 @@ wxFSFile * wxMemoryFSHandlerBase::OpenFile(wxFileSystem& WXUNUSED(fs),
                );
 }
 
                );
 }
 
-wxString wxMemoryFSHandlerBase::FindFirst(const wxString& WXUNUSED(spec),
-                                      int WXUNUSED(flags))
+wxString wxMemoryFSHandlerBase::FindFirst(const wxString& url, int flags)
 {
 {
-    wxFAIL_MSG(wxT("wxMemoryFSHandlerBase::FindFirst not implemented"));
+    if ( (flags & wxDIR) && !(flags & wxFILE) )
+    {
+        // we only store files, not directories, so we don't risk finding
+        // anything
+        return wxString();
+    }
+
+    const wxString spec = GetRightLocation(url);
+    if ( spec.find_first_of("?*") == wxString::npos )
+    {
+        // simple case: there are no wildcard characters so we can return
+        // either 0 or 1 results and we can find the potential match quickly
+        return m_Hash.count(spec) ? url : wxString();
+    }
+    //else: deal with wildcards in FindNext()
+
+    m_findArgument = spec;
+    m_findIter = m_Hash.begin();
 
 
-    return wxEmptyString;
+    return FindNext();
 }
 
 wxString wxMemoryFSHandlerBase::FindNext()
 {
 }
 
 wxString wxMemoryFSHandlerBase::FindNext()
 {
-    wxFAIL_MSG(wxT("wxMemoryFSHandlerBase::FindNext not implemented"));
+    // m_findArgument is used to indicate that search is in progress, we reset
+    // it to empty string after iterating over all elements
+    while ( !m_findArgument.empty() )
+    {
+        // test for the match before (possibly) clearing m_findArgument below
+        const bool found = m_findIter->first.Matches(m_findArgument);
+
+        // advance m_findIter first as we need to do it anyhow, whether it
+        // matches or not
+        const wxMemoryFSHash::const_iterator current = m_findIter;
+
+        if ( ++m_findIter == m_Hash.end() )
+            m_findArgument.clear();
+
+        if ( found )
+            return "memory:" + current->first;
+    }
 
 
-    return wxEmptyString;
+    return wxString();
 }
 
 bool wxMemoryFSHandlerBase::CheckDoesntExist(const wxString& filename)
 }
 
 bool wxMemoryFSHandlerBase::CheckDoesntExist(const wxString& filename)