grim/purple-spasm

99c8b92f6aaf
Parents 9f3edb85a08c
Children 8151bd6aae79
Basic chat auth working, need to implement ping's yet
--- a/spasm-account.c Tue May 16 21:22:43 2017 -0500
+++ b/spasm-account.c Tue May 16 22:54:51 2017 -0500
@@ -30,6 +30,7 @@
GSocketClient *socket_client;
GSocketConnection *socket_connection;
GOutputStream *output_stream;
+ GDataInputStream *input_stream;
SoupSession *session;
@@ -75,6 +76,7 @@
g_object_unref(G_OBJECT(sa->socket_connection));
g_object_unref(G_OBJECT(sa->output_stream));
+ g_object_unref(G_OBJECT(sa->input_stream));
g_object_unref(G_OBJECT(sa->session));
g_free(sa);
@@ -120,6 +122,26 @@
sa->output_stream = output_stream;
}
+void
+purple_spasm_account_set_input_stream(
+ PurpleSpasmAccount *sa,
+ GDataInputStream *input_stream)
+{
+ g_return_if_fail(sa);
+
+ if(sa->input_stream)
+ g_object_unref(G_OBJECT(sa->input_stream));
+
+ sa->input_stream = input_stream;
+}
+
+GDataInputStream *
+purple_spasm_account_get_input_stream(const PurpleSpasmAccount *sa) {
+ g_return_val_if_fail(sa, NULL);
+
+ return g_object_ref(sa->input_stream);
+}
+
GCancellable *
purple_spasm_account_get_cancellable(const PurpleSpasmAccount *sa) {
g_return_val_if_fail(sa, NULL);
--- a/spasm-account.h Tue May 16 21:22:43 2017 -0500
+++ b/spasm-account.h Tue May 16 22:54:51 2017 -0500
@@ -44,6 +44,9 @@
void purple_spasm_account_set_socket_connection(PurpleSpasmAccount *sa, GSocketConnection *socket_connection);
void purple_spasm_account_set_output_stream(PurpleSpasmAccount *sa, GOutputStream *output_stream);
+void purple_spasm_account_set_input_stream(PurpleSpasmAccount *sa, GDataInputStream *input_stream);
+GDataInputStream *purple_spasm_account_get_input_stream(const PurpleSpasmAccount *sa);
+
GCancellable *purple_spasm_account_get_cancellable(const PurpleSpasmAccount *sa);
SoupSession *purple_spasm_account_get_session(const PurpleSpasmAccount *sa);
--- a/spasm-chat.c Tue May 16 21:22:43 2017 -0500
+++ b/spasm-chat.c Tue May 16 22:54:51 2017 -0500
@@ -22,6 +22,72 @@
#include "debug.h"
+/******************************************************************************
+ * read loop
+ *****************************************************************************/
+static void _purple_spasm_chat_read(PurpleSpasmAccount *sa);
+
+static void
+_purple_spasm_chat_read_cb(GObject *obj, GAsyncResult *res, gpointer data) {
+ GError *error = NULL;
+ gchar *buffer = NULL;
+ gsize buffer_len;
+ PurpleSpasmAccount *sa = (PurpleSpasmAccount *)data;
+
+ buffer = g_data_input_stream_read_line_finish(
+ G_DATA_INPUT_STREAM(obj),
+ res,
+ &buffer_len,
+ &error
+ );
+
+ /* g_data_input_stream_read_line_finish, will return null with error set
+ * on connection error. It will also return null with error not set if
+ * there is no content to read.
+ */
+ if(buffer == NULL) {
+ gchar *error_msg = NULL;
+
+ if(error != NULL) {
+ error_msg = g_strdup_printf(
+ "spasm lost connection with server : %s",
+ error->message
+ );
+ } else {
+ error_msg = g_strdup_printf("spasm server closed connection");
+ }
+
+ purple_connection_error(
+ purple_spasm_account_get_connection(sa),
+ error_msg
+ );
+
+ g_free(error_msg);
+
+ return;
+ }
+
+ purple_debug_info("spasm", "chat buffer: %s\n", buffer);
+
+ g_free(buffer);
+
+ _purple_spasm_chat_read(sa);
+}
+
+static void
+_purple_spasm_chat_read(PurpleSpasmAccount *sa) {
+ g_data_input_stream_read_line_async(
+ purple_spasm_account_get_input_stream(sa),
+ G_PRIORITY_DEFAULT,
+ purple_spasm_account_get_cancellable(sa),
+ _purple_spasm_chat_read_cb,
+ sa
+ );
+}
+
+/******************************************************************************
+ * chat login flow
+ *****************************************************************************/
static void
_purple_spasm_chat_login_cb(GObject *obj, GAsyncResult *res, gpointer data) {
GCancellable *cancellable = NULL;
@@ -30,7 +96,7 @@
GSocketConnection *socket_connection = NULL;
PurpleConnection *purple_connection = NULL;
PurpleSpasmAccount *sa = (PurpleSpasmAccount *)data;
- gboolean auth_success = FALSE;
+ gboolean success = FALSE;
cancellable = purple_spasm_account_get_cancellable(sa);
purple_connection = purple_spasm_account_get_connection(sa);
@@ -60,17 +126,41 @@
output = g_io_stream_get_output_stream(G_IO_STREAM(socket_connection));
/* now do the login */
- auth_success = g_output_stream_printf(
+ success = g_output_stream_printf(
output,
NULL,
cancellable,
&error,
- "PASS oauth:%s",
+ "PASS oauth:%s\r\n",
purple_spasm_account_get_access_token(sa)
);
- if(!auth_success) {
+ if(!success) {
if(error) {
- g_prefix_error(&error, "failed to connect: ");
+ g_prefix_error(&error, "failed to set password: ");
+
+ purple_connection_error(purple_connection, error->message);
+
+ g_error_free(error);
+ } else {
+ purple_connection_error(purple_connection, "unknown error");
+ }
+
+ return;
+ }
+ g_output_stream_flush(output, NULL, NULL);
+
+ /* now try to use our nick */
+ success = g_output_stream_printf(
+ output,
+ NULL,
+ cancellable,
+ &error,
+ "NICK %s\r\n",
+ purple_spasm_account_get_name(sa)
+ );
+ if(!success) {
+ if(error) {
+ g_prefix_error(&error, "failed to set nick : ");
purple_connection_error(purple_connection, error->message);
@@ -82,16 +172,22 @@
return;
}
- /* now try to use our nick */
+ g_output_stream_flush(output, NULL, NULL);
+ purple_spasm_account_set_input_stream(
+ sa,
+ g_data_input_stream_new(
+ g_io_stream_get_input_stream(G_IO_STREAM(socket_connection))
+ )
+ );
+
+ _purple_spasm_chat_read(sa);
}
void
purple_spasm_chat_login(PurpleSpasmAccount *sa) {
GSocketClient *socket_client = NULL;
- purple_debug_info("spasm", "attempting to login to the chat server\n");
-
socket_client = g_socket_client_new();
g_socket_client_connect_to_host_async(
@@ -103,3 +199,4 @@
sa
);
}
+