aboutsummaryrefslogtreecommitdiff
path: root/src/privet/privet_handler.cc
diff options
context:
space:
mode:
authorAlex Vakulenko <avakulenko@google.com>2015-12-07 14:46:12 -0800
committerAlex Vakulenko <avakulenko@google.com>2015-12-07 23:34:09 +0000
commit551a82bbefbfd6dc83309eec440a41ca737062b4 (patch)
tree0e5b2c661b9327ce6bc961aeedcfb6a8fda039c2 /src/privet/privet_handler.cc
parent29a11caf12aea925ac19b3d47a3bfc41e361e87a (diff)
downloadlibweave-551a82bbefbfd6dc83309eec440a41ca737062b4.tar.gz
Add support of Components/Traits to local privet APIs
Added support for new privet APIs /privet/v3/traits and /privet/v3/components to obtain the full trait/component trees as well as expanded the existing /privet/v3/checkForUpdates to include the component/trait fingerprints. BUG: 25917521 Change-Id: Ib753817f88f611935057ca7bd1a1bf02addfb69c Reviewed-on: https://weave-review.googlesource.com/1791 Reviewed-by: Vitaly Buka <vitalybuka@google.com>
Diffstat (limited to 'src/privet/privet_handler.cc')
-rw-r--r--src/privet/privet_handler.cc91
1 files changed, 80 insertions, 11 deletions
diff --git a/src/privet/privet_handler.cc b/src/privet/privet_handler.cc
index d609787..9199c6f 100644
--- a/src/privet/privet_handler.cc
+++ b/src/privet/privet_handler.cc
@@ -103,10 +103,14 @@ const char kSetupStartUserKey[] = "user";
const char kFingerprintKey[] = "fingerprint";
const char kStateKey[] = "state";
const char kCommandsKey[] = "commands";
+const char kTraitsKey[] = "traits";
+const char kComponentsKey[] = "components";
const char kCommandsIdKey[] = "id";
const char kStateFingerprintKey[] = "stateFingerprint";
const char kCommandsFingerprintKey[] = "commandsFingerprint";
+const char kTraitsFingerprintKey[] = "traitsFingerprint";
+const char kComponentsFingerprintKey[] = "componentsFingerprint";
const char kWaitTimeoutKey[] = "waitTimeout";
const char kInvalidParamValueFormat[] = "Invalid parameter: '%s'='%s'";
@@ -371,6 +375,10 @@ PrivetHandler::PrivetHandler(CloudDelegate* cloud,
&PrivetHandler::HandleCommandsList, AuthScope::kViewer);
AddSecureHandler("/privet/v3/checkForUpdates",
&PrivetHandler::HandleCheckForUpdates, AuthScope::kViewer);
+ AddSecureHandler("/privet/v3/traits", &PrivetHandler::HandleTraits,
+ AuthScope::kViewer);
+ AddSecureHandler("/privet/v3/components", &PrivetHandler::HandleComponents,
+ AuthScope::kViewer);
}
PrivetHandler::~PrivetHandler() {
@@ -379,9 +387,9 @@ PrivetHandler::~PrivetHandler() {
}
void PrivetHandler::OnTraitDefsChanged() {
- ++command_defs_fingerprint_;
+ ++traits_fingerprint_;
auto pred = [this](const UpdateRequestParameters& params) {
- return params.command_defs_fingerprint < 0;
+ return params.traits_fingerprint < 0;
};
auto last =
std::partition(update_requests_.begin(), update_requests_.end(), pred);
@@ -390,10 +398,24 @@ void PrivetHandler::OnTraitDefsChanged() {
update_requests_.erase(last, update_requests_.end());
}
-void PrivetHandler::OnComponentTreeChanged() {
+void PrivetHandler::OnStateChanged() {
+ // State updates also change the component tree, so update both fingerprints.
++state_fingerprint_;
+ ++components_fingerprint_;
+ auto pred = [this](const UpdateRequestParameters& params) {
+ return params.state_fingerprint < 0 && params.components_fingerprint < 0;
+ };
+ auto last =
+ std::partition(update_requests_.begin(), update_requests_.end(), pred);
+ for (auto p = last; p != update_requests_.end(); ++p)
+ ReplyToUpdateRequest(p->callback);
+ update_requests_.erase(last, update_requests_.end());
+}
+
+void PrivetHandler::OnComponentTreeChanged() {
+ ++components_fingerprint_;
auto pred = [this](const UpdateRequestParameters& params) {
- return params.state_fingerprint < 0;
+ return params.components_fingerprint < 0;
};
auto last =
std::partition(update_requests_.begin(), update_requests_.end(), pred);
@@ -768,12 +790,34 @@ void PrivetHandler::HandleState(const base::DictionaryValue& input,
callback.Run(http::kOk, output);
}
+void PrivetHandler::HandleTraits(const base::DictionaryValue& input,
+ const UserInfo& user_info,
+ const RequestCallback& callback) {
+ base::DictionaryValue output;
+ output.Set(kTraitsKey, cloud_->GetTraits().DeepCopy());
+ output.SetString(kFingerprintKey, std::to_string(traits_fingerprint_));
+
+ callback.Run(http::kOk, output);
+}
+
+void PrivetHandler::HandleComponents(const base::DictionaryValue& input,
+ const UserInfo& user_info,
+ const RequestCallback& callback) {
+ base::DictionaryValue output;
+ output.Set(kComponentsKey, cloud_->GetComponents().DeepCopy());
+ output.SetString(kFingerprintKey, std::to_string(components_fingerprint_));
+
+ callback.Run(http::kOk, output);
+}
+
void PrivetHandler::HandleCommandDefs(const base::DictionaryValue& input,
const UserInfo& user_info,
const RequestCallback& callback) {
base::DictionaryValue output;
output.Set(kCommandsKey, cloud_->GetLegacyCommandDef().DeepCopy());
- output.SetString(kFingerprintKey, std::to_string(command_defs_fingerprint_));
+ // Use traits fingerprint since right now we treat traits and command defs
+ // as being equivalent.
+ output.SetString(kFingerprintKey, std::to_string(traits_fingerprint_));
callback.Run(http::kOk, output);
}
@@ -845,12 +889,18 @@ void PrivetHandler::HandleCheckForUpdates(const base::DictionaryValue& input,
std::string state_fingerprint;
std::string commands_fingerprint;
+ std::string traits_fingerprint;
+ std::string components_fingerprint;
input.GetString(kStateFingerprintKey, &state_fingerprint);
input.GetString(kCommandsFingerprintKey, &commands_fingerprint);
+ input.GetString(kTraitsFingerprintKey, &traits_fingerprint);
+ input.GetString(kComponentsFingerprintKey, &components_fingerprint);
const bool ignore_state = state_fingerprint.empty();
const bool ignore_commands = commands_fingerprint.empty();
- // If both fingerprints are missing, nothing to wait for, return immediately.
- if (ignore_state && ignore_commands)
+ const bool ignore_traits = traits_fingerprint.empty();
+ const bool ignore_components = components_fingerprint.empty();
+ // If all fingerprints are missing, nothing to wait for, return immediately.
+ if (ignore_state && ignore_commands && ignore_traits && ignore_components)
return ReplyToUpdateRequest(callback);
// If the current state fingerprint is different from the requested one,
// return new fingerprints.
@@ -858,17 +908,32 @@ void PrivetHandler::HandleCheckForUpdates(const base::DictionaryValue& input,
return ReplyToUpdateRequest(callback);
// If the current commands fingerprint is different from the requested one,
// return new fingerprints.
+ // NOTE: We are using traits fingerprint for command fingerprint as well.
if (!ignore_commands &&
- commands_fingerprint != std::to_string(command_defs_fingerprint_)) {
+ commands_fingerprint != std::to_string(traits_fingerprint_)) {
+ return ReplyToUpdateRequest(callback);
+ }
+ // If the current traits fingerprint is different from the requested one,
+ // return new fingerprints.
+ if (!ignore_traits &&
+ traits_fingerprint != std::to_string(traits_fingerprint_)) {
+ return ReplyToUpdateRequest(callback);
+ }
+ // If the current components fingerprint is different from the requested one,
+ // return new fingerprints.
+ if (!ignore_components &&
+ components_fingerprint != std::to_string(components_fingerprint_)) {
return ReplyToUpdateRequest(callback);
}
UpdateRequestParameters params;
params.request_id = ++last_update_request_id_;
params.callback = callback;
- params.command_defs_fingerprint =
- ignore_commands ? -1 : command_defs_fingerprint_;
+ params.traits_fingerprint =
+ (ignore_traits && ignore_commands) ? -1 : traits_fingerprint_;
params.state_fingerprint = ignore_state ? -1 : state_fingerprint_;
+ params.components_fingerprint =
+ ignore_components ? -1 : components_fingerprint_;
update_requests_.push_back(params);
if (timeout != base::TimeDelta::Max()) {
device_->PostDelayedTask(
@@ -884,7 +949,11 @@ void PrivetHandler::ReplyToUpdateRequest(
base::DictionaryValue output;
output.SetString(kStateFingerprintKey, std::to_string(state_fingerprint_));
output.SetString(kCommandsFingerprintKey,
- std::to_string(command_defs_fingerprint_));
+ std::to_string(traits_fingerprint_));
+ output.SetString(kTraitsFingerprintKey,
+ std::to_string(traits_fingerprint_));
+ output.SetString(kComponentsFingerprintKey,
+ std::to_string(components_fingerprint_));
callback.Run(http::kOk, output);
}