m_extendedHdr = NULL;
m_extendedSize = 0;
m_lasterror = m_parent_o_stream->GetLastError();
+ m_endrecWritten = false;
}
wxTarOutputStream::~wxTarOutputStream()
{
- if (m_tarsize)
- Close();
+ Close();
delete m_hdr;
delete m_hdr2;
delete [] m_extendedHdr;
bool wxTarOutputStream::Close()
{
- if (!CloseEntry())
+ if (!CloseEntry() || (m_tarsize == 0 && m_endrecWritten))
return false;
-
+
memset(m_hdr, 0, sizeof(*m_hdr));
int count = (RoundUpSize(m_tarsize + 2 * TAR_BLOCKSIZE, m_BlockingFactor)
- m_tarsize) / TAR_BLOCKSIZE;
m_tarsize = 0;
m_tarstart = wxInvalidOffset;
m_lasterror = m_parent_o_stream->GetLastError();
+ m_endrecWritten = true;
return IsOk();
}
m_TotalEntries = endrec.GetTotalEntries();
m_Comment = endrec.GetComment();
+ wxUint32 magic = m_TotalEntries ? CENTRAL_MAGIC : END_MAGIC;
+
// Now find the central-directory. we have the file offset of
// the CD, so look there first.
if (m_parent_i_stream->SeekI(endrec.GetOffset()) != wxInvalidOffset &&
- ReadSignature() == CENTRAL_MAGIC) {
- m_signature = CENTRAL_MAGIC;
+ ReadSignature() == magic) {
+ m_signature = magic;
m_position = endrec.GetOffset();
m_offsetAdjustment = 0;
return true;
// to a self extractor, so take the CD size (also in endrec), subtract
// it from the file offset of the end-central-directory and look there.
if (m_parent_i_stream->SeekI(endPos - endrec.GetSize())
- != wxInvalidOffset && ReadSignature() == CENTRAL_MAGIC) {
- m_signature = CENTRAL_MAGIC;
+ != wxInvalidOffset && ReadSignature() == magic) {
+ m_signature = magic;
m_position = endPos - endrec.GetSize();
m_offsetAdjustment = m_position - endrec.GetOffset();
return true;
m_comp = NULL;
m_level = level;
m_offsetAdjustment = wxInvalidOffset;
+ m_endrecWritten = false;
}
wxZipOutputStream::~wxZipOutputStream()
{
CloseEntry();
- if (m_lasterror == wxSTREAM_WRITE_ERROR) {
+ if (m_lasterror == wxSTREAM_WRITE_ERROR
+ || (m_entries.size() == 0 && m_endrecWritten))
+ {
wxFilterOutputStream::Close();
return false;
}
endrec.Write(*m_parent_o_stream, GetConv());
m_lasterror = m_parent_o_stream->GetLastError();
+ m_endrecWritten = true;
if (!wxFilterOutputStream::Close() || !IsOk())
return false;