]> git.vomp.tv Git - jsonserver.git/commitdiff
Rename recording
authorChris Tallon <chris@vomp.tv>
Tue, 11 Jun 2013 21:59:12 +0000 (22:59 +0100)
committerChris Tallon <chris@vomp.tv>
Tue, 11 Jun 2013 21:59:12 +0000 (22:59 +0100)
handler.c
handler.h

index a32a88b4d034a3aa49386f44248d47fef6473896..9c60610bed1d593b1963c6f0dbadd5061c4827f6 100644 (file)
--- 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();
index e1f4e7e8c1a831b9c4e74640b4fd1ee48cb5e33f..fc233729278a05a87413b40992dfab380c166878 100644 (file)
--- 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);