summaryrefslogtreecommitdiff
path: root/desktop/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/server.c')
-rw-r--r--desktop/server.c112
1 files changed, 58 insertions, 54 deletions
diff --git a/desktop/server.c b/desktop/server.c
index a3c308f..3bb7aac 100644
--- a/desktop/server.c
+++ b/desktop/server.c
@@ -1,7 +1,3 @@
-/**
- * TODO: logging level
- */
-
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
@@ -10,50 +6,53 @@
#include "server.h"
#include "vector.h"
-
-#define SERVER_PORT 52178
-#define SERVER_HOST "localhost"
+#include "info.h"
+
+enum {
+ LWS_LOG_ERR = 1,
+ LWS_LOG_WARN = 2,
+ LWS_LOG_NOTICE = 4,
+ LWS_LOG_INFO = 8,
+ LWS_LOG_DEBUG = 16,
+ LWS_LOG_PARSER = 32,
+ LWS_LOG_HEADER = 64,
+ LWS_LOG_EXTENSION = 128,
+ LWS_LOG_CLIENT = 256,
+ LWS_LOG_LATENCY = 512
+};
static struct libwebsocket_context *context;
-static char *server_last_cmd_values[] = {
+static const char *server_commands[] = {
"none", "play", "pause", "next", "prev"
};
-struct per_session_data {
- bool established;
- char *next_command;
-};
-struct session {
- struct per_session_data *pss;
- struct libwebsocket *wsi;
-};
+server_command_t server_command;
+pthread_mutex_t server_command_mutex;
vector *sessions;
-static void add_session(struct libwebsocket *wsi, struct per_session_data *pss) {
- struct session *s = malloc(sizeof(struct session));
- s->wsi = wsi;
- s->pss = pss;
- vector_add(sessions, s);
+static void add_session(server_session_t *pss) {
+ vector_add(sessions, pss);
}
static void delete_session(struct libwebsocket *wsi) {
- for (int i = 0; i < vector_count(sessions); i++) {
- struct session *s = vector_get(sessions, i);
+ int count = vector_count(sessions);
+ for (int i = 0; i < count; i++) {
+ server_session_t *s = vector_get(sessions, i);
if (s != NULL && s->wsi == wsi) {
- printf("(delete_session) found, i=%d\n", i);
- free(s);
vector_delete(sessions, i);
break;
}
}
}
-static void send_command_to_all(char *command) {
- printf("Got command: %s\n", command);
- for (int i = 0; i < vector_count(sessions); i++) {
- struct session *s = (struct session *)vector_get(sessions, i);
- s->pss->next_command = command;
- libwebsocket_callback_on_writable(context, s->wsi);
+static void send_command(server_command_t command) {
+ int count = vector_count(sessions);
+ for (int i = 0; i < count; i++) {
+ server_session_t *s = vector_get(sessions, i);
+ if (s != NULL) {
+ s->next_command = command;
+ libwebsocket_callback_on_writable(context, s->wsi);
+ }
}
}
@@ -64,13 +63,13 @@ static int callback_http(struct libwebsocket_context *this,
void *in,
size_t len)
{
+ static const char *response = "vkpc, world!";
switch (reason) {
case LWS_CALLBACK_HTTP: ;
libwebsocket_callback_on_writable(context, wsi);
break;
case LWS_CALLBACK_HTTP_WRITEABLE: ;
- char *response = "vkpc, world!";
libwebsocket_write(wsi, (unsigned char *)response, strlen(response), LWS_WRITE_HTTP);
return -1;
@@ -87,26 +86,28 @@ static int callback_signaling(struct libwebsocket_context *this,
void *in,
size_t len)
{
- struct per_session_data *pss = (struct per_session_data *)user;
+ server_session_t *pss = (server_session_t *)user;
switch (reason) {
case LWS_CALLBACK_ESTABLISHED:
lwsl_info("Connection established");
- pss->established = true;
- pss->next_command = NULL;
- add_session(wsi, pss);
+ pss->next_command = NONE;
+ pss->wsi = wsi;
+ add_session(pss);
libwebsocket_callback_on_writable(context, wsi);
break;
case LWS_CALLBACK_SERVER_WRITEABLE:
- if (pss->next_command != NULL) {
- int length = strlen(pss->next_command);
+ if (pss->next_command != NONE) {
+ const char *command = server_commands[pss->next_command];
+ int length = strlen(command);
+
unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + length + LWS_SEND_BUFFER_POST_PADDING];
unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
- strcpy((char *)p, pss->next_command);
+ strcpy((char *)p, command);
int m = libwebsocket_write(wsi, p, length, LWS_WRITE_TEXT);
if (m < length) {
@@ -114,7 +115,7 @@ static int callback_signaling(struct libwebsocket_context *this,
return -1;
}
- pss->next_command = NULL;
+ pss->next_command = NONE;
}
break;
@@ -135,13 +136,13 @@ static int callback_signaling(struct libwebsocket_context *this,
return 0;
}
-static struct libwebsocket_protocols protocols[] = {
- { "http-only", callback_http, 0, 0 },
- { "signaling-protocol", callback_signaling, sizeof(struct per_session_data), 0 },
- { NULL, NULL, 0 }
-};
-
void server_init() {
+ static struct libwebsocket_protocols protocols[] = {
+ { "http-only", callback_http, 0, 0 },
+ { "signaling-protocol", callback_signaling, sizeof(server_session_t), 0 },
+ { NULL, NULL, 0 }
+ };
+
sessions = vector_create();
struct lws_context_creation_info info;
@@ -157,22 +158,25 @@ void server_init() {
info.uid = -1;
info.options = 0;
+#ifdef DEBUG
+ lws_set_log_level(LWS_LOG_ERR | LWS_LOG_WARN | LWS_LOG_NOTICE | LWS_LOG_INFO | LWS_LOG_DEBUG | LWS_LOG_HEADER, NULL);
+#else
+ lws_set_log_level(0, NULL);
+#endif
+
context = libwebsocket_create_context(&info);
if (context == NULL) {
fprintf(stderr, "libwebsocket init failed\n");
return;
}
- enum server_last_cmd_enum last_cmd = NONE;
while (1) {
- pthread_mutex_lock(&server_last_cmd_mutex);
- last_cmd = server_last_cmd;
- server_last_cmd = NONE;
- pthread_mutex_unlock(&server_last_cmd_mutex);
-
- if (last_cmd != NONE) {
- send_command_to_all(server_last_cmd_values[last_cmd]);
+ pthread_mutex_lock(&server_command_mutex);
+ if (server_command != NONE) {
+ send_command(server_command);
+ server_command = NONE;
}
+ pthread_mutex_unlock(&server_command_mutex);
libwebsocket_service(context, 50);
}