summaryrefslogtreecommitdiff
path: root/chromium/base/util/values/values_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/base/util/values/values_util.cc')
-rw-r--r--chromium/base/util/values/values_util.cc59
1 files changed, 59 insertions, 0 deletions
diff --git a/chromium/base/util/values/values_util.cc b/chromium/base/util/values/values_util.cc
index 43b317b3100..fc9341035ce 100644
--- a/chromium/base/util/values/values_util.cc
+++ b/chromium/base/util/values/values_util.cc
@@ -4,10 +4,33 @@
#include "base/util/values/values_util.h"
+#include "base/files/file_path.h"
#include "base/strings/string_number_conversions.h"
+#include "base/time/time.h"
+#include "base/unguessable_token.h"
+
+// Warning: The Values involved could be stored on persistent storage like files
+// on disks. Therefore, changes in implementation could lead to data corruption
+// and must be done with caution.
namespace util {
+namespace {
+
+// Helper to serialize/deserialize an UnguessableToken.
+//
+// It assumes a little-endian CPU, which is arguably a bug.
+union UnguessableTokenRepresentation {
+ struct Field {
+ uint64_t high;
+ uint64_t low;
+ } field;
+
+ uint8_t buffer[sizeof(Field)];
+};
+
+} // namespace
+
base::Value Int64ToValue(int64_t integer) {
return base::Value(base::NumberToString(integer));
}
@@ -57,4 +80,40 @@ base::Optional<base::Time> ValueToTime(const base::Value& value) {
return base::Time::FromDeltaSinceWindowsEpoch(*time_delta);
}
+base::Value FilePathToValue(base::FilePath file_path) {
+ return base::Value(file_path.AsUTF8Unsafe());
+}
+
+base::Optional<base::FilePath> ValueToFilePath(const base::Value* value) {
+ return value ? ValueToFilePath(*value) : base::nullopt;
+}
+
+base::Optional<base::FilePath> ValueToFilePath(const base::Value& value) {
+ if (!value.is_string())
+ return base::nullopt;
+ return base::FilePath::FromUTF8Unsafe(value.GetString());
+}
+
+base::Value UnguessableTokenToValue(base::UnguessableToken token) {
+ UnguessableTokenRepresentation repr;
+ repr.field.high = token.GetHighForSerialization();
+ repr.field.low = token.GetLowForSerialization();
+ return base::Value(base::HexEncode(repr.buffer, sizeof(repr.buffer)));
+}
+
+base::Optional<base::UnguessableToken> ValueToUnguessableToken(
+ const base::Value* value) {
+ return value ? ValueToUnguessableToken(*value) : base::nullopt;
+}
+
+base::Optional<base::UnguessableToken> ValueToUnguessableToken(
+ const base::Value& value) {
+ if (!value.is_string())
+ return base::nullopt;
+ UnguessableTokenRepresentation repr;
+ if (!base::HexStringToSpan(value.GetString(), repr.buffer))
+ return base::nullopt;
+ return base::UnguessableToken::Deserialize(repr.field.high, repr.field.low);
+}
+
} // namespace util