// 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_FRAME_HELPER_UTIL_H_
#define CHROME_FRAME_CHROME_FRAME_HELPER_UTIL_H_

#include <windows.h>

// Compare the given class name with the known window class names for
// internet explorer browser windows.
//
// @param [in] window_to_check handle to the window to be checked
//
// @return true if the window class matches known class names for IE browser.
//
bool UtilIsWebBrowserWindow(HWND window_to_check);

// A utility function that retrieves the specified web browser COM interface
// from the web browser window. The passed in window must be the web browser
// window (class name "IEFrame" in IE6 and "TabWindowClass" in IE7)
// @param[in] window The web browser window whose COM object is to be fetched
// @param[in] iid    The IID of the interface to be fetched
// @param[out] web_browser_object
//                   The requested interface pointer to the web browser object
//                   is returned in this variable upon success
//
HRESULT UtilGetWebBrowserObjectFromWindow(HWND window,
                                          REFIID iid,
                                          void** web_browser_object);

// Checks to see whether the passed in window is of the class specified.
// of the heirarchy list
// @param hwnd_to_match        [in]  The handle of the window that is to be
//                                   matched.
// @param window_class         [in]  The window class to match against.
//
bool IsWindowOfClass(HWND hwnd_to_match, const wchar_t* window_class);

// Returns true if the current process name is process_name, false otherwise.
bool IsNamedProcess(const wchar_t* process_name);

// Returns true if window has the name |window_name|, false otherwise.
bool IsNamedWindow(HWND window, const wchar_t* window_name);

//
// This function recursively enumerates all windows from a given starting point
// and searches for the first occurrence of a window matching
// the class name and window name passed in. We use the EnumChildWindows API
// to search for the window.
// @note The FindWindowEx function does something similar, however, it goes
// only one level deep and does not recurse descendants.
// @param parent [in] The HWND of the window from which to start looking. If
//                    this is NULL then enumerate all windows on the desktop.
// @param class_name [in, optional] The class name of the matching window
// @param window_name [in, optional] The window text of the matching window.
//                                   At least one of class_name and
//                                   window_name must be non-NULL.
// @param thread_id_to_match [in] This parameter will be used to match
//                                particular thread id for window.
// @param process_id_to_match [in] This parameter will be used to match
//                                 particular process id for window.
// @return The window handle of the matching window, if found, or NULL.
//
HWND RecurseFindWindow(HWND parent,
                       const wchar_t* class_name,
                       const wchar_t* window_name,
                       DWORD thread_id_to_match,
                       DWORD process_id_to_match);

// Reads |value_size| characters from a value named |value_name| in |key| and
// places them in the buffer pointed to by |value|. Returns ERROR_SUCCESS on
// success.
LONG ReadValue(HKEY key,
               const wchar_t* value_name,
               size_t value_size,
               wchar_t* value);


// Returns true if our BHO is registered in the HKLM subkey that IE checks for
// the list of BHOs to load.
bool IsBHOLoadingPolicyRegistered();

// Returns true if system-level Chrome Frame is installed.
bool IsSystemLevelChromeFrameInstalled();

#endif  // CHROME_FRAME_CHROME_FRAME_HELPER_UTIL_H_