blob: ad516ec9158111dfff8308a525208ee958fef2ac [file] [log] [blame]
/*
* Copyright (C) 2023 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 <aidl/transaction_ids.h>
#include "aidl_to_common.h"
#include "code_writer.h"
#include "options.h"
namespace android {
namespace aidl {
static constexpr size_t kMaxSkip = 10;
bool ShouldForceDowngradeFor(CommunicationSide e) {
return kDowngradeCommunicationBitmap & static_cast<int>(e);
}
void GenerateAutoGenHeader(CodeWriter& out, const Options& options) {
out << "/*\n";
out << " * This file is auto-generated. DO NOT MODIFY.\n";
out << " * Using: " << MultilineCommentEscape(options.RawArgs()) << "\n";
out << " *\n";
out << " * DO NOT CHECK THIS FILE INTO A CODE TREE (e.g. git, etc..).\n";
out << " * ALWAYS GENERATE THIS FILE FROM UPDATED AIDL COMPILER\n";
out << " * AS A BUILD INTERMEDIATE ONLY. THIS IS NOT SOURCE CODE.\n";
out << " */\n";
}
int GetMaxId(const AidlInterface& defined_type) {
std::vector<int> ids;
for (const auto& method : defined_type.GetMethods()) ids.push_back(method->GetId());
std::sort(ids.begin(), ids.end());
int last_id = -1;
size_t total_skipped = 0;
for (int id : ids) {
if (id > kMaxUserSetMethodId) break;
AIDL_FATAL_IF(id <= last_id, defined_type) << id << last_id;
total_skipped += last_id == -1 ? 0 : id - last_id - 1;
if (total_skipped > kMaxSkip) return last_id;
last_id = id;
}
return last_id;
}
std::vector<std::string> GetFunctionNames(const AidlInterface& defined_type) {
// Find the maxId used for AIDL method. If methods use skipped ids, only support till kMaxSkip.
int maxId = GetMaxId(defined_type);
int functionCount = maxId + 1;
// If tracing is off, don't populate this array. libbinder_ndk will still add traces based on
// transaction code
vector<std::string> functionNames;
if (maxId != -1) {
functionNames.resize(functionCount);
// Assign method names to the proper places in array
for (const auto& method : defined_type.GetMethods()) {
if (method->GetId() >= functionCount) {
continue;
}
functionNames[method->GetId()] = method->GetName();
}
}
return functionNames;
}
} // namespace aidl
} // namespace android