/*
 * 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.
 */

#pragma once

#include <stdint.h>

// The message between recovery and minadbd is 8 bytes in size unless the length is explicitly
// specified. Both the command and status has the format |prefix(4 bytes) + encoded enum(4 bytes)|.
constexpr size_t kMinadbdMessageSize = 8;
constexpr char const kMinadbdCommandPrefix[] = "COMD";
constexpr char const kMinadbdStatusPrefix[] = "STAT";

enum MinadbdErrorCode : int {
  kMinadbdSuccess = 0,
  kMinadbdArgumentsParsingError = 1,
  kMinadbdSocketIOError = 2,
  kMinadbdMessageFormatError = 3,
  kMinadbdAdbVersionError = 4,
  kMinadbdPackageSizeError = 5,
  kMinadbdFuseStartError = 6,
  kMinadbdUnsupportedCommandError = 7,
  kMinadbdCommandExecutionError = 8,
  kMinadbdErrorUnknown = 9,
};

enum class MinadbdCommandStatus : uint32_t {
  kSuccess = 0,
  kFailure = 1,
};

enum class MinadbdCommands : uint32_t {
  kInstall = 0,
  kUiPrint = 1,
  kError = 2,
};

static_assert(kMinadbdMessageSize == sizeof(kMinadbdCommandPrefix) - 1 + sizeof(MinadbdCommands));
static_assert(kMinadbdMessageSize ==
              sizeof(kMinadbdStatusPrefix) - 1 + sizeof(MinadbdCommandStatus));
