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