1ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// Copyright 2016 The Android Open Source Project
2ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko//
3ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// Licensed under the Apache License, Version 2.0 (the "License");
4ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// you may not use this file except in compliance with the License.
5ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// You may obtain a copy of the License at
6ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko//
7ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko//      http://www.apache.org/licenses/LICENSE-2.0
8ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko//
9ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// Unless required by applicable law or agreed to in writing, software
10ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// distributed under the License is distributed on an "AS IS" BASIS,
11ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// See the License for the specific language governing permissions and
13ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// limitations under the License.
14ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
15ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#ifndef COMMON_BINDER_UTILS_H_
16ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#define COMMON_BINDER_UTILS_H_
17ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
18ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include <memory>
19ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include <string>
20ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
21ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include <base/values.h>
22ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include <binder/Status.h>
23ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include <utils/String8.h>
24ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include <utils/String16.h>
25ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include <brillo/errors/error.h>
26ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
27e9a8385bccf042c9e80b69de18f3b58179309615Alex Vakulenkonamespace weave {
28e9a8385bccf042c9e80b69de18f3b58179309615Alex Vakulenkoclass Error;  // Forward declaration.
29e9a8385bccf042c9e80b69de18f3b58179309615Alex Vakulenkousing ErrorPtr = std::unique_ptr<Error>;
30e9a8385bccf042c9e80b69de18f3b58179309615Alex Vakulenko}  // namespace weave
31e9a8385bccf042c9e80b69de18f3b58179309615Alex Vakulenko
32ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenkonamespace weaved {
33ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenkonamespace binder_utils {
34ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
35ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// Converts the result of weave API call into a binder Status object.
36ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// If |success| is true, return binder::Status::ok(), otherwise the method
37ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// constructs a service-specific failure status with an error message obtained
38ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// from the |error| object.
39ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenkoandroid::binder::Status ToStatus(bool success, weave::ErrorPtr* error);
40ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
41ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// Converts a binder status code to a Brillo error object. Returns true if the
42ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// status was isOk(), otherwise returns false and provides error information
43ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// in the |error| object.
44ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenkobool StatusToError(android::binder::Status status, brillo::ErrorPtr* error);
45ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
46ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// Converts binder's UTF16 string into a regular UTF8-encoded standard string.
47ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenkoinline std::string ToString(const android::String16& value) {
48ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko  return android::String8{value}.string();
49ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko}
50ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
51ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// Converts regular UTF8-encoded standard string into a binder's UTF16 string.
52ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenkoinline android::String16 ToString16(const std::string& value) {
53ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko  return android::String16{value.c_str()};
54ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko}
55ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
56ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// Serializes a dictionary to a string for transferring over binder.
57ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenkoandroid::String16 ToString16(const base::Value& value);
58ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
59ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko// De-serializes a dictionary from a binder string.
60ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenkoandroid::binder::Status ParseDictionary(
61ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko    const android::String16& json,
62ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko    std::unique_ptr<base::DictionaryValue>* dict);
63ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
64ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko}  // namespace binder_utils
65ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko}  // namespace weaved
66ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
67ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#endif  // COMMON_BINDER_UTILS_H_
68