Archived
3
0

IPC::Message#from_json and #to_json

This commit is contained in:
Philippe PITTOLI 2020-02-03 23:50:13 +01:00
parent 07f2099553
commit 25eb62a8f9
2 changed files with 66 additions and 38 deletions

View File

@ -41,8 +41,11 @@ class IPC::Connection
@connection.fd @connection.fd
end end
def send(type : UInt8, payload : Bytes) def send(utype : UInt8, payload : Bytes)
message = LibIPC::Message.new type: LibIPC::MessageType::Data.to_u8, user_type: type, length: payload.bytesize, payload: payload.to_unsafe message = LibIPC::Message.new type: LibIPC::MessageType::Data.to_u8,
user_type: utype,
length: payload.bytesize,
payload: payload.to_unsafe
r = LibIPC.ipc_write(self.pointer, pointerof(message)) r = LibIPC.ipc_write(self.pointer, pointerof(message))
if r.error_code != 0 if r.error_code != 0
@ -51,12 +54,12 @@ class IPC::Connection
end end
end end
def send(type : UInt8, payload : String) def send(utype : UInt8, payload : String)
send(type, Bytes.new(payload.to_unsafe, payload.bytesize)) send(utype, Bytes.new(payload.to_unsafe, payload.bytesize))
end end
def send(message : IPC::Message) def send(message : IPC::Message)
send(message.type, message.payload) send(message.utype, message.payload)
end end
def read def read

View File

@ -1,7 +1,63 @@
require "./lowlevel" require "./lowlevel"
require "json"
# JSON is currently used for messages over websockets
# At some point, this will be replaced by the CBOR format
class IPC::Message class IPC::Message
property mtype : UInt8 # libipc message type
property utype : UInt8 # libipc user message type
property payload : Bytes
struct JSONMessage
include JSON::Serializable
property mtype : UInt8 = 1 # libipc message type
property utype : UInt8 # libipc user message type
property payload : String
def initialize(@utype, @payload, @mtype = 1)
end
end
def self.from_json (str : String)
jsonmessage = JSONMessage.from_json str
IPC::Message.new jsonmessage.mtype, jsonmessage.utype, jsonmessage.payload
end
def to_json
JSONMessage.new(@utype, String.new(@payload), @mtype).to_json
end
def initialize(message : Pointer(LibIPC::Message))
if message.null?
@mtype = LibIPC::MessageType::Error.to_u8
@utype = 0
@payload = Bytes.new "".to_unsafe, 0
else
m = message.value
@mtype = m.type
@utype = m.user_type
@payload = Bytes.new m.payload, m.length
end
end
def initialize(message : LibIPC::Message)
initialize pointerof(message)
end
def initialize(mtype, utype, payload : Bytes)
@mtype = mtype.to_u8
@utype = utype
@payload = payload
end
def initialize(mtype, utype, payload : String)
initialize(mtype, utype, Bytes.new(payload.to_unsafe, payload.bytesize))
end
def self.to_packet (user_type : Int, message : String) def self.to_packet (user_type : Int, message : String)
payload = Bytes.new (6 + message.to_slice.size) payload = Bytes.new (6 + message.to_slice.size)
@ -16,43 +72,12 @@ class IPC::Message
return payload return payload
end end
getter mtype : UInt8 # libipc message type
property type : UInt8 # libipc user message type
property payload : Bytes
def initialize(message : Pointer(LibIPC::Message))
if message.null?
@mtype = LibIPC::MessageType::Error.to_u8
@type = 0
@payload = Bytes.new "".to_unsafe, 0
else
m = message.value
@mtype = m.type
@type = m.user_type
@payload = Bytes.new m.payload, m.length
end
end
def initialize(message : LibIPC::Message)
initialize pointerof(message)
end
def initialize(mtype, type, payload : Bytes)
@mtype = mtype.to_u8
@type = type
@payload = payload
end
def initialize(mtype, type, payload : String)
initialize(mtype, type, Bytes.new(payload.to_unsafe, payload.bytesize))
end
def to_packet def to_packet
IPC::Message.to_packet @type, String.new(@payload) IPC::Message.to_packet @utype, String.new(@payload)
end end
def to_s def to_s
"(internal) type #{@mtype}, (user) type #{@type}, payload #{String.new @payload}" "(internal) utype #{@mtype}, (user) utype #{@utype}, payload #{String.new @payload}"
end end
end end