simplify code
This commit is contained in:
parent
dd3b69cfda
commit
faa3da996d
3 changed files with 81 additions and 172 deletions
|
@ -74,17 +74,9 @@ bool Client::login(std::string username, std::string password) {
|
||||||
json_t* ret = doRequest("POST", "/_matrix/client/r0/login", request);
|
json_t* ret = doRequest("POST", "/_matrix/client/r0/login", request);
|
||||||
json_decref(request);
|
json_decref(request);
|
||||||
|
|
||||||
if (!ret) {
|
const char* tokenCStr = json_object_get_string_value(ret, "access_token");
|
||||||
return false;
|
|
||||||
}
|
|
||||||
json_t* accessToken = json_object_get(ret, "access_token");
|
|
||||||
if (!accessToken) {
|
|
||||||
json_decref(ret);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const char* tokenCStr = json_string_value(accessToken);
|
|
||||||
if (!tokenCStr) {
|
if (!tokenCStr) {
|
||||||
json_decref(ret);
|
if (ret) json_decref(ret);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
token = tokenCStr;
|
token = tokenCStr;
|
||||||
|
@ -104,17 +96,9 @@ std::string Client::getUserId() {
|
||||||
return userIdCache;
|
return userIdCache;
|
||||||
}
|
}
|
||||||
json_t* ret = doRequest("GET", "/_matrix/client/r0/account/whoami");
|
json_t* ret = doRequest("GET", "/_matrix/client/r0/account/whoami");
|
||||||
if (!ret) {
|
const char* userIdCStr = json_object_get_string_value(ret, "user_id");
|
||||||
return "";
|
|
||||||
}
|
|
||||||
json_t* userId = json_object_get(ret, "user_id");
|
|
||||||
if (!userId) {
|
|
||||||
json_decref(ret);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
const char* userIdCStr = json_string_value(userId);
|
|
||||||
if (!userIdCStr) {
|
if (!userIdCStr) {
|
||||||
json_decref(ret);
|
if (ret) json_decref(ret);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
std::string userIdStr = userIdCStr;
|
std::string userIdStr = userIdCStr;
|
||||||
|
@ -128,17 +112,9 @@ std::string Client::resolveRoom(std::string alias) {
|
||||||
return alias; // this is already a room ID, nothing to do
|
return alias; // this is already a room ID, nothing to do
|
||||||
}
|
}
|
||||||
json_t* ret = doRequest("GET", "/_matrix/client/r0/directory/room/" + urlencode(alias));
|
json_t* ret = doRequest("GET", "/_matrix/client/r0/directory/room/" + urlencode(alias));
|
||||||
if (!ret) {
|
const char* roomIdCStr = json_object_get_string_value(ret, "room_id");
|
||||||
return "";
|
|
||||||
}
|
|
||||||
json_t* roomId = json_object_get(ret, "room_id");
|
|
||||||
if (!roomId) {
|
|
||||||
json_decref(ret);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
const char* roomIdCStr = json_string_value(roomId);
|
|
||||||
if (!roomIdCStr) {
|
if (!roomIdCStr) {
|
||||||
json_decref(ret);
|
if (ret) json_decref(ret);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
std::string roomIdStr = roomIdCStr;
|
std::string roomIdStr = roomIdCStr;
|
||||||
|
@ -185,21 +161,15 @@ UserInfo Client::getUserInfo(std::string userId, std::string roomId) {
|
||||||
// first try fetching fro the room
|
// first try fetching fro the room
|
||||||
json_t* ret = getStateEvent(roomId, "m.room.member", userId);
|
json_t* ret = getStateEvent(roomId, "m.room.member", userId);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
json_t* val;
|
char* valCStr;
|
||||||
val = json_object_get(ret, "displayname");
|
valCStr = json_object_get_string_value(ret, "displayname");
|
||||||
if (val) {
|
|
||||||
const char* valCStr = json_string_value(val);
|
|
||||||
if (valCStr) {
|
if (valCStr) {
|
||||||
displayname = valCStr;
|
displayname = valCStr;
|
||||||
}
|
}
|
||||||
}
|
valCStr = json_object_get_string_value(ret, "avatar_url");
|
||||||
val = json_object_get(ret, "avatar_url");
|
|
||||||
if (val) {
|
|
||||||
const char* valCStr = json_string_value(val);
|
|
||||||
if (valCStr) {
|
if (valCStr) {
|
||||||
avatarUrl = valCStr;
|
avatarUrl = valCStr;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
json_decref(ret);
|
json_decref(ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,21 +178,15 @@ UserInfo Client::getUserInfo(std::string userId, std::string roomId) {
|
||||||
std::string path = "/_matrix/client/r0/profile/" + urlencode(userId);
|
std::string path = "/_matrix/client/r0/profile/" + urlencode(userId);
|
||||||
json_t* ret = doRequest("GET", path);
|
json_t* ret = doRequest("GET", path);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
json_t* val;
|
char* valCStr;
|
||||||
val = json_object_get(ret, "displayname");
|
valCStr = json_object_get_string_value(ret, "displayname");
|
||||||
if (val) {
|
|
||||||
const char* valCStr = json_string_value(val);
|
|
||||||
if (valCStr) {
|
if (valCStr) {
|
||||||
displayname = valCStr;
|
displayname = valCStr;
|
||||||
}
|
}
|
||||||
}
|
valCStr = json_object_get_string_value(ret, "avatar_url");
|
||||||
val = json_object_get(ret, "avatar_url");
|
|
||||||
if (val) {
|
|
||||||
const char* valCStr = json_string_value(val);
|
|
||||||
if (valCStr) {
|
if (valCStr) {
|
||||||
avatarUrl = valCStr;
|
avatarUrl = valCStr;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
json_decref(ret);
|
json_decref(ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -235,17 +199,9 @@ UserInfo Client::getUserInfo(std::string userId, std::string roomId) {
|
||||||
|
|
||||||
std::string Client::getRoomName(std::string roomId) {
|
std::string Client::getRoomName(std::string roomId) {
|
||||||
json_t* ret = getStateEvent(roomId, "m.room.name", "");
|
json_t* ret = getStateEvent(roomId, "m.room.name", "");
|
||||||
if (!ret) {
|
const char* nameCStr = json_object_get_string_value(ret, "name");
|
||||||
return "";
|
|
||||||
}
|
|
||||||
json_t* name = json_object_get(ret, "name");
|
|
||||||
if (!name) {
|
|
||||||
json_decref(ret);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
const char* nameCStr = json_string_value(name);
|
|
||||||
if (!nameCStr) {
|
if (!nameCStr) {
|
||||||
json_decref(ret);
|
if (ret) json_decref(ret);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
std::string nameStr = nameCStr;
|
std::string nameStr = nameCStr;
|
||||||
|
@ -255,17 +211,9 @@ std::string Client::getRoomName(std::string roomId) {
|
||||||
|
|
||||||
std::string Client::getRoomTopic(std::string roomId) {
|
std::string Client::getRoomTopic(std::string roomId) {
|
||||||
json_t* ret = getStateEvent(roomId, "m.room.topic", "");
|
json_t* ret = getStateEvent(roomId, "m.room.topic", "");
|
||||||
if (!ret) {
|
const char* topicCStr = json_object_get_string_value(ret, "topic");
|
||||||
return "";
|
|
||||||
}
|
|
||||||
json_t* topic = json_object_get(ret, "topic");
|
|
||||||
if (!topic) {
|
|
||||||
json_decref(ret);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
const char* topicCStr = json_string_value(topic);
|
|
||||||
if (!topicCStr) {
|
if (!topicCStr) {
|
||||||
json_decref(ret);
|
if (ret) json_decref(ret);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
std::string topicStr = topicCStr;
|
std::string topicStr = topicCStr;
|
||||||
|
@ -275,17 +223,9 @@ std::string Client::getRoomTopic(std::string roomId) {
|
||||||
|
|
||||||
std::string Client::getRoomAvatar(std::string roomId) {
|
std::string Client::getRoomAvatar(std::string roomId) {
|
||||||
json_t* ret = getStateEvent(roomId, "m.room.avatar", "");
|
json_t* ret = getStateEvent(roomId, "m.room.avatar", "");
|
||||||
if (!ret) {
|
const char* urlCStr = json_object_get_string_value(ret, "url");
|
||||||
return "";
|
|
||||||
}
|
|
||||||
json_t* url = json_object_get(ret, "url");
|
|
||||||
if (!url) {
|
|
||||||
json_decref(ret);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
const char* urlCStr = json_string_value(url);
|
|
||||||
if (!urlCStr) {
|
if (!urlCStr) {
|
||||||
json_decref(ret);
|
if (ret) json_decref(ret);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
std::string urlStr = urlCStr;
|
std::string urlStr = urlCStr;
|
||||||
|
@ -329,17 +269,9 @@ std::string Client::sendEvent(std::string roomId, std::string eventType, json_t*
|
||||||
std::string txid = std::to_string(time(NULL)) + "_REQ_" + std::to_string(requestId);
|
std::string txid = std::to_string(time(NULL)) + "_REQ_" + std::to_string(requestId);
|
||||||
std::string path = "/_matrix/client/r0/rooms/" + urlencode(roomId) + "/send/" + urlencode(eventType) + "/" + urlencode(txid);
|
std::string path = "/_matrix/client/r0/rooms/" + urlencode(roomId) + "/send/" + urlencode(eventType) + "/" + urlencode(txid);
|
||||||
json_t* ret = doRequest("PUT", path, content);
|
json_t* ret = doRequest("PUT", path, content);
|
||||||
if (!ret) {
|
const char* eventIdCStr = json_object_get_string_value(ret, "event_id");
|
||||||
return "";
|
|
||||||
}
|
|
||||||
json_t* eventId = json_object_get(ret, "event_id");
|
|
||||||
if (!eventId) {
|
|
||||||
json_decref(ret);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
const char* eventIdCStr = json_string_value(eventId);
|
|
||||||
if (!eventIdCStr) {
|
if (!eventIdCStr) {
|
||||||
json_decref(ret);
|
if (ret) json_decref(ret);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
std::string eventIdStr = eventIdCStr;
|
std::string eventIdStr = eventIdCStr;
|
||||||
|
@ -357,17 +289,9 @@ std::string Client::sendStateEvent(std::string roomId, std::string type, std::st
|
||||||
roomId = resolveRoom(roomId);
|
roomId = resolveRoom(roomId);
|
||||||
std::string path = "/_matrix/client/r0/rooms/" + urlencode(roomId) + "/state/" + urlencode(type) + "/" + urlencode(stateKey);
|
std::string path = "/_matrix/client/r0/rooms/" + urlencode(roomId) + "/state/" + urlencode(type) + "/" + urlencode(stateKey);
|
||||||
json_t* ret = doRequest("PUT", path, content);
|
json_t* ret = doRequest("PUT", path, content);
|
||||||
if (!ret) {
|
const char* eventIdCStr = json_object_get_string_value(ret, "event_id");
|
||||||
return "";
|
|
||||||
}
|
|
||||||
json_t* eventId = json_object_get(ret, "event_id");
|
|
||||||
if (!eventId) {
|
|
||||||
json_decref(ret);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
const char* eventIdCStr = json_string_value(eventId);
|
|
||||||
if (!eventIdCStr) {
|
if (!eventIdCStr) {
|
||||||
json_decref(ret);
|
if (ret) json_decref(ret);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
std::string eventIdStr = eventIdCStr;
|
std::string eventIdStr = eventIdCStr;
|
||||||
|
@ -385,17 +309,9 @@ std::string Client::redactEvent(std::string roomId, std::string eventId, std::st
|
||||||
std::string path = "/_matrix/client/r0/rooms/" + urlencode(roomId) + "/redact/" + urlencode(eventId) + "/" + txid;
|
std::string path = "/_matrix/client/r0/rooms/" + urlencode(roomId) + "/redact/" + urlencode(eventId) + "/" + txid;
|
||||||
json_t* ret = doRequest("PUT", path, content);
|
json_t* ret = doRequest("PUT", path, content);
|
||||||
json_decref(content);
|
json_decref(content);
|
||||||
if (!ret) {
|
const char* eventIdCStr = json_object_get_string_value(ret, "event_id");
|
||||||
return "";
|
|
||||||
}
|
|
||||||
json_t* retEventId = json_object_get(ret, "event_id");
|
|
||||||
if (!retEventId) {
|
|
||||||
json_decref(ret);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
const char* eventIdCStr = json_string_value(retEventId);
|
|
||||||
if (!eventIdCStr) {
|
if (!eventIdCStr) {
|
||||||
json_decref(ret);
|
if (ret) json_decref(ret);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
std::string eventIdStr = eventIdCStr;
|
std::string eventIdStr = eventIdCStr;
|
||||||
|
@ -469,19 +385,20 @@ void Client::processSync(json_t* sync) {
|
||||||
json_t* leaveEvent = NULL;
|
json_t* leaveEvent = NULL;
|
||||||
json_array_foreach(events, index, event) {
|
json_array_foreach(events, index, event) {
|
||||||
// check if the event type is m.room.member
|
// check if the event type is m.room.member
|
||||||
json_t* val = json_object_get(event, "type");
|
char* val;
|
||||||
|
val = json_object_get_string_value(event, "type");
|
||||||
if (!val) {
|
if (!val) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strcmp(json_string_value(val), "m.room.member") != 0) {
|
if (strcmp(val, "m.room.member") != 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// check if it is actually us
|
// check if it is actually us
|
||||||
val = json_object_get(event, "state_key");
|
val = json_object_get_string_value(event, "state_key");
|
||||||
if (!val) {
|
if (!val) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strcmp(json_string_value(val), getUserId().c_str()) != 0) {
|
if (strcmp(val, getUserId().c_str()) != 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// we do *not* check for event age as we don't have unsigned stuffs in our timeline due to our filter
|
// we do *not* check for event age as we don't have unsigned stuffs in our timeline due to our filter
|
||||||
|
@ -510,19 +427,20 @@ void Client::processSync(json_t* sync) {
|
||||||
json_t* inviteEvent = NULL;
|
json_t* inviteEvent = NULL;
|
||||||
json_array_foreach(events, index, event) {
|
json_array_foreach(events, index, event) {
|
||||||
// check if the event type is m.room.member
|
// check if the event type is m.room.member
|
||||||
json_t* val = json_object_get(event, "type");
|
char* val;
|
||||||
|
val = json_object_get_string_value(event, "type");
|
||||||
if (!val) {
|
if (!val) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strcmp(json_string_value(val), "m.room.member") != 0) {
|
if (strcmp(val, "m.room.member") != 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// check if it is actually us
|
// check if it is actually us
|
||||||
val = json_object_get(event, "state_key");
|
val = json_object_get_string_value(event, "state_key");
|
||||||
if (!val) {
|
if (!val) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strcmp(json_string_value(val), getUserId().c_str()) != 0) {
|
if (strcmp(val, getUserId().c_str()) != 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// check for if it was an invite event
|
// check for if it was an invite event
|
||||||
|
@ -530,11 +448,11 @@ void Client::processSync(json_t* sync) {
|
||||||
if (!content) {
|
if (!content) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
val = json_object_get(content, "membership");
|
val = json_object_get_string_value(content, "membership");
|
||||||
if (!val) {
|
if (!val) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strcmp(json_string_value(val), "invite") != 0) {
|
if (strcmp(val, "invite") != 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// we do *not* check for event age as we don't have unsigned stuffs in our timeline due to our filter
|
// we do *not* check for event age as we don't have unsigned stuffs in our timeline due to our filter
|
||||||
|
@ -559,44 +477,34 @@ void Client::processSync(json_t* sync) {
|
||||||
RoomInfo info;
|
RoomInfo info;
|
||||||
bool addedInfo = false;
|
bool addedInfo = false;
|
||||||
json_array_foreach(events, index, event) {
|
json_array_foreach(events, index, event) {
|
||||||
json_t* type = json_object_get(event, "type");
|
const char* typeCStr = json_object_get_string_value(event, "type");
|
||||||
if (!type) {
|
if (!typeCStr) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
json_t* content = json_object_get(event, "content");
|
json_t* content = json_object_get(event, "content");
|
||||||
if (!content) {
|
if (!content) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const char* typeStr = json_string_value(type);
|
if (strcmp(typeCStr, "m.room.name") == 0) {
|
||||||
if (strcmp(typeStr, "m.room.name") == 0) {
|
const char* nameCStr = json_object_get_string_value(content, "name");
|
||||||
json_t* name = json_object_get(content, "name");
|
|
||||||
if (name) {
|
|
||||||
const char* nameCStr = json_string_value(name);
|
|
||||||
if (nameCStr) {
|
if (nameCStr) {
|
||||||
info.name = nameCStr;
|
info.name = nameCStr;
|
||||||
addedInfo = true;
|
addedInfo = true;
|
||||||
}
|
}
|
||||||
}
|
} else if (strcmp(typeCStr, "m.room.topic") == 0) {
|
||||||
} else if (strcmp(typeStr, "m.room.topic") == 0) {
|
const char* topicCStr = json_object_get_string_value(event, "topic");
|
||||||
json_t* topic = json_object_get(event, "topic");
|
|
||||||
if (topic) {
|
|
||||||
const char* topicCStr = json_string_value(topic);
|
|
||||||
if (topicCStr) {
|
if (topicCStr) {
|
||||||
info.topic = topicCStr;
|
info.topic = topicCStr;
|
||||||
addedInfo = true;
|
addedInfo = true;
|
||||||
}
|
}
|
||||||
}
|
} else if (strcmp(typeCStr, "m.room.avatar") == 0) {
|
||||||
} else if (strcmp(typeStr, "m.room.avatar") == 0) {
|
const char* urlCStr = json_object_get_string_value(event, "url");
|
||||||
json_t* url = json_object_get(event, "url");
|
|
||||||
if (url) {
|
|
||||||
const char* urlCStr = json_string_value(url);
|
|
||||||
if (urlCStr) {
|
if (urlCStr) {
|
||||||
info.avatarUrl = urlCStr;
|
info.avatarUrl = urlCStr;
|
||||||
addedInfo = true;
|
addedInfo = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (addedInfo) {
|
if (addedInfo) {
|
||||||
callbacks.roomInfo(roomId, info);
|
callbacks.roomInfo(roomId, info);
|
||||||
}
|
}
|
||||||
|
@ -671,18 +579,9 @@ void Client::registerFilter() {
|
||||||
std::string userId = getUserId();
|
std::string userId = getUserId();
|
||||||
json_t* ret = doRequest("POST", "/_matrix/client/r0/user/" + urlencode(userId) + "/filter", filter);
|
json_t* ret = doRequest("POST", "/_matrix/client/r0/user/" + urlencode(userId) + "/filter", filter);
|
||||||
json_decref(filter);
|
json_decref(filter);
|
||||||
|
const char* filterIdCStr = json_object_get_string_value(ret, "filter_id");
|
||||||
if (!ret) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
json_t* filterId = json_object_get(ret, "filter_id");
|
|
||||||
if (!filterId) {
|
|
||||||
json_decref(ret);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const char* filterIdCStr = json_string_value(filterId);
|
|
||||||
if (!filterIdCStr) {
|
if (!filterIdCStr) {
|
||||||
json_decref(ret);
|
if (ret) json_decref(ret);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
std::string filterIdStr = filterIdCStr;
|
std::string filterIdStr = filterIdCStr;
|
||||||
|
@ -706,17 +605,12 @@ void Client::syncLoop() {
|
||||||
if (ret) {
|
if (ret) {
|
||||||
timeout = 60;
|
timeout = 60;
|
||||||
// set the token for the next batch
|
// set the token for the next batch
|
||||||
json_t* token = json_object_get(ret, "next_batch");
|
const char* tokenCStr = json_object_get_string_value(ret, "next_batch");
|
||||||
if (token) {
|
|
||||||
const char* tokenCStr = json_string_value(token);
|
|
||||||
if (tokenCStr) {
|
if (tokenCStr) {
|
||||||
store->setSyncToken(tokenCStr);
|
store->setSyncToken(tokenCStr);
|
||||||
} else {
|
} else {
|
||||||
store->setSyncToken("");
|
store->setSyncToken("");
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
store->setSyncToken("");
|
|
||||||
}
|
|
||||||
processSync(ret);
|
processSync(ret);
|
||||||
json_decref(ret);
|
json_decref(ret);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <3ds.h>
|
#include <3ds.h>
|
||||||
|
#include <jansson.h>
|
||||||
|
|
||||||
// from http://www.zedwood.com/article/cpp-urlencode-function
|
// from http://www.zedwood.com/article/cpp-urlencode-function
|
||||||
std::string urlencode(std::string s) {
|
std::string urlencode(std::string s) {
|
||||||
|
@ -53,3 +54,14 @@ Result httpcDownloadDataTimeout(httpcContext *context, u8* buffer, u32 size, u32
|
||||||
|
|
||||||
return dlret;
|
return dlret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* json_object_get_string_value(json_t* obj, const char* key) {
|
||||||
|
if (!obj) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
json_t* keyObj = json_object_get(obj, key);
|
||||||
|
if (!keyObj) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return (char*)json_string_value(keyObj);
|
||||||
|
}
|
||||||
|
|
|
@ -3,9 +3,12 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <3ds.h>
|
#include <3ds.h>
|
||||||
|
#include <jansson.h>
|
||||||
|
|
||||||
std::string urlencode(std::string str);
|
std::string urlencode(std::string str);
|
||||||
|
|
||||||
Result httpcDownloadDataTimeout(httpcContext *context, u8* buffer, u32 size, u32 *downloadedsize, u64 timeout);
|
Result httpcDownloadDataTimeout(httpcContext *context, u8* buffer, u32 size, u32 *downloadedsize, u64 timeout);
|
||||||
|
|
||||||
|
char* json_object_get_string_value(json_t* obj, const char* key);
|
||||||
|
|
||||||
#endif // _UTIL_H_
|
#endif // _UTIL_H_
|
||||||
|
|
Loading…
Reference in a new issue