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