// Copyright 2018 Google Inc. 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 BASE_MESSAGE_PUMP_UI_STARBOARD_H_
#define BASE_MESSAGE_PUMP_UI_STARBOARD_H_

#include <set>

#include "base/base_export.h"
#include "base/message_loop/message_pump.h"
#include "base/run_loop.h"
#include "base/synchronization/lock.h"
#include "base/time/time.h"
#include "starboard/event.h"

namespace base {

// MessagePump that integrates with the Starboard message pump. Starboard has
// its own main loop, so the MessagePumpUIStarboard just piggybacks on that
// rather than implementing its own pump.
//
// To adopt Starboard's message pump, one simply has to create a MessageLoop of
// TYPE_UI from the Starboard message pump thread. A traditional place to do
// this would be in the kSbEventStart event handler. One has to be sure to keep
// the MessageLoop alive for as long as the application wants to use the
// Starboard message pump as a MessageLoop. That would typically be for the
// entire lifetime of the application, and in that case, the MessageLoop would
// traditionally be deleted in the kSbEventStop handler.
class BASE_EXPORT MessagePumpUIStarboard : public MessagePump {
 public:
  MessagePumpUIStarboard();
  virtual ~MessagePumpUIStarboard() {}

  // Runs one iteration of the run loop, and reschedules another call, if
  // necessary.
  void RunOneAndReschedule(bool delayed);

  // --- MessagePump Implementation ---

  virtual void Run(Delegate* delegate) override;
  virtual void Quit() override;
  virtual void ScheduleWork() override;
  virtual void ScheduleDelayedWork(const TimeTicks& delayed_work_time) override;
  virtual void Start(Delegate* delegate);

 private:
  // Cancels all outstanding scheduled callback events, if any.
  void CancelAll();

  // Cancels immediate schedule callback events.
  void CancelImmediate();

  // Cancels delayed schedule callback events.
  void CancelDelayed();

  // Cancel workhorse that assumes |outstanding_events_lock_| is locked.
  void CancelImmediateLocked();

  // Cancel delayed workhorse that assumes |outstanding_events_lock_| is locked.
  void CancelDelayedLocked();

  // Runs one iteration of the run loop, returning whether to schedule another
  // iteration or not. Places the delay, if any, in |out_delayed_work_time|.
  bool RunOne(base::TimeTicks* out_delayed_work_time);

  // The top-level RunLoop for the MessageLoopForUI. A MessageLoop needs a
  // top-level RunLoop to be considered "running."
  std::unique_ptr<base::RunLoop> run_loop_;

  // The MessagePump::Delegate configured in Start().
  Delegate* delegate_;

  // Lock protecting outstanding scheduled callback events.
  base::Lock outstanding_events_lock_;

  // A set of scheduled callback event IDs.
  typedef std::set<SbEventId> SbEventIdSet;

  // The set of outstanding scheduled callback events for immediate work.
  SbEventIdSet outstanding_events_;

  // The set of outstanding scheduled callback events for delayed work.
  SbEventIdSet outstanding_delayed_events_;

  DISALLOW_COPY_AND_ASSIGN(MessagePumpUIStarboard);
};

using MessagePumpForUI = MessagePumpUIStarboard;

}  // namespace base

#endif  // BASE_MESSAGE_PUMP_UI_STARBOARD_H_
