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