/******************************************************************************
This source file is part of Viewizard Game Engine
For the latest info, see http://www.viewizard.com/
File name: System.cpp
Copyright (c) 2006-2007 Michael Kurinnoy, Viewizard
All Rights Reserved.
File Version: 3.0
******************************************************************************
AstroMenace game source code available under "dual licensing" model.
The licensing options available are:
* Commercial Licensing. This is the appropriate option if you are
creating proprietary applications and you are not prepared to
distribute and share the source code of your application.
Contact us for pricing at viewizard@viewizard.com
* Open Source Licensing. This is the appropriate option if you want
to share the source code of your application with everyone you
distribute it to, and you also want to give them the right to share
who uses it. You should have received a copy of the GNU General Public
License version 3 with this source codes.
If not, see .
******************************************************************************/
#include "System.h"
//------------------------------------------------------------------------------------
// проверка расширения файла
//------------------------------------------------------------------------------------
bool vw_TestFileExtension(const char *name, char *extension)
{
if(name==0||extension==0) return false;
size_t LengthName=strlen(name), LengthString=strlen(extension);
if(LengthName=0;i--)
if(name[i]=='.')
if(!strcmp(&name[i+1],extension)) return true;
else return false;
return false;
}
//------------------------------------------------------------------------------------
// все что ниже, нужно для открытия броузера
//------------------------------------------------------------------------------------
#ifdef WIN32
#include
#include
static LONG GetRegistryKey(HKEY key, LPCTSTR subkey, LPTSTR retdata)
{
HKEY hkey;
LONG retval = RegOpenKeyEx(key, subkey, 0, KEY_QUERY_VALUE, &hkey);
if (retval == ERROR_SUCCESS)
{
long datasize = MAX_PATH;
TCHAR data[MAX_PATH];
RegQueryValue(hkey, NULL, data, &datasize);
_tcscpy(retdata,data);
RegCloseKey(hkey);
}
return retval;
}
#endif // WIN32
// поиск пути для запуска броузера
/*
Build dependencies:
libc6-dev
Runtime dependencies:
libc6
*/
#ifdef __unix
#include
#include
#include
#include
#include
#include
#include
char **get_path(void) {
const char *path = getenv("PATH"), *cstr;
char *null_path, **tokenized_path, *str;
unsigned int parts = (path[0] != '\0') ? 1 : 0, a;
null_path = (char *)malloc(strlen(path) + 1);
for(cstr = path, str = null_path; *cstr; ++cstr, ++str) {
switch(*cstr) {
case ':':
*str = '\0';
++parts;
break;
default:
*str = *cstr;
}
}
*str = '\0';
tokenized_path = (char **)malloc(sizeof(char *) * (parts+1));
tokenized_path[parts] = NULL;
for(a = 0, str = null_path; a < parts; ++a) {
tokenized_path[a] = str;
do { ++str; } while(str[-1]);
}
return tokenized_path;
}
void free_path(char **tokenized_path) {
free(tokenized_path[0]);
free(tokenized_path);
}
int executable_exists_in_path(char **tokenized_path, const char *app_name) {
DIR *dir;
unsigned int a;
int found = 0;
for(a = 0; !found && tokenized_path[a]; ++a) {
DIR *dir = opendir(tokenized_path[a]);
if(dir) {
struct dirent *dirent;
for(dirent = readdir(dir); dirent != NULL; dirent = readdir(dir)) {
if(strcmp(dirent->d_name, app_name) == 0) {
/* We found something with a correct name, is it a proper executable? */
size_t full_path_length = strlen(tokenized_path[a]) + 1 + strlen(app_name) + 1;
char *full_path = (char *)malloc(full_path_length);
struct stat buf;
snprintf(full_path, full_path_length, "%s/%s", tokenized_path[a], app_name);
if(stat(full_path, &buf) == 0) {
/* Is is a regular file and is it executable by anyone? */
if(S_ISREG(buf.st_mode) && (buf.st_mode & S_IXOTH))
found = 1;
/* FIXME It would be more accurate to test if this user can
* execute the file rather than if any user can.
*/
}
free(full_path);
}
}
closedir(dir);
}
}
return found;
}
char **get_browsers(void) {
static const char *envvar_list[] = {
"BROWSER"
};
static const char *metabrowser_list[] = {
"sensible-browser" /* Debian */
};
static const char *browser_list[] = {
"firefox", /* Listed in the order I feel like ;) */
"galeon",
"epiphany",
"konqueror",
"opera",
"netscape",
"dillo",
"mozilla"
};
char **tokenized_path = get_path(), **browsers = NULL;
unsigned int a;
/* Check for an environment variable telling us what browser to use */
if(!browsers) {
for(a = 0; a < sizeof(envvar_list)/sizeof(envvar_list[0]); ++a) {
char *value = getenv(envvar_list[a]);
if(value != NULL) {
// Assume the user is correct
browsers = (char **)malloc(sizeof(char *) * (1+1));
browsers[0] = strdup(value);
browsers[1] = NULL;
break;
}
}
}
/* Check for any browser */
if(!browsers) {
unsigned int a, b, browser_list_count = sizeof(browser_list)/sizeof(browser_list[0]);
browsers = (char **)calloc(browser_list_count, sizeof(char *));
for(a = b = 0; a < browser_list_count; ++a) {
if(executable_exists_in_path(tokenized_path, browser_list[a]))
browsers[b++] = strdup(browser_list[a]);
}
if(b == 0) {
free(browsers);
browsers = NULL;
}
}
/* Check for distro-specific browser detection type stuff */
if(!browsers) {
for(a = 0; a < sizeof(metabrowser_list)/sizeof(metabrowser_list[0]); ++a) {
if(executable_exists_in_path(tokenized_path, metabrowser_list[a])) {
// Let it handle the work
browsers = (char **)malloc(sizeof(char *) * (1+1));
browsers[0] = strdup(metabrowser_list[a]);
browsers[1] = NULL;
break;
}
}
}
free_path(tokenized_path);
return browsers;
}
void free_browsers(char **browsers) {
unsigned int a;
if(browsers) {
for(a = 0; browsers[a]; ++a)
free(browsers[a]);
free(browsers);
}
}
#endif// __unix
// открываем браузер
bool vw_OpenBrouser(char *url)
{
#ifdef WIN32
HINSTANCE result;
result = ShellExecute(NULL, _T("open"), url, NULL,NULL, SW_NORMAL);
if ((UINT)result > HINSTANCE_ERROR) return true;
// если не получилось, делаем по второму сценарию
TCHAR key[MAX_PATH + MAX_PATH];
if (GetRegistryKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS)
{
lstrcat(key, _T("\\shell\\open\\command"));
if (GetRegistryKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS)
{
TCHAR *pos;
pos = _tcsstr(key, _T("\"%1\""));
if (pos == NULL)
{ // No quotes found
pos = strstr(key, _T("%1")); // Check for %1, without quotes
if (pos == NULL) // No parameter at all...
pos = key+_tcslen(key)-1;
else
*pos = _T('\0'); // Remove the parameter
}
else
*pos = _T('\0'); // Remove the parameter
lstrcat(pos, _T(" "));
lstrcat(pos, url);
result = (HINSTANCE) WinExec(key,SW_NORMAL);
}
}
else
return false;
#endif // WIN32
#ifdef __unix
char **browsers = get_browsers();
unsigned int a = 0;
if(browsers)
{
// не перебираем!!! берем первый броузер
a = 0;
// проверка, если установлен 93 дисплей - это компиз... открываем в 0-м
char *value = getenv("DISPLAY");
bool NeedSetDisplay = false;
if (value != 0)
{
char *display = new char[strlen(value)+1];
display = strdup(value);
if (!strcmp(display, ":93"))
{
NeedSetDisplay = true;
printf("DISPLAY=%s \n", display);
}
delete [] display;
}
printf("%u:\t%s\n", a, browsers[a]);
char GotoUrl[1024];
if (NeedSetDisplay)
sprintf(GotoUrl,"DISPLAY=:0 %s %s",browsers[a], url);
else
sprintf(GotoUrl,"%s %s",browsers[a], url);
int x;
x = fork();
switch(x)
{
case -1:
printf("error, unable to fork process!\n");
break;
case 0:
//printf("This is the forked process!\n");
//system(GotoUrl); - плохо...
execl(getenv("SHELL"), "sh", "-c", GotoUrl, (char *)0);
// should not be reached
printf("Error executing process!\n");
break;
//default:
//printf("This is the original process!\n");
}
}
else
{
printf("Could not open Web page. Please, visit %s\n", url);
return false;
}
free_browsers(browsers);
#endif // unix
return true;
}