aardio 文档

aardio 范例: WinAsar - 解包工具

import win.ui;
import fonts.fontAwesome;
/*DSG{{*/
var winform = win.form(text="WinAsar - 解包工具";right=1075;bottom=736;acceptfiles=1;bgcolor=16777215;parent=...)
winform.add(
btnExtract={cls="plus";text="提取全部文件";left=805;top=666;right=973;bottom=699;align="left";db=1;dr=1;font=LOGFONT(h=-15);notify=1;textPadding={left=35};z=3};
btnOpen={cls="plus";text="选择asar文件";left=623;top=4;right=868;bottom=37;align="left";dr=1;dt=1;font=LOGFONT(h=-15);textPadding={left=35};z=6};
btnReplace={cls="plus";text="保存并替换数据";left=884;top=4;right=1056;bottom=37;align="left";disabled=1;dr=1;dt=1;font=LOGFONT(h=-15);textPadding={left=35};z=9};
editAsarPath={cls="edit";left=19;top=3;right=617;bottom=40;dl=1;dr=1;dt=1;edge=1;multiline=1;z=5};
editInfo={cls="richedit";left=371;top=42;right=1058;bottom=654;db=1;dl=1;dr=1;dt=1;edge=1;hscroll=1;multiline=1;vscroll=1;z=2};
editOutDir={cls="edit";left=138;top=666;right=800;bottom=699;acceptfiles=1;db=1;dl=1;dr=1;edge=1;multiline=1;z=7};
progress={cls="plus";left=21;top=710;right=1058;bottom=723;bgcolor=6447459;db=1;dl=1;dr=1;forecolor=9959653;hide=1;z=4};
static={cls="static";text="输出目录:";left=42;top=672;right=128;bottom=696;align="right";db=1;dl=1;font=LOGFONT(h=-15);transparent=1;z=8};
treeview={cls="treeview";left=18;top=43;right=364;bottom=658;asel=false;bgcolor=16777215;db=1;dl=1;dt=1;edge=1;vscroll=1;z=1}
)
/*}}*/

import fsys.asar.reader;
var showAsarInfo = function(){
    var unasar,err = fsys.asar.reader(winform.editAsarPath.text);
    if(!unasar){
        winform.msgboxErr(..string.concat("获取asar文件信息时遇到错误",err));
        return;
    }

    winform.treeview.clear();
    winform.treeview.insertItem(unasar.treeData());

    winform.editInfo.text = web.json.stringify(unasar.info,true);

    if(winform.unasar) winform.unasar.close();
    winform.unasar = unasar;
    winform.asaPath = winform.editAsarPath.text;

    if( ( !# ( ..string.trim( winform.editOutDir.text )) )
        || (winform.editOutDir.autoPath = winform.editOutDir.text ) ){
        winform.editOutDir.text = winform.asaPath  + ".unpack";
        winform.editOutDir.autoPath = winform.editOutDir.text ;
    }
}

winform.editAsarPath.oncommand = function(id,event){ 
    if( event == 0x300/*_EN_CHANGE*/){
        if( ..string.endWith(winform.editAsarPath.text,"*.asar")){
                if( ..io.exist(winform.editAsarPath.text)){
                    showAsarInfo();
                };
        }   
    }

} 

import fsys.dlg;
winform.btnOpen.oncommand = function(id,event){
    var path = fsys.dlg.open("*.asar|*.asar||","请选择asar文件",,winform.hwnd);
    if(#path){
        winform.editAsarPath.text = path;
        showAsarInfo();
    } 
}

winform.wndproc = {
    [0x233/*_WM_DROPFILES*/] = function(hwnd,message,wParam,lParam){ 
        var files = win.getDropFile(wParam)
        if(#files){
             winform.editAsarPath.text = files[1];
             showAsarInfo();
        };
    }
}

winform.editOutDir.wndproc = {
    [0x233/*_WM_DROPFILES*/] = function(hwnd,message,wParam,lParam){ 
        var files = win.getDropFile(wParam)
        if(#files){
            if( fsys.isDir(files[1]) )
                winform.editOutDir.text = files[1]; 
        };
    }
}

import fsys;
import win.ui.menu;
import process;
import fsys.mime;
winform.treeview.onnotify = function(id,code,ptr){

    if( code == 0xFFFFFE3D/*_TVN_SELCHANGEDW*/ ){  
        var hItem = winform.treeview.getSelection();
        if(hItem){
            var data  = winform.treeview.getItemData(hItem);
            var bin;
            if( data[["size"]]  && data[["size"]] < 0x10000 ){
                bin = winform.unasar.readFile(data.path);
            }

            if( bin && ..string.len( bin )  ){
                 winform.editInfo.text = winform.unasar.readFile(data.path);
                 winform.btnReplace.disabled = false;
            }
            else {
                winform.btnReplace.disabled = true;
                 winform.editInfo.text = web.json.stringify(data,true) 
            }

        }
    }
    elseif(code = 0xFFFFFFFB/*_NM_RCLICK*/){ //鼠标右键单击
        var hItem,tvht = winform.treeview.hitTest();
        winform.treeview.setSelected(hItem);
        var data  = winform.treeview.getItemData(hItem);
        if(!data[["size"]]) return;

        var menu = win.ui.popmenu(winform)
        menu.add("Copy To...",
            function(){ 
                var dir = fsys.getParentDir(winform.asaPath)  
                var path = fsys.dlg.save("*.*|*.*||","请选择输出文件",dir ,winform.hwnd,,data.text) 

                if(path){

                    var file = io.file(path,"w+b")
                    if(!file) {
                        winform.msgboxErr("Create File Failed!")
                        return;    
                    }

                    winform.progress.hide = false;
                    winform.progress.setProgressRange(1,data.size);

                    var buf = raw.buffer(0x100000)
                    for readSize in winform.unasar.eachReadBuffer(buf,data.path) {
                        file.writeBuffer(buf,readSize);
                        winform.progress.progressPos = winform.progress.pos + readSize;
                    }   
                    file.close(); 
                    process.explore(path)
                }
            }
        )
        menu.popup(x,y,true);
    } 
}

winform.btnReplace.oncommand = function(id,event){
    hItem = winform.treeview.getSelection();
    var data  = winform.treeview.getItemData(hItem);
    if(!(data[["size"]] && data[["path"]]) ) {
        winform.msgboxErr("Invalid item data");
        return;
    }
    var ret,err  = winform.unasar.replaceText(data[["path"]],winform.editInfo.text)
    if(err) return  winform.msgboxErr(err);

    winform.btnReplace.disabled = true;
    win.delay(1000);
    winform.btnReplace.disabled = false;
}

import fsys.dlg.dir;
import process;
winform.btnExtract.oncommand = function(id,event){
    if(!#winform.asaPath){
        var path = fsys.dlg.open("*.asar|*.asar||","请选择asar文件",,winform.hwnd);
        if(#path){
            winform.editAsarPath.text = path;
            showAsarInfo();
        } 
        else {
            return;
        }
    }

    var dir = winform.editOutDir.text;
    var parentDir = fsys.getParentDir(winform.asaPath)  
    ..io.createDir(dir)
    if( ! #dir )
        dir = fsys.dlg.dir(parentDir,winform.hwnd,"请选择输出目录");

    if(!dir) return;

    winform.progress.hide = false;
    winform.progress.setProgressRange(1,1000);

    winform.btnExtract.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'}
    var msg = MSG() 
    for path,size,progress in winform.unasar.eachUnpack(dir) {
        winform.progress.progressPos = progress * 1000;
        win.peekPumpMessage( msg )
    }
    winform.btnExtract.disabledText = null;

    winform.progress.hide = true;
    process.explore_select(dir)
}

winform.btnExtract.skin({
    background={
        default=0xFF8FB2B0;
        hover=0xFF928BB3;
        disabled=0xFFCCCCCC;
    }
})

winform.btnOpen.skin({
    background={
        default=0xFF8FB2B0;
        hover=0xFF928BB3;
        disabled=0xFFCCCCCC; 
    }
})

winform.btnReplace.skin({
    background={
        default=0xFF8FB2B0;
        hover=0xFF928BB3;
        disabled=0xFFCCCCCC;
    }
})

winform.show();

win.loopMessage();
return winform; 

Markdown 格式