Home | History | Annotate | Download | only in common
      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