jam/js/dos/dios.js

133 lines
3.7 KiB
JavaScript

/**
** ==============================
** OOOO O O OOOO
** O O O O O O O
** O O O O O O O
** OOOO OOOO O OOO OOOO
** O O O O O O O
** O O O O O O O
** OOOO OOOO O O OOOO
** ==============================
** Dr. Stefan Bosse http://www.bsslab.de
**
** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED
** BY THE AUTHOR(S).
** THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED,
** MODIFIED, OR OTHERWISE USED IN A CONTEXT
** OUTSIDE OF THE SOFTWARE SYSTEM.
**
** $AUTHORS: Stefan Bosse
** $INITIAL: (C) 2006-2017 B-LAB
** $CREATED: 23/06/16 by sbosse.
** $VERSION: 1.1.4
**
** $INFO:
**
** DIOS: Simplified DOS I/O System Wrapper Layer
**
**
** $ENDOFINFO
*/
"use strict";
var Io = Require('com/io');
var Comp = Require('com/compat');
var Net = Require('dos/network');
var Sch = Require('dos/scheduler');
var Buf = Require('dos/buf');
var Rpc = Require('dos/rpc');
var Std = Require('dos/std');
var Router = Require('dos/router');
var Fs = Require('fs');
var Dns = Require('dos/dns');
var Afs = Require('dos/afs');
var Cs = Require('dos/capset');
var Status = Net.Status;
/**
*
*/
// type dios : function ('rpc:rpcint,'env) : dios
// with 'env:{rootdir:capset}
var dios = function(rpc,env) {
this.rpc = rpc;
this.env = env;
this.env.workdir = env.rootdir;
this.std = Std.StdInt(rpc,env);
this.dns = Dns.DnsInt(rpc,env);
this.afs = Afs.AfsInt(rpc,env);
this.cs = Cs.CsInt(rpc,env);
this.stat = Status.STD_OK;
};
// with cb:function((name:string,time:number,cap:capability,stat:status) [],status,boolean?)
dios.prototype.dir = function (path,cb,nocap) {
var self=this;
this.dns.dns_lookup(undefined,path,function (stat,cs,remain) {
self.stat=stat;
if (stat==Status.STD_OK) {
self.dns.dns_list(cs,function (stat,dir) {
var rows=[],index=0,stat;
self.stat=stat;
if (stat==Status.STD_OK) {
// TODO: lookup all row entries ..
rows=Comp.array.map(dir.di_rows,function (row) {
return {
name:row.de_name,
time:row.de_time,
cap:undefined,
stat:Status.STD_OK
}
});
if (!nocap) L(
function () {return index<rows.length},
[
function () {
// console.log(rows[index].name);
self.dns.dns_lookup(cs,rows[index].name,function (_stat,_cs){
stat=_stat;
if (stat==Status.STD_OK) rows[index].cap=self.cs.cs_to_cap(_cs);
})
},
function () {
// Server can be unavailable or is gone
if (stat!=Status.STD_OK) {
rows[index].stat=stat; // throw stat;
rows[index].cap=Net.nilcap;
}
index++;
}
],
[
function () {cb(rows,stat);}
],
function (stat) {cb(undefined,stat)}
); else cb(rows,stat);
} else cb(undefined,stat);
});
} else cb(undefined,stat);
});
}
// with cb:function(capability?,status)
dios.prototype.resolve = function (path,cb) {
var self=this;
// console.log(path)
this.dns.dns_lookup(undefined,path,function (stat,cs,remain) {
self.stat=stat;
if (stat==Status.STD_OK) cb(self.cs.cs_to_cap(cs),stat);
else cb(undefined,stat);
});
}
var Dios = function (rpc,env) {
return new dios(rpc,env);
}
module.exports = {
Dios: Dios
}