Don't reuse file names
authorMohammed Sameer <msameer@foolab.org>
Mon, 19 Aug 2013 21:37:26 +0000 (00:37 +0300)
committerMohammed Sameer <msameer@foolab.org>
Mon, 19 Aug 2013 21:37:26 +0000 (00:37 +0300)
Always keep track of the last used counter and don't just pick the next available file name.

qml/MainPage.qml
src/filenaming.cpp
src/filenaming.h
src/settings.cpp
src/settings.h

index 784f864..37f80c5 100644 (file)
@@ -216,6 +216,7 @@ CameraPage {
         imagePath: platformSettings.imagePath
         videoPath: platformSettings.videoPath
         temporaryVideoPath: platformSettings.temporaryVideoPath
+        settings: settings
     }
 
     MountProtector {
index ab950ac..a001647 100644 (file)
 #elif defined(QT5)
 #include <QQmlInfo>
 #endif
+#include "settings.h"
 
 #define PATH QString("%1%2MyDocs%2DCIM%2").arg(QDir::homePath()).arg(QDir::separator())
 #define TEMP_PATH QString("%1%2MyDocs%2.cameraplus%2").arg(QDir::homePath()).arg(QDir::separator())
 
 FileNaming::FileNaming(QObject *parent) :
-  QObject(parent), m_index(-1) {
+  QObject(parent),
+  m_settings(0) {
 
 }
 
@@ -71,44 +73,60 @@ QString FileNaming::videoFileName() {
 }
 
 QString FileNaming::fileName(const QString& path, const QString& suffix) {
-  QString date = QDate::currentDate().toString("yyyyMMdd");
-  QDir dir(path);
+  if (!m_settings) {
+    qmlInfo(this) << "settings has not been set";
+    return QString();
+  }
 
   if (suffix.isEmpty()) {
+    qmlInfo(this) << "called with empty suffix";
     return QString();
   }
 
   if (path.isEmpty()) {
+    qmlInfo(this) << "called with empty path";
     return QString();
   }
 
-  if (date != m_date) {
-    m_index = -1;
-    m_date = date;
+  QString date = QDate::currentDate().toString("yyyyMMdd");
+  QDir dir(path);
+
+  // index is the last used index
+  int index = 0;
+
+  if (m_settings->fileNamingStamp() != date) {
+    m_settings->setFileNamingStamp(date);
+  }
+  else {
+    index = m_settings->fileNamingCounter();
   }
 
-  if (m_index == -1) {
+  if (index == 0) {
     QStringList filters(QString("*%1_*").arg(date));
     QStringList entries = dir.entryList(filters, QDir::Files, QDir::Name);
-    if (entries.isEmpty()) {
-      m_index = 0;
-    }
-    else {
+    if (!entries.isEmpty()) {
       QString name = QFile(entries.last()).fileName();
-      m_index = name.section('_', 1, 1).section('.', 0, 0).toInt();
+      index = name.section('_', 1, 1).section('.', 0, 0).toInt();
     }
   }
 
-  ++m_index;
+  while (index < INT_MAX) {
+    ++index;
 
-  QString name = QString("%1%2_%3.%4").arg(path).arg(date).arg(QString().sprintf("%03i", m_index)).
-    arg(suffix);
+    QString name = QString("%1%2_%3.%4")
+      .arg(path).arg(date).arg(QString().sprintf("%03i", index)).arg(suffix);
+
+    if (!QFile(name).exists()) {
+      m_settings->setFileNamingCounter(index);
+
+      return name;
+    }
 
-  if (QFile(name).exists()) {
-    return QString();
   }
 
-  return name;
+  qmlInfo(this) << "Failed to guess a file name";
+
+  return QString();
 }
 
 QString FileNaming::canonicalPath(const QString& path) {
@@ -176,3 +194,15 @@ void FileNaming::setTemporaryVideoPath(const QString& path) {
     emit temporaryVideoPathChanged();
   }
 }
+
+Settings *FileNaming::settings() const {
+  return m_settings;
+}
+
+void FileNaming::setSettings(Settings *settings) {
+  if (m_settings != settings) {
+    m_settings = settings;
+
+    emit settingsChanged();
+  }
+}
index d5f7129..58ab354 100644 (file)
@@ -25,6 +25,8 @@
 
 #include <QObject>
 
+class Settings;
+
 class FileNaming : public QObject {
   Q_OBJECT
 
@@ -33,6 +35,7 @@ class FileNaming : public QObject {
   Q_PROPERTY(QString imagePath READ imagePath WRITE setImagePath NOTIFY imagePathChanged);
   Q_PROPERTY(QString videoPath READ videoPath WRITE setVideoPath NOTIFY videoPathChanged);
   Q_PROPERTY(QString temporaryVideoPath READ temporaryVideoPath WRITE setTemporaryVideoPath NOTIFY temporaryVideoPathChanged);
+  Q_PROPERTY(Settings *settings READ settings WRITE setSettings NOTIFY settingsChanged);
 
 public:
   FileNaming(QObject *parent = 0);
@@ -57,12 +60,16 @@ public:
   QString temporaryVideoPath() const;
   void setTemporaryVideoPath(const QString& path);
 
+  Settings *settings() const;
+  void setSettings(Settings *settings);
+
 signals:
   void imageSuffixChanged();
   void videoSuffixChanged();
   void imagePathChanged();
   void videoPathChanged();
   void temporaryVideoPathChanged();
+  void settingsChanged();
 
 private:
   QString fileName(const QString& path, const QString& suffix);
@@ -75,8 +82,7 @@ private:
   QString m_videoPath;
   QString m_temporaryVideoPath;
 
-  QString m_date;
-  int m_index;
+  Settings *m_settings;
 };
 
 #endif /* FILE_NAMING_H */
index 9bed54b..05ae2bc 100644 (file)
@@ -408,3 +408,19 @@ void Settings::setVideoTorchOn(bool on) {
     emit videoTorchOnChanged();
   }
 }
+
+QString Settings::fileNamingStamp() const {
+  return m_settings->value("fileNaming/stamp").toString();
+}
+
+void Settings::setFileNamingStamp(const QString& stamp) {
+  m_settings->setValue("fileNaming/stamp", stamp);
+}
+
+int Settings::fileNamingCounter() const {
+  return m_settings->value("fileNaming/counter").toInt();
+}
+
+void Settings::setFileNamingCounter(int counter) {
+  m_settings->setValue("fileNaming/counter", counter);
+}
index e5a8500..6b16cdc 100644 (file)
@@ -148,6 +148,12 @@ public:
   int device() const;
   void setDevice(int device);
 
+  QString fileNamingStamp() const;
+  void setFileNamingStamp(const QString& stamp);
+
+  int fileNamingCounter() const;
+  void setFileNamingCounter(int counter);
+
 signals:
   void modeChanged();
   void creatorNameChanged();