bool ProjucerAnalyticsDestination::logBatchedEvents (const Array<AnalyticsEvent>& events) { String appData ("v=1&aip=1&tid=" + apiKey); StringArray postData; for (auto& event : events) { StringPairArray data; data.set ("t", "event"); data.set ("cid", event.userID); switch (event.eventType) { case ProjucerAnalyticsEvent::appEvent: { data.set ("ec", "App"); setData (event, data); break; } case ProjucerAnalyticsEvent::projectEvent: { data.set ("ec", "Project"); setData (event, data); break; } case ProjucerAnalyticsEvent::userEvent: { data.set ("ec", "User"); setData (event, data); break; } case ProjucerAnalyticsEvent::exampleEvent: { data.set ("ec", "Example"); setData (event, data); break; } default: { // unknown event type! jassertfalse; break; } } StringArray eventData; for (auto& key : data.getAllKeys()) eventData.add (key + "=" + URL::addEscapeChars (data[key], true)); postData.add (appData + "&" + eventData.joinIntoString ("&")); } auto url = URL ("https://www.google-analytics.com/batch") .withPOSTData (postData.joinIntoString ("\n")); { const ScopedLock lock (webStreamCreation); if (shouldExit) return false; webStream.reset (new WebInputStream (url, true)); } auto success = webStream->connect (nullptr); // Do an exponential backoff if we failed to connect. if (success) periodMs = initialPeriodMs; else periodMs *= 2; setBatchPeriod (periodMs); return success; }
void ThreadedAnalyticsDestination::startAnalyticsThread (int initialBatchPeriodMilliseconds) { setBatchPeriod (initialBatchPeriodMilliseconds); dispatcher.startThread(); }