/*
 * Copyright 2001 Dmitry Timoshkov
 * Copyright 2004 Ivan Leo Puoti
 *
 * 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
 */

#include "winresrc.h"

/*
Assign WINE_FILEVERSION and WINE_FILEVERSION_STR high enough number
to make sure that programs, relying on the version numbers, will
never complain.
*/

#ifndef WINE_FILEVERSION_MAJOR
#define WINE_FILEVERSION_MAJOR 10
#endif

#ifndef WINE_FILEVERSION_MINOR
#define WINE_FILEVERSION_MINOR 0
#endif

#ifndef WINE_FILEVERSION_BUILD
#define WINE_FILEVERSION_BUILD 0
#endif

#ifndef WINE_FILEVERSION_PLATFORMID
#define WINE_FILEVERSION_PLATFORMID 0
#endif

#ifndef WINE_FILEVERSION
#define WINE_FILEVERSION WINE_FILEVERSION_MAJOR,WINE_FILEVERSION_MINOR,\
                         WINE_FILEVERSION_BUILD,WINE_FILEVERSION_PLATFORMID
#endif

#define WINE_VER_STRINGIZE2(x) #x
#define WINE_VER_STRINGIZE(x) WINE_VER_STRINGIZE2(x)

#ifndef WINE_FILEVERSION_STR
#define WINE_FILEVERSION_STR WINE_VER_STRINGIZE(WINE_FILEVERSION_MAJOR.WINE_FILEVERSION_MINOR.WINE_FILEVERSION_BUILD.WINE_FILEVERSION_PLATFORMID)
#endif

#ifndef WINE_FILEDESCRIPTION_STR
#define WINE_FILEDESCRIPTION_STR "Wine core dll"
#endif

#ifndef WINE_FILENAME
#define WINE_FILENAME ""
#endif

#ifndef WINE_FILENAME_STR
#define WINE_FILENAME_STR ""
#endif

#ifndef WINE_FILETYPE
#define WINE_FILETYPE VFT_DLL
#endif

#ifndef WINE_FILESUBTYPE
#define WINE_FILESUBTYPE VFT2_UNKNOWN
#endif

#ifndef WINE_PRODUCTVERSION
#define WINE_PRODUCTVERSION 1,0,0,0
#endif

#ifndef WINE_PRODUCTVERSION_STR
#define WINE_PRODUCTVERSION_STR "1.0"
#endif

#ifndef WINE_PRODUCTNAME_STR
#define WINE_PRODUCTNAME_STR "Wine"
#endif

#ifndef WINE_EXTRAVALUES
#define WINE_EXTRAVALUES
#endif

VS_VERSION_INFO VERSIONINFO
FILEVERSION    WINE_FILEVERSION
PRODUCTVERSION WINE_PRODUCTVERSION
FILEFLAGSMASK  63
FILEFLAGS      0
FILEOS         VOS_UNKNOWN
FILETYPE       WINE_FILETYPE
FILESUBTYPE    WINE_FILESUBTYPE
{
    BLOCK "StringFileInfo"
    {
	BLOCK "040904E4" /* LANG_ENGLISH/SUBLANG_DEFAULT, CP 1252 */
	{
	    VALUE "CompanyName", "Microsoft Corporation"  /* GameGuard depends on this */
	    VALUE "FileDescription", WINE_FILEDESCRIPTION_STR
	    VALUE "FileVersion", WINE_FILEVERSION_STR
	    VALUE "InternalName", WINE_FILENAME
	    VALUE "LegalCopyright", "Copyright (c) 1993-2013 the Wine project authors (see the file AUTHORS for a complete list)"
	    VALUE "OriginalFilename", WINE_FILENAME_STR
	    VALUE "ProductName", WINE_PRODUCTNAME_STR
	    VALUE "ProductVersion", WINE_PRODUCTVERSION_STR
	    WINE_EXTRAVALUES
	}
    }
    BLOCK "VarFileInfo"
    {
	VALUE "Translation", 0x0409, 0x04E4 /* LANG_ENGLISH/SUBLANG_DEFAULT, CP 1252 */
    }
}
