#ifndef CHROME_RENDERER_TTS_DISPATCHER_H_
#define CHROME_RENDERER_TTS_DISPATCHER_H_
#include <vector>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/containers/hash_tables.h"
#include "content/public/renderer/render_process_observer.h"
#include "third_party/WebKit/public/platform/WebSpeechSynthesizer.h"
#include "third_party/WebKit/public/platform/WebSpeechSynthesizerClient.h"
namespace IPC {
class Message;
}
struct TtsVoice;
class TtsDispatcher
    : public blink::WebSpeechSynthesizer,
      public content::RenderProcessObserver {
 public:
  explicit TtsDispatcher(blink::WebSpeechSynthesizerClient* client);
 private:
  virtual ~TtsDispatcher();
  
  virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE;
  
  virtual void updateVoiceList() OVERRIDE;
  virtual void speak(const blink::WebSpeechSynthesisUtterance& utterance)
      OVERRIDE;
  virtual void pause() OVERRIDE;
  virtual void resume() OVERRIDE;
  virtual void cancel() OVERRIDE;
  blink::WebSpeechSynthesisUtterance FindUtterance(int utterance_id);
  void OnSetVoiceList(const std::vector<TtsVoice>& voices);
  void OnDidStartSpeaking(int utterance_id);
  void OnDidFinishSpeaking(int utterance_id);
  void OnDidPauseSpeaking(int utterance_id);
  void OnDidResumeSpeaking(int utterance_id);
  void OnWordBoundary(int utterance_id, int char_index);
  void OnSentenceBoundary(int utterance_id, int char_index);
  void OnMarkerEvent(int utterance_id, int char_index);
  void OnWasInterrupted(int utterance_id);
  void OnWasCancelled(int utterance_id);
  void OnSpeakingErrorOccurred(int utterance_id,
                               const std::string& error_message);
  
  
  blink::WebSpeechSynthesizerClient* synthesizer_client_;
  
  static int next_utterance_id_;
  
  base::hash_map<int, blink::WebSpeechSynthesisUtterance> utterance_id_map_;
  DISALLOW_COPY_AND_ASSIGN(TtsDispatcher);
};
#endif