00001 /*! \file Surcouche.h 00002 \brief Surcouche pour reseau, multitache, console et temp. 00003 00004 Redéfinie tout un tas de fonctions système pour les rendre portables unix et windows. 00005 00006 \author aerith (contact@aerith.biz - www.aerith.biz) 00007 \version 1.0 00008 \date 30/05/2006 00009 */ 00010 00011 #ifndef INCLUDE_RSRC_PORTAGE 00012 #define INCLUDE_RSRC_PORTAGE 00013 00014 00015 #include <stdio.h> 00016 #include <stdlib.h> 00017 00018 //! Exécution de méthode 00019 /*! Exécute la méthode \a methode de la class \a class. */ 00020 #define CALL(class, methode) ((class).*(methode)) 00021 00022 #ifdef WIN32 00023 #include <windows.h> 00024 #include <winbase.h> 00025 #include <conio.h> 00026 #include <winsock.h> 00027 #include <time.h> 00028 00029 typedef HANDLE THREAD; 00030 typedef HANDLE MUTEX; 00031 typedef LPTHREAD_START_ROUTINE ROUTINE; 00032 typedef LPVOID PARAMETRE; 00033 00034 typedef HANDLE CONSOLE; 00035 typedef CHAR_INFO CHARINFO; 00036 00037 typedef HINSTANCE MODULE; 00038 00039 typedef HANDLE DIRECTORY; 00040 #else 00041 #include <unistd.h> 00042 #include <sys/socket.h> 00043 #include <netinet/in.h> 00044 #include <netdb.h> 00045 #include <sys/types.h> 00046 #include <arpa/inet.h> 00047 #include <sys/time.h> 00048 #include <pthread.h> 00049 #include <dlfcn.h> 00050 #include <signal.h> 00051 #include <dirent.h> 00052 #include <sys/stat.h> 00053 00054 //! Socket 00055 /*! Redéfinie le type utilisé sous unix pour l'utiliser comme celui de windows. */ 00056 typedef int SOCKET; 00057 00058 //! Information sur socket 00059 /*! Redéfinie le type utilisé sous unix pour l'utiliser comme celui de windows. */ 00060 typedef struct sockaddr_in SOCKADDR_IN; 00061 00062 //! Une tache 00063 /*! Crée une tache pour le multitache. */ 00064 typedef pthread_t THREAD; 00065 00066 //! Une syncronisation 00067 /*! Crée un verou permétant de syncroniser des operations dans une application multitache. */ 00068 typedef pthread_mutex_t MUTEX; 00069 00070 //! Nom de routine 00071 /*! Pointe sur une fonction. */ 00072 typedef void *(*ROUTINE)(void *); 00073 00074 //! Pointeur sur une variable quelquonque 00075 /*! Pointe sur une variable de n'importe quel type. */ 00076 typedef void * PARAMETRE; 00077 00078 //! Buffer de console 00079 /*! Crée un buffer d'affichage pour la console permétant des manipulations. 00080 \bug rechercher l'équivalent unix 00081 */ 00082 typedef void * CONSOLE; 00083 00084 //! Info sur carractere 00085 /*! Inforamation sur un carractere de console (couleur, attribut et char). 00086 \bug rechercher l'équivalent unix 00087 */ 00088 typedef void * CHARINFO; 00089 00090 00091 //! Un module dynamique 00092 /*! Crée un module dynamique (dll ou so). */ 00093 typedef void * MODULE; 00094 00095 typedef DIR * DIRECTORY; 00096 00097 00098 #endif 00099 00100 00101 //****************************** Multitache ************************************ 00102 //! Demare un thread 00103 /*! Demare une tache \a Process avec un parametre \a Param. 00104 \param pThread adresse memoire du thread 00105 \param Process nom de la routine à threader 00106 \param Param parametre a passer à la routine 00107 \return 1 si OK sinon 0 00108 \sa ThreadStop(), ThreadExit() et ThreadWait() 00109 */ 00110 int ThreadStart(THREAD *pThread, ROUTINE Process, PARAMETRE Param); 00111 00112 //! Stop un thread 00113 /*! Force la fermeture d'une tache. 00114 \param pThread adresse memoire du thread 00115 \sa ThreadStart(), ThreadExit() et ThreadWait() 00116 */ 00117 void ThreadStop(THREAD *pThread); 00118 00119 //! Sortie d'un thread 00120 /*! Sortie propre d'une tache et renvoie \a iExitCode au systeme. 00121 \param iExitCode code retourner au systeme 00122 \sa ThreadStart(), ThreadStop() et ThreadWait() 00123 */ 00124 void ThreadExit(int iExitCode); 00125 00126 //! Attent un thread 00127 /*! Pause la tache en cour en attente de la fin de la tache donnée. 00128 \param pThread adresse memoire du thread 00129 \sa ThreadStart(), ThreadStop() et ThreadExit() 00130 */ 00131 void ThreadWait(THREAD *pThread); 00132 00133 //! Initialise un mutex 00134 /*! Initialise un verou de syncronisation de tache 00135 \param pMutex adresse memoire du mutex 00136 \sa MutexLock(), MutexUnLock() et MutexStop() 00137 */ 00138 void MutexInit(MUTEX *pMutex); 00139 00140 //! Attent un mutex 00141 /*! Pause la tache en cour en attente du déverouillage du mutex et va le verouillé. 00142 \param pMutex adresse memoire du mutex 00143 \sa MutexInit(), MutexUnLock() et MutexStop() 00144 */ 00145 void MutexLock(MUTEX *pMutex); 00146 00147 //! Libere un mutex 00148 /*! Déverouille le mutex préalablement réservé. 00149 \param pMutex adresse memoire du mutex 00150 \sa MutexInit(), MutexLock() et ThreadExit() 00151 */ 00152 void MutexUnLock(MUTEX *pMutex); 00153 00154 //! Stop un mutex 00155 /*! Déverouille et détrui un mutex. 00156 \param pMutex adresse memoire du mutex 00157 \sa MutexInit(), MutexLock() et MutexUnLock() 00158 */ 00159 void MutexStop(MUTEX *pMutex); 00160 00161 00162 //******************************* Module *************************************** 00163 //! Charge un module 00164 /*! Charge un module dynamique. 00165 \param pModule adresse mémoire du module chargé. 00166 \param pName fichier du module à charger. 00167 \return 1 si OK sinon 0 00168 \sa ModuleUnLoad() et ModuleImport() 00169 */ 00170 int ModuleLoad(MODULE *pModule, char *pName); 00171 00172 //! Decharge un module 00173 /*! Decharge un module dynamique. 00174 \param pModule pointeur sur le module à decharger. 00175 \return 00176 \sa ModuleLoad() et ModuleImport() 00177 */ 00178 int ModuleUnload(MODULE *pModule); 00179 00180 //! Importe une fonction 00181 /*! Importe une fonction depuis un module dynamique. 00182 \param Module pointeur sur module. 00183 \param pFonction adresse mémoir de la fonction importé. 00184 \param pName nom de la fonction à importer. 00185 \return 1 si OK sinon 0 00186 \sa ModuleLoad() et ModuleUnLoad() 00187 */ 00188 int ModuleImport(MODULE Module, ROUTINE *pFonction, char *pName); 00189 00190 00191 //******************************* Reseau *************************************** 00192 //! Configure le reseau 00193 /*! Configure l'os pour l'utilisation de socket. 00194 \return 1 si OK sinon 0 00195 \sa SocketUnLoad() et SocketClose() 00196 */ 00197 int SocketLoad(void); 00198 00199 //! Libere le reseau 00200 /*! Relache la gestion du reseau. 00201 \sa SocketLoad() et SocketClose() 00202 */ 00203 void SocketUnLoad(void); 00204 00205 //! Ferme un socket 00206 /*! Relache un socket proprement. 00207 \param Sock le socket à fermé 00208 \sa SocketLoad() et SocketUnLoad() 00209 */ 00210 void SocketClose(SOCKET Sock); 00211 00212 00213 //********************************** Temp ************************************** 00214 //! Attend un certain delai 00215 /*! Fait rentrée la tache en cour d'éxécution en attente pendant \a Delai ms. 00216 \param Delai nombre de milliseconde a attendre 00217 */ 00218 void TempWait(unsigned int Delai); 00219 00220 //! Marque une pause 00221 /*! Pause la tache en attente de la frappe d'une touche. 00222 \bug rechercher l'équivalent unix 00223 */ 00224 void TempPause(); 00225 00226 00227 //******************************** Console ************************************* 00228 //! Efface la console 00229 /*! Vide le buffer \a stdout et efface la console. 00230 */ 00231 void ConsoleClear(); 00232 00233 #define COLOR_F_NOIR 0x0000 /*!< police noir */ 00234 #define COLOR_F_BLEU 0x0001 /*!< police bleu foncé */ 00235 #define COLOR_F_VERT 0x0002 /*!< police vert foncé */ 00236 #define COLOR_F_BGRIS 0x0003 /*!< police bleu-gris */ 00237 #define COLOR_F_MARRON 0x0004 /*!< police marron */ 00238 #define COLOR_F_POUPRE 0x0005 /*!< police pourpre */ 00239 #define COLOR_F_KAKI 0x0006 /*!< police kaki */ 00240 #define COLOR_F_GCLAIR 0x0007 /*!< police gris clair */ 00241 #define COLOR_F_GRIS 0x0008 /*!< police gris */ 00242 #define COLOR_F_BCLAIR 0x0009 /*!< police bleu clair */ 00243 #define COLOR_F_VCLAIR 0x000A /*!< police vert clair */ 00244 #define COLOR_F_CYAN 0x000B /*!< police cyan */ 00245 #define COLOR_F_ROUGE 0x000C /*!< police rouge */ 00246 #define COLOR_F_ROSE 0x000D /*!< police rose */ 00247 #define COLOR_F_JAUNE 0x000E /*!< police jaune */ 00248 #define COLOR_F_BLANC 0x000F /*!< police blanc */ 00249 #define COLOR_B_NOIR 0x0000 /*!< fond noir */ 00250 #define COLOR_B_BLEU 0x0010 /*!< fond bleu foncé */ 00251 #define COLOR_B_VERT 0x0020 /*!< fond vert foncé */ 00252 #define COLOR_B_BGRIS 0x0030 /*!< fond bleu-gris */ 00253 #define COLOR_B_MARRON 0x0040 /*!< fond marron */ 00254 #define COLOR_B_POUPRE 0x0050 /*!< fond pourpre */ 00255 #define COLOR_B_KAKI 0x0060 /*!< fond kaki */ 00256 #define COLOR_B_GCLAIR 0x0070 /*!< fond gris clair */ 00257 #define COLOR_B_GRIS 0x0080 /*!< fond gris */ 00258 #define COLOR_B_BCLAIR 0x0090 /*!< fond bleu clair */ 00259 #define COLOR_B_VCLAIR 0x00A0 /*!< fond vert clair */ 00260 #define COLOR_B_CYAN 0x00B0 /*!< fond cyan */ 00261 #define COLOR_B_ROUGE 0x00C0 /*!< fond rouge */ 00262 #define COLOR_B_ROSE 0x00D0 /*!< fond rose */ 00263 #define COLOR_B_JAUNE 0x00E0 /*!< fond jaune */ 00264 #define COLOR_B_BLANC 0x00F0 /*!< fond blanc */ 00265 00266 //! Change la couleur de la console 00267 /*! Définie la couleur de police et de fond de la console. 00268 \bug rechercher l'équivalent unix 00269 \param iColor couleur de la zone (ex : COLOR_B_BLANC|COLOR_F_BLEU) 00270 \sa COLOR_F_NOIR, COLOR_F_BLEU, COLOR_F_VERT, COLOR_F_BGRIS, COLOR_F_MARRON, COLOR_F_POUPRE, 00271 COLOR_F_KAKI, COLOR_F_GCLAIR, COLOR_F_GRIS, COLOR_F_BCLAIR, COLOR_F_VCLAIR, COLOR_F_CYAN, 00272 COLOR_F_ROUGE, COLOR_F_ROSE, COLOR_F_JAUNE, COLOR_F_BLANC, COLOR_B_NOIR, COLOR_B_BLEU, 00273 COLOR_B_VERT, COLOR_B_BGRIS, COLOR_B_MARRON, COLOR_B_POUPRE, COLOR_B_KAKI, COLOR_B_GCLAIR, 00274 COLOR_B_GRIS, COLOR_B_BCLAIR, COLOR_B_VCLAIR, COLOR_B_CYAN, COLOR_B_ROUGE, COLOR_B_ROSE, 00275 COLOR_B_JAUNE, COLOR_B_BLANC. 00276 */ 00277 void ConsoleSetColor(unsigned int iColor); 00278 00279 //! Change la couleur de carracteres 00280 /*! Définie la couleur de police et de fond d'un certain nombre de carracteres. 00281 \bug rechercher l'équivalent unix 00282 \param pConsole pointeur sur le buffer de console 00283 \param iPosX colone du premier carractere 00284 \param iPosY ligne du premier carractere 00285 \param iColor couleur de la zone (ex : COLOR_B_BLANC|COLOR_F_BLEU) 00286 \param iLength nombre de carracteres à coloré 00287 \return 1 si OK sinon 0 00288 \sa COLOR_F_NOIR, COLOR_F_BLEU, COLOR_F_VERT, COLOR_F_BGRIS, COLOR_F_MARRON, COLOR_F_POUPRE, 00289 COLOR_F_KAKI, COLOR_F_GCLAIR, COLOR_F_GRIS, COLOR_F_BCLAIR, COLOR_F_VCLAIR, COLOR_F_CYAN, 00290 COLOR_F_ROUGE, COLOR_F_ROSE, COLOR_F_JAUNE, COLOR_F_BLANC, COLOR_B_NOIR, COLOR_B_BLEU, 00291 COLOR_B_VERT, COLOR_B_BGRIS, COLOR_B_MARRON, COLOR_B_POUPRE, COLOR_B_KAKI, COLOR_B_GCLAIR, 00292 COLOR_B_GRIS, COLOR_B_BCLAIR, COLOR_B_VCLAIR, COLOR_B_CYAN, COLOR_B_ROUGE, COLOR_B_ROSE, 00293 COLOR_B_JAUNE, COLOR_B_BLANC. 00294 */ 00295 int ConsoleCharColor(CONSOLE *pConsole, unsigned int iPosX, unsigned int iPosY, unsigned int iColor, unsigned int iLength); 00296 00297 //! Ecrit dans le buffer des carracteres 00298 /*! Ecrit des carracteres a une position donnée dans la console 00299 \bug rechercher l'équivalent unix 00300 \param pConsole pointeur sur le buffer de console 00301 \param iPosX colone du premier carractere 00302 \param iPosY ligne du premier carractere 00303 \param pData carracteres à ecrire 00304 \param iLength nombre de carracteres à ecrire, si NULL la taille de \a pData sera prise 00305 \return 1 si OK sinon 0 00306 \sa ConsoleCharColor(), ConsoleCharRead(). 00307 */ 00308 int ConsoleCharWrite(CONSOLE *pConsole, unsigned int iPosX, unsigned int iPosY, char *pData, unsigned int iLength); 00309 00310 //! Lit dans le buffer des carracteres 00311 /*! Lit des carracteres a une position donnée dans la console. 00312 \bug rechercher l'équivalent unix 00313 \param pConsole pointeur sur le buffer de console 00314 \param iPosX colone du premier carractere 00315 \param iPosY ligne du premier carractere 00316 \param pData carracteres à ecrire 00317 \param iLength nombre de carracteres à lire, si NULL la taille de \a pData sera prise 00318 \return 1 si OK sinon 0 00319 \sa ConsoleCharColor(), ConsoleCharWrite(). 00320 */ 00321 int ConsoleCharRead(CONSOLE *pConsole, unsigned int iPosX, unsigned int iPosY, char *pData, unsigned int iLength); 00322 00323 //! Ecrit dans le buffer une zone 00324 /*! Ecrit dans une zone à une position donnée dans la console 00325 \bug rechercher l'équivalent unix 00326 \param pConsole pointeur sur le buffer de console 00327 \param iPosX colone du premier carractere 00328 \param iPosY ligne du premier carractere 00329 \param iLength largeur de la zone 00330 \param iHeight hauteur de la zone 00331 \param pData information sur les carracteres à ecrire 00332 \return 1 si OK sinon 0 00333 \sa ConsoleCharColor(), ConsoleCharRead() et ConsoleZoneRead(). 00334 */ 00335 int ConsoleZoneWrite(CONSOLE *pConsole, unsigned int iPosX, unsigned int iPosY, unsigned int iLength, unsigned int iHeight, CHARINFO *pData); 00336 00337 //! Lit dans le buffer une zone 00338 /*! Lit dans une zone à une position donnée dans la console 00339 \bug rechercher l'équivalent unix 00340 \param pConsole pointeur sur le buffer de console 00341 \param iPosX colone du premier carractere 00342 \param iPosY ligne du premier carractere 00343 \param iLength largeur de la zone 00344 \param iHeight hauteur de la zone 00345 \param pData information sur les carracteres à lire 00346 \return 1 si OK sinon 0 00347 \sa ConsoleCharColor(), ConsoleCharRead() et ConsoleZoneWrite(). 00348 */ 00349 int ConsoleZoneRead(CONSOLE *pConsole, unsigned int iPosX, unsigned int iPosY, unsigned int iLength, unsigned int iHeight, CHARINFO *pData); 00350 00351 00352 //******************************** Touche ************************************** 00353 //! Retourne une touche 00354 /*! Retourne la plus vielle touche du buffer \a stdin. 00355 \return code ascii de la touche 00356 \sa KeyGet2(), KeyWait() et KeyPressed() 00357 */ 00358 int KeyGet(); 00359 00360 //! Retourne une touche sans valider 00361 /*! Retourne la plus vielle touche du buffer \a stdin sans devoir presser 'entrée'. 00362 \bug rechercher l'équivalent unix 00363 \return code ascii de la touche 00364 \sa KeyGet(), KeyWait() et KeyPressed() 00365 */ 00366 int KeyGet2(); 00367 00368 //! Attend la frappe d'une touche et la retourne 00369 /*! Pause la tache en attente de la frappe d'une touche et retourne son code. 00370 \bug rechercher l'équivalent unix 00371 \return 0 code ascii de la touche 00372 \sa KeyGet(), KeyGet2() et KeyPressed() 00373 */ 00374 int KeyWait(); 00375 00376 //! Permet de savoir si une touche a été presser 00377 /*! Permet de savoir si une touche a été presser. 00378 \bug rechercher l'équivalent unix 00379 \return 0 si non presser sinon > 1 00380 \sa KeyGet(), KeyGet2() et KeyWait() 00381 */ 00382 int KeyPressed(); 00383 00384 00385 //******************************** Fichier ************************************* 00386 //! Supprime un fichier 00387 /*! Supprime un fichier via l'os. 00388 \bug rechercher l'équivalent unix 00389 \param pName nom du fichier (relatif ou absolu) 00390 \return 0 si reussi, sinon 1. 00391 \sa FileRename() 00392 */ 00393 int FileDelete(char *pName); 00394 00395 //! Renome un fichier ou repertoire 00396 /*! Renome un fichier ou repertoire via l'os, permet aussi de le déplacé. 00397 \param pName nom du fichier ou repertoire (relatif ou absolu) 00398 \param pNewName nouveau nom du fichier ou repertoire 00399 \return 0 si reussi, sinon 1. 00400 \sa FileDelete() 00401 */ 00402 int FileRename(char *pName, char *pNewName); 00403 00404 //******************************* Reperoire ************************************ 00405 //! Ouvre un dossier 00406 /*! Ouvre un dossier pour l'explorer et recupère la première donnée. 00407 \param pDirName nom du dossier 00408 \param pFirstData nom de la première donnée du repertoire 00409 \param pIsFile seras mi à 1 si \a pFirstData est un fichier, sinon 0 00410 \return 0 si reussi, sinon 1. 00411 \sa DirClose(), DirGetNext(), DirCreate() et DirDelete() 00412 */ 00413 DIRECTORY DirOpen(char *pDirName, char *pFirstData, int *pIsFile); 00414 00415 //! Ferme un dossier 00416 /*! Ferme un dossier explorer. 00417 \param pDir pointeur sur dossier 00418 \return 0 si reussi, sinon 1. 00419 \sa DirOpen(), DirGetNext(), DirCreate() et DirDelete() 00420 */ 00421 int DirClose(DIRECTORY *pDir); 00422 00423 //! Récupère une donnée d'un dossier 00424 /*! Récupère la donnée suivante d'un dossier. 00425 \param pDir pointeur sur dossier 00426 \param pNextData nom de la donnée suivante du repertoire 00427 \param pIsFile seras mi à 1 si \a pNextData est un fichier, sinon 0 00428 \return 0 si reussi, sinon 1. 00429 \sa DirOpen(), DirClose(), DirCreate() et DirDelete() 00430 */ 00431 int DirGetNext(DIRECTORY *pDir, char *pNextData, int *pIsFile); 00432 00433 //! Crée un repertoire 00434 /*! Crée un repertoire via l'os. 00435 \param pName nom du repertoire (relatif ou absolu) 00436 \return 0 si reussi, sinon 1. 00437 \sa DirOpen(), DirClose(), DirGetNext() et DirDelete() 00438 */ 00439 int DirCreate(char *pName); 00440 00441 //! Supprime un repertoire 00442 /*! Supprime un repertoire vide via l'os. 00443 \param pName nom du repertoire (relatif ou absolu) 00444 \return 0 si reussi, sinon 1. 00445 \sa DirOpen(), DirClose(), DirGetNext() et DirCreate() 00446 */ 00447 int DirDelete(char *pName); 00448 00449 #endif 00450