]> git.saurik.com Git - wxWidgets.git/blame - include/wx/archive.h
using Run of base class
[wxWidgets.git] / include / wx / archive.h
CommitLineData
00375592 1/////////////////////////////////////////////////////////////////////////////
ce7208d4 2// Name: wx/archive.h
00375592
VZ
3// Purpose: Streams for archive formats
4// Author: Mike Wetherell
00375592
VZ
5// Copyright: (c) 2004 Mike Wetherell
6// Licence: wxWindows licence
7/////////////////////////////////////////////////////////////////////////////
8
9#ifndef _WX_ARCHIVE_H__
10#define _WX_ARCHIVE_H__
11
00375592
VZ
12#include "wx/defs.h"
13
9e8e867f 14#if wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS
00375592
VZ
15
16#include "wx/stream.h"
17#include "wx/filename.h"
18
19
20/////////////////////////////////////////////////////////////////////////////
21// wxArchiveNotifier
22
23class WXDLLIMPEXP_BASE wxArchiveNotifier
24{
25public:
26 virtual ~wxArchiveNotifier() { }
27
28 virtual void OnEntryUpdated(class wxArchiveEntry& entry) = 0;
29};
30
31
32/////////////////////////////////////////////////////////////////////////////
33// wxArchiveEntry
34//
35// Holds an entry's meta data, such as filename and timestamp.
36
37class WXDLLIMPEXP_BASE wxArchiveEntry : public wxObject
38{
39public:
40 virtual ~wxArchiveEntry() { }
41
42 virtual wxDateTime GetDateTime() const = 0;
43 virtual wxFileOffset GetSize() const = 0;
44 virtual wxFileOffset GetOffset() const = 0;
45 virtual bool IsDir() const = 0;
46 virtual bool IsReadOnly() const = 0;
47 virtual wxString GetInternalName() const = 0;
48 virtual wxPathFormat GetInternalFormat() const = 0;
49 virtual wxString GetName(wxPathFormat format = wxPATH_NATIVE) const = 0;
50
51 virtual void SetDateTime(const wxDateTime& dt) = 0;
52 virtual void SetSize(wxFileOffset size) = 0;
53 virtual void SetIsDir(bool isDir = true) = 0;
54 virtual void SetIsReadOnly(bool isReadOnly = true) = 0;
55 virtual void SetName(const wxString& name,
56 wxPathFormat format = wxPATH_NATIVE) = 0;
ce7208d4 57
00375592
VZ
58 wxArchiveEntry *Clone() const { return DoClone(); }
59
60 void SetNotifier(wxArchiveNotifier& notifier);
61 virtual void UnsetNotifier() { m_notifier = NULL; }
62
63protected:
64 wxArchiveEntry() : m_notifier(NULL) { }
f44eaed6 65 wxArchiveEntry(const wxArchiveEntry& e) : wxObject(e), m_notifier(NULL) { }
00375592
VZ
66
67 virtual void SetOffset(wxFileOffset offset) = 0;
68 virtual wxArchiveEntry* DoClone() const = 0;
69
70 wxArchiveNotifier *GetNotifier() const { return m_notifier; }
71 wxArchiveEntry& operator=(const wxArchiveEntry& entry);
72
73private:
74 wxArchiveNotifier *m_notifier;
75
76 DECLARE_ABSTRACT_CLASS(wxArchiveEntry)
77};
78
79
80/////////////////////////////////////////////////////////////////////////////
81// wxArchiveInputStream
82//
83// GetNextEntry() returns an wxArchiveEntry object containing the meta-data
84// for the next entry in the archive (and gives away ownership). Reading from
85// the wxArchiveInputStream then returns the entry's data. Eof() becomes true
86// after an attempt has been made to read past the end of the entry's data.
87//
88// When there are no more entries, GetNextEntry() returns NULL and sets Eof().
89
90class WXDLLIMPEXP_BASE wxArchiveInputStream : public wxFilterInputStream
91{
92public:
93 typedef wxArchiveEntry entry_type;
94
95 virtual ~wxArchiveInputStream() { }
ce7208d4 96
00375592
VZ
97 virtual bool OpenEntry(wxArchiveEntry& entry) = 0;
98 virtual bool CloseEntry() = 0;
99
100 wxArchiveEntry *GetNextEntry() { return DoGetNextEntry(); }
101
102 virtual char Peek() { return wxInputStream::Peek(); }
ce7208d4 103
00375592
VZ
104protected:
105 wxArchiveInputStream(wxInputStream& stream, wxMBConv& conv);
1b79dad4 106 wxArchiveInputStream(wxInputStream *stream, wxMBConv& conv);
00375592
VZ
107
108 virtual wxArchiveEntry *DoGetNextEntry() = 0;
109
110 wxMBConv& GetConv() const { return m_conv; }
111
112private:
113 wxMBConv& m_conv;
114};
115
116
117/////////////////////////////////////////////////////////////////////////////
118// wxArchiveOutputStream
119//
120// PutNextEntry is used to create a new entry in the output archive, then
121// the entry's data is written to the wxArchiveOutputStream.
122//
123// Only one entry can be open for output at a time; another call to
124// PutNextEntry closes the current entry and begins the next.
ce7208d4 125//
00375592
VZ
126// The overload 'bool PutNextEntry(wxArchiveEntry *entry)' takes ownership
127// of the entry object.
128
129class WXDLLIMPEXP_BASE wxArchiveOutputStream : public wxFilterOutputStream
130{
131public:
132 virtual ~wxArchiveOutputStream() { }
133
134 virtual bool PutNextEntry(wxArchiveEntry *entry) = 0;
135
136 virtual bool PutNextEntry(const wxString& name,
137 const wxDateTime& dt = wxDateTime::Now(),
138 wxFileOffset size = wxInvalidOffset) = 0;
139
140 virtual bool PutNextDirEntry(const wxString& name,
141 const wxDateTime& dt = wxDateTime::Now()) = 0;
142
143 virtual bool CopyEntry(wxArchiveEntry *entry,
144 wxArchiveInputStream& stream) = 0;
145
146 virtual bool CopyArchiveMetaData(wxArchiveInputStream& stream) = 0;
147
148 virtual bool CloseEntry() = 0;
00375592
VZ
149
150protected:
151 wxArchiveOutputStream(wxOutputStream& stream, wxMBConv& conv);
1b79dad4 152 wxArchiveOutputStream(wxOutputStream *stream, wxMBConv& conv);
00375592
VZ
153
154 wxMBConv& GetConv() const { return m_conv; }
155
156private:
157 wxMBConv& m_conv;
158};
159
160
00375592
VZ
161/////////////////////////////////////////////////////////////////////////////
162// wxArchiveIterator
163//
164// An input iterator that can be used to transfer an archive's catalog to
165// a container.
166
167#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR
168#include <iterator>
169#include <utility>
170
f44eaed6
RN
171template <class X, class Y> inline
172void _wxSetArchiveIteratorValue(
00375592
VZ
173 X& val, Y entry, void *WXUNUSED(d))
174{
175 val = X(entry);
176}
f44eaed6
RN
177template <class X, class Y, class Z> inline
178void _wxSetArchiveIteratorValue(
00375592
VZ
179 std::pair<X, Y>& val, Z entry, Z WXUNUSED(d))
180{
181 val = std::make_pair(X(entry->GetInternalName()), Y(entry));
182}
183
184#if defined _MSC_VER && _MSC_VER < 1300
185template <class Arc, class T = Arc::entry_type*>
186#else
187template <class Arc, class T = typename Arc::entry_type*>
188#endif
f44eaed6 189class wxArchiveIterator
00375592
VZ
190{
191public:
192 typedef std::input_iterator_tag iterator_category;
193 typedef T value_type;
194 typedef ptrdiff_t difference_type;
195 typedef T* pointer;
196 typedef T& reference;
197
198 wxArchiveIterator() : m_rep(NULL) { }
199
200 wxArchiveIterator(Arc& arc) {
201 typename Arc::entry_type* entry = arc.GetNextEntry();
202 m_rep = entry ? new Rep(arc, entry) : NULL;
203 }
204
205 wxArchiveIterator(const wxArchiveIterator& it) : m_rep(it.m_rep) {
206 if (m_rep)
207 m_rep->AddRef();
208 }
ce7208d4 209
00375592
VZ
210 ~wxArchiveIterator() {
211 if (m_rep)
212 m_rep->UnRef();
213 }
214
215 const T& operator *() const {
216 return m_rep->GetValue();
217 }
218
219 const T* operator ->() const {
220 return &**this;
221 }
222
223 wxArchiveIterator& operator =(const wxArchiveIterator& it) {
224 if (it.m_rep)
225 it.m_rep.AddRef();
226 if (m_rep)
df04f800 227 this->m_rep.UnRef();
00375592
VZ
228 m_rep = it.m_rep;
229 return *this;
230 }
231
232 wxArchiveIterator& operator ++() {
233 m_rep = m_rep->Next();
234 return *this;
235 }
236
237 wxArchiveIterator operator ++(int) {
238 wxArchiveIterator it(*this);
239 ++(*this);
240 return it;
241 }
242
f44eaed6
RN
243 bool operator ==(const wxArchiveIterator& j) const {
244 return m_rep == j.m_rep;
00375592
VZ
245 }
246
f44eaed6 247 bool operator !=(const wxArchiveIterator& j) const {
95662a83 248 return !(*this == j);
00375592
VZ
249 }
250
251private:
252 class Rep {
253 Arc& m_arc;
254 typename Arc::entry_type* m_entry;
255 T m_value;
256 int m_ref;
ce7208d4 257
00375592
VZ
258 public:
259 Rep(Arc& arc, typename Arc::entry_type* entry)
260 : m_arc(arc), m_entry(entry), m_value(), m_ref(1) { }
261 ~Rep()
262 { delete m_entry; }
ce7208d4 263
00375592
VZ
264 void AddRef() {
265 m_ref++;
266 }
267
268 void UnRef() {
269 if (--m_ref == 0)
270 delete this;
271 }
272
273 Rep *Next() {
274 typename Arc::entry_type* entry = m_arc.GetNextEntry();
275 if (!entry) {
276 UnRef();
277 return NULL;
278 }
279 if (m_ref > 1) {
ce7208d4 280 m_ref--;
00375592
VZ
281 return new Rep(m_arc, entry);
282 }
283 delete m_entry;
284 m_entry = entry;
285 m_value = T();
286 return this;
287 }
288
289 const T& GetValue() {
290 if (m_entry) {
291 _wxSetArchiveIteratorValue(m_value, m_entry, m_entry);
292 m_entry = NULL;
293 }
294 return m_value;
295 }
296 } *m_rep;
297};
298
299typedef wxArchiveIterator<wxArchiveInputStream> wxArchiveIter;
300typedef wxArchiveIterator<wxArchiveInputStream,
301 std::pair<wxString, wxArchiveEntry*> > wxArchivePairIter;
302
303#endif // wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR
304
81f90336
MW
305
306/////////////////////////////////////////////////////////////////////////////
307// wxArchiveClassFactory
308//
309// A wxArchiveClassFactory instance for a particular archive type allows
310// the creation of the other classes that may be needed.
311
1b79dad4
MW
312void WXDLLIMPEXP_BASE wxUseArchiveClasses();
313
314class WXDLLIMPEXP_BASE wxArchiveClassFactory : public wxFilterClassFactoryBase
81f90336
MW
315{
316public:
317 typedef wxArchiveEntry entry_type;
318 typedef wxArchiveInputStream instream_type;
319 typedef wxArchiveOutputStream outstream_type;
320 typedef wxArchiveNotifier notifier_type;
321#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR
322 typedef wxArchiveIter iter_type;
323 typedef wxArchivePairIter pairiter_type;
324#endif
325
326 virtual ~wxArchiveClassFactory() { }
327
328 wxArchiveEntry *NewEntry() const
329 { return DoNewEntry(); }
330 wxArchiveInputStream *NewStream(wxInputStream& stream) const
331 { return DoNewStream(stream); }
332 wxArchiveOutputStream *NewStream(wxOutputStream& stream) const
333 { return DoNewStream(stream); }
1b79dad4
MW
334 wxArchiveInputStream *NewStream(wxInputStream *stream) const
335 { return DoNewStream(stream); }
336 wxArchiveOutputStream *NewStream(wxOutputStream *stream) const
337 { return DoNewStream(stream); }
81f90336
MW
338
339 virtual wxString GetInternalName(
340 const wxString& name,
341 wxPathFormat format = wxPATH_NATIVE) const = 0;
342
5487ff0f
VS
343 // FIXME-UTF8: remove these from this file, they are used for ANSI
344 // build only
81f90336 345 void SetConv(wxMBConv& conv) { m_pConv = &conv; }
80e62471
MW
346 wxMBConv& GetConv() const
347 { if (m_pConv) return *m_pConv; else return wxConvLocal; }
81f90336 348
86501081 349 static const wxArchiveClassFactory *Find(const wxString& protocol,
1b79dad4
MW
350 wxStreamProtocolType type
351 = wxSTREAM_PROTOCOL);
352
353 static const wxArchiveClassFactory *GetFirst();
354 const wxArchiveClassFactory *GetNext() const { return m_next; }
355
356 void PushFront() { Remove(); m_next = sm_first; sm_first = this; }
357 void Remove();
358
81f90336 359protected:
eedf3bcb
MW
360 // old compilers don't support covarient returns, so 'Do' methods are
361 // used to simulate them
81f90336
MW
362 virtual wxArchiveEntry *DoNewEntry() const = 0;
363 virtual wxArchiveInputStream *DoNewStream(wxInputStream& stream) const = 0;
364 virtual wxArchiveOutputStream *DoNewStream(wxOutputStream& stream) const = 0;
1b79dad4
MW
365 virtual wxArchiveInputStream *DoNewStream(wxInputStream *stream) const = 0;
366 virtual wxArchiveOutputStream *DoNewStream(wxOutputStream *stream) const = 0;
81f90336 367
80e62471 368 wxArchiveClassFactory() : m_pConv(NULL), m_next(this) { }
81f90336
MW
369 wxArchiveClassFactory& operator=(const wxArchiveClassFactory& WXUNUSED(f))
370 { return *this; }
371
372private:
373 wxMBConv *m_pConv;
1b79dad4
MW
374 static wxArchiveClassFactory *sm_first;
375 wxArchiveClassFactory *m_next;
81f90336
MW
376
377 DECLARE_ABSTRACT_CLASS(wxArchiveClassFactory)
378};
379
9e8e867f 380#endif // wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS
00375592
VZ
381
382#endif // _WX_ARCHIVE_H__