/* * Win32 waitable timers * * Copyright 1999 Alexandre Julliard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config.h" #include "wine/port.h" #include #include #define NONAMELESSUNION #define NONAMELESSSTRUCT #include "winerror.h" #include "winnls.h" #include "wine/unicode.h" #include "wine/server.h" #include "wine/debug.h" #include "ntdll_misc.h" WINE_DEFAULT_DEBUG_CHANNEL(timer); /*********************************************************************** * CreateWaitableTimerA (KERNEL32.@) */ HANDLE WINAPI CreateWaitableTimerA( SECURITY_ATTRIBUTES *sa, BOOL manual, LPCSTR name ) { WCHAR buffer[MAX_PATH]; if (!name) return CreateWaitableTimerW( sa, manual, NULL ); if (!MultiByteToWideChar( CP_ACP, 0, name, -1, buffer, MAX_PATH )) { SetLastError( ERROR_FILENAME_EXCED_RANGE ); return 0; } return CreateWaitableTimerW( sa, manual, buffer ); } /*********************************************************************** * CreateWaitableTimerW (KERNEL32.@) */ HANDLE WINAPI CreateWaitableTimerW( SECURITY_ATTRIBUTES *sa, BOOL manual, LPCWSTR name ) { HANDLE ret; DWORD len = name ? strlenW(name) : 0; if (len >= MAX_PATH) { SetLastError( ERROR_FILENAME_EXCED_RANGE ); return 0; } SERVER_START_REQ( create_timer ) { req->manual = manual; req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle); wine_server_add_data( req, name, len * sizeof(WCHAR) ); SetLastError(0); wine_server_call_err( req ); ret = reply->handle; } SERVER_END_REQ; return ret; } /*********************************************************************** * OpenWaitableTimerA (KERNEL32.@) */ HANDLE WINAPI OpenWaitableTimerA( DWORD access, BOOL inherit, LPCSTR name ) { WCHAR buffer[MAX_PATH]; if (!name) return OpenWaitableTimerW( access, inherit, NULL ); if (!MultiByteToWideChar( CP_ACP, 0, name, -1, buffer, MAX_PATH )) { SetLastError( ERROR_FILENAME_EXCED_RANGE ); return 0; } return OpenWaitableTimerW( access, inherit, buffer ); } /*********************************************************************** * OpenWaitableTimerW (KERNEL32.@) */ HANDLE WINAPI OpenWaitableTimerW( DWORD access, BOOL inherit, LPCWSTR name ) { HANDLE ret; DWORD len = name ? strlenW(name) : 0; if (len >= MAX_PATH) { SetLastError( ERROR_FILENAME_EXCED_RANGE ); return 0; } SERVER_START_REQ( open_timer ) { req->access = access; req->inherit = inherit; wine_server_add_data( req, name, len * sizeof(WCHAR) ); wine_server_call_err( req ); ret = reply->handle; } SERVER_END_REQ; return ret; } /*********************************************************************** * SetWaitableTimer (KERNEL32.@) */ BOOL WINAPI SetWaitableTimer( HANDLE handle, const LARGE_INTEGER *when, LONG period, PTIMERAPCROUTINE callback, LPVOID arg, BOOL resume ) { BOOL ret; SERVER_START_REQ( set_timer ) { if (!when->s.LowPart && !when->s.HighPart) { /* special case to start timeout on now+period without too many calculations */ req->expire.sec = 0; req->expire.usec = 0; } else NTDLL_get_server_timeout( &req->expire, when ); req->handle = handle; req->period = period; req->callback = callback; req->arg = arg; if (resume) SetLastError( ERROR_NOT_SUPPORTED ); /* set error but can still succeed */ ret = !wine_server_call_err( req ); } SERVER_END_REQ; return ret; } /*********************************************************************** * CancelWaitableTimer (KERNEL32.@) */ BOOL WINAPI CancelWaitableTimer( HANDLE handle ) { BOOL ret; SERVER_START_REQ( cancel_timer ) { req->handle = handle; ret = !wine_server_call_err( req ); } SERVER_END_REQ; return ret; } /*********************************************************************** * CreateTimerQueue (KERNEL32.@) */ HANDLE WINAPI CreateTimerQueue() { FIXME("stub\n"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return NULL; } /*********************************************************************** * DeleteTimerQueueEx (KERNEL32.@) */ BOOL WINAPI DeleteTimerQueueEx(HANDLE TimerQueue, HANDLE CompletionEvent) { FIXME("(%p, %p): stub\n", TimerQueue, CompletionEvent); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } /*********************************************************************** * CreateTimerQueueTimer (KERNEL32.@) * * Creates a timer-queue timer. This timer expires at the specified due * time (in ms), then after every specified period (in ms). When the timer * expires, the callback function is called. * * RETURNS * nonzero on success or zero on faillure * * BUGS * Unimplemented */ BOOL WINAPI CreateTimerQueueTimer( PHANDLE phNewTimer, HANDLE TimerQueue, WAITORTIMERCALLBACK Callback, PVOID Parameter, DWORD DueTime, DWORD Period, ULONG Flags ) { FIXME("stub\n"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return TRUE; } /*********************************************************************** * DeleteTimerQueueTimer (KERNEL32.@) * * Cancels a timer-queue timer. * * RETURNS * nonzero on success or zero on faillure * * BUGS * Unimplemented */ BOOL WINAPI DeleteTimerQueueTimer( HANDLE TimerQueue, HANDLE Timer, HANDLE CompletionEvent ) { FIXME("stub\n"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return TRUE; }