156 lines
6 KiB
Vala
156 lines
6 KiB
Vala
|
/*
|
||
|
Copyright (C) 2014 Paweł Forysiuk <tuxator@o2.pl>
|
||
|
Copyright (C) 2014 Christian Dywan <christian@twotoasts.de>
|
||
|
|
||
|
This library is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU Lesser General Public
|
||
|
License as published by the Free Software Foundation; either
|
||
|
version 2.1 of the License, or (at your option) any later version.
|
||
|
|
||
|
See the file COPYING for the full license text.
|
||
|
*/
|
||
|
|
||
|
namespace Adblock {
|
||
|
public class Updater : Feature {
|
||
|
string expires_meta;
|
||
|
string last_mod_meta;
|
||
|
public DateTime last_updated { get; set; }
|
||
|
public DateTime expires { get; set; }
|
||
|
public bool needs_update { get; set; }
|
||
|
|
||
|
public Updater () {
|
||
|
}
|
||
|
|
||
|
public override void clear () {
|
||
|
expires_meta = null;
|
||
|
last_mod_meta = null;
|
||
|
last_updated = null;
|
||
|
expires = null;
|
||
|
needs_update = false;
|
||
|
}
|
||
|
|
||
|
public override bool header (string key, string value) {
|
||
|
if (key.has_prefix ("Last mod") || key == "Updated") {
|
||
|
last_mod_meta = value;
|
||
|
return true;
|
||
|
} else if (key == "Expires") {
|
||
|
/* ! Expires: 5 days (update frequency) */
|
||
|
expires_meta = value;
|
||
|
return true;
|
||
|
} else if (key.has_prefix ("! This list expires after")) {
|
||
|
/* ! This list expires after 14 days */
|
||
|
expires_meta = key.substring (26, -1);
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public override bool parsed (File file) {
|
||
|
process_dates (file);
|
||
|
/* It's not an error to have no update headers, we go for defaults */
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
int get_month_from_string (string? month) {
|
||
|
if (month == null)
|
||
|
return 0;
|
||
|
|
||
|
string[] months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
|
||
|
for (int i = 0; i<= months.length; i++)
|
||
|
{
|
||
|
if (month.has_prefix (months[i]))
|
||
|
return i+1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void process_dates (File file) {
|
||
|
DateTime now = new DateTime.now_local ();
|
||
|
last_updated = null;
|
||
|
expires = null;
|
||
|
|
||
|
/* We have "last modification" metadata */
|
||
|
if (last_mod_meta != null && (last_mod_meta.contains (" ") && last_mod_meta[0].isdigit () == true)) {
|
||
|
int h = 0, min = 0, d, m, y;
|
||
|
/* Date in a form of: 20.08.2012 12:34 */
|
||
|
if (last_mod_meta.contains (".") || last_mod_meta.contains("-")) {
|
||
|
string[] parts = last_mod_meta.split (" ", 2);
|
||
|
string[] date_parts;
|
||
|
string split_char = " ";
|
||
|
|
||
|
/* contains time part ? */
|
||
|
if (parts[1] != "" && parts[1].contains (":")) {
|
||
|
string[] time_parts = parts[1].split (":", 2);
|
||
|
h = int.parse(time_parts[0]);
|
||
|
min = int.parse(time_parts[1]);
|
||
|
}
|
||
|
|
||
|
/* check if dot or dash was used as a delimiter */
|
||
|
if (parts[0].contains ("."))
|
||
|
split_char = ".";
|
||
|
else if (parts[0].contains ("-"))
|
||
|
split_char = "-";
|
||
|
|
||
|
date_parts = parts[0].split (split_char, 3);
|
||
|
m = int.parse(date_parts[1]);
|
||
|
if (date_parts[2].length == 4) {
|
||
|
y = int.parse(date_parts[2]);
|
||
|
d = int.parse(date_parts[0]);
|
||
|
} else {
|
||
|
y = int.parse(date_parts[0]);
|
||
|
d = int.parse(date_parts[2]);
|
||
|
}
|
||
|
} else { /* Date in a form of: 20 Mar 2012 12:34 */
|
||
|
string[] parts = last_mod_meta.split (" ", 4);
|
||
|
/* contains time part ? */
|
||
|
if (parts[3] != null && parts[3].contains (":")) {
|
||
|
string[] time_parts = parts[3].split (":", 2);
|
||
|
h = int.parse(time_parts[0]);
|
||
|
min = int.parse(time_parts[1]);
|
||
|
}
|
||
|
|
||
|
m = get_month_from_string (parts[1]);
|
||
|
if (parts[2].length == 4) {
|
||
|
y = int.parse(parts[2]);
|
||
|
d = int.parse(parts[0]);
|
||
|
} else {
|
||
|
y = int.parse(parts[0]);
|
||
|
d = int.parse(parts[2]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
last_updated = new DateTime.local (y, m, d, h, min, 0.0);
|
||
|
} else {
|
||
|
/* FIXME: use file modification date if there's no update header
|
||
|
try {
|
||
|
string modified = FileAttribute.TIME_MODIFIED;
|
||
|
var info = file.query_filesystem_info (modified);
|
||
|
last_updated = new DateTime.from_timeval_local (info.get_modification_time ());
|
||
|
} catch (Error error) {
|
||
|
last_updated = now;
|
||
|
}
|
||
|
*/
|
||
|
last_updated = now;
|
||
|
}
|
||
|
|
||
|
/* We have "expires" metadata */
|
||
|
if (expires_meta != null) {
|
||
|
if (expires_meta.contains ("days")) {
|
||
|
string[] parts = expires_meta.split (" ");
|
||
|
expires = last_updated.add_days (int.parse (parts[0]));
|
||
|
} else if (expires_meta.contains ("hours")) {
|
||
|
string[] parts = expires_meta.split (" ");
|
||
|
expires = last_updated.add_hours (int.parse (parts[0]));
|
||
|
}
|
||
|
} else {
|
||
|
/* No expire metadata found, assume x days */
|
||
|
int days_to_expire = 7;
|
||
|
expires = last_updated.add_days (days_to_expire);
|
||
|
}
|
||
|
|
||
|
/* Check if we are past expire date */
|
||
|
needs_update = now.compare (expires) == 1;
|
||
|
}
|
||
|
}
|
||
|
}
|