Protocol Buffers » History » Version 4
Sputnick, 02/27/2013 12:22 AM
1 | 1 | Nevcairiel | h1. Protocol Buffers |
---|---|---|---|
2 | 1 | Nevcairiel | |
3 | 1 | Nevcairiel | "Google Protocol Buffers":http://code.google.com/apis/protocolbuffers/ is an open binary serialization format created by Google. |
4 | 1 | Nevcairiel | This page describes an attempt to create an alternate language and platform neutral protocol for Quassel using the Protocol Buffers format. |
5 | 1 | Nevcairiel | |
6 | 2 | Nevcairiel | The initial plan was to use JSON for an alternate protocol, but using Protocol Buffers has some distinct advantages, so this is the successor of that idea. |
7 | 2 | Nevcairiel | |
8 | 1 | Nevcairiel | h2. Why Protocol Buffers? |
9 | 1 | Nevcairiel | |
10 | 1 | Nevcairiel | ?? |
11 | 1 | Nevcairiel | Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – *think XML, but smaller, faster, and simpler* |
12 | 1 | Nevcairiel | ?? |
13 | 1 | Nevcairiel | |
14 | 1 | Nevcairiel | Protocol buffers are not just a format definition, but also include code generation for many different languages. |
15 | 1 | Nevcairiel | |
16 | 1 | Nevcairiel | This offers several advantages, one being a absolutely clear defined, self-describing protocol, instead of protocol based on conventions and possibly outdated documentation. |
17 | 1 | Nevcairiel | Additionally, protocol buffers are a binary protocol, with highly optimized implementations in several languages. Official support by Google for C++, Java and Python, as well as third party extension for many other popular languages, including PHP, Obj-C, Perl, JS, and many more. |
18 | 1 | Nevcairiel | |
19 | 3 | Sputnick | h2. Current State |
20 | 3 | Sputnick | |
21 | 3 | Sputnick | Work is currently in progress for supporting alternative protocols, i.e. something else besides QDataStream serialization. This requires lots of refactoring first in order to abstract everything away properly. |
22 | 3 | Sputnick | |
23 | 3 | Sputnick | Once this work is done, we'll look into offering something based on Protocol Buffers. |
24 | 3 | Sputnick | |
25 | 4 | Sputnick | **Note that the information in the following sections is completely outdated and not in any way resembling the future implementation!** |
26 | 3 | Sputnick | Well just keep it here for now for reference. |
27 | 3 | Sputnick | |
28 | 3 | Sputnick | h2. Protocol Definition |
29 | 1 | Nevcairiel | |
30 | 1 | Nevcairiel | Note: The protocol is still being actively worked on. |
31 | 1 | Nevcairiel | The outlined protocol definitions are not final, and just listed here for documentation. |
32 | 1 | Nevcairiel | |
33 | 1 | Nevcairiel | h3. Message Container |
34 | 1 | Nevcairiel | |
35 | 1 | Nevcairiel | Every Message has to be wrapped in a container, since we otherwise can't determine the message type. This is done by the "QuasselServerMessage" and "QuasselClientMessage" message types. This design is modeled around the Protocol Buffers "Union Types":http://code.google.com/apis/protocolbuffers/docs/techniques.html#union example. |
36 | 1 | Nevcairiel | |
37 | 1 | Nevcairiel | QuasselServerMessage are messages the server sends, while QuasselClientMessage are messages the client sends. |
38 | 1 | Nevcairiel | |
39 | 1 | Nevcairiel | <pre> |
40 | 1 | Nevcairiel | message QuasselServerMessage { |
41 | 1 | Nevcairiel | enum MessageType { |
42 | 1 | Nevcairiel | ERROR = 0, // Generic message for errors |
43 | 1 | Nevcairiel | SUCCESS = 1, // Generic message for success |
44 | 1 | Nevcairiel | SESSION_STATE = 2, // State of current session, sent after init |
45 | 1 | Nevcairiel | ... |
46 | 1 | Nevcairiel | } |
47 | 1 | Nevcairiel | required MessageType type = 1; |
48 | 1 | Nevcairiel | |
49 | 1 | Nevcairiel | optional ErrorMessage errorMessage = 100; |
50 | 1 | Nevcairiel | optional SuccessMessage successMessage = 101; |
51 | 1 | Nevcairiel | optional SessionState sessionState = 102; |
52 | 1 | Nevcairiel | ... |
53 | 1 | Nevcairiel | } |
54 | 1 | Nevcairiel | </pre> |
55 | 1 | Nevcairiel | |
56 | 1 | Nevcairiel | <pre> |
57 | 1 | Nevcairiel | message QuasselClientMessage { |
58 | 1 | Nevcairiel | enum MessageType { |
59 | 1 | Nevcairiel | REQUEST = 0, // Generic Request message (request init, request login, request backlog, etc..) |
60 | 1 | Nevcairiel | ... |
61 | 1 | Nevcairiel | } |
62 | 1 | Nevcairiel | required MessageType type = 1; |
63 | 1 | Nevcairiel | |
64 | 1 | Nevcairiel | optional RequestMessage request = 2; |
65 | 1 | Nevcairiel | ... |
66 | 1 | Nevcairiel | } |
67 | 1 | Nevcairiel | </pre> |
68 | 1 | Nevcairiel | |
69 | 1 | Nevcairiel | Once the protocol is better defined, the full protocol files will be available here. |