virtual wxFilterOutputStream *NewStream(wxOutputStream *stream) const = 0;
wxString GetProtocol() const { return wxString(*GetProtocols()); }
+ wxString PopExtension(const wxString& location) const;
virtual const wxChar * const *GetProtocols(wxStreamProtocolType type
= wxSTREAM_PROTOCOL) const = 0;
wxFilterClassFactory& operator=(const wxFilterClassFactory&)
{ return *this; }
+ wxString::size_type FindExtension(const wxChar *location) const;
+
private:
static wxFilterClassFactory *sm_first;
wxFilterClassFactory *m_next;
wxFilterClassFactory *wxFilterClassFactory::sm_first = NULL;
-bool wxFilterClassFactory::CanHandle(const wxChar *protocol,
- wxStreamProtocolType type) const
+wxString wxFilterClassFactory::PopExtension(const wxString& location) const
{
- if (type == wxSTREAM_FILEEXTENSION)
- {
- size_t len = wxStrlen(protocol);
+ return location.substr(0, FindExtension(location));
+}
- for (const wxChar * const *p = GetProtocols(type); p && *p; p++)
- {
- size_t l = wxStrlen(*p);
+wxString::size_type wxFilterClassFactory::FindExtension(const wxChar *location) const
+{
+ size_t len = wxStrlen(location);
- if (l <= len && wxStrcmp(*p, protocol + len - l) == 0)
- return true;
- }
+ for (const wxChar *const *p = GetProtocols(wxSTREAM_FILEEXTENSION);
+ p && *p;
+ p++)
+ {
+ size_t l = wxStrlen(*p);
+
+ if (l <= len && wxStrcmp(*p, location + len - l) == 0)
+ return len - l;
}
+
+ return wxString::npos;
+}
+
+bool wxFilterClassFactory::CanHandle(const wxChar *protocol,
+ wxStreamProtocolType type) const
+{
+ if (type == wxSTREAM_FILEEXTENSION)
+ return FindExtension(protocol) != wxString::npos;
else
- {
- for (const wxChar * const *p = GetProtocols(type); p && *p; p++)
+ for (const wxChar *const *p = GetProtocols(type); p && *p; p++)
if (wxStrcmp(*p, protocol) == 0)
return true;
- }
return false;
}