Home | History | Annotate | Download | only in app
      1 //
      2 // Copyright 2005 The Android Open Source Project
      3 //
      4 // Provide a wxInputStream subclass based on the Android Asset class.
      5 // This is necessary because some wxWidgets functions require either a
      6 // filename or a wxInputStream (e.g. wxImage).
      7 //
      8 #ifndef _SIM_ASSETSTREAM_H
      9 #define _SIM_ASSETSTREAM_H
     10 
     11 #include "wx/stream.h"
     12 #include <utils/Asset.h>
     13 
     14 /*
     15  * There is no sample code or concrete documentation about providing
     16  * input streams, but it seems straightforward.  The PNG loading code
     17  * uses the following:
     18  *  OnSysTell()
     19  *  OnSysSeek()
     20  *  Read()
     21  *
     22  * The AssetStream takes ownership of the Asset.
     23  */
     24 class AssetStream : public wxInputStream {
     25 public:
     26     AssetStream(android::Asset* pAsset)
     27         : mpAsset(pAsset)
     28         {}
     29     virtual ~AssetStream(void) {
     30         delete mpAsset;
     31     }
     32 
     33     virtual wxFileOffset GetLength() const {
     34         //printf("## GetLength --> %ld\n", (long) mpAsset->getLength());
     35         return mpAsset->getLength();
     36     }
     37     virtual size_t GetSize() const {
     38         //printf("## GetSize --> %ld\n", (long) mpAsset->getLength());
     39         return mpAsset->getLength();
     40     }
     41     virtual bool IsSeekable() const { return true; }
     42 
     43     virtual bool Eof() const {
     44         //printf("## Eof\n");
     45         return (mpAsset->seek(0, SEEK_CUR) == mpAsset->getLength());
     46     }
     47 
     48     virtual bool CanRead() const {
     49         //printf("## CanRead\n");
     50         return !Eof();
     51     }
     52 
     53     virtual wxInputStream& Read(void* buffer, size_t size) {
     54         OnSysRead(buffer, size);
     55 
     56         return *this;
     57     }
     58 
     59 protected:
     60     /* read data, return number of bytes or 0 if EOF reached */
     61     virtual size_t OnSysRead(void* buffer, size_t size) {
     62         ssize_t actual = mpAsset->read(buffer, size);
     63         if (actual < 0) {
     64             // TODO: flag error
     65             actual = 0;
     66         }
     67         //printf("## OnSysRead(%p %u) --> %d\n", buffer, size, actual);
     68         return actual;
     69     }
     70 
     71     /* seek, using wxWidgets-defined values for "whence" */
     72     virtual wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode) {
     73         int whence;
     74         off_t newPosn;
     75 
     76         if (mode == wxFromStart)
     77             whence = SEEK_SET;
     78         else if (mode == wxFromEnd)
     79             whence = SEEK_END;
     80         else
     81             whence = SEEK_CUR;
     82         newPosn = mpAsset->seek(seek, whence);
     83         //printf("## OnSysSeek(%ld %d) --> %ld\n",
     84         //    (long) seek, mode, (long) newPosn);
     85         if (newPosn == (off_t) -1)
     86             return wxInvalidOffset;
     87         else
     88             return newPosn;
     89     }
     90 
     91     virtual wxFileOffset OnSysTell() const {
     92         //printf("## OnSysTell() --> %ld\n", (long) mpAsset->seek(0, SEEK_CUR));
     93         return mpAsset->seek(0, SEEK_CUR);
     94     }
     95 
     96 private:
     97     android::Asset*     mpAsset;
     98 
     99     DECLARE_NO_COPY_CLASS(AssetStream);     // private copy-ctor and op=
    100 };
    101 
    102 #endif // _SIM_ASSETSTREAM_H
    103