2 // Copyright (C) 2011 Suguru Kawamoto
\r
11 #define DO_NOT_REPLACE
\r
12 #include "iowrapper.h"
\r
15 #define MAX_SFTPSTATUS 16
\r
17 SFTPSTATUS g_SFTPData[MAX_SFTPSTATUS];
\r
22 BOOL __stdcall DefaultIOBufferCallback(BOOL* pbAborted)
\r
28 DWORD WINAPI SFTP_ThreadProc(LPVOID lpParameter)
\r
30 char* p[1] = {"PSFTP"};
\r
33 if(pSFTP = FindSFTPStatus(GetCurrentThreadId()))
\r
34 pSFTP->bExit = TRUE;
\r
38 SFTPSTATUS* FindSFTPStatus(DWORD ThreadId)
\r
41 for(i = 0; i < MAX_SFTPSTATUS; i++)
\r
43 if(g_SFTPData[i].ThreadId == ThreadId)
\r
44 return &g_SFTPData[i];
\r
49 CRITICAL_SECTION g_DummyLock;
\r
51 BOOL SFTP_InitializeIOBuffer(SFTPIOBUFFER* pIO, size_t Length)
\r
53 memset(pIO, 0, sizeof(SFTPIOBUFFER));
\r
54 // InitializeCriticalSection(&pIO->Lock);
\r
55 if(memcmp(&pIO->Lock, &g_DummyLock, sizeof(CRITICAL_SECTION)) == 0)
\r
57 InitializeCriticalSection(&pIO->Lock);
\r
58 EnterCriticalSection(&pIO->Lock);
\r
60 if(!(pIO->pBuffer = (BYTE*)malloc(Length + 1)))
\r
62 memset(pIO->pBuffer + Length, 0, 1);
\r
63 pIO->Length = Length;
\r
66 pIO->bAborted = FALSE;
\r
67 pIO->pCallback = DefaultIOBufferCallback;
\r
68 LeaveCriticalSection(&pIO->Lock);
\r
72 void SFTP_UninitializeIOBuffer(SFTPIOBUFFER* pIO)
\r
74 // DeleteCriticalSection(&pIO->Lock);
\r
75 EnterCriticalSection(&pIO->Lock);
\r
77 // memset(pIO, 0, sizeof(SFTPIOBUFFER));
\r
80 void SFTP_AbortIOBuffer(SFTPIOBUFFER* pIO, BOOL bAborted)
\r
82 EnterCriticalSection(&pIO->Lock);
\r
83 pIO->bAborted = bAborted;
\r
84 LeaveCriticalSection(&pIO->Lock);
\r
87 size_t SFTP_PeekIOBuffer(SFTPIOBUFFER* pIO, void* pBuffer, size_t Size)
\r
94 EnterCriticalSection(&pIO->Lock);
\r
98 while(!pIO->bAborted && pIO->Written - Read > 0 && Copied < Size)
\r
100 Pos = Read % pIO->Length;
\r
101 Count = min(Size - Copied, min(pIO->Written - Read, pIO->Length - Pos));
\r
102 memcpy((BYTE*)pBuffer + Copied, pIO->pBuffer + Pos, Count);
\r
108 Copied = pIO->Written - pIO->Read;
\r
109 LeaveCriticalSection(&pIO->Lock);
\r
113 size_t SFTP_ReadIOBuffer(SFTPIOBUFFER* pIO, void* pBuffer, size_t Size)
\r
119 EnterCriticalSection(&pIO->Lock);
\r
120 while(!pIO->bAborted && pIO->Written - pIO->Read > 0 && Copied < Size)
\r
122 Pos = pIO->Read % pIO->Length;
\r
123 Count = min(Size - Copied, min(pIO->Written - pIO->Read, pIO->Length - Pos));
\r
124 memcpy((BYTE*)pBuffer + Copied, pIO->pBuffer + Pos, Count);
\r
125 pIO->Read += Count;
\r
128 LeaveCriticalSection(&pIO->Lock);
\r
132 size_t SFTP_WriteIOBuffer(SFTPIOBUFFER* pIO, const void* pBuffer, size_t Size)
\r
138 EnterCriticalSection(&pIO->Lock);
\r
139 while(!pIO->bAborted && Copied < Size)
\r
141 if(pIO->Written - pIO->Read < pIO->Length)
\r
143 Pos = pIO->Written % pIO->Length;
\r
144 Count = min(Size - Copied, min(pIO->Length + pIO->Read - pIO->Written, pIO->Length - Pos));
\r
145 memcpy(pIO->pBuffer + Pos, (BYTE*)pBuffer + Copied, Count);
\r
146 pIO->Written += Count;
\r
151 LeaveCriticalSection(&pIO->Lock);
\r
152 if(pIO->pCallback(&pIO->bAborted))
\r
154 EnterCriticalSection(&pIO->Lock);
\r
157 LeaveCriticalSection(&pIO->Lock);
\r
161 size_t SFTP_ReadIOBufferLine(SFTPIOBUFFER* pIO, void* pBuffer, size_t Size)
\r
168 EnterCriticalSection(&pIO->Lock);
\r
169 while(!pIO->bAborted && Copied < Size)
\r
171 if(pIO->Written - pIO->Read > 0)
\r
173 Pos = pIO->Read % pIO->Length;
\r
174 Count = min(Size - Copied, min(pIO->Written - pIO->Read, pIO->Length - Pos));
\r
175 if(p = strchr((char*)(pIO->pBuffer + Pos), '\n'))
\r
178 Count = min(Count, (size_t)p - (size_t)(pIO->pBuffer + Pos));
\r
181 memcpy((BYTE*)pBuffer + Copied, pIO->pBuffer + Pos, Count);
\r
182 pIO->Read += Count;
\r
187 LeaveCriticalSection(&pIO->Lock);
\r
188 if(pIO->pCallback(&pIO->bAborted))
\r
190 EnterCriticalSection(&pIO->Lock);
\r
193 LeaveCriticalSection(&pIO->Lock);
\r
197 size_t SFTP_PeekThreadIO(void* pBuffer, size_t Size)
\r
200 if(pSFTP = FindSFTPStatus(GetCurrentThreadId()))
\r
201 return SFTP_PeekIOBuffer(&pSFTP->InBuffer, pBuffer, Size);
\r
205 size_t SFTP_ReadThreadIO(void* pBuffer, size_t Size)
\r
208 if(pSFTP = FindSFTPStatus(GetCurrentThreadId()))
\r
209 return SFTP_ReadIOBuffer(&pSFTP->InBuffer, pBuffer, Size);
\r
213 size_t SFTP_WriteThreadIO(const void* pBuffer, size_t Size)
\r
216 if(pSFTP = FindSFTPStatus(GetCurrentThreadId()))
\r
217 return SFTP_WriteIOBuffer(&pSFTP->OutBuffer, pBuffer, Size);
\r
221 size_t SFTP_ReadThreadIOLine(void* pBuffer, size_t Size)
\r
224 if(pSFTP = FindSFTPStatus(GetCurrentThreadId()))
\r
225 return SFTP_ReadIOBufferLine(&pSFTP->InBuffer, pBuffer, Size);
\r
229 size_t SFTP_PeekThreadDataIO(void* pBuffer, size_t Size)
\r
232 if(pSFTP = FindSFTPStatus(GetCurrentThreadId()))
\r
233 return SFTP_PeekIOBuffer(&pSFTP->DataInBuffer, pBuffer, Size);
\r
237 size_t SFTP_ReadThreadDataIO(void* pBuffer, size_t Size)
\r
240 if(pSFTP = FindSFTPStatus(GetCurrentThreadId()))
\r
241 return SFTP_ReadIOBuffer(&pSFTP->DataInBuffer, pBuffer, Size);
\r
245 size_t SFTP_WriteThreadDataIO(const void* pBuffer, size_t Size)
\r
248 if(pSFTP = FindSFTPStatus(GetCurrentThreadId()))
\r
249 return SFTP_WriteIOBuffer(&pSFTP->DataOutBuffer, pBuffer, Size);
\r
253 BOOL SFTP_GetThreadFilePositon(DWORD* pLow, LONG* pHigh)
\r
256 if(pSFTP = FindSFTPStatus(GetCurrentThreadId()))
\r
258 *pLow = pSFTP->FilePosition.LowPart;
\r
259 *pHigh = pSFTP->FilePosition.HighPart;
\r
267 HANDLE GetStdHandleX(DWORD nStdHandle)
\r
269 HANDLE r = INVALID_HANDLE_VALUE;
\r
271 g_hStdIn = (HANDLE)1;
\r
273 g_hStdOut = (HANDLE)2;
\r
275 g_hStdErr = (HANDLE)3;
\r
276 if(nStdHandle == STD_INPUT_HANDLE)
\r
278 if(nStdHandle == STD_OUTPUT_HANDLE)
\r
280 if(nStdHandle == STD_ERROR_HANDLE)
\r
285 BOOL GetConsoleModeX(HANDLE hConsoleHandle, LPDWORD lpMode)
\r
291 BOOL SetConsoleModeX(HANDLE hConsoleHandle, DWORD dwMode)
\r
297 BOOL ReadFileX(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
\r
300 if(hFile == g_hStdIn)
\r
302 *lpNumberOfBytesRead = (DWORD)SFTP_ReadThreadIOLine(lpBuffer, nNumberOfBytesToRead);
\r
303 if(*lpNumberOfBytesRead > 0)
\r
306 else if(hFile == g_hStdOut)
\r
309 else if(hFile == g_hStdErr)
\r
315 BOOL WriteFileX(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped)
\r
318 if(hFile == g_hStdIn)
\r
321 else if(hFile == g_hStdOut)
\r
323 *lpNumberOfBytesWritten = (DWORD)SFTP_WriteThreadIO(lpBuffer, nNumberOfBytesToWrite);
\r
324 if(*lpNumberOfBytesWritten == nNumberOfBytesToWrite)
\r
327 else if(hFile == g_hStdErr)
\r
329 *lpNumberOfBytesWritten = (DWORD)SFTP_WriteThreadIO(lpBuffer, nNumberOfBytesToWrite);
\r
330 if(*lpNumberOfBytesWritten == nNumberOfBytesToWrite)
\r
336 int printfX(const char * _Format, ...)
\r
341 va_start(v, _Format);
\r
342 vsprintf(Temp, _Format, v);
\r
343 r = (int)SFTP_WriteThreadIO(Temp, strlen(Temp));
\r
348 int putsX(const char * _Str)
\r
351 r = (int)SFTP_WriteThreadIO(_Str, strlen(_Str));
\r
355 int fprintfX(FILE * _File, const char * _Format, ...)
\r
360 va_start(v, _Format);
\r
361 if(_File == stdout)
\r
363 vsprintf(Temp, _Format, v);
\r
364 r = (int)SFTP_WriteThreadIO(Temp, strlen(Temp));
\r
366 else if(_File == stderr)
\r
368 vsprintf(Temp, _Format, v);
\r
369 r = (int)SFTP_WriteThreadIO(Temp, strlen(Temp));
\r
372 r = vfprintf(_File, _Format, v);
\r
377 char * fgetsX(char * _Buf, int _MaxCount, FILE * _File)
\r
382 memset(_Buf, 0, _MaxCount);
\r
383 SFTP_ReadThreadIOLine(_Buf, _MaxCount - 1);
\r
387 r = fgets(_Buf, _MaxCount, _File);
\r
391 int fputsX(const char * _Str, FILE * _File)
\r
394 if(_File == stdout)
\r
396 r = (int)SFTP_WriteThreadIO(_Str, strlen(_Str));
\r
398 else if(_File == stderr)
\r
400 r = (int)SFTP_WriteThreadIO(_Str, strlen(_Str));
\r
403 r = fputs(_Str, _File);
\r
407 int fflushX(FILE * _File)
\r
410 if(_File == stdout)
\r
413 else if(_File == stderr)
\r
421 void exitX(int _Code)
\r
424 if(pSFTP = FindSFTPStatus(GetCurrentThreadId()))
\r
426 pSFTP->bExit = TRUE;
\r
427 SFTP_AbortIOBuffer(&pSFTP->InBuffer, TRUE);
\r
428 SFTP_AbortIOBuffer(&pSFTP->OutBuffer, TRUE);
\r
429 SFTP_AbortIOBuffer(&pSFTP->DataInBuffer, TRUE);
\r
430 SFTP_AbortIOBuffer(&pSFTP->DataOutBuffer, TRUE);
\r
432 TerminateThread(GetCurrentThread(), (DWORD)_Code);
\r