Allow passing the error value to wxStreamBase::Reset().

It can be useful to induce an error on the stream explicitly, e.g. because an
incorrect value was read from it and we want to indicate it to the caller by
setting stream error to wxSTREAM_READ_ERROR.

Allow to do this by passing an optional error value to wxStreamBase::Reset().

Add an example of using the new functionality to the docview sample which
needs it to be able to signal errors while reading the files.

Also document this method that previously wasn't documented at all.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68331 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2011-07-22 16:16:00 +00:00
parent e3bb4c547a
commit 90693f47f2
3 changed files with 23 additions and 1 deletions

View File

@ -64,7 +64,7 @@ public:
bool operator!() const { return !IsOk(); }
// reset the stream state
void Reset() { m_lasterror = wxSTREAM_NO_ERROR; }
void Reset(wxStreamError error = wxSTREAM_NO_ERROR) { m_lasterror = error; }
// this doesn't make sense for all streams, always test its return value
virtual size_t GetSize() const;

View File

@ -80,6 +80,18 @@ public:
*/
virtual bool IsSeekable() const;
/**
Resets the stream state.
By default, resets the stream to good state, i.e. clears any errors.
Since wxWidgets 2.9.3 can be also used to explicitly set the state to
the specified error (the @a error argument didn't exist in the previous
versions).
@see GetLastError()
*/
void Reset(wxStreamError error = wxSTREAM_NO_ERROR);
/**
Returns the opposite of IsOk().
You can use this function to test the validity of the stream as if

View File

@ -79,6 +79,16 @@ DocumentIstream& DrawingDocument::LoadObject(DocumentIstream& istream)
wxInt32 count = 0;
stream >> count;
if ( count < 0 )
{
wxLogWarning("Drawing document corrupted: invalid segments count.");
#if wxUSE_STD_IOSTREAM
istream.clear(std::ios::badbit);
#else
istream.Reset(wxSTREAM_READ_ERROR);
#endif
return istream;
}
for ( int n = 0; n < count; n++ )
{