/////////////////////////////////////////////////////////////////////////////
-// Name: archive.h
+// Name: wx/archive.h
// Purpose: Streams for archive formats
// Author: Mike Wetherell
// RCS-ID: $Id$
#ifndef _WX_ARCHIVE_H__
#define _WX_ARCHIVE_H__
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma interface "archive.h"
-#endif
-
#include "wx/defs.h"
-#if wxUSE_ZLIB && wxUSE_STREAMS && wxUSE_ZIPSTREAM
+#if wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS
#include "wx/stream.h"
#include "wx/filename.h"
virtual void SetIsReadOnly(bool isReadOnly = true) = 0;
virtual void SetName(const wxString& name,
wxPathFormat format = wxPATH_NATIVE) = 0;
-
+
wxArchiveEntry *Clone() const { return DoClone(); }
void SetNotifier(wxArchiveNotifier& notifier);
protected:
wxArchiveEntry() : m_notifier(NULL) { }
+ wxArchiveEntry(const wxArchiveEntry& e) : wxObject(e), m_notifier(NULL) { }
virtual void SetOffset(wxFileOffset offset) = 0;
virtual wxArchiveEntry* DoClone() const = 0;
typedef wxArchiveEntry entry_type;
virtual ~wxArchiveInputStream() { }
-
+
virtual bool OpenEntry(wxArchiveEntry& entry) = 0;
virtual bool CloseEntry() = 0;
wxArchiveEntry *GetNextEntry() { return DoGetNextEntry(); }
virtual char Peek() { return wxInputStream::Peek(); }
-
+
protected:
wxArchiveInputStream(wxInputStream& stream, wxMBConv& conv);
+ wxArchiveInputStream(wxInputStream *stream, wxMBConv& conv);
virtual wxArchiveEntry *DoGetNextEntry() = 0;
//
// Only one entry can be open for output at a time; another call to
// PutNextEntry closes the current entry and begins the next.
-//
+//
// The overload 'bool PutNextEntry(wxArchiveEntry *entry)' takes ownership
// of the entry object.
protected:
wxArchiveOutputStream(wxOutputStream& stream, wxMBConv& conv);
+ wxArchiveOutputStream(wxOutputStream *stream, wxMBConv& conv);
wxMBConv& GetConv() const { return m_conv; }
};
-/////////////////////////////////////////////////////////////////////////////
-// wxArchiveClassFactory
-//
-// A wxArchiveClassFactory instance for a particular archive type allows
-// the creation of the other classes that may be needed.
-
-class WXDLLIMPEXP_BASE wxArchiveClassFactory : public wxObject
-{
-public:
- virtual ~wxArchiveClassFactory() { }
-
- wxArchiveEntry *NewEntry() const
- { return DoNewEntry(); }
- wxArchiveInputStream *NewStream(wxInputStream& stream) const
- { return DoNewStream(stream); }
- wxArchiveOutputStream *NewStream(wxOutputStream& stream) const
- { return DoNewStream(stream); }
-
- virtual wxString GetInternalName(
- const wxString& name,
- wxPathFormat format = wxPATH_NATIVE) const = 0;
-
- void SetConv(wxMBConv& conv) { m_pConv = &conv; }
- wxMBConv& GetConv() const { return *m_pConv; }
-
-protected:
- virtual wxArchiveEntry *DoNewEntry() const = 0;
- virtual wxArchiveInputStream *DoNewStream(wxInputStream& stream) const = 0;
- virtual wxArchiveOutputStream *DoNewStream(wxOutputStream& stream) const = 0;
-
- wxArchiveClassFactory() : m_pConv(&wxConvLocal) { }
- wxArchiveClassFactory& operator=(const wxArchiveClassFactory& WXUNUSED(f))
- { return *this; }
-
-private:
- wxMBConv *m_pConv;
-
- DECLARE_ABSTRACT_CLASS(wxArchiveClassFactory)
-};
-
-
/////////////////////////////////////////////////////////////////////////////
// wxArchiveIterator
//
#include <iterator>
#include <utility>
-template <class X, class Y>
-void WXDLLIMPEXP_BASE _wxSetArchiveIteratorValue(
+template <class X, class Y> inline
+void _wxSetArchiveIteratorValue(
X& val, Y entry, void *WXUNUSED(d))
{
val = X(entry);
}
-template <class X, class Y, class Z>
-void WXDLLIMPEXP_BASE _wxSetArchiveIteratorValue(
+template <class X, class Y, class Z> inline
+void _wxSetArchiveIteratorValue(
std::pair<X, Y>& val, Z entry, Z WXUNUSED(d))
{
val = std::make_pair(X(entry->GetInternalName()), Y(entry));
#else
template <class Arc, class T = typename Arc::entry_type*>
#endif
-class WXDLLIMPEXP_BASE wxArchiveIterator
+class wxArchiveIterator
{
public:
typedef std::input_iterator_tag iterator_category;
if (m_rep)
m_rep->AddRef();
}
-
+
~wxArchiveIterator() {
if (m_rep)
m_rep->UnRef();
if (it.m_rep)
it.m_rep.AddRef();
if (m_rep)
- m_rep.UnRef();
+ this->m_rep.UnRef();
m_rep = it.m_rep;
return *this;
}
return it;
}
- bool operator ==(const wxArchiveIterator& j) {
- return (*this).m_rep == j.m_rep;
+ bool operator ==(const wxArchiveIterator& j) const {
+ return m_rep == j.m_rep;
}
- bool operator !=(const wxArchiveIterator& j) {
+ bool operator !=(const wxArchiveIterator& j) const {
return !(*this == j);
}
typename Arc::entry_type* m_entry;
T m_value;
int m_ref;
-
+
public:
Rep(Arc& arc, typename Arc::entry_type* entry)
: m_arc(arc), m_entry(entry), m_value(), m_ref(1) { }
~Rep()
{ delete m_entry; }
-
+
void AddRef() {
m_ref++;
}
return NULL;
}
if (m_ref > 1) {
- m_ref--;
+ m_ref--;
return new Rep(m_arc, entry);
}
delete m_entry;
#endif // wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR
-#endif // wxUSE_STREAMS
+
+/////////////////////////////////////////////////////////////////////////////
+// wxArchiveClassFactory
+//
+// A wxArchiveClassFactory instance for a particular archive type allows
+// the creation of the other classes that may be needed.
+
+void WXDLLIMPEXP_BASE wxUseArchiveClasses();
+
+class WXDLLIMPEXP_BASE wxArchiveClassFactory : public wxFilterClassFactoryBase
+{
+public:
+ typedef wxArchiveEntry entry_type;
+ typedef wxArchiveInputStream instream_type;
+ typedef wxArchiveOutputStream outstream_type;
+ typedef wxArchiveNotifier notifier_type;
+#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR
+ typedef wxArchiveIter iter_type;
+ typedef wxArchivePairIter pairiter_type;
+#endif
+
+ virtual ~wxArchiveClassFactory() { }
+
+ wxArchiveEntry *NewEntry() const
+ { return DoNewEntry(); }
+ wxArchiveInputStream *NewStream(wxInputStream& stream) const
+ { return DoNewStream(stream); }
+ wxArchiveOutputStream *NewStream(wxOutputStream& stream) const
+ { return DoNewStream(stream); }
+ wxArchiveInputStream *NewStream(wxInputStream *stream) const
+ { return DoNewStream(stream); }
+ wxArchiveOutputStream *NewStream(wxOutputStream *stream) const
+ { return DoNewStream(stream); }
+
+ virtual wxString GetInternalName(
+ const wxString& name,
+ wxPathFormat format = wxPATH_NATIVE) const = 0;
+
+ // FIXME-UTF8: remove these from this file, they are used for ANSI
+ // build only
+ void SetConv(wxMBConv& conv) { m_pConv = &conv; }
+ wxMBConv& GetConv() const
+ { if (m_pConv) return *m_pConv; else return wxConvLocal; }
+
+ static const wxArchiveClassFactory *Find(const wxString& protocol,
+ wxStreamProtocolType type
+ = wxSTREAM_PROTOCOL);
+
+ static const wxArchiveClassFactory *GetFirst();
+ const wxArchiveClassFactory *GetNext() const { return m_next; }
+
+ void PushFront() { Remove(); m_next = sm_first; sm_first = this; }
+ void Remove();
+
+protected:
+ // old compilers don't support covarient returns, so 'Do' methods are
+ // used to simulate them
+ virtual wxArchiveEntry *DoNewEntry() const = 0;
+ virtual wxArchiveInputStream *DoNewStream(wxInputStream& stream) const = 0;
+ virtual wxArchiveOutputStream *DoNewStream(wxOutputStream& stream) const = 0;
+ virtual wxArchiveInputStream *DoNewStream(wxInputStream *stream) const = 0;
+ virtual wxArchiveOutputStream *DoNewStream(wxOutputStream *stream) const = 0;
+
+ wxArchiveClassFactory() : m_pConv(NULL), m_next(this) { }
+ wxArchiveClassFactory& operator=(const wxArchiveClassFactory& WXUNUSED(f))
+ { return *this; }
+
+private:
+ wxMBConv *m_pConv;
+ static wxArchiveClassFactory *sm_first;
+ wxArchiveClassFactory *m_next;
+
+ DECLARE_ABSTRACT_CLASS(wxArchiveClassFactory)
+};
+
+#endif // wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS
#endif // _WX_ARCHIVE_H__