1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <iomanip>
20 #include <iostream>
21 #include <string>
22 #include <sstream>
23 #include <utility>
24 #include <vector>
25 
26 namespace android {
27 namespace lshal {
28 
29 enum : unsigned int {
30     OK                                      = 0,
31     // Return to Lshal::main to print help info.
32     USAGE                                   = 1 << 0,
33     // no service managers
34     NO_BINDERIZED_MANAGER                   = 1 << 1,
35     NO_PASSTHROUGH_MANAGER                  = 1 << 2,
36     // general error in getting information from the three sources
37     DUMP_BINDERIZED_ERROR                   = 1 << 3,
38     DUMP_PASSTHROUGH_ERROR                  = 1 << 4,
39     DUMP_ALL_LIBS_ERROR                     = 1 << 5,
40     // I/O error in reading files
41     IO_ERROR                                = 1 << 6,
42     // Interface does not exist (IServiceManager::get fails)
43     NO_INTERFACE                            = 1 << 7,
44     // Transaction error from hwbinder transactions
45     TRANSACTION_ERROR                       = 1 << 8,
46     // No transaction error, but return value is unexpected.
47     BAD_IMPL                                = 1 << 9,
48     // Cannot fetch VINTF data.
49     VINTF_ERROR                             = 1 << 10,
50 };
51 using Status = unsigned int;
52 
53 struct Arg {
54     int argc;
55     char **argv;
56 };
57 
58 template <typename A>
join(const A & components,const std::string & separator)59 std::string join(const A &components, const std::string &separator) {
60     std::stringstream out;
61     bool first = true;
62     for (const auto &component : components) {
63         if (!first) {
64             out << separator;
65         }
66         out << component;
67 
68         first = false;
69     }
70     return out.str();
71 }
72 
73 std::string toHexString(uint64_t t);
74 
75 template<typename String>
splitFirst(const String & s,char c)76 std::pair<String, String> splitFirst(const String &s, char c) {
77     const char *pos = strchr(s.c_str(), c);
78     if (pos == nullptr) {
79         return {s, {}};
80     }
81     return {String(s.c_str(), pos - s.c_str()), String(pos + 1)};
82 }
83 
84 std::vector<std::string> split(const std::string &s, char c);
85 
86 void replaceAll(std::string *s, char from, char to);
87 
88 }  // namespace lshal
89 }  // namespace android
90