/* * Created by LuaView. * Copyright (c) 2017, Alibaba Group. All rights reserved. * * This source code is licensed under the MIT. * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree. */ package com.taobao.luaview.userdata.kit; import android.text.TextUtils; import com.taobao.luaview.fun.mapper.LuaViewApi; import com.taobao.luaview.fun.mapper.LuaViewLib; import com.taobao.luaview.global.LuaResourceFinder; import com.taobao.luaview.global.VmVersion; import com.taobao.luaview.scriptbundle.asynctask.SimpleTask1; import com.taobao.luaview.userdata.base.BaseLuaTable; import com.taobao.luaview.util.FileUtil; import com.taobao.luaview.util.LuaUtil; import org.luaj.vm2.Globals; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Varargs; import org.luaj.vm2.lib.VarArgFunction; import java.io.File; /** * File 用户数据封装 * * @author song * @date 15/9/6 */ @LuaViewLib(revisions = {"20170306已对标"}) @LuaViewApi(since = VmVersion.V_550) public class UDFile extends BaseLuaTable { public UDFile(Globals globals, LuaValue metatable) { super(globals, metatable); init(); } private void init() { set("save", new save()); set("read", new read()); set("exists", new exists()); set("path", new path()); } /** * 保存文件 */ class save extends VarArgFunction { @Override public Varargs invoke(Varargs args) { if (args.narg() > 1) { final LuaResourceFinder finder = getLuaResourceFinder(); if (finder != null) { final LuaValue param1 = args.arg(2); final LuaValue param2 = args.arg(3); String name = null; byte[] data = null; if (LuaUtil.isString(param1)) { name = param1.optjstring(null); data = param2 instanceof UDData ? ((UDData) param2).bytes() : null; } else if (param1 instanceof UDData) { data = ((UDData) param1).bytes(); name = param2.optjstring(null); } if (data != null && data.length > 0 && !TextUtils.isEmpty(name)) { if (args.isfunction(4)) { final LuaValue callback = LuaUtil.getFunction(args, 4); new SimpleTask1<Boolean>() { @Override protected Boolean doInBackground(Object... params) { final String path = finder.buildSecurePathInSdcard((String) params[0]); return FileUtil.save(path, (byte[]) params[1]); } @Override protected void onPostExecute(Boolean o) { LuaUtil.callFunction(callback, o); } }.executeInPool(name, data); } else { final String path = finder.buildSecurePathInSdcard(name); return valueOf(FileUtil.save(path, data)); } } } } return FALSE; } } /** * 读取文件 */ class read extends VarArgFunction { @Override public Varargs invoke(Varargs args) { if (args.narg() > 1) { final LuaResourceFinder finder = getLuaResourceFinder(); if (finder != null) { final String name = LuaUtil.getString(args, 2); final String path = finder.buildSecurePathInSdcard(name); if (args.isfunction(3)) { final LuaValue callback = LuaUtil.getFunction(args, 3); if (path != null) { new SimpleTask1<UDData>() { @Override protected UDData doInBackground(Object... params) { byte[] data = FileUtil.readBytes(new File(path)); if (data != null) { return new UDData(getGlobals(), getmetatable(), null).append(data); } else { // 外存储卡读取不到的情况下,尝试在assets资源包下读取 data = finder.readFromAssets(name); return new UDData(getGlobals(), getmetatable(), null).append(data); } } @Override protected void onPostExecute(UDData udData) { LuaUtil.callFunction(callback, udData); } }.executeInPool(); } else { LuaUtil.callFunction(callback, NIL); } } else { if (path != null) { byte[] data = FileUtil.readBytes(new File(path)); if (data != null) { return new UDData(getGlobals(), getmetatable(), null).append(data); } else { // 外存储卡读取不到的情况下,尝试在assets资源包下读取 data = finder.readFromAssets(name); if (data != null) { return new UDData(getGlobals(), getmetatable(), null).append(data); } else { return NIL; } } } else { return NIL; } } } } return NIL; } } /** * 文件是否存在 */ class exists extends VarArgFunction { @Override public Varargs invoke(Varargs args) { if (args.narg() > 1) { final LuaResourceFinder finder = getLuaResourceFinder(); if (finder != null) { final String fileName = LuaUtil.getString(args, 2); if (!TextUtils.isEmpty(fileName)) { return valueOf(finder.exists(fileName)); } } } return valueOf(false); } } /** * 获取文件绝对路径 */ class path extends VarArgFunction { @Override public Varargs invoke(Varargs args) { if (args.narg() > 1) { final LuaResourceFinder finder = getLuaResourceFinder(); if (finder != null) { final String fileName = LuaUtil.getString(args, 2); final String path = finder.buildSecurePathInSdcard(fileName); return path != null ? valueOf(path) : NIL; } } return NIL; } } }