// Copyright (c) 2012 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 "dbus/string_util.h" #include <stddef.h> #include "base/strings/string_util.h" namespace dbus { // This implementation is based upon D-Bus Specification Version 0.19. bool IsValidObjectPath(const std::string& value) { // A valid object path begins with '/'. if (!base::StartsWith(value, "/", base::CompareCase::SENSITIVE)) return false; // Elements are pieces delimited by '/'. For instance, "org", "chromium", // "Foo" are elements of "/org/chromium/Foo". int element_length = 0; for (size_t i = 1; i < value.size(); ++i) { const char c = value[i]; if (c == '/') { // No element may be the empty string. if (element_length == 0) return false; element_length = 0; } else { // Each element must only contain "[A-Z][a-z][0-9]_". const bool is_valid_character = ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || ('0' <= c && c <= '9') || c == '_'; if (!is_valid_character) return false; element_length++; } } // A trailing '/' character is not allowed unless the path is the root path. if (value.size() > 1 && base::EndsWith(value, "/", base::CompareCase::SENSITIVE)) return false; return true; } } // namespace dbus