src/Resources.vala
[app.Builder.js] / src / Resources.vala
1 /**
2  * Resources
3  * 
4  * Idea is to manage resourse used by the app.
5  * 
6  * The original code downloaded all the resources before it renders the main window
7  * 
8  * This is a bit annoying as although they do change quite a bit, it's not on every app start
9  * 
10  * So the Resource fetching behaviour should be a button on the File view page
11  * That starts the refresh of the resources.
12  * 
13  * I'm not quite sure how we should flow this - if we do them all at once.. might be a bit of a server 
14  * overload... so sequentially may be best...
15 */
16
17 public class Resources : Object
18 {
19
20      public signal void updateProgress(uint cur_pos);
21
22      static Resources singleton_val;
23      
24      string[] avail_files;
25      Gee.ArrayList<string> fetch_files;
26      
27      public static Resources singleton()
28      {
29         if (singleton_val == null) {
30             singleton_val = new Resources();
31             singleton_val.ref();
32         }
33         return singleton_val;
34             
35      }
36          public Resources ()
37          {
38                  
39            this.avail_files = { 
40                    "roodata.json",
41                         "bootstrap.builder.html",
42                         "roo.builder.html",
43                         "roo.builder.js",
44                         "Gir.overides",
45                         "RooUsage.txt",
46                         "GtkUsage.txt",
47                         "resources/Editors/*.js"
48                         "Editors/Editor.Roo.grid.GridPanel.js"
49                 };
50                 this.fetch_files = new Gee.ArrayList<string>();
51                 for (var i=0;i < avail_files.length; i++) {
52                         this.fetch_files.add(avail_files[i]);
53                 }
54                 
55                 
56                 
57         }       
58                  
59                  
60     
61      uint fetch_pos = 0;
62      public void fetchStart()
63      {
64             if (this.fetch_pos > 0) { // only fetch one at a time...
65                 return;
66             }
67             this.fetch_pos =0;
68             this.fetchNext();
69          
70      }
71      public void fetchNext()
72     {
73         var cur = this.fetch_pos;
74         this.fetch_pos++;
75         this.updateProgress(this.fetch_pos); // min=0;
76         
77         
78         if (this.fetch_pos > this.avail_files.length) {
79                         this.updateProgress(0);
80                      this.fetch_pos = 0;
81                      return;
82                         
83                 }
84         var target = this.avail_files[cur];
85         
86         var src = "https://raw.githubusercontent.com/roojs/app.Builder.js/master/resources/" + target;
87         //var src = "http://git.roojs.org/?p=app.Builder.js;a=blob_plain;f=resources/" + target;
88         if (target == "roodata.json") {
89                         src = "https://raw.githubusercontent.com/roojs/roojs1/master/docs/json/roodata.json";
90                         //src = "http://git.roojs.org/?p=roojs1;a=blob_plain;f=docs/json/roodata.json";
91                 }
92
93                 if (target.contains('*')) {
94                         var split = target.split('*');
95                         src = "https://api.github.com/repos/roojs/app.Builder.js/contents/resources/Editors
96                         
97
98                 this.fetchResourceFrom ( src, target );
99                  
100
101          }
102          public void checkResources()
103          {
104                 bool needsload = false;
105                 string[] res = this.avail_files;
106                         
107                 for (var i = 0; i < res.length; i++ ) { 
108                         
109                         if (!FileUtils.test(
110                                 BuilderApplication.configDirectory() + "/resources/"  + res[i],
111                                 FileTest.EXISTS
112                                 )) {
113                                 needsload = true;
114                         }
115                 }
116                 if (!needsload) {
117                         return;
118                 }
119                 this.fetchStart();
120          }
121                  
122                         
123
124
125     
126     public void fetchResourceFrom(string src, string target)
127     {
128                  
129                 // fetch...
130                 print("downloading %s \nto : %s\n", src,target);
131                 var session = new Soup.Session ();
132                 session.user_agent = "App Builder ";
133             var message = new Soup.Message ("GET",  src );
134         session.queue_message (message, (sess, mess) => {
135                         
136                         
137                         var tfn = BuilderApplication.configDirectory() + "/resources/" + target;
138                         // create parent directory if needed
139                         if (!GLib.FileUtils.test (GLib.Path.get_dirname(tfn), FileTest.IS_DIR)) {
140                                 var f =  GLib.File.new_for_path(GLib.Path.get_dirname(tfn));
141                                 f.make_directory_with_parents ();
142                         }
143                         
144                         
145                         // set data??? - if it's binary?
146             FileUtils.set_contents(  tfn, (string) message.response_body.data );
147             
148             switch (target) {
149                                 case "Gir.overides":
150                                         Palete.Gir.factory("Gtk").loadOverrides(true);
151                                         break;
152                                         
153                                 case "GtkUsage.txt":
154                                         Palete.factory("Gtk").load();
155                                         break;
156                                         
157                                 case "roodata.json":
158                                         Palete.factory("Roo").classes  = null;
159                                         Palete.factory("Roo").load();
160                                         break;
161                                         
162                                 default:
163                                         break;
164                         }
165             
166             this.fetchNext();
167              
168         });
169                      
170
171     }
172 }