1///////////////////////////////////////////////////////////////////////////// 2// Name: src/common/fs_filter.cpp 3// Purpose: wxFilter file system handler 4// Author: Mike Wetherell 5// Copyright: (c) 2006 Mike Wetherell 6// CVS-ID: $Id: fs_filter.cpp 42514 2006-10-27 10:47:13Z MW $ 7// Licence: wxWindows licence 8///////////////////////////////////////////////////////////////////////////// 9 10#include "wx/wxprec.h" 11 12#ifdef __BORLANDC__ 13 #pragma hdrstop 14#endif 15 16#if wxUSE_FILESYSTEM 17 18#include "wx/fs_filter.h" 19 20#ifndef WXPRECOMP 21#endif 22 23#include "wx/ptr_scpd.h" 24 25wxDEFINE_SCOPED_PTR_TYPE(wxFSFile) 26wxDEFINE_SCOPED_PTR_TYPE(wxInputStream) 27 28//---------------------------------------------------------------------------- 29// wxFilterFSHandler 30//---------------------------------------------------------------------------- 31 32bool wxFilterFSHandler::CanOpen(const wxString& location) 33{ 34 return wxFilterClassFactory::Find(GetProtocol(location)) != NULL; 35} 36 37wxFSFile* wxFilterFSHandler::OpenFile( 38 wxFileSystem& fs, 39 const wxString& location) 40{ 41 wxString right = GetRightLocation(location); 42 if (!right.empty()) 43 return NULL; 44 45 wxString protocol = GetProtocol(location); 46 const wxFilterClassFactory *factory = wxFilterClassFactory::Find(protocol); 47 if (!factory) 48 return NULL; 49 50 wxString left = GetLeftLocation(location); 51 wxFSFilePtr leftFile(fs.OpenFile(left)); 52 if (!leftFile.get()) 53 return NULL; 54 55 wxInputStreamPtr leftStream(leftFile->DetachStream()); 56 if (!leftStream.get() || !leftStream->IsOk()) 57 return NULL; 58 59 wxInputStreamPtr stream(factory->NewStream(leftStream.release())); 60 61 // The way compressed streams are supposed to be served is e.g.: 62 // Content-type: application/postscript 63 // Content-encoding: gzip 64 // So the mime type should be just the mime type of the lhs. However check 65 // whether the mime type is that of this compression format (e.g. 66 // application/gzip). If so pop any extension and try GetMimeTypeFromExt, 67 // e.g. if it were '.ps.gz' pop the '.gz' and try looking up '.ps' 68 wxString mime = leftFile->GetMimeType(); 69 if (factory->CanHandle(mime, wxSTREAM_MIMETYPE)) 70 mime = GetMimeTypeFromExt(factory->PopExtension(left)); 71 72 return new wxFSFile(stream.release(), 73 left + wxT("#") + protocol + wxT(":") + right, 74 mime, 75 GetAnchor(location) 76#if wxUSE_DATETIME 77 , leftFile->GetModificationTime() 78#endif // wxUSE_DATETIME 79 ); 80} 81 82wxString wxFilterFSHandler::FindFirst(const wxString& WXUNUSED(spec), int WXUNUSED(flags)) 83{ 84 return wxEmptyString; 85} 86 87wxString wxFilterFSHandler::FindNext() 88{ 89 return wxEmptyString; 90} 91 92#endif //wxUSE_FILESYSTEM 93