X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fio%2Fandroid%2Fasset.cpp;fp=source%2Fio%2Fandroid%2Fasset.cpp;h=1b97eae3d1f7a5177575043521d893feaa4ff894;hb=bda95f684da98079f4b1fe705d969bacb6d86e12;hp=0000000000000000000000000000000000000000;hpb=cc7c798b275b8ea9992eb82d68177ecfd50e0974;p=libs%2Fcore.git diff --git a/source/io/android/asset.cpp b/source/io/android/asset.cpp new file mode 100644 index 0000000..1b97eae --- /dev/null +++ b/source/io/android/asset.cpp @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include "asset.h" +#include "file.h" + +using namespace std; + +namespace Msp { +namespace IO { + +struct Asset::Private +{ + AAsset *asset; +}; + +Asset::Asset(const string &name) +{ + AAssetManager *asset_manager = reinterpret_cast(Application::get_data())->get_asset_manager(); + AAsset *asset = AAssetManager_open(asset_manager, name.c_str(), AASSET_MODE_RANDOM); + if(!asset) + throw file_not_found(name); + + priv = new Private; + priv->asset = asset; + + mode = M_READ; +} + +Asset::~Asset() +{ + AAsset_close(priv->asset); + delete priv; +} + +unsigned Asset::do_read(char *buf, unsigned size) +{ + int ret = AAsset_read(priv->asset, buf, size); + if(ret<0) + throw runtime_error("Asset::do_read"); + else if(ret==0) + set_eof(); + + return ret; +} + +SeekOffset Asset::seek(SeekOffset off, SeekType type) +{ + signal_flush_required.emit(); + off = AAsset_seek(priv->asset, off, type); + if(off<0) + throw runtime_error("Asset::seek"); + return off; +} + +SeekOffset Asset::tell() const +{ + SeekOffset off = AAsset_seek(priv->asset, 0, S_CUR); + if(off<0) + throw runtime_error("Asset::tell"); + return off; +} + +} // namespace IO +} // namespace Msp