diff eventLogger.mm @ 27:ae4d2c3ce5e0

Details. Zoom trailing finger move sorted. Qs rephrased.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Wed, 13 Feb 2013 17:03:56 +0000
parents f42a00e3f22d
children e2c62db1e265
line wrap: on
line diff
--- a/eventLogger.mm	Fri Feb 01 18:31:43 2013 +0000
+++ b/eventLogger.mm	Wed Feb 13 17:03:56 2013 +0000
@@ -20,12 +20,13 @@
     serverConnectionOK = false;
     questionnaireCompleted = false;
     questionnaireUploaded = false;
-    
-    
+    currentHTTPRequestID = -1;
+    logUploadInProgress = false;
     ofxiPhoneDeviceType iOSdeviceType = ofxiPhoneGetDeviceType();
     cout << "Device: " << iOSdeviceType << '\n';
     
     nextUploadQty = UPLOAD_CHUNK_SIZE; // amount of data uploaded is always more than UPLOAD_CHUNK_SIZE events
+    
 }
 //---------------------------------------------------------------------------
 // draw() - show path of last N scroll events  - can be scrubbed along?
@@ -50,15 +51,15 @@
     
 }
 //---------------------------------------------------------------------------
-bool EventLogger::uploadQuestionnaire(){
+void EventLogger::uploadQuestionnaire(){
     // show indicator
     cout << "^^^^^^^^ UPLOADING QUESTIONNAIRE ^^^^^^^^ \n";
     
-    questionnaireUploaded = sendToServer("questionnaire", questionnaireToJson());
-    return questionnaireUploaded;
+    sendToServer("questionnaire", questionnaireToJson(), true);
+
 }
 //---------------------------------------------------------------------------
-bool EventLogger::sendToServer(string functionName, Json::Value jsonData){
+bool EventLogger::sendToServer(string functionName, Json::Value jsonData, bool async = false){
     bool sent;
     string request;
 
@@ -72,25 +73,63 @@
     Json::FastWriter writer;
     string jsontext = writer.write( jsonData );
     
+    // remove newline
     if (!jsontext.empty() && jsontext[jsontext.length()-1] == '\n') {
         jsontext.erase(jsontext.length()-1);
     }
 
     request.append(jsontext);
+    
+    if(!async){
+        ofURLFileLoader fileLoader;
+        ofHttpResponse resp;
+        resp = fileLoader.get(request);
 
-    ofURLFileLoader fileLoader;
-    ofHttpResponse resp;
-    resp = fileLoader.get(request);
-    //fileLoader.getAsync(request);
-    cout << "HTTP STATUS  " << resp.status << "\n";
-    cout << "HTTP ERROR  " << resp.error << "\n";
-    cout << "HTTP DATA  " << resp.data << "\n"; // ofBuffer
+        cout << "HTTP STATUS  " << resp.status << "\n";
+        cout << "HTTP ERROR  " << resp.error << "\n";
+        cout << "HTTP DATA  " << resp.data << "\n"; // ofBuffer
+        
+        stringstream response;
+        response << resp.data;
+        
+        if (resp.status == 200){
+            if(response.str() == "OK"){
+                
+                sent = true;
+            }else{
+                // not ok
+                // problem serverside
+                sent = false;
+            }
+        }else{
+            
+            sent = false;
+            // SHOW AN ALERT TO USER?
+        }
+        
+        return sent;
+    }else{ // async
+        ofURLFileLoader fileLoader;
+        currentHTTPRequestID = ofLoadURLAsync(request, functionName);
+        ofRegisterURLNotification(this);
+        
+        return true; // ???
+    }
+}
+//-----------------------------
+void EventLogger::urlResponse(ofHttpResponse & response){
+    cout << "gotHTTPRequestStatus\n";
+    cout << "HTTP REQUEST NAME  " << response.request.name << "\n";
+    cout << "HTTP STATUS  " << response.status << "\n";
+    cout << "HTTP ERROR  " << response.error << "\n";
+    cout << "HTTP DATA  " << response.data << "\n"; // ofBuffer
     
-    stringstream response;
-    response << resp.data;
+    bool sent;
+    stringstream respStr;
+    respStr << response.data;
     
-    if (resp.status == 200){
-        if(response.str() == "OK"){
+    if (response.status == 200){
+        if(respStr.str() == "OK"){
             
             sent = true;
         }else{
@@ -103,7 +142,36 @@
         sent = false;
         // SHOW AN ALERT TO USER?
     }
-    return sent;
+
+    // now do request specific stuff
+    if(response.request.name == "eventlog"){
+        if(!sent){
+            // try later
+            nextUploadQty += UPLOAD_CHUNK_SIZE;
+        }else{
+            
+            // if success - clear memory
+            theEvents.clear();
+            cout << "UPLOAD SUCCESS\n";
+            nextUploadNumber++;
+        }
+        logUploadInProgress = false;
+    }else if(response.request.name == "questionnaire"){
+        if(sent){
+            questionnaireUploaded = true;
+        }else{
+            questionnaireUploaded = false; // will try next time... when?
+        }
+    }else if(response.request.name == "testConnection"){
+        
+        if (sent){
+            cout << "^^^^^^^^ server connection OK ^^^^^^^^ \n";
+            serverConnectionOK = true;
+        }else{
+            cout << "server connection ERROR \n";
+        }
+    }
+
 }
 //---------------------------------------------------------------------------
 bool EventLogger::testConnection(){
@@ -111,12 +179,8 @@
     root["test"] = "test";
     
     
-    serverConnectionOK = sendToServer("testConnection", root);
-    if (serverConnectionOK){
-        cout << "^^^^^^^^ server connection OK ^^^^^^^^ \n";
-    }else{
-         cout << "server connection ERROR \n";
-    }
+    sendToServer("testConnection", root, true);
+
 }
 //---------------------------------------------------------------------------
 void EventLogger::readJsonToLog(const string &jsonFile){
@@ -179,9 +243,9 @@
     const Json::Value jlogs = root["events"];
     
     for ( int index = 0; index < jlogs.size(); ++index ) theEvents.push_back(lEvent(jlogs[index]));
-    if(theEvents.size() > nextUploadQty){
+    if(theEvents.size() > nextUploadQty && ! logUploadInProgress){
         //try to upload
-        uploadEventLog();
+        uploadEventLog(true);
     }
     // TODO if the total interaction time is greater than a certain amount && no questions answered - questionnaire time!
     cout << "Total interaction time: " << savedInteractionTime << '\n';
@@ -192,26 +256,31 @@
 
 //---------------------------------------------------------------------------
 
-bool EventLogger::uploadEventLog(){
+bool EventLogger::uploadEventLog(bool async){
     // show indicator
-    
+    logUploadInProgress = true;
     cout << "^^^^^^^^  ATTEMPTING TO UPLOAD " << theEvents.size() << " EVENTS ^^^^^^^^ .\n";
-    
-    bool logUploaded = sendToServer("eventlog", logsToJson());
-    if(!logUploaded){
-        // try later
-        nextUploadQty += UPLOAD_CHUNK_SIZE;
+    if(!async){
+        bool success = sendToServer("eventlog", logsToJson(), async);
+        if(!success){
+            // try later
+            nextUploadQty += UPLOAD_CHUNK_SIZE;
+        }else{
+            
+            // if success - clear memory
+            theEvents.clear();
+            cout << "UPLOAD SUCCESS\n";
+            nextUploadNumber++;
+        }
+        logUploadInProgress = false;
+        return success;
     }else{
-        
-        // if success - clear memory
-        theEvents.clear();
-        cout << "UPLOAD SUCCESS\n";
-        nextUploadNumber++;
+        sendToServer("eventlog", logsToJson(), async);
     }
-    return logUploaded;
-    
 }
 //----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
 //void EventLogger::deleteLogFile(){
 
 //---------------------------------------------------------------------------
@@ -228,6 +297,17 @@
     consentGiven = false;
     
 }
+void EventLogger::newUser(){
+    cout<<"setup new user\n";
+    nextUploadNumber = 0;
+    deviceID = ofGetSystemTimeMicros();
+    savedInteractionTime = 0;
+    questionnaireCompleted = false;
+    questionnaireUploaded = false;
+    consentGiven = true; // other wise we wouldn't be doing this
+    ((testApp *)ofGetAppPtr())->introHidden(true); // hacky
+    
+}
 //---------------------------------------------------------------------------
 // called from alertView OK in iViewController
 void EventLogger::setUsername(const char *u){
@@ -283,9 +363,9 @@
             theEvents.push_back(lEvent(evtType));
             break;
     }
-    if(theEvents.size() > nextUploadQty){
-        //try to upload
-        uploadEventLog();
+    if(theEvents.size() > nextUploadQty && !logUploadInProgress){
+        //try to upload asynchronously
+        uploadEventLog(true);
     }
     //sessionTime = (ofGetSystemTime() - sessionStartTime);
     totalInteractionTime = savedInteractionTime + (ofGetSystemTime() - sessionStartTime);
@@ -303,7 +383,7 @@
         logEvent(CONSENT_DENIED);
         Json::Value jlogs = logsToJson();
         // try to upload TODO (no - might hang and prevent exit???)
-        uploadEventLog();
+        uploadEventLog(true);
         return;
     }
     logEvent(APP_EXITED);
@@ -312,7 +392,8 @@
     string fname = ofxiPhoneGetDocumentsDirectory() + EVENT_LOG_FILENAME;
 
     // try to upload TODO (no - might hang and prevent exit???)
-    uploadEventLog();
+    // do it async because event list needs to be cleared to prevent saving on device
+    uploadEventLog(false);
     
     // write to file
     // json without the logs that were uploaded!