summaryrefslogtreecommitdiff
path: root/device.c
blob: 3834388fdb015af63a9bc57984d36b7d350eb10b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* implements 11.9 Device Management 

GET /_matrix/client/r0/devices/{deviceId}
PUT /_matrix/client/r0/devices/{deviceId}
DELETE /_matrix/client/r0/devices/{deviceId}

*/

#include <stdio.h>
#include "session.h"
#include "util.h"
#include "curl_util.h"
#include "device.h"

matrix_device * get_devices(matrix_session *sess, int *n)
{
	/* GET /_matrix/client/r0/devices */
	const char *u[] = { sess->url,
		"/_matrix/client/r0/devices?access_token=", sess->token , NULL };
	const char *requrl = alloc_build_string(u);
	json_object *resp;
	_curl_get(sess->curl, requrl, &resp);
	if (resp) {
		json_object *devarr;
		if (json_object_object_get_ex(resp, "devices", &devarr)
				&& json_object_is_type(devarr, json_type_array)) {
			size_t ndev = json_object_array_length(devarr);
			matrix_device *devs = (matrix_device *)malloc(sizeof(matrix_device) * ndev);
			for (size_t i = 0; i < ndev; i++) {
				json_object *devi = json_object_array_get_idx(devarr, i);
				devs[i].device_id = json_gets_dup(devi, "device_id");
				devs[i].display_name = json_gets_dup(devi, "display_name");
				devs[i].last_seen_ip = json_gets_dup(devi, "last_seen_ip");
				json_object *ts;
				if (json_object_object_get_ex(devi, "last_seen_ts", &ts)) {
					devs[i].last_seen_ts = json_object_get_int64(ts);
				} else {
					devs[i].last_seen_ts = 0;
				}
			}
			*n = ndev;
			return devs;
		}
		json_object_put(resp);
	}
	*n = 0;
	return NULL;
}