New qcma headless app.

Updated changelog.
Bumped version to 0.3.0.
This commit is contained in:
codestation
2014-03-28 10:07:13 -04:30
parent 6ed8dd749e
commit 80f19e5d23
27 changed files with 712 additions and 200 deletions

View File

@@ -1,3 +1,14 @@
qcma (0.3.0) unstable; urgency=low
* Set the default video codec to h264 is metadata skip is enabled.
* Delay the progress dialog by one second so it doesn't show on quick scans.
* Do not show the disconnect message if no connection is established.
* Show correct directory separators on Windows.
* Show if savedata, updates or dlc are present on backup manager.
* New database backend. Disabled for now.
-- codestation <codestation404@gmail.com> Thu, 28 Mar 2014 00:00:00 -0000
qcma (0.2.8) unstable; urgency=low
* Fixed bug where USB transfers couldn't be cancelled.

181
qcma.pro
View File

@@ -1,176 +1,13 @@
#-------------------------------------------------
#
# Project created by QtCreator 2013-07-23T15:34:17
#
#-------------------------------------------------
-#-------------------------------------------------
-#
-# Project created by QtCreator 2013-07-23T15:34:17
-#
-#-------------------------------------------------
QT += core \
gui \
widgets \
network \
sql
TEMPLATE = subdirs
SUBDIRS = qcma_gui.pro
TARGET = qcma
VERSION = 0.2.9
TEMPLATE = app
SOURCES += src/main.cpp \
src/capability.cpp \
src/cmaobject.cpp \
src/cmarootobject.cpp \
src/cmautils.cpp \
src/mainwidget.cpp \
src/singleapplication.cpp \
src/sforeader.cpp \
src/cmaclient.cpp \
src/cmabroadcast.cpp \
src/avdecoder.cpp \
src/cmaevent.cpp \
src/clientmanager.cpp \
src/filterlineedit.cpp \
src/dds.cpp \
src/sqlitedb.cpp \
src/httpdownloader.cpp \
src/qlistdb.cpp \
src/database.cpp \
# forms
src/forms/backupitem.cpp \
src/forms/backupmanagerform.cpp \
src/forms/configwidget.cpp \
src/forms/confirmdialog.cpp \
src/forms/pinform.cpp \
src/forms/progressform.cpp
HEADERS += \
src/capability.h \
src/cmaobject.h \
src/cmarootobject.h \
src/cmautils.h \
src/mainwidget.h \
src/singleapplication.h \
src/sforeader.h \
src/cmaclient.h \
src/cmabroadcast.h \
src/avdecoder.h \
src/cmaevent.h \
src/clientmanager.h \
src/filterlineedit.h \
src/dds.h \
src/sqlitedb.h \
src/httpdownloader.h \
src/qlistdb.h \
src/database.h \
# forms
src/forms/backupitem.h \
src/forms/backupmanagerform.h \
src/forms/configwidget.h \
src/forms/confirmdialog.h \
src/forms/pinform.h \
src/forms/progressform.h
FORMS += \
src/forms/configwidget.ui \
src/forms/backupmanagerform.ui \
src/forms/backupitem.ui \
src/forms/confirmdialog.ui \
src/forms/progressform.ui \
src/forms/pinform.ui
TRANSLATIONS += \
resources/translations/qcma_es.ts \
resources/translations/qcma_ja.ts
OTHER_FILES += \
resources/xml/psp2-updatelist.xml \
resources/images/psv_icon.png \
resources/images/psv_icon_16.png \
resources/images/qcma.png \
resources/qcma.desktop \
qcma.rc
INCLUDEPATH += src/
RESOURCES += qcmares.qrc translations.qrc
# find packages using pkg-config
CONFIG += link_pkgconfig
PKGCONFIG += libvitamtp libavformat libavcodec libavutil libswscale
# custom CXXFLAGS
QMAKE_CXXFLAGS += -Wno-write-strings -Wall -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS
#Linux-only config
# Compile the headless binary only on Linux because it depends on dbus
unix:!macx {
# largefile support
DEFINES += _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE
# installation prefix
isEmpty(PREFIX) {
PREFIX = /usr/local
}
BINDIR = $$PREFIX/bin
DATADIR = $$PREFIX/share
# config for desktop file and icon
desktop.path = $$DATADIR/applications/$${TARGET}
desktop.files += resources/$${TARGET}.desktop
icon64.path = $$DATADIR/icons/hicolor/64x64/apps
icon64.files += resources/images/$${TARGET}.png
target.path = $$BINDIR
INSTALLS += target desktop icon64
# KDE support
ENABLE_KDE {
greaterThan(QT_MAJOR_VERSION, 4) {
error("ENABLE_KDE can only be used with Qt4")
}
LIBS += -lkdeui
DEFINES += ENABLE_KDE_NOTIFIER=1
SOURCES += src/kdenotifier.cpp
HEADERS += src/kdenotifier.h
}
}
# Windows config
win32 {
# Windows icon
RC_FILE = qcma.rc
# avoid alignment issues with newer mingw compiler
QMAKE_CXXFLAGS += -mno-ms-bitfields
}
# OS X config
macx {
# OS X icon
ICON = resources/images/$${TARGET}.icns
# re-enable pkg-config on OS X (brew installs pkg-config files)
QT_CONFIG -= no-pkg-config
}
# try to get the current git version + hash
QCMA_GIT_VERSION=$$system(git describe --tags)
#use the generic version if the above command fails (no git executable or metadata)
isEmpty(QCMA_GIT_VERSION) {
DEFINES += QCMA_VER=\\\"$$VERSION\\\"
} else {
DEFINES += QCMA_VER=\\\"$$QCMA_GIT_VERSION\\\"
}
GET_HASHES {
# try to get the current git commit and branch
QCMA_GIT_HASH=$$system(git rev-parse --short HEAD)
QCMA_GIT_BRANCH=$$system(git rev-parse --abbrev-ref HEAD)
# pass the current git commit hash
!isEmpty(QCMA_GIT_HASH):!isEmpty(QCMA_GIT_BRANCH) {
DEFINES += QCMA_BUILD_HASH=\\\"$$QCMA_GIT_HASH\\\"
DEFINES += QCMA_BUILD_BRANCH=\\\"$$QCMA_GIT_BRANCH\\\"
}
SUBDIRS += qcma_cli.pro
}

28
qcma_cli.pro Normal file
View File

@@ -0,0 +1,28 @@
include(qcma_common.pri)
QT += dbus
TARGET = qcma_cli
SOURCES += \
src/cli/main_cli.cpp \
src/cli/singlecoreapplication.cpp \
src/cli/headlessmanager.cpp
HEADERS += \
src/cli/singlecoreapplication.h \
src/cli/headlessmanager.h
# Linux-only config
unix:!macx {
target.path = $$BINDIR
INSTALLS += target
}
# Create the introspection XML
system(qdbuscpp2xml -M -s src/cli/headlessmanager.h -o org.qcma.HeadlessManager.xml)
# Create the helper class
DBUS_ADAPTORS = org.qcma.HeadlessManager.xml

121
qcma_common.pri Normal file
View File

@@ -0,0 +1,121 @@
#-------------------------------------------------
#
# Project created by QtCreator 2013-07-23T15:34:17
#
#-------------------------------------------------
QT += core \
network \
sql
VERSION = 0.3.0
TEMPLATE = app
SOURCES += \
src/capability.cpp \
src/cmaobject.cpp \
src/cmarootobject.cpp \
src/cmautils.cpp \
src/sforeader.cpp \
src/cmaclient.cpp \
src/cmabroadcast.cpp \
src/avdecoder.cpp \
src/cmaevent.cpp \
src/dds.cpp \
src/sqlitedb.cpp \
src/httpdownloader.cpp \
src/qlistdb.cpp \
src/database.cpp \
HEADERS += \
src/capability.h \
src/cmaobject.h \
src/cmarootobject.h \
src/cmautils.h \
src/sforeader.h \
src/cmaclient.h \
src/cmabroadcast.h \
src/avdecoder.h \
src/cmaevent.h \
src/dds.h \
src/sqlitedb.h \
src/httpdownloader.h \
src/qlistdb.h \
src/database.h \
TRANSLATIONS += \
resources/translations/qcma_es.ts \
resources/translations/qcma_ja.ts
OTHER_FILES += \
resources/xml/psp2-updatelist.xml \
resources/images/psv_icon.png \
resources/images/psv_icon_16.png \
resources/images/qcma.png \
resources/qcma.desktop \
qcma.rc
INCLUDEPATH += src/
RESOURCES += qcmares.qrc translations.qrc
# find packages using pkg-config
CONFIG += link_pkgconfig
PKGCONFIG += libvitamtp libavformat libavcodec libavutil libswscale
# custom CXXFLAGS
QMAKE_CXXFLAGS += -Wno-write-strings -Wall -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS
#Linux-only config
unix:!macx {
# largefile support
DEFINES += _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE
# installation prefix
isEmpty(PREFIX) {
PREFIX = /usr/local
}
BINDIR = $$PREFIX/bin
DATADIR = $$PREFIX/share
}
# Windows config
win32 {
# Windows icon
RC_FILE = qcma.rc
# avoid alignment issues with newer mingw compiler
QMAKE_CXXFLAGS += -mno-ms-bitfields
}
# OS X config
macx {
# OS X icon
ICON = resources/images/$${TARGET}.icns
# re-enable pkg-config on OS X (brew installs pkg-config files)
QT_CONFIG -= no-pkg-config
}
# try to get the current git version + hash
QCMA_GIT_VERSION=$$system(git describe --tags)
#use the generic version if the above command fails (no git executable or metadata)
isEmpty(QCMA_GIT_VERSION) {
DEFINES += QCMA_VER=\\\"$$VERSION\\\"
} else {
DEFINES += QCMA_VER=\\\"$$QCMA_GIT_VERSION\\\"
}
GET_HASHES {
# try to get the current git commit and branch
QCMA_GIT_HASH=$$system(git rev-parse --short HEAD)
QCMA_GIT_BRANCH=$$system(git rev-parse --abbrev-ref HEAD)
# pass the current git commit hash
!isEmpty(QCMA_GIT_HASH):!isEmpty(QCMA_GIT_BRANCH) {
DEFINES += QCMA_BUILD_HASH=\\\"$$QCMA_GIT_HASH\\\"
DEFINES += QCMA_BUILD_BRANCH=\\\"$$QCMA_GIT_BRANCH\\\"
}
}

69
qcma_gui.pro Normal file
View File

@@ -0,0 +1,69 @@
include(qcma_common.pri)
TARGET = qcma
QT += \
gui \
widgets
SOURCES += \
src/gui/main.cpp \
src/gui/mainwidget.cpp \
src/gui/singleapplication.cpp \
src/gui/clientmanager.cpp \
src/gui/filterlineedit.cpp \
# forms
src/forms/backupitem.cpp \
src/forms/backupmanagerform.cpp \
src/forms/configwidget.cpp \
src/forms/confirmdialog.cpp \
src/forms/pinform.cpp \
src/forms/progressform.cpp
HEADERS += \
src/gui/mainwidget.h \
src/gui/singleapplication.h \
src/gui/clientmanager.h \
src/gui/filterlineedit.h \
# forms
src/forms/backupitem.h \
src/forms/backupmanagerform.h \
src/forms/configwidget.h \
src/forms/confirmdialog.h \
src/forms/pinform.h \
src/forms/progressform.h
FORMS += \
src/forms/configwidget.ui \
src/forms/backupmanagerform.ui \
src/forms/backupitem.ui \
src/forms/confirmdialog.ui \
src/forms/progressform.ui \
src/forms/pinform.ui
#Linux-only config
unix:!macx {
DATADIR = $$PREFIX/share
# config for desktop file and icon
desktop.path = $$DATADIR/applications/$${TARGET}
desktop.files += resources/$${TARGET}.desktop
icon64.path = $$DATADIR/icons/hicolor/64x64/apps
icon64.files += resources/images/$${TARGET}.png
target.path = $$BINDIR
INSTALLS += target desktop icon64
# KDE support
ENABLE_KDE {
greaterThan(QT_MAJOR_VERSION, 4) {
error("ENABLE_KDE can only be used with Qt4")
}
LIBS += -lkdeui
DEFINES += ENABLE_KDE_NOTIFIER=1
SOURCES += src/kdenotifier.cpp
HEADERS += src/kdenotifier.h
}
}

135
src/cli/headlessmanager.cpp Normal file
View File

@@ -0,0 +1,135 @@
/*
* QCMA: Cross-platform content manager assistant for the PS Vita
*
* Copyright (C) 2013 Codestation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "cmaclient.h"
#include "cmautils.h"
#include "sqlitedb.h"
#include "qlistdb.h"
#include "headlessmanager.h"
#include "headlessmanager_adaptor.h"
#include <QCoreApplication>
#include <QSettings>
#include <vitamtp.h>
HeadlessManager::HeadlessManager(QObject *parent) :
QObject(parent), dbus_conn(QDBusConnection::sessionBus())
{
new HeadlessManagerAdaptor(this);
QDBusConnection dbus = QDBusConnection::sessionBus();
// expose qcma over dbus so the database update can be triggered
dbus.registerObject("/HeadlessManager", this);
dbus.registerService("org.qcma.HeadlessManager");
}
HeadlessManager::~HeadlessManager()
{
VitaMTP_Cleanup();
delete m_db;
}
void HeadlessManager::refreshDatabase()
{
if(m_db->load()) {
return;
}
if(!m_db->rescan()) {
qDebug("No PS Vita system has been registered");
}
}
void HeadlessManager::start()
{
if(VitaMTP_Init() < 0) {
qDebug("Cannot initialize VitaMTP library");
return;
}
if(QSettings().value("useMemoryStorage", true).toBool()) {
m_db = new QListDB();
} else {
m_db = new SQLiteDB();
}
// initializing database for the first use
refreshDatabase();
// send a signal over dbus of the connected peers knows when the update is finished
connect(m_db, SIGNAL(updated(int)), this, SIGNAL(databaseUpdated(int)));
thread_count = 0;
qDebug("Starting cma threads");
CmaClient *client;
QSettings settings;
if(!settings.value("disableUSB", false).toBool()) {
usb_thread = new QThread();
client = new CmaClient(m_db);
usb_thread->setObjectName("usb_thread");
connect(usb_thread, SIGNAL(started()), client, SLOT(connectUsb()));
connect(client, SIGNAL(finished()), usb_thread, SLOT(quit()), Qt::DirectConnection);
connect(usb_thread, SIGNAL(finished()), usb_thread, SLOT(deleteLater()));
connect(usb_thread, SIGNAL(finished()), this, SLOT(threadStopped()));
connect(usb_thread, SIGNAL(finished()), client, SLOT(deleteLater()));
connect(client, SIGNAL(refreshDatabase()), this, SLOT(refreshDatabase()));
client->moveToThread(usb_thread);
usb_thread->start();
thread_count++;
}
if(!settings.value("disableWireless", false).toBool()) {
wireless_thread = new QThread();
client = new CmaClient(m_db);
wireless_thread->setObjectName("wireless_thread");
connect(wireless_thread, SIGNAL(started()), client, SLOT(connectWireless()));
connect(client, SIGNAL(finished()), wireless_thread, SLOT(quit()), Qt::DirectConnection);
connect(wireless_thread, SIGNAL(finished()), wireless_thread, SLOT(deleteLater()));
connect(wireless_thread, SIGNAL(finished()), this, SLOT(threadStopped()));
connect(wireless_thread, SIGNAL(finished()), client, SLOT(deleteLater()));
connect(client, SIGNAL(refreshDatabase()), this, SLOT(refreshDatabase()));
client->moveToThread(wireless_thread);
wireless_thread->start();
thread_count++;
}
if(thread_count == 0) {
qDebug("You must enable at least USB or Wireless monitoring");
}
}
void HeadlessManager::stop()
{
if(CmaClient::stop() < 0) {
QCoreApplication::quit();
}
}
void HeadlessManager::threadStopped()
{
mutex.lock();
if(--thread_count == 0) {
QCoreApplication::quit();
}
mutex.unlock();
}

62
src/cli/headlessmanager.h Normal file
View File

@@ -0,0 +1,62 @@
/*
* QCMA: Cross-platform content manager assistant for the PS Vita
*
* Copyright (C) 2013 Codestation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef HEADLESSMANAGER_H
#define HEADLESSMANAGER_H
#include "database.h"
#include <QObject>
#include <QThread>
#include <QDBusConnection>
class HeadlessManager : public QObject
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.qcma.HeadlessManager")
public:
explicit HeadlessManager(QObject *parent = 0);
~HeadlessManager();
void start();
private:
int thread_count;
QMutex mutex;
Database *m_db;
QThread *usb_thread;
QThread *wireless_thread;
QDBusConnection dbus_conn;
signals:
void stopped();
Q_SCRIPTABLE void databaseUpdated(int count);
public slots:
void refreshDatabase();
void stop();
private slots:
void threadStopped();
};
#endif // HEADLESSMANAGER_H

115
src/cli/main_cli.cpp Normal file
View File

@@ -0,0 +1,115 @@
/*
* QCMA: Cross-platform content manager assistant for the PS Vita
*
* Copyright (C) 2013 Codestation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef Q_OS_WIN32
#include <signal.h>
#endif
#include <QDebug>
#include <QLibraryInfo>
#include <QLocale>
#include <QTextCodec>
#include <QThread>
#include <QTranslator>
#include <inttypes.h>
#include <vitamtp.h>
#include "singlecoreapplication.h"
#include "headlessmanager.h"
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
void noMessageOutput(QtMsgType type, const QMessageLogContext &, const QString & str)
{
const char * msg = str.toStdString().c_str();
#else
void noMessageOutput(QtMsgType type, const char *msg)
{
#endif
Q_UNUSED(type);
Q_UNUSED(msg);
}
int main(int argc, char *argv[])
{
if(SingleCoreApplication::sendMessage(QObject::tr("A instance of QCMA is already running"))) {
return 0;
}
SingleCoreApplication app(argc, argv);
#ifndef Q_OS_WIN32
// FIXME: libmtp sends SIGPIPE if a socket write fails crashing the whole app
// the proper fix is to libmtp to handle the cancel properly or ignoring
// SIGPIPE on the socket
signal(SIGPIPE, SIG_IGN);
#endif
if(app.arguments().contains("--with-debug")) {
VitaMTP_Set_Logging(VitaMTP_DEBUG);
} else if(app.arguments().contains("--verbose")) {
VitaMTP_Set_Logging(VitaMTP_VERBOSE);
} else {
VitaMTP_Set_Logging(VitaMTP_NONE);
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
qInstallMessageHandler(noMessageOutput);
#else
qInstallMsgHandler(noMessageOutput);
#endif
}
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
#endif
qDebug("Starting QCMA %s", QCMA_VER);
QTranslator translator;
QString locale = QLocale().system().name();
qDebug() << "Current locale:" << locale;
if(app.arguments().contains("--set-locale")) {
int index = app.arguments().indexOf("--set-locale");
if(index + 1 < app.arguments().length()) {
qDebug("Enforcing locale: %s", app.arguments().at(index + 1).toUtf8().data());
locale = app.arguments().at(index + 1);
}
}
if(translator.load("qcma_" + locale, ":/resources/translations")) {
app.installTranslator(&translator);
} else {
qDebug() << "Cannot load translation for locale:" << locale;
}
QTranslator system_translator;
system_translator.load("qt_" + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&system_translator);
qDebug("Starting main thread: 0x%016" PRIxPTR, (uintptr_t)QThread::currentThreadId());
// set the organization/application for QSettings to work properly
app.setOrganizationName("qcma");
app.setApplicationName("qcma");
HeadlessManager manager;
manager.start();
return app.exec();
}

View File

@@ -0,0 +1,69 @@
/*
* QCMA: Cross-platform content manager assistant for the PS Vita
*
* Copyright (C) 2013 Codestation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "singlecoreapplication.h"
#include <QDebug>
const int SingleCoreApplication::timeout = 500;
const QString SingleCoreApplication::SHARED_KEY = "QCMA_KEY";
SingleCoreApplication::SingleCoreApplication(int &argc, char **argv) :
QCoreApplication(argc, argv)
{
server = new QLocalServer(this);
connect(server, SIGNAL(newConnection()), this, SLOT(receiveMessage()));
QLocalServer::removeServer(SHARED_KEY);
server->listen(SHARED_KEY);
}
void SingleCoreApplication::receiveMessage()
{
QLocalSocket *socket = server->nextPendingConnection();
if(!socket->waitForReadyRead(timeout)) {
qDebug() << socket->errorString();
return;
}
QByteArray byteArray = socket->readAll();
QString message = QString::fromUtf8(byteArray.constData());
emit messageAvailable(message);
socket->disconnectFromServer();
}
bool SingleCoreApplication::sendMessage(const QString &message)
{
QLocalSocket socket;
socket.connectToServer(SHARED_KEY, QIODevice::WriteOnly);
if(!socket.waitForConnected(timeout)) {
return false;
}
socket.write(message.toUtf8());
if(!socket.waitForBytesWritten(timeout)) {
qDebug() << socket.errorString();
return false;
}
socket.disconnectFromServer();
return true;
}

View File

@@ -0,0 +1,50 @@
/*
* QCMA: Cross-platform content manager assistant for the PS Vita
*
* Copyright (C) 2013 Codestation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SINGLECOREAPPLICATION_H
#define SINGLECOREAPPLICATION_H
#include <QCoreApplication>
#include <QLocalSocket>
#include <QLocalServer>
#include <QSharedMemory>
class SingleCoreApplication : public QCoreApplication
{
Q_OBJECT
public:
explicit SingleCoreApplication(int &argc, char **argv);
static bool sendMessage(const QString &message);
private:
QLocalServer *server;
static const int timeout;
static const QString SHARED_KEY;
signals:
void messageAvailable(QString message);
public slots:
void receiveMessage();
};
#endif // SINGLECOREAPPLICATION_H

View File

@@ -23,7 +23,6 @@
#include "cmaevent.h"
#include "cmautils.h"
#include <QApplication>
#include <QDateTime>
#include <QDebug>
#include <QDir>

View File

@@ -504,6 +504,7 @@ void CmaEvent::vitaEventSendHttpObjectFromURL(vita_event_t *event, int eventId)
data = res.readAll();
} else if(!offlineMode) {
qDebug("URL: %s", url);
HTTPDownloader downloader(url);
QThread *http_thread = new QThread();
http_thread->setObjectName("http_thread");

View File

@@ -23,7 +23,7 @@
#include "sforeader.h"
#include "confirmdialog.h"
#include "cmautils.h"
#include "filterlineedit.h"
#include "gui/filterlineedit.h"
#include <QDebug>
#include <QDialogButtonBox>

View File

@@ -131,7 +131,7 @@
<customwidget>
<class>FilterLineEdit</class>
<extends>QLineEdit</extends>
<header>filterlineedit.h</header>
<header>gui/filterlineedit.h</header>
</customwidget>
</customwidgets>
<resources/>

View File

@@ -20,7 +20,7 @@
#ifndef CLIENTMANAGER_H
#define CLIENTMANAGER_H
#include "qlistdb.h"
#include "database.h"
#include "forms/pinform.h"
#include "forms/progressform.h"

View File

@@ -42,6 +42,7 @@ HTTPDownloader::HTTPDownloader(const QString &url, QObject *parent) :
HTTPDownloader::~HTTPDownloader()
{
lengthMutex.unlock();
dataAvailable.unlock();
free(buffer);
}
@@ -105,6 +106,8 @@ void HTTPDownloader::readyRead()
downloadLeft -= bufferSize;
//qDebug("bufferSize: %li, downloadLeft: %li", bufferSize, downloadLeft);
if(bufferSize > 16384 || downloadLeft == 0) {
dataAvailable.unlock();
}
@@ -149,8 +152,10 @@ int HTTPDownloader::readCallback(unsigned char *data, unsigned long wantlen, uns
void HTTPDownloader::error(QNetworkReply::NetworkError errorCode)
{
Q_UNUSED(errorCode);
QString error = reply->errorString();
emit messageSent(tr("Network error: %1").arg(reply->errorString()));
qWarning() << "Network error:" << error;
emit messageSent(tr("Network error: %1").arg(error));
// set buffer to zero so a read callback can be aborted
dataRead.lock();

View File

@@ -77,8 +77,8 @@ static const char create_apps[] = "CREATE TABLE IF NOT EXISTS application ("
"app_type INTEGER)";
static const char create_virtual[] = "CREATE TABLE IF NOT EXISTS virtual_nodes ("
"object_id INTEGER PRIMARY KEY REFERENCES object_node(object_id) ON DELETE CASCADE,"
"app_type INTEGER)";
"object_id INTEGER PRIMARY KEY REFERENCES object_node(object_id) ON DELETE CASCADE,"
"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,"
@@ -1246,55 +1246,65 @@ bool SQLiteDB::insertVirtualEntries()
{
int ohfi;
if((ohfi = insertNodeEntry("Folders", VITA_DIR_TYPE_MASK_REGULAR, Video)) > 0)
if((ohfi = insertNodeEntry("Folders", VITA_DIR_TYPE_MASK_REGULAR, Video)) > 0) {
insertVirtualEntry(ohfi);
else
} else {
return false;
}
if((ohfi = insertNodeEntry("All", VITA_DIR_TYPE_MASK_ALL, Video)) > 0)
if((ohfi = insertNodeEntry("All", VITA_DIR_TYPE_MASK_ALL, Video)) > 0) {
insertVirtualEntry(ohfi);
else
} else {
return false;
}
if((ohfi = insertNodeEntry("Folders", VITA_DIR_TYPE_MASK_REGULAR, Photo)) > 0)
if((ohfi = insertNodeEntry("Folders", VITA_DIR_TYPE_MASK_REGULAR, Photo)) > 0) {
insertVirtualEntry(ohfi);
else
} else {
return false;
}
if((ohfi = insertNodeEntry("Month", VITA_DIR_TYPE_MASK_MONTH, Photo)) > 0)
if((ohfi = insertNodeEntry("Month", VITA_DIR_TYPE_MASK_MONTH, Photo)) > 0) {
insertVirtualEntry(ohfi);
else
} else {
return false;
}
if((ohfi = insertNodeEntry("All", VITA_DIR_TYPE_MASK_ALL, Photo)) > 0)
if((ohfi = insertNodeEntry("All", VITA_DIR_TYPE_MASK_ALL, Photo)) > 0) {
insertVirtualEntry(ohfi);
else
} else {
return false;
}
if((ohfi = insertNodeEntry("Artists", VITA_DIR_TYPE_MASK_ARTISTS, Music)) > 0)
if((ohfi = insertNodeEntry("Artists", VITA_DIR_TYPE_MASK_ARTISTS, Music)) > 0) {
insertVirtualEntry(ohfi);
else
} else {
return false;
}
if((ohfi = insertNodeEntry("Albums", VITA_DIR_TYPE_MASK_ALBUMS, Music)) > 0)
if((ohfi = insertNodeEntry("Albums", VITA_DIR_TYPE_MASK_ALBUMS, Music)) > 0) {
insertVirtualEntry(ohfi);
else
} else {
return false;
}
if((ohfi = insertNodeEntry("Songs", VITA_DIR_TYPE_MASK_SONGS, Music)) > 0)
if((ohfi = insertNodeEntry("Songs", VITA_DIR_TYPE_MASK_SONGS, Music)) > 0) {
insertVirtualEntry(ohfi);
else
} else {
return false;
}
if((ohfi = insertNodeEntry("Genres", VITA_DIR_TYPE_MASK_GENRES, Music)) > 0)
if((ohfi = insertNodeEntry("Genres", VITA_DIR_TYPE_MASK_GENRES, Music)) > 0) {
insertVirtualEntry(ohfi);
else
} else {
return false;
}
if((ohfi = insertNodeEntry("Playlists", VITA_DIR_TYPE_MASK_PLAYLISTS, Music)) > 0)
if((ohfi = insertNodeEntry("Playlists", VITA_DIR_TYPE_MASK_PLAYLISTS, Music)) > 0) {
insertVirtualEntry(ohfi);
else
} else {
return false;
}
return true;
}