blob: 5f76fc14f93ef36dac44a235de51ec5524f7cef7 [file] [log] [blame]
Andreas Huber5345ec22016-07-29 13:33:27 -07001#ifndef COORDINATOR_H_
2
3#define COORDINATOR_H_
4
5#include <android-base/macros.h>
Andreas Hubere61e3f72016-08-03 10:22:03 -07006#include <functional>
Andreas Huber39fa7182016-08-19 14:27:33 -07007#include <set>
Andreas Huber5345ec22016-07-29 13:33:27 -07008#include <string>
9#include <utils/KeyedVector.h>
Andreas Huberdca261f2016-08-04 13:47:51 -070010#include <vector>
Andreas Huber5345ec22016-07-29 13:33:27 -070011
12namespace android {
13
14struct AST;
15struct FQName;
Andreas Huberfd4afab2016-08-03 13:02:57 -070016struct Type;
Andreas Huber5345ec22016-07-29 13:33:27 -070017
18struct Coordinator {
Andreas Huberdca261f2016-08-04 13:47:51 -070019 Coordinator(
20 const std::vector<std::string> &packageRootPaths,
21 const std::vector<std::string> &packageRoots);
22
Andreas Huber5345ec22016-07-29 13:33:27 -070023 ~Coordinator();
24
Andreas Huber39fa7182016-08-19 14:27:33 -070025 // Attempts to parse the interface/types referred to by fqName.
26 // Parsing an interface also parses the associated package's types.hal
27 // file if it exists.
28 // If "parsedASTs" is non-NULL, successfully parsed ASTs are inserted
29 // into the set.
30 AST *parse(const FQName &fqName, std::set<AST *> *parsedASTs = nullptr);
Andreas Huber5345ec22016-07-29 13:33:27 -070031
Andreas Huberdca261f2016-08-04 13:47:51 -070032 // Given package-root paths of ["hardware/interfaces",
33 // "vendor/<something>/interfaces"], package roots of
34 // ["android.hardware", "vendor.<something>.hardware"], and a
35 // FQName of "android.hardware.nfc@1.0::INfc, then getPackagePath()
Iliyan Malchev5bb14022016-08-09 15:04:39 -070036 // will return "hardware/interfaces/nfc/V1_0".
Andreas Huberdca261f2016-08-04 13:47:51 -070037
Andreas Huber881227d2016-08-02 14:20:21 -070038 std::string getPackagePath(
39 const FQName &fqName, bool relative = false) const;
Andreas Huber5345ec22016-07-29 13:33:27 -070040
Andreas Huberdca261f2016-08-04 13:47:51 -070041 // Given package roots of ["android.hardware",
42 // "vendor.<something>.hardware"] and a FQName of
Iliyan Malchev5bb14022016-08-09 15:04:39 -070043 // "android.hardware.nfc@1.0::INfc, then getPackageRoot() will
Andreas Huberdca261f2016-08-04 13:47:51 -070044 // return "android.hardware".
45
46 std::string getPackageRoot(const FQName &fqName) const;
47
Iliyan Malchev5bb14022016-08-09 15:04:39 -070048 // Given package-root paths of ["hardware/interfaces",
49 // "vendor/<something>/interfaces"], package roots of
50 // ["android.hardware", "vendor.<something>.hardware"], and a
51 // FQName of "android.hardware.nfc@1.0::INfc, then getPackageRootPath()
52 // will return "hardware/interfaces".
53
54 std::string getPackageRootPath(const FQName &fqName) const;
55
Andreas Huberd2943e12016-08-05 11:59:31 -070056 // Given an FQName of "android.hardware.nfc@1.0::INfc", return
57 // "android/hardware/".
58 std::string convertPackageRootToPath(const FQName &fqName) const;
59
60 status_t getPackageInterfaceFiles(
61 const FQName &package,
62 std::vector<std::string> *fileNames) const;
63
Iliyan Malchev5bb14022016-08-09 15:04:39 -070064 status_t appendPackageInterfacesToSet(
Andreas Huberd2943e12016-08-05 11:59:31 -070065 const FQName &package,
66 std::vector<FQName> *packageInterfaces) const;
67
68 static bool MakeParentHierarchy(const std::string &path);
Andreas Hubere61e3f72016-08-03 10:22:03 -070069
Andreas Huber5345ec22016-07-29 13:33:27 -070070private:
Andreas Huberdca261f2016-08-04 13:47:51 -070071 // A list of top-level directories (mPackageRootPaths)
72 // corresponding to a list of package roots (mPackageRoots). For
73 // example, if mPackageRootPaths[0] == "hardware/interfaces" and
74 // mPackageRoots[0] == "android.hardware" this means that all
75 // packages starting with "android.hardware" will be looked up in
76 // "hardware/interfaces".
77 std::vector<std::string> mPackageRootPaths;
78 std::vector<std::string> mPackageRoots;
Andreas Huber68f24592016-07-29 14:53:48 -070079 KeyedVector<FQName, AST *> mCache;
Andreas Huber5345ec22016-07-29 13:33:27 -070080
Andreas Huberdca261f2016-08-04 13:47:51 -070081 std::vector<std::string>::const_iterator findPackageRoot(
82 const FQName &fqName) const;
83
Andreas Huber5345ec22016-07-29 13:33:27 -070084 DISALLOW_COPY_AND_ASSIGN(Coordinator);
85};
86
87} // namespace android
88
89#endif // COORDINATOR_H_