Descent3/ddio/ddio.h
2024-09-18 21:23:18 +03:00

416 lines
13 KiB
C++

/*
* Descent 3
* Copyright (C) 2024 Parallax Software
*
* This program 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, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
--- HISTORICAL COMMENTS FOLLOW ---
* $Logfile: /DescentIII/Main/Lib/ddio.h $
* $Revision: 30 $
* $Date: 7/12/99 6:44p $
* $Author: Jeff $
*
* Device Dependent IO system header
*
* $Log: /DescentIII/Main/Lib/ddio.h $
*
* 30 7/12/99 6:44p Jeff
* added directory lock file API functions
*
* 29 4/24/99 5:41p Samir
* moved key to ascii, ascii to key to the ddio_common library.
*
* 28 4/22/99 2:03a Jeff
* pass ddio_init_info through to keyboard handlers
*
* 27 4/01/99 11:26a Samir
* ddio_MouseGetCaps returns the button mask containing valid buttons.
*
* 26 3/23/99 9:05p Samir
* implemented mouse z axis (for Win32, mouse wheel.) and added functions
* to get binding text values.
*
* 25 2/21/99 6:38p Samir
* mouse and key input better. buffered mouse.
*
* 24 2/16/99 5:24p Kevin
* Converted timer to use 64bit int.
*
* 23 2/05/99 1:16p Samir
* reset low level keys when flushing keyboard in the high level. added a
* function to the low level to reset the status of a key, called from
* high level key flush.
*
* 22 2/04/99 11:19a Kevin
* Added function to find a CD drive letter based on its volume name
*
* 21 1/25/99 6:47p Samir
* allow slow keyboard
*
* 20 1/25/99 11:02a Samir
* revamped mouse and key controls.
*
* 19 12/08/98 12:17p Jeff
* added 3 functions (similar to ddio_FindFiles) for finding directories
* in a path
*
* 18 11/19/98 5:40p Kevin
* Demo system
*
* 17 10/21/98 12:02p Samir
* properly update odd keys when they are released throug
* ddio_KeyGetDownTime.
*
* 16 10/20/98 12:58a Jeff
* added a way to force a lo-resolution timer
*
* 15 10/16/98 11:55a Kevin
* Made dlls loadable in a hog
*
* 14 8/19/98 2:18p Jeff
* changed ddio_CleanPath
*
* 13 8/15/98 3:42p Matt
* Added new function, ddio_GetFullPath()
*
* 12 7/29/98 5:38p Jeff
* added ddio functions to get parent path, and to clean a path name into
* the real path
*
* 11 7/28/98 6:05p Jeff
* added functions to get root directories (aka drives in windows/dos)
*
* 10 7/28/98 5:05p Samir
* added drive retrieval functions for Jeff.
*
* 9 7/01/98 4:55p Samir
* new simplified mouse system.
*
* 8 6/29/98 6:46p Samir
* MouseInit no longer takes in required number of mouse buttons.
*
* 7 3/19/98 3:18p Samir
* enforce constant char* arguments when needed. done in CFILE and bitmap
* libraries as well as ddio.
*
* 6 2/25/98 6:11p Samir
* Added functions to better deal with key flushing.
*
* 5 1/02/98 12:52p Samir
* Added function to translate keycode to ascii values.
*
* 4 10/16/97 2:29p Samir
* Changed DirectInput Keyboard to FOREGROUND
*
* 3 8/15/97 6:31p Samir
* Added findfile functions.
*
* 2 7/28/97 2:54p Samir
* Temp fix for absolute mouse position return values (Uses GetCursorPos.)
* Added Show and Hide cursor too.
*
* 1 6/23/97 9:25p Samir
* added because source safe sucks
*
* 26 6/11/97 1:07p Samir
* The removal of gameos and replaced with oeApplication, oeDatabase
*
* 25 5/12/97 1:21p Samir
* Commented out timer hook function calls.
*
* 24 5/08/97 1:55p Samir
* Moved a bunch of functions to ddio_common.h
*
* 23 5/06/97 4:23p Samir
* Ha ha. Jeremy's fault....
*
* 22 5/6/97 4:24 PM Jeremy
* fixed a bug in ddio_MakePath
*
* 21 5/6/97 3:05 PM Jeremy
* added prototype for ddio_makepath
*
* 20 5/6/97 12:06 PM Jeremy
* changed comments to reflect convention for split path to be in local
* file system syntax
*
* 19 5/6/97 11:45 AM Jeremy
* changed split path to only look for path, filename, extension instead
* of including directory name as well, added prototypes for save/restore
* working dir and changed conventions for relative/absolute nature of
* directory calls
*
* 18 4/25/97 6:17p Jason
* added ddio_Deletefile function
*
* 17 4/16/97 11:32a Samir
* Added z axis support.
*
* 16 4/03/97 4:34p Jason
* added CopyFileTime to the cfile, ddio libs
*
* 15 3/20/97 11:08a Samir
* Added function to peek for keys in queue without removing them.
*
* 14 3/14/97 6:54 PM Jeremy
* added prototypes of ddio_FileDiff, ddio_GetFileLength, ddio_SplitPath
*
* 13 3/13/97 11:09a Samir
* Moved file stuff from gameos to ddio library
*
* 12 1/30/97 6:08p Samir
* Reflect new osObject type instead of gameos_object
*
* 11 1/23/97 2:23p Samir
* Added some more keyboard constants
*
* 10 1/20/97 3:48p Samir
* RCS check in
*
* $NoKeywords: $
*/
// ----------------------------------------------------------------------------
// Device Dependent IO System Main Library Interface - functions here are located
// in the ddio_??? system where ??? is the os.
// ----------------------------------------------------------------------------
#ifndef DDIO_H
#define DDIO_H
#include <cstdio>
#include <cstdint>
#include <filesystem>
#include <functional>
#include <regex>
#include "chrono_timer.h"
#include "ddio_common.h"
#include "pstypes.h"
// ----------------------------------------------------------------------------
// Initialization and destruction functions
// ----------------------------------------------------------------------------
// preemptive = 1 for thread based IO. Initializes the IO system
bool ddio_InternalInit(ddio_init_info *init_info);
void ddio_InternalClose();
// ----------------------------------------------------------------------------
// Keyboard Interface
// ----------------------------------------------------------------------------
// used by ddio system to initialize machine specific key code.
bool ddio_InternalKeyInit(ddio_init_info *init_info);
void ddio_InternalKeyClose();
// handled internally if keyboard system needs additional processing per frame
void ddio_InternalKeyFrame();
void ddio_InternalKeySuspend();
void ddio_InternalKeyResume();
// returns if key is up or down
bool ddio_InternalKeyState(uint8_t key);
// returns internal key down time
float ddio_InternalKeyDownTime(uint8_t key);
// flush a key internally
void ddio_InternalResetKey(uint8_t key);
// ----------------------------------------------------------------------------
// Device Dependent Timer Interface
// ----------------------------------------------------------------------------
#define timer_Init D3::ChronoTimer::Initialize
#define timer_GetTime D3::ChronoTimer::GetTime
#define timer_GetMSTime D3::ChronoTimer::GetTimeMS
// ----------------------------------------------------------------------------
// Device Dependent Mouse Interface
// ----------------------------------------------------------------------------
#define MOUSE_LB 1 // mouse button masks
#define MOUSE_RB 2
#define MOUSE_CB 4
#define MOUSE_B4 8
#define MOUSE_B5 16
#define MOUSE_B6 32
#define MOUSE_B7 64
#define MOUSE_B8 128
#define N_MSEBTNS 8
// initializes mouse.
bool ddio_MouseInit();
void ddio_MouseClose();
/// Get mouse grab state
bool ddio_MouseGetGrab();
/// Set mouse grab state
void ddio_MouseSetGrab(bool grab);
// get device caps
int ddio_MouseGetCaps(int *btn, int *axis);
// use these extensions to set exclusive or standard mouse modes
#define MOUSE_STANDARD_MODE 1 // uses absolute coordinates and simple buttons
#define MOUSE_EXCLUSIVE_MODE 2 // uses relative coordinates and advanced button information
void ddio_MouseMode(int mode);
// resets position of mouse to center, resets virtual coord system to equal screen coordinate system
void ddio_MouseReset();
// resets mouse queue and button info only.
void ddio_MouseQueueFlush();
// handled internally if mouse system needs additional processing per frame
void ddio_InternalMouseFrame();
// used to prevent mouse input from being registered
void ddio_InternalMouseSuspend();
void ddio_InternalMouseResume();
// returns absolute position of mouse, button state and mouse deltas.
/* x, y = absolute mouse position
dx, dy = mouse deltas since last call
return value is mouse button mask. values not needed should pass NULL pointers.
*/
int ddio_MouseGetState(int *x, int *y, int *dx, int *dy, int *z = NULL, int *dz = NULL);
// gets a mouse button event, returns false if none.
bool ddio_MouseGetEvent(int *btn, bool *state);
// returns string to binding.
const char *ddio_MouseGetBtnText(int btn);
const char *ddio_MouseGetAxisText(int axis);
// return mouse button down time.
float ddio_MouseBtnDownTime(int btn);
// return mouse button down time
int ddio_MouseBtnDownCount(int btn);
// return mouse button up count
int ddio_MouseBtnUpCount(int btn);
// set bounds for system polling of coordinates
void ddio_MouseSetLimits(int left, int top, int right, int bottom, int zmin = 0, int zmax = 0);
void ddio_MouseGetLimits(int *left, int *top, int *right, int *bottom, int *zmin = 0, int *zmax = 0);
// virtual coordinate system for mouse (match to video resolution set for optimal mouse usage.
void ddio_MouseSetVCoords(int width, int height);
// ---------------------------------------------------------------------------
// File Operations
// ---------------------------------------------------------------------------
// Gets the full path of the executable file
bool ddio_GetBinaryPath(char *exec_path, size_t len);
// deletes a file. Returns 1 if successful, 0 on failure
// This pathname is *RELATIVE* not fully qualified
int ddio_DeleteFile(const char *name);
// retrieve the current working folder where file operation will occur.
// Note ---> The path in Get/Set working directory is in the *LOCAL* file system's syntax
// This pathname is relative *OR* fully qualified
void ddio_GetWorkingDir(char *path, int len);
bool ddio_SetWorkingDir(const char *path);
// get a file length of a FILE
int ddio_GetFileLength(FILE *filePtr);
// check if two files are different
// This pathname is *RELATIVE* not fully qualified
bool ddio_FileDiff(const std::filesystem::path &path1, const std::filesystem::path &path2);
// copies one files timestamp to another
void ddio_CopyFileTime(const std::filesystem::path &dest, const std::filesystem::path &src);
// Split a pathname into its component parts
// The path in splitpath is in the *LOCAL* file system's syntax
void ddio_SplitPath(const char *srcPath, char *path, char *filename, char *ext);
// retrieve root names, free up roots array (allocated with malloc) after use
int ddio_GetFileSysRoots(char **roots, int max_roots);
/**
* Retrieve root names (i.e. drive letters in Windows).
* On Unix systems always returns list with only one ("/") element.
* @return list of discovered names
*/
std::vector<std::filesystem::path> ddio_GetSysRoots();
// Constructs a path in the local file system's syntax
// builtPath: stores the constructed path
// absolutePathHeader: absolute path on which the sub directories will be appended
// (specified in local file system syntax)
// subdir: the first subdirectory
// takes a variable number of additional subdirectories which will be concatenated on to the path
// the last argument in the list of sub dirs *MUST* be NULL to terminate the list
void ddio_MakePath(char *newPath, const char *absolutePathHeader, const char *subDir, ...);
/**
* Execute function for each file that matches to regex
* @param search_path base directory
* @param regex regular expression for matching
* @param func function callback
* @return number of processed files
*/
void ddio_DoForeachFile(const std::filesystem::path &search_path, const std::regex &regex,
const std::function<void(std::filesystem::path)> &func);
/**
* Generates a temporary filename based on the prefix in basedir. Function ensures that generated
* filename does not exists in basedir directory.
* @param basedir directory to put the files
* @param prefix prefix for the temp filename
* @return generated filename with ".tmp" extension in basedir directory or empty path on failure
*/
std::filesystem::path ddio_GetTmpFileName(const std::filesystem::path &basedir, const char *prefix);
/**
* Check process existence by PID
* @param pid PID of requested process
* @return true if process exists, false otherwise
*/
bool ddio_CheckProcess(int pid);
/**
* Get PID of current process
* @return
*/
int ddio_GetPID();
/**
* Creates a lock file in the specified directory. Before creation function
* checks if lockfile already created by another process.
* @param dir Directory for which the lock file should be created in
* @return true if lock file successfully created, false otherwise (unable to
* create, lock file already created by another process etc).
*/
bool ddio_CreateLockFile(const std::filesystem::path &dir);
/**
* Deletes a lock file (for the current process) in the specified directory
* @param dir Directory for which the lock file should be deleted from
* @return true if lock file successfully deleted, false otherwise
*/
bool ddio_DeleteLockFile(const std::filesystem::path &dir);
#endif