else if (!strcmp(wvrequest, "recinfo")) success = jsonserver_recinfo(js, postData);
else if (!strcmp(wvrequest, "recdel")) success = jsonserver_recdel(js, postData);
else if (!strcmp(wvrequest, "recmove")) success = jsonserver_recmove(js, postData);
+ else if (!strcmp(wvrequest, "recrename")) success = jsonserver_recrename(js, postData);
else if (!strcmp(wvrequest, "recstop")) success = jsonserver_recstop(js, postData);
else if (!strcmp(wvrequest, "channellist")) success = jsonserver_channellist(js);
else if (!strcmp(wvrequest, "channelschedule")) success = jsonserver_channelschedule(js, postData);
return true;
}
+bool jsonserver_recrename(Json::Value& js, const char* postData)
+{
+ Log* log = Log::getInstance();
+ log->log("JSONServer", Log::DEBUG, "recrename");
+
+ char* fileNameToRename = NULL;
+ char* requestedNewName = NULL;
+ char* dateDirName = NULL;
+ char* titleDirName = NULL;
+ char* folderName = NULL;
+ char* newContainer = NULL;
+ char* newDir = NULL;
+
+ try
+ {
+ int postDataLen = strlen(postData)+1;
+ fileNameToRename = new char[postDataLen];
+ int mgv1 = mg_get_var(postData, postDataLen-1, "filename", fileNameToRename, postDataLen);
+ requestedNewName = new char[postDataLen];
+ int mgv2 = mg_get_var(postData, postDataLen-1, "newname", requestedNewName, postDataLen);
+
+ if ((mgv1 == -1) || (mgv2 == -1) || !strlen(fileNameToRename) || !strlen(requestedNewName))
+ {
+ log->log("JSONServer", Log::ERR, "request mgvs: %i %i", mgv1, mgv2);
+ throw 1;
+ }
+
+ cRecordings Recordings;
+ Recordings.Load(); // probably have to do this
+ cRecording* recordingObj = Recordings.GetByName(fileNameToRename);
+ if (!recordingObj) throw 2;
+
+ cRecordControl *rc = cRecordControls::GetRecordControl(recordingObj->FileName());
+ if (rc) throw 3;
+
+ log->log("JSONServer", Log::DEBUG, "renaming recording: %s", recordingObj->Name());
+ log->log("JSONServer", Log::DEBUG, "renaming recording: %s", recordingObj->FileName());
+ log->log("JSONServer", Log::DEBUG, "to: %s", requestedNewName);
+
+ const char* t = recordingObj->FileName();
+
+ int k, j, m;
+
+ // Find the datedirname
+ for(k = strlen(t) - 1; k >= 0; k--)
+ {
+ 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
+
+ for(j = k-1; j >= 0; j--)
+ {
+ 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
+
+ log->log("JSONServer", Log::DEBUG, "j = %u, strlenvd = %u", j, strlen(VideoDirectory));
+ if (j > (int)strlen(VideoDirectory)) // Rec is in a subfolder now
+ {
+ for(m = j-1; m >= 0; m--)
+ {
+ 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(requestedNewName, 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", requestedNewName);
+
+ // Could be a new path - construct that first and test
+
+ if (folderName)
+ {
+ newContainer = new char[strlen(VideoDirectory) + 1 + strlen(folderName) + 1 + strlen(requestedNewName) + 1];
+ sprintf(newContainer, "%s/%s/%s", VideoDirectory, folderName, requestedNewName);
+ }
+ else
+ {
+ newContainer = new char[strlen(VideoDirectory) + 1 + strlen(requestedNewName) + 1];
+ sprintf(newContainer, "%s/%s", VideoDirectory, requestedNewName);
+ }
+ 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) 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
+
+ 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);
+ if (rename(t, newDir) != 0) throw 8;
+
+ // Success. Test for remove old dir containter
+ 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;
+
+ ::Recordings.Update();
+ js["Result"] = true;
+ js["NewRecordingFileName"] = newDir;
+ }
+ catch (int e)
+ {
+ js["Result"] = false;
+ 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 == 8)
+ {
+ log->log("JSONServer", Log::ERR, "Rename failed");
+ js["Error"] = "Move failed";
+ }
+ }
+
+ if (fileNameToRename) delete[] fileNameToRename;
+ if (requestedNewName) delete[] requestedNewName;
+ if (dateDirName) delete[] dateDirName;
+ if (titleDirName) delete[] titleDirName;
+ if (folderName) delete[] folderName;
+ if (newContainer) delete[] newContainer;
+ if (newDir) delete[] newDir;
+
+ return true;
+}
+
bool jsonserver_channellist(Json::Value& js)
{
Log* log = Log::getInstance();