History

first cut at script caching

ZappoMan committed 11 years ago

Commit 36657c91 parent 099a2b58 files · +309 −4Browse files

Showing the changes to libraries/script-engine/src/ScriptCache.cpp (1 of 8 files). Show all

Unified · Split

libraries/script-engine/src/ScriptCache.cpp+146−0
@@ -0,0 +1,146 @@
1//
2// ScriptCache.cpp
3// libraries/script-engine/src
4//
5// Created by Brad Hefta-Gaub on 2015-03-30
6// Copyright 2015 High Fidelity, Inc.
7//
8// Distributed under the Apache License, Version 2.0.
9// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10//
11
12#include <QCoreApplication>
13#include <QEventLoop>
14#include <QNetworkAccessManager>
15#include <QNetworkReply>
16#include <QObject>
17
18#include <NetworkAccessManager.h>
19#include <SharedUtil.h>
20
21#include "ScriptCache.h"
22
23ScriptCache::ScriptCache(QObject* parent) {
24 // nothing to do here...
25}
26
27// QHash<QUrl, QString> _scriptCache;
28
29void ScriptCache::getScript(const QUrl& url, ScriptUser* scriptUser) {
30 if (_scriptCache.contains(url)) {
31 scriptUser->scriptContentsAvailable(url, _scriptCache[url]);
32 return;
33 }
34 _scriptUsers.insert(url, scriptUser);
35 QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
36 QNetworkRequest networkRequest = QNetworkRequest(url);
37 networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT);
38 QNetworkReply* reply = networkAccessManager.get(networkRequest);
39 connect(reply, &QNetworkReply::finished, this, &ScriptCache::scriptDownloaded);
40}
41
42void ScriptCache::scriptDownloaded() {
43 QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
44 QUrl url = reply->url();
45 QList<ScriptUser*> scriptUsers = _scriptUsers.values(url);
46 _scriptUsers.remove(url);
47
48 if (reply->error() == QNetworkReply::NoError && reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 200) {
49 _scriptCache[url] = reply->readAll();
50 qDebug() << "_scriptCache.size:" << _scriptCache.size();
51
52 foreach(ScriptUser* user, scriptUsers) {
53 user->scriptContentsAvailable(url, _scriptCache[url]);
54 }
55 } else {
56 qDebug() << "ERROR Loading file:" << reply->url().toString();
57 foreach(ScriptUser* user, scriptUsers) {
58 user->errorInLoadingScript(url);
59 }
60 }
61 reply->deleteLater();
62}
63
64QString ScriptCache::getScript(const QUrl& url) {
65 qDebug() << "Script requested: " << url.toString();
66 QString scriptContents;
67 if (_scriptCache.contains(url)) {
68 qDebug() << "Script found in cache: " << url.toString();
69 scriptContents = _scriptCache[url];
70 } else {
71 qDebug() << "Script not found in cache: " << url.toString();
72
73 if (_blockingScriptsPending.contains(url)) {
74 // if we're already downloading this script, wait for it to complete...
75 qDebug() << "Already downloading script: " << url.toString();
76 while (_blockingScriptsPending.contains(url)) {
77 QEventLoop loop;
78 qDebug() << "about to call loop.processEvents()....";
79 loop.processEvents(QEventLoop::AllEvents, 1);
80 qDebug() << "AFTER loop.processEvents()....";
81 }
82 qDebug() << "Done waiting on downloading script: " << url.toString();
83 scriptContents = _scriptCache[url];
84 } else {
85 _blockingScriptsPending.insert(url);
86 qDebug() << "_blockingScriptsPending: " << _blockingScriptsPending;
87
88 QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
89 QNetworkRequest networkRequest = QNetworkRequest(url);
90 networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT);
91 QNetworkReply* reply = networkAccessManager.get(networkRequest);
92
93
94 connect(reply, &QNetworkReply::finished, this, &ScriptCache::scriptDownloadedSyncronously);
95 qDebug() << "Downloading script at" << url.toString();
96 //QEventLoop loop;
97 //QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
98 //qDebug() << "starting loop....";
99 //loop.exec();
100 //qDebug() << "after loop....";
101
102 /*
103 if (reply->error() == QNetworkReply::NoError && reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 200) {
104 scriptContents = reply->readAll();
105 _scriptCache[url] = scriptContents;
106 qDebug() << "_scriptCache.size:" << _scriptCache.size();
107 } else {
108 qDebug() << "ERROR Loading file:" << url.toString();
109 }
110 delete reply;
111 _blockingScriptsPending.remove(url);
112 qDebug() << "_blockingScriptsPending: " << _blockingScriptsPending;
113 */
114 while (_blockingScriptsPending.contains(url)) {
115 QEventLoop loop;
116 qDebug() << "about to call loop.processEvents()....";
117 loop.processEvents(QEventLoop::AllEvents, 1);
118 qDebug() << "AFTER loop.processEvents()....";
119 }
120 qDebug() << "Done waiting on downloading script: " << url.toString();
121 scriptContents = _scriptCache[url];
122 }
123 }
124 return scriptContents;
125}
126
127void ScriptCache::scriptDownloadedSyncronously() {
128
129 qDebug() << "ScriptCache::scriptDownloadedSyncronously()....";
130
131 QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
132 QUrl url = reply->url();
133
134 if (reply->error() == QNetworkReply::NoError && reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 200) {
135 _scriptCache[url] = reply->readAll();
136 qDebug() << "_scriptCache.size:" << _scriptCache.size();
137 } else {
138 qDebug() << "ERROR Loading file:" << reply->url().toString();
139 }
140
141 reply->deleteLater();
142
143 _blockingScriptsPending.remove(url);
144 qDebug() << "_blockingScriptsPending: " << _blockingScriptsPending;
145}
146