resources/RooUsage.txt
[app.Builder.js] / src / Builder4 / FakeServer.vala
index 325455a..b788213 100644 (file)
@@ -12,6 +12,9 @@
  *
  * the idea is nicked from geary.
  * 
+ * At present this serves from ~/gitlive/****  - that probably needs more thought..
+ * 
+ * 
  */
 public errordomain FakeServerError {
        FILE_DOES_NOT_EXIST
@@ -19,54 +22,174 @@ public errordomain FakeServerError {
 
 public class FakeServerCache : Object
 {
-
-       public string data;
+       public string fname;
+       public  uint8[]  data;
        public string content_type;
        public int64 size; 
-
+        
        public static Gee.HashMap<string,FakeServerCache> cache;
        
-        public static FakeServerCache factory(string fname)
+       public static FakeServerCache factory(string fname, string scheme)
        {
-           if (cache == null) {
-               cache = new Gee.HashMap<string,FakeServerCache>();
-           }
+               if (cache == null) {
+                       cache = new Gee.HashMap<string,FakeServerCache>();
+               }
+               
+          // print ("CACHE look for ==%s==\n", fname);
+           if (scheme == "resources") {
+                       return new FakeServerCache.from_resource(fname);
+               }
+           
            if (cache.has_key(fname)) {
-               return cache.get(fname);
-           }
+                       print ("CACHE got  %s\n", fname);
+                       return cache.get(fname);
+               }
+           print ("CACHE create %s\n", fname);
+           
            var el = new  FakeServerCache(fname);
  
-            
-           cache.set(fname, el);
+           cache.set(fname, el);
            return el;
        }
+       // called onload to clear the temporary cached file..
+       public static void remove(string fname) {
+               if (cache == null) {
+                       return;
+               }
+               if (!cache.has_key(fname)) {
+                       return;
+               }
+               
+           FakeServerCache v;
+           cache.unset(fname, out v);
+           
 
+           
+       }
+       public static  void clear()
+       {
+               if (cache == null) {
+                       return;
+               }
+               cache.clear();
+       }
+    
+       public static FakeServerCache factory_with_data(string data) {
+               if (cache == null) {
+                       cache = new Gee.HashMap<string,FakeServerCache>();
+               }
+               var el = new  FakeServerCache.with_data(data);
+               print("CACHE - store %s\n", el.fname);
+               cache.set(el.fname, el);
+               return el;
+       }
+    
+    
+    
+    
+       public FakeServerCache.with_data( string data )
+       {
+               this.fname = "/" + GLib.Checksum.compute_for_string(GLib.ChecksumType.MD5, data, data.length) + ".js";
+               this.data = data.data;
+               this.content_type = "text/javascript";
+               this.size= data.length;
+        
+         
+       }
+       public FakeServerCache.from_resource( string fname )
+       {
+               
+               
+               
+               this.fname = fname;
+               
+               var  file = File.new_for_path ( BuilderApplication.configDirectory() + "/resources/" + fname);
+               if (!file.query_exists()) {
+                       this.data = "".data;
+                       this.content_type = "";
+                       this.size = 0;
+                       return;
+               }
+               try {
+                   var info = file.query_info(
+                                    "standard::*",
+                                   FileQueryInfoFlags.NONE
+                   );
+               
+                   this.content_type = info.get_content_type();
+                   this.size = info.get_size();
+                   uint8[] data;
+                    
+                    
+                   GLib.FileUtils.get_data(file.get_path(), out data);
+                   this.data = data;
+               } catch (Error e) {
+                       this.data = "".data;
+                       this.size = 0;
+                       this.content_type = "";
+                       return;
+               }
+               
 
-       public FakeServerCache( string fname) {
+         
+       }
+       public FakeServerCache( string fname ) {
+              
+               this.fname = fname;
+               
                var  file = File.new_for_path ( GLib.Environment.get_home_dir() + "/gitlive" + fname);
                if (!file.query_exists()) {
-                   this.data = "";
-                   this.content_type = "";
-                   this.size = 0;
-                   return;
+                       this.data = "".data;
+                       this.content_type = "";
+                       this.size = 0;
+                       return;
+               }
+               try { 
+                   var info = file.query_info(
+                                    "standard::*",
+                                   FileQueryInfoFlags.NONE
+                   );
+                   this.content_type = info.get_content_type();
+                   this.size = info.get_size();
+                   uint8[] data;
+       
+                   GLib.FileUtils.get_data(file.get_path(), out data);
+                   this.data = data;
+               } catch (Error e) {
+                       this.data = "".data;
+                       this.size = 0;
+                       this.content_type = "";
+                       return;
                }
-                var info = file.query_info(
-                                "standard::*",
-                               FileQueryInfoFlags.NONE
-               );
-           this.content_type = info.get_content_type();
-           this.size = info.get_size();
-           string data;
-           size_t length;
-           GLib.FileUtils.get_contents(file.get_path(), out data, out length);
 
-           this.data = data;
+               
 
-           print("FakeServerCache :%s, %s (%s/%d)\n", fname , 
-                 this.content_type, this.size.to_string(), this.data.length);
+               print("FakeServerCache :%s, %s (%s/%d)\n", fname , 
+                       this.content_type, this.size.to_string(), this.data.length);
            
 
        }
+
+       public void run(WebKit.URISchemeRequest request, Cancellable? cancellable) 
+       {
+               var stream =  new GLib.MemoryInputStream.from_data (this.data,  GLib.free);
+               print("SEND %s\nwe", this.size.to_string()); 
+
+               request.finish(stream,
+                                        this.size,
+                                        this.content_type);
+                                
+               
+               
+           return;
+            
+       }
+       
+    
 }
 
 public class FakeServer : Object
@@ -77,21 +200,19 @@ public class FakeServer : Object
        {
                this.view = wkview;
                
-               
-               // 
-               
-                 
-        // Hook up signals.
-  
-        //this.view.resource_load_started.connect(on_resource_request_starting);
-        //this.view.navigation_policy_decision_requested.connect(on_navigation_policy_decision_requested);
-        //this.view.new_window_policy_decision_requested.connect(on_navigation_policy_decision_requested);
-          
-         //
-       var cx = this.view.get_context();
-        cx.register_uri_scheme("xhttp",  serve);
-       cx.set_cache_model (WebKit.CacheModel.DOCUMENT_VIEWER);
-        
+                
+               var cx = WebKit.WebContext.get_default();
+               //var cx = this.view.get_context();
+               cx.register_uri_scheme("xhttp",  serve);
+               cx.register_uri_scheme("resources",  serve);
+               cx.set_cache_model (WebKit.CacheModel.DOCUMENT_VIEWER);
+
+               // these do not help for cross domain requests..
+                       
+               //cx.get_security_manager().register_uri_scheme_as_cors_enabled("xhttp");
+               //cx.get_security_manager().register_uri_scheme_as_cors_enabled("http");
+               //cx.register_uri_scheme_as_cors_enabled("xhttp");
+       // = crash  cx.set_process_model (WebKit.ProcessModel.MULTIPLE_SECONDARY_PROCESSES );
     }
     
     
@@ -100,66 +221,19 @@ public class FakeServer : Object
                // request is URISchemeRequest
                         
                print("REQ: %s\n",request.get_path());
-               var cdata = FakeServerCache.factory(request.get_path());
+               var cdata = FakeServerCache.factory(request.get_path() , request.get_scheme());
        
                if (cdata.size < 1 ) {
                        print("Skip file missing = %s/gitlive%s\n", GLib.Environment.get_home_dir() , request.get_path());
                        request.finish_error(new FakeServerError.FILE_DOES_NOT_EXIST ("My error msg"));
                        return;
                }
+       
                print("Send :%s, %s (%s/%d)", request.get_path(), 
                      cdata.content_type, cdata.size.to_string(), cdata.data.length);
-          
-               var stream = new GLib.MemoryInputStream.from_data (cdata.data.data,  GLib.free);
-                   
-               // we could cache these memory streams... so no need to keep reading from disk...
-               // then what happens if file get's updated - neet to check the data against the cache..
-               
-               run_impl.begin(cancellable, (obj, res) => {
-                       InputStream? stream = null;
-
-                       try
-                       {
-                               stream = this.run_impl.end(res);
-                       } catch (Error e)  {
-                           request.finish_error(e);
-
-                       }
-               });
-               
-               request.finish (  stream, cdata.size  , cdata.content_type);
-               //stream.close();
-       }
-
-    private async InputStream? run_impl(Cancellable? cancellable) throws GLib.Error
-    {
-       SourceFunc callback = run_impl.callback;
-       InputStream? ret = null;
-       new Thread<void*>("builder-fake-webserver", () => {
-               // Actually do it
-               try
-               {
-                       ret = this.run_async(cancellable);
-               }
-               catch (Error e)
-               {
-                       err = e;
-               }
-
-               // Schedule the callback in idle
-               Idle.add((owned)callback);
-               return null;
-       });
-
-       // Wait for it to finish, yield to caller
-       yield;
-
-       if (err != null)
-       {
-               throw err;
+               cdata.run(request,    null);
+                
        }
 
-       // Return the input stream
-       return ret;
-    }
+   
 }