public:
wxBackedInputStream(const wxBackingFile& backer);
+ // If the length of the backer's parent stream is unknown then GetLength()
+ // returns wxInvalidOffset until the parent has been read to the end.
wxFileOffset GetLength() const;
+
+ // Returns the length, reading the parent stream to the end if necessary.
+ wxFileOffset FindLength() const;
+
bool IsSeekable() const { return true; }
protected:
{
}
+wxFileOffset wxBackedInputStream::GetLength() const
+{
+ return m_backer.m_impl->GetLength();
+}
+
+wxFileOffset wxBackedInputStream::FindLength() const
+{
+ wxFileOffset len = GetLength();
+
+ if (len == wxInvalidOffset && IsOk()) {
+ // read a byte at 7ff...ffe
+ wxFileOffset pos = 1;
+ pos <<= sizeof(pos) * 8 - 1;
+ pos = ~pos - 1;
+ char ch;
+ size_t size = 1;
+ m_backer.m_impl->ReadAt(pos, &ch, &size);
+ len = GetLength();
+ }
+
+ return len;
+}
+
size_t wxBackedInputStream::OnSysRead(void *buffer, size_t size)
{
if (!IsOk())
return size;
}
-wxFileOffset wxBackedInputStream::GetLength() const
-{
- return m_backer.m_impl->GetLength();
-}
-
wxFileOffset wxBackedInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode)
{
switch (mode) {