From 34f7aa74f365516a4864638a00acf58a199be793 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 26 Aug 2015 14:26:09 -0700 Subject: [PATCH 1/6] Move SendAssetTask declaration to header --- assignment-client/src/assets/AssetServer.cpp | 37 ++++++-------------- assignment-client/src/assets/AssetServer.h | 19 ++++++++++ 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index c7f61abdd3..697b4b21ec 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -29,32 +29,17 @@ void writeError(NLPacketList* packetList, AssetServerError error) { packetList->writePrimitive(error); } -class SendAssetTask : public QRunnable { -public: - SendAssetTask(MessageID messageID, const QByteArray& assetHash, QString filePath, DataOffset start, DataOffset end, const SharedNodePointer& sendToNode) : - QRunnable(), - _messageID(messageID), - _assetHash(assetHash), - _filePath(filePath), - _start(start), - _end(end), - _sendToNode(sendToNode) - { - } - - void run(); - -signals: - void finished(); - -private: - MessageID _messageID; - QByteArray _assetHash; - QString _filePath; - DataOffset _start; - DataOffset _end; - SharedNodePointer _sendToNode; -}; +SendAssetTask::SendAssetTask(MessageID messageID, const QByteArray& assetHash, QString filePath, DataOffset start, DataOffset end, + const SharedNodePointer& sendToNode) : + QRunnable(), + _messageID(messageID), + _assetHash(assetHash), + _filePath(filePath), + _start(start), + _end(end), + _sendToNode(sendToNode) +{ +} void SendAssetTask::run() { qDebug() << "Starting task to send asset: " << _assetHash << " for messageID " << _messageID; diff --git a/assignment-client/src/assets/AssetServer.h b/assignment-client/src/assets/AssetServer.h index 94116b191e..485614d984 100644 --- a/assignment-client/src/assets/AssetServer.h +++ b/assignment-client/src/assets/AssetServer.h @@ -40,4 +40,23 @@ private: QThreadPool _taskPool; }; +class SendAssetTask : public QRunnable { +public: + SendAssetTask(MessageID messageID, const QByteArray& assetHash, QString filePath, DataOffset start, DataOffset end, + const SharedNodePointer& sendToNode); + + void run(); + +signals: + void finished(); + +private: + MessageID _messageID; + QByteArray _assetHash; + QString _filePath; + DataOffset _start; + DataOffset _end; + SharedNodePointer _sendToNode; +}; + #endif From d66c5212009270b447fa925b94266f81d4307869 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 26 Aug 2015 15:37:23 -0700 Subject: [PATCH 2/6] Move SendAssetTask to separate file --- assignment-client/src/assets/AssetServer.cpp | 70 ++---------------- assignment-client/src/assets/AssetServer.h | 21 +----- .../src/assets/SendAssetTask.cpp | 73 +++++++++++++++++++ assignment-client/src/assets/SendAssetTask.h | 41 +++++++++++ libraries/networking/src/AssetUtils.h | 2 + 5 files changed, 125 insertions(+), 82 deletions(-) create mode 100644 assignment-client/src/assets/SendAssetTask.cpp create mode 100644 assignment-client/src/assets/SendAssetTask.h diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 697b4b21ec..f8f3aa8d4c 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -21,74 +21,16 @@ #include #include -#include +#include "NetworkLogging.h" +#include "NodeType.h" +#include "SendAssetTask.h" const QString ASSET_SERVER_LOGGING_TARGET_NAME = "asset-server"; -void writeError(NLPacketList* packetList, AssetServerError error) { - packetList->writePrimitive(error); -} - -SendAssetTask::SendAssetTask(MessageID messageID, const QByteArray& assetHash, QString filePath, DataOffset start, DataOffset end, - const SharedNodePointer& sendToNode) : - QRunnable(), - _messageID(messageID), - _assetHash(assetHash), - _filePath(filePath), - _start(start), - _end(end), - _sendToNode(sendToNode) -{ -} - -void SendAssetTask::run() { - qDebug() << "Starting task to send asset: " << _assetHash << " for messageID " << _messageID; - auto replyPacketList = std::unique_ptr(new NLPacketList(PacketType::AssetGetReply, QByteArray(), true, true)); - - replyPacketList->write(_assetHash, HASH_HEX_LENGTH); - - replyPacketList->writePrimitive(_messageID); - - const int64_t MAX_LENGTH = 4294967296; - - if (_end <= _start) { - writeError(replyPacketList.get(), AssetServerError::INVALID_BYTE_RANGE); - } else if (_end - _start > MAX_LENGTH) { - writeError(replyPacketList.get(), AssetServerError::INVALID_BYTE_RANGE); - } else { - QFile file { _filePath }; - qDebug() << "Opening file: " << QString(QFileInfo(_assetHash).fileName()); - - if (file.open(QIODevice::ReadOnly)) { - if (file.size() < _end) { - writeError(replyPacketList.get(), AssetServerError::INVALID_BYTE_RANGE); - } else { - auto size = _end - _start; - file.seek(_start); - replyPacketList->writePrimitive(AssetServerError::NO_ERROR); - replyPacketList->writePrimitive(size); - while (file.pos() < file.size()) { - static const int chunkSize = 20000; - QByteArray data = file.read(chunkSize); - replyPacketList->write(data, chunkSize); - } - qDebug() << "Done reading"; - } - file.close(); - } else { - qDebug() << "Asset not found"; - writeError(replyPacketList.get(), AssetServerError::ASSET_NOT_FOUND); - } - } - - qDebug() << "Sending asset"; - auto nodeList = DependencyManager::get(); - nodeList->sendPacketList(std::move(replyPacketList), *_sendToNode); -} - AssetServer::AssetServer(NLPacket& packet) : - ThreadedAssignment(packet), - _taskPool(this) { + ThreadedAssignment(packet), + _taskPool(this) +{ // Most of the work will be I/O bound, reading from disk and constructing packet objects, // so the ideal is greater than the number of cores on the system. diff --git a/assignment-client/src/assets/AssetServer.h b/assignment-client/src/assets/AssetServer.h index 485614d984..7a9cbd36ef 100644 --- a/assignment-client/src/assets/AssetServer.h +++ b/assignment-client/src/assets/AssetServer.h @@ -40,23 +40,8 @@ private: QThreadPool _taskPool; }; -class SendAssetTask : public QRunnable { -public: - SendAssetTask(MessageID messageID, const QByteArray& assetHash, QString filePath, DataOffset start, DataOffset end, - const SharedNodePointer& sendToNode); - - void run(); - -signals: - void finished(); - -private: - MessageID _messageID; - QByteArray _assetHash; - QString _filePath; - DataOffset _start; - DataOffset _end; - SharedNodePointer _sendToNode; -}; +inline void writeError(NLPacketList* packetList, AssetServerError error) { + packetList->writePrimitive(error); +} #endif diff --git a/assignment-client/src/assets/SendAssetTask.cpp b/assignment-client/src/assets/SendAssetTask.cpp new file mode 100644 index 0000000000..559331342f --- /dev/null +++ b/assignment-client/src/assets/SendAssetTask.cpp @@ -0,0 +1,73 @@ +// +// SendAssetTask.cpp +// +// Created by Ryan Huffman on 2015/08/26 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "SendAssetTask.h" + +#include + +#include +#include +#include +#include +#include + +#include "AssetUtils.h" + +SendAssetTask::SendAssetTask(MessageID messageID, const QByteArray& assetHash, QString filePath, DataOffset start, DataOffset end, + const SharedNodePointer& sendToNode) : + QRunnable(), + _messageID(messageID), + _assetHash(assetHash), + _filePath(filePath), + _start(start), + _end(end), + _sendToNode(sendToNode) +{ +} + +void SendAssetTask::run() { + qDebug() << "Starting task to send asset: " << _assetHash << " for messageID " << _messageID; + auto replyPacketList = std::unique_ptr(new NLPacketList(PacketType::AssetGetReply, QByteArray(), true, true)); + + replyPacketList->write(_assetHash, HASH_HEX_LENGTH); + + replyPacketList->writePrimitive(_messageID); + + const int64_t MAX_LENGTH = 4294967296; + + if (_end <= _start) { + writeError(replyPacketList.get(), AssetServerError::INVALID_BYTE_RANGE); + } else if (_end - _start > MAX_LENGTH) { + writeError(replyPacketList.get(), AssetServerError::INVALID_BYTE_RANGE); + } else { + QFile file { _filePath }; + + if (file.open(QIODevice::ReadOnly)) { + if (file.size() < _end) { + writeError(replyPacketList.get(), AssetServerError::INVALID_BYTE_RANGE); + qCDebug(networking) << "Bad byte range: " << _assetHash << " " << _start << ":" << _end; + } else { + auto size = _end - _start; + file.seek(_start); + replyPacketList->writePrimitive(AssetServerError::NO_ERROR); + replyPacketList->writePrimitive(size); + replyPacketList->write(file.read(size)); + } + file.close(); + qCDebug(networking) << "Sending asset: " << _assetHash; + } else { + qCDebug(networking) << "Asset not found: " << _assetHash; + writeError(replyPacketList.get(), AssetServerError::ASSET_NOT_FOUND); + } + } + + auto nodeList = DependencyManager::get(); + nodeList->sendPacketList(std::move(replyPacketList), *_sendToNode); +} diff --git a/assignment-client/src/assets/SendAssetTask.h b/assignment-client/src/assets/SendAssetTask.h new file mode 100644 index 0000000000..7dd3616f83 --- /dev/null +++ b/assignment-client/src/assets/SendAssetTask.h @@ -0,0 +1,41 @@ +// +// SendAssetTask.h +// +// Created by Ryan Huffman on 2015/08/26 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_SendAssetTask_h +#define hifi_SendAssetTask_h + +#include +#include +#include + +#include "AssetUtils.h" +#include "AssetServer.h" +#include "Node.h" + +class SendAssetTask : public QRunnable { +public: + SendAssetTask(MessageID messageID, const QByteArray& assetHash, QString filePath, DataOffset start, DataOffset end, + const SharedNodePointer& sendToNode); + + void run(); + +signals: + void finished(); + +private: + MessageID _messageID; + QByteArray _assetHash; + QString _filePath; + DataOffset _start; + DataOffset _end; + SharedNodePointer _sendToNode; +}; + +#endif diff --git a/libraries/networking/src/AssetUtils.h b/libraries/networking/src/AssetUtils.h index 904fa71da2..c23b54de5d 100644 --- a/libraries/networking/src/AssetUtils.h +++ b/libraries/networking/src/AssetUtils.h @@ -11,6 +11,8 @@ #ifndef hifi_AssetUtils_h #define hifi_AssetUtils_h +#include "NLPacketList.h" + using MessageID = uint32_t; using DataOffset = int64_t; From 287f2533eb32958ffd595f979dd99e35e5e01337 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 26 Aug 2015 15:37:38 -0700 Subject: [PATCH 3/6] Remove AssetServer dtor --- assignment-client/src/assets/AssetServer.cpp | 3 --- assignment-client/src/assets/AssetServer.h | 1 - 2 files changed, 4 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index f8f3aa8d4c..f89b288f9c 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -42,9 +42,6 @@ AssetServer::AssetServer(NLPacket& packet) : packetReceiver.registerMessageListener(PacketType::AssetUpload, this, "handleAssetUpload"); } -AssetServer::~AssetServer() { -} - void AssetServer::run() { ThreadedAssignment::commonInit(ASSET_SERVER_LOGGING_TARGET_NAME, NodeType::AssetServer); diff --git a/assignment-client/src/assets/AssetServer.h b/assignment-client/src/assets/AssetServer.h index 7a9cbd36ef..07e0680c4f 100644 --- a/assignment-client/src/assets/AssetServer.h +++ b/assignment-client/src/assets/AssetServer.h @@ -22,7 +22,6 @@ class AssetServer : public ThreadedAssignment { Q_OBJECT public: AssetServer(NLPacket& packet); - ~AssetServer(); static QString hashData(const QByteArray& data); From 4ed5748afaaadc3fa419861461514e4466c78900 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 26 Aug 2015 15:37:58 -0700 Subject: [PATCH 4/6] Fix new asset loading in directory --- assignment-client/src/assets/AssetServer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index f89b288f9c..2c294e652c 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -58,8 +58,8 @@ void AssetServer::run() { // Scan for new files qDebug() << "Looking for new files in asset directory"; auto files = _resourcesDirectory.entryInfoList(QDir::Files); - QRegExp filenameRegex { "^[a-f0-9]{32}(\\..+)?$" }; - for (auto fileInfo : files) { + QRegExp filenameRegex { "^[a-f0-9]{" + QString::number(HASH_HEX_LENGTH) + "}(\\..+)?$" }; + for (const auto& fileInfo : files) { auto filename = fileInfo.fileName(); if (!filenameRegex.exactMatch(filename)) { qDebug() << "Found file: " << filename; From 59b32751f0efc2266335498d1886dcc398da4acd Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 26 Aug 2015 15:54:02 -0700 Subject: [PATCH 5/6] Cleanup AssetScriptingInterface --- interface/src/AssetScriptingInterface.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/interface/src/AssetScriptingInterface.cpp b/interface/src/AssetScriptingInterface.cpp index 267f0cc25e..863d2ae3e7 100644 --- a/interface/src/AssetScriptingInterface.cpp +++ b/interface/src/AssetScriptingInterface.cpp @@ -27,7 +27,6 @@ AssetScriptingInterface::AssetScriptingInterface() { QScriptValue AssetScriptingInterface::getAsset(QString url, QScriptValue callback) { auto assetClient = DependencyManager::get(); - // auto request = assetClient->requestAsset(url); auto request = assetClient->create(url); if (!request) { @@ -42,11 +41,6 @@ QScriptValue AssetScriptingInterface::getAsset(QString url, QScriptValue callbac request->start(); - // bool success = AssetManager::getAsset(QUrl(url), [callback](AssetRequestUpdateType type, QByteArray data) mutable { - // auto result = callback.engine()->newVariant(data); - // QList arguments { type == AssetRequestUpdateType::COMPLETE, result }; - // callback.call(QScriptValue(), arguments); - // }); return true; } From 4105b7369cd4815e5c3ead6797edb373bb9732c5 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 26 Aug 2015 15:55:29 -0700 Subject: [PATCH 6/6] Remove AssetScriptingInterface --- interface/src/Application.cpp | 4 -- interface/src/AssetScriptingInterface.cpp | 53 ----------------------- interface/src/AssetScriptingInterface.h | 31 ------------- 3 files changed, 88 deletions(-) delete mode 100644 interface/src/AssetScriptingInterface.cpp delete mode 100644 interface/src/AssetScriptingInterface.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 5974a33230..d94cff19f1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -53,7 +53,6 @@ #include #include #include -#include #include #include #include @@ -300,7 +299,6 @@ bool setupEssentials(int& argc, char** argv) { auto pathUtils = DependencyManager::set(); auto actionFactory = DependencyManager::set(); auto assetClient = DependencyManager::set(); - auto assetScriptingInterface = DependencyManager::set(); auto userInputMapper = DependencyManager::set(); return true; @@ -3987,8 +3985,6 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri qScriptRegisterMetaType(scriptEngine, RayToOverlayIntersectionResultToScriptValue, RayToOverlayIntersectionResultFromScriptValue); - scriptEngine->registerGlobalObject("Assets", DependencyManager::get().data()); - scriptEngine->registerGlobalObject("Desktop", DependencyManager::get().data()); QScriptValue windowValue = scriptEngine->registerGlobalObject("Window", DependencyManager::get().data()); diff --git a/interface/src/AssetScriptingInterface.cpp b/interface/src/AssetScriptingInterface.cpp deleted file mode 100644 index 863d2ae3e7..0000000000 --- a/interface/src/AssetScriptingInterface.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// -// AssetScriptingInterface.cpp -// -// Created by Ryan Huffman on 2015/07/22 -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "AssetScriptingInterface.h" - -#include - -#include -#include -#include -#include -#include -#include - -#include - -AssetScriptingInterface::AssetScriptingInterface() { -} - -QScriptValue AssetScriptingInterface::getAsset(QString url, QScriptValue callback) { - - auto assetClient = DependencyManager::get(); - auto request = assetClient->create(url); - - if (!request) { - return false; - } - - connect(request, &AssetRequest::finished, [callback](AssetRequest* req) mutable { - auto result = callback.engine()->newVariant(req->getData()); - QList arguments { true, result }; - callback.call(QScriptValue(), arguments); - }); - - request->start(); - - return true; -} - -QScriptValue AssetScriptingInterface::uploadAsset(QString data, QString extension, QScriptValue callback) { - auto assetClient = DependencyManager::get(); - return assetClient->uploadAsset(data.toLatin1(), extension, [callback](bool success, QString hash) mutable { - QList arguments { success, hash }; - auto result = callback.call(QScriptValue(), arguments); - }); -} diff --git a/interface/src/AssetScriptingInterface.h b/interface/src/AssetScriptingInterface.h deleted file mode 100644 index 8c0f7a71a1..0000000000 --- a/interface/src/AssetScriptingInterface.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// AssetScriptingInterface.h -// -// Created by Ryan Huffman on 2015/07/22 -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_AssetScriptingInterface_h -#define hifi_AssetScriptingInterface_h - -#include -#include - -#include -#include -#include - -class AssetScriptingInterface : public QObject, public Dependency { - Q_OBJECT -public: - AssetScriptingInterface(); - -public slots: - QScriptValue getAsset(QString hash, QScriptValue callback); - QScriptValue uploadAsset(QString data, QString extension, QScriptValue callback); -}; - -#endif