uoijewuro

This commit is contained in:
Kitteh 2021-06-02 13:54:08 +01:00
parent 52a601bc17
commit 14ee65417e
3 changed files with 32 additions and 12 deletions

View file

@ -50,19 +50,25 @@ pub const Client = struct {
try map.put("ClientVersion", .{ .string = "0.1 (quasselclient)" }); try map.put("ClientVersion", .{ .string = "0.1 (quasselclient)" });
try map.put("ClientDate", .{ .string = "0" }); try map.put("ClientDate", .{ .string = "0" });
try write.add_qvariantmap(list.writer(), s.allocator, map); try write.add_message(list.writer(), s.allocator, map);
try dumpDebug("ClientInit.bin", list); try dumpDebug("ClientInit.bin", list);
try s.stream.writer().writeAll(list.items); try s.stream.writer().writeAll(list.items);
} }
pub fn quassel_login(s: *Client, username: []const u8, password: []const u8) !void { pub fn quassel_login(s: *Client, username: []const u8, password: []const u8) !void {
var list = std.ArrayList(u8).init(s.allocator);
var map = std.StringHashMap(qvar.QVariant).init(s.allocator); var map = std.StringHashMap(qvar.QVariant).init(s.allocator);
try map.put("MsgType", .{ .string = "ClientLogin" }); try map.put("MsgType", .{ .string = "ClientLogin" });
try map.put("User", .{ .string = username }); try map.put("User", .{ .string = username });
try map.put("Password", .{ .string = password }); try map.put("Password", .{ .string = password });
try write.add_qvariantmap(s.stream.writer(), s.allocator, map);
try write.add_message(list.writer(), s.allocator, map);
try dumpDebug("ClientLogin.bin", list);
try s.stream.writer().writeAll(list.items);
} }
}; };

View file

@ -13,5 +13,4 @@ pub fn main() !void {
try client.handshake(); try client.handshake();
try client.quassel_init_packet(); try client.quassel_init_packet();
try client.quassel_login("z", "password"); try client.quassel_login("z", "password");
} }

View file

@ -18,15 +18,22 @@ pub fn add_bytearray(writer: anytype, array: std.ArrayList(u8)) !void {
try writer.writeAll(array.items); try writer.writeAll(array.items);
} }
pub fn add_string(writer: anytype, str: []const u8) !void { pub fn add_string(writer: anytype, allocator: *std.mem.Allocator, str: []const u8) !void {
try writer.writeAll(str); var ut16Str = try allocator.alloc(u16, str.len);
try writer.writeByte('\x00'); defer allocator.free(ut16Str);
for (str) |character, index| {
ut16Str[index] = std.mem.nativeToBig(u16, @as(u16, character));
} }
pub fn add_stringlist(writer: anytype, strList: std.ArrayList([]const u8)) !void { try writer.writeAll(std.mem.sliceAsBytes(ut16Str));
try writer.writeByte('\x00');
}
pub fn add_stringlist(writer: anytype, allocator: *std.mem.Allocator, strList: std.ArrayList([]const u8)) !void {
try add_int(writer, @intCast(u32, strList.items.len)); try add_int(writer, @intCast(u32, strList.items.len));
for (strList.items) |string| { for (strList.items) |string| {
try add_string(writer, string); try add_string(writer, allocator, string);
} }
} }
@ -48,10 +55,10 @@ pub fn add_qvariant(writer: anytype, allocator: *std.mem.Allocator, variant: qva
try add_qvariantmap(writer, allocator, out); try add_qvariantmap(writer, allocator, out);
}, },
.string => |out| { .string => |out| {
try add_string(writer, out); try add_string(writer, allocator, out);
}, },
.stringlist => |out| { .stringlist => |out| {
try add_stringlist(writer, out); try add_stringlist(writer, allocator, out);
}, },
.bytearray => |out| { .bytearray => |out| {
try add_bytearray(writer, out); try add_bytearray(writer, out);
@ -69,12 +76,10 @@ pub fn add_qvariantmap(writer: anytype, allocator: *std.mem.Allocator, map: std.
var data = std.ArrayList(u8).init(allocator); var data = std.ArrayList(u8).init(allocator);
var writeIterator = map.iterator(); var writeIterator = map.iterator();
while (writeIterator.next()) |entry| { while (writeIterator.next()) |entry| {
try add_string(data.writer(), entry.key); try add_string(data.writer(), allocator, entry.key);
try add_qvariant(data.writer(), allocator, entry.value); try add_qvariant(data.writer(), allocator, entry.value);
} }
// lengths o the mesage
try add_int(writer, @intCast(u32, data.items.len) + 4 + 1 + 4);
// qvariantmap type // qvariantmap type
try add_int(writer, 8); // 4 try add_int(writer, 8); // 4
// validity? // validity?
@ -85,3 +90,13 @@ pub fn add_qvariantmap(writer: anytype, allocator: *std.mem.Allocator, map: std.
try writer.writeAll(data.items); try writer.writeAll(data.items);
return; return;
} }
pub fn add_message(writer: anytype, allocator: *std.mem.Allocator, map: std.StringHashMap(qvar.QVariant)) (@TypeOf(writer).Error || std.os.WriteError || error{OutOfMemory})!void {
var data = std.ArrayList(u8).init(allocator);
try add_qvariantmap(data.writer(), allocator, map);
try add_int(writer, @intCast(u32, data.items.len) * 8);
try writer.writeAll(data.items);
return;
}