// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_FRAME_CHROME_PROTOCOL_H_
#define CHROME_FRAME_CHROME_PROTOCOL_H_

#include <atlbase.h>
#include <atlcom.h>

#include "chrome_frame/chrome_tab.h"
#include "chrome_frame/resource.h"
#include "grit/chrome_frame_resources.h"

// ChromeProtocol
class ATL_NO_VTABLE ChromeProtocol
    : public CComObjectRootEx<CComSingleThreadModel>,
      public CComCoClass<ChromeProtocol, &CLSID_ChromeProtocol>,
      public IInternetProtocol {
 public:
  ChromeProtocol() {
  }
  DECLARE_REGISTRY_RESOURCEID(IDR_CHROMEPROTOCOL)

  BEGIN_COM_MAP(ChromeProtocol)
    COM_INTERFACE_ENTRY(IInternetProtocol)
    COM_INTERFACE_ENTRY(IInternetProtocolRoot)
  END_COM_MAP()

  DECLARE_PROTECT_FINAL_CONSTRUCT()

  HRESULT FinalConstruct() {
    return S_OK;
  }
  void FinalRelease() {
  }

 public:
  // IInternetProtocolRoot
  STDMETHOD(Start)(LPCWSTR url,
                   IInternetProtocolSink* prot_sink,
                   IInternetBindInfo* bind_info,
                   DWORD flags,
                   DWORD reserved);
  STDMETHOD(Continue)(PROTOCOLDATA* protocol_data);
  STDMETHOD(Abort)(HRESULT reason, DWORD options);
  STDMETHOD(Terminate)(DWORD options);
  STDMETHOD(Suspend)();
  STDMETHOD(Resume)();

  // IInternetProtocol based on IInternetProtocolRoot
  STDMETHOD(Read)(void* buffer,
                  ULONG buffer_size_in_bytes,
                  ULONG* bytes_read);
  STDMETHOD(Seek)(LARGE_INTEGER move_by,
                  DWORD origin,
                  ULARGE_INTEGER* new_position);
  STDMETHOD(LockRequest)(DWORD options);
  STDMETHOD(UnlockRequest)(void);
};

#endif  // CHROME_FRAME_CHROME_PROTOCOL_H_
