]> git.vomp.tv Git - jsonserver.git/commitdiff
Move recording to new folder
authorChris Tallon <chris@vomp.tv>
Sat, 20 Apr 2013 13:57:50 +0000 (14:57 +0100)
committerChris Tallon <chris@vomp.tv>
Sat, 20 Apr 2013 13:57:50 +0000 (14:57 +0100)
handler.c

index c3c1a20c076fc8b49a2035421639a50164dfc3f3..3a58e7af225bec301b80fa2ef62191da3bd2a05a 100644 (file)
--- a/handler.c
+++ b/handler.c
@@ -396,6 +396,8 @@ bool jsonserver_recmove(Json::Value& js, const char* postData)
 
   char* dateDirName = NULL;   int k;
   char* titleDirName = NULL;  int j;
+  char* folderName = NULL;    int m;
+  
   char* newContainer = NULL;
 
   // Find the datedirname
@@ -416,41 +418,96 @@ bool jsonserver_recmove(Json::Value& js, const char* postData)
   {
     if (t[j] == '/')
     {
-      log->log("JSONServer", Log::DEBUG, "l2: %i", (k - j - 1) + 1);
-      titleDirName = new char[(k - j - 1) + 1];
+      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 > 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(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);
-
-  ExchangeChars(sNewPath, true);
+  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];
-  log->log("JSONServer", Log::DEBUG, "l10: %i", 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)
+    {
+      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;
+    }
+  }
+  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);
 
-  struct stat dstat;
-  int statret = stat(newContainer, &dstat);
+  statret = stat(newContainer, &dstat);
   if ((statret == -1) && (errno == ENOENT)) // Dir does not exist
   {
-    log->log("JSONServer", Log::DEBUG, "new 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;
 
-      log->log("JSONServer", Log::ERR, "Failed to make new dir");
+      log->log("JSONServer", Log::ERR, "Failed to make new dir (2)");
       js["Result"] = false;
-      js["Error"] = "Failed to create new directory";
+      js["Error"] = "Failed to create new directory (2)";
       return true;
     }
   }
@@ -458,6 +515,7 @@ bool jsonserver_recmove(Json::Value& js, const char* postData)
   {
     delete[] dateDirName;
     delete[] titleDirName;
+    if (folderName) delete[] folderName;
     delete[] newContainer;
 
     log->log("JSONServer", Log::ERR, "Something already exists?");
@@ -483,6 +541,23 @@ bool jsonserver_recmove(Json::Value& js, const char* postData)
     rmdir(oldTitleDir); // can't do anything about a fail result at this point.
     delete[] oldTitleDir;
 
+    // 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);
+      /*
+      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;
+    }
+    
     ::Recordings.Update();
     js["Result"] = true;
     js["NewRecordingFileName"] = newDir;
@@ -497,6 +572,7 @@ bool jsonserver_recmove(Json::Value& js, const char* postData)
   delete[] dateDirName;
   delete[] titleDirName;
   delete[] newContainer;
+  if (folderName) delete[] folderName;
   delete[] newDir;
 
   return true;