Merge pull request #1171 from josch1710/master

Support for opening URLs
This commit is contained in:
UnknownShadow200 2024-04-20 13:34:49 +10:00 committed by GitHub
commit d0172cbada
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 92 additions and 15 deletions

View file

@ -41,7 +41,7 @@ APP_AUTHOR := UnknownShadow200
# options for code generation
#---------------------------------------------------------------------------------
CC := gcc
CFLAGS := -pipe -fno-math-errno -O0 -g -mtune=pentium4 -msse2 -march=i686 -idirafter /@unixroot/usr/include/os2tk45 -DOS2
CFLAGS := -pipe -fno-math-errno -O3 -g -mtune=pentium4 -msse2 -march=i686 -idirafter /@unixroot/usr/include/os2tk45 -DOS2
LDFLAGS := -Zhigh-mem -Zomf -Zargs-wild -Zargs-resp -Zlinker DISABLE -Zlinker 1121
LIBS := -lcx -lmmpm2 -lpthread -lSDL2

View file

@ -63,7 +63,9 @@ cc_bool Platform_SingleProcess;
#include <kernel/image.h>
#elif defined CC_BUILD_OS2
#include <libcx/net.h>
#define INCL_DOSPROCESS
#define INCL_DOS
#define INCL_DOSERRORS
#define INCL_PM
#include <os2.h>
#endif
@ -114,7 +116,7 @@ TimeMS DateTime_CurrentUTC(void) {
}
void DateTime_CurrentLocal(struct DateTime* t) {
struct timeval cur;
struct timeval cur;
struct tm loc_time;
gettimeofday(&cur, NULL);
localtime_r(&cur.tv_sec, &loc_time);
@ -343,7 +345,7 @@ static void* ExecThread(void* param) {
}
#else
static void* ExecThread(void* param) {
((Thread_StartFunc)param)();
((Thread_StartFunc)param)();
return NULL;
}
#endif
@ -498,7 +500,7 @@ static void FontDirCallback(const cc_string* path, void* obj) {
SysFonts_Register(path);
}
void Platform_LoadSysFonts(void) {
void Platform_LoadSysFonts(void) {
int i;
#if defined CC_BUILD_ANDROID
static const cc_string dirs[] = {
@ -589,14 +591,14 @@ static cc_result ParseHost(const char* host, int port, cc_sockaddr* addrs, int*
if (res) return res;
/* Prefer IPv4 addresses first */
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family != AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen; i++;
}
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family == AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
@ -791,6 +793,81 @@ cc_result Process_StartOpen(const cc_string* args) {
}
#elif defined CC_BUILD_HAIKU || defined CC_BUILD_BEOS
/* Implemented in interop_BeOS.cpp */
#elif defined CC_BUILD_OS2
inline static void ShowErrorMessage(const char *url) {
static char errorMsg[] = "Could not open browser. Please go to: ";
cc_string message = String_Init(errorMsg, strlen(errorMsg), 500);
String_AppendConst(&message, url);
Logger_DialogWarn(&message);
}
cc_result Process_StartOpen(const cc_string* args) {
char str[NATIVE_STR_LEN];
APIRET rc;
UCHAR path[CCHMAXPATH], params[100], parambuffer[500], *paramptr;
UCHAR userPath[CCHMAXPATH], sysPath[CCHMAXPATH];
PRFPROFILE profile = { sizeof(userPath), userPath, sizeof(sysPath), sysPath };
HINI os2Ini;
HAB hAnchor = WinQueryAnchorBlock(WinQueryActiveWindow(HWND_DESKTOP));
RESULTCODES result = { 0 };
PROGDETAILS details;
// We get URL
String_EncodeUtf8(str, args);
// Initialize buffers
Mem_Set(path, 0, sizeof(path));
Mem_Set(parambuffer, 0, sizeof(parambuffer));
Mem_Set(params, 0, sizeof(params));
// We have to look in the OS/2 configuration for the default browser.
// First step: Find the configuration files
if (!PrfQueryProfile(hAnchor, &profile)) {
ShowErrorMessage(str);
return 0;
}
// Second step: Open the configuration files and read exe path and parameters
os2Ini = PrfOpenProfile(hAnchor, userPath);
if (os2Ini == NULLHANDLE) {
ShowErrorMessage(str);
return 0;
}
if (!PrfQueryProfileString(os2Ini, "WPURLDEFAULTSETTINGS", "DefaultBrowserExe",
NULL, path, sizeof(path))) {
PrfCloseProfile(os2Ini);
ShowErrorMessage(str);
return 0;
}
PrfQueryProfileString(os2Ini, "WPURLDEFAULTSETTINGS", "DefaultBrowserParameters",
NULL, params, sizeof(params));
PrfCloseProfile(os2Ini);
// concat arguments
if (strlen(params) > 0) strncat(params, " ", 20);
strncat(params, str, sizeof(str));
// Build parameter buffer
strcpy(parambuffer, "Browser");
paramptr = &parambuffer[strlen(parambuffer)+1];
// copy params to buffer
strcpy(paramptr, params);
printf("params %p %p %s\n", parambuffer, paramptr, paramptr);
paramptr += strlen(params) + 1;
// To be sure: Terminate parameter list with NULL
*paramptr = '\0';
// Last step: Execute detached browser
rc = DosExecPgm(userPath, sizeof(userPath), EXEC_ASYNC,
parambuffer, NULL, &result, path);
if (rc != NO_ERROR) {
ShowErrorMessage(str);
return 0;
}
return 0;
}
#else
cc_result Process_StartOpen(const cc_string* args) {
char str[NATIVE_STR_LEN];
@ -1054,7 +1131,7 @@ const cc_string DynamicLib_Ext = String_FromConst(".dylib");
void* DynamicLib_Load2(const cc_string* path) {
char str[NATIVE_STR_LEN];
String_EncodeUtf8(str, path);
return NSAddImage(str, NSADDIMAGE_OPTION_WITH_SEARCHING |
return NSAddImage(str, NSADDIMAGE_OPTION_WITH_SEARCHING |
NSADDIMAGE_OPTION_RETURN_ON_ERROR);
}
@ -1181,7 +1258,7 @@ void Platform_Init(void) {
Platform_SingleProcess = true;
#endif
Platform_InitPosix();
Platform_InitPosix();
}
#endif
@ -1217,7 +1294,7 @@ static void DecipherBlock(cc_uint32* v, const cc_uint32* key) {
}
#define ENC1 0xCC005EC0
#define ENC2 0x0DA4A0DE
#define ENC2 0x0DA4A0DE
#define ENC3 0xC0DED000
#define MACHINEID_LEN 32
#define ENC_SIZE 8 /* 2 32 bit ints per block */
@ -1268,7 +1345,7 @@ static cc_result GetMachineID(cc_uint32* key) {
#ifdef kIOPlatformUUIDKey
registry = IORegistryEntryFromPath(kIOMasterPortDefault, "IOService:/");
if (!registry) return ERR_NOT_SUPPORTED;
devID = IORegistryEntryCreateCFProperty(registry, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0);
if (devID && CFStringGetCString(devID, tmp, sizeof(tmp), kCFStringEncodingUTF8)) {
DecodeMachineID(tmp, String_Length(tmp), key);
@ -1276,13 +1353,13 @@ static cc_result GetMachineID(cc_uint32* key) {
#else
registry = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("IOPlatformExpertDevice"));
devID = IORegistryEntryCreateCFProperty(registry, CFSTR(kIOPlatformSerialNumberKey), kCFAllocatorDefault, 0);
if (devID && CFStringGetCString(devID, tmp, sizeof(tmp), kCFStringEncodingUTF8)) {
Mem_Copy(key, tmp, MACHINEID_LEN / 2);
}
#endif
if (devID) CFRelease(devID);
IOObjectRelease(registry);
return tmp[0] ? 0 : ERR_NOT_SUPPORTED;
@ -1345,10 +1422,10 @@ extern void GetDeviceUUID(cc_string* str);
static cc_result GetMachineID(cc_uint32* key) {
cc_string str; char strBuffer[STRING_SIZE];
String_InitArray(str, strBuffer);
GetDeviceUUID(&str);
if (!str.length) return ERR_NOT_SUPPORTED;
DecodeMachineID(strBuffer, str.length, key);
return 0;
}