From 0f6162d68389ec29d1c65c4f032938ffd7ecfdf8 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 3 May 2016 15:32:08 -0700 Subject: [PATCH 01/18] Use appropriate units for timing tests --- interface/src/Util.cpp | 74 +++++++++++++---------- libraries/shared/src/NumericalConstants.h | 1 + 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 43c52916fe..073d0a18a8 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -136,66 +136,76 @@ void runTimingTests() { float fTest = 1.0; float* fResults = (float*)malloc(sizeof(float) * numTests); QElapsedTimer startTime; - startTime.start(); - float elapsedUsecs; + float elapsedNSecs; + float elapsedUSecs; - float NSEC_TO_USEC = 1.0f / 1000.0f; - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; - qCDebug(interfaceapp, "QElapsedTimer::nsecElapsed() usecs: %f", (double)elapsedUsecs); + startTime.start(); + elapsedNSecs = (float)startTime.nsecsElapsed(); + qCDebug(interfaceapp, "QElapsedTimer::nsecElapsed() ns: %f", (double)elapsedNSecs); // Test sleep functions for accuracy startTime.start(); QThread::msleep(1); - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; - qCDebug(interfaceapp, "QThread::msleep(1) ms: %f", (double)(elapsedUsecs / 1000.0f)); + elapsedNSecs = (float)startTime.nsecsElapsed(); + qCDebug(interfaceapp, "QThread::msleep(1) ms: %f", (double)(elapsedNSecs / NSECS_PER_MSEC)); startTime.start(); QThread::sleep(1); - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; - qCDebug(interfaceapp, "QThread::sleep(1) ms: %f", (double)(elapsedUsecs / 1000.0f)); + elapsedNSecs = (float)startTime.nsecsElapsed(); + qCDebug(interfaceapp, "QThread::sleep(1) s: %f", (double)(elapsedNSecs / NSECS_PER_MSEC / MSECS_PER_SECOND)); startTime.start(); usleep(1); - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; - qCDebug(interfaceapp, "usleep(1) ms: %f", (double)(elapsedUsecs / 1000.0f)); + elapsedNSecs = (float)startTime.nsecsElapsed(); + qCDebug(interfaceapp, "usleep(1) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); startTime.start(); usleep(10); - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; - qCDebug(interfaceapp, "usleep(10) ms: %f", (double)(elapsedUsecs / 1000.0f)); + elapsedNSecs = (float)startTime.nsecsElapsed(); + qCDebug(interfaceapp, "usleep(10) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); startTime.start(); usleep(100); - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; - qCDebug(interfaceapp, "usleep(100) ms: %f", (double)(elapsedUsecs / 1000.0f)); + elapsedNSecs = (float)startTime.nsecsElapsed(); + qCDebug(interfaceapp, "usleep(100) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); startTime.start(); usleep(1000); - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; - qCDebug(interfaceapp, "usleep(1000) ms: %f", (double)(elapsedUsecs / 1000.0f)); + elapsedNSecs = (float)startTime.nsecsElapsed(); + qCDebug(interfaceapp, "usleep(1000) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); + + startTime.start(); + usleep(1500); + elapsedNSecs = (float)startTime.nsecsElapsed(); + qCDebug(interfaceapp, "usleep(1500) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); + + startTime.start(); + usleep(2500); + elapsedNSecs = (float)startTime.nsecsElapsed(); + qCDebug(interfaceapp, "usleep(2500) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); startTime.start(); usleep(15000); - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; - qCDebug(interfaceapp, "usleep(15000) ms: %f", (double)(elapsedUsecs / 1000.0f)); + elapsedNSecs = (float)startTime.nsecsElapsed(); + qCDebug(interfaceapp, "usleep(15000) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); // Random number generation startTime.start(); for (int i = 0; i < numTests; i++) { iResults[i] = rand(); } - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; + elapsedUSecs = (float)startTime.nsecsElapsed() / NSECS_PER_USEC; qCDebug(interfaceapp, "rand() stored in array usecs: %f, first result:%d", - (double)(elapsedUsecs / numTests), iResults[0]); + (double)(elapsedUSecs / numTests), iResults[0]); // Random number generation using randFloat() startTime.start(); for (int i = 0; i < numTests; i++) { fResults[i] = randFloat(); } - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; + elapsedUSecs = (float)startTime.nsecsElapsed() / NSECS_PER_USEC; qCDebug(interfaceapp, "randFloat() stored in array usecs: %f, first result: %f", - (double)(elapsedUsecs / numTests), (double)(fResults[0])); + (double)(elapsedUSecs / numTests), (double)(fResults[0])); free(iResults); free(fResults); @@ -206,8 +216,8 @@ void runTimingTests() { for (int i = 0; i < numTests; i++) { fTest = powf(fTest, 0.5f); } - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; - qCDebug(interfaceapp, "powf(f, 0.5) usecs: %f", (double)(elapsedUsecs / (float) numTests)); + elapsedUSecs = (float)startTime.nsecsElapsed() / NSECS_PER_USEC; + qCDebug(interfaceapp, "powf(f, 0.5) usecs: %f", (double)(elapsedUSecs / (float) numTests)); // Vector Math float distance; @@ -218,9 +228,9 @@ void runTimingTests() { //float distanceSquared = glm::dot(temp, temp); distance = glm::distance(pointA, pointB); } - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; + elapsedUSecs = (float)startTime.nsecsElapsed() / NSECS_PER_USEC; qCDebug(interfaceapp, "vector math usecs: %f [%f usecs total for %d tests], last result:%f", - (double)(elapsedUsecs / (float) numTests), (double)elapsedUsecs, numTests, (double)distance); + (double)(elapsedUSecs / (float) numTests), (double)elapsedUSecs, numTests, (double)distance); // Vec3 test glm::vec3 vecA(randVector()), vecB(randVector()); @@ -231,9 +241,9 @@ void runTimingTests() { glm::vec3 temp = vecA-vecB; result = glm::dot(temp,temp); } - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; + elapsedUSecs = (float)startTime.nsecsElapsed() / NSECS_PER_USEC; qCDebug(interfaceapp, "vec3 assign and dot() usecs: %f, last result:%f", - (double)(elapsedUsecs / numTests), (double)result); + (double)(elapsedUSecs / numTests), (double)result); quint64 BYTE_CODE_MAX_TEST_VALUE = 99999999; @@ -265,9 +275,9 @@ void runTimingTests() { } } - elapsedUsecs = (float)startTime.nsecsElapsed() * NSEC_TO_USEC; - qCDebug(interfaceapp) << "ByteCountCoded usecs: " << elapsedUsecs - << "per test:" << (double) (elapsedUsecs / tests) + elapsedUSecs = (float)startTime.nsecsElapsed() / NSECS_PER_USEC; + qCDebug(interfaceapp) << "ByteCountCoded usecs: " << elapsedUSecs + << "per test:" << (double) (elapsedUSecs / tests) << "tests:" << tests << "failed:" << failed; } diff --git a/libraries/shared/src/NumericalConstants.h b/libraries/shared/src/NumericalConstants.h index cf78f6dbf3..ca18d8ad5e 100644 --- a/libraries/shared/src/NumericalConstants.h +++ b/libraries/shared/src/NumericalConstants.h @@ -35,6 +35,7 @@ const float METERS_PER_CENTIMETER = 0.01f; const float METERS_PER_MILLIMETER = 0.001f; const float MILLIMETERS_PER_METER = 1000.0f; const quint64 NSECS_PER_USEC = 1000; +const quint64 NSECS_PER_MSEC = 1000000; const quint64 USECS_PER_MSEC = 1000; const quint64 MSECS_PER_SECOND = 1000; const quint64 USECS_PER_SECOND = USECS_PER_MSEC * MSECS_PER_SECOND; From 3619821b826115ae250d890bbc7b4da8ff28ed0e Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 4 May 2016 12:44:11 -0700 Subject: [PATCH 02/18] Improve timing tests with averages --- interface/src/Util.cpp | 71 +++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 073d0a18a8..00715bcd69 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -131,63 +131,84 @@ const glm::vec3 randVector() { // Do some basic timing tests and report the results void runTimingTests() { // How long does it take to make a call to get the time? - const int numTests = 1000000; - int* iResults = (int*)malloc(sizeof(int) * numTests); - float fTest = 1.0; - float* fResults = (float*)malloc(sizeof(float) * numTests); + const int numTimingTests = 3; QElapsedTimer startTime; float elapsedNSecs; float elapsedUSecs; + qCDebug(interfaceapp, "numTimingTests: %d", numTimingTests); + startTime.start(); elapsedNSecs = (float)startTime.nsecsElapsed(); - qCDebug(interfaceapp, "QElapsedTimer::nsecElapsed() ns: %f", (double)elapsedNSecs); + qCDebug(interfaceapp, "QElapsedTimer::nsecElapsed() ns: %f", (double)elapsedNSecs / numTimingTests); // Test sleep functions for accuracy startTime.start(); - QThread::msleep(1); + for (int i = 0; i < numTimingTests; i++) { + QThread::msleep(1); + } elapsedNSecs = (float)startTime.nsecsElapsed(); - qCDebug(interfaceapp, "QThread::msleep(1) ms: %f", (double)(elapsedNSecs / NSECS_PER_MSEC)); + qCDebug(interfaceapp, "QThread::msleep(1) ms: %f", (double)(elapsedNSecs / NSECS_PER_MSEC / numTimingTests)); startTime.start(); - QThread::sleep(1); + for (int i = 0; i < numTimingTests; i++) { + QThread::sleep(1); + } elapsedNSecs = (float)startTime.nsecsElapsed(); - qCDebug(interfaceapp, "QThread::sleep(1) s: %f", (double)(elapsedNSecs / NSECS_PER_MSEC / MSECS_PER_SECOND)); + qCDebug(interfaceapp, "QThread::sleep(1) s: %f", (double)(elapsedNSecs / NSECS_PER_MSEC / MSECS_PER_SECOND / numTimingTests)); + + const int numUsecTests = 1000; + startTime.start(); + for (int i = 0; i < numUsecTests; i++) { + usleep(1); + } + elapsedNSecs = (float)startTime.nsecsElapsed(); + qCDebug(interfaceapp, "usleep(1) (1000x) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC / numUsecTests)); startTime.start(); - usleep(1); + for (int i = 0; i < numUsecTests; i++) { + usleep(10); + } elapsedNSecs = (float)startTime.nsecsElapsed(); - qCDebug(interfaceapp, "usleep(1) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); + qCDebug(interfaceapp, "usleep(10) (1000x) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC / numUsecTests)); startTime.start(); - usleep(10); + for (int i = 0; i < numUsecTests; i++) { + usleep(100); + } elapsedNSecs = (float)startTime.nsecsElapsed(); - qCDebug(interfaceapp, "usleep(10) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); + qCDebug(interfaceapp, "usleep(100) (1000x) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC / numUsecTests)); startTime.start(); - usleep(100); + for (int i = 0; i < numTimingTests; i++) { + usleep(1000); + } elapsedNSecs = (float)startTime.nsecsElapsed(); - qCDebug(interfaceapp, "usleep(100) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); + qCDebug(interfaceapp, "usleep(1000) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC / numTimingTests)); startTime.start(); - usleep(1000); + for (int i = 0; i < numTimingTests; i++) { + usleep(1001); + } elapsedNSecs = (float)startTime.nsecsElapsed(); - qCDebug(interfaceapp, "usleep(1000) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); + qCDebug(interfaceapp, "usleep(1001) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC / numTimingTests)); startTime.start(); - usleep(1500); + for (int i = 0; i < numTimingTests; i++) { + usleep(1500); + } elapsedNSecs = (float)startTime.nsecsElapsed(); - qCDebug(interfaceapp, "usleep(1500) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); - - startTime.start(); - usleep(2500); - elapsedNSecs = (float)startTime.nsecsElapsed(); - qCDebug(interfaceapp, "usleep(2500) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); + qCDebug(interfaceapp, "usleep(1500) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC / numTimingTests)); startTime.start(); usleep(15000); elapsedNSecs = (float)startTime.nsecsElapsed(); - qCDebug(interfaceapp, "usleep(15000) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); + qCDebug(interfaceapp, "usleep(15000) (1x) us: %f", (double)(elapsedNSecs / NSECS_PER_USEC)); + + const int numTests = 1000000; + int* iResults = (int*)malloc(sizeof(int) * numTests); + float fTest = 1.0; + float* fResults = (float*)malloc(sizeof(float) * numTests); // Random number generation startTime.start(); From 526143b097039dad5bee78f86b3c6018cef899cd Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 3 May 2016 16:25:09 -0700 Subject: [PATCH 03/18] Improve perf of Win32 usleep --- libraries/shared/src/SharedUtil.cpp | 32 +++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index 7925c8ad4e..615ba26812 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -455,19 +455,29 @@ void printVoxelCode(unsigned char* voxelCode) { } #ifdef _WIN32 - void usleep(int waitTime) { - const quint64 BUSY_LOOP_USECS = 2000; - quint64 compTime = waitTime + usecTimestampNow(); - quint64 compTimeSleep = compTime - BUSY_LOOP_USECS; - while (true) { - if (usecTimestampNow() < compTimeSleep) { - QThread::msleep(1); - } - if (usecTimestampNow() >= compTime) { - break; - } +void usleep(int waitTime) { + quint64 sleepUntil = waitTime + usecTimestampNow(); + + // Busy wait with sleep/yield where possible + while (true) { + quint64 now = usecTimestampNow(); + if (now >= sleepUntil) { + break; + } + + // Sleep if we have at least 1ms to spare + const int MIN_SLEEP_USECS = 1000; + // msleep is allowed to overshoot, so give it a 100us berth + const int MIN_SLEEP_USECS_BERTH = 100; + if (sleepUntil - now > (MIN_SLEEP_USECS + MIN_SLEEP_USECS_BERTH)) { + unsigned long sleepFor = (sleepUntil - now - MIN_SLEEP_USECS_BERTH) / USECS_PER_MSEC; + QThread::msleep(sleepFor); + // Yield otherwise + } else { + QThread::yieldCurrentThread(); } } +} #endif // Inserts the value and key into three arrays sorted by the key array, the first array is the value, From 1553f532ba11c34da25829166f38e23585c5ccbf Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 4 May 2016 15:40:53 -0700 Subject: [PATCH 04/18] Specialize usleep for Win32 --- libraries/shared/src/SharedUtil.cpp | 31 +++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index 615ba26812..b80fac637c 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -456,24 +456,39 @@ void printVoxelCode(unsigned char* voxelCode) { #ifdef _WIN32 void usleep(int waitTime) { - quint64 sleepUntil = waitTime + usecTimestampNow(); + // Use QueryPerformanceCounter for least overhead + LARGE_INTEGER now; // ticks + QueryPerformanceCounter(&now); + + static int64_t ticksPerSec = 0; + if (ticksPerSec == 0) { + LARGE_INTEGER frequency; + QueryPerformanceFrequency(&frequency); + ticksPerSec = frequency.QuadPart; + } + + // order ops to avoid loss in precision + int64_t waitTicks = (ticksPerSec * waitTime) / USECS_PER_SECOND; + int64_t sleepTicks = now.QuadPart + waitTicks; // Busy wait with sleep/yield where possible while (true) { - quint64 now = usecTimestampNow(); - if (now >= sleepUntil) { + QueryPerformanceCounter(&now); + if (now.QuadPart >= sleepTicks) { break; } // Sleep if we have at least 1ms to spare - const int MIN_SLEEP_USECS = 1000; + const int64_t MIN_SLEEP_USECS = 1000; // msleep is allowed to overshoot, so give it a 100us berth - const int MIN_SLEEP_USECS_BERTH = 100; - if (sleepUntil - now > (MIN_SLEEP_USECS + MIN_SLEEP_USECS_BERTH)) { - unsigned long sleepFor = (sleepUntil - now - MIN_SLEEP_USECS_BERTH) / USECS_PER_MSEC; - QThread::msleep(sleepFor); + const int64_t MIN_SLEEP_USECS_BERTH = 100; + // order ops to avoid loss in precision + int64_t sleepFor = ((sleepTicks - now.QuadPart) * USECS_PER_SECOND) / ticksPerSec - MIN_SLEEP_USECS_BERTH; + if (sleepFor > MIN_SLEEP_USECS) { + Sleep((DWORD)(sleepFor / USECS_PER_MSEC)); // Yield otherwise } else { + // Use Qt to delegate, as SwitchToThread is only supported starting with XP QThread::yieldCurrentThread(); } } From 67b1015f4a2b173e06dc1d3ddceab8b0db979acf Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Thu, 5 May 2016 14:54:04 -0700 Subject: [PATCH 05/18] re add users to default, default to visible friends only --- interface/src/DiscoverabilityManager.cpp | 2 +- scripts/defaultScripts.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index 230f4202c8..46aabe8702 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -20,7 +20,7 @@ #include "DiscoverabilityManager.h" #include "Menu.h" -const Discoverability::Mode DEFAULT_DISCOVERABILITY_MODE = Discoverability::All; +const Discoverability::Mode DEFAULT_DISCOVERABILITY_MODE = Discoverability::Friends; DiscoverabilityManager::DiscoverabilityManager() : _mode("discoverabilityMode", DEFAULT_DISCOVERABILITY_MODE) diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js index ceccf20647..3904d97a91 100644 --- a/scripts/defaultScripts.js +++ b/scripts/defaultScripts.js @@ -8,9 +8,10 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -Script.load("system/away.js"); -Script.load("system/progress.js"); Script.load("system/edit.js"); +Script.load("system/progress.js"); +Script.load("system/away.js"); +Script.load("system/users.js"); Script.load("system/examples.js"); Script.load("system/selectAudioDevice.js"); Script.load("system/notifications.js"); From d1755649b1e0e7129ecf1ef0830fdf194b157d7e Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Thu, 5 May 2016 14:55:41 -0700 Subject: [PATCH 06/18] order --- scripts/defaultScripts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js index 3904d97a91..9b11fa73cc 100644 --- a/scripts/defaultScripts.js +++ b/scripts/defaultScripts.js @@ -8,11 +8,12 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -Script.load("system/edit.js"); + Script.load("system/progress.js"); Script.load("system/away.js"); Script.load("system/users.js"); Script.load("system/examples.js"); +Script.load("system/edit.js"); Script.load("system/selectAudioDevice.js"); Script.load("system/notifications.js"); Script.load("system/controllers/handControllerGrab.js"); From 97e1621776d5950fc6d8a3afb27a327c81f9a9cd Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Thu, 5 May 2016 15:02:16 -0700 Subject: [PATCH 07/18] increase width --- scripts/system/users.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/users.js b/scripts/system/users.js index 91d552dd40..9612a19eee 100644 --- a/scripts/system/users.js +++ b/scripts/system/users.js @@ -222,7 +222,7 @@ var usersWindow = (function() { var baseURL = Script.resolvePath("assets/images/tools/"); - var WINDOW_WIDTH = 160, + var WINDOW_WIDTH = 260, WINDOW_MARGIN = 12, WINDOW_BASE_MARGIN = 6, // A little less is needed in order look correct WINDOW_FONT = { From f65b15803a48335e847d52233fdae71e2c7650de Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 5 May 2016 15:04:39 -0700 Subject: [PATCH 08/18] Fix potential iterator invalidation --- libraries/physics/src/PhysicsEngine.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index 5523abf4e2..d3247ec62c 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -225,9 +225,7 @@ void PhysicsEngine::removeContacts(ObjectMotionState* motionState) { ContactMap::iterator contactItr = _contactMap.begin(); while (contactItr != _contactMap.end()) { if (contactItr->first._a == motionState || contactItr->first._b == motionState) { - ContactMap::iterator iterToDelete = contactItr; - ++contactItr; - _contactMap.erase(iterToDelete); + contactItr = _contactMap.erase(contactItr); } else { ++contactItr; } @@ -386,9 +384,7 @@ const CollisionEvents& PhysicsEngine::getCollisionEvents() { } if (type == CONTACT_EVENT_TYPE_END) { - ContactMap::iterator iterToDelete = contactItr; - ++contactItr; - _contactMap.erase(iterToDelete); + contactItr = _contactMap.erase(contactItr); } else { ++contactItr; } From 96174468b3b3ac36d187188cca4f52086a028217 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 5 May 2016 15:27:30 -0700 Subject: [PATCH 09/18] use reliable and ordered packets for avatar identity --- libraries/avatars/src/AvatarData.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 7db55d50e0..fd13f8c370 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1193,10 +1193,15 @@ void AvatarData::sendIdentityPacket() { QByteArray identityData = identityByteArray(); - auto identityPacket = NLPacket::create(PacketType::AvatarIdentity, identityData.size()); - identityPacket->write(identityData); - - nodeList->broadcastToNodes(std::move(identityPacket), NodeSet() << NodeType::AvatarMixer); + auto packetList = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); + packetList->write(identityData); + nodeList->eachMatchingNode( + [&](const SharedNodePointer& node)->bool { + return node->getType() == NodeType::AvatarMixer && node->getActiveSocket(); + }, + [&](const SharedNodePointer& node) { + nodeList->sendPacketList(std::move(packetList), *node); + }); } void AvatarData::sendBillboardPacket() { From 0ea46cb4155cbdae47e854b6eb2fa0146853804b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 5 May 2016 15:35:37 -0700 Subject: [PATCH 10/18] send fallback socket, don't send HB if send usage disabled --- interface/src/DiscoverabilityManager.cpp | 19 +++++++++++++++---- libraries/networking/src/UserActivityLogger.h | 2 ++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index 230f4202c8..bc1403aa46 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "DiscoverabilityManager.h" @@ -44,6 +45,7 @@ void DiscoverabilityManager::updateLocation() { QJsonObject rootObject; QJsonObject locationObject; + QString pathString = addressManager->currentPath(); @@ -56,13 +58,22 @@ void DiscoverabilityManager::updateLocation() { const QString PLACE_ID_KEY_IN_LOCATION = "place_id"; locationObject.insert(PLACE_ID_KEY_IN_LOCATION, uuidStringWithoutCurlyBraces(addressManager->getRootPlaceID())); - - } else { + } + + if (!domainHandler.getUUID().isNull()) { const QString DOMAIN_ID_KEY_IN_LOCATION = "domain_id"; locationObject.insert(DOMAIN_ID_KEY_IN_LOCATION, uuidStringWithoutCurlyBraces(domainHandler.getUUID())); } - + + // in case the place/domain isn't in the database, we send the network address and port + auto& domainSockAddr = domainHandler.getSockAddr(); + const QString NETWORK_ADRESS_KEY_IN_LOCATION = "network_address"; + locationObject.insert(NETWORK_ADRESS_KEY_IN_LOCATION, domainSockAddr.getAddress().toString()); + + const QString NETWORK_ADDRESS_PORT_IN_LOCATION = "network_port"; + locationObject.insert(NETWORK_ADDRESS_PORT_IN_LOCATION, domainSockAddr.getPort()); + const QString FRIENDS_ONLY_KEY_IN_LOCATION = "friends_only"; locationObject.insert(FRIENDS_ONLY_KEY_IN_LOCATION, (_mode.get() == Discoverability::Friends)); @@ -72,7 +83,7 @@ void DiscoverabilityManager::updateLocation() { QNetworkAccessManager::PutOperation, JSONCallbackParameters(), QJsonDocument(rootObject).toJson()); } - } else { + } else if (UserActivityLogger::getInstance().isEnabled()) { // we still send a heartbeat to the metaverse server for stats collection const QString API_USER_HEARTBEAT_PATH = "/api/v1/user/heartbeat"; accountManager.sendRequest(API_USER_HEARTBEAT_PATH, AccountManagerAuth::Required, QNetworkAccessManager::PutOperation); diff --git a/libraries/networking/src/UserActivityLogger.h b/libraries/networking/src/UserActivityLogger.h index 5c1cb03e3a..c2ab93db2f 100644 --- a/libraries/networking/src/UserActivityLogger.h +++ b/libraries/networking/src/UserActivityLogger.h @@ -28,6 +28,8 @@ public: static UserActivityLogger& getInstance(); public slots: + bool isEnabled() { return !_disabled.get(); } + void disable(bool disable); void logAction(QString action, QJsonObject details = QJsonObject(), JSONCallbackParameters params = JSONCallbackParameters()); From 839c7fb8c2f6cd06d4dc3d74f379d398ab812f20 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 5 May 2016 15:45:11 -0700 Subject: [PATCH 11/18] provide session ID for metaverse heartbeat once received --- interface/src/DiscoverabilityManager.cpp | 28 ++++++++++++++++++- interface/src/DiscoverabilityManager.h | 6 +++- .../networking/src/NetworkingConstants.h | 4 +-- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index bc1403aa46..4338addb55 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -31,6 +31,8 @@ DiscoverabilityManager::DiscoverabilityManager() : const QString API_USER_LOCATION_PATH = "/api/v1/user/location"; +const QString SESSION_ID_KEY = "session_id"; + void DiscoverabilityManager::updateLocation() { AccountManager& accountManager = AccountManager::getInstance(); @@ -86,7 +88,31 @@ void DiscoverabilityManager::updateLocation() { } else if (UserActivityLogger::getInstance().isEnabled()) { // we still send a heartbeat to the metaverse server for stats collection const QString API_USER_HEARTBEAT_PATH = "/api/v1/user/heartbeat"; - accountManager.sendRequest(API_USER_HEARTBEAT_PATH, AccountManagerAuth::Required, QNetworkAccessManager::PutOperation); + + JSONCallbackParameters callbackParameters; + callbackParameters.jsonCallbackReceiver = this; + callbackParameters.jsonCallbackMethod = "handleHeartbeatResponse"; + + QJsonObject heartbeatObject; + if (!_sessionID.isEmpty()) { + heartbeatObject[SESSION_ID_KEY] = _sessionID; + } else { + heartbeatObject[SESSION_ID_KEY] = QJsonValue(); + } + + accountManager.sendRequest(API_USER_HEARTBEAT_PATH, AccountManagerAuth::Optional, + QNetworkAccessManager::PutOperation, callbackParameters, + QJsonDocument(heartbeatObject).toJson()); + } +} + +void DiscoverabilityManager::handleHeartbeatResponse(QNetworkReply& requestReply) { + QJsonObject jsonObject = QJsonDocument::fromJson(requestReply.readAll()).object(); + + static const QString STATUS_KEY = "status"; + + if (jsonObject.contains(STATUS_KEY) && jsonObject[STATUS_KEY] == "success") { + _sessionID = jsonObject[SESSION_ID_KEY].toString(); } } diff --git a/interface/src/DiscoverabilityManager.h b/interface/src/DiscoverabilityManager.h index 1b5adcdb5d..94d74b81b9 100644 --- a/interface/src/DiscoverabilityManager.h +++ b/interface/src/DiscoverabilityManager.h @@ -42,10 +42,14 @@ public slots: signals: void discoverabilityModeChanged(Discoverability::Mode discoverabilityMode); +private slots: + void handleHeartbeatResponse(QNetworkReply& requestReply); + private: DiscoverabilityManager(); Setting::Handle _mode; + QString _sessionID; }; -#endif // hifi_DiscoverabilityManager_h \ No newline at end of file +#endif // hifi_DiscoverabilityManager_h diff --git a/libraries/networking/src/NetworkingConstants.h b/libraries/networking/src/NetworkingConstants.h index a1940611bc..d1e0a46c71 100644 --- a/libraries/networking/src/NetworkingConstants.h +++ b/libraries/networking/src/NetworkingConstants.h @@ -15,7 +15,7 @@ #include namespace NetworkingConstants { - const QUrl METAVERSE_SERVER_URL = QUrl("https://metaverse.highfidelity.com"); + const QUrl METAVERSE_SERVER_URL = QUrl("http://localhost:3000"); } -#endif // hifi_NetworkingConstants_h \ No newline at end of file +#endif // hifi_NetworkingConstants_h From a5d09e268d5b0c3132128fae4cc6955c7e451062 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 5 May 2016 15:56:16 -0700 Subject: [PATCH 12/18] fix sessionID pull and re-sent for HB --- interface/src/DiscoverabilityManager.cpp | 8 +++----- libraries/networking/src/AccountManager.cpp | 13 +++++++++++++ libraries/networking/src/AccountManager.h | 2 ++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index 4338addb55..db84da55de 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -107,12 +107,10 @@ void DiscoverabilityManager::updateLocation() { } void DiscoverabilityManager::handleHeartbeatResponse(QNetworkReply& requestReply) { - QJsonObject jsonObject = QJsonDocument::fromJson(requestReply.readAll()).object(); + auto dataObject = AccountManager::dataObjectFromResponse(requestReply); - static const QString STATUS_KEY = "status"; - - if (jsonObject.contains(STATUS_KEY) && jsonObject[STATUS_KEY] == "success") { - _sessionID = jsonObject[SESSION_ID_KEY].toString(); + if (!dataObject.isEmpty()) { + _sessionID = dataObject[SESSION_ID_KEY].toString(); } } diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index e97b077f24..407d7fc605 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -66,6 +66,19 @@ JSONCallbackParameters::JSONCallbackParameters(QObject* jsonCallbackReceiver, co } +QJsonObject AccountManager::dataObjectFromResponse(QNetworkReply &requestReply) { + QJsonObject jsonObject = QJsonDocument::fromJson(requestReply.readAll()).object(); + + static const QString STATUS_KEY = "status"; + static const QString DATA_KEY = "data"; + + if (jsonObject.contains(STATUS_KEY) && jsonObject[STATUS_KEY] == "success" && jsonObject.contains(DATA_KEY)) { + return jsonObject[DATA_KEY].toObject(); + } else { + return QJsonObject(); + } +} + AccountManager::AccountManager() : _authURL(), _pendingCallbackMap() diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index 0ebefafbed..c374a62515 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -77,6 +77,8 @@ public: DataServerAccountInfo& getAccountInfo() { return _accountInfo; } + static QJsonObject dataObjectFromResponse(QNetworkReply& requestReply); + public slots: void requestAccessToken(const QString& login, const QString& password); From 7f496ea069e41821a3b76c407196ba50804eaa07 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Thu, 5 May 2016 17:54:00 -0700 Subject: [PATCH 13/18] Fix colliding fbx tex names --- .../src/model-networking/ModelCache.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index e4fb5c97f8..24834967d6 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -394,10 +394,20 @@ const QString& NetworkMaterial::getTextureName(MapChannel channel) { return NO_TEXTURE; } -QUrl NetworkMaterial::getTextureUrl(const QUrl& url, const FBXTexture& texture) { - // If content is inline, cache it under the fbx file, not its url - const auto baseUrl = texture.content.isEmpty() ? url : QUrl(url.url() + "/"); - return baseUrl.resolved(QUrl(texture.filename)); +QUrl NetworkMaterial::getTextureUrl(const QUrl& baseUrl, const FBXTexture& texture) { + if (texture.content.isEmpty()) { + // External file: search relative to the baseUrl, in case filename is relative + return baseUrl.resolved(QUrl(texture.filename)); + } else { + // Inlined file: cache under the fbx file to avoid namespace clashes + // NOTE: We cannot resolve the path because filename may be an absolute path + assert(texture.filename.size() > 0); + if (texture.filename.at(0) == '/') { + return baseUrl.toString() + texture.filename; + } else { + return baseUrl.toString() + '/' + texture.filename; + } + } } model::TextureMapPointer NetworkMaterial::fetchTextureMap(const QUrl& baseUrl, const FBXTexture& fbxTexture, From 7dd8515bd885f49472a2fc652c22f01d30bbd428 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 6 May 2016 11:50:40 -0700 Subject: [PATCH 14/18] send a simple heartbeat if location has not changed --- interface/src/DiscoverabilityManager.cpp | 31 ++++++++++++++++++------ interface/src/DiscoverabilityManager.h | 1 + 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index db84da55de..40186de035 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -30,6 +30,7 @@ DiscoverabilityManager::DiscoverabilityManager() : } const QString API_USER_LOCATION_PATH = "/api/v1/user/location"; +const QString API_USER_HEARTBEAT_PATH = "/api/v1/user/heartbeat"; const QString SESSION_ID_KEY = "session_id"; @@ -48,7 +49,6 @@ void DiscoverabilityManager::updateLocation() { QJsonObject locationObject; - QString pathString = addressManager->currentPath(); const QString LOCATION_KEY_IN_ROOT = "location"; @@ -78,16 +78,33 @@ void DiscoverabilityManager::updateLocation() { const QString FRIENDS_ONLY_KEY_IN_LOCATION = "friends_only"; locationObject.insert(FRIENDS_ONLY_KEY_IN_LOCATION, (_mode.get() == Discoverability::Friends)); - - rootObject.insert(LOCATION_KEY_IN_ROOT, locationObject); - - accountManager.sendRequest(API_USER_LOCATION_PATH, AccountManagerAuth::Required, + + // if we have a session ID add it now, otherwise add a null value + rootObject[SESSION_ID_KEY] = _sessionID.isEmpty() ? QJsonValue() : _sessionID; + + JSONCallbackParameters callbackParameters; + callbackParameters.jsonCallbackReceiver = this; + callbackParameters.jsonCallbackMethod = "handleHeartbeatResponse"; + + // figure out if we'll send a fresh location or just a simple heartbeat + auto apiPath = API_USER_HEARTBEAT_PATH; + + if (locationObject != _lastLocationObject) { + // we have a changed location, send it now + _lastLocationObject = locationObject; + + rootObject.insert(LOCATION_KEY_IN_ROOT, locationObject); + + apiPath = API_USER_LOCATION_PATH; + } + + accountManager.sendRequest(apiPath, AccountManagerAuth::Required, QNetworkAccessManager::PutOperation, - JSONCallbackParameters(), QJsonDocument(rootObject).toJson()); + callbackParameters, QJsonDocument(rootObject).toJson()); + } } else if (UserActivityLogger::getInstance().isEnabled()) { // we still send a heartbeat to the metaverse server for stats collection - const QString API_USER_HEARTBEAT_PATH = "/api/v1/user/heartbeat"; JSONCallbackParameters callbackParameters; callbackParameters.jsonCallbackReceiver = this; diff --git a/interface/src/DiscoverabilityManager.h b/interface/src/DiscoverabilityManager.h index 94d74b81b9..9a1fa7b39c 100644 --- a/interface/src/DiscoverabilityManager.h +++ b/interface/src/DiscoverabilityManager.h @@ -50,6 +50,7 @@ private: Setting::Handle _mode; QString _sessionID; + QJsonObject _lastLocationObject; }; #endif // hifi_DiscoverabilityManager_h From ed1ddc2a8bd34a73bb56ef0c91c1b97689d4e43b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 6 May 2016 11:54:49 -0700 Subject: [PATCH 15/18] remove code to update/store wallet balance --- interface/src/Application.cpp | 9 -------- .../scripting/AccountScriptingInterface.cpp | 16 -------------- .../src/scripting/AccountScriptingInterface.h | 6 ------ libraries/networking/src/AccountManager.cpp | 20 ------------------ libraries/networking/src/AccountManager.h | 3 --- .../networking/src/DataServerAccountInfo.cpp | 21 ------------------- .../networking/src/DataServerAccountInfo.h | 12 +---------- 7 files changed, 1 insertion(+), 86 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c2a4088dcc..e4f8271368 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -161,7 +161,6 @@ extern "C" { using namespace std; static QTimer locationUpdateTimer; -static QTimer balanceUpdateTimer; static QTimer identityPacketTimer; static QTimer pingTimer; @@ -688,13 +687,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : // connect to appropriate slots on AccountManager AccountManager& accountManager = AccountManager::getInstance(); - const qint64 BALANCE_UPDATE_INTERVAL_MSECS = 5 * MSECS_PER_SEC; - - connect(&balanceUpdateTimer, &QTimer::timeout, &accountManager, &AccountManager::updateBalance); - balanceUpdateTimer.start(BALANCE_UPDATE_INTERVAL_MSECS); - - connect(&accountManager, &AccountManager::balanceChanged, this, &Application::updateWindowTitle); - auto dialogsManager = DependencyManager::get(); connect(&accountManager, &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog); connect(&accountManager, &AccountManager::usernameChanged, this, &Application::updateWindowTitle); @@ -1197,7 +1189,6 @@ void Application::cleanupBeforeQuit() { // first stop all timers directly or by invokeMethod // depending on what thread they run in locationUpdateTimer.stop(); - balanceUpdateTimer.stop(); identityPacketTimer.stop(); pingTimer.stop(); QMetaObject::invokeMethod(&_settingsTimer, "stop", Qt::BlockingQueuedConnection); diff --git a/interface/src/scripting/AccountScriptingInterface.cpp b/interface/src/scripting/AccountScriptingInterface.cpp index 126cd53003..1b6d52ac2a 100644 --- a/interface/src/scripting/AccountScriptingInterface.cpp +++ b/interface/src/scripting/AccountScriptingInterface.cpp @@ -13,32 +13,16 @@ #include "AccountScriptingInterface.h" -AccountScriptingInterface::AccountScriptingInterface() { - AccountManager& accountManager = AccountManager::getInstance(); - connect(&accountManager, &AccountManager::balanceChanged, this, - &AccountScriptingInterface::updateBalance); -} - AccountScriptingInterface* AccountScriptingInterface::getInstance() { static AccountScriptingInterface sharedInstance; return &sharedInstance; } -float AccountScriptingInterface::getBalance() { - AccountManager& accountManager = AccountManager::getInstance(); - return accountManager.getAccountInfo().getBalanceInSatoshis(); -} - bool AccountScriptingInterface::isLoggedIn() { AccountManager& accountManager = AccountManager::getInstance(); return accountManager.isLoggedIn(); } -void AccountScriptingInterface::updateBalance() { - AccountManager& accountManager = AccountManager::getInstance(); - emit balanceChanged(accountManager.getAccountInfo().getBalanceInSatoshis()); -} - QString AccountScriptingInterface::getUsername() { AccountManager& accountManager = AccountManager::getInstance(); if (accountManager.isLoggedIn()) { diff --git a/interface/src/scripting/AccountScriptingInterface.h b/interface/src/scripting/AccountScriptingInterface.h index 578a9d6728..888149b836 100644 --- a/interface/src/scripting/AccountScriptingInterface.h +++ b/interface/src/scripting/AccountScriptingInterface.h @@ -16,17 +16,11 @@ class AccountScriptingInterface : public QObject { Q_OBJECT - AccountScriptingInterface(); -signals: - void balanceChanged(float newBalance); - public slots: static AccountScriptingInterface* getInstance(); - float getBalance(); QString getUsername(); bool isLoggedIn(); - void updateBalance(); }; #endif // hifi_AccountScriptingInterface_h diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 407d7fc605..8c23844f4e 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -95,8 +95,6 @@ AccountManager::AccountManager() : qRegisterMetaType("QHttpMultiPart*"); qRegisterMetaType(); - - connect(&_accountInfo, &DataServerAccountInfo::balanceChanged, this, &AccountManager::accountInfoBalanceChanged); } const QString DOUBLE_SLASH_SUBSTITUTE = "slashslash"; @@ -105,9 +103,6 @@ void AccountManager::logout() { // a logout means we want to delete the DataServerAccountInfo we currently have for this URL, in-memory and in file _accountInfo = DataServerAccountInfo(); - emit balanceChanged(0); - connect(&_accountInfo, &DataServerAccountInfo::balanceChanged, this, &AccountManager::accountInfoBalanceChanged); - // remove this account from the account settings file removeAccountFromFile(); @@ -116,21 +111,6 @@ void AccountManager::logout() { emit usernameChanged(QString()); } -void AccountManager::updateBalance() { - if (hasValidAccessToken()) { - // ask our auth endpoint for our balance - JSONCallbackParameters callbackParameters; - callbackParameters.jsonCallbackReceiver = &_accountInfo; - callbackParameters.jsonCallbackMethod = "setBalanceFromJSON"; - - sendRequest("/api/v1/wallets/mine", AccountManagerAuth::Required, QNetworkAccessManager::GetOperation, callbackParameters); - } -} - -void AccountManager::accountInfoBalanceChanged(qint64 newBalance) { - emit balanceChanged(newBalance); -} - QString accountFileDir() { return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); } diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index c374a62515..108b49f678 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -87,8 +87,6 @@ public slots: void requestAccessTokenError(QNetworkReply::NetworkError error); void requestProfileError(QNetworkReply::NetworkError error); void logout(); - void updateBalance(); - void accountInfoBalanceChanged(qint64 newBalance); void generateNewUserKeypair() { generateNewKeypair(); } void generateNewDomainKeypair(const QUuid& domainID) { generateNewKeypair(false, domainID); } @@ -100,7 +98,6 @@ signals: void loginComplete(const QUrl& authURL); void loginFailed(); void logoutComplete(); - void balanceChanged(qint64 newBalance); void newKeypair(); private slots: diff --git a/libraries/networking/src/DataServerAccountInfo.cpp b/libraries/networking/src/DataServerAccountInfo.cpp index 9455fb1b88..211bfdccfa 100644 --- a/libraries/networking/src/DataServerAccountInfo.cpp +++ b/libraries/networking/src/DataServerAccountInfo.cpp @@ -31,8 +31,6 @@ DataServerAccountInfo::DataServerAccountInfo(const DataServerAccountInfo& otherI _xmppPassword = otherInfo._xmppPassword; _discourseApiKey = otherInfo._discourseApiKey; _walletID = otherInfo._walletID; - _balance = otherInfo._balance; - _hasBalance = otherInfo._hasBalance; _privateKey = otherInfo._privateKey; _domainID = otherInfo._domainID; } @@ -51,8 +49,6 @@ void DataServerAccountInfo::swap(DataServerAccountInfo& otherInfo) { swap(_xmppPassword, otherInfo._xmppPassword); swap(_discourseApiKey, otherInfo._discourseApiKey); swap(_walletID, otherInfo._walletID); - swap(_balance, otherInfo._balance); - swap(_hasBalance, otherInfo._hasBalance); swap(_privateKey, otherInfo._privateKey); swap(_domainID, otherInfo._domainID); } @@ -87,23 +83,6 @@ void DataServerAccountInfo::setWalletID(const QUuid& walletID) { } } -void DataServerAccountInfo::setBalance(qint64 balance) { - if (!_hasBalance || _balance != balance) { - _balance = balance; - _hasBalance = true; - - emit balanceChanged(_balance); - } -} - -void DataServerAccountInfo::setBalanceFromJSON(QNetworkReply& requestReply) { - QJsonObject jsonObject = QJsonDocument::fromJson(requestReply.readAll()).object(); - if (jsonObject["status"].toString() == "success") { - qint64 balanceInSatoshis = jsonObject["data"].toObject()["wallet"].toObject()["balance"].toDouble(); - setBalance(balanceInSatoshis); - } -} - bool DataServerAccountInfo::hasProfile() const { return _username.length() > 0; } diff --git a/libraries/networking/src/DataServerAccountInfo.h b/libraries/networking/src/DataServerAccountInfo.h index 6223bc008e..6ee726efde 100644 --- a/libraries/networking/src/DataServerAccountInfo.h +++ b/libraries/networking/src/DataServerAccountInfo.h @@ -43,13 +43,6 @@ public: const QUuid& getWalletID() const { return _walletID; } void setWalletID(const QUuid& walletID); - qint64 getBalance() const { return _balance; } - float getBalanceInSatoshis() const { return _balance / SATOSHIS_PER_CREDIT; } - void setBalance(qint64 balance); - bool hasBalance() const { return _hasBalance; } - void setHasBalance(bool hasBalance) { _hasBalance = hasBalance; } - Q_INVOKABLE void setBalanceFromJSON(QNetworkReply& requestReply); - QByteArray getUsernameSignature(const QUuid& connectionToken); bool hasPrivateKey() const { return !_privateKey.isEmpty(); } void setPrivateKey(const QByteArray& privateKey) { _privateKey = privateKey; } @@ -65,8 +58,7 @@ public: friend QDataStream& operator<<(QDataStream &out, const DataServerAccountInfo& info); friend QDataStream& operator>>(QDataStream &in, DataServerAccountInfo& info); -signals: - qint64 balanceChanged(qint64 newBalance); + private: void swap(DataServerAccountInfo& otherInfo); @@ -75,8 +67,6 @@ private: QString _xmppPassword; QString _discourseApiKey; QUuid _walletID; - qint64 _balance { 0 }; - bool _hasBalance { false }; QUuid _domainID; // if this holds account info for a domain, this holds the ID of that domain QByteArray _privateKey; From 258c5308db6303ffdddcdc8d3478e397ce6ec5d3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 6 May 2016 11:57:25 -0700 Subject: [PATCH 16/18] don't require an active domain connection for location update --- interface/src/DiscoverabilityManager.cpp | 111 +++++++++++------------ 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index 40186de035..e6be7e9034 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -37,72 +37,71 @@ const QString SESSION_ID_KEY = "session_id"; void DiscoverabilityManager::updateLocation() { AccountManager& accountManager = AccountManager::getInstance(); - if (_mode.get() != Discoverability::None) { + if (_mode.get() != Discoverability::None && accountManager.isLoggedIn()) { auto addressManager = DependencyManager::get(); DomainHandler& domainHandler = DependencyManager::get()->getDomainHandler(); - - if (accountManager.isLoggedIn() && domainHandler.isConnected() - && (!addressManager->getRootPlaceID().isNull() || !domainHandler.getUUID().isNull())) { - - // construct a QJsonObject given the user's current address information - QJsonObject rootObject; - - QJsonObject locationObject; - QString pathString = addressManager->currentPath(); - - const QString LOCATION_KEY_IN_ROOT = "location"; - - const QString PATH_KEY_IN_LOCATION = "path"; - locationObject.insert(PATH_KEY_IN_LOCATION, pathString); - - if (!addressManager->getRootPlaceID().isNull()) { - const QString PLACE_ID_KEY_IN_LOCATION = "place_id"; - locationObject.insert(PLACE_ID_KEY_IN_LOCATION, - uuidStringWithoutCurlyBraces(addressManager->getRootPlaceID())); - } + // construct a QJsonObject given the user's current address information + QJsonObject rootObject; - if (!domainHandler.getUUID().isNull()) { - const QString DOMAIN_ID_KEY_IN_LOCATION = "domain_id"; - locationObject.insert(DOMAIN_ID_KEY_IN_LOCATION, - uuidStringWithoutCurlyBraces(domainHandler.getUUID())); - } + QJsonObject locationObject; - // in case the place/domain isn't in the database, we send the network address and port - auto& domainSockAddr = domainHandler.getSockAddr(); - const QString NETWORK_ADRESS_KEY_IN_LOCATION = "network_address"; - locationObject.insert(NETWORK_ADRESS_KEY_IN_LOCATION, domainSockAddr.getAddress().toString()); + QString pathString = addressManager->currentPath(); - const QString NETWORK_ADDRESS_PORT_IN_LOCATION = "network_port"; - locationObject.insert(NETWORK_ADDRESS_PORT_IN_LOCATION, domainSockAddr.getPort()); + const QString LOCATION_KEY_IN_ROOT = "location"; - const QString FRIENDS_ONLY_KEY_IN_LOCATION = "friends_only"; - locationObject.insert(FRIENDS_ONLY_KEY_IN_LOCATION, (_mode.get() == Discoverability::Friends)); + const QString PATH_KEY_IN_LOCATION = "path"; + locationObject.insert(PATH_KEY_IN_LOCATION, pathString); - // if we have a session ID add it now, otherwise add a null value - rootObject[SESSION_ID_KEY] = _sessionID.isEmpty() ? QJsonValue() : _sessionID; - - JSONCallbackParameters callbackParameters; - callbackParameters.jsonCallbackReceiver = this; - callbackParameters.jsonCallbackMethod = "handleHeartbeatResponse"; - - // figure out if we'll send a fresh location or just a simple heartbeat - auto apiPath = API_USER_HEARTBEAT_PATH; - - if (locationObject != _lastLocationObject) { - // we have a changed location, send it now - _lastLocationObject = locationObject; - - rootObject.insert(LOCATION_KEY_IN_ROOT, locationObject); - - apiPath = API_USER_LOCATION_PATH; - } - - accountManager.sendRequest(apiPath, AccountManagerAuth::Required, - QNetworkAccessManager::PutOperation, - callbackParameters, QJsonDocument(rootObject).toJson()); + const QString CONNECTED_KEY_IN_LOCATION = "connected"; + locationObject.insert(CONNECTED_KEY_IN_LOCATION, domainHandler.isConnected()); + if (!addressManager->getRootPlaceID().isNull()) { + const QString PLACE_ID_KEY_IN_LOCATION = "place_id"; + locationObject.insert(PLACE_ID_KEY_IN_LOCATION, + uuidStringWithoutCurlyBraces(addressManager->getRootPlaceID())); } + + if (!domainHandler.getUUID().isNull()) { + const QString DOMAIN_ID_KEY_IN_LOCATION = "domain_id"; + locationObject.insert(DOMAIN_ID_KEY_IN_LOCATION, + uuidStringWithoutCurlyBraces(domainHandler.getUUID())); + } + + // in case the place/domain isn't in the database, we send the network address and port + auto& domainSockAddr = domainHandler.getSockAddr(); + const QString NETWORK_ADRESS_KEY_IN_LOCATION = "network_address"; + locationObject.insert(NETWORK_ADRESS_KEY_IN_LOCATION, domainSockAddr.getAddress().toString()); + + const QString NETWORK_ADDRESS_PORT_IN_LOCATION = "network_port"; + locationObject.insert(NETWORK_ADDRESS_PORT_IN_LOCATION, domainSockAddr.getPort()); + + const QString FRIENDS_ONLY_KEY_IN_LOCATION = "friends_only"; + locationObject.insert(FRIENDS_ONLY_KEY_IN_LOCATION, (_mode.get() == Discoverability::Friends)); + + // if we have a session ID add it now, otherwise add a null value + rootObject[SESSION_ID_KEY] = _sessionID.isEmpty() ? QJsonValue() : _sessionID; + + JSONCallbackParameters callbackParameters; + callbackParameters.jsonCallbackReceiver = this; + callbackParameters.jsonCallbackMethod = "handleHeartbeatResponse"; + + // figure out if we'll send a fresh location or just a simple heartbeat + auto apiPath = API_USER_HEARTBEAT_PATH; + + if (locationObject != _lastLocationObject) { + // we have a changed location, send it now + _lastLocationObject = locationObject; + + rootObject.insert(LOCATION_KEY_IN_ROOT, locationObject); + + apiPath = API_USER_LOCATION_PATH; + } + + accountManager.sendRequest(apiPath, AccountManagerAuth::Required, + QNetworkAccessManager::PutOperation, + callbackParameters, QJsonDocument(rootObject).toJson()); + } else if (UserActivityLogger::getInstance().isEnabled()) { // we still send a heartbeat to the metaverse server for stats collection From fb09efc0c99e29d0569d0b48b79d6a1e9f7b7b27 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 6 May 2016 12:01:03 -0700 Subject: [PATCH 17/18] send location updates immediately on mode change and startup --- interface/src/Application.cpp | 3 +++ interface/src/DiscoverabilityManager.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e4f8271368..4a829b3191 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -676,6 +676,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : connect(&nodeList->getDomainHandler(), &DomainHandler::connectedToDomain, discoverabilityManager.data(), &DiscoverabilityManager::updateLocation); + // send a location update immediately + discoverabilityManager->updateLocation(); + connect(nodeList.data(), &NodeList::nodeAdded, this, &Application::nodeAdded); connect(nodeList.data(), &NodeList::nodeKilled, this, &Application::nodeKilled); connect(nodeList.data(), &NodeList::nodeActivated, this, &Application::nodeActivated); diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index e6be7e9034..b4d0ee9b85 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -144,6 +144,9 @@ void DiscoverabilityManager::setDiscoverabilityMode(Discoverability::Mode discov if (static_cast(_mode.get()) == Discoverability::None) { // if we just got set to no discoverability, make sure that we delete our location in DB removeLocation(); + } else { + // we have a discoverability mode that says we should send a location, do that right away + updateLocation(); } emit discoverabilityModeChanged(discoverabilityMode); From 6f6221840eb94bd58bae4249cd0819870e8b8773 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 6 May 2016 13:26:23 -0700 Subject: [PATCH 18/18] put back the correct metaverse API url in NetworkingConstants --- libraries/networking/src/NetworkingConstants.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/NetworkingConstants.h b/libraries/networking/src/NetworkingConstants.h index d1e0a46c71..a512ae8887 100644 --- a/libraries/networking/src/NetworkingConstants.h +++ b/libraries/networking/src/NetworkingConstants.h @@ -15,7 +15,7 @@ #include namespace NetworkingConstants { - const QUrl METAVERSE_SERVER_URL = QUrl("http://localhost:3000"); + const QUrl METAVERSE_SERVER_URL = QUrl("https://metaverse.highfidelity.com"); } #endif // hifi_NetworkingConstants_h