/*
 * The contents of this file is dual-licensed under 2
 * alternative Open Source/Free licenses: LGPL 2.1 or later and
 * Apache License 2.0. (starting with JNA version 4.0.0).
 *
 * You can freely decide which license you want to apply to
 * the project.
 *
 * You may obtain a copy of the LGPL License at:
 *
 * http://www.gnu.org/licenses/licenses.html
 *
 * A copy is also included in the downloadable source code package
 * containing JNA, in file "LGPL2.1".
 *
 * You may obtain a copy of the Apache License at:
 *
 * http://www.apache.org/licenses/
 *
 * A copy is also included in the downloadable source code package
 * containing JNA, in file "AL2.0".
 */
package com.sun.jna.platform.win32;

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

/**
 * Provides access to the w32 version library.
 */
public interface Version extends StdCallLibrary {

    Version INSTANCE = Native.load("version", Version.class, W32APIOptions.DEFAULT_OPTIONS);

    /**
     * Determines whether the operating system can retrieve version information for a specified file. If version
     * information is available, GetFileVersionInfoSize returns the size, in bytes, of that information.
     *
     * @param lptstrFilename
     *   The name of the file of interest. The function uses the search sequence specified by the LoadLibrary function.
     *
     * @param lpdwHandle
     *   A pointer to a variable that the function sets to zero.
     *
     * @return
     *   If the function succeeds, the return value is the size, in bytes, of the file's version information.
     *
     *   If the function fails, the return value is zero. To get extended error information, call GetLastError.
     */
    int GetFileVersionInfoSize(String lptstrFilename, IntByReference lpdwHandle);

    /**
     * Retrieves version information for the specified file.
     *
     * @param lptstrFilename
     *   The name of the file. If a full path is not specified, the function uses the search sequence specified by the
     *   LoadLibrary function.
     *
     * @param dwHandle
     *   This parameter is ignored.
     *
     * @param dwLen
     *   The size, in bytes, of the buffer pointed to by the lpData parameter.
     *
     *   Call the GetFileVersionInfoSize function first to determine the size, in bytes, of a file's version
     *   information. The dwLen member should be equal to or greater than that value.
     *
     *   If the buffer pointed to by lpData is not large enough, the function truncates the file's version information
     *   to the size of the buffer.
     *
     * @param lpData
     *   Pointer to a buffer that receives the file-version information.
     *
     *   You can use this value in a subsequent call to the VerQueryValue function to retrieve data from the buffer.
     *
     * @return
     *   If the function succeeds, the return value is nonzero.
     *
     *   If the function fails, the return value is zero. To get extended error information, call GetLastError.
     */
    boolean GetFileVersionInfo(String lptstrFilename, int dwHandle, int dwLen, Pointer lpData);

    /**
     * Retrieves specified version information from the specified version-information resource. To retrieve the
     * appropriate resource, before you call VerQueryValue, you must first call the GetFileVersionInfoSize function, and
     * then the GetFileVersionInfo function.
     *
     * @param pBlock
     *   The version-information resource returned by the GetFileVersionInfo function.
     *
     * @param lpSubBlock
     *   The version-information value to be retrieved.
     *
     * @param lplpBuffer
     *   When this method returns, contains the address of a pointer to the requested version information in the buffer
     *   pointed to by pBlock. The memory pointed to by lplpBuffer is freed when the associated pBlock memory is freed.
     *
     * @param puLen
     *   When this method returns, contains a pointer to the size of the requested data pointed to by lplpBuffer: for
     *   version information values, the length in characters of the string stored at lplpBuffer; for translation array
     *   values, the size in bytes of the array stored at lplpBuffer; and for root block, the size in bytes of the
     *   structure.
     *
     * @return
     *   If the specified version-information structure exists, and version information is available, the return value
     *   is nonzero. If the address of the length buffer is zero, no value is available for the specified
     *   version-information name.
     *
     *   If the specified name does not exist or the specified resource is not valid, the return value is zero.
     */
    boolean VerQueryValue(Pointer pBlock, String lpSubBlock, PointerByReference lplpBuffer, IntByReference puLen);
}
