From 32004fe0544119a13f0777a68d860b500368307b Mon Sep 17 00:00:00 2001
From: Rafael <Syping@users.noreply.github.com>
Date: Mon, 21 Mar 2016 03:10:28 +0100
Subject: [PATCH] pictures are openable with -showpic= argument

---
 PictureDialog.cpp    |   5 ++
 PictureDialog.h      |   1 +
 PictureDialog.ui     |  10 ++++
 SnapmaticPicture.cpp | 114 ++++++++++++++++++++++++++++++++++++++++++-
 SnapmaticPicture.h   |  18 +++++--
 main.cpp             |  37 ++++++++++++--
 6 files changed, 177 insertions(+), 8 deletions(-)

diff --git a/PictureDialog.cpp b/PictureDialog.cpp
index b588a48..537240b 100755
--- a/PictureDialog.cpp
+++ b/PictureDialog.cpp
@@ -12,3 +12,8 @@ PictureDialog::~PictureDialog()
 {
     delete ui;
 }
+
+void PictureDialog::setSnapmaticPicture(QPixmap pixmap)
+{
+    ui->labPicture->setPixmap(pixmap);
+}
diff --git a/PictureDialog.h b/PictureDialog.h
index 5363361..db221bb 100755
--- a/PictureDialog.h
+++ b/PictureDialog.h
@@ -13,6 +13,7 @@ class PictureDialog : public QDialog
 
 public:
     explicit PictureDialog(QWidget *parent = 0);
+    void setSnapmaticPicture(QPixmap pixmap);
     ~PictureDialog();
 
 private:
diff --git a/PictureDialog.ui b/PictureDialog.ui
index 22bd98e..61f7be9 100755
--- a/PictureDialog.ui
+++ b/PictureDialog.ui
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
  <class>PictureDialog</class>
  <widget class="QDialog" name="PictureDialog">
@@ -12,6 +13,15 @@
   <property name="windowTitle">
    <string>Dialog</string>
   </property>
+  <layout class="QVBoxLayout" name="vlPictureLayout">
+   <item>
+    <widget class="QLabel" name="labPicture">
+     <property name="text">
+      <string/>
+     </property>
+    </widget>
+   </item>
+  </layout>
  </widget>
  <resources/>
  <connections/>
diff --git a/SnapmaticPicture.cpp b/SnapmaticPicture.cpp
index 3f9001c..44efaec 100755
--- a/SnapmaticPicture.cpp
+++ b/SnapmaticPicture.cpp
@@ -16,8 +16,120 @@
 *****************************************************************************/
 
 #include "SnapmaticPicture.h"
+#include <QPixmap>
+#include <QString>
+#include <QDebug>
+#include <QFile>
+int snapmaticHeaderLength = 278;
+int snapmaticUsefulLength = 256;
+int jpegPreHeaderLength = 14;
+int jpegPicStreamLength = 524288;
 
-SnapmaticPicture::SnapmaticPicture(QObject *parent) : QObject(parent)
+SnapmaticPicture::SnapmaticPicture(QObject *parent, QString fileName) : QObject(parent)
 {
+    // Init
+    cachePicture = QPixmap(0,0);
+    picFileName = "";
+    pictureStr = "";
+    lastStep = "";
+    jsonStr = "";
 
+    // Set pic fileName
+    if (fileName != "")
+    {
+        picFileName = fileName;
+    }
+}
+
+bool SnapmaticPicture::readingPicture()
+{
+    // Start opening file
+    // lastStep is like currentStep
+
+    QFile *picFile = new QFile(picFileName);
+    if (!picFile->open(QFile::ReadOnly))
+    {
+        lastStep = "1;/1,OpenFile," + convertDrawStringForLog(picFileName);
+        return false;
+    }
+
+    // Reading Snapmatic Header
+    if (!picFile->isReadable())
+    {
+        lastStep = "2;/3,ReadingFile," + convertDrawStringForLog(picFileName) + ",1,NOHEADER";
+        return false;
+    }
+    QByteArray snapmaticHeaderLine = picFile->read(snapmaticHeaderLength);
+    pictureStr = getSnapmaticPictureString(snapmaticHeaderLine);
+
+    // Reading JPEG Header Line
+    if (!picFile->isReadable())
+    {
+        lastStep = "2;/3,ReadingFile," + convertDrawStringForLog(picFileName) + ",2,NOHEADER";
+        return false;
+    }
+    QByteArray jpegHeaderLine = picFile->read(jpegPreHeaderLength);
+
+    // Checking for JPEG
+    jpegHeaderLine.remove(0,2);
+    if (jpegHeaderLine.left(4) != "JPEG")
+    {
+        lastStep = "2;/3,ReadingFile," + convertDrawStringForLog(picFileName) + ",2,NOJPEG";
+        return false;
+    }
+
+    lastStep = "3;/1,ReadedFile," + convertDrawStringForLog(picFileName);
+    QByteArray jpegRawContent = picFile->read(jpegPicStreamLength);
+    return cachePicture.loadFromData(jpegRawContent);
+}
+
+QString SnapmaticPicture::getSnapmaticPictureString(QByteArray snapmaticHeader)
+{
+    QByteArray snapmaticUsefulBytes = snapmaticHeader.left(snapmaticUsefulLength);
+    snapmaticUsefulBytes.replace(QByteArray::fromHex("00"),"");
+    snapmaticUsefulBytes.replace(QByteArray::fromHex("01"),"");
+    return QString::fromAscii(snapmaticUsefulBytes);
+}
+
+bool SnapmaticPicture::readingPictureFromFile(QString fileName)
+{
+    if (fileName != "")
+    {
+        picFileName = fileName;
+        return readingPicture();
+    }
+    else
+    {
+        return false;
+    }
+}
+
+void SnapmaticPicture::setPixmap(QPixmap pixmap)
+{
+    cachePicture = pixmap;
+}
+
+QString SnapmaticPicture::getPictureStr()
+{
+    return pictureStr;
+}
+
+QString SnapmaticPicture::getLastStep()
+{
+    return lastStep;
+}
+
+QPixmap SnapmaticPicture::getPixmap()
+{
+    return cachePicture;
+}
+
+QString SnapmaticPicture::convertDrawStringForLog(QString inputStr)
+{
+    return inputStr.replace("&","&u;").replace(",","&c;");
+}
+
+QString SnapmaticPicture::convertLogStringForDraw(QString inputStr)
+{
+    return inputStr.replace("&c;",",").replace("&u;","&");
 }
diff --git a/SnapmaticPicture.h b/SnapmaticPicture.h
index 7bb0428..538c789 100755
--- a/SnapmaticPicture.h
+++ b/SnapmaticPicture.h
@@ -20,20 +20,30 @@
 
 #include <QObject>
 #include <QPixmap>
+#include <QString>
+#include <QFile>
 
 class SnapmaticPicture : public QObject
 {
     Q_OBJECT
 public:
-    explicit SnapmaticPicture(QObject *parent = 0);
+    explicit SnapmaticPicture(QObject *parent = 0, QString fileName = "");
     bool readingPictureFromFile(QString fileName);
-    bool setPicture(QPixmap pixmap);
+    bool readingPicture();
+    void setPixmap(QPixmap pixmap);
+    void resetValues();
     QPixmap getPixmap();
+    QString getLastStep();
+    QString getPictureStr();
 
 private:
+    QString getSnapmaticPictureString(QByteArray snapmaticHeader);
+    QString convertDrawStringForLog(QString inputStr);
+    QString convertLogStringForDraw(QString inputStr);
     QPixmap cachePicture;
-    QString picDate;
-    QString picTime;
+    QString picFileName;
+    QString pictureStr;
+    QString lastStep;
     QString jsonStr;
 
 signals:
diff --git a/main.cpp b/main.cpp
index 8f0f55f..adb5559 100755
--- a/main.cpp
+++ b/main.cpp
@@ -15,15 +15,46 @@
 * limitations under the License.
 *****************************************************************************/
 
-#include "frmGTA5Sync.h"
+#include "SnapmaticPicture.h"
+#include "PictureDialog.h"
 #include <QApplication>
+#include <QStringList>
+#include <QString>
+#include <QDebug>
 
 int main(int argc, char *argv[])
 {
     QApplication a(argc, argv);
 
-    frmGTA5Sync w;
-    w.show();
+    QStringList applicationArgs = a.arguments();
+    QString selectedAction;
+    QString arg1;
+
+    foreach(QString currentArg, applicationArgs)
+    {
+        QString reworkedArg;
+        if (currentArg.left(9) == "-showpic=" && selectedAction == "")
+        {
+            reworkedArg = currentArg.remove(0,9);
+            arg1 = reworkedArg;
+            selectedAction = "showpic";
+        }
+    }
+
+    if (selectedAction == "showpic")
+    {
+        SnapmaticPicture picture;
+        qDebug() << picture.readingPictureFromFile(arg1);
+        qDebug() << picture.getLastStep();
+        PictureDialog picDialog;
+        picDialog.setWindowTitle(picture.getPictureStr());
+        picDialog.setSnapmaticPicture(picture.getPixmap());
+        picDialog.show();
+
+        return a.exec();
+
+        qDebug() << "showpic runned";
+    }
 
     return a.exec();
 }