blob: d6b9852d6db11c7d4fbe5b22dd9666b507abcf7c [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 Huber5345ec22016-07-29 13:33:27 -07007#include <string>
8#include <utils/KeyedVector.h>
Andreas Huberdca261f2016-08-04 13:47:51 -07009#include <vector>
Andreas Huber5345ec22016-07-29 13:33:27 -070010
11namespace android {
12
13struct AST;
14struct FQName;
Andreas Huberfd4afab2016-08-03 13:02:57 -070015struct Type;
Andreas Huber5345ec22016-07-29 13:33:27 -070016
17struct Coordinator {
Andreas Huberdca261f2016-08-04 13:47:51 -070018 Coordinator(
19 const std::vector<std::string> &packageRootPaths,
20 const std::vector<std::string> &packageRoots);
21
Andreas Huber5345ec22016-07-29 13:33:27 -070022 ~Coordinator();
23
Andreas Huber68f24592016-07-29 14:53:48 -070024 AST *parse(const FQName &fqName);
Andreas Huber5345ec22016-07-29 13:33:27 -070025
Andreas Huberfd4afab2016-08-03 13:02:57 -070026 Type *lookupType(const FQName &fqName) const;
Andreas Huber5345ec22016-07-29 13:33:27 -070027
Andreas Huberdca261f2016-08-04 13:47:51 -070028 // Given package-root paths of ["hardware/interfaces",
29 // "vendor/<something>/interfaces"], package roots of
30 // ["android.hardware", "vendor.<something>.hardware"], and a
31 // FQName of "android.hardware.nfc@1.0::INfc, then getPackagePath()
Iliyan Malchev5bb14022016-08-09 15:04:39 -070032 // will return "hardware/interfaces/nfc/V1_0".
Andreas Huberdca261f2016-08-04 13:47:51 -070033
Andreas Huber881227d2016-08-02 14:20:21 -070034 std::string getPackagePath(
35 const FQName &fqName, bool relative = false) const;
Andreas Huber5345ec22016-07-29 13:33:27 -070036
Andreas Huberdca261f2016-08-04 13:47:51 -070037 // Given package roots of ["android.hardware",
38 // "vendor.<something>.hardware"] and a FQName of
Iliyan Malchev5bb14022016-08-09 15:04:39 -070039 // "android.hardware.nfc@1.0::INfc, then getPackageRoot() will
Andreas Huberdca261f2016-08-04 13:47:51 -070040 // return "android.hardware".
41
42 std::string getPackageRoot(const FQName &fqName) const;
43
Iliyan Malchev5bb14022016-08-09 15:04:39 -070044 // Given package-root paths of ["hardware/interfaces",
45 // "vendor/<something>/interfaces"], package roots of
46 // ["android.hardware", "vendor.<something>.hardware"], and a
47 // FQName of "android.hardware.nfc@1.0::INfc, then getPackageRootPath()
48 // will return "hardware/interfaces".
49
50 std::string getPackageRootPath(const FQName &fqName) const;
51
Andreas Huberd2943e12016-08-05 11:59:31 -070052 // Given an FQName of "android.hardware.nfc@1.0::INfc", return
53 // "android/hardware/".
54 std::string convertPackageRootToPath(const FQName &fqName) const;
55
56 status_t getPackageInterfaceFiles(
57 const FQName &package,
58 std::vector<std::string> *fileNames) const;
59
Iliyan Malchev5bb14022016-08-09 15:04:39 -070060 status_t appendPackageInterfacesToSet(
Andreas Huberd2943e12016-08-05 11:59:31 -070061 const FQName &package,
62 std::vector<FQName> *packageInterfaces) const;
63
64 static bool MakeParentHierarchy(const std::string &path);
Andreas Hubere61e3f72016-08-03 10:22:03 -070065
Andreas Huber5345ec22016-07-29 13:33:27 -070066private:
Andreas Huberdca261f2016-08-04 13:47:51 -070067 // A list of top-level directories (mPackageRootPaths)
68 // corresponding to a list of package roots (mPackageRoots). For
69 // example, if mPackageRootPaths[0] == "hardware/interfaces" and
70 // mPackageRoots[0] == "android.hardware" this means that all
71 // packages starting with "android.hardware" will be looked up in
72 // "hardware/interfaces".
73 std::vector<std::string> mPackageRootPaths;
74 std::vector<std::string> mPackageRoots;
Andreas Huber68f24592016-07-29 14:53:48 -070075 KeyedVector<FQName, AST *> mCache;
Andreas Huber5345ec22016-07-29 13:33:27 -070076
Andreas Huberdca261f2016-08-04 13:47:51 -070077 std::vector<std::string>::const_iterator findPackageRoot(
78 const FQName &fqName) const;
79
Andreas Huber5345ec22016-07-29 13:33:27 -070080 DISALLOW_COPY_AND_ASSIGN(Coordinator);
81};
82
83} // namespace android
84
85#endif // COORDINATOR_H_