summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornirav <nirav@teisuu.com>2019-03-10 13:30:19 +0530
committerDandelion <nirav@teisuu.com>2019-03-10 13:30:19 +0530
commit7e8ea36eb8106b4847af13a27a3e8f3177d25809 (patch)
tree084b59cf020d82985cdcb09bad18721cd5ecdf7e
parentbd7b0be8978cfd30ac72cf36021153b2a7d68051 (diff)
downloadap_client-7e8ea36eb8106b4847af13a27a3e8f3177d25809.tar.gz
ap_client-7e8ea36eb8106b4847af13a27a3e8f3177d25809.zip
Refactor main.c and auth.c
-rw-r--r--Makefile4
-rw-r--r--src/auth.c75
-rw-r--r--src/login_window.c156
-rw-r--r--src/login_window.h8
-rw-r--r--src/main.c128
-rw-r--r--src/timeline.c5
-rw-r--r--src/timeline.h2
-rw-r--r--src/timeline_window.c38
-rw-r--r--src/timeline_window.h9
-rw-r--r--src/window.c28
-rw-r--r--src/window.h7
11 files changed, 265 insertions, 195 deletions
diff --git a/Makefile b/Makefile
index f2f4921..8b84c4a 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/src/auth.c b/src/auth.c
index a2e8519..648c2c8 100644
--- a/src/auth.c
+++ b/src/auth.c
@@ -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, &register_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
+
+
diff --git a/src/main.c b/src/main.c
index b29b081..45ea3cd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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, &register_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
-