172877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley/* 272877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * Copyright (C) 2015, The Android Open Source Project 372877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * 472877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * Licensed under the Apache License, Version 2.0 (the "License"); 572877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * you may not use this file except in compliance with the License. 672877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * You may obtain a copy of the License at 772877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * 872877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * http://www.apache.org/licenses/LICENSE-2.0 972877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * 1072877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * Unless required by applicable law or agreed to in writing, software 1172877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * distributed under the License is distributed on an "AS IS" BASIS, 1272877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1372877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * See the License for the specific language governing permissions and 1472877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley * limitations under the License. 1572877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley */ 1672877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 1772877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley#include "import_resolver.h" 1872877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 1972877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley#include <unistd.h> 2072877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 2172877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley#ifdef _WIN32 2272877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley#include <io.h> 2372877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley#endif 2472877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 2572877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley#include "os.h" 2672877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 2772877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wileyusing std::string; 2872877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wileyusing std::vector; 2972877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 3072877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wileynamespace android { 3172877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wileynamespace aidl { 3272877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 3372877acd3b57462fcd452bff4a9d7ff936936a8eChristopher WileyImportResolver::ImportResolver(const IoDelegate& io_delegate, 3472877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley const vector<string>& import_paths) 3572877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley : io_delegate_(io_delegate) { 3672877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley for (string path : import_paths) { 3772877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley if (path.empty()) { 3872877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley path = "."; 3972877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley } 4072877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley if (path[path.size() - 1] != OS_PATH_SEPARATOR) { 4172877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley path += OS_PATH_SEPARATOR; 4272877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley } 4372877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley import_paths_.push_back(std::move(path)); 4472877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley } 4572877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley} 4672877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 4772877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 4872877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wileystring ImportResolver::FindImportFile(const string& canonical_name) const { 4972877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley // Convert the canonical name to a relative file path. 5072877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley string relative_path = canonical_name; 5172877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley for (char& c : relative_path) { 5272877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley if (c == '.') { 5372877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley c = OS_PATH_SEPARATOR; 5472877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley } 5572877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley } 5672877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley relative_path += ".aidl"; 5772877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 5872877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley // Look for that relative path at each of our import roots. 5972877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley for (string path : import_paths_) { 6072877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley path = path + relative_path; 6172877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley if (io_delegate_.FileIsReadable(path)) { 6272877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley return path; 6372877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley } 6472877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley } 6572877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 6672877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley return ""; 6772877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley} 6872877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley 6972877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley} // namespace android 7072877acd3b57462fcd452bff4a9d7ff936936a8eChristopher Wiley} // namespace aidl 71