// Toonz includes #include "traster.h" #include "timage_io.h" // Qt includes #include #include #include #include #include #include // tipc includes #include "tipc.h" #include "tipcmsg.h" //--------------------------------------------------------------------- // Local stuff namespace { QHash sharedMemories; QHash temporaryFiles; } //--------------------------------------------------------------------- namespace tipc { //******************************************************************************* // Shared Memory Request //******************************************************************************* template <> QString DefaultMessageParser::header() const { return QString("$shmem_request"); } //------------------------------------------------------------------ template <> void DefaultMessageParser::operator()(Message &msg) { int size; QString id; msg >> id >> size >> clr; QSharedMemory *mem = new QSharedMemory(id); bool ok = (tipc::create(*mem, size) > 0); if (!ok) { msg << QString("err"); delete mem; return; } sharedMemories.insert(id, mem); msg << QString("ok"); } //******************************************************************************* // Shared Memory Release //******************************************************************************* template <> QString DefaultMessageParser::header() const { return QString("$shmem_release"); } //------------------------------------------------------------------ template <> void DefaultMessageParser::operator()(Message &msg) { QString id; msg >> id >> clr; QSharedMemory *mem = sharedMemories.take(id); if (mem) delete mem; msg << QString("ok"); } //******************************************************************************* // Temporary File Request //******************************************************************************* template <> QString DefaultMessageParser::header() const { return QString("$tmpfile_request"); } //------------------------------------------------------------------ template <> void DefaultMessageParser::operator()(Message &msg) { QString id; msg >> id >> clr; // Build a temporary file with passed id group. // The created QTemporaryFile CANNOT be stored directly, as it internally // keeps the file open until the object is destroyed. Instead, we store its // filePath and manually remove it upon release. QTemporaryFile tmp(QDir::temp().filePath(id)); tmp.setAutoRemove(false); if (!tmp.open()) { msg << QString("err"); return; } temporaryFiles.insert(id, tmp.fileName()); msg << QString("ok") << tmp.fileName(); } //******************************************************************************* // Temporary File Release //******************************************************************************* template <> QString DefaultMessageParser::header() const { return QString("$tmpfile_release"); } //------------------------------------------------------------------ template <> void DefaultMessageParser::operator()(Message &msg) { QString id; msg >> id >> clr; QString tmpPath = temporaryFiles.take(id); if (!tmpPath.isEmpty()) { QFile file(tmpPath); file.remove(); } msg << QString("ok"); } //******************************************************************************* // Quit On Error //******************************************************************************* template <> QString DefaultMessageParser::header() const { return QString("$quit_on_error"); } //------------------------------------------------------------------ template <> void DefaultMessageParser::operator()(Message &msg) { QObject::connect(socket(), SIGNAL(error(QLocalSocket::LocalSocketError)), QCoreApplication::instance(), SLOT(quit())); // In Qt 5.5 originating process's termination emits 'disconnected' instead of // 'error' QObject::connect(socket(), SIGNAL(disconnected()), QCoreApplication::instance(), SLOT(quit())); msg << clr << QString("ok"); } //******************************************************************************* // Explicit template instantiation for all basic datatypes //******************************************************************************* //-------------------------- Default Messages --------------------------- template class DefaultMessageParser; template class DefaultMessageParser; template class DefaultMessageParser; template class DefaultMessageParser; template class DefaultMessageParser; } // namespace tipc