Log* log = Log::getInstance();
log->log("JSONServer", Log::DEBUG, "recmove");
- char sFileName[1000]; int mgv1 = mg_get_var(postData, strlen(postData), "filename", sFileName, 1000);
- char sNewPath[1000]; int mgv2 = mg_get_var(postData, strlen(postData), "newpath", sNewPath, 1000);
-
- if ( (mgv1 == -1) || (mgv2 == -1) || !strlen(sFileName) || !strlen(sNewPath) )
+ char* fileNameToMove = NULL;
+ char* requestedNewPath = NULL;
+ char* dateDirName = NULL;
+ char* titleDirName = NULL;
+ char* folderName = NULL;
+ char* newContainer = NULL;
+ char* newDir = NULL;
+
+ try
{
- log->log("JSONServer", Log::ERR, "request mgvs: %i %i", mgv1, mgv2);
- js["Result"] = false;
- js["Error"] = "Bad request parameters";
- return true;
- }
+ int postDataLen = strlen(postData)+1;
+ fileNameToMove = new char[postDataLen];
+ int mgv1 = mg_get_var(postData, postDataLen-1, "filename", fileNameToMove, postDataLen);
+ requestedNewPath = new char[postDataLen];
+ int mgv2 = mg_get_var(postData, postDataLen-1, "newpath", requestedNewPath, postDataLen);
- cRecordings Recordings;
- Recordings.Load(); // probably have to do this
- cRecording* recording = Recordings.GetByName(sFileName);
+ if ((mgv1 == -1) || (mgv2 == -1) || !strlen(fileNameToMove) || !strlen(requestedNewPath))
+ {
+ log->log("JSONServer", Log::ERR, "request mgvs: %i %i", mgv1, mgv2);
+ throw 1;
+ }
- if (!recording)
- {
- log->log("JSONServer", Log::ERR, "Could not find recording to move");
- js["Result"] = false;
- js["Error"] = "Bad filename";
- return true;
- }
+ cRecordings Recordings;
+ Recordings.Load(); // probably have to do this
+ cRecording* recordingObj = Recordings.GetByName(fileNameToMove);
+ if (!recordingObj) throw 2;
+
+ cRecordControl *rc = cRecordControls::GetRecordControl(recordingObj->FileName());
+ if (rc) throw 3;
- cRecordControl *rc = cRecordControls::GetRecordControl(recording->FileName());
- if (rc)
- {
- log->log("JSONServer", Log::ERR, "Could not move recording, it is still recording");
- js["Result"] = false;
- js["Error"] = "Cannot move recording in progress";
- return true;
- }
-
- log->log("JSONServer", Log::DEBUG, "moving recording: %s", recording->Name());
- log->log("JSONServer", Log::DEBUG, "moving recording: %s", recording->FileName());
- log->log("JSONServer", Log::DEBUG, "to: %s", sNewPath);
+ log->log("JSONServer", Log::DEBUG, "moving recording: %s", recordingObj->Name());
+ log->log("JSONServer", Log::DEBUG, "moving recording: %s", recordingObj->FileName());
+ log->log("JSONServer", Log::DEBUG, "to: %s", requestedNewPath);
- const char* t = recording->FileName();
+ const char* t = recordingObj->FileName();
- char* dateDirName = NULL; int k;
- char* titleDirName = NULL; int j;
- char* folderName = NULL; int m;
-
- char* newContainer = NULL;
+ int k, j, m;
- // Find the datedirname
- for(k = strlen(t) - 1; k >= 0; k--)
- {
- if (t[k] == '/')
+ // Find the datedirname
+ for(k = strlen(t) - 1; k >= 0; k--)
{
- log->log("JSONServer", Log::DEBUG, "l1: %i", strlen(&t[k+1]) + 1);
- dateDirName = new char[strlen(&t[k+1]) + 1];
- strcpy(dateDirName, &t[k+1]);
- break;
+ if (t[k] == '/')
+ {
+ log->log("JSONServer", Log::DEBUG, "l1: %i", strlen(&t[k+1]) + 1);
+ dateDirName = new char[strlen(&t[k+1]) + 1];
+ strcpy(dateDirName, &t[k+1]);
+ break;
+ }
}
- }
- // Find the titledirname
+ // Find the titledirname
- for(j = k-1; j >= 0; j--)
- {
- if (t[j] == '/')
+ for(j = k-1; j >= 0; j--)
{
- log->log("JSONServer", Log::DEBUG, "l2: %i", k - j);
- titleDirName = new char[k - j];
- memcpy(titleDirName, &t[j+1], k - j - 1);
- titleDirName[k - j - 1] = '\0';
- break;
+ if (t[j] == '/')
+ {
+ log->log("JSONServer", Log::DEBUG, "l2: %i", k - j);
+ titleDirName = new char[k - j];
+ memcpy(titleDirName, &t[j+1], k - j - 1);
+ titleDirName[k - j - 1] = '\0';
+ break;
+ }
}
- }
- // Find the foldername
+ // Find the foldername
- log->log("JSONServer", Log::DEBUG, "j = %u, strlenvd = %u", j, strlen(VideoDirectory));
- if (j > strlen(VideoDirectory)) // Rec is in a subfolder now
- {
- for(m = j-1; m >= 0; m--)
+ log->log("JSONServer", Log::DEBUG, "j = %u, strlenvd = %u", j, strlen(VideoDirectory));
+ if (j > strlen(VideoDirectory)) // Rec is in a subfolder now
{
- if (t[m] == '/')
+ for(m = j-1; m >= 0; m--)
{
- log->log("JSONServer", Log::DEBUG, "l3: %i", j - m);
- folderName = new char[j - m];
- memcpy(folderName, &t[m+1], j - m - 1);
- folderName[j - m - 1] = '\0';
- break;
+ if (t[m] == '/')
+ {
+ log->log("JSONServer", Log::DEBUG, "l3: %i", j - m);
+ folderName = new char[j - m];
+ memcpy(folderName, &t[m+1], j - m - 1);
+ folderName[j - m - 1] = '\0';
+ break;
+ }
}
}
- }
- ExchangeChars(sNewPath, true);
-
- log->log("JSONServer", Log::DEBUG, "datedirname: %s", dateDirName);
- log->log("JSONServer", Log::DEBUG, "titledirname: %s", titleDirName);
- log->log("JSONServer", Log::DEBUG, "viddir: %s", VideoDirectory);
- if (folderName) log->log("JSONServer", Log::DEBUG, "folderName: %s", folderName);
- log->log("JSONServer", Log::DEBUG, "EC: %s", sNewPath);
-
- // Could be a new path - construct that first and test
- newContainer = new char[strlen(VideoDirectory) + strlen(sNewPath) + strlen(titleDirName) + 1];
- sprintf(newContainer, "%s%s", VideoDirectory, sNewPath);
- log->log("JSONServer", Log::DEBUG, "NPT: %s", newContainer);
- struct stat dstat;
- int statret = stat(newContainer, &dstat);
- if ((statret == -1) && (errno == ENOENT)) // Dir does not exist
- {
- log->log("JSONServer", Log::DEBUG, "new path does not exist (1)");
- int mkdirret = mkdir(newContainer, 0755);
- if (mkdirret != 0)
+ ExchangeChars(requestedNewPath, true);
+
+ log->log("JSONServer", Log::DEBUG, "datedirname: %s", dateDirName);
+ log->log("JSONServer", Log::DEBUG, "titledirname: %s", titleDirName);
+ log->log("JSONServer", Log::DEBUG, "viddir: %s", VideoDirectory);
+ if (folderName) log->log("JSONServer", Log::DEBUG, "folderName: %s", folderName);
+ log->log("JSONServer", Log::DEBUG, "EC: %s", requestedNewPath);
+
+ // Could be a new path - construct that first and test
+ newContainer = new char[strlen(VideoDirectory) + strlen(requestedNewPath) + strlen(titleDirName) + 1];
+ sprintf(newContainer, "%s%s", VideoDirectory, requestedNewPath);
+ log->log("JSONServer", Log::DEBUG, "NPT: %s", newContainer);
+ struct stat dstat;
+ int statret = stat(newContainer, &dstat);
+ if ((statret == -1) && (errno == ENOENT)) // Dir does not exist
{
- delete[] dateDirName;
- delete[] titleDirName;
- if (folderName) delete[] folderName;
- delete[] newContainer;
-
- log->log("JSONServer", Log::ERR, "Failed to make new dir (1)");
- js["Result"] = false;
- js["Error"] = "Failed to create new directory (1)";
- return true;
+ log->log("JSONServer", Log::DEBUG, "new path does not exist (1)");
+ int mkdirret = mkdir(newContainer, 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;
}
- }
- else if ((statret == 0) && (! (dstat.st_mode && S_IFDIR))) // Something exists but it's not a dir
- {
- delete[] dateDirName;
- delete[] titleDirName;
- if (folderName) delete[] folderName;
- delete[] newContainer;
-
- log->log("JSONServer", Log::ERR, "Something already exists? (1)");
- js["Result"] = false;
- js["Error"] = "Something already exists at the new path (1)";
- return true;
- }
- // New path now created or was there already
-
- sprintf(newContainer, "%s%s%s", VideoDirectory, sNewPath, titleDirName);
- log->log("JSONServer", Log::DEBUG, "%s", newContainer);
+ // New path now created or was there already
- statret = stat(newContainer, &dstat);
- if ((statret == -1) && (errno == ENOENT)) // Dir does not exist
- {
- log->log("JSONServer", Log::DEBUG, "new dir does not exist (2)");
- int mkdirret = mkdir(newContainer, 0755);
- if (mkdirret != 0)
- {
- delete[] dateDirName;
- delete[] titleDirName;
- if (folderName) delete[] folderName;
- delete[] newContainer;
+ sprintf(newContainer, "%s%s%s", VideoDirectory, requestedNewPath, titleDirName);
+ log->log("JSONServer", Log::DEBUG, "%s", newContainer);
- log->log("JSONServer", Log::ERR, "Failed to make new dir (2)");
- js["Result"] = false;
- js["Error"] = "Failed to create new directory (2)";
- return true;
+ statret = stat(newContainer, &dstat);
+ if ((statret == -1) && (errno == ENOENT)) // Dir does not exist
+ {
+ log->log("JSONServer", Log::DEBUG, "new dir does not exist (2)");
+ int mkdirret = mkdir(newContainer, 0755);
+ if (mkdirret != 0) throw 6;
+ }
+ else if ((statret == 0) && (! (dstat.st_mode && S_IFDIR)))
+ {
+ // Something exists but it's not a dir
+ throw 7;
}
- }
- else if ((statret == 0) && (! (dstat.st_mode && S_IFDIR))) // Something exists but it's not a dir
- {
- delete[] dateDirName;
- delete[] titleDirName;
- if (folderName) delete[] folderName;
- delete[] newContainer;
-
- log->log("JSONServer", Log::ERR, "Something already exists?");
- js["Result"] = false;
- js["Error"] = "Something already exists at the new path";
- return true;
- }
- // Ok, the directory container has been made, or it pre-existed.
+ // Ok, the directory container has been made, or it pre-existed.
- char* newDir = new char[strlen(newContainer) + 1 + strlen(dateDirName) + 1];
- sprintf(newDir, "%s/%s", newContainer, dateDirName);
+ newDir = new char[strlen(newContainer) + 1 + strlen(dateDirName) + 1];
+ sprintf(newDir, "%s/%s", newContainer, dateDirName);
- log->log("JSONServer", Log::DEBUG, "doing rename '%s' '%s'", t, newDir);
- int renameret = rename(t, newDir);
- if (renameret == 0)
- {
+ log->log("JSONServer", Log::DEBUG, "doing rename '%s' '%s'", t, newDir);
+ if (rename(t, newDir) != 0) throw 8;
+
// Success. Test for remove old dir containter
- char* oldTitleDir = new char[k+1];
- memcpy(oldTitleDir, t, k);
- oldTitleDir[k] = '\0';
- log->log("JSONServer", Log::DEBUG, "len: %i, cp: %i, strlen: %i, oldtitledir: %s", k+1, k, strlen(oldTitleDir), oldTitleDir);
- rmdir(oldTitleDir); // can't do anything about a fail result at this point.
- delete[] oldTitleDir;
+ char* tempOldTitleDir = new char[k+1];
+ memcpy(tempOldTitleDir, t, k);
+ tempOldTitleDir[k] = '\0';
+ log->log("JSONServer", Log::DEBUG, "len: %i, cp: %i, strlen: %i, oldtitledir: %s", k+1, k, strlen(tempOldTitleDir), tempOldTitleDir);
+ rmdir(tempOldTitleDir); // can't do anything about a fail result at this point.
+ delete[] tempOldTitleDir;
// Test for remove old foldername
if (folderName)
{
- char* oldFolderName = new char[j+1];
- memcpy(oldFolderName, t, j);
- oldFolderName[j] = '\0';
- log->log("JSONServer", Log::DEBUG, "len: %i, cp: %i, strlen: %i, oldfoldername: %s", j+1, j, strlen(oldFolderName), oldFolderName);
+ char* tempOldFolderName = new char[j+1];
+ memcpy(tempOldFolderName, t, j);
+ tempOldFolderName[j] = '\0';
+ log->log("JSONServer", Log::DEBUG, "len: %i, cp: %i, strlen: %i, oldfoldername: %s", j+1, j, strlen(tempOldFolderName), tempOldFolderName);
/*
DESCRIPTION
rmdir() deletes a directory, which must be empty.
ENOTEMPTY - pathname contains entries other than . and ..
So, should be safe to call rmdir on non-empty dir
*/
- rmdir(oldFolderName); // can't do anything about a fail result at this point.
- delete[] oldFolderName;
+ rmdir(tempOldFolderName); // can't do anything about a fail result at this point.
+ delete[] tempOldFolderName;
}
-
+
::Recordings.Update();
js["Result"] = true;
js["NewRecordingFileName"] = newDir;
}
- else
+ catch (int e)
{
- log->log("JSONServer", Log::ERR, "Rename failed");
js["Result"] = false;
- js["Error"] = "Move failed";
+ if (e == 1)
+ {
+ log->log("JSONServer", Log::ERR, "Bad parameters");
+ js["Error"] = "Bad request parameters";
+ }
+ else if (e == 2)
+ {
+ log->log("JSONServer", Log::ERR, "Could not find recording to move");
+ js["Error"] = "Bad filename";
+ }
+ else if (e == 3)
+ {
+ log->log("JSONServer", Log::ERR, "Could not move recording, it is still recording");
+ js["Error"] = "Cannot move recording in progress";
+ }
+ else if (e == 4)
+ {
+ log->log("JSONServer", Log::ERR, "Failed to make new dir (1)");
+ js["Error"] = "Failed to create new directory (1)";
+ }
+ else if (e == 5)
+ {
+ log->log("JSONServer", Log::ERR, "Something already exists? (1)");
+ js["Error"] = "Something already exists at the new path (1)";
+ }
+ else if (e == 6)
+ {
+ log->log("JSONServer", Log::ERR, "Failed to make new dir (2)");
+ js["Error"] = "Failed to create new directory (2)";
+ }
+ else if (e == 7)
+ {
+ log->log("JSONServer", Log::ERR, "Something already exists?");
+ js["Error"] = "Something already exists at the new path";
+ }
+ else if (e == 8)
+ {
+ log->log("JSONServer", Log::ERR, "Rename failed");
+ js["Error"] = "Move failed";
+ }
}
- delete[] dateDirName;
- delete[] titleDirName;
- delete[] newContainer;
- if (folderName) delete[] folderName;
- delete[] newDir;
+ if (fileNameToMove) delete[] fileNameToMove;
+ if (requestedNewPath) delete[] requestedNewPath;
+ if (dateDirName) delete[] dateDirName;
+ if (titleDirName) delete[] titleDirName;
+ if (folderName) delete[] folderName;
+ if (newContainer) delete[] newContainer;
+ if (newDir) delete[] newDir;
return true;
}