/* Copyright (c) 2010,2011 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.jpexs.decompiler.flash.gui.jna.platform.win32;

import com.jpexs.decompiler.flash.gui.jna.platform.win32.WinNT.HRESULT;

// TODO: Auto-generated Javadoc
/**
 * Utility class for some common error functions.
 */
public abstract class W32Errors implements WinError {

    /**
     * Generic test for success on any status value (non-negative numbers
     * indicate success).
     *
     * @param hr the hr
     * @return true, if successful
     */
    public static final boolean SUCCEEDED(int hr) {
        return hr >= 0;
    }

    /**
     * and the inverse.
     *
     * @param hr the hr
     * @return true, if successful
     */
    public static final boolean FAILED(int hr) {
        return hr < 0;
    }

    /**
     * Succeeded.
     *
     * @param hr the hr
     * @return true, if successful
     */
    public static final boolean SUCCEEDED(HRESULT hr) {
        if (hr != null) {
            return SUCCEEDED(hr.intValue());
        } else {
            return false;
        }
    }

    /**
     * Failed.
     *
     * @param hr the hr
     * @return true, if successful
     */
    public static final boolean FAILED(HRESULT hr) {
        if (hr != null) {
            return FAILED(hr.intValue());
        } else {
            return false;
        }
    }

    /**
     * Extract error code from HRESULT.
     *
     * @param hr the hr
     * @return the int
     */
    public static final int HRESULT_CODE(int hr) {
        return hr & 0xFFFF;
    }

    /**
     * Extract error code from SCODE.
     *
     * @param sc the sc
     * @return the int
     */
    public static final int SCODE_CODE(int sc) {
        return sc & 0xFFFF;
    }

    /**
     * Return the facility.
     *
     * @param hr the hr
     * @return the int
     */
    public static final int HRESULT_FACILITY(int hr) {
        return (hr >>= 16) & 0x1fff;
    }

    /**
     * Scode facility.
     *
     * @param sc the sc
     * @return the int
     */
    public static final int SCODE_FACILITY(short sc) {
        return (sc >>= 16) & 0x1fff;
    }

    /**
     * Return the severity.
     *
     * @param hr the hr
     * @return the short
     */
    public static short HRESULT_SEVERITY(int hr) {
        return (short) ((hr >>= 31) & 0x1);
    }

    /**
     * Scode severity.
     *
     * @param sc the sc
     * @return the short
     */
    public static short SCODE_SEVERITY(short sc) {
        return (short) ((sc >>= 31) & 0x1);
    }

    /**
     * Create an HRESULT value from component pieces.
     *
     * @param sev the sev
     * @param fac the fac
     * @param code the code
     * @return the int
     */
    public static int MAKE_HRESULT(short sev, short fac, short code) {
        return ((sev << 31) | (fac << 16) | code);
    }

    /**
     * Make scode.
     *
     * @param sev the sev
     * @param fac the fac
     * @param code the code
     * @return the int
     */
    public static final int MAKE_SCODE(short sev, short fac, short code) {
        return ((sev << 31) | (fac << 16) | code);
    }

    /**
     * Map a WIN32 error value into a HRESULT Note: This assumes that WIN32
     * errors fall in the range -32k to=32k.
     *
     * @param x original w32 error code
     * @return the converted value
     */
    public static final HRESULT HRESULT_FROM_WIN32(int x) {
        int f = FACILITY_WIN32;
        return new HRESULT(x <= 0 ? x : ((x) & 0x0000FFFF) | (f <<= 16)
                | 0x80000000);
    }

    /**
     * FACILITY_USERMODE_FILTER_MANAGER
     *
     * Translation macro for converting: NTSTATUS --> HRESULT.
     *
     * @param x the x
     * @return the int
     */
    public static final int FILTER_HRESULT_FROM_FLT_NTSTATUS(int x) {
        int f = FACILITY_USERMODE_FILTER_MANAGER;
        return (((x) & 0x8000FFFF) | (f <<= 16));
    }
}
