// Copyright 2020 The Cobalt Authors. All Rights Reserved.
//
// 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 "starboard/system.h"

#include "starboard/common/string.h"
#include "starboard/extension/configuration.h"
#include "starboard/extension/crash_handler.h"
#include "starboard/extension/demuxer.h"
#include "starboard/extension/enhanced_audio.h"
#include "starboard/extension/free_space.h"
#include "starboard/extension/ifa.h"
#include "starboard/extension/memory_mapped_file.h"
#include "starboard/extension/platform_service.h"
#include "starboard/extension/time_zone.h"
#include "starboard/linux/shared/ifa.h"
#include "starboard/linux/shared/soft_mic_platform_service.h"
#include "starboard/linux/shared/time_zone.h"
#include "starboard/shared/enhanced_audio/enhanced_audio.h"
#include "starboard/shared/ffmpeg/ffmpeg_demuxer.h"
#include "starboard/shared/posix/free_space.h"
#include "starboard/shared/posix/memory_mapped_file.h"
#include "starboard/shared/starboard/application.h"
#include "starboard/shared/starboard/crash_handler.h"
#if SB_IS(EVERGREEN_COMPATIBLE)
#include "starboard/elf_loader/evergreen_config.h"
#endif
#include "starboard/linux/shared/configuration.h"

const void* SbSystemGetExtension(const char* name) {
#if SB_IS(EVERGREEN_COMPATIBLE)
  const starboard::elf_loader::EvergreenConfig* evergreen_config =
      starboard::elf_loader::EvergreenConfig::GetInstance();
  if (evergreen_config != NULL &&
      evergreen_config->custom_get_extension_ != NULL) {
    const void* ext = evergreen_config->custom_get_extension_(name);
    if (ext != NULL) {
      return ext;
    }
  }
#endif
  if (strcmp(name, kCobaltExtensionPlatformServiceName) == 0) {
    return starboard::shared::GetPlatformServiceApi();
  }
  if (strcmp(name, kCobaltExtensionConfigurationName) == 0) {
    return starboard::shared::GetConfigurationApi();
  }
  if (strcmp(name, kCobaltExtensionCrashHandlerName) == 0) {
    return starboard::common::GetCrashHandlerApi();
  }
  if (strcmp(name, kCobaltExtensionMemoryMappedFileName) == 0) {
    return starboard::shared::posix::GetMemoryMappedFileApi();
  }
  if (strcmp(name, kCobaltExtensionFreeSpaceName) == 0) {
    return starboard::shared::posix::GetFreeSpaceApi();
  }
#if SB_API_VERSION < 15
  if (strcmp(name, kCobaltExtensionEnhancedAudioName) == 0) {
    return starboard::shared::enhanced_audio::GetEnhancedAudioApi();
  }
#endif  // SB_API_VERSION < 15
  if (strcmp(name, kCobaltExtensionDemuxerApi) == 0) {
    auto command_line =
        starboard::shared::starboard::Application::Get()->GetCommandLine();
    const bool use_ffmpeg_demuxer =
        command_line->HasSwitch("enable_demuxer_extension");
    return use_ffmpeg_demuxer ? starboard::shared::ffmpeg::GetFFmpegDemuxerApi()
                              : NULL;
  }
  if (strcmp(name, kStarboardExtensionTimeZoneName) == 0) {
    return starboard::shared::GetTimeZoneApi();
  }
#if SB_API_VERSION < 14
  if (strcmp(name, kStarboardExtensionIfaName) == 0) {
    return starboard::shared::GetIfaApi();
  }
#endif  // SB_API_VERSION < 14
  return NULL;
}
