/*
 * Copyright (C) 2019 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.
 */

#define LOG_TAG "incremental_manager-jni"

#include "core_jni_helpers.h"
#include "incfs_ndk.h"
#include "jni.h"
#include "nativehelper/JNIHelp.h"

#include <iterator>
#include <memory>

namespace android {

static jboolean nativeIsEnabled(JNIEnv* env, jobject clazz) {
    return IncFs_IsEnabled();
}

static jboolean nativeIsIncrementalPath(JNIEnv* env,
                                    jobject clazz,
                                    jstring javaPath) {
    ScopedUtfChars path(env, javaPath);
    return (jboolean)IncFs_IsIncFsPath(path.c_str());
}

static jbyteArray nativeUnsafeGetFileSignature(JNIEnv* env, jobject clazz, jstring javaPath) {
    ScopedUtfChars path(env, javaPath);

    char signature[INCFS_MAX_SIGNATURE_SIZE];
    size_t size = sizeof(signature);
    if (IncFs_UnsafeGetSignatureByPath(path.c_str(), signature, &size) < 0) {
        return nullptr;
    }

    jbyteArray result = env->NewByteArray(size);
    if (result != nullptr) {
        env->SetByteArrayRegion(result, 0, size, (const jbyte*)signature);
    }
    return result;
}

static const JNINativeMethod method_table[] = {{"nativeIsEnabled", "()Z", (void*)nativeIsEnabled},
                                               {"nativeIsIncrementalPath", "(Ljava/lang/String;)Z",
                                                (void*)nativeIsIncrementalPath},
                                               {"nativeUnsafeGetFileSignature",
                                                "(Ljava/lang/String;)[B",
                                                (void*)nativeUnsafeGetFileSignature}};

int register_android_os_incremental_IncrementalManager(JNIEnv* env) {
    return jniRegisterNativeMethods(env, "android/os/incremental/IncrementalManager",
                                    method_table, std::size(method_table));
}

} // namespace android
