/*
 *	Defines the COM interfaces of Game Explorer
 *
 * Copyright (C) 2008 Alistair Leslie-Hughes
 * Copyright (C) 2010 Mariusz PluciƄski
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "oaidl.idl";
import "ocidl.idl";
import "shobjidl.idl";

#ifndef __WIDL__
#define threading(model)
#define progid(str)
#define vi_progid(str)
#endif

[
  uuid(4F48A59C-942D-4F3C-83C9-4EFFE84E4959),
  version(1.0),
  helpstring("gameux public 1.0 Type Library")
]
library gameuxLib
{
    importlib("stdole2.tlb");

    cpp_quote("#define ID_GDF_XML __GDF_XML")
    cpp_quote("#define ID_GDF_THUMBNAIL __GDF_THUMBNAIL")
    cpp_quote("#define ID_ICON_ICO __ICON_ICO")

    cpp_quote("#if defined(__GNUC__)")
    cpp_quote("#define ID_GDF_XML_STR (const WCHAR[]){'_','_','G','D','F','_','X','M','L',0}")
    cpp_quote("#define ID_GDF_THUMBNAIL_STR (const WCHAR[]){'_','_','G','D','F','_','T','H','U','M','B','N','A','I','L',0}")
    cpp_quote("#elif defined(_MSC_VER)")
    cpp_quote("#define ID_GDF_XML_STR L\"__GDF_XML\"")
    cpp_quote("#define ID_GDF_THUMBNAIL_STR L\"__GDF_THUMBNAIL\"")
    cpp_quote("#endif")

    typedef enum
    {
        GIS_NOT_INSTALLED  = 1,
        GIS_CURRENT_USER   = 2,
        GIS_ALL_USERS      = 3
    } GAME_INSTALL_SCOPE;

    typedef enum
    {
        GAMESTATS_OPEN_OPENORCREATE = 0,
        GAMESTATS_OPEN_OPENONLY = 1
    } GAMESTATS_OPEN_TYPE;

    typedef enum
    {
        GAMESTATS_OPEN_CREATED = 0,
        GAMESTATS_OPEN_OPENED = 1
    } GAMESTATS_OPEN_RESULT;

    [
      object,
      uuid(E7B2FB72-D728-49B3-A5F2-18EBF5F1349E)
    ]
    interface IGameExplorer : IUnknown
    {
        HRESULT AddGame([in] BSTR sGDFBinaryPath,
                    [in] BSTR sInstallDirectory,
                    [in] GAME_INSTALL_SCOPE installScope,
                    [in, out] GUID* pguidInstanceID);

        HRESULT RemoveGame([in] GUID instanceID);

        HRESULT UpdateGame([in] GUID instanceID);

        HRESULT VerifyAccess([in] BSTR sGDFBinaryPath,
                    [out] BOOL* pHasAccess);
    };

    [
      object,
      uuid(3887C9CA-04A0-42ae-BC4C-5FA6C7721145)
    ]
    interface IGameStatistics : IUnknown
    {
        HRESULT GetMaxCategoryLength(
                    [retval, out] UINT* cch);

        HRESULT GetMaxNameLength(
                    [retval, out] UINT* cch);

        HRESULT GetMaxValueLength(
                    [retval, out] UINT* cch);

        HRESULT GetMaxCategories(
                    [retval, out] WORD* pMax);

        HRESULT GetMaxStatsPerCategory(
                    [retval, out] WORD* pMax);

        HRESULT SetCategoryTitle(
                    [in] WORD categoryIndex,
                    [string, in] LPCWSTR title);

        HRESULT GetCategoryTitle(
                    [in] WORD categoryIndex,
                    [retval, string, out] LPWSTR* pTitle);

        HRESULT GetStatistic(
                    [in] WORD categoryIndex,
                    [in] WORD statIndex,
                    [string, unique, out, in] LPWSTR* pName,
                    [string, unique, out, in] LPWSTR* pValue);

        HRESULT SetStatistic(
                    [in] WORD categoryIndex,
                    [in] WORD statIndex,
                    [string, in] LPCWSTR name,
                    [string, in] LPCWSTR value);

        HRESULT Save(
                    [in] BOOL trackChanges);

        HRESULT SetLastPlayedCategory(
                    [in] UINT categoryIndex);

        HRESULT GetLastPlayedCategory(
                    [retval, out] UINT* pCategoryIndex);
    };

    [
      object,
      uuid(AFF3EA11-E70E-407d-95DD-35E612C41CE2)
    ]
    interface IGameStatisticsMgr : IUnknown
    {
        HRESULT GetGameStatistics(
                    [string, in] LPCWSTR GDFBinaryPath,
                    [in] GAMESTATS_OPEN_TYPE openType,
                    [out] GAMESTATS_OPEN_RESULT* pOpenResult,
                    [retval, out] IGameStatistics** ppiStats);

        HRESULT RemoveGameStatistics(
                    [string, in] LPCWSTR GDFBinaryPath);
    };

    [
      object,
      uuid(86874AA7-A1ED-450d-A7EB-B89E20B2FFF3)
    ]
    interface IGameExplorer2 : IUnknown
    {
       HRESULT InstallGame(
                    [string, in] LPCWSTR binaryGDFPath,
                    [unique, in] LPCWSTR installDirectory,
                    [in] GAME_INSTALL_SCOPE installScope);

        HRESULT UninstallGame(
                    [string, in] LPCWSTR binaryGDFPath);

        HRESULT CheckAccess(
                    [string, in] LPCWSTR binaryGDFPath,
                    [retval, out] BOOL* pHasAccess);

    }

    [
      helpstring("GameExplorer Class"),
      threading(both),
      progid("gameux.GameExplorer.1"),
      vi_progid("gameux.GameExplorer"),
      uuid(9A5EA990-3034-4D6F-9128-01F3C61022BC)
    ]
    coclass GameExplorer
    {
        [default] interface IGameExplorer;
    };

    [
      helpstring("GameStatistics Class"),
      threading(apartment),
      progid("gameux.GameStatistics.1"),
      vi_progid("gameux.GameStatistics"),
      uuid(DBC85A2C-C0DC-4961-B6E2-D28B62C11AD4)
    ]
    coclass GameStatistics
    {
        [default] interface IGameStatistics;
    };
}