return true;
}
-void VDRClient::pathsForRecordingName(const cRecordings* Recordings, const std::string& recordingName,
- std::string& dirNameSingleDate,
- std::string& dirNameSingleTitle,
- std::string& dirNameSingleFolder,
- std::string& dirNameFullPathTitle,
- std::string& dirNameFullPathDate) // throws int
-{
- const char* t;
- {
- const cRecording* recordingObj = Recordings->GetByName(recordingName.c_str());
- if (!recordingObj) throw 2;
- t = recordingObj->FileName();
-
- cRecordControl *rc = cRecordControls::GetRecordControl(recordingObj->FileName());
- if (rc) throw 3;
-
- logger->debug("paths: recording: {}", recordingObj->Name());
- } // unlock recordings
-
- logger->debug("paths: recording: {}", t);
-
- dirNameFullPathDate = t;
- int k, j, m;
-
- // Find the datedirname
- for(k = strlen(t) - 1; k >= 0; k--)
- {
- if (t[k] == '/')
- {
- logger->debug("recmoverename: l1: {}", strlen(&t[k+1]) + 1);
- dirNameSingleDate.assign(&t[k+1], strlen(t) - k - 1);
- logger->debug("paths: dirNameSingleDate: '{}'", dirNameSingleDate);
- break;
- }
- }
-
- // Find the titledirname
-
- for(j = k-1; j >= 0; j--)
- {
- if (t[j] == '/')
- {
- logger->debug("recmoverename: l2: {}", k - j);
- dirNameSingleTitle.assign(&t[j+1], k - j - 1);
- logger->debug("paths: dirNameSingleTitle: '{}'", dirNameSingleTitle);
- break;
- }
- }
-
- // Find the foldername
-
- const char* vidDirStr = cVideoDirectory::Name();
- int vidDirStrLen = strlen(vidDirStr);
-
- logger->debug("recmoverename: j = {}, strlenvd = {}", j, vidDirStrLen);
- if (j > vidDirStrLen) // Rec is in a subfolder now
- {
- for(m = j-1; m >= 0; m--)
- {
- if (t[m] == '/')
- {
- logger->debug("recmoverename: l3: {}", j - m);
- dirNameSingleFolder.assign(&t[m+1], j - m - 1);
- logger->debug("paths: dirNameSingleFolder: '{}'", dirNameSingleFolder);
- break;
- }
- }
- }
-
- dirNameFullPathTitle.assign(t, k);
- logger->debug("paths: dirNameFullPathTitle: '{}'", dirNameFullPathTitle);
-}
-
bool VDRClient::recrename(PFMap& postFields, Json::Value& js) // RETHROWS
{
logger->debug("recrename");
std::string fileNameToAffect = getVarString(postFields, "filename");
- std::string requestedNewStr = getVarString(postFields, "newname");
-
- std::string dirNameSingleDate;
- std::string dirNameSingleTitle;
- std::string dirNameSingleFolder;
- std::string dirNameFullPathTitle;
- std::string dirNameFullPathDate;
-
-#warning Switch this to Recording->ChangeName ?
+ std::string requestedNewName = getVarString(postFields, "newname");
try
{
LOCK_RECORDINGS_WRITE;
+ cRecording* recordingObj = Recordings->GetByName(fileNameToAffect.c_str());
+ if (!recordingObj) throw 2;
- pathsForRecordingName(Recordings,
- fileNameToAffect, dirNameSingleDate,
- dirNameSingleTitle, dirNameSingleFolder,
- dirNameFullPathTitle, dirNameFullPathDate);
-
- char* requestedNewSingleTitle = (char*)malloc(requestedNewStr.size() + 1);
- strcpy(requestedNewSingleTitle, requestedNewStr.c_str());
- logger->debug("recmoverename: to: {}", requestedNewSingleTitle);
-
- requestedNewSingleTitle = ExchangeChars(requestedNewSingleTitle, true);
- if (!strlen(requestedNewSingleTitle)) throw 9;
- logger->debug("recmoverename: EC: {}", requestedNewSingleTitle);
-
- const char* vidDirStr = cVideoDirectory::Name();
- logger->debug("recmoverename: viddir: {}", vidDirStr);
-
- // Could be a new path - construct that first and test
-
- std::string newDirNameFullPathTitle = vidDirStr;
- newDirNameFullPathTitle.append("/");
-
- if (!dirNameSingleFolder.empty())
- {
- newDirNameFullPathTitle.append(dirNameSingleFolder);
- newDirNameFullPathTitle.append("/");
- }
-
- newDirNameFullPathTitle.append(requestedNewSingleTitle);
- free(requestedNewSingleTitle);
-
- logger->debug("recrename: NPT2: {}", newDirNameFullPathTitle);
-
- struct stat dstat;
- int statret = stat(newDirNameFullPathTitle.c_str(), &dstat);
- if ((statret == -1) && (errno == ENOENT)) // Dir does not exist
- {
- logger->debug("recrename: new path does not exist (1)");
- int mkdirret = mkdir(newDirNameFullPathTitle.c_str(), 0755);
- if (mkdirret != 0) throw 4;
- }
- else if ((statret == 0) && (! (dstat.st_mode && S_IFDIR)))
- {
- // Something exists but it's not a dir
- throw 5;
- }
-
- // New path now created or was there already
-
- std::string newDirNameFullPathDate = newDirNameFullPathTitle + "/";
- newDirNameFullPathDate.append(dirNameSingleDate);
+ std::string newName(recordingObj->Folder());
+ logger->debug("newname after folder copy: #{}#");
+ if (newName.length()) newName += FOLDERDELIMCHAR;
+ newName += requestedNewName;
- logger->debug("recrename: doing rename '{}' '{}'", dirNameFullPathDate, newDirNameFullPathDate);
- if (rename(dirNameFullPathDate.c_str(), newDirNameFullPathDate.c_str()) != 0) throw 8;
+ logger->debug("RM2 NEWLOC: #{}#", newName);
- // Success. Test for remove old dir containter
- rmdir(dirNameFullPathTitle.c_str()); // can't do anything about a fail result at this point.
+ bool moveSuccess = recordingObj->ChangeName(newName.c_str());
- Recordings->Update();
- js["Result"] = true;
- js["NewRecordingFileName"] = newDirNameFullPathDate;
+ js["Result"] = moveSuccess;
+ js["NewRecordingFileName"] = recordingObj->FileName();
+ }
+ catch (BadParamException& e)
+ {
+ js["Result"] = false;
+ logger->error("recmove: Bad parameters");
+ js["Error"] = "Bad request parameters";
}
catch (int e)
{
js["Result"] = false;
- if (e == 1)
- {
- logger->error("recrename: Bad parameters");
- js["Error"] = "Bad request parameters";
- }
- else if (e == 2)
+ if (e == 2)
{
- logger->error("recrename: Could not find recording to move");
+ logger->error("recmove: Could not find recording to move");
js["Error"] = "Bad filename";
}
- else if (e == 3)
- {
- logger->error("recrename: Could not move recording, it is still recording");
- js["Error"] = "Cannot move recording in progress";
- }
- else if (e == 4)
- {
- logger->error("recrename: Failed to make new dir (1)");
- js["Error"] = "Failed to create new directory (1)";
- }
- else if (e == 5)
- {
- logger->error("recrename: Something already exists? (1)");
- js["Error"] = "Something already exists at the new path (1)";
- }
- else if (e == 8)
- {
- logger->error("recrename: Rename failed");
- js["Error"] = "Rename failed";
- }
- else if (e == 9)
- {
- logger->error("recrename: ExchangeChars lost our string");
- js["Error"] = "Rename failed";
- }
}
return true;