2011-12-06 23:06:23 +01:00
|
|
|
WeeChat Relay Protocol
|
|
|
|
======================
|
|
|
|
Sébastien Helleu <flashcode@flashtux.org>
|
|
|
|
|
|
|
|
|
|
|
|
This document is the specification of WeeChat relay protocol: the protocol used
|
2011-12-17 17:39:19 +01:00
|
|
|
to relay WeeChat data to clients, which are mostly remote interfaces.
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
|
|
|
|
[[introduction]]
|
|
|
|
Introduction
|
|
|
|
------------
|
|
|
|
|
|
|
|
[[terminology]]
|
|
|
|
Terminology
|
|
|
|
~~~~~~~~~~~
|
|
|
|
|
|
|
|
The following terms are used in this document:
|
|
|
|
|
|
|
|
* 'relay': this is the WeeChat with relay plugin, which acts as "server" and
|
|
|
|
allows 'clients' to connect
|
|
|
|
* 'client': this is another software, connected to 'relay' via a network
|
2011-12-17 17:39:19 +01:00
|
|
|
connection; in most cases, this 'client' is a remote interface
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
[[network_diagram]]
|
|
|
|
Network diagram
|
|
|
|
~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
The 'clients' are connected to 'relay' like shown in this diagram:
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌──────────┐
|
|
|
|
┌────────┐ ┌─────┤ client 1 │ Workstation (Linux, BSD, Mac OS X, Windows, ...)
|
|
|
|
│ irc │◄───┐ ╔═════════════╤═══════╗ │ └──────────┘
|
|
|
|
└────────┘ └───╢ │ ║◄─────┘ ┌──────────┐
|
|
|
|
...... ║ WeeChat │ Relay ║◄───────────┤ client 2 │ Mobile device (Android, iPhone, ...)
|
|
|
|
┌────────┐ ┌───╢ │ ║◄─────┐ └──────────┘
|
|
|
|
│ jabber │◄───┘ ╚═════════════╧═══════╝ │ ......
|
|
|
|
└────────┘ │ ┌──────────┐
|
|
|
|
...... └─────┤ client N │ Other devices
|
|
|
|
└──────────┘
|
|
|
|
|
|
|
|
|
|
|
|
└─────────────┘ └─────────────────────┘╘══════════╛└──────────────────────┘
|
2011-12-17 17:39:19 +01:00
|
|
|
network servers ncurses interface relay remote interfaces
|
2011-12-06 23:06:23 +01:00
|
|
|
protocol
|
|
|
|
........................................
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
All clients here are clients using 'weechat' protocol in 'relay' plugin. The
|
|
|
|
'relay' plugin also allows IRC clients, then 'relay' plugin acts as an
|
|
|
|
'irc proxy' (not described in this document).
|
|
|
|
|
|
|
|
[[protocol_generalities]]
|
|
|
|
Protocol generalities
|
|
|
|
---------------------
|
|
|
|
|
|
|
|
* Connections from 'client' to 'relay' are made using TCP sockets on IP/port
|
|
|
|
used by 'relay' plugin to listen to new connections
|
|
|
|
(option 'relay.port.weechat' in WeeChat).
|
|
|
|
* Number of 'clients' is not limited.
|
|
|
|
* Each 'client' is independent from other clients.
|
|
|
|
* Messages from 'client' to 'relay' are called 'commands', they are sent as text
|
|
|
|
(a string).
|
|
|
|
* Messages from 'relay' to 'client' are called 'messages', they are sent as
|
|
|
|
binary data.
|
|
|
|
|
|
|
|
[[commands]]
|
|
|
|
Commands (client → relay)
|
|
|
|
-------------------------
|
|
|
|
|
|
|
|
Commands have format: "(id) command arguments\n".
|
|
|
|
|
|
|
|
Fields are:
|
|
|
|
|
|
|
|
* 'id': optional message identifier that will be sent in answer from 'relay';
|
|
|
|
it must be enclosed in parentheses, and must not start with an underscore
|
|
|
|
("_") (ids starting with underscore are reserved for WeeChat 'event' messages)
|
|
|
|
* 'command': a command (see table below)
|
|
|
|
* 'arguments': optional arguments for command (many arguments are separated by
|
|
|
|
spaces)
|
|
|
|
|
|
|
|
List of available commands (detail in next chapters):
|
|
|
|
|
|
|
|
[width="60%",cols="^3m,14",options="header"]
|
|
|
|
|=====================================================
|
|
|
|
| Command | Description
|
|
|
|
| init | Initialize connection with 'relay'
|
|
|
|
| hdata | Request hdata
|
|
|
|
| info | Request info
|
|
|
|
| infolist | Request infolist
|
|
|
|
| nicklist | Request nicklist
|
|
|
|
| input | Send data to a buffer (text or command)
|
2011-12-17 17:39:19 +01:00
|
|
|
| sync | Synchronize buffer(s) (get updates for buffer(s))
|
|
|
|
| desync | Desynchronize buffer(s) (stop updates for buffer(s))
|
2011-12-06 23:06:23 +01:00
|
|
|
| quit | Disconnect from 'relay'
|
|
|
|
|=====================================================
|
|
|
|
|
|
|
|
[[command_init]]
|
|
|
|
init
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
Initialize connection with 'relay'. This must be first command sent to 'relay'.
|
|
|
|
If not sent, 'relay' will close connection on first command received, without
|
|
|
|
warning.
|
|
|
|
|
|
|
|
Syntax:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
init [<option>=<value>,[<option>=<value>,...]]
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
* 'option': one of following options:
|
|
|
|
** 'password' (required): password used to authenticate on 'relay' (option
|
|
|
|
'relay.network.password' in WeeChat)
|
|
|
|
** 'compression' (optional): compression type:
|
|
|
|
*** 'gzip': enable gzip compression for messages sent by 'relay'
|
|
|
|
*** 'off': disable compression
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
Compression 'gzip' is enabled by default if 'relay' supports gzip compression.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
init password=mypass,compression=gzip
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
[[command_hdata]]
|
|
|
|
hdata
|
|
|
|
~~~~~
|
|
|
|
|
|
|
|
Request hdata.
|
|
|
|
|
|
|
|
Syntax:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
(id) hdata <path> [<keys>]
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
* 'path': path to a hdata, with format: "hdata:pointer/var/var/.../var", the
|
|
|
|
last var is the hdata returned:
|
|
|
|
** 'hdata': name of hdata
|
|
|
|
** 'pointer': pointer ("0x12345") or list name (for example: "gui_buffers")
|
|
|
|
(count allowed, see below)
|
|
|
|
** 'var': a variable name in parent hdata (previous name in path)
|
|
|
|
(count allowed, see below)
|
|
|
|
* 'keys': comma-separated list of keys to return in hdata returned (if not
|
|
|
|
specified, all keys are returned, which is not recommended on large hdata
|
|
|
|
structures)
|
|
|
|
|
|
|
|
A count is allowed after pointer and variables, with format "(N)". Possible
|
|
|
|
values are:
|
|
|
|
|
|
|
|
* positive number: iterate using next element, N times
|
|
|
|
* negative number: iterate using previous element, N times
|
|
|
|
* '*': iterate using next element, until end of list
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
# request all buffers, hdata of type "buffer" is returned
|
|
|
|
# keys number and name are returned for each buffer
|
|
|
|
hdata buffer:gui_buffers(*) number,name
|
|
|
|
|
|
|
|
# request all lines of all buffers, hdata of type "line_data" is returned
|
|
|
|
# all keys are returned
|
|
|
|
hdata buffer:gui_buffers(*)/lines/first_line(*)/data
|
|
|
|
|
|
|
|
# request full_name of first buffer
|
|
|
|
hdata buffer:gui_buffers full_name
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
[[command_info]]
|
|
|
|
info
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
Request info.
|
|
|
|
|
|
|
|
Syntax:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
(id) info <name>
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
* 'name': name of info to retrieve
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
info version
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
[[command_infolist]]
|
|
|
|
infolist
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
Request infolist.
|
|
|
|
|
|
|
|
[IMPORTANT]
|
|
|
|
Content of infolist is a duplication of actual data. Wherever possible, use
|
|
|
|
command <<command_hdata,hdata>>, which is direct access to data (it is
|
|
|
|
faster, uses less memory and returns smaller objects in message).
|
|
|
|
|
|
|
|
Syntax:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
(id) infolist <name> <arguments>
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
* 'name': name of infolist to retrieve
|
|
|
|
* 'arguments': arguments for infolist
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
infolist buffer
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
[[command_nicklist]]
|
|
|
|
nicklist
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
Request nicklist, for one or all buffers.
|
|
|
|
|
|
|
|
Syntax:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
(id) nicklist [<buffer>]
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
* 'buffer': pointer ('0x12345') or full name of buffer (for example:
|
|
|
|
'core.weechat' or 'irc.freenode.#weechat')
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
# request nicklist for all buffers
|
|
|
|
nicklist
|
|
|
|
|
|
|
|
# request nicklist for irc.freenode.#weechat
|
|
|
|
nicklist irc.freenode.#weechat
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
[[command_input]]
|
|
|
|
input
|
|
|
|
~~~~~
|
|
|
|
|
|
|
|
Send data to a buffer.
|
|
|
|
|
|
|
|
Syntax:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
input <buffer> <data>
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
* 'buffer': pointer ('0x12345') or full name of buffer (for example:
|
|
|
|
'core.weechat' or 'irc.freenode.#weechat')
|
|
|
|
* 'data': data to send to buffer: if beginning by '/', this will be executed as
|
|
|
|
a command on buffer, otherwise text is sent as input of buffer
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
input core.weechat /help filter
|
|
|
|
input irc.freenode.#weechat hello guys!
|
|
|
|
----------------------------------------
|
|
|
|
|
2011-12-17 17:39:19 +01:00
|
|
|
[[command_sync]]
|
|
|
|
sync
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
Synchronize one or more buffers, to get updates.
|
|
|
|
|
|
|
|
Syntax:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
sync [<buffer>[,<buffer>...] <options>]
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
* 'buffer': pointer ('0x12345') or full name of buffer (for example:
|
|
|
|
'core.weechat' or 'irc.freenode.#weechat'); name '*' can be used to
|
|
|
|
specify all buffers
|
|
|
|
* 'options': one of following keywords, separated by commas (default is
|
|
|
|
'buffer,nicklist'):
|
|
|
|
** 'buffer': receive signals about buffer (new lines, buffer renamed/moved/...)
|
|
|
|
** 'nicklist': receive nicklist after changes
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
# synchronize all buffers with nicklist (the 3 commands are equivalent)
|
|
|
|
sync
|
|
|
|
sync *
|
|
|
|
sync * buffer,nicklist
|
|
|
|
|
|
|
|
# synchronize core buffer
|
|
|
|
sync core.buffer
|
|
|
|
|
|
|
|
# synchronize #weechat channel, without nicklist
|
|
|
|
sync irc.freenode.#weechat buffer
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
[[command_desync]]
|
|
|
|
desync
|
|
|
|
~~~~~~
|
|
|
|
|
|
|
|
Desynchronize one or more buffers, to stop updates.
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
This will remove 'options' for buffers. If some options are still active for
|
|
|
|
buffers, the client will still receive updates for buffers.
|
|
|
|
|
|
|
|
Syntax:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
desync [<buffer>[,<buffer>...] <options>]
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
* 'buffer': pointer ('0x12345') or full name of buffer (for example:
|
|
|
|
'core.weechat' or 'irc.freenode.#weechat'); name '*' can be used to
|
|
|
|
specify all buffers
|
|
|
|
* 'options': one of following keywords, separated by commas (default is
|
|
|
|
'buffer,nicklist'):
|
|
|
|
** 'buffer': receive signals about buffer (new lines, buffer renamed/moved...)
|
|
|
|
** 'nicklist': receive nicklist after changes
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
# desynchronize all buffers
|
|
|
|
desync
|
|
|
|
|
|
|
|
# desynchronize nicklist for #weechat channel (keep buffer updates)
|
|
|
|
desync irc.freenode.#weechat nicklist
|
|
|
|
|
|
|
|
# desynchronize #weechat channel
|
|
|
|
desync irc.freenode.#weechat
|
|
|
|
----------------------------------------
|
|
|
|
|
2011-12-06 23:06:23 +01:00
|
|
|
[[command_quit]]
|
|
|
|
quit
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
Disconnect from 'relay'.
|
|
|
|
|
|
|
|
Syntax:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
quit
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
quit
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
[[messages]]
|
|
|
|
Messages (relay → client)
|
|
|
|
-------------------------
|
|
|
|
|
|
|
|
Messages are sent as binary data, using following format (with size in bytes):
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌────────╥─────────────╥────╥────────┬──────────╥───────╥────────┬──────────┐
|
|
|
|
│ length ║ compression ║ id ║ type 1 │ object 1 ║ ... ║ type N │ object N │
|
|
|
|
└────────╨─────────────╨────╨────────┴──────────╨───────╨────────┴──────────┘
|
|
|
|
└──────┘ └───────────┘ └──┘ └──────┘ └────────┘ └──────┘ └────────┘
|
|
|
|
4 1 ?? 3 ?? 3 ??
|
|
|
|
└────────────────────┘ └──────────────────────────────────────────────────┘
|
|
|
|
header (5) compressed data (??)
|
|
|
|
└─────────────────────────────────────────────────────────────────────────┘
|
|
|
|
'length' bytes
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
* 'length' (unsigned integer): number of bytes of whole message (including
|
|
|
|
this length)
|
|
|
|
* 'compression' (byte): flag:
|
|
|
|
** '0x00': following data is not compressed
|
|
|
|
** '0x01': following data is gzip-compressed
|
|
|
|
* 'id' (string): identifier sent by client (before command name); it can be
|
|
|
|
empty (string with zero length and no content) if no identifier was given in
|
|
|
|
command
|
|
|
|
* 'type' (3 chars): a type: 3 letters (see table below)
|
|
|
|
* 'object': an object (see table below)
|
|
|
|
|
|
|
|
[[message_compression]]
|
|
|
|
Compression
|
|
|
|
~~~~~~~~~~~
|
|
|
|
|
|
|
|
If flag 'compression' is equal to 0x01, then *all* data after is compressed
|
|
|
|
with gzip, and therefore must be uncompressed before being processed.
|
|
|
|
|
|
|
|
[[message_identifier]]
|
|
|
|
Identifier
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
|
|
|
There are two different identifiers ('id'):
|
|
|
|
|
|
|
|
* 'id' sent by 'client': 'relay' will answer with same 'id' in its answer
|
|
|
|
* 'id' of an event: on some events, 'relay' will send message to 'client' using
|
2013-01-07 10:31:32 +01:00
|
|
|
a specific 'id', beginning with underscore (see table below)
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
WeeChat reserved identifiers:
|
|
|
|
|
2012-05-17 11:24:59 +02:00
|
|
|
[width="100%",cols="5m,5,3,10,8",options="header"]
|
2011-12-06 23:06:23 +01:00
|
|
|
|=====================================================
|
2011-12-25 12:21:46 +01:00
|
|
|
| Identifier | Description | Hdata type | Hdata content
|
2012-05-17 11:24:59 +02:00
|
|
|
| Recommended action in client
|
2011-12-17 17:39:19 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _buffer_opened | Buffer opened | buffer |
|
2011-12-17 17:39:19 +01:00
|
|
|
'number' (integer), 'full_name' (string), 'short_name' (string), +
|
2011-12-20 10:51:01 +01:00
|
|
|
'nicklist' (integer), 'title' (string), 'local_variables' (hashtable), +
|
2012-05-17 11:24:59 +02:00
|
|
|
'prev_buffer' (pointer), 'next_buffer' (pointer) |
|
|
|
|
Open buffer
|
2011-12-17 17:39:19 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _buffer_type_changed | Type of buffer changed | buffer |
|
|
|
|
'number' (integer), 'full_name' (string), +
|
2012-05-17 11:24:59 +02:00
|
|
|
'type' (integer) |
|
|
|
|
Change type of buffer
|
2011-12-25 12:21:46 +01:00
|
|
|
|
|
|
|
| _buffer_moved | Buffer moved | buffer |
|
2011-12-17 17:39:19 +01:00
|
|
|
'number' (integer), 'full_name' (string), +
|
2012-05-17 11:24:59 +02:00
|
|
|
'prev_buffer' (pointer), 'next_buffer' (pointer) |
|
|
|
|
Move buffer
|
2011-12-17 17:39:19 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _buffer_merged | Buffer merged | buffer |
|
2011-12-17 17:39:19 +01:00
|
|
|
'number' (integer), 'full_name' (string), +
|
2012-05-17 11:24:59 +02:00
|
|
|
'prev_buffer' (pointer), 'next_buffer' (pointer) |
|
|
|
|
Merge buffer
|
2011-12-17 17:39:19 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _buffer_unmerged | Buffer unmerged | buffer |
|
2011-12-25 11:44:45 +01:00
|
|
|
'number' (integer), 'full_name' (string), +
|
2012-05-17 11:24:59 +02:00
|
|
|
'prev_buffer' (pointer), 'next_buffer' (pointer) |
|
|
|
|
Unmerge buffer
|
2011-12-25 11:44:45 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _buffer_renamed | Buffer renamed | buffer |
|
2011-12-20 10:51:01 +01:00
|
|
|
'number' (integer), 'full_name' (string), 'short_name' (string),
|
2012-05-17 11:24:59 +02:00
|
|
|
'local_variables' (hashtable) |
|
|
|
|
Rename buffer
|
2011-12-17 17:39:19 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _buffer_title_changed | Title of buffer changed | buffer |
|
2012-05-17 11:24:59 +02:00
|
|
|
'number' (integer), 'full_name' (string), 'title' (string) |
|
|
|
|
Change title of buffer
|
2011-12-17 17:39:19 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _buffer_localvar_added | Local variable added | buffer |
|
2012-05-17 11:24:59 +02:00
|
|
|
'number' (integer), 'full_name' (string), 'local_variables' (hashtable) |
|
|
|
|
Add local variable in buffer
|
2011-12-20 10:51:01 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _buffer_localvar_changed | Local variable changed | buffer |
|
2012-05-17 11:24:59 +02:00
|
|
|
'number' (integer), 'full_name' (string), 'local_variables' (hashtable) |
|
2013-01-07 10:31:32 +01:00
|
|
|
Change local variable in buffer
|
2011-12-20 10:51:01 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _buffer_localvar_removed | Local variable removed | buffer |
|
2012-05-17 11:24:59 +02:00
|
|
|
'number' (integer), 'full_name' (string), 'local_variables' (hashtable) |
|
|
|
|
Remove local variable from buffer
|
2011-12-20 10:51:01 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _buffer_line_added | Line added in buffer | line |
|
2012-03-06 12:05:33 +01:00
|
|
|
'buffer' (pointer), 'date' (time), 'date_printed' (time), 'displayed' (char),
|
2012-07-23 12:02:43 +02:00
|
|
|
'highlight' (char), 'tags_array' (array of strings), 'prefix' (string),
|
|
|
|
'message' (string) |
|
2012-05-17 11:24:59 +02:00
|
|
|
Display line in buffer
|
2011-12-17 17:39:19 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _buffer_closing | Buffer closing | buffer |
|
2012-05-17 11:24:59 +02:00
|
|
|
'number' (integer), 'full_name' (string) |
|
|
|
|
Close buffer
|
2011-12-17 17:39:19 +01:00
|
|
|
|
2011-12-25 12:21:46 +01:00
|
|
|
| _nicklist | Nicklist for a buffer | nicklist_item |
|
2011-12-17 17:39:19 +01:00
|
|
|
'group' (char), 'visible' (char), 'level' (integer), +
|
|
|
|
'name' (string), 'color' (string), +
|
2012-05-17 11:24:59 +02:00
|
|
|
'prefix' (string), 'prefix_color' (string) |
|
|
|
|
Update nicklist
|
|
|
|
|
2012-05-17 11:51:55 +02:00
|
|
|
| _upgrade | WeeChat is upgrading +
|
|
|
|
(_new in version 0.3.8_) | (empty) |
|
2012-05-17 11:24:59 +02:00
|
|
|
(empty) |
|
|
|
|
Desync from WeeChat (send command 'desync')
|
|
|
|
|
2012-05-17 11:51:55 +02:00
|
|
|
| _upgrade_ended | Upgrade of WeeChat done +
|
|
|
|
(_new in version 0.3.8_) | (empty) |
|
2012-05-17 11:24:59 +02:00
|
|
|
(empty) |
|
|
|
|
Resync with WeeChat (resend all commands sent on startup after the 'init')
|
2011-12-06 23:06:23 +01:00
|
|
|
|=====================================================
|
|
|
|
|
|
|
|
[[message_objects]]
|
|
|
|
Objects
|
|
|
|
~~~~~~~
|
|
|
|
|
|
|
|
Objects are identified by 3 letters, called 'type'. Following types are
|
|
|
|
available:
|
|
|
|
|
2011-12-17 17:39:19 +01:00
|
|
|
[width="60%",cols="^2m,5,7",options="header"]
|
2011-12-06 23:06:23 +01:00
|
|
|
|=====================================================
|
|
|
|
| Type | Value | Length
|
|
|
|
| chr | Signed char | 1 byte
|
|
|
|
| int | Signed integer | 4 bytes
|
|
|
|
| lon | Signed long integer | 1 byte + length of long as string
|
|
|
|
| str | String | 4 bytes + length of string (without final '\0')
|
|
|
|
| buf | Buffer of bytes | 4 bytes + length of data
|
|
|
|
| ptr | Pointer | 1 byte + length of pointer as string
|
|
|
|
| tim | Time | 1 byte + length of time as string
|
2011-12-20 10:51:01 +01:00
|
|
|
| htb | Hashtable | Variable
|
2011-12-06 23:06:23 +01:00
|
|
|
| hda | Hdata content | Variable
|
|
|
|
| inf | Info: name + content | Variable
|
2011-12-20 10:51:01 +01:00
|
|
|
| inl | Infolist content | Variable
|
2012-07-20 18:18:37 +02:00
|
|
|
| arr | Array of values | 3 bytes (type) + number of items + data
|
2011-12-06 23:06:23 +01:00
|
|
|
|=====================================================
|
|
|
|
|
|
|
|
[[object_char]]
|
|
|
|
Char
|
|
|
|
^^^^
|
|
|
|
|
|
|
|
A signed char is 1 byte.
|
|
|
|
|
2011-12-20 10:51:01 +01:00
|
|
|
Example:
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌────┐
|
|
|
|
│ 41 │ ────► 65 (0x41: "A")
|
|
|
|
└────┘
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
[[object_integer]]
|
|
|
|
Integer
|
|
|
|
^^^^^^^
|
|
|
|
|
|
|
|
A signed integer is 4 bytes, encoded as big-endian format (most significant byte
|
|
|
|
first).
|
|
|
|
|
2011-12-20 10:51:01 +01:00
|
|
|
Example:
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌────┬────┬────┬────┐
|
|
|
|
│ 00 │ 00 │ 01 │ 04 │ ────► 260 (0x104)
|
|
|
|
└────┴────┴────┴────┘
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
[[object_long_integer]]
|
|
|
|
Long integer
|
|
|
|
^^^^^^^^^^^^
|
|
|
|
|
|
|
|
A signed long integer is encoded as a string, with length on one byte.
|
|
|
|
|
2011-12-20 10:51:01 +01:00
|
|
|
Example:
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌────╥────┬────┬────┐
|
|
|
|
│ 03 ║ 32 │ 36 │ 30 │ ────► 260
|
|
|
|
└────╨────┴────┴────┘
|
|
|
|
└──┘ └────────────┘
|
|
|
|
length '2' '6' '0'
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
[[object_string]]
|
|
|
|
String
|
|
|
|
^^^^^^
|
|
|
|
|
|
|
|
A string is a length (integer on 4 bytes) + content of string (without final '\0').
|
|
|
|
|
2011-12-20 10:51:01 +01:00
|
|
|
Example:
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌────┬────┬────┬────╥────┬────┬────┬────┬────┐
|
|
|
|
│ 00 │ 00 │ 00 │ 05 ║ 68 │ 65 │ 6C │ 6C │ 6F │ ────► "hello"
|
|
|
|
└────┴────┴────┴────╨────┴────┴────┴────┴────┘
|
|
|
|
└─────────────────┘ └──────────────────────┘
|
|
|
|
length 'h' 'e' 'l' 'l' 'o'
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
An empty string has a length of zero:
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌────┬────┬────┬────┐
|
|
|
|
│ 00 │ 00 │ 00 │ 00 │ ────► ""
|
|
|
|
└────┴────┴────┴────┘
|
|
|
|
└─────────────────┘
|
|
|
|
length
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
A 'NULL' string (NULL pointer in C) has a length of -1:
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌────┬────┬────┬────┐
|
|
|
|
│ FF │ FF │ FF │ FF │ ────► NULL
|
|
|
|
└────┴────┴────┴────┘
|
|
|
|
└─────────────────┘
|
|
|
|
length
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
[[object_buffer]]
|
|
|
|
Buffer
|
|
|
|
^^^^^^
|
|
|
|
|
|
|
|
Same format as <<object_string,string>>; content is just an array of bytes.
|
|
|
|
|
|
|
|
[[object_pointer]]
|
|
|
|
Pointer
|
|
|
|
^^^^^^^
|
|
|
|
|
|
|
|
A pointer is encoded as string (hex), with length on one byte.
|
|
|
|
|
2011-12-20 10:51:01 +01:00
|
|
|
Example:
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
.......................................
|
2011-12-20 10:51:01 +01:00
|
|
|
┌────╥────┬────┬────┬────┬────┬────┬────┬────┬────┐
|
|
|
|
│ 09 ║ 31 │ 61 │ 32 │ 62 │ 33 │ 63 │ 34 │ 64 │ 35 │ ────► 0x1a2b3c4d5
|
|
|
|
└────╨────┴────┴────┴────┴────┴────┴────┴────┴────┘
|
2011-12-06 23:06:23 +01:00
|
|
|
└──┘ └──────────────────────────────────────────┘
|
|
|
|
length '1' 'a' '2' 'b' '3' 'c' '4' 'd' '5'
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
A 'NULL' pointer has value 0:
|
|
|
|
|
|
|
|
.......................................
|
2011-12-20 10:51:01 +01:00
|
|
|
┌────╥────┐
|
|
|
|
│ 01 ║ 00 │ ────► NULL (0x0)
|
|
|
|
└────╨────┘
|
2011-12-06 23:06:23 +01:00
|
|
|
└──┘ └──┘
|
|
|
|
length 0
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
[[object_time]]
|
|
|
|
Time
|
|
|
|
^^^^
|
|
|
|
|
|
|
|
A time (number of seconds) is encoded as a string, with length on one byte.
|
|
|
|
|
2011-12-20 10:51:01 +01:00
|
|
|
Example:
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌────╥────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
|
|
|
|
│ 0A ║ 31 │ 33 │ 32 │ 31 │ 39 │ 39 │ 33 │ 34 │ 35 │ 36 │ ────► 1321993456
|
|
|
|
└────╨────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
|
|
|
|
└──┘ └───────────────────────────────────────────────┘
|
|
|
|
length '1' '3' '2' '1' '9' '9' '3' '4' '5' '6'
|
|
|
|
.......................................
|
|
|
|
|
2011-12-20 10:51:01 +01:00
|
|
|
[[object_hashtable]]
|
|
|
|
Hashtable
|
|
|
|
^^^^^^^^^
|
|
|
|
|
|
|
|
A hashtable contains type for keys, type for values, number of items in
|
|
|
|
hashtable (integer on 4 bytes), and then keys and values of items.
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌───────────┬─────────────┬───────╥───────┬─────────╥─────╥───────┬─────────┐
|
|
|
|
│ type_keys │ type_values │ count ║ key 1 │ value 1 ║ ... ║ key N │ value N │
|
|
|
|
└───────────┴─────────────┴───────╨───────┴─────────╨─────╨───────┴─────────┘
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌─────┬─────┬───╥──────┬─────╥──────┬─────┐
|
|
|
|
│ str │ str │ 2 ║ key1 │ abc ║ key2 │ def │ ────► { 'key1' => 'abc', 'key2' => 'def' }
|
|
|
|
└─────┴─────┴───╨──────┴─────╨──────┴─────┘
|
|
|
|
└───┘ └───┘ └─┘ └──────────┘ └──────────┘
|
|
|
|
type type count item 1 item 2
|
|
|
|
keys values
|
|
|
|
.......................................
|
|
|
|
|
2011-12-06 23:06:23 +01:00
|
|
|
[[object_hdata]]
|
|
|
|
Hdata
|
|
|
|
^^^^^
|
|
|
|
|
|
|
|
A 'hdata' contains a path with hdata names, list of keys, number of set of
|
|
|
|
objects, and then set of objects (path with pointers, then objects).
|
|
|
|
|
|
|
|
.......................................
|
2011-12-20 10:51:01 +01:00
|
|
|
┌────────┬──────┬───────╥────────┬─────────────────────╥────────┬─────────────────────╥─────┐
|
|
|
|
│ h-path │ keys │ count ║ p-path │ value 1 ... value N ║ p-path │ value 1 ... value N ║ ... │
|
|
|
|
└────────┴──────┴───────╨────────┴─────────────────────╨────────┴─────────────────────╨─────┘
|
2011-12-06 23:06:23 +01:00
|
|
|
.......................................
|
|
|
|
|
|
|
|
* 'name' (string): name of hdata ('buffer', 'window', 'bar', ...)
|
|
|
|
* 'h-path' (string): path used to reach hdata (example:
|
|
|
|
'buffer/lines/line/line_data'); the last element in path is the hdata returned
|
|
|
|
* 'keys' (string): string with list of 'key:type' (separated by commas),
|
|
|
|
example: 'number:int,name:str'
|
|
|
|
* 'count' (integer): number of set of objects
|
|
|
|
* 'p-path': path with pointers to objects (number of pointers here is number of
|
|
|
|
elements in path)
|
|
|
|
* 'values': list of values (number of values is number of keys returned for
|
|
|
|
hdata)
|
|
|
|
|
|
|
|
Example of hdata with 2 buffers (weechat core and freenode server) and two keys
|
|
|
|
('number' and 'full_name'):
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
# command
|
|
|
|
hdata buffer:gui_buffers(*) number,full_name
|
|
|
|
|
|
|
|
# response
|
2011-12-20 10:51:01 +01:00
|
|
|
┌────────┬──────────────────────────┬───╥─────────┬───┬──────────────╥─────────┬───┬────────────────────┐
|
|
|
|
│ buffer │ number:int,full_name:str │ 2 ║ 0x12345 │ 1 │ core.weechat ║ 0x6789a │ 2 │irc.server.freenode │
|
|
|
|
└────────┴──────────────────────────┴───╨─────────┴───┴──────────────╨─────────┴───┴────────────────────┘
|
|
|
|
└──────┘ └────────────────────────┘ └─┘ └──────────────────────────┘ └────────────────────────────────┘
|
|
|
|
hpath keys count buffer 1 buffer 2
|
2011-12-06 23:06:23 +01:00
|
|
|
.......................................
|
|
|
|
|
|
|
|
Example of hdata with lines of core buffer:
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
# command
|
|
|
|
hdata buffer:gui_buffers(*)/lines/first_line(*)/data
|
|
|
|
|
|
|
|
# response
|
2011-12-20 10:51:01 +01:00
|
|
|
┌─────────────────────────────┬─────┬────╥──
|
|
|
|
│ buffer/lines/line/line_data │ ... │ 50 ║ ...
|
|
|
|
└─────────────────────────────┴─────┴────╨──
|
|
|
|
└───────────────────────────┘ └───┘ └──┘
|
|
|
|
h-path (hdata names) keys count
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
──╥───────────┬───────────┬───────────┬───────╥───────────┬───────────┬───────────┬───────╥──────────────┐
|
|
|
|
... ║ 0x23cf970 │ 0x23cfb60 │ 0x23d5f40 │ ..... ║ 0x23cf970 │ 0x23cfb60 │ 0x23d6110 │ ..... ║ ............ │
|
|
|
|
──╨───────────┴───────────┴───────────┴───────╨───────────┴───────────┴───────────┴───────╨──────────────┘
|
|
|
|
└─────────────────────────────────┘ └─────┘ └─────────────────────────────────┘ └─────┘
|
|
|
|
p-path (pointers) objects p-path (pointers) objects
|
|
|
|
└─────────────────────────────────────────┘ └─────────────────────────────────────────┘ └────────────┘
|
|
|
|
line 1 line 2 lines 3-50
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
Example of hdata with nicklist:
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
# command
|
|
|
|
nicklist
|
|
|
|
|
|
|
|
# response
|
2011-12-20 10:51:01 +01:00
|
|
|
┌───────────────────┬────────────────────────────────────────────────────────────────────────────────┬────╥──
|
|
|
|
│ buffer/nick_group │ group:chr,visible:chr,name:str,color:str,prefix:str,prefix_color:str,level:int │ 12 ║ ...
|
|
|
|
└───────────────────┴────────────────────────────────────────────────────────────────────────────────┴────╨──
|
|
|
|
└─────────────────┘ └──────────────────────────────────────────────────────────────────────────────┘ └──┘
|
|
|
|
h-path keys count
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
──╥─────────┬─────────┬───┬───┬──────┬─┬─┬─┬───╥─────────┬─────────┬───┬───┬───────┬─┬─┬─┬───╥──
|
|
|
|
... ║ 0x12345 │ 0x6789a │ 1 │ 0 │ root │ │ │ │ 0 ║ 0x123cf │ 0x678d4 │ 1 │ 0 │ 000|o │ │ │ │ 1 ║ ...
|
|
|
|
──╨─────────┴─────────┴───┴───┴──────┴─┴─┴─┴───╨─────────┴─────────┴───┴───┴───────┴─┴─┴─┴───╨──
|
|
|
|
└─────────────────┘ └──────────────────────┘ └─────────────────┘ └───────────────────────┘
|
|
|
|
p-path objects p-path objects
|
|
|
|
└──────────────────────────────────────────┘ └───────────────────────────────────────────┘
|
|
|
|
group (nicklist root) group (channel ops)
|
|
|
|
|
|
|
|
──╥─────────┬─────────┬───┬───┬──────────┬──────┬───┬────────────┬───╥──
|
|
|
|
... ║ 0x128a7 │ 0x67ab2 │ 0 │ 1 │ ChanServ │ blue │ @ │ lightgreen │ 0 ║ ...
|
|
|
|
──╨─────────┴─────────┴───┴───┴──────────┴──────┴───┴────────────┴───╨──
|
|
|
|
└─────────────────┘ └────────────────────────────────────────────┘
|
|
|
|
p-path objects
|
|
|
|
└────────────────────────────────────────────────────────────────┘
|
|
|
|
nick (@ChanServ)
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
[[object_info]]
|
|
|
|
Info
|
|
|
|
^^^^
|
|
|
|
|
|
|
|
A 'info' contains a name and a value (both are strings).
|
|
|
|
|
|
|
|
.......................................
|
2011-12-20 10:51:01 +01:00
|
|
|
┌──────┬───────┐
|
|
|
|
│ name │ value │
|
|
|
|
└──────┴───────┘
|
2011-12-06 23:06:23 +01:00
|
|
|
.......................................
|
|
|
|
|
|
|
|
* 'name' (string): name of info
|
|
|
|
* 'value' (string): value
|
|
|
|
|
2013-01-07 10:31:32 +01:00
|
|
|
Example of info 'version':
|
2011-12-06 23:06:23 +01:00
|
|
|
|
|
|
|
.......................................
|
2011-12-20 10:51:01 +01:00
|
|
|
┌─────────┬───────────────────┐
|
|
|
|
│ version │ WeeChat 0.3.7-dev │
|
|
|
|
└─────────┴───────────────────┘
|
2011-12-06 23:06:23 +01:00
|
|
|
.......................................
|
|
|
|
|
|
|
|
[[object_infolist]]
|
|
|
|
Infolist
|
|
|
|
^^^^^^^^
|
|
|
|
|
|
|
|
A 'infolist' contains a name, number of items, and then items (set of
|
|
|
|
variables).
|
|
|
|
|
|
|
|
.......................................
|
2011-12-20 10:51:01 +01:00
|
|
|
┌──────┬───────╥────────╥─────╥────────┐
|
|
|
|
│ name │ count ║ item 1 ║ ... ║ item N │
|
|
|
|
└──────┴───────╨────────╨─────╨────────┘
|
2011-12-06 23:06:23 +01:00
|
|
|
.......................................
|
|
|
|
|
|
|
|
An item is:
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌───────╥────────┬────────┬─────────╥─────╥────────┬────────┬─────────┐
|
|
|
|
│ count ║ name 1 │ type 1 │ value 1 ║ ... ║ name N │ type N │ value N │
|
|
|
|
└───────╨────────┴────────┴─────────╨─────╨────────┴────────┴─────────┘
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
* 'name' (string): name of infolist ('buffer', 'window', 'bar', ...)
|
|
|
|
* 'count' (integer): number of items
|
|
|
|
* 'item':
|
|
|
|
** 'count': number of variables in item
|
|
|
|
** 'name': name of variable
|
|
|
|
** 'type': type of variable ('int', 'str', ...)
|
|
|
|
** 'value': value of variable
|
|
|
|
|
|
|
|
Example of infolist with 2 buffers (weechat core and freenode server):
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
# command
|
|
|
|
infolist buffer
|
|
|
|
|
|
|
|
# response
|
2011-12-20 10:51:01 +01:00
|
|
|
┌────────┬───╥────┬─────────┬─────┬─────────┬─────╥────┬─────────┬─────┬─────────┬─────┐
|
|
|
|
│ buffer │ 2 ║ 42 │ pointer │ ptr │ 0x12345 │ ... ║ 42 │ pointer │ ptr │ 0x6789a │ ... │
|
|
|
|
└────────┴───╨────┴─────────┴─────┴─────────┴─────╨────┴─────────┴─────┴─────────┴─────┘
|
|
|
|
└──────┘ └─┘ └──────────────────────────────────┘ └──────────────────────────────────┘
|
|
|
|
name count item 1 item 2
|
2011-12-06 23:06:23 +01:00
|
|
|
.......................................
|
|
|
|
|
2012-07-20 18:18:37 +02:00
|
|
|
[[object_array]]
|
|
|
|
Array
|
|
|
|
^^^^^
|
|
|
|
|
|
|
|
An array is a type (3 bytes) + number of items (integer on 4 bytes) + data.
|
|
|
|
|
|
|
|
Example of array with 2 strings:
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌─────╥────┬────┬────┬────╥────┬────┬────┬────╥────┬────┬────╥────┬────┬────┬────╥────┬────┐
|
|
|
|
│ str ║ 00 │ 00 │ 00 │ 02 ║ 00 │ 00 │ 00 │ 03 ║ 61 │ 62 │ 63 ║ 00 │ 00 │ 00 │ 02 ║ 64 │ 65 │ ────► { "abc", "de" }
|
|
|
|
└─────╨────┴────┴────┴────╨────┴────┴────┴────╨────┴────┴────╨────┴────┴────┴────╨────┴────┘
|
|
|
|
└───┘ └─────────────────┘ └─────────────────┘ └────────────┘ └─────────────────┘ └───────┘
|
|
|
|
type number of strings length 'a' 'b' 'c' length 'd' 'e'
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
Example of array with 3 integers:
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌─────╥────┬────┬────┬────╥────┬────┬────┬────╥────┬────┬────┬────╥────┬────┬────┬────┐
|
|
|
|
│ int ║ 00 │ 00 │ 00 │ 03 ║ 00 │ 00 │ 00 │ 7B ║ 00 │ 00 │ 01 │ C8 ║ 00 │ 00 │ 03 │ 15 │ ────► { 123, 456, 789 }
|
|
|
|
└─────╨────┴────┴────┴────╨────┴────┴────┴────╨────┴────┴────┴────╨────┴────┴────┴────┘
|
|
|
|
└───┘ └─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
|
|
type number of integers 123 (0x7B) 456 (0x1C8) 789 (0x315)
|
|
|
|
.......................................
|
|
|
|
|
|
|
|
A 'NULL' array:
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌─────╥────┬────┬────┬────┐
|
|
|
|
│ str ║ 00 │ 00 │ 00 │ 00 │ ────► NULL
|
|
|
|
└─────╨────┴────┴────┴────┘
|
|
|
|
└───┘ └─────────────────┘
|
|
|
|
type number of strings
|
|
|
|
.......................................
|
|
|
|
|
2011-12-06 23:06:23 +01:00
|
|
|
[[typical_session]]
|
|
|
|
Typical session
|
|
|
|
---------------
|
|
|
|
|
|
|
|
.......................................
|
|
|
|
┌────────┐ ┌───────┐ ┌─────────┐
|
|
|
|
│ Client ├ ─ ─ ─ ─ ─ (network) ─ ─ ─ ─ ─ ┤ Relay ├──────────────────┤ WeeChat │
|
|
|
|
└────────┘ └───────┘ └─────────┘
|
|
|
|
║ ║ ║
|
|
|
|
╟─────────────────────────────────────► ║ ║
|
|
|
|
║ open socket ║ add client ║
|
|
|
|
║ ║ ║
|
|
|
|
╟─────────────────────────────────────► ║ ║
|
|
|
|
║ cmd: init password=xxx,... ║ init/allow client ║
|
|
|
|
║ ║ ║
|
|
|
|
╟─────────────────────────────────────► ║ ║
|
|
|
|
║ cmd: hdata buffer ... ╟─────────────────────────► ║
|
2011-12-17 17:39:19 +01:00
|
|
|
║ sync ... ║ request hdata ║ read hdata values
|
2011-12-06 23:06:23 +01:00
|
|
|
║ ║ ║
|
|
|
|
║ ║ ◄─────────────────────────╢
|
|
|
|
║ ◄─────────────────────────────────────╢ hdata ║
|
|
|
|
create buffers ║ msg: hda buffer ║ ║
|
|
|
|
║ ║ ║
|
|
|
|
║ ........ ║ ........ ║
|
|
|
|
║ ║ ║
|
|
|
|
╟─────────────────────────────────────► ║ ║
|
|
|
|
║ cmd: input ... ╟─────────────────────────► ║
|
|
|
|
║ ║ send data to buffer ║ send data to buffer
|
|
|
|
║ ║ ║
|
|
|
|
║ ........ ║ ........ ║
|
|
|
|
║ ║ ║ signal received
|
|
|
|
║ ║ ◄─────────────────────────╢ (hooked by relay)
|
|
|
|
║ ◄─────────────────────────────────────╢ signal XXX ║
|
2011-12-17 17:39:19 +01:00
|
|
|
update buffers ║ msg: id: "_buffer_..." ║ ║
|
2011-12-06 23:06:23 +01:00
|
|
|
║ ║ ║
|
|
|
|
║ ........ ║ ........ ║
|
|
|
|
║ ║ ║
|
|
|
|
╟─────────────────────────────────────► ║ ║
|
|
|
|
║ cmd: quit ║ disconnect client ║
|
|
|
|
║ ║ ║
|
|
|
|
.......................................
|