1 // Copyright 2016 The Android Open Source Project 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include "common/binder_utils.h" 16 17 #include <base/json/json_reader.h> 18 #include <base/json/json_writer.h> 19 #include <weave/error.h> 20 21 namespace weaved { 22 namespace binder_utils { 23 24 android::binder::Status ToStatus(bool success, weave::ErrorPtr* error) { 25 if (success) 26 return android::binder::Status::ok(); 27 return android::binder::Status::fromServiceSpecificError( 28 1, android::String8{error->get()->GetMessage().c_str()}); 29 } 30 31 bool StatusToError(android::binder::Status status, brillo::ErrorPtr* error) { 32 if (status.isOk()) 33 return true; 34 brillo::Error::AddTo(error, FROM_HERE, "binder", 35 std::to_string(status.exceptionCode()), 36 status.exceptionMessage().string()); 37 return false; 38 } 39 40 android::String16 ToString16(const base::Value& value) { 41 std::string json; 42 base::JSONWriter::Write(value, &json); 43 return ToString16(json); 44 } 45 46 android::binder::Status ParseDictionary( 47 const android::String16& json, 48 std::unique_ptr<base::DictionaryValue>* dict) { 49 int error = 0; 50 std::string message; 51 std::unique_ptr<base::Value> value{ 52 base::JSONReader::ReadAndReturnError(ToString(json), base::JSON_PARSE_RFC, 53 &error, &message) 54 .release()}; 55 base::DictionaryValue* dict_value = nullptr; 56 if (!value || !value->GetAsDictionary(&dict_value)) { 57 return android::binder::Status::fromServiceSpecificError( 58 error, android::String8{message.c_str()}); 59 } 60 dict->reset(dict_value); 61 value.release(); // |dict| now owns the object. 62 return android::binder::Status::ok(); 63 } 64 65 } // namespace binder_utils 66 } // namespace weaved 67