2018-04-14 14:09:06 +02:00
|
|
|
using Soup;
|
|
|
|
using GLib;
|
2018-05-08 18:09:38 +02:00
|
|
|
using Gdk;
|
2018-04-14 14:09:06 +02:00
|
|
|
using Json;
|
|
|
|
|
2018-06-17 09:48:18 +02:00
|
|
|
public class Tootle.Network : GLib.Object {
|
2018-04-14 14:09:06 +02:00
|
|
|
|
2018-10-23 12:05:24 +02:00
|
|
|
public signal void started ();
|
|
|
|
public signal void finished ();
|
2018-05-16 13:23:48 +02:00
|
|
|
|
2018-10-23 12:05:24 +02:00
|
|
|
public signal void notification (Notification notification);
|
|
|
|
public signal void status_removed (int64 id);
|
2018-04-14 14:09:06 +02:00
|
|
|
|
|
|
|
private int requests_processing = 0;
|
|
|
|
private Soup.Session session;
|
|
|
|
|
2018-05-03 10:56:04 +02:00
|
|
|
construct {
|
2018-04-14 14:09:06 +02:00
|
|
|
session = new Soup.Session ();
|
2018-05-03 11:09:55 +02:00
|
|
|
session.ssl_strict = true;
|
|
|
|
session.ssl_use_system_ca_file = true;
|
|
|
|
session.timeout = 20;
|
2018-05-05 17:38:01 +02:00
|
|
|
session.max_conns = 15;
|
2018-05-08 18:09:38 +02:00
|
|
|
session.request_unqueued.connect (msg => {
|
2018-04-14 14:09:06 +02:00
|
|
|
requests_processing--;
|
|
|
|
if(requests_processing <= 0)
|
|
|
|
finished ();
|
|
|
|
});
|
2018-05-05 17:38:01 +02:00
|
|
|
|
2018-05-09 16:20:40 +02:00
|
|
|
// Soup.Logger logger = new Soup.Logger (Soup.LoggerLogLevel.BODY, -1);
|
2018-05-05 17:38:01 +02:00
|
|
|
// session.add_feature (logger);
|
2018-04-14 14:09:06 +02:00
|
|
|
}
|
|
|
|
|
2018-10-23 12:05:24 +02:00
|
|
|
public Network () {}
|
2018-05-11 17:19:48 +02:00
|
|
|
|
2018-06-02 09:43:54 +02:00
|
|
|
public async WebsocketConnection stream (Soup.Message msg) throws GLib.Error {
|
2018-05-11 17:19:48 +02:00
|
|
|
return yield session.websocket_connect_async (msg, null, null, null);
|
2018-04-14 14:09:06 +02:00
|
|
|
}
|
|
|
|
|
2018-05-24 21:03:34 +02:00
|
|
|
public Soup.Message queue (Soup.Message msg, owned Soup.SessionCallback? cb = null) {
|
2018-04-14 14:09:06 +02:00
|
|
|
requests_processing++;
|
|
|
|
started ();
|
|
|
|
|
2018-06-17 11:34:16 +02:00
|
|
|
var formal = accounts.formal;
|
2018-05-27 18:25:16 +02:00
|
|
|
if(formal != null)
|
|
|
|
msg.request_headers.append ("Authorization", "Bearer " + formal.token);
|
2018-04-14 14:09:06 +02:00
|
|
|
|
2018-04-29 18:04:26 +02:00
|
|
|
session.queue_message (msg, (sess, mess) => {
|
|
|
|
switch (mess.tls_errors){
|
|
|
|
case GLib.TlsCertificateFlags.UNKNOWN_CA:
|
|
|
|
case GLib.TlsCertificateFlags.BAD_IDENTITY:
|
|
|
|
case GLib.TlsCertificateFlags.NOT_ACTIVATED:
|
|
|
|
case GLib.TlsCertificateFlags.EXPIRED:
|
|
|
|
case GLib.TlsCertificateFlags.REVOKED:
|
|
|
|
case GLib.TlsCertificateFlags.INSECURE:
|
|
|
|
case GLib.TlsCertificateFlags.GENERIC_ERROR:
|
|
|
|
var err = mess.tls_errors.to_string ();
|
|
|
|
warning ("TLS error: "+err);
|
2018-06-17 11:34:16 +02:00
|
|
|
app.error (_("TLS Error"), _("Can't ensure secure connection: ")+err);
|
2018-04-29 18:04:26 +02:00
|
|
|
return;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2018-05-16 13:23:48 +02:00
|
|
|
|
2018-05-27 18:25:16 +02:00
|
|
|
if (mess.status_code != Soup.Status.OK) {
|
|
|
|
var phrase = Soup.Status.get_phrase (mess.status_code);
|
2018-06-17 11:34:16 +02:00
|
|
|
app.toast (_("Error: %s").printf(phrase));
|
2018-05-27 18:25:16 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-01 15:53:46 +02:00
|
|
|
if (cb != null)
|
|
|
|
cb (sess, mess);
|
2018-05-18 23:14:12 +02:00
|
|
|
|
|
|
|
msg.request_body.free ();
|
|
|
|
msg.response_body.free ();
|
|
|
|
msg.request_headers.free ();
|
|
|
|
msg.response_headers.free ();
|
2018-04-29 18:04:26 +02:00
|
|
|
});
|
2018-04-14 14:09:06 +02:00
|
|
|
return msg;
|
|
|
|
}
|
|
|
|
|
2018-05-29 19:04:04 +02:00
|
|
|
public void queue_custom (Soup.Message msg, owned Soup.SessionCallback? cb = null) {
|
2018-06-17 11:34:16 +02:00
|
|
|
requests_processing++;
|
|
|
|
started ();
|
|
|
|
|
|
|
|
msg.finished.connect_after (() => {
|
|
|
|
msg.request_body.free ();
|
|
|
|
msg.response_body.free ();
|
|
|
|
msg.request_headers.free ();
|
|
|
|
msg.response_headers.free ();
|
|
|
|
});
|
2018-05-27 18:25:16 +02:00
|
|
|
session.queue_message (msg, cb);
|
|
|
|
}
|
|
|
|
|
2018-05-08 18:09:38 +02:00
|
|
|
public Json.Object parse (Soup.Message msg) throws GLib.Error {
|
2018-05-22 23:37:51 +02:00
|
|
|
// debug ("Status Code: %u", msg.status_code);
|
|
|
|
// debug ("Message length: %lld", msg.response_body.length);
|
|
|
|
// debug ("Object: %s", (string) msg.response_body.data);
|
2018-04-14 14:09:06 +02:00
|
|
|
|
|
|
|
var parser = new Json.Parser ();
|
|
|
|
parser.load_from_data ((string) msg.response_body.flatten ().data, -1);
|
|
|
|
return parser.get_root ().get_object ();
|
|
|
|
}
|
|
|
|
|
2018-05-08 18:09:38 +02:00
|
|
|
public Json.Array parse_array (Soup.Message msg) throws GLib.Error {
|
2018-05-22 23:37:51 +02:00
|
|
|
// debug ("Status Code: %u", msg.status_code);
|
|
|
|
// debug ("Message length: %lld", msg.response_body.length);
|
|
|
|
// debug ("Array: %s", (string) msg.response_body.data);
|
2018-04-14 14:09:06 +02:00
|
|
|
|
|
|
|
var parser = new Json.Parser ();
|
|
|
|
parser.load_from_data ((string) msg.response_body.flatten ().data, -1);
|
|
|
|
return parser.get_root ().get_array ();
|
|
|
|
}
|
2018-05-03 10:56:04 +02:00
|
|
|
|
2018-06-02 11:27:19 +02:00
|
|
|
public void load_avatar (string url, Granite.Widgets.Avatar avatar, int size){
|
2018-05-29 19:04:04 +02:00
|
|
|
if (settings.cache) {
|
|
|
|
image_cache.load_avatar (url, avatar, size);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-08 18:09:38 +02:00
|
|
|
var msg = new Soup.Message("GET", url);
|
|
|
|
msg.finished.connect(() => {
|
2018-06-17 11:34:16 +02:00
|
|
|
if (msg.status_code != Soup.Status.OK) {
|
|
|
|
avatar.show_default (size);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-29 19:04:04 +02:00
|
|
|
var data = msg.response_body.data;
|
|
|
|
var stream = new MemoryInputStream.from_data (data);
|
|
|
|
var pixbuf = new Gdk.Pixbuf.from_stream_at_scale (stream, size, size, true);
|
2018-06-02 11:27:19 +02:00
|
|
|
avatar.pixbuf = pixbuf.scale_simple (size, size, Gdk.InterpType.BILINEAR);
|
2018-05-08 18:09:38 +02:00
|
|
|
});
|
2018-06-17 11:34:16 +02:00
|
|
|
network.queue_custom (msg);
|
2018-05-08 18:09:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public void load_image (string url, Gtk.Image image) {
|
2018-05-29 19:04:04 +02:00
|
|
|
if (settings.cache) {
|
|
|
|
image_cache.load_image (url, image);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-08 18:09:38 +02:00
|
|
|
var msg = new Soup.Message("GET", url);
|
|
|
|
msg.finished.connect(() => {
|
2018-06-17 11:34:16 +02:00
|
|
|
if (msg.status_code != Soup.Status.OK) {
|
|
|
|
image.set_from_icon_name ("image-missing", Gtk.IconSize.LARGE_TOOLBAR);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-29 19:04:04 +02:00
|
|
|
var data = msg.response_body.data;
|
|
|
|
var stream = new MemoryInputStream.from_data (data);
|
|
|
|
var pixbuf = new Gdk.Pixbuf.from_stream (stream);
|
|
|
|
image.set_from_pixbuf (pixbuf);
|
2018-05-08 18:09:38 +02:00
|
|
|
});
|
2018-06-17 11:34:16 +02:00
|
|
|
network.queue_custom (msg);
|
2018-05-03 10:56:04 +02:00
|
|
|
}
|
2018-05-09 16:20:40 +02:00
|
|
|
|
2018-06-02 11:27:19 +02:00
|
|
|
public void load_scaled_image (string url, Gtk.Image image, int size) {
|
2018-05-29 19:04:04 +02:00
|
|
|
if (settings.cache) {
|
|
|
|
image_cache.load_scaled_image (url, image, size);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-09 16:20:40 +02:00
|
|
|
var msg = new Soup.Message("GET", url);
|
|
|
|
msg.finished.connect(() => {
|
2018-06-17 11:34:16 +02:00
|
|
|
if (msg.status_code != Soup.Status.OK) {
|
|
|
|
image.set_from_icon_name ("image-missing", Gtk.IconSize.LARGE_TOOLBAR);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-29 19:04:04 +02:00
|
|
|
var data = msg.response_body.data;
|
|
|
|
var stream = new MemoryInputStream.from_data (data);
|
|
|
|
var pixbuf = new Gdk.Pixbuf.from_stream_at_scale (stream, size, size, true);
|
|
|
|
image.set_from_pixbuf (pixbuf);
|
2018-05-09 16:20:40 +02:00
|
|
|
});
|
2018-06-17 11:34:16 +02:00
|
|
|
network.queue_custom (msg);
|
2018-05-09 16:20:40 +02:00
|
|
|
}
|
2018-05-11 17:19:48 +02:00
|
|
|
|
2018-04-14 14:09:06 +02:00
|
|
|
}
|