/* Copyright (c) 2010 Daniel Doubrovkine, All Rights Reserved
 * 
 * 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.  
 */
package com.sun.jna.platform.win32;

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Guid.GUID;
import com.sun.jna.platform.win32.WinNT.HRESULT;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

/**
 * Ole32.dll Interface.
 * @author dblock[at]dblock.org
 */
public interface Ole32 extends StdCallLibrary {
	
	Ole32 INSTANCE = (Ole32) Native.loadLibrary(
			"Ole32", Ole32.class, W32APIOptions.UNICODE_OPTIONS);
	
	/**
	 * Creates a GUID, a unique 128-bit integer used for CLSIDs and interface identifiers. 
	 * @param pguid
	 *  A pointer to the requested GUID.
	 * @return
	 *  S_OK if the GUID was successfully created.
	 */
	HRESULT CoCreateGuid(GUID.ByReference pguid);
	
	/**
	 * Converts a globally unique identifier (GUID) into a string of printable characters. 
	 * @param rguid
	 *  The GUID to be converted.
	 * @param lpsz
	 *  A pointer to a caller-allocated string variable to receive the resulting string.
	 * @param cchMax
	 *  The number of characters available in the lpsz buffer. 
	 * @return
	 *  If the function succeeds, the return value is the number of characters in the 
	 *  returned string, including the null terminator. If the buffer is too small to contain 
	 *  the string, the return value is 0.
	 */
	int StringFromGUID2(GUID.ByReference rguid, char[] lpsz, int cchMax);
	
	/**
	 * Converts a string generated by the StringFromIID function back into the 
	 * original interface identifier (IID).
	 * @param lpsz
	 *  A pointer to the string representation of the IID.
	 * @param lpiid
	 *  A pointer to the requested IID on return.
	 * @return
	 *  This function can return the standard return values E_INVALIDARG, E_OUTOFMEMORY, 
	 *  and S_OK.
	 */
	HRESULT IIDFromString(String lpsz, GUID.ByReference lpiid);

    /**
     * Initializes the COM library for use by the calling thread, sets the thread's
     * concurrency model, and creates a new apartment for the thread if one is required.
     * @param reserved This parameter is reserved and must be NULL.
     * @param dwCoInit The concurrency model and initialization options for the
     * thread. Values for this parameter are taken from the COINIT enumeration.
     * Any combination of values from COINIT can be used, except that the
     * COINIT_APARTMENTTHREADED and COINIT_MULTITHREADED flags cannot both be
     * set. The default (and only sane choice) is COINIT_MULTITHREADED.
     * @return This function can return the standard return values E_INVALIDARG, E_OUTOFMEMORY, and E_UNEXPECTED, as well as the following values. S_OK, S_FALSE, RPC_E_CHANGED_MODE
     */
    HRESULT CoInitializeEx(Pointer reserved, int dwCoInit);
    
    /**
     * Closes the COM library on the current thread, unloads all DLLs loaded by
     * the thread, frees any other resources that the thread maintains, and
     * forces all RPC connections on the thread to close.
     * 
     */
    void CoUninitialize();

    /**
     * Creates a single uninitialized object of the class associated with a specified CLSID.
     * @param rclsid The CLSID associated with the data and code that will be used to create the object.
     * @param pUnkOuter If NULL, indicates that the object is not being created as part of an aggregate. If non-NULL, pointer to the aggregate object's IUnknown interface (the controlling IUnknown).
     * @param dwClsContext Context in which the code that manages the newly created object will run. The values are taken from the enumeration CLSCTX defined in WTypes.
     * @param riid A reference to the identifier of the interface to be used to communicate with the object.
     * @param ppv Address of pointer variable that receives the interface pointer requested in riid. Upon successful return, *ppv contains the requested interface pointer. Upon failure, *ppv contains NULL.
     * @return an HRESULT
     */
    HRESULT CoCreateInstance(
            GUID rclsid,
            Pointer pUnkOuter,
            int dwClsContext,
            GUID riid,
            PointerByReference ppv);

}
