diff options
Diffstat (limited to 'commands.c')
-rw-r--r-- | commands.c | 850 |
1 files changed, 850 insertions, 0 deletions
diff --git a/commands.c b/commands.c new file mode 100644 index 0000000..8b3bb1b --- /dev/null +++ b/commands.c @@ -0,0 +1,850 @@ +#include <unistd.h> +#include <vdr/tools.h> +#include "commands.h" +#include "setup.h" +#include "tools.h" +#include "menu-item.h" +#include "imagelist.h" +#include "dvdplugin.h" +#include "setup-itypes.h" + +// --- cCMD ---------------------------------------------------------- + +eOSState cCMD::Play(cMainMenuItem *item) +{ + if(item) + DEBUG("Play Image %s, %i", item->FileName(), item->Type()); + else + DEBUG("Play Image: Kein Image angegeben"); + + if(!item || item->Type() == iDevice) + cDVDPlugin::Start(); + else if (item && item->Type() == iDVD) + cDVDPlugin::Start(item->FileName()); + + return osEnd; +} + +eOSState cCMD::Eject(bool close) +{ + char *cmd = NULL; + asprintf(&cmd, "eject %s %s", close ? "-t" : "", DVDSwitchSetup.DVDLinkOrg); + DEBUG("Eject: %i - %s", close, cmd); + int rc = system(cmd); + DEBUG("Eject-Rückgabe: %i", rc); + free(cmd); + + return osContinue; +} + +// --- cCMDMenu ------------------------------------------------------------- + +cCMDMenu::cCMDMenu(cMainMenuItem *item, cMainMenu *osdobject) + : cOsdMenu(tr("Commands")) +{ + iItem = item; + OsdObject = osdobject; + cOsdItem *mItem = NULL; + + Add(new cOsdItem(tr("Directory Management"))); + Add(new cOsdItem(tr("DVD-Tray open"))); + Add(new cOsdItem(tr("DVD-Tray close"))); + Add(new cOsdItem(tr("Play"))); + if(!iItem || (iItem && iItem->Type() != iDVD && iItem->Type() != iDevice)) + { + mItem = Last(); + mItem->SetSelectable(false); + } + Add(new cOsdItem(tr("Image rename"))); + if(!iItem || (iItem && iItem->Type() != iDVD)) + { + mItem = Last(); + mItem->SetSelectable(false); + } + Add(new cOsdItem(tr("Image move"))); + if(!iItem || (iItem && iItem->Type() != iDVD)) + { + mItem = Last(); + mItem->SetSelectable(false); + } + Add(new cOsdItem(tr("Image delete"))); + if(!iItem || (iItem && iItem->Type() != iDVD)) + { + mItem = Last(); + mItem->SetSelectable(false); + } + Add(new cOsdItem(tr("Image burn"))); + if(!iItem || (iItem && iItem->Type() != iDVD)) + { + mItem = Last(); + mItem->SetSelectable(false); + } + Add(new cOsdItem(tr("Image to create from DVD"))); +} + +eOSState cCMDMenu::ProcessKey(eKeys Key) +{ + eOSState ret = osUnknown; + + if(!HasSubMenu()) + { + cCMDImage *CMDImage = NULL; + cOsdItem *item = NULL; + eCMDs cmd = cmdNone; + switch(Key) + { + case kOk: + item = Get(Current()); + if(!strcasecmp(item->Text(),tr("Directory Management"))) + cmd = cmdDirManage; + if(!strcasecmp(item->Text(),tr("DVD-Tray open"))) + cmd = cmdDVDopen; + if(!strcasecmp(item->Text(),tr("DVD-Tray close"))) + cmd = cmdDVDclose; + if(!strcasecmp(item->Text(),tr("Play"))) + cmd = cmdImgPlay; + if(!strcasecmp(item->Text(),tr("Image rename"))) + cmd = cmdImgRename; + if(!strcasecmp(item->Text(),tr("Image move"))) + cmd = cmdImgMove; + if(!strcasecmp(item->Text(),tr("Image delete"))) + cmd = cmdImgDelete; + if(!strcasecmp(item->Text(),tr("Image burn"))) + cmd = cmdImgBurn; + if(!strcasecmp(item->Text(),tr("Image to create from DVD"))) + cmd = cmdImgRead; + switch(cmd) + { + case cmdDirManage: + return AddSubMenu(new cCMDDir(OsdObject)); + break; + case cmdDVDopen: + return cCMD::Eject(false); + break; + case cmdDVDclose: + return cCMD::Eject(true); + break; + case cmdImgPlay: + return cCMD::Play(iItem); + break; + case cmdImgRename: + OsdObject->SetState(mmsImgRename); + item = OsdObject->Get(OsdObject->Current()); + item->ProcessKey(kRight); + return osBack; + break; + case cmdImgMove: + return AddSubMenu(new cCMDMove(iItem->FileName(), OsdObject, false)); + break; + case cmdImgDelete: + CMDImage = new cCMDImage(OsdObject); + ret = CMDImage->Delete(iItem->FileName()); + DELETENULL(CMDImage); + return ret; + break; + case cmdImgBurn: + CMDImage = new cCMDImage(OsdObject); + ret = CMDImage->Burn(iItem->FileName()); + DELETENULL(CMDImage); + return ret; + break; + case cmdImgRead: + return AddSubMenu(new cCMDImageRead); + break; + default: + break; + } + break; + default: + break; + } + } + + return cOsdMenu::ProcessKey(Key); +} + +// --- cCMDDir ------------------------------------------------------------ + +cCMDDir::cCMDDir(cMainMenu *osdobject, bool select, char *buffer) + : cOsdMenu(tr("Directory Management")) +{ + DEBUG("Verzeichnis Management"); + ImageDir(DVDSwitchSetup.ImageDir); + CurrentDir(DVDSwitchSetup.ImageDir); + ParentDir(DVDSwitchSetup.ImageDir); + + State = csNone; + OsdObject = osdobject; + Select = select; + Buffer = buffer; + SetDir(); + + if(Select) + SetTitle(tr("Select Directory")); + + Build(DVDSwitchSetup.ImageDir); + cMainMenuItem *mItem = (cMainMenuItem*)Get(Current()); + if(mItem) + LastSelDir(mItem->FileName()); +} + +void cCMDDir::SetHelp(void) +{ + cMainMenuItem *item = NULL; + switch(State) + { + case csNone: + item = (cMainMenuItem*)Get(Current()); + if(Count() && item && item->Type() == iDir) + if(Select) + cOsdMenu::SetHelp(NULL, tr("New"), NULL , tr("Select")); + else + cOsdMenu::SetHelp(tr("Rename"), tr("New"), tr("Delete"), tr("Move")); + else + cOsdMenu::SetHelp(NULL, tr("New"), NULL , NULL); + break; + default: + cOsdMenu::SetHelp(NULL, NULL, NULL , NULL); + break; + } +} + +void cCMDDir::Build(char *dir) +{ + DEBUG("Erstelle Verzeichnisliste %s", dir); + if(!dir) + dir = CurrentDir(); + + Clear(); + if(State == csNone) + { + SetCols(0); + SetTitle(tr("Edit Directories")); + } + + cDirHandling *DirHand = new cDirHandling(this, this); + SetCurrent(Get(DirHand->Build(dir, true))); + delete(DirHand); + + Display(); + SetHelp(); +} + +eOSState cCMDDir::ProcessKey(eKeys Key) +{ + cMainMenuItem *mItem = NULL; + cDirHandling *DirHand = NULL; + cFileInfo *info = NULL; + + if(!HasSubMenu()) + { + switch(State) + { + case csNone: + mItem = (cMainMenuItem*)Get(Current()); + switch(Key) + { + case kUp: + case kUp|k_Repeat: + case kDown: + case kDown|k_Repeat: + cOsdMenu::ProcessKey(Key); + SetHelp(); + mItem = (cMainMenuItem*)Get(Current()); + if(mItem) + LastSelDir(mItem->FileName()); + return osContinue; + break; + case kOk: + info = new cFileInfo(mItem->FileName()); + if(!info->isExecutable() || !info->isReadable()) + { + DEBUG("Verzeichniswechsel: Keine Rechte"); + DELETENULL(info); + OSD_ERRMSG(tr("no Rights!")); + return osContinue; + break; + } + DELETENULL(info); + DirHand = new cDirHandling(this, this); + DirHand->ProcessKey(mItem); + delete(DirHand); + Build(); + break; + case kRed: + if(mItem->Type() == iDir) + return Edit(mItem); + break; + case kGreen: + return New(); + break; + case kYellow: + if(mItem->Type() == iDir && Interface->Confirm(tr("really delete?"))) + { + DEBUG("Verzeichnis löschen"); + if(cFileCMD::DirIsEmpty(mItem->FileName()) || + (!cFileCMD::DirIsEmpty(mItem->FileName()) && Interface->Confirm(tr("Directory not empty. however delete?")))) + { + cFileDelThread *del = new cFileDelThread(mItem->FileName()); + if(del->OK()) + { + DEBUG("Verzeichnis löschen gestartet"); + del->Start(); + Build(); + OsdObject->SetState(mmsReInit); + } + else + DELETENULL(del); + } + return osContinue; + } + break; + case kBlue: + if(mItem->Type() == iDir) + { + if(Select) + { + DEBUG("Verzeichnis gewählt: %s", mItem->FileName()); + info = new cFileInfo(mItem->FileName()); + if(!info->isExecutable() || !info->isReadable()) + { + DEBUG("Verzeichnis: Keine Rechte"); + OSD_ERRMSG(tr("no Rights!")); + } + else + { + char *seldir = mItem->FileName(); + for (unsigned int i = 0; i < strlen(DVDSwitchSetup.ImageDir); i++) + seldir++; + if(seldir[0] == '/') + seldir++; + strn0cpy((char*)Buffer, seldir, MaxFileName); + cRemote::Put(kBack); + } + DELETENULL(info); + return osContinue; + } + else + return AddSubMenu(new cCMDMove(mItem->FileName(), OsdObject)); + } + break; + default: + break; + } + break; + case csDirNew: + return New(Key); + break; + case csDirEdit: + return Edit(Key); + break; + default: + break; + } + } + + eOSState ret = cOsdMenu::ProcessKey(Key); + + if(!HasSubMenu() && Key == kBlue && ret == osContinue) + { + if((cMainMenuItem*)Get(Current() + 1)) + mItem = (cMainMenuItem*)Get(Current() + 1); + else + mItem = (cMainMenuItem*)Get(Current() - 1); + if(mItem) + LastSelDir(mItem->FileName()); + Build(); + } + + return ret; +} + +eOSState cCMDDir::New(void) +{ + DEBUG("Verzeichnis: Neu"); + cFileInfo *info = new cFileInfo(CurrentDir()); + if(!info->isWriteable()) + { + DEBUG("Verzeichnis: Neu: Keine Berechtigung in %s", CurrentDir()); + OSD_ERRMSG(tr("no Rights to create")); + } + else + { + State = csDirNew; + SetCols(5); + SetTitle(CurrentDir()); + SetDir(); + + cMainMenuItem *mItem = (cMainMenuItem*)First(); + Ins(new cMenuEditStrItem(tr("New:"), Dir, MaxFileName, tr(" abcdefghijklmnopqrstuvwxyz0123456789-.#~")), + true, + mItem); + while(mItem) + { + mItem->SetSelectable(false); + mItem = (cMainMenuItem*)Next(mItem); + } + Display(); + cOsdMenu::ProcessKey(kRight); + } + + return osContinue; +} + +eOSState cCMDDir::New(eKeys Key) +{ + switch(Key) + { + case kOk: + if(!isempty(Dir)) + { + char *buffer = NULL; + asprintf(&buffer, "%s/%s", CurrentDir(), stripspace(Dir)); + DEBUG("Verzeichnis: Neu: Anlegen: %s", buffer); + cFileInfo *info = new cFileInfo(buffer); + if(info->isExists()) + { + DEBUG("Verzeichnis existiert bereits"); + OSD_WARNMSG(tr("Directory exists")); + FREENULL(buffer); + DELETENULL(info); + return osContinue; + } + if(cFileCMD::Mkdir(buffer)) + { + DEBUG("Verzeichnis anlegen erfolgreich"); + LastSelDir(buffer); + if(!Select) + OsdObject->SetState(mmsReInit); + } + FREENULL(buffer); + DELETENULL(info); + } + case kBack: + State = csNone; + Build(); + return osContinue; + break; + default: + break; + } + + return cOsdMenu::ProcessKey(Key); +} + +eOSState cCMDDir::Edit(cMainMenuItem *mItem) +{ + DEBUG("Verzeichnis: Edit: %s", mItem->FileName()); + cFileInfo *info = new cFileInfo(mItem->FileName()); + if(!info->isWriteable()) + { + DELETENULL(info); + info = new cFileInfo(CurrentDir()); + if(!info->isWriteable()) + { + DEBUG("Verzeichnis: Edit: Keine Rechte"); + OSD_ERRMSG(tr("no Rights to rename")); + DELETENULL(info); + return osContinue; + } + } + DELETENULL(info); + info = new cFileInfo(mItem->FileName()); + SetDir(info->FileName()); + DELETENULL(info); + State = csDirEdit; + SetCols(11); + SetTitle(CurrentDir()); + + cMainMenuItem *dmItem = NULL; + mItem = (cMainMenuItem*)First(); + while(mItem) + { + if(!strcasecmp(mItem->FileName(), LastSelDir())) + { + DEBUG("Verzeichnis: Edit: Item gefunden: %s", mItem->FileName()); + Ins(new cMenuEditStrItem(tr("Rename:"), Dir, MaxFileName, tr(" abcdefghijklmnopqrstuvwxyz0123456789-_.#~")), + true, + mItem); + dmItem = mItem; + } + mItem->SetSelectable(false); + mItem = (cMainMenuItem*)Next(mItem); + } + + if(dmItem) + Del(dmItem->Index()); + Display(); + cOsdMenu::ProcessKey(kRight); + + return osContinue; +} + +eOSState cCMDDir::Edit(eKeys Key) +{ + switch(Key) + { + case kOk: + if(!isempty(Dir)) + { + char *buffer = NULL; + asprintf(&buffer, "%s/%s", CurrentDir(), stripspace(Dir)); + DEBUG("Verzeichnis: Edit: OK: %s", buffer); + cFileInfo *info = new cFileInfo(buffer); + if(info->isExists()) + { + DEBUG("Verzeichnis: Edit: Existiert schon"); + OSD_WARNMSG(tr("Directory exists")); + FREENULL(buffer); + DELETENULL(info); + return osUnknown; + } + if(cFileCMD::Rn(LastSelDir(), buffer)) + { + DEBUG("Verzeichnis: Edit: Rename OK"); + LastSelDir(buffer); + OsdObject->SetState(mmsReInit); + } + FREENULL(buffer); + DELETENULL(info); + } + case kBack: + State = csNone; + Build(); + return osContinue; + break; + default: + break; + } + + return cOsdMenu::ProcessKey(Key); +} + +// --- cCMDMove ------------------------------------------------------------- + +cCMDMove::cCMDMove(char *file, cMainMenu *osdobject, bool dir, bool direct) + : cOsdMenu(tr("Move")) +{ + DEBUG("Verzeichnis: Move: %s"); + File = file ? strdup(file) : NULL; + OsdObject = osdobject; + Dir = dir; + Direct = direct; + + ImageDir(DVDSwitchSetup.ImageDir); + CurrentDir(DVDSwitchSetup.ImageDir); + ParentDir(DVDSwitchSetup.ImageDir); + + + Build(DVDSwitchSetup.ImageDir); +} + +void cCMDMove::SetHelp(void) +{ + cOsdMenu::SetHelp(NULL, NULL, NULL , tr("Insert")); +} + +void cCMDMove::Build(char *dir) +{ + DEBUG("Verzeichnis: Move: Erstelle Verzeichnisliste: %s", dir); + if(!dir) + dir = CurrentDir(); + + Clear(); + + cDirHandling *DirHand = new cDirHandling(this, this); + SetCurrent(Get(DirHand->Build(dir, true))); + delete(DirHand); + + if(Count()) + { + cMainMenuItem *item = (cMainMenuItem*)First(); + while(item) + { + if(!strcasecmp(item->FileName(), File)) + { + Del(item->Index()); + break; + } + item = (cMainMenuItem*)Next(item); + } + } + + Display(); + SetHelp(); +} + +eOSState cCMDMove::ProcessKey(eKeys Key) +{ + cMainMenuItem *mItem = (cMainMenuItem*)Get(Current()); + cDirHandling *DirHand = NULL; + cFileMoveThread *move = NULL; + + switch(Key) + { + case kUp: + case kUp|k_Repeat: + case kDown: + case kDown|k_Repeat: + cOsdMenu::ProcessKey(Key); + SetHelp(); + mItem = (cMainMenuItem*)Get(Current()); + if(mItem) + LastSelDir(mItem->FileName()); + return osContinue; + break; + case kOk: + DirHand = new cDirHandling(this, this); + DirHand->ProcessKey(mItem); + DELETENULL(DirHand); + Build(); + break; + case kBlue: + DEBUG("Verzeichnis: Move: Verschiede in: %s", CurrentDir()); + move = new cFileMoveThread(File, CurrentDir()); + if(move->OK()) + { + DEBUG("Verzeichnis: Move: Erfolgreich"); + move->Start(); + cCondWait::SleepMs(1 * 500); + OsdObject->SetState(mmsReInit); + } + else + DELETENULL(move); + if(!Dir && !Direct) + cRemote::Put(kBack); + return osBack; + break; + default: + break; + } + + return cOsdMenu::ProcessKey(Key); +} + +// --- cCMDImage ------------------------------------------------------------ + +cCMDImage::cCMDImage(cMainMenu *osdobject) +{ + DEBUG("CMDImage"); + File = NULL; + strcpy(NewFile, "\0"); + OsdObject = osdobject; +} + +cCMDImage::~cCMDImage(void) +{ + if(File) + free(File); +} + +char* cCMDImage::Rename(char *file) +{ + DEBUG("CMDImage Rename"); + if(file) + { + FREENULL(File); + File = strdup(file); + } + + return File; +} + +eOSState cCMDImage::Delete(char *file) +{ + DEBUG("lösche DVD '%s'", file); + if(file) + { + if(Interface->Confirm(tr("really delete?"))) + { + cFileDelThread *del = new cFileDelThread(file); + if(del->OK()) + { + DEBUG("löschen OK"); + del->Start(); + OsdObject->SetState(mmsReInitCur); + } + else + DELETENULL(del); + } + } + + return osBack; +} + +eOSState cCMDImage::Burn(char *file) +{ + DEBUG("DVD Schreiben '%s'", file); + + cFileInfo *info = new cFileInfo(DVDSwitchSetup.DVDWriteScript); + + if(!info->isExists()) + { + DEBUG("Writescript existiert nicht"); + DELETENULL(info); + OSD_ERRMSG(tr("Specified Writescript not exist!")); + return osContinue; + } + if(!info->isExecutable()) + { + DEBUG("Writescript lässt sich nicht ausführen"); + DELETENULL(info); + OSD_ERRMSG(tr("Cannot execute Writescript!")); + return osContinue; + } + + DELETENULL(info); + + info = new cFileInfo(file); + + if(Interface->Confirm(tr("Burn Now?"))) + { + DEBUG("Starte Burn-Thread"); + cCMDImageBurnThread *burn = new cCMDImageBurnThread(file, info->Type()); + burn->Start(); + } + + return osContinue; +} + +// --- cCmdDVDRead ------------------------------------------------------------ + +cCMDImageRead::cCMDImageRead(void) + : cOsdMenu(tr("Read DVD"), 14) +{ + DEBUG("lese DVD"); + + cFileInfo *info = new cFileInfo(DVDSwitchSetup.DVDReadScript); + + if(!info->isExists()) + { + DEBUG("Readscript existiert nicht"); + DELETENULL(info); + OSD_ERRMSG(tr("Specified Readscript not exist!")); + cRemote::Put(kBack); + } + else if(!info->isExecutable()) + { + DEBUG("Readscript lässt sich nicht ausführen"); + DELETENULL(info); + OSD_ERRMSG(tr("Cannot execute Readscript!")); + cRemote::Put(kBack); + } + else + { + DELETENULL(info); + strcpy(File, "\0"); + strcpy(Dir, "\0"); + strcpy(ImgTypeTxt, "\0"); + ImgType = -1; + + Add(new cMenuEditStrItem(tr("Name:"), File, MaxFileName, tr(" abcdefghijklmnopqrstuvwxyz0123456789-_.#~"))); + Add(new cMenuEditStrItem(tr("Directory:"), Dir, MaxFileName, tr(" abcdefghijklmnopqrstuvwxyz0123456789-_.#~"))); + Add(new cMenuEditStrItem(tr("Imagetype:"), ImgTypeTxt, MaxFileName, tr(" abcdefghijklmnopqrstuvwxyz0123456789-_.#~"))); + + SetHelp(); + Display(); + } +} + +cCMDImageRead::~cCMDImageRead(void) +{ + DEBUG("lesen DVD beendet"); +} + +void cCMDImageRead::SetHelp(void) +{ + switch(Current()) + { + case 1: + case 2: + cOsdMenu::SetHelp(tr("read in"), NULL, NULL, tr("Select")); + break; + default: + cOsdMenu::SetHelp(tr("read in"), NULL, NULL, NULL); + break; + } +} + +eOSState cCMDImageRead::ProcessKey(eKeys Key) +{ + if(!HasSubMenu()) + { + switch(Key) + { + case kUp: + case kUp|k_Repeat: + case kDown: + case kDown|k_Repeat: + cOsdMenu::ProcessKey(Key); + SetHelp(); + return osContinue; + case kRight: + switch(Current()) + { + case 1: + case 2: + return osContinue; + break; + default: + break; + } + break; + case kRed: + if(isempty(File)) + { + OSD_ERRMSG(tr("invalid file name for DVD-Image")); + return osContinue; + } + if(ImgType < 0) + { + OSD_ERRMSG(tr("No Imagetype selected")); + return osContinue; + } + if(isempty(Dir)) + { + if(!Interface->Confirm(tr("No Directory selected. Use Standard?"))) + return osContinue; + } + if(Interface->Confirm(tr("Now Read?"))) + { + char *buffer = NULL; + if(isempty(Dir)) + buffer = strdup(DVDSwitchSetup.ImageDir); + else + { + if(DVDSwitchSetup.ImageDir[strlen(DVDSwitchSetup.ImageDir)-1] == '/') + asprintf(&buffer, "%s%s", DVDSwitchSetup.ImageDir, Dir); + else + asprintf(&buffer, "%s/%s", DVDSwitchSetup.ImageDir, Dir); + } + if(buffer[strlen(buffer)-1] == '/') + buffer[strlen(buffer)-1] == '\0'; + DEBUG("ReadThread wird gestartet"); + cCMDImageReadThread *read = new cCMDImageReadThread(File, buffer, ImgType); + FREENULL(buffer); + read->Start(); + return osBack; + } + break; + case kBlue: + switch(Current()) + { + case 1: + return AddSubMenu(new cCMDDir(NULL, true, &Dir[0])); + break; + case 2: + return AddSubMenu(new cMenuSetupDSITypes(true, &ImgType, &ImgTypeTxt[0])); + break; + default: + break; + } + break; + default: + break; + } + } + + return cOsdMenu::ProcessKey(Key); + +} |