/* * This file is part of OpenTTD. * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. * OpenTTD 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 General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ /** @file os2.cpp OS2 related OS support. */ #include "../../stdafx.h" #include "../../openttd.h" #include "../../gui.h" #include "../../fileio_func.h" #include "../../fios.h" #include "../../openttd.h" #include "../../core/random_func.hpp" #include "../../string_func.h" #include "../../textbuf_gui.h" #include "../../thread.h" #include "table/strings.h" #include #include #include #include #include #ifndef __INNOTEK_LIBC__ # include #endif #include "../../safeguards.h" #define INCL_WIN #define INCL_WINCLIPBOARD #include #ifndef __INNOTEK_LIBC__ # include #endif bool FiosIsRoot(const char *file) { return file[3] == '\0'; } void FiosGetDrives(FileList &file_list) { uint disk, disk2, save, total; #ifndef __INNOTEK_LIBC__ _dos_getdrive(&save); // save original drive #else save = _getdrive(); // save original drive char wd[MAX_PATH]; getcwd(wd, MAX_PATH); total = 'z'; #endif /* get an available drive letter */ #ifndef __INNOTEK_LIBC__ for (disk = 1;; disk++) { _dos_setdrive(disk, &total); #else for (disk = 'A';; disk++) { _chdrive(disk); #endif if (disk >= total) break; #ifndef __INNOTEK_LIBC__ _dos_getdrive(&disk2); #else disk2 = _getdrive(); #endif if (disk == disk2) { FiosItem *fios = file_list.Append(); fios->type = FIOS_TYPE_DRIVE; fios->mtime = 0; #ifndef __INNOTEK_LIBC__ fios->name += 'A' + disk - 1; #else fios->name += (char)disk; #endif fios->name += ':'; fios->title = fios->name; } } /* Restore the original drive */ #ifndef __INNOTEK_LIBC__ _dos_setdrive(save, &total); #else chdir(wd); #endif } std::optional FiosGetDiskFreeSpace(const std::string &path) { #ifndef __INNOTEK_LIBC__ struct diskfree_t free; char drive = path[0] - 'A' + 1; if (_getdiskfree(drive, &free) == 0) { return free.avail_clusters * free.sectors_per_cluster * free.bytes_per_sector; } #elif defined(HAS_STATVFS) struct statvfs s; if (statvfs(path.c_str(), &s) == 0) return static_cast(s.f_frsize) * s.f_bavail; #endif return std::nullopt; } bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb) { char filename[MAX_PATH]; snprintf(filename, lengthof(filename), "%s" PATHSEP "%s", path, ent->d_name); return stat(filename, sb) == 0; } bool FiosIsHiddenFile(const struct dirent *ent) { return ent->d_name[0] == '.'; } void ShowInfo(const char *str) { HAB hab; HMQ hmq; ULONG rc; /* init PM env. */ hmq = WinCreateMsgQueue((hab = WinInitialize(0)), 0); /* display the box */ rc = WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, (const unsigned char *)str, (const unsigned char *)"OpenTTD", 0, MB_OK | MB_MOVEABLE | MB_INFORMATION); /* terminate PM env. */ WinDestroyMsgQueue(hmq); WinTerminate(hab); } void ShowOSErrorBox(const char *buf, bool system) { HAB hab; HMQ hmq; ULONG rc; /* init PM env. */ hmq = WinCreateMsgQueue((hab = WinInitialize(0)), 0); /* display the box */ rc = WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, (const unsigned char *)buf, (const unsigned char *)"OpenTTD", 0, MB_OK | MB_MOVEABLE | MB_ERROR); /* terminate PM env. */ WinDestroyMsgQueue(hmq); WinTerminate(hab); } void DoOSAbort() { abort(); } int CDECL main(int argc, char *argv[]) { SetRandomSeed(time(nullptr)); /* Make sure our arguments contain only valid UTF-8 characters. */ for (int i = 0; i < argc; i++) StrMakeValidInPlace(argv[i]); return openttd_main(argc, argv); } bool GetClipboardContents(char *buffer, const char *last) { /* XXX -- Currently no clipboard support implemented with GCC */ #ifndef __INNOTEK_LIBC__ HAB hab = 0; if (WinOpenClipbrd(hab)) { const char *text = (const char*)WinQueryClipbrdData(hab, CF_TEXT); if (text != nullptr) { strecpy(buffer, text, last); WinCloseClipbrd(hab); return true; } WinCloseClipbrd(hab); } #endif return false; } void OSOpenBrowser(const char *url) { // stub only DEBUG(misc, 0, "Failed to open url: %s", url); } void SetCurrentThreadName(const char *) { } int GetCurrentThreadName(char *str, const char *last) { return 0; } void SetSelfAsMainThread() { } void SetSelfAsGameThread() { } void PerThreadSetup() { } void PerThreadSetupInit() { } bool IsMainThread() { return false; } bool IsNonMainThread() { return false; } bool IsGameThread() { return false; } bool IsNonGameThread() { return false; }