/* This file is part of vdr-filebrowser.
vdr-filebrowser is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
vdr-filebrowser is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar. If not, see .
*/
#include
#include
#include "menu-filebrowser.h"
#include "commands.h"
#include "statebag.h"
#include "menu-setup.h"
#include "command-sources.h"
#include "command-other.h"
#include "commands-plugins.h"
static const char *VERSION = "0.2.1";
static const char *DESCRIPTION = trNOOP("Plugin to browse through files and execute actions on them");
static const char *MAINMENUENTRY = trNOOP("Filebrowser");
class cPluginFilebrowser : public cPlugin {
private:
// Add any member variables or functions you may need here.
cFilebrowserStatebag* Statebag;
public:
cPluginFilebrowser(void);
virtual ~cPluginFilebrowser();
virtual const char *Version(void) { return VERSION; }
virtual const char *Description(void) { return DESCRIPTION; }
virtual const char *CommandLineHelp(void);
virtual bool ProcessArgs(int argc, char *argv[]);
virtual bool Initialize(void);
virtual bool Start(void);
virtual void Housekeeping(void);
virtual const char *MainMenuEntry(void) { return tr(MAINMENUENTRY); }
virtual cOsdObject *MainMenuAction(void);
virtual cMenuSetupPage *SetupMenu(void);
virtual bool SetupParse(const char *Name, const char *Value);
};
cPluginFilebrowser::cPluginFilebrowser(void)
{
// Initialize any member variables here.
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
Statebag=new cFilebrowserStatebag();
}
cPluginFilebrowser::~cPluginFilebrowser()
{
// Clean up after yourself!
delete Statebag;
}
const char *cPluginFilebrowser::CommandLineHelp(void)
{
// Return a string that describes all known command line options.
return NULL;
}
bool cPluginFilebrowser::ProcessArgs(int argc, char *argv[])
{
// Implement command line argument processing here if applicable.
return true;
}
bool cPluginFilebrowser::Initialize(void)
{
// Initialize any background activities the plugin shall perform.
return true;
}
bool cPluginFilebrowser::Start(void)
{
Statebag->FilebrowserPlugin=this;
Statebag->GetCommands()->Add(new cFilebrowserCommandContainer(new cFilebrowserMarkCommand(Statebag)));
Statebag->GetCommands()->Add(new cFilebrowserCommandContainer(new cFilebrowserUnmarkCommand(Statebag)));
Statebag->GetCommands()->Add(new cFilebrowserCommandContainer(new cFilebrowserMarkAllCommand(Statebag)));
Statebag->GetCommands()->Add(new cFilebrowserCommandContainer(new cFilebrowserUnmarkAllCommand(Statebag)));
Statebag->ConfigDirectory=ConfigDirectory(Name());
cConfigReader CommandsReader=cConfigReader(Statebag, "commands.conf");
char* Line=NULL;
while((Line=CommandsReader.Read()))
{
cFilebrowserConfigCommand* Command=cFilebrowserConfigCommand::Parse(Line, Statebag);
if(Command)
{
Statebag->GetCommands()->Add(new cFilebrowserCommandContainer(Command));
}
}
Statebag->GetCommands()->Add(new cFilebrowserCommandContainer(new cFilebrowserCommandImagePlugin()));
Statebag->GetCommands()->Add(new cFilebrowserCommandContainer(new cFilebrowserCommandMPlayerPlugin())); Statebag->GetCommands()->Add(new cFilebrowserCommandContainer(new cFilebrowserCommandMP3Plugin()));
Statebag->GetCommands()->Add(new cFilebrowserCommandContainer(new cFilebrowserCommandThreadList(Statebag)));
Statebag->GetCommands()->Add(new cFilebrowserCommandContainer(new cFilebrowserCommandSourcesList(Statebag)));
Statebag->GetCommands()->Add(new cFilebrowserCommandContainer(new cFilebrowserCommandOtherCommands(Statebag)));
/*
Do ordering: Mentioned commands first, then unmentioned
*/
cConfigReader OrderReader=cConfigReader(Statebag, "order.conf");
cFilebrowserCommandContainer* Current=Statebag->GetCommands()->First();
while((Line=OrderReader.Read()))
{
cCommandParser Parser=cCommandParser(Line, false, false);
cString ParsedLine=Parser.Parse();
const char* Name=(Line[0]=='-' ? *ParsedLine + 1 : *ParsedLine);
D(fprintf(stderr, "Searching %s in Commands\n", Name));
for(cFilebrowserCommandContainer* Command=Current; Command; Command=Command->Next())
{
if(strcmp(Command->GetObject()->GetName(), Name)==0)
{
if(Line[0]=='-')
{
D(fprintf(stderr, "Deleting %s from commands\n", Name));
Current=Command->Next();
Command->Unlink();
delete Command;
break;
}
if(Command!=Current)
{
//TODO: Move behaves strange when you do Move(foo, foo) - is this a bug or by design?
//Then foo->Next()=foo, foo->Prev()=foo...
Statebag->GetCommands()->Move(Command, Current);
}
Current=Command->Next();
D(fprintf(stderr, "Found %s in Commands - Command is %s, Current is %s\n", Name, Command->GetObject()->GetName(), Current->GetObject()->GetName()));
}
}
}
D(fprintf(stderr, "Now Commands are Ordered:\n"));
for(cFilebrowserCommandContainer* Command=Statebag->GetCommands()->First(); Command; Command=Command->Next())
{
D(fprintf(stderr, "%s\n", Command->GetObject()->GetName()));
}
return true;
}
void cPluginFilebrowser::Housekeeping(void)
{
D(fprintf(stderr, "Housekeeping started\n"));
cThreadContainer* i=Statebag->GetThreads()->First();
while(i)
{
if(i->GetObject()->IsRemoveRequested())
{
cThreadContainer* tmp=i;
i=Statebag->GetThreads()->Next(i);
Statebag->GetThreads()->Del(tmp);
continue;
}
else
{
i=Statebag->GetThreads()->Next(i);
}
}
D(fprintf(stderr, "Housekeeping ended\n"));
}
cOsdObject *cPluginFilebrowser::MainMenuAction(void)
{
D(fprintf(stderr, "starting menu\n"));
return new cOsdMenuFilebrowser(Statebag->BaseDir, Statebag);
/*
quick hack to show sources menu first when starting filebrowser
cOsdMenu* Menu=new cOsdMenuFilebrowser(Statebag->BaseDir, Statebag);
cFilebrowserCommandSourcesList* SourcesCommand=new cFilebrowserCommandSourcesList(Statebag);
SourcesCommand->Execute(Menu, NULL, NULL);
return Menu;
*/
}
cMenuSetupPage *cPluginFilebrowser::SetupMenu(void)
{
return new cFilebrowserSetupPage(Statebag);
}
bool cPluginFilebrowser::SetupParse(const char *Name, const char *Value)
{
if(strcmp(Name, SETUP_PARAM_BASEDIR)==0)
{
strcpy(Statebag->BaseDir, Value);
}
if(strcmp(Name, SETUP_PARAM_FILTER)==0)
{
Statebag->Filter=cString(Value);
}
else if(strcmp(Name, SETUP_PARAM_SHOW_HIDDEN_FILES)==0)
{
Statebag->ShowHiddenFiles=atoi(Value);
}
else if(strcmp(Name, SETUP_PARAM_SHOW_FULL_PATH)==0)
{
Statebag->ShowFullPath=atoi(Value);
}
else
{
return false;
}
return true;
}
VDRPLUGINCREATOR(cPluginFilebrowser); // Don't touch this!