summaryrefslogtreecommitdiff
path: root/mymenueditrecording.c
diff options
context:
space:
mode:
Diffstat (limited to 'mymenueditrecording.c')
-rw-r--r--mymenueditrecording.c304
1 files changed, 183 insertions, 121 deletions
diff --git a/mymenueditrecording.c b/mymenueditrecording.c
index 3c89292..f9ce9eb 100644
--- a/mymenueditrecording.c
+++ b/mymenueditrecording.c
@@ -2,12 +2,17 @@
* See the README file for copyright information and how to reach the author.
*/
+#include <sys/vfs.h>
+#include <string>
#include <vdr/videodir.h>
#include <vdr/remote.h>
#include <vdr/menu.h>
+#include <vdr/interface.h>
#include "mymenurecordings.h"
#include "tools.h"
+using namespace std;
+
// --- myMenuRenameRecording --------------------------------------------------
myMenuRenameRecording::myMenuRenameRecording(myMenuRecordings *MenuRecordings,cRecording *Recording,const char *DirBase,const char *DirName):cOsdMenu(tr("Rename"),12)
{
@@ -53,50 +58,54 @@ myMenuRenameRecording::~myMenuRenameRecording()
eOSState myMenuRenameRecording::ProcessKey(eKeys Key)
{
- eOSState state=cOsdMenu::ProcessKey(Key);
- if(state==osContinue)
- {
- if(Key==kOk)
+ eOSState state=cOsdMenu::ProcessKey(Key);
+ if(state==osContinue)
{
- char *oldname=NULL;
- char *newname=NULL;
- char *tmppath=path[0]?ExchangeChars(strdup(path),true):NULL;
- char *tmpname=name[0]?ExchangeChars(strdup(name),true):NULL;
-
- if(strchr(name,'.')==name||!strlen(name))
- {
- Skins.Message(mtError,tr("Invalid filename!"));
- cRemote::Put(kRight);
- return osContinue;
- }
-
- if(isdir)
- asprintf(&oldname,"%s%s%s/%s",VideoDirectory,tmppath?"/":"",dirbase?dirbase:"",dirname);
- else
- oldname=strdup(recording->FileName());
-
- asprintf(&newname,"%s%s%s/%s%s",VideoDirectory,tmppath?"/":"",tmppath?tmppath:"",tmpname,isdir?"":strrchr(recording->FileName(),'/'));
-
- if(MoveRename(oldname,newname,isdir?NULL:recording,false))
- {
- state=osBack;
- menurecordings->Set(true,isdir?NULL:newname);
- }
- else
- {
- cRemote::Put(kRight);
- state=osContinue;
- }
-
- free(oldname);
- free(newname);
- free(tmppath);
- free(tmpname);
+ if(Key==kOk)
+ {
+ char *oldname=NULL;
+ char *newname=NULL;
+ char *tmppath=path[0]?ExchangeChars(strdup(path),true):NULL;
+ char *tmpname=name[0]?ExchangeChars(strdup(name),true):NULL;
+
+ if(strchr(name,'.')==name||!strlen(name))
+ {
+ Skins.Message(mtError,tr("Invalid filename!"));
+ cRemote::Put(kRight);
+ return osContinue;
+ }
+
+ if(isdir)
+ asprintf(&oldname,"%s%s%s/%s",VideoDirectory,tmppath?"/":"",dirbase?dirbase:"",dirname);
+ else
+ oldname=strdup(recording->FileName());
+
+ asprintf(&newname,"%s%s%s/%s%s",VideoDirectory,tmppath?"/":"",tmppath?tmppath:"",tmpname,isdir?"":strrchr(recording->FileName(),'/'));
+
+ if(!MakeDirs(newname,true))
+ Skins.Message(mtError,tr("Creating directories failed!"));
+ else
+ {
+ if(MoveRename(oldname,newname,isdir?NULL:recording,false))
+ {
+ state=osBack;
+ menurecordings->Set(true,isdir?NULL:newname);
+ }
+ else
+ {
+ cRemote::Put(kRight);
+ state=osContinue;
+ }
+ }
+ free(oldname);
+ free(newname);
+ free(tmppath);
+ free(tmpname);
+ }
+ if(Key==kBack)
+ return osBack;
}
- if(Key==kBack)
- return osBack;
- }
- return state;
+ return state;
}
// --- myMenuNewName ----------------------------------------------------------
@@ -222,38 +231,38 @@ myMenuMoveRecording::~myMenuMoveRecording()
void myMenuMoveRecording::Set()
{
- if(level==0)
- Add(new myMenuMoveRecordingItem(tr("[base dir]"),0));
+ if(level==0)
+ Add(new myMenuMoveRecordingItem(tr("[base dir]"),0));
- char *lastitemtext=NULL;
- myMenuMoveRecordingItem *lastitem=NULL;
- for(cRecording *recording=Recordings.First();recording;recording=Recordings.Next(recording))
- {
- if(!base||(strstr(recording->Name(),base)==recording->Name()&&recording->Name()[strlen(base)]=='~'))
+ char *lastitemtext=NULL;
+ myMenuMoveRecordingItem *lastitem=NULL;
+ for(cRecording *recording=Recordings.First();recording;recording=Recordings.Next(recording))
{
- myMenuMoveRecordingItem *item=new myMenuMoveRecordingItem(recording,level);
- if(*item->Text())
- {
- if(lastitemtext&&!strcmp(lastitemtext,item->Text())) // same text
- {
- if(lastitem&&lastitem->Level()<item->Level()) // if level of the previous item is lower, set it to the new value
- lastitem->SetLevel(item->Level());
-
- delete item;
- }
- else
+ if(!base||(strstr(recording->Name(),base)==recording->Name()&&recording->Name()[strlen(base)]=='~'))
{
- Add(item); // different text means a new item to add
- lastitem=item;
- free(lastitemtext);
- lastitemtext=strdup(lastitem->Text());
+ myMenuMoveRecordingItem *item=new myMenuMoveRecordingItem(recording,level);
+ if(*item->Text())
+ {
+ if(lastitemtext&&!strcmp(lastitemtext,item->Text())) // same text
+ {
+ if(lastitem&&lastitem->Level()<item->Level()) // if level of the previous item is lower, set it to the new value
+ lastitem->SetLevel(item->Level());
+
+ delete item;
+ }
+ else
+ {
+ Add(item); // different text means a new item to add
+ lastitem=item;
+ free(lastitemtext);
+ lastitemtext=strdup(lastitem->Text());
+ }
+ }
+ else
+ delete item;
}
- }
- else
- delete item;
}
- }
- free(lastitemtext);
+ free(lastitemtext);
}
eOSState myMenuMoveRecording::Open()
@@ -278,70 +287,123 @@ eOSState myMenuMoveRecording::Open()
eOSState myMenuMoveRecording::MoveRec()
{
- char *oldname=NULL;
- char *newname=NULL;
- char *dir=NULL;
- char *tmpdirbase=dirbase?ExchangeChars(strdup(dirbase),true):NULL;
- char *tmpdirname=dirname?ExchangeChars(strdup(dirname),true):NULL;
+ char *oldname=NULL;
+ char *newname=NULL;
+ char *dir=NULL;
+ char *tmpdirbase=dirbase?ExchangeChars(strdup(dirbase),true):NULL;
+ char *tmpdirname=dirname?ExchangeChars(strdup(dirname),true):NULL;
- eOSState state=osContinue;
+ eOSState state=osContinue;
- if(dirname)
- asprintf(&oldname,"%s%s%s/%s",VideoDirectory,dirbase?"/":"",tmpdirbase?tmpdirbase:"",tmpdirname);
- else
- oldname=strdup(recording->FileName());
+ if(dirname)
+ asprintf(&oldname,"%s%s%s/%s",VideoDirectory,dirbase?"/":"",tmpdirbase?tmpdirbase:"",tmpdirname);
+ else
+ oldname=strdup(recording->FileName());
- myMenuMoveRecordingItem *item=(myMenuMoveRecordingItem*)Get(Current());
- if(item)
- {
- if(strcmp(tr("[base dir]"),item->Text()))
+ myMenuMoveRecordingItem *item=(myMenuMoveRecordingItem*)Get(Current());
+ if(item)
{
- if(dirname)
- asprintf(&dir,"%s%s%s",base?base:"",base?"~":"",item->Text());
- else
- {
- char *p=strrchr(recording->Name(),'~');
- asprintf(&dir,"%s%s%s~%s",base?base:"",base?"~":"",item->Text(),p?p+1:recording->Name());
- }
+ if(strcmp(tr("[base dir]"),item->Text()))
+ {
+ if(dirname)
+ asprintf(&dir,"%s%s%s",base?base:"",base?"~":"",item->Text());
+ else
+ {
+ char *p=strrchr(recording->Name(),'~');
+ asprintf(&dir,"%s%s%s~%s",base?base:"",base?"~":"",item->Text(),p?p+1:recording->Name());
+ }
+ }
+ else
+ {
+ if(!dirname)
+ {
+ char *p=strrchr(recording->Name(),'~');
+ asprintf(&dir,"%s",p?++p:recording->Name());
+ }
+ }
}
else
{
- if(!dirname)
- {
- char *p=strrchr(recording->Name(),'~');
- asprintf(&dir,"%s",p?++p:recording->Name());
- }
+ if(dirname)
+ asprintf(&dir,"%s",base);
+ else
+ {
+ char *p=strrchr(recording->Name(),'~');
+ asprintf(&dir,"%s~%s",base,p?p:recording->Name());
+ }
}
- }
- else
- {
- if(dirname)
- asprintf(&dir,"%s",base);
+ if(dir)
+ dir=ExchangeChars(dir,true);
+
+ asprintf(&newname,"%s%s%s%s",VideoDirectory,dir?"/":"",dir?dir:"",strrchr(dirname?oldname:recording->FileName(),'/'));
+
+ if(!MakeDirs(newname,true))
+ Skins.Message(mtError,tr("Creating directories failed!"));
else
{
- char *p=strrchr(recording->Name(),'~');
- asprintf(&dir,"%s~%s",base,p?p:recording->Name());
+ struct stat stat1,stat2;
+ stat(oldname,&stat1);
+ stat(newname,&stat2);
+ if(stat1.st_dev==stat2.st_dev)
+ {
+ if(MoveRename(oldname,newname,dirname?NULL:recording,true))
+ {
+ clearall=true;
+ state=osBack;
+ menurecordings->Set(true);
+ }
+ }
+ else
+ {
+ if(MoveThread.Active())
+ Skins.Message(mtError,tr("Move recordings already in progress!"));
+ else
+ {
+ struct statfs fsstat;
+ statfs(newname,&fsstat);
+ int freemb=int(fsstat.f_bavail/(1024*1024/fsstat.f_bsize));
+ int recmb=0;
+
+ if(recording)
+ recmb=DirSizeMB(recording->FileName());
+ else
+ {
+ for(cRecording *rec=Recordings.First();rec;rec=Recordings.Next(rec))
+ {
+ if(!strncmp(oldname,rec->FileName(),strlen(oldname)))
+ recmb+=DirSizeMB(rec->FileName());
+ }
+ }
+
+ if(freemb-recmb <= 0)
+ {
+ if(Interface->Confirm(tr("Target filesystem filled - try anyway?")))
+ {
+ MoveThread.Start(oldname,newname,dirname?NULL:recording);
+ clearall=true;
+ state=osBack;
+ menurecordings->Set(true);
+ }
+ else
+ remove(newname); // remove created directory
+ }
+ else
+ {
+ MoveThread.Start(oldname,newname,dirname?NULL:recording);
+ clearall=true;
+ state=osBack;
+ menurecordings->Set(true);
+ }
+ }
+ }
}
- }
- if(dir)
- dir=ExchangeChars(dir,true);
+ free(oldname);
+ free(newname);
+ free(dir);
+ free(tmpdirbase);
+ free(tmpdirname);
- asprintf(&newname,"%s%s%s%s",VideoDirectory,dir?"/":"",dir?dir:"",strrchr(dirname?oldname:recording->FileName(),'/'));
-
- if(MoveRename(oldname,newname,dirname?NULL:recording,true))
- {
- clearall=true;
- state=osBack;
- menurecordings->Set(true);
- }
-
- free(oldname);
- free(newname);
- free(dir);
- free(tmpdirbase);
- free(tmpdirname);
-
- return state;
+ return state;
}
eOSState myMenuMoveRecording::Create()