2.X commits up to and including 7519
[ardour.git] / libs / ardour / callback.cc
index fceb1b4f4beeac946f47e7490b69d0e3a9fccdc9..3a66836748ffa4cb47b3179b603ffb326ab24d8e 100644 (file)
@@ -1,33 +1,92 @@
 #include <iostream>
 #include <string>
-
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <cstdlib>
 #include <sys/utsname.h>
 #include <curl/curl.h>
 
+#include <glibmm/fileutils.h>
+#include <glibmm/miscutils.h>
+
 #include "pbd/compose.h"
+#include "pbd/strsplit.h"
+#include "pbd/convert.h"
+
 #include "ardour/callback.h"
+#include "ardour/filesystem_paths.h"
 
 using namespace std;
 
 #define PING_URL "http://ardour.org/pingback/versioncheck"
+#define OFF_THE_HOOK ".offthehook"
 
 static size_t
 curl_write_data (char *bufptr, size_t size, size_t nitems, void *ptr)
 {
+        /* we know its a string */
+
+        string* sptr = (string*) ptr;
+
+        for (size_t i = 0; i < nitems; ++i) {
+                for (size_t n = 0; n < size; ++n) {
+                        if (*bufptr == '\n') {
+                                break;
+                        }
+
+                        (*sptr) += *bufptr++;
+                }
+        }
+
         return size * nitems;
 }
 
 static string
 watermark ()
 {
-        return "";
+        return string();
+}
+
+void
+block_mothership ()
+{
+        string hangup = Glib::build_filename (ARDOUR::user_config_directory().to_string(), OFF_THE_HOOK);
+        int fd;
+        if ((fd = ::open (hangup.c_str(), O_RDWR|O_CREAT, 0600)) >= 0) {
+                close (fd);
+        }
+}
+
+void
+unblock_mothership ()
+{
+        string hangup = Glib::build_filename (ARDOUR::user_config_directory().to_string(), OFF_THE_HOOK);
+        ::unlink (hangup.c_str());
+}
+
+bool
+mothership_blocked ()
+{
+        string hangup = Glib::build_filename (ARDOUR::user_config_directory().to_string(), OFF_THE_HOOK);
+        return Glib::file_test (hangup, Glib::FILE_TEST_EXISTS);
 }
 
 void
 call_the_mothership (const string& version)
 {
+        /* check if the user says never to do this 
+         */
+
+        if (mothership_blocked()) {
+                return;
+        }
+
         CURL* c;
         struct utsname utb;
+        std::string versionstr;
 
         if (uname (&utb)) {
                 return;
@@ -50,7 +109,7 @@ call_the_mothership (const string& version)
         curl_easy_setopt(c, CURLOPT_POSTFIELDS, data.c_str());
         curl_easy_setopt(c, CURLOPT_URL, PING_URL);
         curl_easy_setopt(c, CURLOPT_WRITEFUNCTION, curl_write_data); 
-        curl_easy_setopt(c, CURLOPT_WRITEDATA, 0); 
+        curl_easy_setopt(c, CURLOPT_WRITEDATA, &versionstr); 
         
         std::cerr << "Callback to ardour.org ...\n";
 
@@ -58,7 +117,39 @@ call_the_mothership (const string& version)
         curl_easy_setopt(c, CURLOPT_ERRORBUFFER, errbuf); 
 
         if (curl_easy_perform (c) == 0) {
+                cerr << "Current release is " << versionstr << endl;
+
+                vector<string> ours;
+                vector<string> current;
+                
+                split (version, ours, '.');
+                split (versionstr, current, '.');
+                
+                if (ours.size() == 3 && current.size() == 3) {
+
+                        int ours_n[3];
+                        int current_n[3];
+
+                        using namespace PBD;
+
+                        ours_n[0] = atoi (ours[0]);
+                        ours_n[1] = atoi (ours[1]);
+                        ours_n[2] = atoi (ours[2]);
+
+                        current_n[0] = atoi (current[0]);
+                        current_n[1] = atoi (current[1]);
+                        current_n[2] = atoi (current[2]);
 
+                        if (ours_n[0] < current_n[0] ||
+                            ((ours_n[0] == current_n[0]) && (ours_n[1] < current_n[1])) || 
+                            ((ours_n[0] == current_n[0]) && (ours_n[1] == current_n[1]) && (ours_n[2] < current_n[2]))) {
+                                cerr << "TOO OLD\n";
+                        } else {
+                                cerr << "CURRENT\n";
+                        }
+                } else {
+                        cerr << "Unusual local version: " << version << endl;
+                }
         }
         
         curl_easy_cleanup (c);