// Copyright 2021 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/contrib/stadia/stadia_interface.h"

#include <dlfcn.h>
#include <string>

#include "starboard/common/log.h"
#include "starboard/memory.h"

namespace starboard {
namespace contrib {
namespace stadia {

namespace {
void* LookupSymbol(void* handle, const std::string& name) {
  // Note, we assume that a NULL result from dlsym is abnormal in our case
  // (even though this is not true in the general case).
  void* symbol = dlsym(handle, name.c_str());
  if (!symbol) {
    SB_LOG(ERROR) << "Failed to find symbol for " << name << ": " << dlerror();
  }
  return symbol;
}
}  // namespace

StadiaInterface::StadiaInterface() {
  // Try to open the streaming client library.
  void* lib_ptr = dlopen("libstreaming_client.so", RTLD_LAZY);
  if (!lib_ptr) {
    SB_LOG(ERROR) << "Failed to open streaming client library: " << dlerror();
  }
  // Try look up the library's entry point.
  StadiaPluginHas = reinterpret_cast<StadiaPluginHasFunctionPtr>(
      LookupSymbol(lib_ptr, kStadiaPluginHas));
  StadiaPluginOpen = reinterpret_cast<StadiaPluginOpenFunctionPtr>(
      LookupSymbol(lib_ptr, kStadiaPluginOpen));
  StadiaPluginSendTo = reinterpret_cast<StadiaPluginSendToFunctionPtr>(
      LookupSymbol(lib_ptr, kStadiaPluginSendTo));
  StadiaPluginClose = reinterpret_cast<StadiaPluginCloseFunctionPtr>(
      LookupSymbol(lib_ptr, kStadiaPluginClose));
  StadiaInitialize = reinterpret_cast<StadiaInitializeFunctionPtr>(
      LookupSymbol(lib_ptr, kStadiaInitialize));

  // Return an empty optional if any entry point wasn't found.
  if (!StadiaPluginHas || !StadiaPluginOpen || !StadiaPluginSendTo ||
      !StadiaPluginClose || !StadiaInitialize) {
    SB_LOG(ERROR) << "Failed to look up one or more symbols, "
                  << "disabling streaming client.";
  }
}

}  // namespace stadia
}  // namespace contrib
}  // namespace starboard

// By default, the stadia_interface does not exist; it must be instantiated by
// the application.
const starboard::contrib::stadia::StadiaInterface* g_stadia_interface = nullptr;
