summaryrefslogtreecommitdiff
path: root/mymenueditrecording.c
diff options
context:
space:
mode:
Diffstat (limited to 'mymenueditrecording.c')
-rw-r--r--mymenueditrecording.c334
1 files changed, 211 insertions, 123 deletions
diff --git a/mymenueditrecording.c b/mymenueditrecording.c
index bf05140..135fd5e 100644
--- a/mymenueditrecording.c
+++ b/mymenueditrecording.c
@@ -30,13 +30,13 @@ myMenuRenameRecording::myMenuRenameRecording(cRecording *Recording,const char *D
{
strn0cpy(name,++p,sizeof(name));
strn0cpy(path,recording->Name(),sizeof(path));
-
+
p=strrchr(path,'~');
if(p)
*p=0;
}
else
- strn0cpy(name,recording->Name(),sizeof(name));
+ strn0cpy(name,recording->Name(),sizeof(name));
}
else
{
@@ -45,7 +45,7 @@ myMenuRenameRecording::myMenuRenameRecording(cRecording *Recording,const char *D
if(DirBase)
strn0cpy(path,DirBase,sizeof(path));
}
- Add(new cMenuEditStrItem(trVDR("Name"),name,sizeof(name),tr(FileNameChars)));
+ Add(new cMenuEditStrItem(trVDR("Name"),name,sizeof(name),trVDR(FileNameChars)));
cRemote::Put(kRight);
}
@@ -75,26 +75,36 @@ eOSState myMenuRenameRecording::ProcessKey(eKeys Key)
}
if(isdir)
- asprintf(&oldname,"%s%s%s/%s",VideoDirectory,tmppath?"/":"",dirbase?dirbase:"",dirname);
+ {
+ if(-1==asprintf(&oldname,"%s%s%s/%s",VideoDirectory,tmppath?"/":"",dirbase?dirbase:"",dirname))
+ oldname=NULL;
+ }
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(oldname)
{
- if(MoveRename(oldname,newname,isdir?NULL:recording,false))
- state=osBack;
- else
+ if(-1==asprintf(&newname,"%s%s%s/%s%s",VideoDirectory,tmppath?"/":"",tmppath?tmppath:"",tmpname,isdir?"":strrchr(recording->FileName(),'/')))
+ newname=NULL;
+
+ if(newname)
{
- cRemote::Put(kRight);
- state=osContinue;
+ if(!MakeDirs(newname,true))
+ Skins.Message(mtError,tr("Creating directories failed!"));
+ else
+ {
+ if(MoveRename(oldname,newname,isdir?NULL:recording,false))
+ state=osBack;
+ else
+ {
+ cRemote::Put(kRight);
+ state=osContinue;
+ }
+ }
+ free(newname);
}
+ free(oldname);
}
- free(oldname);
- free(newname);
free(tmppath);
free(tmpname);
}
@@ -120,14 +130,14 @@ class myMenuNewName:public cOsdMenu
myMenuNewName::myMenuNewName():cOsdMenu(tr("New folder"),12)
{
strn0cpy(name,tr("New folder"),sizeof(name));
- Add(new cMenuEditStrItem(trVDR("Name"),name,sizeof(name),tr(FileNameChars)));
+ Add(new cMenuEditStrItem(trVDR("Name"),name,sizeof(name),trVDR(FileNameChars)));
cRemote::Put(kRight);
}
eOSState myMenuNewName::ProcessKey(eKeys Key)
{
eOSState state=cOsdMenu::ProcessKey(Key);
-
+
if(state==osContinue)
{
if(Key==kOk)
@@ -147,7 +157,7 @@ eOSState myMenuNewName::ProcessKey(eKeys Key)
if(Key==kBack)
state=osBack;
}
-
+
return state;
}
@@ -211,7 +221,7 @@ myMenuMoveRecording::myMenuMoveRecording(cRecording *Recording,const char *DirBa
strn0cpy(newname,"",sizeof(newname));
recording=Recording;
base=Base?strdup(Base):NULL;
-
+
level=Level;
Set();
SetHelp(tr("Button$Cancel"),NULL,tr("Button$Create"),tr("Button$Move"));
@@ -290,143 +300,165 @@ eOSState myMenuMoveRecording::MoveRec()
char *dir=NULL;
char *tmpdirbase=dirbase?ExchangeChars(strdup(dirbase),true):NULL;
char *tmpdirname=dirname?ExchangeChars(strdup(dirname),true):NULL;
-
+
eOSState state=osContinue;
if(dirname)
- asprintf(&oldname,"%s%s%s/%s",VideoDirectory,dirbase?"/":"",tmpdirbase?tmpdirbase:"",tmpdirname);
+ {
+ if(-1==asprintf(&oldname,"%s%s%s/%s",VideoDirectory,dirbase?"/":"",tmpdirbase?tmpdirbase:"",tmpdirname))
+ oldname=NULL;
+ }
else
oldname=strdup(recording->FileName());
- myMenuMoveRecordingItem *item=(myMenuMoveRecordingItem*)Get(Current());
- if(item)
+ if(oldname)
{
- 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 // needed for move recording menu
+ if(strcmp(tr("[base dir]"),item->Text()))
{
- const char *p=strrchr(recording->Name(),'~');
- asprintf(&dir,"%s%s%s~%s",base?base:"",base?"~":"",item->Text(),p?p+1:recording->Name());
+ if(dirname)
+ {
+ if(-1==asprintf(&dir,"%s%s%s",base?base:"",base?"~":"",item->Text()))
+ dir=NULL;
+ }
+ else // needed for move recording menu
+ {
+ const char *p=strrchr(recording->Name(),'~');
+ if(-1==asprintf(&dir,"%s%s%s~%s",base?base:"",base?"~":"",item->Text(),p?p+1:recording->Name()))
+ dir=NULL;
+ }
+ }
+ else
+ {
+ if(!dirname)
+ {
+ const char *p=strrchr(recording->Name(),'~');
+ if(-1==asprintf(&dir,"%s",p?++p:recording->Name()))
+ dir=NULL;
+ }
}
}
else
{
- if(!dirname)
+ if(dirname)
+ {
+ if(-1==asprintf(&dir,"%s",base))
+ dir=NULL;
+ }
+ else
{
const char *p=strrchr(recording->Name(),'~');
- asprintf(&dir,"%s",p?++p:recording->Name());
+ if(-1==asprintf(&dir,"%s~%s",base,p?p:recording->Name()))
+ dir=NULL;
}
}
- }
- else
- {
- if(dirname)
- asprintf(&dir,"%s",base);
- else
- {
- const char *p=strrchr(recording->Name(),'~');
- asprintf(&dir,"%s~%s",base,p?p:recording->Name());
- }
- }
- if(dir)
- dir=ExchangeChars(dir,true);
-
- asprintf(&_newname,"%s%s%s%s",VideoDirectory,dir?"/":"",dir?dir:"",strrchr(dirname?oldname:recording->FileName(),'/'));
-
- // getting existing part of target path
- string path=_newname;
- string::size_type pos=string::npos;
- do
- pos=path.rfind('/',pos)-1;
- while(access(path.substr(0,pos+1).c_str(),R_OK));
-
- path=path.substr(0,pos+1);
-
- struct stat stat1,stat2;
- stat(oldname,&stat1);
- stat(path.c_str(),&stat2);
- // are source and target at the same filesystem?
- if(stat1.st_dev==stat2.st_dev)
- {
- if(MoveRename(oldname,_newname,dirname?NULL:recording,true))
- {
- clearall=true;
- state=osBack;
- }
- }
- else
- {
- struct statvfs fsstat;
- if(!statvfs(path.c_str(),&fsstat))
- {
- int freemb=int((double)fsstat.f_bavail/(1024.0*1024.0/fsstat.f_bsize));
- int recmb=0;
+ if(dir)
+ dir=ExchangeChars(dir,true);
+
+ if(-1==asprintf(&_newname,"%s%s%s%s",VideoDirectory,dir?"/":"",dir?dir:"",strrchr(dirname?oldname:recording->FileName(),'/')))
+ _newname=NULL;
- // moving a single recording
- if(recording)
+ if(_newname)
+ {
+ // getting existing part of target path
+ string path=_newname;
+ string::size_type pos=string::npos;
+ do
+ pos=path.rfind('/',pos)-1;
+ while(access(path.substr(0,pos+1).c_str(),R_OK));
+
+ path=path.substr(0,pos+1);
+
+ struct stat stat1,stat2;
+ stat(oldname,&stat1);
+ stat(path.c_str(),&stat2);
+ // are source and target at the same filesystem?
+ if(stat1.st_dev==stat2.st_dev)
{
- recmb=DirSizeMB(recording->FileName());
- if(freemb-recmb > 0 || Interface->Confirm(tr("Target filesystem filled - try anyway?")))
+ if(MoveRename(oldname,_newname,dirname?NULL:recording,true))
{
- MoveCutterThread->AddToMoveList(oldname,_newname);
clearall=true;
state=osBack;
}
}
- // moving a directory
else
{
- string buf=oldname;
- buf+="/";
- if(!buf.compare(0,buf.length(),_newname))
- Skins.Message(mtError,tr("Moving into own sub-directory not allowed!"));
- else
+ struct statvfs fsstat;
+ if(!statvfs(path.c_str(),&fsstat))
{
- cThreadLock RecordingsLock(&Recordings);
- for(cRecording *rec=Recordings.First();rec;rec=Recordings.Next(rec))
+ int freemb=int((double)fsstat.f_bavail/(1024.0*1024.0/fsstat.f_bsize));
+ int recmb=0;
+
+ // moving a single recording
+ if(recording)
{
- if(!strncmp(oldname,rec->FileName(),strlen(oldname)))
- recmb+=DirSizeMB(rec->FileName());
+ recmb=DirSizeMB(recording->FileName());
+ if(freemb-recmb > 0 || Interface->Confirm(tr("Target filesystem filled - try anyway?")))
+ {
+ MoveCutterThread->AddToMoveList(oldname,_newname);
+ clearall=true;
+ state=osBack;
+ }
}
-
- if(freemb-recmb > 0 || Interface->Confirm(tr("Target filesystem filled - try anyway?")))
+ // moving a directory
+ else
{
- for(cRecording *rec=Recordings.First();rec;rec=Recordings.Next(rec))
+ string buf=oldname;
+ buf+="/";
+ if(!buf.compare(0,buf.length(),_newname))
+ Skins.Message(mtError,tr("Moving into own sub-directory not allowed!"));
+ else
{
- if(!strncmp(oldname,rec->FileName(),strlen(oldname)))
+ cThreadLock RecordingsLock(&Recordings);
+ 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 || Interface->Confirm(tr("Target filesystem filled - try anyway?")))
{
- char *_buf=ExchangeChars(strdup(oldname+strlen(VideoDirectory)+1),false);
-
- if(strcmp(rec->Name(),_buf))
+ for(cRecording *rec=Recordings.First();rec;rec=Recordings.Next(rec))
{
- free(_buf);
- asprintf(&_buf,"%s%s",_newname,rec->FileName()+strlen(oldname));
-
- MoveCutterThread->AddToMoveList(rec->FileName(),_buf);
+ if(!strncmp(oldname,rec->FileName(),strlen(oldname)))
+ {
+ char *_buf=ExchangeChars(strdup(oldname+strlen(VideoDirectory)+1),false);
+
+ if(strcmp(rec->Name(),_buf))
+ {
+ free(_buf);
+ if(-1==asprintf(&_buf,"%s%s",_newname,rec->FileName()+strlen(oldname)))
+ _buf=NULL;
+
+ if(_buf)
+ MoveCutterThread->AddToMoveList(rec->FileName(),_buf);
+ }
+ free(_buf);
+ _buf=NULL;
+ }
}
- free(_buf);
+ clearall=true;
+ state=osBack;
}
}
- clearall=true;
- state=osBack;
}
}
+ else
+ {
+ Skins.Message(mtError,tr("Can't get filesystem information"));
+ esyslog("[extrecmenu] %s",strerror(errno));
+ }
}
+ free(_newname);
}
- else
- {
- Skins.Message(mtError,tr("Can't get filesystem information"));
- esyslog("[extrecmenu] %s",strerror(errno));
- }
+ free(oldname);
}
- free(oldname);
- free(_newname);
free(dir);
free(tmpdirbase);
free(tmpdirname);
-
+
return state;
}
@@ -438,7 +470,7 @@ eOSState myMenuMoveRecording::Create()
eOSState myMenuMoveRecording::ProcessKey(eKeys Key)
{
eOSState state=cOsdMenu::ProcessKey(Key);
-
+
if(state==osUnknown)
{
switch(Key)
@@ -482,19 +514,75 @@ eOSState myMenuRecordingDetails::ProcessKey(eKeys Key)
{
if(Key==kOk)
{
- char *oldname=strdup(recording->FileName());
- char *_newname=strdup(recording->FileName());
+ if((priority!=recording->priority)||(lifetime!=recording->lifetime))
+ {
+#if VDRVERSNUM > 10713
+ if(recording->IsPesRecording())
+#endif
+ {
+ char *oldname=strdup(recording->FileName());
+ char *_newname=strdup(recording->FileName());
- sprintf(_newname+strlen(_newname)-9,"%02d.%02d.rec",priority,lifetime);
+ sprintf(_newname+strlen(_newname)-9,"%02d.%02d.rec",priority,lifetime);
- if(MoveRename(oldname,_newname,recording,false))
- state=osBack;
- else
- state=osContinue;
+ if(MoveRename(oldname,_newname,recording,false))
+ state=osBack;
+ else
+ state=osContinue;
- free(oldname);
- free(_newname);
+ free(oldname);
+ free(_newname);
+ }
+#if VDRVERSNUM > 10713
+ else
+ {
+ cString buffer = cString::sprintf("P %d\nL %d", priority, lifetime);
+ if(ModifyInfo(recording,*buffer))
+ {
+ cString fileName = recording->FileName();
+ Recordings.Del(recording);
+ Recordings.AddByName(*fileName);
+ state=osBack;
+ }
+ else
+ state=osContinue;
+ }
+#endif
+ }
+ else
+ state=osBack;
}
}
return state;
}
+
+#define INFOFILE_PES "info.vdr"
+#define INFOFILE_TS "info"
+bool myMenuRecordingDetails::ModifyInfo(cRecording *Recording, const char *Info)
+{ //This has been taken from remotetimers-0.1.3, written by Frank Schmirler <vdrdev@schmirler.de>
+
+ // check for write access as cRecording::WriteInfo() always returns true
+ // TODO: writing may still fail as access() doesn't use the effective UID
+#if VDRVERSNUM > 10713
+ cString InfoFileName=cString::sprintf(Recording->IsPesRecording()?"%s/"INFOFILE_PES:"%s/"INFOFILE_TS,Recording->FileName());
+#else
+ cString InfoFileName=cString::sprintf("%s/"INFOFILE_PES,Recording->FileName());
+#endif
+ if(access(InfoFileName,W_OK)==0)
+ {
+ FILE *f=fmemopen((void *)Info,strlen(Info)*sizeof(char),"r");
+ if(f)
+ {
+ // Casting const away is nasty, but what the heck?
+ // The Recordings thread is locked and the object is going to be deleted anyway.
+ if(((cRecordingInfo *)Recording->Info())->Read(f)&&Recording->WriteInfo())
+ return true;
+ esyslog("[extrecmenu] error in info string '%s'",Info);
+ }
+ else
+ esyslog("[extrecmenu] error in fmemopen: %m");
+ }
+ else
+ esyslog("[extrecmenu] '%s' not writeable: %m",*InfoFileName);
+ return false;
+}