Chromium Code Reviews| Index: remoting/base/capabilities.cc |
| diff --git a/remoting/base/capabilities.cc b/remoting/base/capabilities.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b70e3e9782b73d31dd918b93f71539605a6154fd |
| --- /dev/null |
| +++ b/remoting/base/capabilities.cc |
| @@ -0,0 +1,118 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "remoting/base/capabilities.h" |
| + |
| +#include <algorithm> |
| +#include <vector> |
| + |
| +#include "base/string_util.h" |
| +#include "base/values.h" |
| +#include "remoting/proto/control.pb.h" |
| + |
| +namespace remoting { |
| + |
| +namespace { |
| + |
| +bool isValidCapability(const std::string& capability) { |
|
Sergey Ulanov
2013/04/16 08:38:53
CamelCase
alexeypa (please no reviews)
2013/04/16 22:06:11
Removed.
|
| + return !capability.empty() && capability.find(' ') == std::string::npos; |
| +} |
| + |
| +} // namespace |
| + |
| +Capabilities::Capabilities() { |
| +} |
| + |
| +Capabilities::Capabilities(const std::string& value) { |
| + FromString(value); |
| +} |
| + |
| +Capabilities::~Capabilities() { |
| +} |
| + |
| +bool Capabilities::HasCapability(const std::string& capability) const { |
| + return capabilities_.find(capability) != capabilities_.end(); |
| +} |
| + |
| +Capabilities Capabilities::Intersect(const Capabilities& other) const { |
| + Capabilities result; |
| + |
| + std::set<std::string>::iterator i = capabilities_.begin(); |
| + while (i != capabilities_.end()) { |
| + if (other.HasCapability(*i)) |
| + result.capabilities_.insert(*i); |
| + ++i; |
| + } |
| + |
| + return result; |
| +} |
| + |
| +bool Capabilities::FromListValue(const base::ListValue& value) { |
| + std::set<std::string> capabilities; |
| + for (size_t i = 0; i < value.GetSize(); ++i) { |
| + std::string capability; |
| + if (!value.GetString(i, &capability) || !isValidCapability(capability)) { |
| + return false; |
| + } |
| + |
| + capabilities.insert(capability); |
| + } |
| + |
| + capabilities_.swap(capabilities); |
| + return true; |
| +} |
| + |
| +bool Capabilities::FromProtocolMessage(const protocol::Capabilities& message) { |
|
Sergey Ulanov
2013/04/16 08:38:53
nit: Not sure if we really need this given that li
alexeypa (please no reviews)
2013/04/16 22:06:11
Removed.
|
| + std::set<std::string> capabilities; |
| + for (int i = 0; i < message.capability_size(); ++i) { |
| + if (!isValidCapability(message.capability(i))) |
| + return false; |
| + |
| + capabilities.insert(message.capability(i)); |
| + } |
| + |
| + capabilities_.swap(capabilities); |
| + return true; |
| +} |
| + |
| +void Capabilities::FromString(const std::string& value) { |
| + std::vector<std::string> tokens; |
| + Tokenize(value, " ", &tokens); |
| + |
| + std::set<std::string> capabilities; |
| + capabilities.insert(tokens.begin(), tokens.end()); |
| + capabilities_.swap(capabilities); |
| +} |
| + |
| +scoped_ptr<base::ListValue> Capabilities::ToListValue() const { |
|
Sergey Ulanov
2013/04/16 08:38:53
I'm not sure if we really need this - capabilities
alexeypa (please no reviews)
2013/04/16 22:06:11
Removed.
|
| + scoped_ptr<base::ListValue> value(new base::ListValue()); |
| + |
| + std::set<std::string>::const_iterator i = capabilities_.begin(); |
| + while (i != capabilities_.end()) { |
|
Sergey Ulanov
2013/04/16 08:38:53
can this be for loop?
alexeypa (please no reviews)
2013/04/16 22:06:11
A for loop would be less readable because line wra
|
| + value->AppendString(*i); |
| + ++i; |
| + } |
| + |
| + return value.Pass(); |
| +} |
| + |
| +scoped_ptr<protocol::Capabilities> Capabilities::ToProtocolMessage() const { |
| + scoped_ptr<protocol::Capabilities> message(new protocol::Capabilities()); |
| + |
| + std::set<std::string>::const_iterator i = capabilities_.begin(); |
| + while (i != capabilities_.end()) { |
| + *(message->add_capability()) = *i; |
| + ++i; |
| + } |
| + |
| + return message.Pass(); |
| +} |
| + |
| +std::string Capabilities::ToString() const { |
| + std::vector<std::string> tokens(capabilities_.size()); |
| + std::copy(capabilities_.begin(), capabilities_.end(), tokens.begin()); |
| + return JoinString(tokens, ' '); |
| +} |
| + |
| +} // namespace remoting |