summaryrefslogtreecommitdiffstats
path: root/src/h.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/h.c')
-rw-r--r--src/h.c47
1 files changed, 31 insertions, 16 deletions
diff --git a/src/h.c b/src/h.c
index 1a0988b..fd0d40a 100644
--- a/src/h.c
+++ b/src/h.c
@@ -17,6 +17,11 @@
#define DC_LWS_MAX_FD 64 /* max file descriptors LWS will have open. if unset, LWS acquires all unused */
#define DC_LWS_MAX_HEADER_LENGTH 64 /* _MAX_HEADER_LENGTH*_HEADERS_LENGTH is allocated for every reque */
#define DC_WS_PING_FORMAT "{\"op\":1,\"d\":%lld}"
+#ifdef DC_UI_GTK
+#define DC_IF_UI_GTK(...) __VA_ARGS__
+#else
+#define DC_IF_UI_GTK(...)
+#endif
/* it's strongly recommended to calloc structs during initialization. */
enum dc_status { /* theese are flags and should be and-checked */
DC_UNSET = 0, /* default value when enum is calloced */
@@ -48,12 +53,13 @@ enum dc_status { /* theese are flags and should be and-checked */
DC_INTERNAL = DC_FROM_LWS | DC_FROM_API, /* call originates from an internal function */
}; /* note: when checking status, first check for DC_OK, if it's set then disregard errors! */
enum dc_permissions { /* other permissions exist, but are not implemented/understood */
- DC_ALL_PERMISSIONS = 1 << 3, /* this is incredibly retarded, why is this SEPARATE?!? - admins */
+ DC_ADMIN = 1 << 3, /* this is incredibly retarded, why is this SEPARATE?!? - admins */
DC_CHANNEL_VIEW = 1 << 10, /* all enum fields here have values same as the server values */
DC_MESSAGE_SEND = 1 << 11,
DC_MESSAGE_READ = 1 << 16, /* na tistem vegova serverju sem lahko pošiljal ne pa bral sporočil */
DC_VOICE_LISTEN = 1 << 20,
- DC_VOICE_SPEAK = 1 << 21
+ DC_VOICE_SPEAK = 1 << 21,
+ DC_ALL_PERMISSIONS = DC_ADMIN | DC_CHANNEL_VIEW | DC_MESSAGE_SEND | DC_MESSAGE_READ | DC_VOICE_LISTEN | DC_VOICE_SPEAK /* admins get this@parsing, UI need not check admin separatly */
}; /* all enum fields here have values same as the values that the server sends */
enum dc_channel_type { /* other types exist, but are not implemented/understood */
DC_GC = 0, /* guild channel */
@@ -187,10 +193,15 @@ enum dc_json_paths { /* lws reduces the following char array to uint8_t, so we c
DC_JSON_DM,
DC_JSON_DM_TYPE,
DC_JSON_DM_ID,
+ DC_JSON_DM_NAME, /* yes, some do have names. */
DC_JSON_DM_USER, /* this is the ID */
DC_JSON_GUILD,
DC_JSON_GUILD_NAME,
DC_JSON_GUILD_ID,
+ DC_JSON_GUILD_ROLE,
+ DC_JSON_GUILD_ROLE_PERMISSION,
+ DC_JSON_GUILD_ROLE_NAME,
+ DC_JSON_GUILD_ROLE_ID,
DC_JSON_GUILD_CHANNEL,
DC_JSON_GUILD_CHANNEL_TYPE,
DC_JSON_GUILD_CHANNEL_NAME,
@@ -201,10 +212,6 @@ enum dc_json_paths { /* lws reduces the following char array to uint8_t, so we c
DC_JSON_GUILD_CHANNEL_PERMISSION_ID,
DC_JSON_GUILD_CHANNEL_PERMISSION_DENY,
DC_JSON_GUILD_CHANNEL_PERMISSION_ALLOW,
- DC_JSON_GUILD_ROLE,
- DC_JSON_GUILD_ROLE_PERMISSION,
- DC_JSON_GUILD_ROLE_NAME,
- DC_JSON_GUILD_ROLE_ID,
DC_JSON_MESSAGE,
DC_JSON_MESSAGE_ATTACHMENTS,
DC_JSON_MESSAGE_ID,
@@ -268,10 +275,15 @@ char * dc_json_paths[] = { /* array of paths we are interested in */
"d.private_channels[]",
"d.private_channels[].type",
"d.private_channels[].id",
- "d.private_channels[].recipients_ids[]",
+ "d.private_channels[].name",
+ "d.private_channels[].recipient_ids",
"d.guilds[]",
"d.guilds[].name",
"d.guilds[].id",
+ "d.guilds[].roles[]",
+ "d.guilds[].roles[].permissions",
+ "d.guilds[].roles[].name",
+ "d.guilds[].roles[].id",
"d.guilds[].channels[]",
"d.guilds[].channels[].type",
"d.guilds[].channels[].name",
@@ -282,10 +294,6 @@ char * dc_json_paths[] = { /* array of paths we are interested in */
"d.guilds[].channels[].permission_overwrites.id",
"d.guilds[].channels[].permission_overwrites.deny",
"d.guilds[].channels[].permission_overwrites.allow",
- "d.guilds[].roles[]",
- "d.guilds[].roles[].permissions",
- "d.guilds[].roles[].name",
- "d.guilds[].roles[].id",
"d",
"d.attachments[]",
"d.id",
@@ -396,8 +404,7 @@ struct dc_guild {
struct dc_client * client; /* nofree */
struct dc_channel * channel; /* nofree - first channel */
struct dc_role * role; /* nofree - first role. NOTE: role->id == guild->id => @everyone role */
- enum dc_permissions permissions;
- enum dc_status status;
+ enum dc_status status; /* /\ if NULL then assume all permissions - a DM guild */
#ifdef DC_UI_GTK
GtkTreeIter iter; /* NOTE: only works when GtkTreeModel has a flag GTK_TREE_MODEL_ITERS_PERSIST; see paragraph 8 of description of file:///usr/share/doc/libgtk-3-doc/gtk3/GtkTreeModel.html */
gboolean is_iter;
@@ -458,7 +465,7 @@ struct dc_channel {
unsigned long long int id;
enum dc_channel_type type;
struct dc_guild * guild; /* nofree */
- struct dc_channel * next; /* nofree - next channel (linked list of all guilds of dc_guild) */
+ struct dc_channel * next; /* nofree - next channel (linked list of all channel of dc_guild) */
struct dc_message * message; /* nofree - first message (ordered by time) */
struct dc_permission * permission; /* nofree - first permission */
enum dc_status status;
@@ -510,7 +517,7 @@ struct dc_role {
DC_STRUCT_PREFIX
char * name; /* yesfree */
unsigned long long int id;
- enum dc_permissions permissions;
+ enum dc_permissions permissions; /* this are guild permission */
struct dc_guild * guild; /* nofree - owner of the role */
struct dc_role * next; /* nofree - next role (linked list of all roles of dc_guild) */
struct dc_role_membership * role_membership; /* nofree - first role membership ll) */
@@ -563,7 +570,7 @@ void dc_user_free (struct dc_user * s, enum dc_status t) {
free(s);
}
struct dc_permission { /* permissions can be individual on a per-channel basis */
- DC_STRUCT_PREFIX
+ DC_STRUCT_PREFIX /* assume all permissions */
enum dc_permissions allow;
enum dc_permissions deny;
unsigned long long int id; /* to whom does this permission apply */
@@ -771,3 +778,11 @@ DC_FIND_LL_X(channel)
DC_GEN_X(guild, GUILD)
#define DC_ISAE(a) &a, &a##_sizeof, &a##_length /* ISA Expand */
#define DC_ISAN NULL, NULL, NULL /* ISA NULL */
+#define DC_TRANSFER_CHANNEL(n, o) do { /* n is going to DC_REPLACE o, transfer important data */ \
+ n->message = o->message; \
+ n->next = o->next; \
+ DC_IF_UI_GTK( \
+ memcpy(pass->api_io.channel->iter, ch->iter, sizeof(GtkTreeIter)); \
+ pass->api_io.channel->is_iter = ch->is_iter; \
+ ) \
+ } while(0)