summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2021-10-21 00:03:52 -0400
committerWilliam Wilgus <wilgus.william@gmail.com>2021-10-21 01:45:47 -0400
commitaf573708ed7acf476ed49ff94243a94b27aa33a0 (patch)
treeef04b79dc016966431a35387f8d4496292f93d79
parent9878226e4dec1ee7bb1434249214d6d8161b439f (diff)
downloadrockbox-af573708ed7acf476ed49ff94243a94b27aa33a0.tar.gz
rockbox-af573708ed7acf476ed49ff94243a94b27aa33a0.zip
extend filetype_get_plugin() search for viewer by fileext
I noticed the way filetree switch was modified for the lua (and then) opx and open plugin viewers since builtin files are assumed to be handled in the filetree switch what if instead filetype_get_plugin() could search the available viewers this could probably be extended further with selectable defaults Change-Id: I40f74cd698f4b788a0adcbebf32c08a970df29a5
-rw-r--r--apps/filetree.c25
-rw-r--r--apps/filetypes.c39
2 files changed, 34 insertions, 30 deletions
diff --git a/apps/filetree.c b/apps/filetree.c
index 66e4a68398..efe5e80a0f 100644
--- a/apps/filetree.c
+++ b/apps/filetree.c
@@ -629,33 +629,19 @@ int ft_enter(struct tree_context* c)
629 rolo_load(buf); 629 rolo_load(buf);
630 break; 630 break;
631#endif 631#endif
632 case FILE_ATTR_CUE:
633 display_cuesheet_content(buf);
634 break;
632 635
633 /* plugin file */ 636 /* plugin file */
634 case FILE_ATTR_ROCK: 637 case FILE_ATTR_ROCK:
635 case FILE_ATTR_LUA:
636 case FILE_ATTR_OPX:
637 { 638 {
638 char *plugin = buf, *argument = NULL; 639 char *plugin = buf, *argument = NULL;
639 char plugin_path[MAX_PATH];
640 int ret;
641
642 if ((file_attr & FILE_ATTR_MASK) == FILE_ATTR_LUA) {
643 snprintf(plugin_path, sizeof(plugin_path)-1, "%s/lua.rock", VIEWERS_DIR); /* Use a #define here ? */
644 plugin = plugin_path;
645 argument = buf;
646 }
647 else if ((file_attr & FILE_ATTR_MASK) == FILE_ATTR_OPX) {
648 snprintf(plugin_path, sizeof(plugin_path)-1, "%s/open_plugins.rock", VIEWERS_DIR); /* Use a #define here ? */
649 plugin = plugin_path;
650 argument = buf;
651 }
652
653 if (global_settings.party_mode && audio_status()) { 640 if (global_settings.party_mode && audio_status()) {
654 splash(HZ, ID2P(LANG_PARTY_MODE)); 641 splash(HZ, ID2P(LANG_PARTY_MODE));
655 break; 642 break;
656 } 643 }
657 ret = plugin_load(plugin, argument); 644 switch (plugin_load(plugin, argument))
658 switch (ret)
659 { 645 {
660 case PLUGIN_GOTO_WPS: 646 case PLUGIN_GOTO_WPS:
661 play = true; 647 play = true;
@@ -680,9 +666,6 @@ int ft_enter(struct tree_context* c)
680 } 666 }
681 break; 667 break;
682 } 668 }
683 case FILE_ATTR_CUE:
684 display_cuesheet_content(buf);
685 break;
686 669
687 default: 670 default:
688 { 671 {
diff --git a/apps/filetypes.c b/apps/filetypes.c
index 3724f57a9b..ed90be755f 100644
--- a/apps/filetypes.c
+++ b/apps/filetypes.c
@@ -536,10 +536,31 @@ char* filetype_get_plugin(const struct entry* file, char *buffer, size_t buffer_
536 int index = find_attr(file->attr); 536 int index = find_attr(file->attr);
537 if (index < 0 || !buffer) 537 if (index < 0 || !buffer)
538 return NULL; 538 return NULL;
539 if (filetypes[index].plugin == NULL) 539 struct file_type *ft_indexed = &filetypes[index];
540
541 /* attempt to find a suitable viewer by file extension */
542 if(ft_indexed->plugin == NULL && ft_indexed->extension != NULL)
543 {
544 struct file_type *ft;
545 int i = filetype_count;
546 while (--i > index)
547 {
548 ft = &filetypes[i];
549 if (ft->plugin == NULL || ft->extension == NULL)
550 continue;
551 else if (strcmp(ft->extension, ft_indexed->extension) == 0)
552 {
553 /*splashf(HZ*3, "Found %d %s %s", i, ft->extension, ft->plugin);*/
554 ft_indexed = ft;
555 break;
556 }
557 }
558 }
559 if (ft_indexed->plugin == NULL)
540 return NULL; 560 return NULL;
541 snprintf(buffer, buffer_len, "%s/%s.%s", 561
542 PLUGIN_DIR, filetypes[index].plugin, ROCK_EXTENSION); 562 snprintf(buffer, buffer_len, "%s/%s." ROCK_EXTENSION,
563 PLUGIN_DIR, ft_indexed->plugin);
543 return buffer; 564 return buffer;
544} 565}
545 566
@@ -573,8 +594,8 @@ static int openwith_get_talk(int selected_item, void * data)
573{ 594{
574 (void)data; 595 (void)data;
575 char viewer_filename[MAX_FILENAME]; 596 char viewer_filename[MAX_FILENAME];
576 snprintf(viewer_filename, MAX_FILENAME, "%s.%s", 597 snprintf(viewer_filename, MAX_FILENAME, "%s." ROCK_EXTENSION,
577 filetypes[viewers[selected_item]].plugin, ROCK_EXTENSION); 598 filetypes[viewers[selected_item]].plugin);
578 talk_file_or_spell(PLUGIN_DIR, viewer_filename, 599 talk_file_or_spell(PLUGIN_DIR, viewer_filename,
579 NULL, false); 600 NULL, false);
580 return 0; 601 return 0;
@@ -588,8 +609,8 @@ static int openwith_action_callback(int action, struct gui_synclist *lists)
588 { 609 {
589 char plugin[MAX_PATH]; 610 char plugin[MAX_PATH];
590 i = viewers[gui_synclist_get_sel_pos(lists)]; 611 i = viewers[gui_synclist_get_sel_pos(lists)];
591 snprintf(plugin, MAX_PATH, "%s/%s.%s", 612 snprintf(plugin, MAX_PATH, "%s/%s." ROCK_EXTENSION,
592 PLUGIN_DIR, filetypes[i].plugin, ROCK_EXTENSION); 613 PLUGIN_DIR, filetypes[i].plugin);
593 plugin_load(plugin, info->current_file); 614 plugin_load(plugin, info->current_file);
594 return ACTION_STD_CANCEL; 615 return ACTION_STD_CANCEL;
595 } 616 }
@@ -630,7 +651,7 @@ int filetype_load_plugin(const char* plugin, const char* file)
630 } 651 }
631 if (i >= filetype_count) 652 if (i >= filetype_count)
632 return PLUGIN_ERROR; 653 return PLUGIN_ERROR;
633 snprintf(plugin_name, MAX_PATH, "%s/%s.%s", 654 snprintf(plugin_name, MAX_PATH, "%s/%s." ROCK_EXTENSION,
634 PLUGIN_DIR, filetypes[i].plugin, ROCK_EXTENSION); 655 PLUGIN_DIR, filetypes[i].plugin);
635 return plugin_load(plugin_name, file); 656 return plugin_load(plugin_name, file);
636} 657}