• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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 #ifndef FQNAME_H_
18 
19 #define FQNAME_H_
20 
21 #include <android-base/macros.h>
22 #include <string>
23 #include <vector>
24 
25 namespace android {
26 
27 struct FQName {
28     explicit FQName();
29     explicit FQName(const std::string &s);
30 
31     FQName(const std::string &package,
32            const std::string &version,
33            const std::string &name,
34            const std::string &valueName = "");
35 
36     // a synonym to FQName(names.join("."))
37     FQName(const std::vector<std::string> &names);
38 
39     FQName(const FQName& other);
40 
41     bool isValid() const;
42     bool isIdentifier() const;
43     bool setTo(const std::string &s);
44 
45     void applyDefaults(
46             const std::string &defaultPackage,
47             const std::string &defaultVersion);
48 
49     std::string package() const;
50     // Return version in the form "@1.0" if it is present, otherwise empty string.
51     std::string atVersion() const;
52     // Return version in the form "1.0" if it is present, otherwise empty string.
53     std::string version() const;
54     // Return version in the form "V1_0" if it is present, otherwise empty string.
55     std::string sanitizedVersion() const;
56     // Return true only if version is present.
57     bool hasVersion() const;
58 
59     // The next two methods return the name part of the FQName, that is, the
60     // part after the version field.  For example:
61     //
62     // package android.hardware.tests.foo@1.0;
63     // interface IFoo {
64     //    struct bar {
65     //        struct baz {
66     //            ...
67     //        };
68     //    };
69     // };
70     //
71     // package android.hardware.tests.bar@1.0;
72     // import android.hardware.tests.foo@1.0;
73     // interface {
74     //    struct boo {
75     //        IFoo.bar.baz base;
76     //    };
77     // }
78     //
79     // The FQName for base is android.hardware.tests.foo@1.0::IFoo.bar.baz; so
80     // FQName::name() will return "IFoo.bar.baz". FQName::names() will return
81     // std::vector<std::string>{"IFoo","bar","baz"}
82 
83     std::string name() const;
84     std::vector<std::string> names() const;
85 
86     // The next two methods returns two parts of the FQName, that is,
87     // the first part package + version + name, the second part valueName.
88     FQName typeName() const;
89     std::string valueName() const;
90 
91     // has package version and name
92     bool isFullyQualified() const;
93 
94     // true if:
95     // 1. (package)?(version)?(name):(valueName)
96     // 2. (valueName), aka a single identifier
97     bool isValidValueName() const;
98 
99     void print() const;
100     std::string string() const;
101 
102     bool operator<(const FQName &other) const;
103     bool operator==(const FQName &other) const;
104     bool operator!=(const FQName &other) const;
105 
106     // Must be called on an interface
107     // android.hardware.foo@1.0::IBar
108     // -> Bar
109     std::string getInterfaceBaseName() const;
110 
111     // Must be called on an interface
112     // android.hardware.foo@1.0::IBar
113     // -> IBar
114     std::string getInterfaceName() const;
115 
116     // Must be called on an interface
117     // android.hardware.foo@1.0::IBar
118     // -> IHwBar
119     std::string getInterfaceHwName() const;
120 
121     // Must be called on an interface
122     // android.hardware.foo@1.0::IBar
123     // -> BpBar
124     std::string getInterfaceProxyName() const;
125 
126     // Must be called on an interface
127     // android.hardware.foo@1.0::IBar
128     // -> BnBar
129     std::string getInterfaceStubName() const;
130 
131     // Must be called on an interface
132     // android.hardware.foo@1.0::IBar
133     // -> BsBar
134     std::string getInterfacePassthroughName() const;
135 
136     // Must be called on an interface
137     // android.hardware.foo@1.0::IBar
138     // -> android.hardware.foo@1.0::BpBar
139     FQName getInterfaceProxyFqName() const;
140 
141     // Must be called on an interface
142     // android.hardware.foo@1.0::IBar
143     // -> android.hardware.foo@1.0::BnBar
144     FQName getInterfaceStubFqName() const;
145 
146     // Must be called on an interface
147     // android.hardware.foo@1.0::IBar
148     // -> android.hardware.foo@1.0::BsBar
149     FQName getInterfacePassthroughFqName() const;
150 
151     // Replace whatever after :: with "types"
152     // android.hardware.foo@1.0::Abc.Type:VALUE
153     // -> android.hardware.foo@1.0::types
154     FQName getTypesForPackage() const;
155 
156     // android.hardware.foo@1.0::Abc.Type:VALUE
157     // -> android.hardware.foo@1.0
158     FQName getPackageAndVersion() const;
159 
160     // the following comments all assume that the FQName
161     // is android.hardware.foo@1.0::IBar.Baz.Bam
162 
163     // returns highest type in the hidl namespace, i.e.
164     // android.hardware.foo@1.0::IBar
165     FQName getTopLevelType() const;
166 
167     // returns an unambiguous fully qualified name which can be
168     // baked into a token, i.e.
169     // android_hardware_Foo_V1_0_IBar_Baz
170     std::string tokenName() const;
171 
172     // Returns an absolute C++ namespace prefix, i.e.
173     // ::android::hardware::Foo::V1_0.
174     std::string cppNamespace() const;
175 
176     // Returns a name qualified assuming we are in cppNamespace, i.e.
177     // IBar::Baz.
178     std::string cppLocalName() const;
179 
180     // Returns a fully qualified absolute C++ type name, i.e.
181     // ::android::hardware::Foo::V1_0::IBar::Baz.
182     std::string cppName() const;
183 
184     // Returns the java package name, i.e. "android.hardware.Foo.V1_0".
185     std::string javaPackage() const;
186 
187     // Returns the fully qualified java type name,
188     // i.e. "android.hardware.Foo.V1_0.IBar.Baz"
189     std::string javaName() const;
190 
191     bool endsWith(const FQName &other) const;
192 
193     // If this is android.hardware@1.0::IFoo
194     // package = "and" -> false
195     // package = "android" -> true
196     // package = "android.hardware@1.0" -> false
197     bool inPackage(const std::string &package) const;
198 
199     void getPackageComponents(std::vector<std::string> *components) const;
200 
201     void getPackageAndVersionComponents(
202             std::vector<std::string> *components,
203             bool cpp_compatible) const;
204 
205     // return major and minor version if they exist, else abort program.
206     // Existence of version can be checked via hasVersion().
207     size_t getPackageMajorVersion() const;
208     size_t getPackageMinorVersion() const;
209 
210     // minor-- if result doesn't underflow, else abort.
211     FQName downRev() const;
212 
213 private:
214     bool mValid;
215     bool mIsIdentifier;
216     std::string mPackage;
217     // mMajor == 0 means empty.
218     size_t mMajor = 0;
219     size_t mMinor = 0;
220     std::string mName;
221     std::string mValueName;
222 
223     void setVersion(const std::string &v);
224     void clearVersion();
225     void parseVersion(const std::string &majorStr, const std::string &minorStr);
226 };
227 
228 static const FQName gIBaseFqName = FQName{"android.hidl.base@1.0::IBase"};
229 static const FQName gIBasePackageFqName = FQName{"android.hidl.base"};
230 static const FQName gIManagerFqName = FQName{"android.hidl.manager@1.0::IServiceManager"};
231 static const FQName gIManagerPackageFqName = FQName{"android.hidl.manager"};
232 
233 }  // namespace android
234 
235 #endif  // FQNAME_H_
236