nodeinstanceserverproxy.cpp 24.3 KB
Newer Older
hjk's avatar
hjk committed
1
/****************************************************************************
2
**
3 4
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
5
**
hjk's avatar
hjk committed
6
** This file is part of Qt Creator.
7
**
hjk's avatar
hjk committed
8 9 10 11
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
12 13 14
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
15
**
16 17
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
18 19 20 21 22
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
23
**
hjk's avatar
hjk committed
24
****************************************************************************/
25

26 27
#include "nodeinstanceserverproxy.h"

Tim Jenssen's avatar
Tim Jenssen committed
28
#include "puppetcreator.h"
29

Tim Jenssen's avatar
Tim Jenssen committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43
#include <createinstancescommand.h>
#include <createscenecommand.h>
#include <changevaluescommand.h>
#include <changebindingscommand.h>
#include <changeauxiliarycommand.h>
#include <changefileurlcommand.h>
#include <removeinstancescommand.h>
#include <clearscenecommand.h>
#include <removepropertiescommand.h>
#include <reparentinstancescommand.h>
#include <changeidscommand.h>
#include <changestatecommand.h>
#include <completecomponentcommand.h>
#include <changenodesourcecommand.h>
44

Tim Jenssen's avatar
Tim Jenssen committed
45 46 47 48 49 50 51 52 53 54 55
#include <informationchangedcommand.h>
#include <pixmapchangedcommand.h>
#include <valueschangedcommand.h>
#include <childrenchangedcommand.h>
#include <statepreviewimagechangedcommand.h>
#include <componentcompletedcommand.h>
#include <tokencommand.h>
#include <removesharedmemorycommand.h>
#include <endpuppetcommand.h>
#include <synchronizecommand.h>
#include <debugoutputcommand.h>
56

Tim Jenssen's avatar
Tim Jenssen committed
57 58
#include <nodeinstanceview.h>
#include <import.h>
59 60 61
#include <rewriterview.h>

#ifndef QMLDESIGNER_TEST
Tim Jenssen's avatar
Tim Jenssen committed
62
#include <qmldesignerplugin.h>
63
#endif
64

65
#include <coreplugin/icore.h>
66
#include <utils/hostosinfo.h>
67
#include <coreplugin/messagebox.h>
68
#include <coreplugin/editormanager/editormanager.h>
69 70 71 72
#include <projectexplorer/kit.h>
#include <qtsupport/qtkitinformation.h>
#include <qtsupport/baseqtversion.h>
#include <qtsupport/qtsupportconstants.h>
73

Tim Jenssen's avatar
Tim Jenssen committed
74 75
#include <QLocalServer>
#include <QLocalSocket>
76
#include <QLoggingCategory>
Tim Jenssen's avatar
Tim Jenssen committed
77 78 79 80 81 82 83 84
#include <QProcess>
#include <QCoreApplication>
#include <QUuid>
#include <QFileInfo>
#include <QDir>
#include <QTimer>
#include <QTextStream>
#include <QMessageBox>
85 86 87

namespace QmlDesigner {

88 89
static Q_LOGGING_CATEGORY(instanceViewBenchmark, "qtc.nodeinstances.init")

90
void NodeInstanceServerProxy::showCannotConnectToPuppetWarningAndSwitchToEditMode()
91
{
92
#ifndef QMLDESIGNER_TEST
93 94 95
    Core::AsynchronousMessageBox::warning(tr("Cannot Connect to QML Emulation Layer (QML Puppet)"),
                                          tr("The executable of the QML emulation layer (QML Puppet) may not be responding. "
                                             "Switching to another kit might help."));
96 97

    QmlDesignerPlugin::instance()->switchToTextModeDeferred();
98
    m_nodeInstanceView->emitDocumentMessage(tr("Cannot Connect to QML Emulation Layer (QML Puppet)"));
99
#endif
100 101 102

}

103 104 105 106
NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceView,
                                                 RunModus runModus,
                                                 ProjectExplorer::Kit *kit,
                                                 ProjectExplorer::Project *project)
107 108 109
    : NodeInstanceServerInterface(nodeInstanceView),
      m_localServer(new QLocalServer(this)),
      m_nodeInstanceView(nodeInstanceView),
110
      m_runModus(runModus)
111
{
112 113 114
    if (instanceViewBenchmark().isInfoEnabled())
        m_benchmarkTimer.start();

115 116 117 118
   QString socketToken(QUuid::createUuid().toString());
   m_localServer->listen(socketToken);
   m_localServer->setMaxPendingConnections(3);

119
   PuppetCreator puppetCreator(kit, project, QString(), nodeInstanceView->model());
120
   puppetCreator.setQrcMappingString(qrcMappingString());
121

122
   puppetCreator.createPuppetExecutableIfMissing();
123

124
   m_qmlPuppetEditorProcess = puppetCreator.createPuppetProcess("editormode",
125 126
                                                              socketToken,
                                                              this,
127
                                                              SLOT(printEditorProcessOutput()),
128 129 130
                                                              SLOT(processFinished(int,QProcess::ExitStatus)));

   if (runModus == NormalModus) {
131
       m_qmlPuppetRenderProcess = puppetCreator.createPuppetProcess("rendermode",
132 133
                                                                    socketToken,
                                                                    this,
134
                                                                    SLOT(printRenderProcessOutput()),
135
                                                                    SLOT(processFinished(int,QProcess::ExitStatus)));
136
       m_qmlPuppetPreviewProcess = puppetCreator.createPuppetProcess("previewmode",
137 138 139 140 141
                                                                     socketToken,
                                                                     this,
                                                                     SLOT(printPreviewProcessOutput()),
                                                                     SLOT(processFinished(int,QProcess::ExitStatus)));
   }
142

143 144 145
   const int second = 1000;
   const int waitConstant = 8 * second;
   if (m_qmlPuppetEditorProcess->waitForStarted(waitConstant)) {
146 147
       connect(m_qmlPuppetEditorProcess.data(), static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
            m_qmlPuppetEditorProcess.data(), &QProcess::deleteLater);
148
    qCInfo(instanceViewBenchmark) << "puppets started:" << m_benchmarkTimer.elapsed();
149

150
       if (runModus == NormalModus) {
151
           m_qmlPuppetPreviewProcess->waitForStarted(waitConstant / 2);
152 153
           connect(m_qmlPuppetPreviewProcess.data(), static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
                m_qmlPuppetPreviewProcess.data(), &QProcess::deleteLater);
154

155
           m_qmlPuppetRenderProcess->waitForStarted(waitConstant / 2);
156 157
           connect(m_qmlPuppetRenderProcess.data(), static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
                m_qmlPuppetRenderProcess.data(), &QProcess::deleteLater);
158
       }
159

160
       bool connectedToPuppet = true;
161

162
       if (!m_localServer->hasPendingConnections())
163
           connectedToPuppet = m_localServer->waitForNewConnection(waitConstant / 4);
164 165 166

       if (connectedToPuppet) {
           m_firstSocket = m_localServer->nextPendingConnection();
167 168
           connect(m_firstSocket.data(), &QIODevice::readyRead, this,
                   &NodeInstanceServerProxy::readFirstDataStream);
169 170 171

           if (runModus == NormalModus) {
               if (!m_localServer->hasPendingConnections())
172
                   connectedToPuppet = m_localServer->waitForNewConnection(waitConstant / 4);
173 174 175

               if (connectedToPuppet) {
                   m_secondSocket = m_localServer->nextPendingConnection();
176
                   connect(m_secondSocket.data(), &QIODevice::readyRead, this, &NodeInstanceServerProxy::readSecondDataStream);
177 178

                   if (!m_localServer->hasPendingConnections())
179
                        connectedToPuppet = m_localServer->waitForNewConnection(waitConstant / 4);
180

181
    qCInfo(instanceViewBenchmark) << "puppets connected:" << m_benchmarkTimer.elapsed();
182 183
                   if (connectedToPuppet) {
                       m_thirdSocket = m_localServer->nextPendingConnection();
184
                       connect(m_thirdSocket.data(), &QIODevice::readyRead, this, &NodeInstanceServerProxy::readThirdDataStream);
185 186 187 188 189 190 191 192 193
                   } else {
                       showCannotConnectToPuppetWarningAndSwitchToEditMode();
                   }
               } else {
                   showCannotConnectToPuppetWarningAndSwitchToEditMode();
               }
           }
       } else {
           showCannotConnectToPuppetWarningAndSwitchToEditMode();
194
       }
195

196
   } else {
197
       showCannotConnectToPuppetWarningAndSwitchToEditMode();
198
   }
199

200 201 202
   m_localServer->close();


203 204 205 206 207 208
   int indexOfCapturePuppetStream = QCoreApplication::arguments().indexOf("-capture-puppet-stream");
   if (indexOfCapturePuppetStream > 0) {
       m_captureFileForTest.setFileName(QCoreApplication::arguments().at(indexOfCapturePuppetStream + 1));
       bool isOpen = m_captureFileForTest.open(QIODevice::WriteOnly);
       qDebug() << "file is open: " << isOpen;
   }
209

210
#ifndef QMLDESIGNER_TEST
211 212 213 214 215 216 217 218
   DesignerSettings settings = QmlDesignerPlugin::instance()->settings();
   int timeOutTime = settings.value(DesignerSettingsKey::PUPPET_KILL_TIMEOUT).toInt();
   m_firstTimer.setInterval(timeOutTime);
   m_secondTimer.setInterval(timeOutTime);
   m_thirdTimer.setInterval(timeOutTime);

    if (QmlDesignerPlugin::instance()->settings().value(DesignerSettingsKey::
            DEBUG_PUPPET).toString().isEmpty()) {
219 220 221 222
       connect(&m_firstTimer, SIGNAL(timeout()), this, SLOT(processFinished()));
       connect(&m_secondTimer, SIGNAL(timeout()), this, SLOT(processFinished()));
       connect(&m_thirdTimer, SIGNAL(timeout()), this, SLOT(processFinished()));
   }
223
#endif
224 225 226 227
}

NodeInstanceServerProxy::~NodeInstanceServerProxy()
{
228 229
    disconnect(this, SLOT(processFinished(int,QProcess::ExitStatus)));

230 231
    writeCommand(QVariant::fromValue(EndPuppetCommand()));

232 233
    if (m_firstSocket) {
        m_firstSocket->waitForBytesWritten(1000);
234
        m_firstSocket->abort();
235
    }
236

237 238
    if (m_secondSocket) {
        m_secondSocket->waitForBytesWritten(1000);
239
        m_secondSocket->abort();
240
    }
241

242 243
    if (m_thirdSocket) {
        m_thirdSocket->waitForBytesWritten(1000);
244
        m_thirdSocket->abort();
245
    }
246

247
    if (m_qmlPuppetEditorProcess) {
248 249
        QTimer::singleShot(3000, m_qmlPuppetEditorProcess.data(), &QProcess::terminate);
        QTimer::singleShot(6000, m_qmlPuppetEditorProcess.data(), &QProcess::kill);
250
    }
251

252
    if (m_qmlPuppetPreviewProcess) {
253 254
        QTimer::singleShot(3000, m_qmlPuppetPreviewProcess.data(), &QProcess::terminate);
        QTimer::singleShot(6000, m_qmlPuppetPreviewProcess.data(), &QProcess::kill);
255
    }
256

257
    if (m_qmlPuppetRenderProcess) {
258 259
         QTimer::singleShot(3000, m_qmlPuppetRenderProcess.data(), &QProcess::terminate);
         QTimer::singleShot(6000, m_qmlPuppetRenderProcess.data(), &QProcess::kill);
260
    }
261 262
}

263
void NodeInstanceServerProxy::dispatchCommand(const QVariant &command, PuppetStreamType puppetStreamType)
264 265 266 267
{
    static const int informationChangedCommandType = QMetaType::type("InformationChangedCommand");
    static const int valuesChangedCommandType = QMetaType::type("ValuesChangedCommand");
    static const int pixmapChangedCommandType = QMetaType::type("PixmapChangedCommand");
268
    static const int childrenChangedCommandType = QMetaType::type("ChildrenChangedCommand");
269
    static const int statePreviewImageChangedCommandType = QMetaType::type("StatePreviewImageChangedCommand");
270
    static const int componentCompletedCommandType = QMetaType::type("ComponentCompletedCommand");
271
    static const int synchronizeCommandType = QMetaType::type("SynchronizeCommand");
272
    static const int tokenCommandType = QMetaType::type("TokenCommand");
Marco Bubke's avatar
Marco Bubke committed
273
    static const int debugOutputCommandType = QMetaType::type("DebugOutputCommand");
274
    static const int puppetAliveCommandType = QMetaType::type("PuppetAliveCommand");
275

276
    qCInfo(instanceViewBenchmark) << "dispatching command" << command.userType() << command.typeName();
277
    if (command.userType() ==  informationChangedCommandType) {
278
        nodeInstanceClient()->informationChanged(command.value<InformationChangedCommand>());
279
    } else if (command.userType() ==  valuesChangedCommandType) {
280
        nodeInstanceClient()->valuesChanged(command.value<ValuesChangedCommand>());
281
    } else if (command.userType() ==  pixmapChangedCommandType) {
282
        nodeInstanceClient()->pixmapChanged(command.value<PixmapChangedCommand>());
283
    } else if (command.userType() == childrenChangedCommandType) {
284
        nodeInstanceClient()->childrenChanged(command.value<ChildrenChangedCommand>());
285
    } else if (command.userType() == statePreviewImageChangedCommandType) {
286
        nodeInstanceClient()->statePreviewImagesChanged(command.value<StatePreviewImageChangedCommand>());
287
    } else if (command.userType() == componentCompletedCommandType) {
288
        nodeInstanceClient()->componentCompleted(command.value<ComponentCompletedCommand>());
289
    } else if (command.userType() == tokenCommandType) {
290
        nodeInstanceClient()->token(command.value<TokenCommand>());
291
    } else if (command.userType() == debugOutputCommandType) {
Marco Bubke's avatar
Marco Bubke committed
292
        nodeInstanceClient()->debugOutput(command.value<DebugOutputCommand>());
293 294
    } else if (command.userType() == puppetAliveCommandType) {
        puppetAlive(puppetStreamType);
295
    } else if (command.userType() == synchronizeCommandType) {
296 297 298
        SynchronizeCommand synchronizeCommand = command.value<SynchronizeCommand>();
        m_synchronizeId = synchronizeCommand.synchronizeId();
    }  else
299
        Q_ASSERT(false);
300
     qCInfo(instanceViewBenchmark) << "dispatching command" << "done" << command.userType();
301 302 303 304 305 306 307
}

NodeInstanceClientInterface *NodeInstanceServerProxy::nodeInstanceClient() const
{
    return m_nodeInstanceView.data();
}

308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
void NodeInstanceServerProxy::puppetAlive(NodeInstanceServerProxy::PuppetStreamType puppetStreamType)
{
    switch (puppetStreamType) {
    case FirstPuppetStream:
        m_firstTimer.stop();
        m_firstTimer.start();
        break;
    case SecondPuppetStream:
        m_secondTimer.stop();
        m_secondTimer.start();
        break;
    case ThirdPuppetStream:
        m_thirdTimer.stop();
        m_thirdTimer.start();
        break;
    default:
        break;
    }
}

328 329 330 331 332 333 334 335 336 337 338
QString NodeInstanceServerProxy::qrcMappingString() const
{
    if (m_nodeInstanceView && m_nodeInstanceView.data()->model()) {
        RewriterView *rewriterView = m_nodeInstanceView.data()->model()->rewriterView();
        if (rewriterView) {
            QString mappingString;

            typedef QPair<QString, QString> StringPair;

            foreach (const StringPair &pair, rewriterView->qrcMapping()) {
                if (!mappingString.isEmpty())
339
                    mappingString.append(QLatin1String(";"));
340 341 342 343 344 345 346 347 348 349 350 351
                mappingString.append(pair.first);
                mappingString.append(QLatin1String("="));
                mappingString.append(pair.second);
            }

            return mappingString;
        }
    }

    return QString();
}

352 353 354 355 356
void NodeInstanceServerProxy::processFinished()
{
    processFinished(-1, QProcess::CrashExit);
}

357
static void writeCommandToIODecive(const QVariant &command, QIODevice *ioDevice, unsigned int commandCounter)
358
{
359
    if (ioDevice) {
360 361
        QByteArray block;
        QDataStream out(&block, QIODevice::WriteOnly);
362
        out.setVersion(QDataStream::Qt_4_8);
363
        out << quint32(0);
364
        out << quint32(commandCounter);
365 366 367 368
        out << command;
        out.device()->seek(0);
        out << quint32(block.size() - sizeof(quint32));

369
        ioDevice->write(block);
370
    }
371 372 373 374
}

void NodeInstanceServerProxy::writeCommand(const QVariant &command)
{
375 376 377 378 379
    writeCommandToIODecive(command, m_firstSocket.data(), m_writeCommandCounter);
    writeCommandToIODecive(command, m_secondSocket.data(), m_writeCommandCounter);
    writeCommandToIODecive(command, m_thirdSocket.data(), m_writeCommandCounter);

    if (m_captureFileForTest.isWritable()) {
Robert Loehning's avatar
Robert Loehning committed
380
        qDebug() << "Write stream to file: " << m_captureFileForTest.fileName();
381 382 383 384
        writeCommandToIODecive(command, &m_captureFileForTest, m_writeCommandCounter);
        qDebug() << "\twrite file: " << m_captureFileForTest.pos();
    }

385
    m_writeCommandCounter++;
386 387 388 389 390
    if (m_runModus == TestModus) {
        static int synchronizeId = 0;
        synchronizeId++;
        SynchronizeCommand synchronizeCommand(synchronizeId);

391
        writeCommandToIODecive(QVariant::fromValue(synchronizeCommand), m_firstSocket.data(), m_writeCommandCounter);
392
        m_writeCommandCounter++;
393

394
        while (m_firstSocket->waitForReadyRead(100)) {
395 396 397 398 399
                readFirstDataStream();
                if (m_synchronizeId == synchronizeId)
                    return;
        }
    }
400 401
}

402
void NodeInstanceServerProxy::processFinished(int exitCode, QProcess::ExitStatus exitStatus)
403
{
Tim Jenssen's avatar
Tim Jenssen committed
404 405 406 407 408
    QProcess* finishedProcess = qobject_cast<QProcess*>(sender());
    if (finishedProcess)
        qWarning() << "Process" << (exitStatus == QProcess::CrashExit ? "crashed:" : "finished:") << finishedProcess->arguments() << "exitCode:" << exitCode;
    else
        qWarning() << "Process" << (exitStatus == QProcess::CrashExit ? "crashed:" : "finished:") << sender() << "exitCode:" << exitCode;
409

410 411
    if (m_captureFileForTest.isOpen()) {
        m_captureFileForTest.close();
412
        Core::AsynchronousMessageBox::warning(tr("QML Emulation Layer (QML Puppet) Crashed"),
413
                             tr("You are recording a puppet stream and the emulations layer crashed. "
414
                                "It is recommended to reopen the Qt Quick Designer and start again."));
415 416 417
    }


418 419
    writeCommand(QVariant::fromValue(EndPuppetCommand()));

420 421
    if (m_firstSocket) {
        m_firstSocket->waitForBytesWritten(1000);
422
        m_firstSocket->abort();
423 424 425 426
    }

    if (m_secondSocket) {
        m_secondSocket->waitForBytesWritten(1000);
427
        m_secondSocket->abort();
428 429 430 431
    }

    if (m_thirdSocket) {
        m_thirdSocket->waitForBytesWritten(1000);
432
        m_thirdSocket->abort();
433
    }
434

435 436
    if (exitStatus == QProcess::CrashExit)
        emit processCrashed();
437 438
}

439

440 441 442 443 444 445 446 447 448
void NodeInstanceServerProxy::readFirstDataStream()
{
    QList<QVariant> commandList;

    while (!m_firstSocket->atEnd()) {
        if (m_firstSocket->bytesAvailable() < int(sizeof(quint32)))
            break;

        QDataStream in(m_firstSocket.data());
449
        in.setVersion(QDataStream::Qt_4_8);
450

451
        if (m_firstBlockSize == 0)
452 453 454 455 456
            in >> m_firstBlockSize;

        if (m_firstSocket->bytesAvailable() < m_firstBlockSize)
            break;

457 458 459 460 461 462 463 464
        quint32 commandCounter;
        in >> commandCounter;
        bool commandLost = !((m_firstLastReadCommandCounter == 0 && commandCounter == 0) || (m_firstLastReadCommandCounter + 1 == commandCounter));
        if (commandLost)
            qDebug() << "server command lost: " << m_firstLastReadCommandCounter <<  commandCounter;
        m_firstLastReadCommandCounter = commandCounter;


465 466 467 468 469 470 471 472
        QVariant command;
        in >> command;
        m_firstBlockSize = 0;

        commandList.append(command);
    }

    foreach (const QVariant &command, commandList) {
473
        dispatchCommand(command, FirstPuppetStream);
474 475 476 477
    }
}

void NodeInstanceServerProxy::readSecondDataStream()
478 479 480
{
    QList<QVariant> commandList;

481 482
    while (!m_secondSocket->atEnd()) {
        if (m_secondSocket->bytesAvailable() < int(sizeof(quint32)))
483 484
            break;

485
        QDataStream in(m_secondSocket.data());
486
        in.setVersion(QDataStream::Qt_4_8);
487

488
        if (m_secondBlockSize == 0)
489
            in >> m_secondBlockSize;
490

491
        if (m_secondSocket->bytesAvailable() < m_secondBlockSize)
492 493
            break;

494 495 496 497 498 499 500 501
        quint32 commandCounter;
        in >> commandCounter;
        bool commandLost = !((m_secondLastReadCommandCounter == 0 && commandCounter == 0) || (m_secondLastReadCommandCounter + 1 == commandCounter));
        if (commandLost)
            qDebug() << "server command lost: " << m_secondLastReadCommandCounter <<  commandCounter;
        m_secondLastReadCommandCounter = commandCounter;


502 503
        QVariant command;
        in >> command;
504
        m_secondBlockSize = 0;
505 506 507 508 509

        commandList.append(command);
    }

    foreach (const QVariant &command, commandList) {
510
        dispatchCommand(command, SecondPuppetStream);
511 512 513
    }
}

514 515 516 517 518 519 520 521 522
void NodeInstanceServerProxy::readThirdDataStream()
{
    QList<QVariant> commandList;

    while (!m_thirdSocket->atEnd()) {
        if (m_thirdSocket->bytesAvailable() < int(sizeof(quint32)))
            break;

        QDataStream in(m_thirdSocket.data());
523
        in.setVersion(QDataStream::Qt_4_8);
524

525
        if (m_thirdBlockSize == 0)
526 527 528 529 530
            in >> m_thirdBlockSize;

        if (m_thirdSocket->bytesAvailable() < m_thirdBlockSize)
            break;

531 532 533 534 535 536 537 538
        quint32 commandCounter;
        in >> commandCounter;
        bool commandLost = !((m_thirdLastReadCommandCounter == 0 && commandCounter == 0) || (m_thirdLastReadCommandCounter + 1 == commandCounter));
        if (commandLost)
            qDebug() << "server command lost: " << m_thirdLastReadCommandCounter <<  commandCounter;
        m_thirdLastReadCommandCounter = commandCounter;


539 540 541 542 543 544 545 546
        QVariant command;
        in >> command;
        m_thirdBlockSize = 0;

        commandList.append(command);
    }

    foreach (const QVariant &command, commandList) {
547
        dispatchCommand(command, ThirdPuppetStream);
548 549 550
    }
}

551 552
void NodeInstanceServerProxy::printEditorProcessOutput()
{
553
    while (m_qmlPuppetEditorProcess && m_qmlPuppetEditorProcess->canReadLine()) {
554 555
        QByteArray line = m_qmlPuppetEditorProcess->readLine();
        line.chop(1);
556
        qDebug().nospace() << "Editor Puppet: " << line;
557 558 559 560 561 562
    }
    qDebug() << "\n";
}

void NodeInstanceServerProxy::printPreviewProcessOutput()
{
563
    while (m_qmlPuppetPreviewProcess && m_qmlPuppetPreviewProcess->canReadLine()) {
564 565
        QByteArray line = m_qmlPuppetPreviewProcess->readLine();
        line.chop(1);
566
        qDebug().nospace() << "Preview Puppet: " << line;
567 568 569 570 571 572
    }
    qDebug() << "\n";
}

void NodeInstanceServerProxy::printRenderProcessOutput()
{
573
    while (m_qmlPuppetRenderProcess && m_qmlPuppetRenderProcess->canReadLine()) {
574 575
        QByteArray line = m_qmlPuppetRenderProcess->readLine();
        line.chop(1);
576
        qDebug().nospace() << "Render Puppet: " << line;
577 578 579 580 581
    }

    qDebug() << "\n";
}

582 583 584 585 586 587 588 589 590 591 592 593
void NodeInstanceServerProxy::createInstances(const CreateInstancesCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

void NodeInstanceServerProxy::changeFileUrl(const ChangeFileUrlCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

void NodeInstanceServerProxy::createScene(const CreateSceneCommand &command)
{
594
    qCInfo(instanceViewBenchmark) << Q_FUNC_INFO << m_benchmarkTimer.elapsed();
595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
    writeCommand(QVariant::fromValue(command));
}

void NodeInstanceServerProxy::clearScene(const ClearSceneCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

void NodeInstanceServerProxy::removeInstances(const RemoveInstancesCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

void NodeInstanceServerProxy::removeProperties(const RemovePropertiesCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

void NodeInstanceServerProxy::changePropertyBindings(const ChangeBindingsCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

void NodeInstanceServerProxy::changePropertyValues(const ChangeValuesCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

623 624 625 626 627
void NodeInstanceServerProxy::changeAuxiliaryValues(const ChangeAuxiliaryCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

628 629 630 631 632 633 634 635 636 637 638 639 640 641 642
void NodeInstanceServerProxy::reparentInstances(const ReparentInstancesCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

void NodeInstanceServerProxy::changeIds(const ChangeIdsCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

void NodeInstanceServerProxy::changeState(const ChangeStateCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

643 644 645 646
void NodeInstanceServerProxy::completeComponent(const CompleteComponentCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}
647

648
void NodeInstanceServerProxy::changeNodeSource(const ChangeNodeSourceCommand &command)
649 650 651 652
{
    writeCommand(QVariant::fromValue(command));
}

653 654 655 656 657
void NodeInstanceServerProxy::token(const TokenCommand &command)
{
    writeCommand(QVariant::fromValue(command));
}

658 659 660 661 662
void NodeInstanceServerProxy::removeSharedMemory(const RemoveSharedMemoryCommand &command)
{
   writeCommand(QVariant::fromValue(command));
}

663 664 665 666 667
void NodeInstanceServerProxy::benchmark(const QString &message)
{
    qCInfo(instanceViewBenchmark) << message << m_benchmarkTimer.elapsed();
}

668
} // namespace QmlDesigner