// Copyright 2017 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 "cobalt/browser/system_platform_error_handler.h"

#include "base/logging.h"

namespace cobalt {
namespace browser {

void SystemPlatformErrorHandler::RaiseSystemPlatformError(
    const SystemPlatformErrorOptions& options) {
  DCHECK(!options.callback.is_null());

  CallbackData* callback_data = new CallbackData{&mutex_, options.callback};

  if (!SbSystemRaisePlatformError(
          options.error_type,
          &SystemPlatformErrorHandler::HandleSystemPlatformErrorResponse,
          callback_data)) {
    DLOG(WARNING) << "Did not handle error: " << options.error_type;
    delete callback_data;
    callback_data = nullptr;
  }

  // In case the response callback is never called, track the callback data
  // for all active errors. When this object is destroyed, all dangling data
  // will be released.
  {
    starboard::ScopedLock lock(mutex_);

    // Delete any consumed callback data.
    for (size_t i = 0; i < callback_data_.size();) {
      if (callback_data_[i]->callback.is_null()) {
        callback_data_.erase(callback_data_.begin() + i);
      } else {
        ++i;
      }
    }

    if (callback_data) {
      callback_data_.emplace_back(callback_data);
    }
  }
}

// static
void SystemPlatformErrorHandler::HandleSystemPlatformErrorResponse(
    SbSystemPlatformErrorResponse response, void* user_data) {
  CallbackData* callback_data = static_cast<CallbackData*>(user_data);
  callback_data->callback.Run(response);

  {
    starboard::ScopedLock lock(*(callback_data->mutex));
    callback_data->callback.Reset();
  }
}

}  // namespace browser
}  // namespace cobalt
