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