Skip to content
Snippets Groups Projects
Commit b7d74ffb authored by mcmlxxix's avatar mcmlxxix
Browse files

Added file synchronization functions.

Fixed some bugs. Created some bugs.
parent 1858be80
No related branches found
No related tags found
No related merge requests found
......@@ -7,40 +7,54 @@
load("funclib.js");
load("sbbsdefs.js");
load("sockdefs.js");
const normal_scope= "#";
const global_scope= "!";
const priv_scope= "%";
//load("commsync.js");
const normal_scope= "#";
const global_scope= "!";
const hub_query= "?";
const priv_scope= "%";
const file_sync= "@";
const tries= 5;
const connection_timeout= 2;
function GameConnection(id)
{
this.session_id= (id?id:"default");
this.notices= [];
//hub should point to the local, internal ip address or domain of the computer running gameservice.js
//port should point to the port the gaming service is set to use in gameservice.js
var comminit=new File(system.ctrl_dir + "commsync.ini");
comminit.open('r');
var module=comminit.iniGetObject(this.session_id);
comminit.close();
const working_dir=module.working_directory;
//hub should point to the local, internal ip address or domain of the computer running commservice.js
//port should point to the port the gaming service is set to use in commservice.js
const hub= "localhost";
const port= 10088;
const tries= 5;
const connection_timeout= 2;
var sock=new Socket();
sock.bind(0,server.interface_ip_address);
this.init=function()
{
log("initializing communication service connection");
this.notices.push("Connecting to hub... ");
for(var t=0;t<tries;t++)
{
sock.connect(hub,port,connection_timeout);
if(sock.is_connected)
{
sock.send("&" + this.session_id + "\r\n");
log("connection to " + hub + " successful");
return true;
}
mswait(50);
}
log("connection to " + hub + " failed with error " + sock.last_error);
this.notices.push("Connection to " + hub + " failed...");
return false;
}
this.getnotices=function()
{
if(this.notices.length) return this.notices;
return false;
}
this.receive=function()
......@@ -48,12 +62,11 @@ function GameConnection(id)
var data=0;
if(!sock.is_connected)
{
log("connecting to hub");
if(!this.init()) return -1;
}
if(sock.data_waiting)
{
var raw_data=sock.recvline(4092,connection_timeout);
var raw_data=sock.recvline(16384,connection_timeout);
data=js.eval(raw_data);
}
return data;
......@@ -62,7 +75,6 @@ function GameConnection(id)
{
if(!sock.is_connected)
{
log("connecting to hub");
if(!this.init()) return -1;
}
if(!data.scope)
......@@ -70,9 +82,154 @@ function GameConnection(id)
log("scope undefined");
return -1;
}
var packet=data.scope + this.session_id + ":" + data.toSource() + "\r\n";
var packet=data.scope + this.session_id + "" + data.toSource() + "\r\n";
sock.send(packet);
}
this.recvfile=function(remote_file)
{
var filesock=new Socket();
filesock.bind(0,server.interface_ip_address);
filesock.connect(hub,port,connection_timeout);
if(filesock.is_connected)
{
filesock.send(file_sync + this.session_id + "#send" + file_getname(remote_file) + "\r\n");
while(filesock.is_connected)
{
var data=filesock.recvline(1024,connection_timeout);
data=parse_query(data);
var response=data[1];
var file=data[2];
var date=data[3];
switch(response)
{
case "#askrecv":
receive_file(filesock,this.session_id,file,date);
break;
case "#abort":
filesock.close();
return false;
case "#endquery":
filesock.close();
return true;
default:
filesock.close();
log("unknown response: " + response);
return false;
}
}
}
}
this.sendfile=function(local_file)
{
var filesock=new Socket();
filesock.bind(0,server.interface_ip_address);
filesock.connect(hub,port,connection_timeout);
var files=directory(working_dir + file_getname(local_file));
for(var f=0;f<files.length && filesock.is_connected;f++)
{
var filename=file_getname(files[f]);
var filedate=file_date(files[f]);
filesock.send(file_sync + this.session_id + "#askrecv" + filename + "" + filedate + "\r\n");
var data=filesock.recvline(1024,connection_timeout);
data=parse_query(data);
var response=data[1];
switch(response)
{
case "#ok":
log("sending file: " + filename);
filesock.sendfile(files[f]);
filesock.send("#eof\r\n");
log("file sent: " + filename);
break;
case "#skip":
log("skipping file");
break;
case "#abort":
log("aborting query");
return false;
default:
log("unknown response: " + response);
filesock.send("#abort\r\n");
return false;
}
}
filesock.send("#endquery\r\n");
filesock.close();
}
this.close=function()
{
log("terminating service connection");
sock.close();
}
function receive_file(socket,session_id,filename,filedate)
{
filename=working_dir+filename;
if(file_date(filename)==filedate)
{
log("skipping file");
socket.send(file_sync + session_id + "#skip\r\n");
return false;
}
log("confirming transfer");
socket.send(file_sync + session_id + "#ok\r\n");
var file=new File(filename + ".tmp");
file.open('w',false);
var count=0;
while(count<50)
{
var data=false;
if(socket.data_waiting) data=socket.recvline(1024,connection_timeout);
if(data)
{
switch(data)
{
case "#abort":
log("transfer aborted");
file.close();
file_remove(file.name);
return false;
case "#eof":
log("file received: " + filename);
file.close();
file_utime(file.name,time(),filedate);
file_remove(filename);
file_rename(file.name,filename);
return true;
default:
file.writeln(data);
break;
}
}
else
{
count++;
mswait(25);
}
}
log("transfer timed out");
file.close();
file_remove(file.name);
return false;
}
function parse_query(query)
{
if(query) return query.split("");
return false;
}
if(!sock.is_connected)
{
if(!this.init()) return -1;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment