'------------------------------------------------------------------------------
'--------------- COMMON FUNCTIONS USED BY ANDROCERTIF UTILITIES ---------------
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
GLOBAL toolsPath AS STRING
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
TYPE NATIVE_SYSTEM_INFO
  wProcessorArchitecture AS WORD
  wReserved AS WORD
  dwPageSize AS DWORD
  lpMinimumApplicationAddress AS DWORD
  lpMaximumApplicationAddress AS DWORD
  dwActiveProcessorMask AS DWORD
  dwNumberOfProcessors AS DWORD
  dwProcessorType AS DWORD
  dwAllocationGranularity AS DWORD
  wProcessorLevel AS WORD
  wProcessorRevision AS WORD
END TYPE
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION IsWindowsx64() AS LONG
    LOCAL si                    AS NATIVE_SYSTEM_INFO
    LOCAL arch,CPUnum           AS LONG
    LOCAL SystemInfo            AS NATIVE_SYSTEM_INFO
    LOCAL pGetNativeSystemInfo  AS LONG

    pGetNativeSystemInfo = GetProcAddress(GetModuleHandle("kernel32.dll"), "GetNativeSystemInfo")
    IF (pGetNativeSystemInfo) THEN
        CALL DWORD pGetNativeSystemInfo USING GetNativeSystemInfo(SystemInfo)
        arch = SystemInfo.wProcessorArchitecture
        CPUnum=SystemInfo.dwNumberOfProcessors
        'stdout "CPU:"+str$(CPUnum)+" Architektur:"+hex$(arch)
        IF (arch = %PROCESSOR_ARCHITECTURE_AMD64) THEN
            FUNCTION = %True
        ELSE
            FUNCTION = %False
        END IF
    ELSE
        'get system information
        GetSystemInfo BYVAL VARPTR(si)
        arch = si.wProcessorArchitecture
        'STDOUT "CPUs:"+STR$(si.dwNumberOfProcessors) 'this is just for testing, if structure is still OK
        IF arch = %PROCESSOR_ARCHITECTURE_AMD64 OR _
           arch = %PROCESSOR_ARCHITECTURE_IA64 THEN
            FUNCTION = %True
        ELSEIF arch = %PROCESSOR_ARCHITECTURE_INTEL THEN
            FUNCTION = %False
        ELSE
            FUNCTION = %False
        END IF
    END IF
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION MissingTools() AS LONG
    IF IsWindowsx64() THEN toolsPath = "tools_x64" ELSE toolsPath = "tools_x86"
    IF NOT EXIST(toolsPath + "\keytool.exe") _
    OR NOT EXIST(toolsPath + "\openssl.exe") _
    OR NOT EXIST(toolsPath + "\openssl.cfg") _
    OR NOT EXIST(toolsPath + "\splitpem.exe") _
    OR NOT EXIST(toolsPath + "\jli.dll") _
    OR NOT EXIST(toolsPath + "\libeay32.dll") _
    OR NOT EXIST(toolsPath + "\ssleay32.dll") _
    THEN
        ?"Fatal Error:"+$CR _
        +"Some tools are missing."+$CR _
        +"Please re-install from"+$CR _
        +"http://mougino.free.fr", _
        %MB_ICONERROR, _
        EXE.NAME$+$SPC+$VER
        FUNCTION = -1
    END IF
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION PDQ(e AS STRING) AS STRING ' Protect with double quote
    FUNCTION = e
    IF INSTR(e, " ") > 0 OR e = "" THEN FUNCTION = $DQ + e + $DQ
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION EXIST(BYVAL fileOrFolder AS STRING) AS LONG
    LOCAL Dummy&
    ON ERROR GOTO Inexistant
    Dummy& = GETATTR(fileOrFolder)
    Inexistant:
    RESUME FLUSH
    FUNCTION = (ERRCLEAR = 0)
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION FileName(tx AS STRING) AS STRING
    LOCAL i AS LONG
    i = INSTR(-1, tx, "\")
    IF i > 0 THEN FUNCTION = MID$(tx, i+1)
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION FilePath(tx AS STRING) AS STRING
    LOCAL i AS LONG
    i = INSTR(-1, tx, "\")
    IF i > 0 THEN FUNCTION = LEFT$(tx, i)
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION BATCH(cmd AS STRING) AS STRING
    LOCAL ff AS LONG
    LOCAL r AS STRING

    ' Build and run script
    ff = FREEFILE
    OPEN EXE.NAME$ + ".bat" FOR OUTPUT AS #ff
    PRINT #ff, "@echo off"
    PRINT #ff, "set PATH=%CD%;%PATH%;"
    PRINT #ff, "set OPENSSL_CONF=%~dp0\openssl.cfg"
    PRINT #ff, cmd
    CLOSE #ff
    SHELL ENVIRON$("COMSPEC") + " /C " _
        + EXE.NAME$ + ".bat > " _
        + EXE.NAME$ + ".log 2>&1", 0
    KILL EXE.NAME$ + ".bat"

    ' Get result of operation
    IF NOT EXIST(EXE.NAME$ + ".log") THEN EXIT FUNCTION
    ff = FREEFILE
    OPEN EXE.NAME$ + ".log" FOR BINARY AS #ff
    GET$ #ff, LOF(#ff), r
    CLOSE #ff
    KILL EXE.NAME$ + ".log"
    FUNCTION = TRIM$(r, ANY $CRLF)

END FUNCTION
'------------------------------------------------------------------------------
