From cd45c76bf51439fa29a341d5e9ff3f287c7ba5fd Mon Sep 17 00:00:00 2001 From: Chris Tallon Date: Tue, 11 Jun 2013 22:59:12 +0100 Subject: [PATCH] Rename recording --- handler.c | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ handler.h | 1 + 2 files changed, 190 insertions(+) diff --git a/handler.c b/handler.c index a32a88b..9c60610 100644 --- a/handler.c +++ b/handler.c @@ -74,6 +74,7 @@ int jsonserver_request_handler(struct mg_connection *conn) 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); @@ -604,6 +605,194 @@ bool jsonserver_recmove(Json::Value& js, const char* 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(); diff --git a/handler.h b/handler.h index e1f4e7e..fc23372 100644 --- a/handler.h +++ b/handler.h @@ -14,6 +14,7 @@ bool jsonserver_reclist(Json::Value& js); bool jsonserver_recinfo(Json::Value& js, const char* postData); bool jsonserver_recdel(Json::Value& js, const char* postData); bool jsonserver_recmove(Json::Value& js, const char* postData); +bool jsonserver_recrename(Json::Value& js, const char* postData); bool jsonserver_recstop(Json::Value& js, const char* postData); bool jsonserver_channellist(Json::Value& js); bool jsonserver_channelschedule(Json::Value& js, const char* postData); -- 2.39.2