| /* |
| * Copyright (C) 2015, The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "import_resolver.h" |
| |
| #include <android-base/strings.h> |
| #include <unistd.h> |
| |
| #ifdef _WIN32 |
| #include <io.h> |
| #endif |
| |
| #include "os.h" |
| |
| using std::string; |
| using std::vector; |
| |
| namespace android { |
| namespace aidl { |
| |
| ImportResolver::ImportResolver(const IoDelegate& io_delegate, const vector<string>& import_paths, |
| const vector<string>& input_files) |
| : io_delegate_(io_delegate), input_files_(input_files) { |
| for (string path : import_paths) { |
| if (path.empty()) { |
| path = "."; |
| } |
| if (path[path.size() - 1] != OS_PATH_SEPARATOR) { |
| path += OS_PATH_SEPARATOR; |
| } |
| import_paths_.push_back(std::move(path)); |
| } |
| } |
| |
| string ImportResolver::FindImportFile(const string& canonical_name) const { |
| // Convert the canonical name to a relative file path. |
| string relative_path = canonical_name; |
| for (char& c : relative_path) { |
| if (c == '.') { |
| c = OS_PATH_SEPARATOR; |
| } |
| } |
| relative_path += ".aidl"; |
| |
| for (string input_file : input_files_) { |
| if (android::base::EndsWith(input_file, relative_path)) { |
| return input_file; |
| } |
| } |
| |
| // Look for that relative path at each of our import roots. |
| for (string path : import_paths_) { |
| path = path + relative_path; |
| if (io_delegate_.FileIsReadable(path)) { |
| return path; |
| } |
| } |
| |
| return ""; |
| } |
| |
| } // namespace android |
| } // namespace aidl |