[geary/wip/737642-uint: 2/2] Further work checking received numbers
- From: Jim Nelson <jnelson src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/737642-uint: 2/2] Further work checking received numbers
- Date: Wed, 12 Nov 2014 21:20:52 +0000 (UTC)
commit 19e786d34a82b65e94c5e94afefd91d61f209d10
Author: Jim Nelson <jim yorba org>
Date: Wed Nov 12 13:17:34 2014 -0800
Further work checking received numbers
Range and format are now more thoroughly checked throughout the stack.
src/engine/api/geary-email-properties.vala | 4 +-
src/engine/api/geary-email.vala | 12 ++-----
src/engine/common/common-message-data.vala | 26 ----------------
src/engine/imap-db/imap-db-folder.vala | 10 +++---
src/engine/imap-db/imap-db-message-row.vala | 4 +-
.../imap-engine-abstract-list-email.vala | 2 +-
src/engine/imap/api/imap-folder.vala | 11 +++++--
src/engine/imap/message/imap-message-data.vala | 2 +-
src/engine/imap/message/imap-sequence-number.vala | 29 ++++++++++-------
src/engine/imap/message/imap-uid-validity.vala | 32 ++++++++++++++++++++
src/engine/imap/message/imap-uid.vala | 25 +++++++++++++++
.../imap/parameter/imap-number-parameter.vala | 19 +++++++----
.../imap/parameter/imap-string-parameter.vala | 20 ++++++++----
.../imap/response/imap-fetch-data-decoder.vala | 4 +-
src/engine/imap/response/imap-fetched-data.vala | 3 +-
src/engine/imap/response/imap-response-code.vala | 4 +-
src/engine/imap/response/imap-server-data.vala | 2 +-
src/engine/imap/response/imap-status-data.vala | 4 +-
src/engine/rfc822/rfc822-message-data.vala | 4 +-
19 files changed, 132 insertions(+), 85 deletions(-)
---
diff --git a/src/engine/api/geary-email-properties.vala b/src/engine/api/geary-email-properties.vala
index 41b5970..927d6f5 100644
--- a/src/engine/api/geary-email-properties.vala
+++ b/src/engine/api/geary-email-properties.vala
@@ -24,9 +24,9 @@ public abstract class Geary.EmailProperties : BaseObject {
/**
* Total size of the email (header and body) in bytes.
*/
- public long total_bytes { get; protected set; }
+ public int64 total_bytes { get; protected set; }
- public EmailProperties(DateTime date_received, long total_bytes) {
+ public EmailProperties(DateTime date_received, int64 total_bytes) {
this.date_received = date_received;
this.total_bytes = total_bytes;
}
diff --git a/src/engine/api/geary-email.vala b/src/engine/api/geary-email.vala
index f7ffddc..5c9ef33 100644
--- a/src/engine/api/geary-email.vala
+++ b/src/engine/api/geary-email.vala
@@ -397,15 +397,9 @@ public class Geary.Email : BaseObject {
if (aprop == null || bprop == null)
return compare_id_ascending(aemail, bemail);
- long asize = aprop.total_bytes;
- long bsize = bprop.total_bytes;
-
- if (asize < bsize)
- return -1;
- else if (asize > bsize)
- return 1;
- else
- return compare_id_ascending(aemail, bemail);
+ int cmp = (int) (aprop.total_bytes - bprop.total_bytes).clamp(-1, 1);
+
+ return (cmp != 0) ? cmp : compare_id_ascending(aemail, bemail);
}
/**
diff --git a/src/engine/common/common-message-data.vala b/src/engine/common/common-message-data.vala
index 59b39a2..65f420e 100644
--- a/src/engine/common/common-message-data.vala
+++ b/src/engine/common/common-message-data.vala
@@ -83,32 +83,6 @@ public abstract class Geary.MessageData.IntMessageData : AbstractMessageData,
}
}
-public abstract class Geary.MessageData.LongMessageData : AbstractMessageData,
- Gee.Hashable<LongMessageData> {
- public long value { get; private set; }
-
- private uint stored_hash = uint.MAX;
-
- public LongMessageData(long value) {
- this.value = value;
- }
-
- public virtual bool equal_to(LongMessageData other) {
- if (this == other)
- return true;
-
- return (value == other.value);
- }
-
- public virtual uint hash() {
- return (stored_hash != uint.MAX) ? stored_hash : (stored_hash = int64_hash((int64) value));
- }
-
- public override string to_string() {
- return value.to_string();
- }
-}
-
public abstract class Geary.MessageData.Int64MessageData : AbstractMessageData,
Gee.Hashable<Int64MessageData> {
public int64 value { get; private set; }
diff --git a/src/engine/imap-db/imap-db-folder.vala b/src/engine/imap-db/imap-db-folder.vala
index 1629e3a..b9a4bae 100644
--- a/src/engine/imap-db/imap-db-folder.vala
+++ b/src/engine/imap-db/imap-db-folder.vala
@@ -1180,7 +1180,7 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
Imap.EmailProperties? imap_properties = (Imap.EmailProperties) email.properties;
string? internaldate = (imap_properties != null && imap_properties.internaldate != null)
? imap_properties.internaldate.serialize() : null;
- long rfc822_size = (imap_properties != null) ? imap_properties.rfc822_size.value : -1;
+ int64 rfc822_size = (imap_properties != null) ? imap_properties.rfc822_size.value : -1;
if (String.is_empty(internaldate) || rfc822_size < 0) {
debug("Unable to detect duplicates for %s (%s available but invalid)", email.id.to_string(),
@@ -1202,8 +1202,8 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
int64 message_id = results.rowid_at(0);
if (results.next(cancellable)) {
- debug("Warning: multiple messages with the same internaldate (%s) and size (%lu) in %s",
- internaldate, rfc822_size, to_string());
+ debug("Warning: multiple messages with the same internaldate (%s) and size (%s) in %s",
+ internaldate, rfc822_size.to_string(), to_string());
}
Db.Statement search_stmt = cx.prepare(
@@ -1323,7 +1323,7 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
stmt.bind_string(16, row.email_flags);
stmt.bind_string(17, row.internaldate);
stmt.bind_int64(18, row.internaldate_time_t);
- stmt.bind_long(19, row.rfc822_size);
+ stmt.bind_int64(19, row.rfc822_size);
int64 message_id = stmt.exec_insert(cancellable);
@@ -1732,7 +1732,7 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
"UPDATE MessageTable SET internaldate=?, internaldate_time_t=?, rfc822_size=? WHERE id=?");
stmt.bind_string(0, row.internaldate);
stmt.bind_int64(1, row.internaldate_time_t);
- stmt.bind_long(2, row.rfc822_size);
+ stmt.bind_int64(2, row.rfc822_size);
stmt.bind_rowid(3, row.id);
stmt.exec(cancellable);
diff --git a/src/engine/imap-db/imap-db-message-row.vala b/src/engine/imap-db/imap-db-message-row.vala
index 98c5c60..a2c4c9a 100644
--- a/src/engine/imap-db/imap-db-message-row.vala
+++ b/src/engine/imap-db/imap-db-message-row.vala
@@ -34,7 +34,7 @@ private class Geary.ImapDB.MessageRow {
public string? email_flags { get; set; default = null; }
public string? internaldate { get; set; default = null; }
public time_t internaldate_time_t { get; set; default = -1; }
- public long rfc822_size { get; set; default = -1; }
+ public int64 rfc822_size { get; set; default = -1; }
public MessageRow() {
}
@@ -93,7 +93,7 @@ private class Geary.ImapDB.MessageRow {
if (fields.is_all_set(Geary.Email.Field.PROPERTIES)) {
internaldate = results.string_for("internaldate");
internaldate_time_t = (time_t) results.int64_for("internaldate_time_t");
- rfc822_size = results.long_for("rfc822_size");
+ rfc822_size = results.int64_for("rfc822_size");
}
}
diff --git a/src/engine/imap-engine/replay-ops/imap-engine-abstract-list-email.vala
b/src/engine/imap-engine/replay-ops/imap-engine-abstract-list-email.vala
index f391ff6..e9de104 100644
--- a/src/engine/imap-engine/replay-ops/imap-engine-abstract-list-email.vala
+++ b/src/engine/imap-engine/replay-ops/imap-engine-abstract-list-email.vala
@@ -219,7 +219,7 @@ private abstract class Geary.ImapEngine.AbstractListEmail : Geary.ImapEngine.Sen
if (flags.is_oldest_to_newest()) {
if (initial_uid == null) {
// if oldest to newest and initial-id is null, then start at the bottom
- low_pos = new Imap.SequenceNumber(1);
+ low_pos = new Imap.SequenceNumber(Imap.SequenceNumber.MIN);
} else {
Gee.Map<Imap.UID, Imap.SequenceNumber>? map = yield
owner.remote_folder.uid_to_position_async(
new Imap.MessageSet.uid(initial_uid), cancellable);
diff --git a/src/engine/imap/api/imap-folder.vala b/src/engine/imap/api/imap-folder.vala
index 4441b82..82f316a 100644
--- a/src/engine/imap/api/imap-folder.vala
+++ b/src/engine/imap/api/imap-folder.vala
@@ -238,8 +238,13 @@ private class Geary.Imap.Folder : BaseObject {
private void on_search(Gee.List<int64?> seq_or_uid) {
// All SEARCH from this class are UID SEARCH, so can reliably convert and add to
// accumulator
- foreach (int64 uid in seq_or_uid)
- search_accumulator.add(new UID(uid));
+ foreach (int64 uid in seq_or_uid) {
+ try {
+ search_accumulator.add(new UID.checked(uid));
+ } catch (ImapError imaperr) {
+ debug("%s Unable to process SEARCH UID result: %s", to_string(), imaperr.message);
+ }
+ }
}
private void on_status_response(StatusResponse status_response) {
@@ -1002,7 +1007,7 @@ private class Geary.Imap.Folder : BaseObject {
StatusResponse response = responses.get(cmd);
if (response.status == Status.OK && response.response_code != null &&
response.response_code.get_response_code_type().is_value("appenduid")) {
- UID new_id = new UID(response.response_code.get_as_string(2).as_int64());
+ UID new_id = new UID.checked(response.response_code.get_as_string(2).as_int64());
return new ImapDB.EmailIdentifier.no_message_id(new_id);
}
diff --git a/src/engine/imap/message/imap-message-data.vala b/src/engine/imap/message/imap-message-data.vala
index 7e18aaa..e0a5dd3 100644
--- a/src/engine/imap/message/imap-message-data.vala
+++ b/src/engine/imap/message/imap-message-data.vala
@@ -20,7 +20,7 @@ public interface Geary.Imap.MessageData : Geary.MessageData.AbstractMessageData
}
public class Geary.Imap.RFC822Size : Geary.RFC822.Size, Geary.Imap.MessageData {
- public RFC822Size(long value) {
+ public RFC822Size(int64 value) {
base (value);
}
}
diff --git a/src/engine/imap/message/imap-sequence-number.vala
b/src/engine/imap/message/imap-sequence-number.vala
index 82cc392..f13de5b 100644
--- a/src/engine/imap/message/imap-sequence-number.vala
+++ b/src/engine/imap/message/imap-sequence-number.vala
@@ -29,36 +29,41 @@ public class Geary.Imap.SequenceNumber : Geary.MessageData.Int64MessageData, Gea
/**
* Create a new { link SequenceNumber}.
*
- * This does not check if the value is valid, i.e. >= { link MIN_VALUE}.
+ * This does not check if the value is valid.
+ *
+ * @see is_value_valid
+ * @see SequenceNumber.checked
*/
public SequenceNumber(int64 value) {
base (value);
}
/**
- * Converts an array of ints into an array of { link SequenceNumber}s.
+ * Create a new { link SequenceNumber}, throwing { link ImapError.INVALID} if an invalid value
+ * is passed in.
+ *
+ * @see is_value_valid
+ * @see SequenceNumber
*/
- public static SequenceNumber[] to_list(int[] value_array) {
- SequenceNumber[] list = new SequenceNumber[0];
- foreach (int value in value_array)
- list += new SequenceNumber(value);
+ public SequenceNumber.checked(int64 value) throws ImapError {
+ if (!is_value_valid(value))
+ throw new ImapError.INVALID("Invalid sequence number %s", value.to_string());
- return list;
+ base (value);
}
/**
* Defined as { link value} >= { link MIN} and <= { link MAX}.
*/
- public bool is_valid() {
+ public static bool is_value_valid(int64 value) {
return value >= MIN && value <= MAX;
}
/**
- * Returns a new { link SequenceNumber} that is one higher than this value.
- *
+ * Defined as { link value} >= { link MIN} and <= { link MAX}.
*/
- public SequenceNumber inc() {
- return new SequenceNumber(value + 1);
+ public bool is_valid() {
+ return is_value_valid(value);
}
/**
diff --git a/src/engine/imap/message/imap-uid-validity.vala b/src/engine/imap/message/imap-uid-validity.vala
index f1ed27d..1068838 100644
--- a/src/engine/imap/message/imap-uid-validity.vala
+++ b/src/engine/imap/message/imap-uid-validity.vala
@@ -18,8 +18,40 @@ public class Geary.Imap.UIDValidity : Geary.MessageData.Int64MessageData, Geary.
public static int64 MAX = uint32.MAX;
public static int64 INVALID = -1;
+ /**
+ * Creates a new { link UIDValidity} without checking for valid values.
+ *
+ * @see UIDValidity.checked
+ */
public UIDValidity(int64 value) {
base (value);
}
+
+ /**
+ * Creates a new { link UIDValidity}, throwing { link ImapError.INVALID} if the supplied value
+ * is invalid.
+ *
+ * @see is_value_valid
+ */
+ public UIDValidity.checked(int64 value) throws ImapError {
+ if (!is_value_valid(value))
+ throw new ImapError.INVALID("Invalid UIDVALIDITY %s", value.to_string());
+
+ base (value);
+ }
+
+ /**
+ * @see is_value_valid
+ */
+ public bool is_valid() {
+ return is_value_valid(value);
+ }
+
+ /**
+ * Returns true if the supplied value is between { link MIN} and { link MAX}, inclusive.
+ */
+ public static bool is_value_valid(int64 val) {
+ return Numeric.int64_in_range_inclusive(val, MIN, MAX);
+ }
}
diff --git a/src/engine/imap/message/imap-uid.vala b/src/engine/imap/message/imap-uid.vala
index 0fc5199..e0a85dd 100644
--- a/src/engine/imap/message/imap-uid.vala
+++ b/src/engine/imap/message/imap-uid.vala
@@ -19,14 +19,39 @@ public class Geary.Imap.UID : Geary.MessageData.Int64MessageData, Geary.Imap.Mes
public static int64 MAX = uint32.MAX;
public static int64 INVALID = -1;
+ /**
+ * Creates a new { link UID} without checking for validity.
+ *
+ * @see UID.checked
+ * @see is_value_valid
+ */
public UID(int64 value) {
base (value);
}
+ /**
+ * Creates a new { link UID}, throwing an { link ImapError.INVALID} if the supplied value is
+ * not a positive unsigned 32-bit integer.
+ *
+ * @see is_value_valid
+ */
+ public UID.checked(int64 value) throws ImapError {
+ if (!is_value_valid(value))
+ throw new ImapError.INVALID("Invalid UID %s", value.to_string());
+
+ base (value);
+ }
+
+ /**
+ * @see is_value_valid
+ */
public bool is_valid() {
return is_value_valid(value);
}
+ /**
+ * Returns true if the supplied value is between { link MIN} and { link MAX}, inclusive.
+ */
public static bool is_value_valid(int64 val) {
return Numeric.int64_in_range_inclusive(val, MIN, MAX);
}
diff --git a/src/engine/imap/parameter/imap-number-parameter.vala
b/src/engine/imap/parameter/imap-number-parameter.vala
index f6c29f5..e32c3cc 100644
--- a/src/engine/imap/parameter/imap-number-parameter.vala
+++ b/src/engine/imap/parameter/imap-number-parameter.vala
@@ -53,37 +53,42 @@ public class Geary.Imap.NumberParameter : UnquotedStringParameter {
* positive value. is_negative returns set to true if that's the case. is_negative is only
* a valid value if the method returns true itself.
*
+ * is_negative is false for zero ("0") and negative zero ("-0").
+ *
* Empty strings (null or zero-length) are considered non-numeric. Leading and trailing
* whitespace are stripped before evaluating the string.
*/
- public static bool is_numeric(string s, out bool is_negative) {
+ public static bool is_ascii_numeric(string ascii, out bool is_negative) {
is_negative = false;
- string str = s.strip();
+ string str = ascii.strip();
if (String.is_empty(str))
return false;
- bool first_char = true;
+ bool has_nonzero = false;
int index = 0;
for (;;) {
char ch = str[index++];
if (ch == String.EOS)
break;
- if (first_char && ch == '-') {
+ if (index == 1 && ch == '-') {
is_negative = true;
- first_char = false;
continue;
}
- first_char = false;
-
if (!ch.isdigit())
return false;
+
+ if (ch != '0')
+ has_nonzero = true;
}
+ if (is_negative && !has_nonzero)
+ is_negative = false;
+
return true;
}
}
diff --git a/src/engine/imap/parameter/imap-string-parameter.vala
b/src/engine/imap/parameter/imap-string-parameter.vala
index b89d8e9..01b6f0b 100644
--- a/src/engine/imap/parameter/imap-string-parameter.vala
+++ b/src/engine/imap/parameter/imap-string-parameter.vala
@@ -52,7 +52,7 @@ public abstract class Geary.Imap.StringParameter : Geary.Imap.Parameter {
* @see Parameter.get_for_string
*/
public static StringParameter get_best_for(string value) throws ImapError {
- if (NumberParameter.is_numeric(value, null))
+ if (NumberParameter.is_ascii_numeric(value, null))
return new NumberParameter.from_ascii(value);
switch (DataFormat.is_quoting_required(value)) {
@@ -164,22 +164,28 @@ public abstract class Geary.Imap.StringParameter : Geary.Imap.Parameter {
}
/**
- * Converts the { link value} to an int, clamped between clamp_min and clamp_max.
+ * Converts the { link value} to a signed 32-bit integer, clamped between clamp_min and clamp_max.
*
- * TODO: This does not check that the value is a properly-formed integer. This should be
- *. added later.
+ * ImapError.INVALID is thrown if the { link StringParameter} contains non-numeric values. No
+ * error is thrown if the numeric value is outside the clamped range.
*/
public int32 as_int32(int32 clamp_min = int32.MIN, int32 clamp_max = int32.MAX) throws ImapError {
+ if (!NumberParameter.is_ascii_numeric(ascii, null))
+ throw new ImapError.INVALID("Cannot convert \"%s\" to int32: not numeric", ascii);
+
return (int32) int64.parse(ascii).clamp(clamp_min, clamp_max);
}
/**
- * Converts the { link value} to a 64-bit integer, clamped between clamp_min and clamp_max.
+ * Converts the { link value} to a signed 64-bit integer, clamped between clamp_min and clamp_max.
*
- * TODO: This does not check that the value is a properly-formed 64-bit integer. This should be
- *. added later.
+ * ImapError.INVALID is thrown if the { link StringParameter} contains non-numeric values. No
+ * error is thrown if the numeric value is outside the clamped range.
*/
public int64 as_int64(int64 clamp_min = int64.MIN, int64 clamp_max = int64.MAX) throws ImapError {
+ if (!NumberParameter.is_ascii_numeric(ascii, null))
+ throw new ImapError.INVALID("Cannot convert \"%s\" to int64: not numeric", ascii);
+
return int64.parse(ascii).clamp(clamp_min, clamp_max);
}
}
diff --git a/src/engine/imap/response/imap-fetch-data-decoder.vala
b/src/engine/imap/response/imap-fetch-data-decoder.vala
index 99f3676..b4d5667 100644
--- a/src/engine/imap/response/imap-fetch-data-decoder.vala
+++ b/src/engine/imap/response/imap-fetch-data-decoder.vala
@@ -85,7 +85,7 @@ public class Geary.Imap.UIDDecoder : Geary.Imap.FetchDataDecoder {
}
protected override MessageData decode_string(StringParameter stringp) throws ImapError {
- return new UID(stringp.as_int64());
+ return new UID.checked(stringp.as_int64());
}
}
@@ -119,7 +119,7 @@ public class Geary.Imap.RFC822SizeDecoder : Geary.Imap.FetchDataDecoder {
}
protected override MessageData decode_string(StringParameter stringp) throws ImapError {
- return new RFC822Size(stringp.as_int32());
+ return new RFC822Size(stringp.as_int64(0, int64.MAX));
}
}
diff --git a/src/engine/imap/response/imap-fetched-data.vala b/src/engine/imap/response/imap-fetched-data.vala
index f07455f..54292d4 100644
--- a/src/engine/imap/response/imap-fetched-data.vala
+++ b/src/engine/imap/response/imap-fetched-data.vala
@@ -49,7 +49,8 @@ public class Geary.Imap.FetchedData : Object {
if (!server_data.get_as_string(2).equals_ci(FetchCommand.NAME))
throw new ImapError.PARSE_ERROR("Not FETCH data: %s", server_data.to_string());
- FetchedData fetched_data = new FetchedData(new
SequenceNumber(server_data.get_as_string(1).as_int64()));
+ FetchedData fetched_data = new FetchedData(
+ new SequenceNumber.checked(server_data.get_as_string(1).as_int64()));
// walk the list for each returned fetch data item, which is paired by its data item name
// and the structured data itself
diff --git a/src/engine/imap/response/imap-response-code.vala
b/src/engine/imap/response/imap-response-code.vala
index a6bb7b6..fbd8ce8 100644
--- a/src/engine/imap/response/imap-response-code.vala
+++ b/src/engine/imap/response/imap-response-code.vala
@@ -27,7 +27,7 @@ public class Geary.Imap.ResponseCode : Geary.Imap.ListParameter {
if (!get_response_code_type().is_value(ResponseCodeType.UIDNEXT))
throw new ImapError.INVALID("Not UIDNEXT: %s", to_string());
- return new UID(get_as_string(1).as_int64());
+ return new UID.checked(get_as_string(1).as_int64());
}
/**
@@ -39,7 +39,7 @@ public class Geary.Imap.ResponseCode : Geary.Imap.ListParameter {
if (!get_response_code_type().is_value(ResponseCodeType.UIDVALIDITY))
throw new ImapError.INVALID("Not UIDVALIDITY: %s", to_string());
- return new UIDValidity(get_as_string(1).as_int64());
+ return new UIDValidity.checked(get_as_string(1).as_int64());
}
/**
diff --git a/src/engine/imap/response/imap-server-data.vala b/src/engine/imap/response/imap-server-data.vala
index 076c42f..f4d6101 100644
--- a/src/engine/imap/response/imap-server-data.vala
+++ b/src/engine/imap/response/imap-server-data.vala
@@ -91,7 +91,7 @@ public class Geary.Imap.ServerData : ServerResponse {
if (server_data_type != ServerDataType.EXPUNGE)
throw new ImapError.INVALID("Not EXPUNGE data: %s", to_string());
- return new SequenceNumber(get_as_string(1).as_int64());
+ return new SequenceNumber.checked(get_as_string(1).as_int64());
}
/**
diff --git a/src/engine/imap/response/imap-status-data.vala b/src/engine/imap/response/imap-status-data.vala
index ea0c40a..ea8d353 100644
--- a/src/engine/imap/response/imap-status-data.vala
+++ b/src/engine/imap/response/imap-status-data.vala
@@ -102,11 +102,11 @@ public class Geary.Imap.StatusData : Object {
break;
case StatusDataType.UIDNEXT:
- uid_next = new UID(valuep.as_int64());
+ uid_next = new UID.checked(valuep.as_int64());
break;
case StatusDataType.UIDVALIDITY:
- uid_validity = new UIDValidity(valuep.as_int64());
+ uid_validity = new UIDValidity.checked(valuep.as_int64());
break;
case StatusDataType.UNSEEN:
diff --git a/src/engine/rfc822/rfc822-message-data.vala b/src/engine/rfc822/rfc822-message-data.vala
index fa0bb5a..76f8a0e 100644
--- a/src/engine/rfc822/rfc822-message-data.vala
+++ b/src/engine/rfc822/rfc822-message-data.vala
@@ -210,8 +210,8 @@ public class Geary.RFC822.Date : Geary.RFC822.MessageData, Geary.MessageData.Abs
}
}
-public class Geary.RFC822.Size : Geary.MessageData.LongMessageData, Geary.RFC822.MessageData {
- public Size(long value) {
+public class Geary.RFC822.Size : Geary.MessageData.Int64MessageData, Geary.RFC822.MessageData {
+ public Size(int64 value) {
base (value);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]