|
1 #include "ipcprotocol.h" |
|
2 #include "../util.h" |
|
3 #include "../logging.h" |
|
4 |
|
5 #include <stdio.h> |
|
6 #include <stdbool.h> |
|
7 #include <string.h> |
|
8 |
|
9 int flib_ipc_append_message(flib_vector vec, const char *fmt, ...) { |
|
10 int result = -1; |
|
11 if(!vec || !fmt) { |
|
12 flib_log_e("null parameter in flib_ipc_appendmessage"); |
|
13 } else { |
|
14 // 1 byte size prefix, 255 bytes max message length, 1 0-byte for vsnprintf |
|
15 char msgbuffer[257]; |
|
16 |
|
17 // Format the message, leaving one byte at the start for the length |
|
18 va_list argp; |
|
19 va_start(argp, fmt); |
|
20 int msgSize = vsnprintf(msgbuffer+1, 256, fmt, argp); |
|
21 va_end(argp); |
|
22 |
|
23 if(msgSize > 255) { |
|
24 flib_log_e("Message too long (%u bytes) in flib_ipc_appendmessage", (unsigned)msgSize); |
|
25 } else if(msgSize<0) { |
|
26 flib_log_e("printf error in flib_ipc_appendmessage"); |
|
27 } else { |
|
28 // Add the length prefix |
|
29 ((uint8_t*)msgbuffer)[0] = msgSize; |
|
30 |
|
31 // Append it to the vector |
|
32 if(flib_vector_append(vec, msgbuffer, msgSize+1) == msgSize+1) { |
|
33 result = 0; |
|
34 } |
|
35 } |
|
36 } |
|
37 return result; |
|
38 } |
|
39 |
|
40 int flib_ipc_append_mapconf(flib_vector vec, flib_map *map, bool mappreview) { |
|
41 int result = -1; |
|
42 flib_vector tempvector = flib_vector_create(); |
|
43 if(!vec || !map) { |
|
44 flib_log_e("null parameter in flib_ipc_append_mapconf"); |
|
45 } else if(tempvector) { |
|
46 bool error = false; |
|
47 |
|
48 if(map->mapgen == MAPGEN_NAMED) { |
|
49 error |= flib_ipc_append_message(tempvector, "emap %s", map->name); |
|
50 } |
|
51 if(map->theme && !mappreview) { |
|
52 error |= flib_ipc_append_message(tempvector, "etheme %s", map->theme); |
|
53 } |
|
54 error |= flib_ipc_append_message(tempvector, "e$template_filter %i", map->templateFilter); |
|
55 error |= flib_ipc_append_message(tempvector, "e$mapgen %i", map->mapgen); |
|
56 |
|
57 if(map->mapgen == MAPGEN_MAZE) { |
|
58 error |= flib_ipc_append_message(tempvector, "e$maze_size %i", map->mazeSize); |
|
59 } |
|
60 if(map->mapgen == MAPGEN_DRAWN) { |
|
61 /* |
|
62 * We have to split the drawn map data into several edraw messages here because |
|
63 * it can be longer than the maximum message size. |
|
64 */ |
|
65 const char *edraw = "edraw "; |
|
66 int edrawlen = strlen(edraw); |
|
67 for(int offset=0; offset<map->drawDataSize; offset+=200) { |
|
68 int bytesRemaining = map->drawDataSize-offset; |
|
69 int fragmentsize = bytesRemaining < 200 ? bytesRemaining : 200; |
|
70 uint8_t messagesize = edrawlen + fragmentsize; |
|
71 error |= (flib_vector_append(tempvector, &messagesize, 1) != 1); |
|
72 error |= (flib_vector_append(tempvector, edraw, edrawlen) != edrawlen); |
|
73 error |= (flib_vector_append(tempvector, map->drawData+offset, fragmentsize) != fragmentsize); |
|
74 } |
|
75 } |
|
76 |
|
77 if(!error) { |
|
78 // Message created, now we can copy everything. |
|
79 flib_constbuffer constbuf = flib_vector_as_constbuffer(tempvector); |
|
80 if(flib_vector_append(vec, constbuf.data, constbuf.size) == constbuf.size) { |
|
81 result = 0; |
|
82 } |
|
83 } |
|
84 } |
|
85 flib_vector_destroy(&tempvector); |
|
86 return result; |
|
87 } |
|
88 |
|
89 int flib_ipc_append_seed(flib_vector vec, const char *seed) { |
|
90 if(!vec || !seed) { |
|
91 flib_log_e("null parameter in flib_ipc_append_seed"); |
|
92 return -1; |
|
93 } else { |
|
94 return flib_ipc_append_message(vec, "eseed %s", seed); |
|
95 } |
|
96 } |