diff options
author | rubidium <rubidium@openttd.org> | 2009-08-31 22:38:37 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2009-08-31 22:38:37 +0000 |
commit | bc8e66c202ce9af15aa12718939726eea42b25fd (patch) | |
tree | ecd7de355fd2c9defdde36a2e6f736836df9d7b4 /src/os/os2 | |
parent | 5cc6d1f894f224b3fdde6cdb5535ce4154172f09 (diff) | |
download | openttd-bc8e66c202ce9af15aa12718939726eea42b25fd.tar.xz |
(svn r17336) -Codechange: move some os specific files into src/os/
Diffstat (limited to 'src/os/os2')
-rw-r--r-- | src/os/os2/os2.cpp | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/src/os/os2/os2.cpp b/src/os/os2/os2.cpp new file mode 100644 index 000000000..06508b361 --- /dev/null +++ b/src/os/os2/os2.cpp @@ -0,0 +1,243 @@ +/* $Id$ */ + +/* + * 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 <http://www.gnu.org/licenses/>. + */ + +/** @file os2.cpp OS2 related OS support. */ + +#include "../../stdafx.h" +#include "../../openttd.h" +#include "../../variables.h" +#include "../../gui.h" +#include "../../fileio_func.h" +#include "../../fios.h" +#include "../../functions.h" +#include "../../core/random_func.hpp" +#include "../../string_func.h" +#include "../../textbuf_gui.h" + +#include "table/strings.h" + +#include <dirent.h> +#include <unistd.h> +#include <sys/stat.h> +#include <stdlib.h> +#include <time.h> +#ifndef __INNOTEK_LIBC__ + #include <dos.h> +#endif + +#define INCL_WIN +#define INCL_WINCLIPBOARD + +#include <os2.h> +#ifndef __INNOTEK_LIBC__ + #include <i86.h> +#endif + +bool FiosIsRoot(const char *file) +{ + return file[3] == '\0'; +} + +void FiosGetDrives() +{ + 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 = _fios_items.Append(); + fios->type = FIOS_TYPE_DRIVE; + fios->mtime = 0; +#ifndef __INNOTEK_LIBC__ + snprintf(fios->name, lengthof(fios->name), "%c:", 'A' + disk - 1); +#else + snprintf(fios->name, lengthof(fios->name), "%c:", disk); +#endif + strecpy(fios->title, fios->name, lastof(fios->title)); + } + } + + /* Restore the original drive */ +#ifndef __INNOTEK_LIBC__ + _dos_setdrive(save, &total); +#else + chdir(wd); +#endif +} + +bool FiosGetDiskFreeSpace(const char *path, uint64 *tot) +{ +#ifndef __INNOTEK_LIBC__ + struct diskfree_t free; + char drive = path[0] - 'A' + 1; + + if (tot != NULL && _getdiskfree(drive, &free) == 0) { + *tot = free.avail_clusters * free.sectors_per_cluster * free.bytes_per_sector; + return true; + } + + return false; +#else + uint64 free = 0; + +#ifdef HAS_STATVFS + { + struct statvfs s; + + if (statvfs(path, &s) != 0) return false; + free = (uint64)s.f_frsize * s.f_bavail; + } +#endif + if (tot != NULL) *tot = free; + return true; +#endif +} + +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); +} + +int CDECL main(int argc, char *argv[]) +{ + SetRandomSeed(time(NULL)); + + return ttd_main(argc, argv); +} + +/** + * Insert a chunk of text from the clipboard onto the textbuffer. Get TEXT clipboard + * and append this up to the maximum length (either absolute or screenlength). If maxlength + * is zero, we don't care about the screenlength but only about the physical length of the string + * @param tb Textbuf type to be changed + * @return Return true on successful change of Textbuf, or false otherwise + */ +bool InsertTextBufferClipboard(Textbuf *tb) +{ +/* 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 != NULL) + { + uint length = 0; + uint width = 0; + const char *i; + + for (i = text; IsValidAsciiChar(*i); i++) + { + uint w; + + if (tb->size + length + 1 > tb->maxsize) break; + + w = GetCharacterWidth(FS_NORMAL, (byte)*i); + if (tb->maxwidth != 0 && width + tb->width + w > tb->maxwidth) break; + + width += w; + length++; + } + + memmove(tb->buf + tb->caretpos + length, tb->buf + tb->caretpos, tb->size - tb->caretpos); + memcpy(tb->buf + tb->caretpos, text, length); + tb->width += width; + tb->caretxoffs += width; + tb->size += length; + tb->caretpos += length; + + WinCloseClipbrd(hab); + return true; + } + + WinCloseClipbrd(hab); + } +#endif + return false; +} + + +void CSleep(int milliseconds) +{ +#ifndef __INNOTEK_LIBC__ + delay(milliseconds); +#else + usleep(milliseconds * 1000); +#endif +} + +const char *FS2OTTD(const char *name) {return name;} +const char *OTTD2FS(const char *name) {return name;} |