This commit is contained in:
DavidVentura
2024-01-29 16:31:56 +01:00
parent 8671b32475
commit 3d5d250807
4 changed files with 73 additions and 86 deletions
+44 -82
View File
@@ -1,6 +1,6 @@
import "./shim.ts";
import { Commands } from "./datatypes.js";
import { ControlCommands, Commands, ccDest } from "./datatypes.js";
import { Session } from "./server.js";
import { XqBytesEnc } from "./func_replacements.js";
import { hexdump } from "./hexdump.js";
@@ -29,97 +29,59 @@ const DrwHdr = (cmd: number, len: number, d1_or_d2: 0xd1 | 0xd2, m_chan: number,
retret.add(6).writeU16(pkt_id);
return retret;
};
export const SendDevStatus = (session: Session): DataView => {
let buf = new DataView(new Uint8Array(0x14).buffer);
/*
00000000 f1 d0 00 10 d1 00 00 c3 11 0a 08 10 04 00 00 00 ................
00000010 68 66 6b 67 hfkg
*/
let bytes = [
0xf1,
0xd0,
0x00, // len? lower values= no response, larger values = 1 frame then kicked
0x10, // len
0xd1, // ?
0x00, // chan
session.outgoingCommandId >> 8,
session.outgoingCommandId,
0x11,
0x0a,
0x08,
0x10,
0x04, // len
0x00, // len
0x00, // dst
0x00, // dst
session.ticket[0],
session.ticket[1],
session.ticket[2],
session.ticket[3],
];
buf.writeByteArray(bytes);
return buf;
const makeDataReadWrite = (session: Session, command: number, data: DataView | null): DataView => {
const DRW_HEADER_LEN = 0x10;
const TOKEN_LEN = 0x4;
const CHANNEL = 0;
const START_CMD = 0x110a;
let pkt_len = DRW_HEADER_LEN + TOKEN_LEN;
let payload_len = TOKEN_LEN;
let bufCopy: Uint8Array | null = null;
if (data) {
bufCopy = new Uint8Array(data.buffer);
const bufDV = new DataView(bufCopy.buffer);
// this mutates the buffer, don't want to mutate the caller
XqBytesEnc(bufDV, bufDV.byteLength, 4);
pkt_len += bufDV.byteLength;
payload_len += bufDV.byteLength;
}
const ret = new DataView(new Uint8Array(pkt_len).buffer);
ret.add(0).writeU16(Commands.Drw);
ret.add(2).writeU16(pkt_len - 4); // -4 as we ignore the [0xf1, 0xd0, len, len]
ret.add(4).writeU8(0xd1); // ?
ret.add(5).writeU8(CHANNEL);
ret.add(6).writeU16(session.outgoingCommandId);
ret.add(8).writeU16(START_CMD);
ret.add(10).writeU16(command);
ret.add(12).writeU16(u16_swap(payload_len));
ret.add(14).writeU16(ccDest[command]);
ret.add(16).writeByteArray(session.ticket);
if (data) {
ret.add(20).writeByteArray(bufCopy);
}
return ret;
};
export const SendDevStatus = (session: Session): DataView => {
return makeDataReadWrite(session, ControlCommands.DevStatus, null);
};
export const SendStartVideo = (session: Session): DataView => {
// TODO: extract SendUsrChk
let buf = new DataView(new Uint8Array(0x18).buffer);
// console.log(hexdump(DrwHdr(0xf1d0, 0x0114, 0xd1, 0, pkt_id).buffer));
let bytes = [
0xf1,
0xd0,
0x01, // len? lower values= no response, larger values = 1 frame then kicked
0x14, // len
0xd1, // ?
0x00, // chan
session.outgoingCommandId >> 8,
session.outgoingCommandId,
0x11,
0x0a,
0x10,
0x30,
0x08,
0x01,
0x00,
0x00,
session.ticket[0],
session.ticket[1],
session.ticket[2],
session.ticket[3],
0x01,
0x01,
0x01,
0x01,
];
buf.writeByteArray(bytes);
return buf;
return makeDataReadWrite(session, ControlCommands.StartVideo, null);
};
export const SendUsrChk = (username: string, password: string, pkt_id: number): DataView => {
// type is char account[0x20]; char password[0x80];
export const SendUsrChk = (session: Session, username: string, password: string): DataView => {
let buf = new Uint8Array(0x20 + 0x80);
buf.fill(0);
let cmd_payload = new DataView(buf.buffer);
// type is char account[0x20]; char password[0x80];
cmd_payload.writeByteArray(str2byte(username));
cmd_payload.add(0x20).writeByteArray(str2byte(password));
const start = 0xa11;
const dest = 0xff;
const cmd = 0x1020; // FIXME ControlCommands.ConnectUser
const len = buf.byteLength;
let cmdHeader = CmdSndProcHdr(start, cmd, len, dest);
let ret = new DataView(new Uint8Array(12 + len).buffer);
ret.writeByteArray(new Uint8Array(cmdHeader.buffer));
XqBytesEnc(cmd_payload, 0x20 + 0x80, 4);
ret.add(12).writeByteArray(new Uint8Array(cmd_payload.buffer));
// need to encapsulate this into create_Drw(outbuf, 0xd1, param4?, svar1?,
// copy_len, inbuf); seems like param4/svar1 are overflowing == maybe '0xa'
// and '0x2010'??
let retret = DrwHdr(0xf1d0, 8 + 12 + len - 4, 0xd1, 0, pkt_id);
retret.add(8).writeByteArray(new Uint8Array(ret.buffer));
return retret;
return makeDataReadWrite(session, ControlCommands.ConnectUser, cmd_payload);
};
export const create_P2pRdy = (inbuf: DataView): DataView => {