blob: fef3f4ffeef3c14f6ba7d0a2e3f65cb3754be81f [file] [log] [blame]
#include "System.h"
//
#include <stdio.h>
//#include <process.h>
#include <errno.h>
#include <memory.h>
#include "String.h"
#ifndef WINDOWS
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#endif
void* System::SafeAllocMemory(UINT size)
{
if ( 0 == size )
return 0;
#ifdef WINDOWS
void* result = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
return result;
#else
void* result = malloc(size);
if ( 0 == result)
return 0;
memset(result, 0, size);
return result;
#endif
}
bool System::SafeFreeMemory(void* memory)
{
if (0 == memory)
return false;
#ifdef WINDOWS
return HeapFree(GetProcessHeap(),0, memory);
#else
free( memory);
return true;
#endif
}
void System::ShowErrorMessage(STRING message)
{
#ifdef WINDOWS
MessageBoxA(0, message, "Extracting error", MB_OK | MB_ICONERROR);
#else
fprintf( stderr, "%s\n",message);
fflush(stderr);
#endif
}
bool System::ExecuteAndWait(STRING executablePath, STRING args)
{
#ifdef WINDOWS
STARTUPINFOA si;
PROCESS_INFORMATION pi;
GetStartupInfoA(&si);
STRING fullCommand = (STRING)System::SafeAllocMemory(String::StrLen(executablePath) + String::StrLen(args) + 20);
String::Sprintf2(fullCommand,"%s %s", (int)executablePath, (int)args);
if ( 0 != CreateProcessA(0,fullCommand,0,0,false,0,0,0,&si,&pi) )
{
System::SafeFreeMemory(fullCommand);
//wait it for exit
WaitForSingleObject(pi.hProcess, 0xFFFFFFFF); //wait infinite. may be we should change it later
//clean up
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return true;
}
else
{
System::SafeFreeMemory(fullCommand);
DWORD lastErr = GetLastError();
return false;
}
#else
//make it executable
STRING command = (STRING)System::SafeAllocMemory(strlen(executablePath) + 20);
strcpy(command, "chmod +x ");
strcat(command, executablePath);
system(command);
System::SafeFreeMemory(command);
pid_t child = fork();
if ( -1 == child)
return false;
if ( 0 == child )
{
//we are in child process
execl(executablePath, args, NULL);
return false; //never ever will return
}
else
{
waitpid(child, NULL, 0);
return true;
}
return true;
#endif
}
STRING System::GetTemporaryFolder()
{
#ifdef WINDOWS
STRING tempFolder = (STRING)System::SafeAllocMemory(MAX_PATH + 1);
if ( 0 == tempFolder) return 0;
DWORD result = GetTempPathA(MAX_PATH, tempFolder);
if ( 0 == result )
{
SafeFreeMemory(tempFolder);
return 0; //WARNING: no check made for buffer's enough capcity
}
return tempFolder;
#else
return "/tmp/"; // for all NIX systems
#endif
}
int System::MemCmp(BYTE* m1, BYTE* m2, int len)
{
for ( int i = 0; i < len; i++)
if ( *(m1 + i) != *(m2 + i) )
return -1;
return 0;
}
void System::MemCpy(BYTE* m1, BYTE* m2, int count)
{
while ( --count >= 0)
*(m1 + count) = *(m2 + count);
}
#ifdef WINDOWS
static HANDLE consoleStdOut = 0;
#endif
void System::WriteLog(STRING value)
{
#ifdef WINDOWS
DWORD dwWritten = 0;
WriteConsoleA(consoleStdOut, value, String::StrLen(value),&dwWritten,0);
#else
printf(value);
#endif
}
bool System::AllocateConsole(STRING title)
{
#ifdef WINDOWS
bool result = AllocConsole();
if (true == result)
{
result = SetConsoleTitleA(title);
if ( true == result)
consoleStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
}
return result;
#else
return true;
#endif
}