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

#ifndef COBALT_BROWSER_SYSTEM_PLATFORM_ERROR_HANDLER_H_
#define COBALT_BROWSER_SYSTEM_PLATFORM_ERROR_HANDLER_H_

#include <memory>
#include <vector>

#include "base/callback.h"
#include "starboard/common/mutex.h"
#include "starboard/system.h"

namespace cobalt {
namespace browser {

// This class handles raising system errors to the platform and returning the
// response to the caller via the provided callback.
class SystemPlatformErrorHandler {
 public:
  // Type of callback to run when the platform responds to a system error.
  typedef base::Callback<void(SbSystemPlatformErrorResponse response)>
      SystemPlatformErrorCallback;

  // Options structure for raised system platform errors, including both the
  // system error being raised and the callback to run with the response.
  struct SystemPlatformErrorOptions {
    SbSystemPlatformErrorType error_type;
    SystemPlatformErrorCallback callback;
  };

  // Raises a system error with the specified error type and callback.
  void RaiseSystemPlatformError(const SystemPlatformErrorOptions& options);

 private:
  // This specifies the user data passed to the error response callback.
  struct CallbackData {
    starboard::Mutex* mutex;
    SystemPlatformErrorCallback callback;
  };

  // This is called when the platform responds to the system error.
  static void HandleSystemPlatformErrorResponse(
      SbSystemPlatformErrorResponse response, void* user_data);

  starboard::Mutex mutex_;
  std::vector<std::unique_ptr<CallbackData>> callback_data_;
};

}  // namespace browser
}  // namespace cobalt

#endif  // COBALT_BROWSER_SYSTEM_PLATFORM_ERROR_HANDLER_H_
