*
* the idea is nicked from geary.
*
+ * At present this serves from ~/gitlive/**** - that probably needs more thought..
+ *
+ *
*/
public errordomain FakeServerError {
FILE_DOES_NOT_EXIST
public class FakeServerCache : Object
{
public string fname;
- public string data;
+ 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>();
- }
- print ("CACHE look for ==%s==\n", fname);
+ 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)) {
- print ("CACHE got %s\n", 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);
}
// called onload to clear the temporary cached file..
public static void remove(string fname) {
- if (cache == null) {
- return;
- }
- if (!cache.has_key(fname)) {
- return;
- }
-
+ if (cache == null) {
+ return;
+ }
+ if (!cache.has_key(fname)) {
+ return;
+ }
+
FakeServerCache v;
- print("CACHE delete %s\n", this.fname);
+
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;
+ 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;
- this.content_type = "text/javascript";
- this.size= data.length;
+
+
+
+ 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 ) {
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;
- try {
- GLib.FileUtils.get_contents(file.get_path(), out data, out length);
- } catch (Error e) {
- this.data = "";
- this.size = 0;
- this.content_type = "";
- return;
- }
- 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.data, GLib.free);
+ 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);
-
-
+ this.size,
+ this.content_type);
+
+
return;
}
+
+
}
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 = WebKit.WebContext.get_default();
- //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 );
}
// 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());