From d6b3132663644b0e97baeb74c7af62e4ee19a31e Mon Sep 17 00:00:00 2001
From: Gustavo Milczwski <garm@inf.ufpr.br>
Date: Mon, 16 Oct 2017 14:24:59 -0200
Subject: [PATCH] SCRUM#100 Add local search and a function to update
 .learning_objects.json. Change search result messages

---
 package/le-edubar@c3sl.ufpr.br/constants.js |  1 -
 package/le-edubar@c3sl.ufpr.br/download.sh  | 14 ++-
 package/le-edubar@c3sl.ufpr.br/edu-dbus     | 99 ++++++++++++++-------
 package/le-edubar@c3sl.ufpr.br/edubus.js    |  4 +-
 package/le-edubar@c3sl.ufpr.br/extension.js | 40 ++++++---
 5 files changed, 101 insertions(+), 57 deletions(-)

diff --git a/package/le-edubar@c3sl.ufpr.br/constants.js b/package/le-edubar@c3sl.ufpr.br/constants.js
index 2b61eb7..a04ca14 100644
--- a/package/le-edubar@c3sl.ufpr.br/constants.js
+++ b/package/le-edubar@c3sl.ufpr.br/constants.js
@@ -48,7 +48,6 @@ const FIRST_RESULT_MARGIN_TOP = 30;
 
 const URL_PLATAFORMA = "https://portalmec.c3sl.ufpr.br/#/recurso?id=";
 const URL_API = 'http://api.portalmec.c3sl.ufpr.br/v1/search?search_class=LearningObject&results_per_page=' + RESULTS_PER_REQUEST;
-const DOWNLOAD_URL = "http://api.portalmec.c3sl.ufpr.br/v1/learning_objects/";
 const DOWNLOAD_PATH = "/var/cache/le-edubar/";
 
 /*TAGS*/
diff --git a/package/le-edubar@c3sl.ufpr.br/download.sh b/package/le-edubar@c3sl.ufpr.br/download.sh
index e13d225..74c0b2d 100755
--- a/package/le-edubar@c3sl.ufpr.br/download.sh
+++ b/package/le-edubar@c3sl.ufpr.br/download.sh
@@ -20,10 +20,10 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
 # USA.
 
-url=$1
-file_name=$2
-file_ext=$3
-file_id=$4
+file_id="$1"
+url="http://api.portalmec.c3sl.ufpr.br/v1/learning_objects/$file_id/download"
+file_name="$2"
+file_ext="$3"
 
 # Download folder
 fdir="/var/cache/le-edubar"
@@ -35,8 +35,6 @@ fi
 
 cd "$fdir"
 
-nautilus
-
 #Create file folder
 if test ! -d "$file_id" ; then
     mkdir "$file_id"
@@ -52,8 +50,8 @@ if test $? -ne 0 ; then
     exit 4
 fi
 
-
 JSON="`wget -qO- https://api.portalmec.c3sl.ufpr.br/v1/learning_objects/$file_id`"
 echo $JSON > ".$file_id.json"
 
-
+#UPDATE .learning_objects.json
+gdbus call --system --dest br.ufpr.c3sl.edubar --object-path /br/ufpr/c3sl/edubar --method br.ufpr.c3sl.edubar.Download.UpdateJSON "$file_id"
\ No newline at end of file
diff --git a/package/le-edubar@c3sl.ufpr.br/edu-dbus b/package/le-edubar@c3sl.ufpr.br/edu-dbus
index a3543e5..3d024b8 100755
--- a/package/le-edubar@c3sl.ufpr.br/edu-dbus
+++ b/package/le-edubar@c3sl.ufpr.br/edu-dbus
@@ -4,7 +4,8 @@ var exec = require('child_process').exec;
 var fs = require('fs');
 var path = require('path');
 
-const download_dir = '/var/cache/le-edubar'
+const download_dir = '/var/cache/le-edubar';
+const download_script = '/usr/share/gnome-shell/extensions/le-edubar@c3sl.ufpr.br/download.sh';
 
 /* Create a new service, object and interface */
 var service = DBus.registerService('system', 'br.ufpr.c3sl.edubar');
@@ -17,6 +18,7 @@ var iface_download = obj.createInterface('br.ufpr.c3sl.edubar.Download');
 var download_pipe = {
 
     download_queue : new Array(),
+    on_update : false,
 
     create : function () {
         this.download_queue = new Array();
@@ -25,7 +27,9 @@ var download_pipe = {
     push : function(id) {
         if (!this.is_queued(id)) {
             this.download_queue.push(id);
-            this.update_json();
+            if (!this.on_update) {
+                this.update_json(this.shift());
+            }
         }
     },
 
@@ -45,47 +49,75 @@ var download_pipe = {
         return this.download_queue;
     },
 
-    update_json : function() {
-        if (this.download_queue.length <= 0) {
+    update_json : function(id) {
+        if (id == undefined) {
+            this.on_update = false;
             return;
         }
-        if(fs.existsSync(download_dir + '/.learning_objects.json')) {
+        this.on_update = true;
+        if (fs.existsSync(download_dir + '/'+ id +'/.' + id +'.json')){
+            if (!fs.existsSync(download_dir + '/.learning_objects.json')) {
+                fs.writeFileSync(download_dir + '/.learning_objects.json', '[]');
+            }
+
             var result_JSON = JSON.parse(
                 fs.readFileSync(download_dir + '/.learning_objects.json').
                 toString().replace(/(\r\n|\n|\r)/gm,""));
+
+            var i = result_JSON.length;
+
+            while (i-->0) {
+                if (result_JSON[i].id == id) {
+                    break;
+                }
+            }
+
+            if (i < 0) {
+
+                result_JSON.push(JSON.parse(
+                    fs.readFileSync(download_dir + '/'+ id +'/.' + id +'.json').
+                    toString().replace(/(\r\n|\n|\r)/gm,"")));
+                fs.writeFileSync(download_dir + '/.learning_objects.json', JSON.stringify(result_JSON));
+            }
         }
-        this.shift();
-        this.update_json();
+
+        this.update_json(this.shift());
     }
 }
 
-download_pipe.create();
-
 /* Add method */
 iface_download.addMethod('Start', {
     in: [DBus.Define(String),
-         DBus.Define(String),
-         DBus.Define(String),
          DBus.Define(String),
          DBus.Define(String)],
     out:  DBus.Define(Number)
-    }, function(path,link,name,format,id,callback) {
+    }, function(id,name,format,callback) {
         console.log('Fazendo download de id=' + id + ' ' + name);
 
-        /*TODO Change to dictionary*/
-        exec('sudo ' + path + ' "' +
-            link + '" "' +
-            name + '" "' +
-            format + '" "' +
-            id + '"');
+        if (id == '') {
+            callback(null,id);
+        } else {
 
-        iface_download.emit('started',id);
+            exec('sudo ' + download_script +
+                ' "' + id + '" "' + name + '" "' +
+                format + '"');
 
-        download_pipe.push(id);
+            callback(null,id);
+        }
 
-        callback(null,id);
 });
 
+iface_download.addMethod('UpdateJSON', {
+    in: [DBus.Define(Number)],
+    }, function(id,callback) {
+        if (download_pipe.download_queue == null) {
+            download_pipe.create();
+        }
+        download_pipe.push(id);
+        callback(null);
+    }
+);
+
 iface_download.addMethod('Stop', { out: DBus.Define(String) }, function(callback) {
     callback('Donwload stopped');
 });
@@ -156,7 +188,7 @@ iface_file.addMethod('Size', {
 
 iface_file.addMethod('GetLocalFiles',{
     in: [ DBus.Define(Number), DBus.Define(String), DBus.Define(String) ],
-    out:  DBus.Define(String) },
+    out:  DBus.Define(Array) },
     function(page, search_text, order_property, callback) {
         fs.exists(download_dir + '/.learning_objects.json', function (exists) {
             if (exists) {
@@ -165,7 +197,17 @@ iface_file.addMethod('GetLocalFiles',{
                     fs.readFileSync(download_dir + '/.learning_objects.json').
                     toString().replace(/(\r\n|\n|\r)/gm,""));
 
-                result_JSON.sort(function(a,b) {
+                var temp_result = JSON.parse("[]");
+                var deleted_itens = 0;
+                for (i = result_JSON.length - 1; i >= 0; --i) {
+                    if (result_JSON[i].name.toLowerCase().search(search_text.toLowerCase()) >= 0) {
+                        temp_result.push(result_JSON[i]);
+                    } else {
+                        deleted_itens++;
+                    }
+                }
+
+                temp_result.sort(function(a,b) {
                     switch (order_property) {
                         case 'publicationdesc':
                             return a.updated_at.localeCompare(b.updated_at);
@@ -191,16 +233,11 @@ iface_file.addMethod('GetLocalFiles',{
                     }
                 });
 
-                for (i = result_JSON.length - 1; i >= 0; --i) {
-                    if (result_JSON[i].name.toLowerCase().search(search_text.toLowerCase()) < 0) {
-                        result_JSON[i].name = 'ISSO NÃO DEVIA ESTAR AQUI';
-                    }
-                }
-                var temp_result = result_JSON.splice(page*10,10);
+                temp_result = temp_result.splice(page*10,10);
 
-                callback(null,JSON.stringify(temp_result),result_JSON.length);
+                callback(null, [ JSON.stringify(temp_result), (result_JSON.length - deleted_itens).toString()]);
             } else {
-                callback(null, "[]");
+                callback(null,["[]",0]);
             }
         });
     }
diff --git a/package/le-edubar@c3sl.ufpr.br/edubus.js b/package/le-edubar@c3sl.ufpr.br/edubus.js
index 9763ce9..861bd86 100644
--- a/package/le-edubar@c3sl.ufpr.br/edubus.js
+++ b/package/le-edubar@c3sl.ufpr.br/edubus.js
@@ -3,8 +3,6 @@ const Gio = imports.gi.Gio;
 const download_interface = '<node>\
     <interface name="br.ufpr.c3sl.edubar.Download">\
         <method name="Start">\
-            <arg type="s" direction="in"/>\
-            <arg type="s" direction="in"/>\
             <arg type="s" direction="in"/>\
             <arg type="s" direction="in"/>\
             <arg type="s" direction="in"/>\
@@ -37,7 +35,7 @@ const file_interface = '<node>\
             <arg type="i" direction="in"/>\
             <arg type="s" direction="in"/>\
             <arg type="s" direction="in"/>\
-            <arg type="s" direction="out" />\
+            <arg type="av" direction="out" />\
         </method>\
         <method name="GetTotalFiles">\
             <arg type="d" direction="out" />\
diff --git a/package/le-edubar@c3sl.ufpr.br/extension.js b/package/le-edubar@c3sl.ufpr.br/extension.js
index eac8544..a190879 100644
--- a/package/le-edubar@c3sl.ufpr.br/extension.js
+++ b/package/le-edubar@c3sl.ufpr.br/extension.js
@@ -197,7 +197,7 @@ function send_soup_request (request_message, searching_text, local_text) {
         searching_text.text = '';
 
         if (message.status_code !== 200) {
-            searching_text.text = 'Sem resposta do serivdor.';
+            searching_text.text = 'Sem resposta do servidor.';
             on_going_downloads = new Array();
             return;
         }
@@ -303,6 +303,8 @@ function start_search() {
     }
 }
 
+
+/* This function shows the downloaded results*/
 function start_local_search() {
     search_text = input_edu.get_text();
 
@@ -317,17 +319,28 @@ function start_local_search() {
         if (local_text != search_text) {
             return;
         }
-        soup_result = JSON.parse(result_json);
+
+        soup_result = JSON.parse(result_json[0][0].get_string()[0]);
         if (search_page == 0) {
-            max_pages = Math.ceil(EduBus.file.GetTotalFilesSync() /Constants.RESULTS_PER_REQUEST);
+            max_pages = Math.ceil((result_json[0][1].get_string()[0]) /Constants.RESULTS_PER_REQUEST);
         }
 
         if (soup_result.length > 0) {
             show_results();
-        }
-    });
+        } else {
+            let searching_text = new St.Label ({
+                text: 'Não há conteúdo baixado.',
+                style_class: 'portal-search-text',
+            });
 
+            let searching_bin = new St.Bin ({
+                width: edu_screen.width,
+            });
 
+            searching_bin.set_child(searching_text);
+            box_result.add_actor(searching_bin);
+        }
+    });
 }
 
 /*
@@ -611,7 +624,9 @@ function send_soup_tags_request(url,tag_filter,checked_group,name,search_box) {
 function show_results() {
     for (let i = 0; i < soup_result.length ;i++) {
         try {
-            box_result.add_child(create_result(soup_result[i]));
+            if (soup_result[i] != null){
+                box_result.add_child(create_result(soup_result[i]));
+            }
         } catch (e) {
             InternalError("Learning content with id=" + soup_result[i].id +
                 " can't be created.");
@@ -848,7 +863,6 @@ function create_result(edu_object) {
 
         let edu_name = edu_object.attachments[edu_id].name.split(".");
         let learning_content = {
-            link : Constants.DOWNLOAD_URL + edu_object.id + '/download',
             format : edu_name.pop(),
             id : edu_object.id.toString(),
             name : edu_name[0],
@@ -1008,16 +1022,14 @@ function download_button(download,file_name) {
         }));
 
         /* Starts download.*/
-        var file_path = Constants.DOWNLOAD_PATH +
+        let file_path = Constants.DOWNLOAD_PATH +
                             download.id + "/" + download.name + "." +
                             download.format;
 
-        EduBus.download.StartRemote(
-            meta_path + '/download.sh',
-            download.link,
+        EduBus.download.StartSync(
+            download.id.toString(),
             download.name,
-            download.format,
-            download.id.toString());
+            download.format);
 
         if (on_going_downloads.indexOf(download.id) < 0) {
             on_going_downloads.push(download.id);
@@ -1026,7 +1038,7 @@ function download_button(download,file_name) {
         Mainloop.timeout_add(500, function() {
             /*Begin inner Mainloop*/
 
-            if (download.size != EduBus.file.SizeSync(file_path)[0] &&
+            if (download.size != EduBus.file.SizeSync(file_path) &&
                 on_going_downloads.indexOf(download.id) >= 0) {
                 return true;
             } else {
-- 
GitLab