diff --git a/perl/lists.pm b/perl/lists.pm new file mode 100644 index 0000000..f53f7ed --- /dev/null +++ b/perl/lists.pm @@ -0,0 +1,15 @@ +package lists; +use strict; +use warnings; +use Exporter 'import'; + +our @EXPORTS = qw( ); + +use template_helpers 'to_template'; + +sub content_lists +{ + my ($ssn, $data, $lists) = @_; + + to_template(\%vars, $data->{'content_lists.tt'}); +} diff --git a/perl/notifications.pm b/perl/notifications.pm index 30c968e..8edc869 100644 --- a/perl/notifications.pm +++ b/perl/notifications.pm @@ -27,7 +27,7 @@ sub content_notifications my %vars = ( prefix => '', ssn=> $ssn, - notif => $notif + notifs => $notifs ); to_template(\%vars, \$data->{'content_notifs.tt'}); diff --git a/src/base_page.c b/src/base_page.c index 68c92db..7780d82 100644 --- a/src/base_page.c +++ b/src/base_page.c @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -#include #include #include #include "helpers.h" @@ -28,6 +27,7 @@ #include "../config.h" #include "local_config_set.h" #include "account.h" +#include #include "global_cache.h" // Files @@ -80,7 +80,7 @@ void render_base_page(struct base_page* page, FCGX_Request* req, struct session* PUSHMARK(SP); if (page->session) - mXPUSHs(newRV_inc(page->session)); + mXPUSHs(newRV_inc((SV*)page->session)); else mXPUSHs(newRV_inc((SV*)perlify_session(ssn))); XPUSHs(newRV_inc((SV*)template_files)); @@ -99,7 +99,7 @@ void render_base_page(struct base_page* page, FCGX_Request* req, struct session* SPAGAIN; send_result(req, NULL, "text/html", POPp, 0); -cleanup: + PUTBACK; FREETMPS; LEAVE; diff --git a/src/base_page.h b/src/base_page.h index 4538390..d2886fd 100644 --- a/src/base_page.h +++ b/src/base_page.h @@ -18,6 +18,7 @@ #ifndef BASE_PAGE_H #define BASE_PAGE_H +#include "global_perl.h" #include "session.h" #include #include diff --git a/src/cookie.c b/src/cookie.c index dec504e..f746ebb 100644 --- a/src/cookie.c +++ b/src/cookie.c @@ -16,11 +16,11 @@ * along with this program. If not, see . */ +#include "cookie.h" #include #include #include #include -#include "cookie.h" #include "env.h" enum cookie_state diff --git a/src/cookie.h b/src/cookie.h index 77ace71..0381de7 100644 --- a/src/cookie.h +++ b/src/cookie.h @@ -21,6 +21,8 @@ #include #include "global_perl.h" #include "key.h" +#include +#include struct cookie_values { diff --git a/src/emoji.c b/src/emoji.c index 0f309af..5ab6d31 100644 --- a/src/emoji.c +++ b/src/emoji.c @@ -16,11 +16,11 @@ * along with this program. If not, see . */ +#include "emoji.h" #include #include #include "base_page.h" #include "string.h" -#include "emoji.h" #include "easprintf.h" #include "string_helpers.h" @@ -171,7 +171,7 @@ HV* perlify_emoji(struct mstdnt_emoji* const emoji) hvstores_str(emoji_hv, "shortcode", emoji->shortcode); hvstores_str(emoji_hv, "url", emoji->url); hvstores_str(emoji_hv, "static_url", emoji->static_url); - hvstores_str(emoji_hv, "visible_in_picker", emoji->visible_in_picker); + hvstores_int(emoji_hv, "visible_in_picker", emoji->visible_in_picker); hvstores_str(emoji_hv, "category", emoji->category); return emoji_hv; } diff --git a/src/emoji.h b/src/emoji.h index 67b624b..31c81fc 100644 --- a/src/emoji.h +++ b/src/emoji.h @@ -20,8 +20,9 @@ #define EMOJI_H #include #include -#include "emoji_codes.h" #include "global_perl.h" +#include "emoji_codes.h" +#include "path.h" #define EMOJI_FACTOR_NUM 32 diff --git a/src/global_perl.c b/src/global_perl.c index a2bfc3c..94f34cc 100644 --- a/src/global_perl.c +++ b/src/global_perl.c @@ -32,6 +32,7 @@ #include "../templates/account_statuses.ctt" #include "../templates/account_scrobbles.ctt" #include "../templates/content_notifs.ctt" +#include "../templates/content_lists.ctt" HV* template_files; pthread_mutex_t perl_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -53,6 +54,7 @@ void init_template_files() hv_stores(template_files, "account_statuses.tt", newSVpv(data_account_statuses_tt, data_account_statuses_tt_size)); hv_stores(template_files, "account_scrobbles.tt", newSVpv(data_account_scrobbles_tt, data_account_scrobbles_tt_size)); hv_stores(template_files, "content_notifs.tt", newSVpv(data_content_notifs_tt, data_content_notifs_tt_size)); + hv_stores(template_files, "content_lists.tt", newSVpv(data_content_lists_tt, data_content_lists_tt_size)); } void cleanup_template_files() diff --git a/src/lists.c b/src/lists.c index c12c89e..1433cb1 100644 --- a/src/lists.c +++ b/src/lists.c @@ -17,6 +17,7 @@ */ #include +#include "global_perl.h" #include "helpers.h" #include "base_page.h" #include "../config.h" @@ -33,50 +34,13 @@ #include "../static/list.ctmpl" #include "../static/lists.ctmpl" -char* construct_list(struct mstdnt_list* list, size_t* size) -{ - char* result; - char* title = list->title; - char* list_name = sanitize_html(title); - struct list_template data = { - .list = list_name, - .prefix = config_url_prefix, - .list_id = list->id - }; - result = tmpl_gen_list(&data, size); - if (list_name != title) - free(list_name); - return result; -} - -static char* construct_list_voidwrap(void* passed, size_t index, size_t* res) -{ - return construct_list((struct mstdnt_list*)passed + index, res); -} - -char* construct_lists(struct mstdnt_list* lists, size_t size, size_t* ret_size) -{ - return construct_func_strings(construct_list_voidwrap, lists, size, ret_size); -} - -char* construct_lists_view(char* lists_string, size_t* size) -{ - struct lists_template data = { - .lists = lists_string, - .prefix = config_url_prefix - }; - return tmpl_gen_lists(&data, size); -} - void content_lists(PATH_ARGS) { struct mstdnt_args m_args; set_mstdnt_args(&m_args, ssn); struct mstdnt_list* lists = NULL; - size_t size_list = 0; + size_t list_len = 0; struct mstdnt_storage storage = { 0 }; - char* lists_format = NULL; - char* lists_page = NULL; if (ssn->post.title.is_set) { @@ -89,20 +53,36 @@ void content_lists(PATH_ARGS) mastodont_storage_cleanup(&create_storage); } - if (mastodont_get_lists(api, &m_args, &storage, &lists, &size_list)) - { - lists_page = construct_error(storage.error, E_ERROR, 1, NULL); - } - else { - lists_format = construct_lists(lists, size_list, NULL); - if (!lists_format) - lists_format = construct_error("No lists", E_ERROR, 1, NULL); - lists_page = construct_lists_view(lists_format, NULL); - } + mastodont_get_lists(api, &m_args, &storage, &lists, &list_len); + + // Call perl + perl_lock(); + dSP; + ENTER; + SAVETMPS; + PUSHMARK(SP); + + HV* session_hv = perlify_session(ssn); + XPUSHs(newRV_noinc((SV*)session_hv)); + XPUSHs(newRV_noinc((SV*)template_files)); + // TODO Perlify lists + + // ARGS + PUTBACK; + call_pv("lists::content_lists", G_SCALAR); + SPAGAIN; + + // Duplicate so we can free the TMPs + char* dup = savesharedsvpv(POPs); + PUTBACK; + FREETMPS; + LEAVE; + perl_unlock(); struct base_page b = { .category = BASE_CAT_LISTS, - .content = lists_page, + .content = dup, + .session = session_hv, .sidebar_left = NULL }; @@ -111,9 +91,8 @@ void content_lists(PATH_ARGS) // Cleanup mastodont_storage_cleanup(&storage); - if (lists_format) free(lists_format); - if (lists_page) free(lists_page); mstdnt_cleanup_lists(lists); + Safefree(dup); } void list_edit(PATH_ARGS) diff --git a/src/lists.h b/src/lists.h index 289163e..5414ce7 100644 --- a/src/lists.h +++ b/src/lists.h @@ -22,10 +22,9 @@ #include #include "session.h" -char* construct_list(struct mstdnt_list* list, size_t* size); -char* construct_lists(struct mstdnt_list* lists, size_t size, size_t* ret_size); -char* construct_lists_view(char* lists_string, size_t* size); +/** Creates the main lists view */ void content_lists(PATH_ARGS); +/** Creates a list and then redirects */ void list_edit(PATH_ARGS); #endif // LISTS_H diff --git a/src/local_config_set.h b/src/local_config_set.h index 0135b5f..c3be2c7 100644 --- a/src/local_config_set.h +++ b/src/local_config_set.h @@ -19,12 +19,12 @@ #ifndef LOCAL_CONFIG_SET_H #define LOCAL_CONFIG_SET_H #include -#include -#include -#include "local_config.h" #include "session.h" #include "attachments.h" +#include "local_config.h" #include "key.h" +#include +#include enum config_page { diff --git a/src/login.c b/src/login.c index c5e1654..0bc74d9 100644 --- a/src/login.c +++ b/src/login.c @@ -16,18 +16,18 @@ * along with this program. If not, see . */ -#include -#include +#include "login.h" #include #include #include "helpers.h" #include "query.h" #include "base_page.h" -#include "login.h" #include "error.h" #include "easprintf.h" #include "../config.h" #include "http.h" +#include +#include // Files #include "../static/login.ctmpl" diff --git a/src/main.c b/src/main.c index 82e2101..c4ee17b 100644 --- a/src/main.c +++ b/src/main.c @@ -16,12 +16,10 @@ * along with this program. If not, see . */ -#include #include #include -#include #include "global_perl.h" -#include +#include #include #include #include @@ -47,6 +45,8 @@ #include "local_config_set.h" #include "global_cache.h" #include "conversations.h" +#include +#include #define THREAD_COUNT 20 diff --git a/src/page_config.c b/src/page_config.c index 85bb147..1e3eb72 100644 --- a/src/page_config.c +++ b/src/page_config.c @@ -16,19 +16,19 @@ * along with this program. If not, see . */ -#include +#include "page_config.h" #include #include #include "http.h" #include "base_page.h" #include "../config.h" #include "easprintf.h" -#include "page_config.h" #include "query.h" #include "cookie.h" #include "local_config_set.h" #include "string_helpers.h" #include "l10n.h" +#include // Pages #include "../static/config_general.ctmpl" diff --git a/src/page_config.h b/src/page_config.h index e30b1d9..e2baa4f 100644 --- a/src/page_config.h +++ b/src/page_config.h @@ -20,10 +20,10 @@ #define PAGE_CONFIG_H #include #include -#include -#include #include "path.h" #include "session.h" +#include +#include void content_config_appearance(PATH_ARGS); void content_config_general(PATH_ARGS); diff --git a/src/path.h b/src/path.h index 26cbffe..2814127 100644 --- a/src/path.h +++ b/src/path.h @@ -18,12 +18,12 @@ #ifndef PATH_H #define PATH_H -#include -#include +#include "session.h" #include #include #include "env.h" -#include "session.h" +#include +#include #define PATH_ARGS FCGX_Request* req, struct session* ssn, mastodont_t* api, char** data diff --git a/src/query.c b/src/query.c index 7968cce..ede43f2 100644 --- a/src/query.c +++ b/src/query.c @@ -16,15 +16,15 @@ * along with this program. If not, see . */ -#include -#include +#include "query.h" #include #include #include #include -#include "query.h" #include "env.h" #include "mime.h" +#include +#include char* read_get_data(FCGX_Request* req, struct get_values* query) { diff --git a/src/timeline.c b/src/timeline.c index 575d3f9..5563012 100644 --- a/src/timeline.c +++ b/src/timeline.c @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +#include "global_perl.h" #include "timeline.h" #include #include "helpers.h" @@ -30,7 +31,6 @@ #include "query.h" #include "error.h" #include "string_helpers.h" -#include "global_perl.h" #include "../static/timeline_options.ctmpl" #include "../static/navigation.ctmpl" diff --git a/src/timeline.h b/src/timeline.h index ae20632..c2fd9f4 100644 --- a/src/timeline.h +++ b/src/timeline.h @@ -18,13 +18,13 @@ #ifndef TIMELINE_H #define TIMELINE_H -#include -#include #include #include #include "path.h" #include "session.h" #include "base_page.h" +#include +#include /** Wrapper for content_tl_federated */ void tl_home(FCGX_Request* req, struct session* ssn, mastodont_t* api, int local); diff --git a/templates/content_lists.tt b/templates/content_lists.tt new file mode 100644 index 0000000..d3c5931 --- /dev/null +++ b/templates/content_lists.tt @@ -0,0 +1 @@ +

Lists