diff --git a/src/cmaevent.cpp b/src/cmaevent.cpp
index add1f2d..8ea2f7b 100644
--- a/src/cmaevent.cpp
+++ b/src/cmaevent.cpp
@@ -212,7 +212,7 @@ quint16 CmaEvent::processAllObjects(CMAObject *parent, quint32 handle)
root_obj = root_obj->parent;
}
- fileType = Database::checkFileType(dir.absoluteFilePath(name), root_obj->metadata.ohfi);
+ fileType = checkFileType(dir.absoluteFilePath(name), root_obj->metadata.ohfi);
}
}
diff --git a/src/cmaobject.cpp b/src/cmaobject.cpp
index 9236c55..c6fc284 100644
--- a/src/cmaobject.cpp
+++ b/src/cmaobject.cpp
@@ -29,24 +29,6 @@
int CMAObject::ohfi_count = OHFI_OFFSET;
-const CMAObject::file_type CMAObject::audio_list[] = {
- {"mp3", FILE_FORMAT_MP3, CODEC_TYPE_MP3},
- {"mp4", FILE_FORMAT_MP4, CODEC_TYPE_AAC},
- {"wav", FILE_FORMAT_WAV, CODEC_TYPE_PCM}
-};
-
-const CMAObject::file_type CMAObject::photo_list[] = {
- {"jpg", FILE_FORMAT_JPG, CODEC_TYPE_JPG},
- {"jpeg", FILE_FORMAT_JPG, CODEC_TYPE_JPG},
- {"png", FILE_FORMAT_PNG, CODEC_TYPE_PNG},
- {"tif", FILE_FORMAT_TIF, CODEC_TYPE_TIF},
- {"tiff", FILE_FORMAT_TIF, CODEC_TYPE_TIF},
- {"bmp", FILE_FORMAT_BMP, CODEC_TYPE_BMP},
- {"gif", FILE_FORMAT_GIF, CODEC_TYPE_GIF},
-};
-
-const char *CMAObject::video_list[] = {"mp4"};
-
CMAObject::CMAObject(CMAObject *obj_parent) :
parent(obj_parent), metadata()
{
diff --git a/src/cmaobject.h b/src/cmaobject.h
index eb49b8c..e5c0953 100644
--- a/src/cmaobject.h
+++ b/src/cmaobject.h
@@ -27,26 +27,6 @@
#define OHFI_OFFSET 256
-#define FILE_FORMAT_MP4 1
-#define FILE_FORMAT_WAV 2
-#define FILE_FORMAT_MP3 3
-#define FILE_FORMAT_JPG 4
-#define FILE_FORMAT_PNG 5
-#define FILE_FORMAT_GIF 6
-#define FILE_FORMAT_BMP 7
-#define FILE_FORMAT_TIF 8
-
-#define CODEC_TYPE_MPEG4 2
-#define CODEC_TYPE_AVC 3
-#define CODEC_TYPE_MP3 12
-#define CODEC_TYPE_AAC 13
-#define CODEC_TYPE_PCM 15
-#define CODEC_TYPE_JPG 17
-#define CODEC_TYPE_PNG 18
-#define CODEC_TYPE_TIF 19
-#define CODEC_TYPE_BMP 20
-#define CODEC_TYPE_GIF 21
-
class CMAObject
{
public:
@@ -72,16 +52,6 @@ public:
ohfi_count = OHFI_OFFSET;
}
- typedef struct {
- const char *file_ext;
- int file_format;
- int file_codec;
- } file_type;
-
- static const file_type audio_list[3];
- static const file_type photo_list[7];
- static const char *video_list[1];
-
QString path;
CMAObject *parent;
metadata_t metadata;
diff --git a/src/database.cpp b/src/database.cpp
index 448a3dd..a7a95c2 100644
--- a/src/database.cpp
+++ b/src/database.cpp
@@ -17,6 +17,7 @@
* along with this program. If not, see .
*/
+#include "utils.h"
#include "database.h"
#include "cmaobject.h"
@@ -477,33 +478,3 @@ int Database::filterObjects(int ohfiParent, metadata_t **p_head, int index, int
return numObjects;
}
-
-int Database::checkFileType(const QString path, int ohfi_root)
-{
- switch(ohfi_root) {
- case VITA_OHFI_MUSIC:
- for(int i = 0, max = sizeof(CMAObject::audio_list) / sizeof(CMAObject::file_type); i < max; i++) {
- if(path.endsWith(CMAObject::audio_list[i].file_ext, Qt::CaseInsensitive)) {
- return i;
- }
- }
- break;
- case VITA_OHFI_PHOTO:
- for(int i = 0, max = sizeof(CMAObject::photo_list) / sizeof(CMAObject::file_type); i < max; i++) {
- if(path.endsWith(CMAObject::photo_list[i].file_ext, Qt::CaseInsensitive)) {
- return i;
- }
- }
- break;
- case VITA_OHFI_VIDEO:
- for(int i = 0, max = sizeof(CMAObject::video_list) / sizeof(const char *); i < max; i++) {
- if(path.endsWith(CMAObject::video_list[i], Qt::CaseInsensitive)) {
- return i;
- }
- }
- break;
- default:
- return 0;
- }
- return -1;
-}
diff --git a/src/database.h b/src/database.h
index 0f5a184..a2effc2 100644
--- a/src/database.h
+++ b/src/database.h
@@ -53,8 +53,6 @@ public:
CMAObject *pathToObject(const char *path, int ohfiRoot);
int acceptFilteredObject(const CMAObject *parent, const CMAObject *current, int type);
- static int checkFileType(const QString path, int ohfi_root);
-
QMutex mutex;
private:
diff --git a/src/sqlitedb.cpp b/src/sqlitedb.cpp
index c832e75..d6f1742 100644
--- a/src/sqlitedb.cpp
+++ b/src/sqlitedb.cpp
@@ -1,3 +1,4 @@
+#include "utils.h"
#include "sqlitedb.h"
#include "sforeader.h"
#include "avdecoder.h"
@@ -50,6 +51,11 @@ static const char create_music[] = "CREATE TABLE IF NOT EXISTS music ("
"album TEXT,"
"track_number INTEGER)";
+static const char create_apps[] = "CREATE TABLE IF NOT EXISTS application ("
+ "object_id INTEGER PRIMARY KEY REFERENCES object_node(object_id) ON DELETE CASCADE,"
+ "title TEXT NOT NULL CHECK (LENGTH(title) > 0),"
+ "app_type INTEGER)";
+
static const char create_photos[] = "CREATE TABLE IF NOT EXISTS photos ("
"object_id INTEGER PRIMARY KEY REFERENCES object_node(object_id) ON DELETE CASCADE,"
"date_created TIMESTAMP,"
@@ -80,75 +86,28 @@ static const char create_savedata[] = "CREATE TABLE IF NOT EXISTS savedata ("
"date_updated TIMESTAMP)";
static const char create_trigger_node[] = "CREATE TRIGGER IF NOT EXISTS trg_objnode_deletechilds BEFORE DELETE ON object_node "
- "FOR EACH ROW BEGIN "
- "DELETE FROM object_node WHERE object_id IN "
- "(SELECT child_id FROM adjacent_objects WHERE parent_id == OLD.object_id);"
- "END";
+ "FOR EACH ROW BEGIN "
+ "DELETE FROM object_node WHERE object_id IN "
+ "(SELECT child_id FROM adjacent_objects WHERE parent_id == OLD.object_id);"
+ "END";
static const char create_trigger_adjins[] = "CREATE TRIGGER IF NOT EXISTS trg_adjacentobjects_ins AFTER INSERT ON adjacent_objects "
- "FOR EACH ROW BEGIN "
- "UPDATE object_node SET child_count = child_count + 1 WHERE object_id = NEW.parent_id;"
- "UPDATE object_node SET reference_count = reference_count + 1 WHERE object_id = NEW.child_id;"
- "END";
+ "FOR EACH ROW BEGIN "
+ "UPDATE object_node SET child_count = child_count + 1 WHERE object_id = NEW.parent_id;"
+ "UPDATE object_node SET reference_count = reference_count + 1 WHERE object_id = NEW.child_id;"
+ "END";
static const char create_trigger_adjdel[] = "CREATE TRIGGER IF NOT EXISTS trg_adjacentobjects_del AFTER DELETE ON adjacent_objects "
- "FOR EACH ROW BEGIN "
- "UPDATE object_node SET child_count = child_count - 1 WHERE object_id = OLD.parent_id;"
- "UPDATE object_node SET reference_count = reference_count - 1 WHERE object_id = OLD.child_id;"
- "DELETE FROM object_node WHERE object_id = OLD.parent_id AND child_count <= 0;"
- "DELETE FROM object_node WHERE object_id = OLD.child_id AND reference_count <= 0;"
- "END";
-
-typedef struct {
- const char *file_ext;
- int file_format;
- int file_codec;
-} file_type;
-
-#define FILE_FORMAT_MP4 1
-#define FILE_FORMAT_WAV 2
-#define FILE_FORMAT_MP3 3
-#define FILE_FORMAT_JPG 4
-#define FILE_FORMAT_PNG 5
-#define FILE_FORMAT_GIF 6
-#define FILE_FORMAT_BMP 7
-#define FILE_FORMAT_TIF 8
-
-#define CODEC_TYPE_MPEG4 2
-#define CODEC_TYPE_AVC 3
-#define CODEC_TYPE_MP3 12
-#define CODEC_TYPE_AAC 13
-#define CODEC_TYPE_PCM 15
-#define CODEC_TYPE_JPG 17
-#define CODEC_TYPE_PNG 18
-#define CODEC_TYPE_TIF 19
-#define CODEC_TYPE_BMP 20
-#define CODEC_TYPE_GIF 21
-
-static const file_type audio_list[] = {
- {"mp3", FILE_FORMAT_MP3, CODEC_TYPE_MP3},
- {"mp4", FILE_FORMAT_MP4, CODEC_TYPE_AAC},
- {"wav", FILE_FORMAT_WAV, CODEC_TYPE_PCM}
-};
-
-static const file_type photo_list[] = {
- {"jpg", FILE_FORMAT_JPG, CODEC_TYPE_JPG},
- {"jpeg", FILE_FORMAT_JPG, CODEC_TYPE_JPG},
- {"png", FILE_FORMAT_PNG, CODEC_TYPE_PNG},
- {"tif", FILE_FORMAT_TIF, CODEC_TYPE_TIF},
- {"tiff", FILE_FORMAT_TIF, CODEC_TYPE_TIF},
- {"bmp", FILE_FORMAT_BMP, CODEC_TYPE_BMP},
- {"gif", FILE_FORMAT_GIF, CODEC_TYPE_GIF},
-};
-
-static const file_type video_list[] = {
- {"mp4", FILE_FORMAT_MP4, 0}
-};
-
+ "FOR EACH ROW BEGIN "
+ "UPDATE object_node SET child_count = child_count - 1 WHERE object_id = OLD.parent_id;"
+ "UPDATE object_node SET reference_count = reference_count - 1 WHERE object_id = OLD.child_id;"
+ "DELETE FROM object_node WHERE object_id = OLD.parent_id AND child_count <= 0;"
+ "DELETE FROM object_node WHERE object_id = OLD.child_id AND reference_count <= 0;"
+ "END";
static const char *table_list[] = {
create_adjacent, create_obj_node, create_sources,
- create_music, create_photos, create_videos, create_savedata
+ create_music, create_photos, create_videos, create_savedata, create_apps
};
static const char *trigger_list[] = {
@@ -219,34 +178,6 @@ QSqlError SQLiteDB::getLastError()
return db.lastError();
}
-int SQLiteDB::checkFileType(const QString path, int ohfi_root)
-{
- switch(ohfi_root) {
- case VITA_OHFI_MUSIC:
- for(int i = 0, max = sizeof(audio_list) / sizeof(file_type); i < max; i++) {
- if(path.endsWith(audio_list[i].file_ext, Qt::CaseInsensitive)) {
- return i;
- }
- }
- break;
- case VITA_OHFI_PHOTO:
- for(int i = 0, max = sizeof(photo_list) / sizeof(file_type); i< max; i++) {
- if(path.endsWith(photo_list[i].file_ext, Qt::CaseInsensitive)) {
- return i;
- }
- }
- break;
- case VITA_OHFI_VIDEO:
- for(int i = 0, max = sizeof(video_list) / sizeof(file_type); i< max; i++) {
- if(path.endsWith(video_list[i].file_ext, Qt::CaseInsensitive)) {
- return i;
- }
- }
- break;
- }
- return -1;
-}
-
int SQLiteDB::create()
{
int total_objects = 0;
@@ -271,31 +202,26 @@ int SQLiteDB::create()
base_path = settings.value("photoPath").toString();
break;
case VITA_OHFI_BACKUP:
- continue;
base_path = settings.value("appsPath").toString() + QDir::separator() + "SYSTEM" + QDir::separator() + uuid;
break;
case VITA_OHFI_VITAAPP:
- continue;
base_path = settings.value("appsPath").toString() + QDir::separator() + "APP" + QDir::separator() + uuid;
break;
case VITA_OHFI_PSPAPP:
- continue;
base_path = settings.value("appsPath").toString() + QDir::separator() + "PGAME" + QDir::separator() + uuid;
break;
case VITA_OHFI_PSPSAVE:
base_path = settings.value("appsPath").toString() + QDir::separator() + "PSAVEDATA" + QDir::separator() + uuid;
break;
case VITA_OHFI_PSXAPP:
- continue;
base_path = settings.value("appsPath").toString() + QDir::separator() + "PSGAME" + QDir::separator() + uuid;
break;
case VITA_OHFI_PSMAPP:
- continue;
base_path = settings.value("appsPath").toString() + QDir::separator() + "PSM" + QDir::separator() + uuid;
break;
}
- int dir_count = recursiveScanRootDirectory(base_path, ohfi_array[i], OBJECT_FOLDER);
+ int dir_count = recursiveScanRootDirectory(base_path, ohfi_array[i], ohfi_array[i]);
if(dir_count < 0) {
return -1;
@@ -314,7 +240,7 @@ int SQLiteDB::recursiveScanRootDirectory(const QString &base_path, int parent, i
QFileInfoList qsl = dir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot);
foreach(const QFileInfo &info, qsl) {
- qDebug() << "Processing " << info.fileName();
+ //qDebug() << "Processing " << info.fileName();
if(info.isDir()) {
int ohfi = insertDirectoryEntry(info.absoluteFilePath(), parent_type, parent);
total_objects += recursiveScanRootDirectory(info.absoluteFilePath(), ohfi, parent_type);
@@ -332,6 +258,12 @@ int SQLiteDB::recursiveScanRootDirectory(const QString &base_path, int parent, i
case VITA_OHFI_PSPSAVE:
insertSavedataEntry(info.absoluteFilePath(), OBJECT_SAVEDATA | (parent_type & ~OBJECT_FOLDER), parent);
break;
+ case VITA_OHFI_VITAAPP:
+ case VITA_OHFI_PSPAPP:
+ case VITA_OHFI_PSXAPP:
+ case VITA_OHFI_PSMAPP:
+ case VITA_OHFI_BACKUP:
+ insertApplicationEntry(info.absoluteFilePath(), OBJECT_APPLICATION | (parent_type & ~OBJECT_FOLDER), parent, parent_type);
}
total_objects++;
@@ -434,19 +366,19 @@ uint SQLiteDB::insertObjectEntry(const char *title, int type)
{
QSqlQuery query;
- query.prepare("SELECT object_id FROM object_node WHERE type == :type and title == :title");
+ //query.prepare("SELECT object_id FROM object_node WHERE type == :type and title == :title");
+ //query.bindValue(0, type);
+ //query.bindValue(1, title);
+
+ //if(!query.exec() || !query.next()) {
+ query.prepare("INSERT INTO object_node (type, title) VALUES (:type, :title)");
query.bindValue(0, type);
- query.bindValue(1, title);
+ query.bindValue(1, title);
- if(!query.exec() || !query.next()) {
- query.prepare("INSERT INTO object_node (type, title) VALUES (:type, :title)");
- query.bindValue(0, type);
- query.bindValue(1, title);
-
- if(!query.exec() || !query.exec("SELECT last_insert_rowid()") || !query.next()) {
- return 0;
- }
+ if(!query.exec() || !query.exec("SELECT last_insert_rowid()") || !query.next()) {
+ return 0;
}
+ //}
return query.value(0).toInt();
}
@@ -481,7 +413,7 @@ uint SQLiteDB::insertMusicEntry(const QString &path, int type, int parent)
const char *artist, *album, *albumartist, *genre, *track, *title;
int file_format, audio_codec, audio_bitrate, genre_id, artist_id, track_id, album_id, track_number;
- int file_type = checkFileType(path, type);
+ int file_type = checkFileType(path, VITA_OHFI_MUSIC);
if(file_type < 0) {
qDebug() << "Excluding from database:" << path;
return 0;
@@ -497,12 +429,18 @@ uint SQLiteDB::insertMusicEntry(const QString &path, int type, int parent)
albumartist = decoder.getMetadataEntry("album_artist");
track = decoder.getMetadataEntry("track");
- track_number = QString(track).toInt(&ok);
+ track_number = QString(track).split("/")[0].toInt(&ok);
if(!ok) {
// set track number to 1 by default
track_number = 1;
}
- audio_bitrate = decoder.getBitrate();
+
+ if(decoder.loadCodec(AVDecoder::CODEC_AUDIO)) {
+ audio_bitrate = decoder.getBitrate();
+ } else {
+ audio_bitrate = 0;
+ }
+
duration = decoder.getDuration();
file_format = audio_list[file_type].file_format;
@@ -579,8 +517,8 @@ uint SQLiteDB::insertMusicEntry(const QString &path, int type, int parent)
QSqlQuery query;
query.prepare("REPLACE INTO music"
- "(object_id, file_format, audio_codec, audio_bitrate, duration, genre_id, artist_id, album_id, track_id, artist, album, track_number)"
- "VALUES (:object_id, :file_format, :audio_codec, :audio_bitrate, :duration, :genre_id, :artist_id, :album_id, :track_id, :artist, :album, :track_number)");
+ "(object_id, file_format, audio_codec, audio_bitrate, duration, genre_id, artist_id, album_id, track_id, artist, album, track_number)"
+ "VALUES (:object_id, :file_format, :audio_codec, :audio_bitrate, :duration, :genre_id, :artist_id, :album_id, :track_id, :artist, :album, :track_number)");
query.bindValue(0, ohfi);
query.bindValue(1, file_format);
@@ -616,7 +554,7 @@ uint SQLiteDB::insertVideoEntry(const QString &path, int type, int parent)
return 0;
}
- int file_type = checkFileType(path, type);
+ int file_type = checkFileType(path, VITA_OHFI_VIDEO);
if(file_type < 0) {
qDebug() << "Excluding from database:" << path;
return 0;
@@ -628,13 +566,13 @@ uint SQLiteDB::insertVideoEntry(const QString &path, int type, int parent)
width = decoder.getWidth();
height = decoder.getHeight();
duration = decoder.getDuration();
- video_codec = 3;
- video_bitrate = decoder.getCodecBitrate();
+ video_codec = CODEC_TYPE_AVC;
+ video_bitrate = decoder.getBitrate();
file_format = video_list[file_type].file_format;
if(decoder.loadCodec(AVDecoder::CODEC_AUDIO)) {
- audio_codec = 13;
- audio_bitrate = decoder.getCodecBitrate();
+ audio_codec = CODEC_TYPE_AAC;
+ audio_bitrate = decoder.getBitrate();
} else {
audio_codec = 0;
audio_bitrate = 0;
@@ -663,8 +601,8 @@ uint SQLiteDB::insertVideoEntry(const QString &path, int type, int parent)
QSqlQuery query;
query.prepare("REPLACE INTO videos"
- "(object_id, file_format, parental_level, explanation, copyright, width, height, video_codec, video_bitrate, audio_codec, audio_bitrate, duration)"
- "VALUES (:object_id, :file_format, :parental_level, :explanation, :copyright, :width, :height, :video_codec, :video_bitrate, :audio_codec, :audio_bitrate, :duration)");
+ "(object_id, file_format, parental_level, explanation, copyright, width, height, video_codec, video_bitrate, audio_codec, audio_bitrate, duration)"
+ "VALUES (:object_id, :file_format, :parental_level, :explanation, :copyright, :width, :height, :video_codec, :video_bitrate, :audio_codec, :audio_bitrate, :duration)");
query.bindValue(0, ohfi);
query.bindValue(1, file_format);
@@ -696,7 +634,7 @@ uint SQLiteDB::insertPhotoEntry(const QString &path, int type, int parent)
uint date_created;
int width, height, file_format, photo_codec;
- int file_type = checkFileType(path, type);
+ int file_type = checkFileType(path, VITA_OHFI_PHOTO);
if(file_type < 0) {
qDebug() << "Excluding from database:" << path;
return 0;
@@ -733,8 +671,8 @@ uint SQLiteDB::insertPhotoEntry(const QString &path, int type, int parent)
QSqlQuery query;
query.prepare("REPLACE INTO photos"
- "(object_id, date_created, file_format, photo_codec, width, height)"
- "VALUES (:object_id, :date_created, :file_format, :photo_codec, :width, :height)");
+ "(object_id, date_created, file_format, photo_codec, width, height)"
+ "VALUES (:object_id, :date_created, :file_format, :photo_codec, :width, :height)");
query.bindValue(0, ohfi);
query.bindValue(1, date_created);
@@ -755,25 +693,24 @@ uint SQLiteDB::insertPhotoEntry(const QString &path, int type, int parent)
uint SQLiteDB::insertSavedataEntry(const QString &path, int type, int parent)
{
int ohfi;
-
- uint date_updated;
- const char *title, *savedata_detail, *savedata_directory;
-
SfoReader reader;
- QString base_name = QFileInfo(path).baseName();
- QString sfo_file = QDir(path).absoluteFilePath("PARAM.SFO");
+ uint date_updated = 0;
+ const char *title = NULL;
+ const char *savedata_detail = NULL;
+ const char *savedata_directory = NULL;
- if(!reader.load(sfo_file)) {
- return 0;
- }
-
- title = reader.value("TITLE", base_name.toUtf8().constData());
- savedata_detail = reader.value("SAVEDATA_DETAIL", "");
- savedata_directory = reader.value("SAVEDATA_DIRECTORY", base_name.toUtf8().constData());
- date_updated = QFileInfo(sfo_file).lastModified().toTime_t();
+ QString file_name = QFileInfo(path).fileName();
+ QByteArray utf8name = file_name.toUtf8();
db.transaction();
+ if(file_name.endsWith(".sfo", Qt::CaseInsensitive) && reader.load(path)) {
+ title = reader.value("TITLE", utf8name.constData());
+ savedata_detail = reader.value("SAVEDATA_DETAIL", "");
+ savedata_directory = reader.value("SAVEDATA_DIRECTORY", utf8name.constData());
+ date_updated = QFileInfo(path).lastModified().toTime_t();
+ }
+
if((ohfi = insertObjectEntry(title, type)) == 0) {
db.rollback();
return 0;
@@ -789,10 +726,18 @@ uint SQLiteDB::insertSavedataEntry(const QString &path, int type, int parent)
return 0;
}
+ if(!path.endsWith(".sfo", Qt::CaseInsensitive)) {
+ return 0;
+ }
+
+ if(!title) {
+ return 0;
+ }
+
QSqlQuery query;
query.prepare("REPLACE INTO savedata"
- "(object_id, detail, dir_name, title, date_updated)"
- "VALUES (:object_id, :detail, :dir_name, :title, :updated)");
+ "(object_id, detail, dir_name, title, date_updated)"
+ "VALUES (:object_id, :detail, :dir_name, :title, :updated)");
query.bindValue(0, ohfi);
query.bindValue(1, savedata_detail);
@@ -808,3 +753,45 @@ uint SQLiteDB::insertSavedataEntry(const QString &path, int type, int parent)
db.commit();
return ohfi;
}
+
+
+uint SQLiteDB::insertApplicationEntry(const QString &path, int type, int parent, int app_type)
+{
+ int ohfi;
+
+ QString base_name = QFileInfo(path).baseName();
+
+ db.transaction();
+
+ if((ohfi = insertObjectEntry(base_name.toUtf8().constData(), type)) == 0) {
+ db.rollback();
+ return 0;
+ }
+
+ if(parent && !updateAdjacencyList(ohfi, parent)) {
+ db.rollback();
+ return 0;
+ }
+
+ if(!insertSourceEntry(ohfi, path)) {
+ db.rollback();
+ return 0;
+ }
+
+ QSqlQuery query;
+ query.prepare("REPLACE INTO application"
+ "(object_id, title, app_type)"
+ "VALUES (:object_id, :title, :app_type)");
+
+ query.bindValue(0, ohfi);
+ query.bindValue(1, base_name);
+ query.bindValue(2, app_type);
+
+ if(!query.exec()) {
+ db.rollback();
+ return 0;
+ }
+
+ db.commit();
+ return ohfi;
+}
diff --git a/src/sqlitedb.h b/src/sqlitedb.h
index 52dd144..e2a42d6 100644
--- a/src/sqlitedb.h
+++ b/src/sqlitedb.h
@@ -23,6 +23,8 @@
#define OBJECT_SAVEDATA 0x00040000
#define OBJECT_SAVEDATA_FILE 0x00000002
+#define OBJECT_APPLICATION 0x00080000
+
class SQLiteDB : public QObject
{
Q_OBJECT
@@ -47,11 +49,11 @@ public:
uint insertVideoEntry(const QString &path, int type, int parent);
uint insertPhotoEntry(const QString &path, int type, int parent);
uint insertSavedataEntry(const QString &path, int type, int parent);
+ uint insertApplicationEntry(const QString &path, int type, int parent, int app_type);
-private:
+private:
int recursiveScanRootDirectory(const QString &base_path, int parent, int type);
uint insertDirectoryEntry(const QString &path, int type, int parent);
- int checkFileType(const QString path, int ohfi_root);
bool updateAdjacencyList(int ohfi, int parent);
QString uuid;
diff --git a/src/utils.cpp b/src/utils.cpp
index 22059f0..07e814d 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -31,6 +31,26 @@
#include
#endif
+const file_type audio_list[] = {
+ {"mp3", FILE_FORMAT_MP3, CODEC_TYPE_MP3},
+ {"mp4", FILE_FORMAT_MP4, CODEC_TYPE_AAC},
+ {"wav", FILE_FORMAT_WAV, CODEC_TYPE_PCM}
+};
+
+const file_type photo_list[] = {
+ {"jpg", FILE_FORMAT_JPG, CODEC_TYPE_JPG},
+ {"jpeg", FILE_FORMAT_JPG, CODEC_TYPE_JPG},
+ {"png", FILE_FORMAT_PNG, CODEC_TYPE_PNG},
+ {"tif", FILE_FORMAT_TIF, CODEC_TYPE_TIF},
+ {"tiff", FILE_FORMAT_TIF, CODEC_TYPE_TIF},
+ {"bmp", FILE_FORMAT_BMP, CODEC_TYPE_BMP},
+ {"gif", FILE_FORMAT_GIF, CODEC_TYPE_GIF},
+};
+
+const file_type video_list[] = {
+ {"mp4", FILE_FORMAT_MP4, 0}
+};
+
bool getDiskSpace(const QString &dir, quint64 *free, quint64 *total)
{
#ifdef Q_OS_WIN32
@@ -175,3 +195,33 @@ QString readable_size(quint64 size, bool use_gib)
}
return QString().setNum(size_f,'f',2) + " " + unit;
}
+
+int checkFileType(const QString path, int ohfi_root)
+{
+ switch(ohfi_root) {
+ case VITA_OHFI_MUSIC:
+ for(int i = 0, max = sizeof(audio_list) / sizeof(file_type); i < max; i++) {
+ if(path.endsWith(audio_list[i].file_ext, Qt::CaseInsensitive)) {
+ return i;
+ }
+ }
+ break;
+ case VITA_OHFI_PHOTO:
+ for(int i = 0, max = sizeof(photo_list) / sizeof(file_type); i< max; i++) {
+ if(path.endsWith(photo_list[i].file_ext, Qt::CaseInsensitive)) {
+ return i;
+ }
+ }
+ break;
+ case VITA_OHFI_VIDEO:
+ for(int i = 0, max = sizeof(video_list) / sizeof(file_type); i< max; i++) {
+ if(path.endsWith(video_list[i].file_ext, Qt::CaseInsensitive)) {
+ return i;
+ }
+ }
+ break;
+ default:
+ return 0;
+ }
+ return -1;
+}
diff --git a/src/utils.h b/src/utils.h
index 8d8deba..816a34f 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -26,6 +26,36 @@
#include
+typedef struct {
+ const char *file_ext;
+ int file_format;
+ int file_codec;
+} file_type;
+
+#define FILE_FORMAT_MP4 1
+#define FILE_FORMAT_WAV 2
+#define FILE_FORMAT_MP3 3
+#define FILE_FORMAT_JPG 4
+#define FILE_FORMAT_PNG 5
+#define FILE_FORMAT_GIF 6
+#define FILE_FORMAT_BMP 7
+#define FILE_FORMAT_TIF 8
+
+#define CODEC_TYPE_MPEG4 2
+#define CODEC_TYPE_AVC 3
+#define CODEC_TYPE_MP3 12
+#define CODEC_TYPE_AAC 13
+#define CODEC_TYPE_PCM 15
+#define CODEC_TYPE_JPG 17
+#define CODEC_TYPE_PNG 18
+#define CODEC_TYPE_TIF 19
+#define CODEC_TYPE_BMP 20
+#define CODEC_TYPE_GIF 21
+
+extern const file_type audio_list[3];
+extern const file_type photo_list[7];
+extern const file_type video_list[1];
+
// Qt4 doesn't have public methods for Thread::*sleep
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
typedef QThread Sleeper;
@@ -49,5 +79,6 @@ bool removeRecursively(const QString &dirName);
QString readable_size(quint64 size, bool use_gib = false);
bool getDiskSpace(const QString &dir, quint64 *free, quint64 *total);
QByteArray getThumbnail(const QString &path, DataType type, metadata_t *metadata);
+int checkFileType(const QString path, int ohfi_root);
#endif // UTILS_H