diff options
author | nirav <nirav@teisuu.com> | 2019-03-10 13:30:19 +0530 |
---|---|---|
committer | Dandelion <nirav@teisuu.com> | 2019-03-10 13:30:19 +0530 |
commit | 7e8ea36eb8106b4847af13a27a3e8f3177d25809 (patch) | |
tree | 084b59cf020d82985cdcb09bad18721cd5ecdf7e | |
parent | bd7b0be8978cfd30ac72cf36021153b2a7d68051 (diff) | |
download | ap_client-7e8ea36eb8106b4847af13a27a3e8f3177d25809.tar.gz ap_client-7e8ea36eb8106b4847af13a27a3e8f3177d25809.zip |
Refactor main.c and auth.c
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | src/auth.c | 75 | ||||
-rw-r--r-- | src/login_window.c | 156 | ||||
-rw-r--r-- | src/login_window.h | 8 | ||||
-rw-r--r-- | src/main.c | 128 | ||||
-rw-r--r-- | src/timeline.c | 5 | ||||
-rw-r--r-- | src/timeline.h | 2 | ||||
-rw-r--r-- | src/timeline_window.c | 38 | ||||
-rw-r--r-- | src/timeline_window.h | 9 | ||||
-rw-r--r-- | src/window.c | 28 | ||||
-rw-r--r-- | src/window.h | 7 |
11 files changed, 265 insertions, 195 deletions
@@ -5,7 +5,6 @@ CFLAGS=-o2 -pipe CFLAGS+=-Wall -Wextra -Wno-unused-parameter CFLAGS+=$(shell $(PKGCONFIG) --cflags gtk+-3.0 libcurl jansson) -lpthread LDFLAGS+=$(shell $(PKGCONFIG) --libs gtk+-3.0 libcurl jansson) -lpthread -LDFLAGS+= DESTDIR= PREFIX=/usr/local BINDIR=$(PREFIX)/bin @@ -18,7 +17,8 @@ OBJECTS=$(OUTDIR)/main.o \ $(OUTDIR)/status.o \ $(OUTDIR)/timeline.o \ $(OUTDIR)/auth.o \ - $(OUTDIR)/window.o + $(OUTDIR)/login_window.o \ + $(OUTDIR)/timeline_window.o all: ap_client @@ -9,14 +9,14 @@ #include "http.h" #define CLIENT_NAME "ap_client" +#define PROTOCOL_PREFIX "https://" -char *instance_domain = NULL; -char *client_id = NULL; -char *client_secret = NULL; -char *access_token = NULL; -char *scope = NULL; +char *instance_domain; +char *client_id; +char *client_secret; +char *access_token; +char *scope; -static char *protocol = "https://"; static char *app_register_url = "/api/v1/apps"; static char *login_url = "/oauth/token"; @@ -29,9 +29,9 @@ struct register_call_arg { static void *register_call(void *req_arg) { - struct register_call_arg *arg = NULL; - char *resp = NULL; - json_t *root = NULL; + struct register_call_arg *arg; + char *resp; + json_t *root; arg = (struct register_call_arg *)req_arg; if (!arg || !(arg->url)) { @@ -105,16 +105,27 @@ error: int register_app(const char *instance, void (*callback)(bool success)) { + size_t size; + char *instance_prefix; + char *url, *req_data; + struct register_call_arg *arg; + json_t *root; + json_error_t error; + pthread_t t; + if (!instance || strlen(instance) < 1 || !callback) { fprintf(stderr, "register_app(): invalid argument\n"); return -1; } - json_t *root; - json_error_t error; - pthread_t t; - char *url, *req_data; - struct register_call_arg *arg; + size = sizeof(PROTOCOL_PREFIX) + sizeof(instance) + 1; + instance_prefix = malloc(size); + if (!instance_prefix) { + err(1, "register_app(): malloc failed"); + return -1; + } + strlcpy(instance_prefix, PROTOCOL_PREFIX, size); + strlcat(instance_prefix, instance, size); root = json_pack_ex(&error, 1, "{s:s, s:s, s:s}", "client_name", CLIENT_NAME, "redirect_uris", "urn:ietf:wg:oauth:2.0:oob", "scopes", @@ -133,15 +144,15 @@ int register_app(const char *instance, void (*callback)(bool success)) return -1; } - size_t s = - strlen(protocol) + strlen(instance) + strlen(app_register_url) + 1; - url = malloc(s); + size = strlen(instance_prefix) + strlen(app_register_url) + 1; + url = malloc(size); if (!url) { err(1, "register_app(): malloc failed"); return -1; } - sprintf(url, "%s%s%s", protocol, instance, app_register_url); + strlcpy(url, instance_prefix, size); + strlcat(url, app_register_url, size); arg = calloc(1, sizeof(struct register_call_arg)); if (!arg) { @@ -149,7 +160,7 @@ int register_app(const char *instance, void (*callback)(bool success)) return -1; } arg->url = url; - arg->domain = strdup(instance); + arg->domain = instance_prefix; arg->post_data = req_data; arg->callback = callback; @@ -238,6 +249,13 @@ error: int login( const char *email, const char *password, void (*callback)(bool success)) { + json_t *root; + json_error_t error; + pthread_t t; + size_t size; + char *url, *req_data; + struct login_call_arg *arg; + if (!email || strlen(email) < 1 || !password || strlen(password) < 1) { fprintf(stderr, "login(): invalid argument\n"); return -1; @@ -253,14 +271,8 @@ int login( return -1; } - json_t *root; - json_error_t error; - pthread_t t; - char *url, *req_data; - struct login_call_arg *arg; - - root = json_pack_ex(&error, 1, "{s:s, s:s, s:s, s:s, s:s}", "client_id", client_id, - "client_secret", client_secret, "grant_type", "password", + root = json_pack_ex(&error, 1, "{s:s, s:s, s:s, s:s, s:s}", "client_id", + client_id, "client_secret", client_secret, "grant_type", "password", "username", email, "password", password); if (!root) { @@ -276,15 +288,14 @@ int login( return -1; } - size_t s = strlen(protocol) + strlen(instance_domain) + - strlen(login_url) + 1; - url = malloc(s); + size = strlen(instance_domain) + strlen(login_url) + 1; + url = malloc(size); if (!url) { err(1, "login(): malloc failed"); return -1; } - - sprintf(url, "%s%s%s", protocol, instance_domain, login_url); + strlcpy(url, instance_domain, size); + strlcat(url, login_url, size); arg = calloc(1, sizeof(struct login_call_arg)); if (!arg) { diff --git a/src/login_window.c b/src/login_window.c new file mode 100644 index 0000000..32f88a0 --- /dev/null +++ b/src/login_window.c @@ -0,0 +1,156 @@ +#define _POSIX_C_SOURCE 200809L +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <gtk-3.0/gtk/gtk.h> +#include "auth.h" +#include "http.h" +#include "timeline.h" +#include "timeline_window.h" + +GtkApplication *application; +static GtkWidget *window; +static GtkWidget *box; +static GtkWidget *instance_name_box, *email_box, *password_box; +static GtkWidget *submit_button; +static GtkWidget *spinner; + +static void window_removed( + GtkApplication *application, GtkWindow *w, gpointer user_data) +{ + gtk_widget_destroy(GTK_WIDGET(w)); +} + +static void login_callback(bool success) +{ + if (!success) { + fprintf(stderr, "login_callback(): login failed\n"); + gtk_spinner_stop(GTK_SPINNER(spinner)); + return; + } + + printf("login success\n"); + gtk_spinner_stop(GTK_SPINNER(spinner)); + create_timeline_window(application, NULL); + gtk_window_close(GTK_WINDOW(window)); + gtk_application_remove_window( + GTK_APPLICATION(application), GTK_WINDOW(window)); +} + +static void register_callback(bool success) +{ + if (!success) { + gtk_spinner_stop(GTK_SPINNER(spinner)); + fprintf(stderr, "register_callback(): register failed\n"); + return; + } + printf("register success\n"); + + const char *email, *password; + email = gtk_entry_get_text(GTK_ENTRY(email_box)); + password = gtk_entry_get_text(GTK_ENTRY(password_box)); + + if (login(email, password, &login_callback)) { + gtk_spinner_stop(GTK_SPINNER(spinner)); + return; + } +} + +static void submit_login_form() +{ + gtk_spinner_start(GTK_SPINNER(spinner)); + const char *instance_name; + instance_name = gtk_entry_get_text(GTK_ENTRY(instance_name_box)); + if (register_app(instance_name, ®ister_callback)) { + gtk_spinner_stop(GTK_SPINNER(spinner)); + return; + } + return; +} + +static bool is_form_valid() +{ + if (strlen(gtk_entry_get_text(GTK_ENTRY(instance_name_box))) < 1 || + strlen(gtk_entry_get_text(GTK_ENTRY(email_box))) < 1 || + strlen(gtk_entry_get_text(GTK_ENTRY(password_box))) < 1) + return false; + return true; +} + +static void submit_button_clicked(GtkButton *button, gpointer user_data) +{ + if (is_form_valid()) + submit_login_form(); +} + +static void form_on_activate(GtkEntry *entry, gpointer user_data) +{ + if (is_form_valid()) + submit_login_form(); +} + +static void on_form_changed(GtkWidget *widget, gpointer data) +{ + if (is_form_valid()) + gtk_widget_set_sensitive(GTK_WIDGET(submit_button), true); + else + gtk_widget_set_sensitive(GTK_WIDGET(submit_button), false); +} + +void create_login_window(GtkApplication *app, gpointer user_data) +{ + application = app; + window = gtk_application_window_new(app); + gtk_window_set_title(GTK_WINDOW(window), "ap_client"); + gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); + gtk_container_set_border_width(GTK_CONTAINER(window), 10); + g_signal_connect(app, "window-removed", G_CALLBACK(window_removed), NULL); + + box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); + gtk_widget_set_valign(GTK_WIDGET(box), GTK_ALIGN_CENTER); + gtk_widget_set_halign(GTK_WIDGET(box), GTK_ALIGN_CENTER); + + instance_name_box = gtk_entry_new(); + gtk_entry_set_placeholder_text( + GTK_ENTRY(instance_name_box), "Instance domain"); + g_signal_connect(GTK_ENTRY(instance_name_box), "activate", + G_CALLBACK(form_on_activate), NULL); + g_signal_connect(G_OBJECT(instance_name_box), "changed", + G_CALLBACK(on_form_changed), NULL); + + email_box = gtk_entry_new(); + gtk_entry_set_placeholder_text(GTK_ENTRY(email_box), "Email"); + gtk_entry_set_input_purpose(GTK_ENTRY(email_box), GTK_INPUT_PURPOSE_EMAIL); + g_signal_connect(GTK_ENTRY(email_box), "activate", + G_CALLBACK(form_on_activate), NULL); + g_signal_connect( + G_OBJECT(email_box), "changed", G_CALLBACK(on_form_changed), NULL); + + password_box = gtk_entry_new(); + gtk_entry_set_placeholder_text(GTK_ENTRY(password_box), "Password"); + gtk_entry_set_input_purpose( + GTK_ENTRY(password_box), GTK_INPUT_PURPOSE_PASSWORD); + gtk_entry_set_visibility(GTK_ENTRY(password_box), false); + g_signal_connect(GTK_ENTRY(password_box), "activate", + G_CALLBACK(form_on_activate), NULL); + g_signal_connect(G_OBJECT(password_box), "changed", + G_CALLBACK(on_form_changed), NULL); + + submit_button = gtk_button_new(); + g_signal_connect(GTK_BUTTON(submit_button), "clicked", + G_CALLBACK(submit_button_clicked), G_OBJECT(window)); + gtk_button_set_label(GTK_BUTTON(submit_button), "Submit"); + gtk_widget_set_sensitive(GTK_WIDGET(submit_button), false); + + spinner = gtk_spinner_new(); + + gtk_container_add(GTK_CONTAINER(window), box); + gtk_container_add(GTK_CONTAINER(box), instance_name_box); + gtk_container_add(GTK_CONTAINER(box), email_box); + gtk_container_add(GTK_CONTAINER(box), password_box); + gtk_container_add(GTK_CONTAINER(box), submit_button); + gtk_container_add(GTK_CONTAINER(box), spinner); + + gtk_widget_show_all(window); +} diff --git a/src/login_window.h b/src/login_window.h new file mode 100644 index 0000000..cf879cc --- /dev/null +++ b/src/login_window.h @@ -0,0 +1,8 @@ +#ifndef __LOGIN_WINDOW_H +#define __LOGIN_WINDOW_H + +void create_login_window(GtkApplication *app, gpointer user_data); + +#endif + + @@ -7,136 +7,12 @@ #include "auth.h" #include "http.h" #include "timeline.h" -#include "window.h" +#include "login_window.h" -static GtkWidget *window; -static GtkWidget *box; -static GtkWidget *instance_name_box, *email_box, *password_box; -static GtkWidget *submit_button; -static GtkWidget *spinner; - -static void login_callback(bool success) -{ - if (!success) { - fprintf(stderr, "login_callback(): login failed\n"); - gtk_spinner_stop(GTK_SPINNER(spinner)); - return; - } - - printf("login success\n"); - gtk_spinner_stop(GTK_SPINNER(spinner)); -} - -static void register_callback(bool success) -{ - if (!success) { - gtk_spinner_stop(GTK_SPINNER(spinner)); - fprintf(stderr, "register_callback(): register failed\n"); - return; - } - printf("register success\n"); - - const char *email, *password; - email = gtk_entry_get_text(GTK_ENTRY(email_box)); - password = gtk_entry_get_text(GTK_ENTRY(password_box)); - - if (login(email, password, &login_callback)) { - gtk_spinner_stop(GTK_SPINNER(spinner)); - return; - } -} - -static void submit_login_form() -{ - gtk_spinner_start(GTK_SPINNER(spinner)); - const char *instance_name; - instance_name = gtk_entry_get_text(GTK_ENTRY(instance_name_box)); - if (register_app(instance_name, ®ister_callback)) { - gtk_spinner_stop(GTK_SPINNER(spinner)); - return; - } -} - -static void submit_button_clicked(GtkButton *button, gpointer user_data) -{ - submit_login_form(); -} - -static void form_on_activate(GtkEntry *entry, gpointer user_data) -{ - submit_login_form(); -} - -static bool is_form_valid() -{ - if (strlen(gtk_entry_get_text(GTK_ENTRY(instance_name_box))) < 1 || - strlen(gtk_entry_get_text(GTK_ENTRY(email_box))) < 1 || - strlen(gtk_entry_get_text(GTK_ENTRY(password_box))) < 1) - return false; - return true; -} - -static void on_form_changed(GtkWidget *widget, gpointer data) -{ - if (is_form_valid()) - gtk_widget_set_sensitive(GTK_WIDGET(submit_button), true); - else - gtk_widget_set_sensitive(GTK_WIDGET(submit_button), false); -} static void activate(GtkApplication *app, gpointer user_data) { - window = gtk_application_window_new(app); - gtk_window_set_title(GTK_WINDOW(window), "ap_client"); - gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); - gtk_container_set_border_width(GTK_CONTAINER(window), 10); - - box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); - gtk_widget_set_valign(GTK_WIDGET(box), GTK_ALIGN_CENTER); - gtk_widget_set_halign(GTK_WIDGET(box), GTK_ALIGN_CENTER); - - instance_name_box = gtk_entry_new(); - gtk_entry_set_placeholder_text( - GTK_ENTRY(instance_name_box), "Instance domain"); - g_signal_connect(GTK_ENTRY(instance_name_box), "activate", - G_CALLBACK(form_on_activate), NULL); - g_signal_connect(G_OBJECT(instance_name_box), "changed", - G_CALLBACK(on_form_changed), NULL); - - email_box = gtk_entry_new(); - gtk_entry_set_placeholder_text(GTK_ENTRY(email_box), "Email"); - gtk_entry_set_input_purpose(GTK_ENTRY(email_box), GTK_INPUT_PURPOSE_EMAIL); - g_signal_connect(GTK_ENTRY(email_box), "activate", - G_CALLBACK(form_on_activate), NULL); - g_signal_connect(G_OBJECT(email_box), "changed", - G_CALLBACK(on_form_changed), NULL); - - password_box = gtk_entry_new(); - gtk_entry_set_placeholder_text(GTK_ENTRY(password_box), "Password"); - gtk_entry_set_input_purpose( - GTK_ENTRY(password_box), GTK_INPUT_PURPOSE_PASSWORD); - gtk_entry_set_visibility(GTK_ENTRY(password_box), false); - g_signal_connect(GTK_ENTRY(password_box), "activate", - G_CALLBACK(form_on_activate), NULL); - g_signal_connect(G_OBJECT(password_box), "changed", - G_CALLBACK(on_form_changed), NULL); - - submit_button = gtk_button_new(); - g_signal_connect(GTK_BUTTON(submit_button), "clicked", - G_CALLBACK(submit_button_clicked), G_OBJECT(window)); - gtk_button_set_label(GTK_BUTTON(submit_button), "Submit"); - gtk_widget_set_sensitive(GTK_WIDGET(submit_button), false); - - spinner = gtk_spinner_new(); - - gtk_container_add(GTK_CONTAINER(window), box); - gtk_container_add(GTK_CONTAINER(box), instance_name_box); - gtk_container_add(GTK_CONTAINER(box), email_box); - gtk_container_add(GTK_CONTAINER(box), password_box); - gtk_container_add(GTK_CONTAINER(box), submit_button); - gtk_container_add(GTK_CONTAINER(box), spinner); - - gtk_widget_show_all(window); + create_login_window(app, user_data); } int main(int argc, char **argv) diff --git a/src/timeline.c b/src/timeline.c index c2ca486..7b0a567 100644 --- a/src/timeline.c +++ b/src/timeline.c @@ -68,3 +68,8 @@ void timeline_free(struct timeline *t) } free(t); } + +int lod_timeline(const char *max_id, const char *since_id, const char *min_id, int limit) +{ + return 0; +} diff --git a/src/timeline.h b/src/timeline.h index f21b3b6..f31f618 100644 --- a/src/timeline.h +++ b/src/timeline.h @@ -10,5 +10,7 @@ struct timeline { struct timeline *timeline_from_json(char *); void timeline_free(struct timeline *); +int lod_timeline(const char *max_id, const char *since_id, const char *min_id, + int limit); #endif diff --git a/src/timeline_window.c b/src/timeline_window.c new file mode 100644 index 0000000..c09397a --- /dev/null +++ b/src/timeline_window.c @@ -0,0 +1,38 @@ +#define _POSIX_C_SOURCE 200809L +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <gtk-3.0/gtk/gtk.h> +#include "auth.h" +#include "http.h" +#include "timeline.h" + +static GtkWidget *window; +static GtkWidget *box; +static GtkWidget *label; + +static void load_tieline() +{ + return; +} + +void create_timeline_window(GtkApplication *app, gpointer user_data) +{ + window = gtk_application_window_new(app); + gtk_window_set_title(GTK_WINDOW(window), "ap_client"); + gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); + gtk_container_set_border_width(GTK_CONTAINER(window), 10); + + box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); + gtk_widget_set_valign(GTK_WIDGET(box), GTK_ALIGN_CENTER); + gtk_widget_set_halign(GTK_WIDGET(box), GTK_ALIGN_CENTER); + + label = gtk_label_new("timeline"); + + gtk_container_add(GTK_CONTAINER(window), box); + gtk_container_add(GTK_CONTAINER(box), label); + + gtk_widget_show_all(window); + load_tieline(); +} diff --git a/src/timeline_window.h b/src/timeline_window.h new file mode 100644 index 0000000..8aff454 --- /dev/null +++ b/src/timeline_window.h @@ -0,0 +1,9 @@ +#ifndef __TIMELINE_WINDOW_H +#define __TIMELINE_WINDOW_H + +void create_timeline_window (GtkApplication *app, gpointer user_data); + +#endif + + + diff --git a/src/window.c b/src/window.c deleted file mode 100644 index 831be60..0000000 --- a/src/window.c +++ /dev/null @@ -1,28 +0,0 @@ -#define _POSIX_C_SOURCE 200809L -#include <stdbool.h> -#include <gtk-3.0/gtk/gtk.h> - -#define WINDOW_TITLE "ap_client" - -GtkWidget *window; -GtkWidget *scrolled_window; - -void create_main_window() -{ - // root window - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); - gtk_widget_set_name(GTK_WIDGET(window), "main-window"); - gtk_window_set_title(GTK_WINDOW(window), WINDOW_TITLE); - gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); - - // scrolled window - scrolled_window = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_set_vexpand(GTK_WIDGET(scrolled_window), true); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - GtkWidget *viewport = gtk_viewport_new(NULL, NULL); - gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(viewport)); - gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(scrolled_window)); - gtk_widget_show_all(GTK_WIDGET(window)); -} diff --git a/src/window.h b/src/window.h deleted file mode 100644 index 947cdbe..0000000 --- a/src/window.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __WINDOW_H -#define __WINDOW_H - -void create_main_window(); - -#endif - |