From 731f58d2d0e7304bf2eb6d6bc63dc471d0be4768 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Thu, 30 Apr 2020 15:00:53 +0200
Subject: [PATCH] Uri to Url

---
 inc/lektor/common.h            | 17 ++++++++-----
 inc/lektor/uri.h               |  4 ++++
 meson.build                    |  4 ++--
 src/{repo => net}/downloader.c |  5 ----
 src/{repo => net}/sync.c       |  0
 src/uri.c                      | 44 ++++++++++++++++++++++++++++++++++
 6 files changed, 61 insertions(+), 13 deletions(-)
 rename src/{repo => net}/downloader.c (98%)
 rename src/{repo => net}/sync.c (100%)

diff --git a/inc/lektor/common.h b/inc/lektor/common.h
index 64c43456..d025b87d 100644
--- a/inc/lektor/common.h
+++ b/inc/lektor/common.h
@@ -7,8 +7,13 @@
 
 /* Defines */
 
-#define LKT_MAX_SQLITE_STATEMENT    1024
-#define PROTECTED_DATABASE          "disk"
+#define URL_MAX_LEN     1024
+#define DEFAULT_URL     "https://kurisu.iiens.net"
+#define GET_ID_JSON     DEFAULT_URL "/api_karas.php?id=%ld"
+#define GET_ID_FILE     DEFAULT_URL "/download.php?id=%ld"
+
+#define LKT_MAX_SQLITE_STATEMENT        1024
+#define PROTECTED_DATABASE              "disk"
 
 #define LKT_DATABASE_NAME_KID           "id"
 #define LKT_DATABASE_NAME_KNAME         "source_name"
@@ -21,10 +26,10 @@
 #define LKT_DATABASE_KARA_COLUMNT_ANY   "any_col"
 #define LKT_DATABASE_KARA_ALL           "string"
 
-#define LEKTOR_TAG_MAX          256
-#define LKT_MESSAGE_ARGS_MAX    32
-#define LKT_MESSAGE_MAX         2048
-#define LKT_DEFAULT_LIST_SIZE   10
+#define LEKTOR_TAG_MAX                  256
+#define LKT_MESSAGE_ARGS_MAX            32
+#define LKT_MESSAGE_MAX                 2048
+#define LKT_DEFAULT_LIST_SIZE           10
 
 enum mpd_idle_flag {
     MPD_IDLE_NONE               = 0,
diff --git a/inc/lektor/uri.h b/inc/lektor/uri.h
index d278c9e9..c9a4d932 100644
--- a/inc/lektor/uri.h
+++ b/inc/lektor/uri.h
@@ -26,3 +26,7 @@ struct lkt_uri {
 /* Create and delete URIs */
 bool lkt_uri_from(struct lkt_uri *ret, char *const str);
 void lkt_uri_free(struct lkt_uri *ret);
+
+/* Make an URL to download from kurisu.
+   base_url is the prefix for the api, e.g. https://kurisu.iiens.net/api_kara.php */
+int lkt_uri_to_url(struct lkt_uri *uri, const char *base_url, char *ret, size_t len);
diff --git a/meson.build b/meson.build
index ca35a64f..45634813 100644
--- a/meson.build
+++ b/meson.build
@@ -56,11 +56,11 @@ core_sources =  [ 'src/mkv/bufferfd.c'
                 , 'src/net/command.c'
                 , 'src/net/listen.c'
                 , 'src/net/message.c'
+                , 'src/net/downloader.c'
+                , 'src/net/sync.c'
                 , 'src/config.c'
                 , 'src/uri.c'
                 , 'src/ini/ini.c'
-                , 'src/repo/downloader.c'
-                , 'src/repo/sync.c'
                 , 'src/thread.c'
                 ]
 
diff --git a/src/repo/downloader.c b/src/net/downloader.c
similarity index 98%
rename from src/repo/downloader.c
rename to src/net/downloader.c
index 593af704..9ac71ea2 100644
--- a/src/repo/downloader.c
+++ b/src/net/downloader.c
@@ -18,11 +18,6 @@
 
 static volatile unsigned int curl_init = false;
 
-#define URL_MAX_LEN 1024
-#define DEFAULT_URL "https://kurisu.iiens.net"
-#define GET_ID_JSON DEFAULT_URL "/api_karas.php?id=%ld"
-#define GET_ID_FILE DEFAULT_URL "/download.php?id=%ld"
-
 struct memory {
     void *mem;
     size_t size;
diff --git a/src/repo/sync.c b/src/net/sync.c
similarity index 100%
rename from src/repo/sync.c
rename to src/net/sync.c
diff --git a/src/uri.c b/src/uri.c
index 88048dd8..ac8634be 100644
--- a/src/uri.c
+++ b/src/uri.c
@@ -88,3 +88,47 @@ lkt_uri_free(struct lkt_uri *ret)
     if (ret->_allocated)
         free(ret->value);
 }
+
+/* Support a subrange of URIs. */
+static inline int
+__lkt_to_str(struct lkt_uri *uri, char *ret, size_t len)
+{
+    switch (uri->type) {
+    case uri_id:
+        snprintf(ret, len - 1, "id=%s", (char *) uri->value);
+        break;
+    case uri_type:
+        snprintf(ret, len - 1, "type=%s", (char *) uri->value);
+        break;
+    case uri_author:
+        snprintf(ret, len - 1, "author=%s", (char *) uri->value);
+        break;
+    case uri_category:
+        snprintf(ret, len - 1, "cat=%s", (char *) uri->value);
+        break;
+    case uri_query:
+        snprintf(ret, len - 1, "search=%s", (char *) uri->value);
+        break;
+    default:
+        LOG_ERROR("URI type %d may not be supported by kurisu, generate an error", uri->type);
+        return 1;
+    }
+
+    ret[len - 1] = '\0';
+    return 0;
+}
+
+int
+lkt_uri_to_url(struct lkt_uri *uri, const char *base_url, char *ret, size_t len)
+{
+    RETURN_UNLESS(uri && base_url && ret && len > 0, "Invalid argument", 1);
+
+    /* Craft URL */
+    memset(ret, 0, len);
+    memcpy(ret, base_url, sizeof(char) * strlen(base_url));
+    strncat(ret, "?", len - 1);
+
+    /* The query */
+    size_t init_len = strlen(ret);
+    return __lkt_to_str(uri, ret + init_len, len - init_len);
+}
-- 
GitLab