summaryrefslogtreecommitdiff
path: root/src/fruits/cmv
diff options
context:
space:
mode:
Diffstat (limited to 'src/fruits/cmv')
-rw-r--r--src/fruits/cmv/cmv.c114
1 files changed, 61 insertions, 53 deletions
diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c
index f79ffe2..f9c3b82 100644
--- a/src/fruits/cmv/cmv.c
+++ b/src/fruits/cmv/cmv.c
@@ -41,18 +41,6 @@ static nn_thread_result NNWT_THREADCALL event_loop_thread(void *userdata)
return 0;
}
-static struct cmv c = { 0 };
-
-static void sigint_handler(int signum)
-{
- (void)signum;
- c.desktop.should_quit = 1;
-}
-
-#define failure() do { \
- goto out; \
-} while (0)
-
// sink-p12-108.52.160.112-aEN-v-sEN.exe
static bool parse_exe_name_params(str *exe_name, str *addr, struct lia_prefs *prefs)
{
@@ -113,20 +101,10 @@ def:
return false;
}
-#ifdef NAUNET_ON_WINDOWS
-s32 wmain(s32 argc, wchar_t **argv)
-#else
-s32 main(s32 argc, char *argv[])
-#endif
-{
- if (!nn_common_init() || !stl_global_init(false)) {
- return EXIT_FAILURE;
- }
-
- s32 ret = EXIT_FAILURE;
-
- signal(SIGINT, sigint_handler);
+static struct cmv c = { 0 };
+s32 window_system_main(s32 argc, str *argv)
+{
#ifdef CAMU_HAVE_FFMPEG
camu_ff_common_init();
#endif
@@ -150,14 +128,7 @@ s32 main(s32 argc, char *argv[])
u8 type;
str addr;
-
- str exe_name;
-#ifdef NAUNET_ON_WINDOWS
- al_wstr_to_str(&al_wstr_cr(argv[0]), &exe_name);
-#else
- exe_name = al_str_cr(argv[0]);
-#endif
- if (!parse_exe_name_params(&exe_name, &addr, &c.desktop.sink.prefs)) {
+ if (!parse_exe_name_params(&argv[0], &addr, &c.desktop.sink.prefs)) {
#ifndef CAMU_SINK_ONLY
if (local) {
#ifdef NAUNET_ON_WINDOWS
@@ -183,13 +154,15 @@ s32 main(s32 argc, char *argv[])
camu_server_bind_direct(&c.server);
#else
if (!camu_server_listen(&c.server, type, &addr, CAMU_PORT)) {
- failure();
+ return EXIT_FAILURE;
}
#endif
}
#endif
- if (!camu_desktop_init(&c.desktop, "cmv")) failure();
+ if (!camu_desktop_init(&c.desktop, "cmv")) {
+ return EXIT_FAILURE;
+ }
#ifndef CAMU_SINK_ONLY
if (local) {
c.desktop.exit_callback = exit_callback;
@@ -197,38 +170,31 @@ s32 main(s32 argc, char *argv[])
c.desktop.sink.local_server = &c.server.data.server;
}
#endif
- if (!camu_desktop_connect(&c.desktop, type, &c.loop, &addr, CAMU_PORT)) failure();
+ if (!camu_desktop_connect(&c.desktop, type, &c.loop, &addr, CAMU_PORT)) {
+ return EXIT_FAILURE;
+ }
#ifndef CAMU_SINK_ONLY
if (local) {
for (s32 i = 1; i < argc; i++) {
-#ifdef NAUNET_ON_WINDOWS
- str arg;
- if (!al_wstr_to_str(&al_wstr_cr(argv[i]), &arg)) {
- al_log_error("cmv", "Failed to parse argument #%i.", i);
- continue;
- }
-#else
- str arg = al_str_cr(argv[i]);
-#endif
struct nn_packet *packet = nn_packet_create();
#ifdef CAMU_HAVE_PORTAL
- if (al_str_at(&arg, 0) == ';' || camu_is_url(&arg, 0)) {
+ if (al_str_at(&argv[i], 0) == ';' || camu_is_url(&argv[i], 0)) {
nn_packet_write_u8(packet, CAMU_RESOURCE_SIMPLE_SEARCH);
#elif defined NAUNET_HAS_CURL
- if (camu_is_url(&arg, 0)) {
+ if (camu_is_url(&argv[i], 0)) {
nn_packet_write_u8(packet, CAMU_RESOURCE_HTTP);
#else
if (0) {
#endif
#if CACHE_HAVE_CDIO
- } else if (al_str_cmp(&arg, &al_str_c("cdda://"), 0, 7) == 0) {
+ } else if (al_str_cmp(&argv[i], &al_str_c("cdda://"), 0, 7) == 0) {
nn_packet_write_u8(packet, CAMU_RESOURCE_CDIO);
#endif
} else {
nn_packet_write_u8(packet, CAMU_RESOURCE_FILE);
}
- nn_packet_write_str(packet, &arg);
+ nn_packet_write_str(packet, &argv[i]);
camu_server_local_add(&c.server, packet);
nn_packet_free(packet);
}
@@ -244,19 +210,61 @@ s32 main(s32 argc, char *argv[])
while (camu_desktop_tick(&c.desktop)) {}
camu_desktop_stop(&c.desktop);
+
nn_thread_join(&thread0);
+
camu_desktop_free(&c.desktop);
#ifndef CAMU_SINK_ONLY
camu_server_free(&c.server);
#endif
-
- ret = EXIT_SUCCESS;
-out:
nn_event_loop_destroy(&c.loop);
-
al_str_free(&home);
+ return EXIT_SUCCESS;
+}
+
+static void sigint_handler(int signum)
+{
+ (void)signum;
+ c.desktop.should_quit = 1;
+}
+
+#ifdef NAUNET_ON_WINDOWS
+s32 wmain(s32 argc, wchar_t **wargv)
+#else
+s32 main(s32 argc, char *cargv[])
+#endif
+{
+ if (!nn_common_init()) {
+ return EXIT_FAILURE;
+ }
+
+ signal(SIGINT, sigint_handler);
+
+ array(str) args;
+ al_array_init(args);
+ for (s32 i = 0; i < argc; i++) {
+ str arg;
+#ifdef NAUNET_ON_WINDOWS
+ if (!al_wstr_to_str(&al_wstr_cr(wargv[i]), &arg)) {
+ al_log_error("cmv", "Failed to parse argument #%i.", i);
+ continue;
+ }
+#else
+ al_str_from(&arg, cargv[i]);
+#endif
+ al_array_push(args, arg);
+ }
+
+ s32 ret = stl_global_init((s32)args.count, args.data, window_system_main, false);
stl_global_close();
+
+ str *arg;
+ al_array_foreach_ptr(args, i, arg) {
+ al_str_free(arg);
+ }
+ al_array_free(args);
+
nn_common_close();
return ret;