diff --git a/qrenderdoc/Code/RemoteHost.cpp b/qrenderdoc/Code/RemoteHost.cpp new file mode 100644 index 000000000..b6680180f --- /dev/null +++ b/qrenderdoc/Code/RemoteHost.cpp @@ -0,0 +1,108 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2017 Baldur Karlsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +#include "RemoteHost.h" +#include +#include +#include "renderdoc_replay.h" + +RemoteHost::RemoteHost() +{ + ServerRunning = Connected = Busy = VersionMismatch = false; +} + +RemoteHost::RemoteHost(const QVariant &var) +{ + QVariantMap map = var.toMap(); + if(map.contains("Hostname")) + Hostname = map["Hostname"].toString(); + if(map.contains("RunCommand")) + RunCommand = map["RunCommand"].toString(); + + ServerRunning = Connected = Busy = VersionMismatch = false; +} + +RemoteHost::operator QVariant() const +{ + QVariantMap map; + map["Hostname"] = Hostname; + map["RunCommand"] = RunCommand; + return map; +} + +void RemoteHost::CheckStatus() +{ + // special case - this is the local context + if(Hostname == "localhost") + { + ServerRunning = false; + VersionMismatch = Busy = false; + return; + } + + RemoteServer *rend = NULL; + ReplayCreateStatus status = + RENDERDOC_CreateRemoteServerConnection(Hostname.toUtf8().data(), 0, &rend); + + if(status == eReplayCreate_Success) + { + ServerRunning = true; + VersionMismatch = Busy = false; + } + else if(status == eReplayCreate_NetworkRemoteBusy) + { + ServerRunning = true; + Busy = true; + VersionMismatch = false; + } + else if(status == eReplayCreate_NetworkVersionMismatch) + { + ServerRunning = true; + Busy = true; + VersionMismatch = true; + } + else + { + ServerRunning = false; + VersionMismatch = Busy = false; + } + + if(rend) + rend->ShutdownConnection(); + + // since we can only have one active client at once on a remote server, we need + // to avoid DDOS'ing by doing multiple CheckStatus() one after the other so fast + // that the active client can't be properly shut down. Sleeping here for a short + // time gives that breathing room. + // Not the most elegant solution, but it is simple + + QThread::msleep(15); +} + +void RemoteHost::Launch() +{ + QProcess process; + process.start(RunCommand); + process.waitForFinished(2000); +} diff --git a/qrenderdoc/Code/RemoteHost.h b/qrenderdoc/Code/RemoteHost.h new file mode 100644 index 000000000..db9cc585c --- /dev/null +++ b/qrenderdoc/Code/RemoteHost.h @@ -0,0 +1,48 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2017 Baldur Karlsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +#pragma once + +#include + +class RemoteHost +{ +public: + RemoteHost(); + RemoteHost(const QVariant &var); + + operator QVariant() const; + + bool isValid() { return !Hostname.isEmpty(); } + void CheckStatus(); + void Launch(); + + bool ServerRunning : 1; + bool Connected : 1; + bool Busy : 1; + bool VersionMismatch : 1; + + QString Hostname; + QString RunCommand; +}; \ No newline at end of file diff --git a/qrenderdoc/qrenderdoc.pro b/qrenderdoc/qrenderdoc.pro index 29b8dd7a5..ffce64b9d 100644 --- a/qrenderdoc/qrenderdoc.pro +++ b/qrenderdoc/qrenderdoc.pro @@ -102,6 +102,9 @@ SOURCES += Code/qrenderdoc.cpp \ Code/PersistantConfig.cpp \ Code/CaptureContext.cpp \ Code/ScintillaSyntax.cpp \ + Code/QRDUtils.cpp \ + Code/FormatElement.cpp \ + Code/RemoteHost.cpp \ Windows/Dialogs/AboutDialog.cpp \ Windows/MainWindow.cpp \ Windows/EventBrowser.cpp \ @@ -117,7 +120,6 @@ SOURCES += Code/qrenderdoc.cpp \ Widgets/RangeHistogram.cpp \ Windows/Dialogs/TextureSaveDialog.cpp \ Windows/Dialogs/CaptureDialog.cpp \ - Code/QRDUtils.cpp \ Windows/Dialogs/LiveCapture.cpp \ Widgets/Extended/RDListWidget.cpp \ Windows/APIInspector.cpp \ @@ -129,7 +131,6 @@ SOURCES += Code/qrenderdoc.cpp \ Widgets/Extended/RDTreeWidget.cpp \ Windows/ConstantBufferPreviewer.cpp \ Widgets/BufferFormatSpecifier.cpp \ - Code/FormatElement.cpp \ Windows/BufferViewer.cpp \ Widgets/Extended/RDTableView.cpp \ Windows/DebugMessageView.cpp \ @@ -144,6 +145,8 @@ HEADERS += Code/CaptureContext.h \ Code/PersistantConfig.h \ Code/CommonPipelineState.h \ Code/ScintillaSyntax.h \ + Code/RemoteHost.h \ + Code/QRDUtils.h \ Windows/Dialogs/AboutDialog.h \ Windows/MainWindow.h \ Windows/EventBrowser.h \ @@ -159,7 +162,6 @@ HEADERS += Code/CaptureContext.h \ Widgets/RangeHistogram.h \ Windows/Dialogs/TextureSaveDialog.h \ Windows/Dialogs/CaptureDialog.h \ - Code/QRDUtils.h \ Windows/Dialogs/LiveCapture.h \ Widgets/Extended/RDListWidget.h \ Windows/APIInspector.h \ diff --git a/qrenderdoc/qrenderdoc_local.vcxproj b/qrenderdoc/qrenderdoc_local.vcxproj index 4c25f6205..64810608a 100644 --- a/qrenderdoc/qrenderdoc_local.vcxproj +++ b/qrenderdoc/qrenderdoc_local.vcxproj @@ -489,6 +489,7 @@ + @@ -651,6 +652,7 @@ + diff --git a/qrenderdoc/qrenderdoc_local.vcxproj.filters b/qrenderdoc/qrenderdoc_local.vcxproj.filters index ec7779f3f..5312cd283 100644 --- a/qrenderdoc/qrenderdoc_local.vcxproj.filters +++ b/qrenderdoc/qrenderdoc_local.vcxproj.filters @@ -496,6 +496,9 @@ Generated Files + + Code + @@ -882,6 +885,9 @@ Widgets\Extended + + Code +