const char * cmd,\r
int nargs, char ** args\r
) {\r
+#define CHECK_ARGS(N, ARGS) if (nargs != N) { Usage(cmd, ARGS); return; }\r
/**/ if (CheckCommand(cmd, "devicekey")) {\r
printf("%s\n", client->deviceKey);\r
}\r
else if (CheckCommand(cmd, "genkeys")) {\r
- if (nargs != 1) {\r
- Usage(cmd, "<number of keys>");\r
- return;\r
- }\r
+ CHECK_ARGS(1, "<number of keys>")\r
+\r
MatrixClientGenerateOnetimeKeys(client, atoi(args[0]));\r
}\r
else if (CheckCommand(cmd, "uploadkeys")) {\r
" ", mjson_print_fixed_buf, &fb);\r
printf("%.*s\n", fb.len, fb.ptr);\r
}\r
+ else if (CheckCommand(cmd, "save")) {\r
+ CHECK_ARGS(1, "<filename>")\r
+\r
+ MatrixClientSave(client, args[0]);\r
+ }\r
+ else if (CheckCommand(cmd, "load")) {\r
+ CHECK_ARGS(1, "<filename>")\r
+\r
+ MatrixClientLoad(client, args[0]);\r
+ }\r
+ else if (CheckCommand(cmd, "send")) {\r
+ CHECK_ARGS(2, "<room_id> <message>")\r
+\r
+ static char body[1024];\r
+ snprintf(body, 1024,\r
+ "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
+ args[1]);\r
+\r
+ printf("Sending %s to %s\n", body, args[0]);\r
+\r
+ MatrixClientSendEvent(client,\r
+ args[0],\r
+ "m.room.message",\r
+ body);\r
+ }\r
+ else if (CheckCommand(cmd, "setuserid")) {\r
+ CHECK_ARGS(1, "<user_id>")\r
+\r
+ MatrixClientSetUserId(client, args[0]);\r
+ }\r
+ else if (CheckCommand(cmd, "getuserid")) {\r
+ printf("User ID: %s\n", client->userId);\r
+ }\r
+#undef CHECK_ARGS\r
}\r
\r
int\r
USER_ID);\r
\r
static char cmd[BUFFER_SIZE];\r
- static char args_[BUFFER_SIZE][NUMBER_ARGS];\r
+ static char args_[NUMBER_ARGS][BUFFER_SIZE];\r
char * args[NUMBER_ARGS];\r
for (int i = 0; i < NUMBER_ARGS; i++)\r
args[i] = args_[i];\r
return true;\r
}\r
\r
+bool\r
+MatrixClientSave(\r
+ MatrixClient * client,\r
+ const char * filename)\r
+{\r
+ FILE * f = fopen(filename, "w");\r
+ \r
+ fwrite(client->deviceKey, 1, DEVICE_KEY_SIZE, f);\r
+ fwrite(client->signingKey, 1, DEVICE_KEY_SIZE, f);\r
+ fwrite(client->userId, 1, USER_ID_SIZE, f);\r
+ fwrite(client->server, 1, SERVER_SIZE, f);\r
+ fwrite(client->accessToken, 1, ACCESS_TOKEN_SIZE, f);\r
+ fwrite(client->deviceId, 1, DEVICE_ID_SIZE, f);\r
+ fwrite(client->expireMs, 1, EXPIRE_MS_SIZE, f);\r
+ fwrite(client->refreshToken, 1, REFRESH_TOKEN_SIZE, f);\r
+\r
+ fwrite(&client->numDevices, sizeof(int), 1, f);\r
+ for (int i = 0; i < client->numDevices; i++) {\r
+ fwrite(client->devices[i].deviceId, 1, DEVICE_ID_SIZE, f);\r
+ fwrite(client->devices[i].deviceKey, 1, DEVICE_KEY_SIZE, f);\r
+ }\r
+\r
+ fclose(f);\r
+ return true;\r
+}\r
+\r
+bool\r
+MatrixClientLoad(\r
+ MatrixClient * client,\r
+ const char * filename)\r
+{\r
+ FILE * f = fopen(filename, "r");\r
+ \r
+ fread(client->deviceKey, 1, DEVICE_KEY_SIZE, f);\r
+ fread(client->signingKey, 1, DEVICE_KEY_SIZE, f);\r
+ fread(client->userId, 1, USER_ID_SIZE, f);\r
+ fread(client->server, 1, SERVER_SIZE, f);\r
+ fread(client->accessToken, 1, ACCESS_TOKEN_SIZE, f);\r
+ fread(client->deviceId, 1, DEVICE_ID_SIZE, f);\r
+ fread(client->expireMs, 1, EXPIRE_MS_SIZE, f);\r
+ fread(client->refreshToken, 1, REFRESH_TOKEN_SIZE, f);\r
+\r
+ fread(&client->numDevices, sizeof(int), 1, f);\r
+ for (int i = 0; i < client->numDevices; i++) {\r
+ fread(client->devices[i].deviceId, 1, DEVICE_ID_SIZE, f);\r
+ fread(client->devices[i].deviceKey, 1, DEVICE_KEY_SIZE, f);\r
+ }\r
+\r
+ fclose(f);\r
+ return true;\r
+}\r
+\r
bool\r
MatrixClientSetAccessToken(\r
MatrixClient * client,\r
\r
for (int i = 0; i < accessTokenLen; i++)\r
client->accessToken[i] = accessToken[i];\r
+ client->accessToken[accessTokenLen] = '\0';\r
\r
return true;\r
}\r
\r
for (int i = 0; i < deviceIdLen; i++)\r
client->deviceId[i] = deviceId[i];\r
+ client->deviceId[deviceIdLen] = '\0';\r
\r
return true;\r
}\r
\r
for (int i = 0; i < userIdLen; i++)\r
client->userId[i] = userId[i];\r
+ client->userId[userIdLen] = '\0';\r
\r
return true;\r
}\r