]> git.saurik.com Git - wxWidgets.git/blame - utils/wxMMedia/mmfile.cpp
fixed somebody's poorly done StreamSize-->GetSize transition
[wxWidgets.git] / utils / wxMMedia / mmfile.cpp
CommitLineData
4d6306eb
GL
1////////////////////////////////////////////////////////////////////////////////
2// Name: mmfile.cpp
3// Purpose: wxMMedia
4// Author: Guilhem Lavaux
5// Created: 1997
6// Updated: 1998
7// Copyright: (C) 1997, 1998, Guilhem Lavaux
8// License: wxWindows license
9////////////////////////////////////////////////////////////////////////////////
10#ifdef __GNUG__
11#pragma implementation
12#endif
13#ifdef WX_PRECOMP
14#include "wx_prec.h"
15#else
16#include "wx/wx.h"
17#endif
18#include <wx/stream.h>
926c550d 19#include <wx/wfstream.h>
4d6306eb
GL
20
21#include "mmfile.h"
22
23#ifdef __BORLANDC__
24#pragma hdrstop
25#endif
26
27wxMMediaFile::wxMMediaFile()
28 : m_istream(NULL), m_i_temp(NULL), m_ostream(NULL), m_o_temp(NULL),
29 m_tmpfname((char *)NULL), m_mfname((char *)NULL),
30 m_seekable(FALSE)
31{
32}
33
34wxMMediaFile::wxMMediaFile(wxOutputStream& os, bool seekable)
35 : m_istream(NULL), m_i_temp(NULL), m_ostream(&os), m_o_temp(NULL),
36 m_tmpfname((char *)NULL), m_mfname((char *)NULL),
37 m_seekable(seekable)
38{
39}
40
41wxMMediaFile::wxMMediaFile(wxInputStream& is, bool preload, bool seekable)
42 : m_istream(&is), m_i_temp(NULL), m_ostream(NULL), m_o_temp(NULL),
43 m_tmpfname((char *)NULL), m_mfname((char *)NULL),
44 m_seekable(seekable)
45{
4d6306eb 46 if (preload) {
7f42cff1 47 wxStreamBuffer *streamb = new wxStreamBuffer(wxStreamBuffer::read_write);
4d6306eb 48
7f42cff1
GL
49 streamb->Fixed(FALSE);
50 streamb->Flushable(FALSE);
51
52 m_o_temp = new wxOutputStream(streamb);
53 m_i_temp = new wxInputStream(streamb);
4d6306eb
GL
54
55 m_o_temp->Write(is);
7f42cff1 56 streamb->ResetBuffer();
4d6306eb 57 }
4d6306eb
GL
58}
59
60wxMMediaFile::wxMMediaFile(const wxString& fname)
61 : m_istream(NULL), m_i_temp(NULL), m_ostream(NULL), m_o_temp(NULL),
62 m_tmpfname((char *)NULL), m_mfname(fname),
63 m_seekable(TRUE)
64{
65 wxFileStream *s = new wxFileStream(fname);
66
67 m_mfname = fname;
68 m_istream = s;
69 m_ostream = s;
70}
71
72void wxMMediaFile::SetFile(wxInputStream& str, bool preload, bool seekable)
73{
74 CleanUpPrevious();
75 m_istream = &str;
76 m_ostream = NULL;
77 m_seekable = seekable;
78
4d6306eb 79 if (preload) {
7f42cff1
GL
80 wxStreamBuffer *streamb = new wxStreamBuffer(wxStreamBuffer::read_write);
81
82 streamb->Fixed(FALSE);
83 streamb->Flushable(FALSE);
4d6306eb 84
7f42cff1
GL
85 m_o_temp = new wxOutputStream(streamb);
86 m_i_temp = new wxInputStream(streamb);
4d6306eb 87
9fc0fe37 88 m_o_temp->Write(str);
7f42cff1 89 streamb->ResetBuffer();
4d6306eb 90 }
4d6306eb
GL
91}
92
93void wxMMediaFile::SetFile(wxOutputStream& str, bool seekable)
94{
95 CleanUpPrevious();
96 m_ostream = &str;
97 m_istream = NULL;
98 m_seekable = seekable;
99}
100
101void wxMMediaFile::SetFile(const wxString& fname)
102{
103 CleanUpPrevious();
104
105 m_mfname = fname;
106 wxFileStream *f = new wxFileStream(fname);
107
108 SetFile(*f, FALSE, TRUE);
109}
110
111void wxMMediaFile::CleanUpPrevious()
112{
113 if (m_i_temp) {
114 m_i_temp->SeekI(0);
115
116 if (m_ostream)
117 m_ostream->Write(*m_i_temp);
118
9fc0fe37 119 delete (m_i_temp->InputStreamBuffer());
7f42cff1
GL
120 delete m_i_temp;
121 delete m_o_temp;
4d6306eb
GL
122
123 if (m_tmpfname)
124 wxRemoveFile(m_tmpfname);
125 }
126
127 if (!m_mfname.IsNull() && m_mfname != "")
128 delete m_istream;
129
130 m_i_temp = NULL;
131 m_o_temp = NULL;
132 m_istream = NULL;
133 m_ostream = NULL;
134}
135
136wxMMediaFile::~wxMMediaFile()
137{
138 CleanUpPrevious();
139}
140
141wxMMtime wxMMediaFile::GetLength()
142{
143 wxMMtime mm_time = {-1, 0, 0};
144 return mm_time;
145}
146
147wxMMtime wxMMediaFile::GetPosition()
148{
149 wxMMtime mm_time = {0, 0, 0};
150 return mm_time;
151}
152
153wxInputStream *wxMMediaFile::GetIRawData()
154{
155 if (!m_istream)
156 return NULL;
157
158 if (!m_seekable && !m_i_temp)
159 CacheIO();
160
161 return (m_i_temp) ? m_i_temp : m_istream;
162}
163
164wxOutputStream *wxMMediaFile::GetORawData()
165{
166 if (!m_ostream)
167 return NULL;
168
169 if (!m_seekable && !m_i_temp)
170 CacheIO();
171
172 return (m_o_temp) ? m_o_temp : m_ostream;
173}
174
175wxString wxMMediaFile::GetCurrentFile()
176{
177 if (!m_istream && !m_ostream)
178 return wxString((char *)NULL);
179
180 if (!m_mfname && !m_i_temp)
181 CacheIO();
182
183 return (!m_tmpfname.IsEmpty()) ? m_tmpfname : m_mfname;
184}
185
186void wxMMediaFile::CacheIO()
187{
188 if ((!m_istream && !m_ostream) || m_i_temp)
189 return;
190
191 m_tmpfname = wxGetTempFileName("mmd");
192
193 wxFileStream *tmpstream = new wxFileStream(m_tmpfname);
194 m_i_temp = tmpstream;
195 m_o_temp = tmpstream;
196
197 if (m_istream)
198 tmpstream->wxOutputStream::Write(*m_istream);
199}