diff --git a/dlls/mstask/Makefile.in b/dlls/mstask/Makefile.in index ae6a99f750e..6c1f824cbbf 100644 --- a/dlls/mstask/Makefile.in +++ b/dlls/mstask/Makefile.in @@ -6,6 +6,7 @@ MODULE = mstask.dll IMPORTS = uuid kernel32 C_SRCS = \ + task.c \ factory.c \ mstask_main.c \ task_scheduler.c diff --git a/dlls/mstask/mstask_private.h b/dlls/mstask/mstask_private.h index 3ddd2b9b4dc..a532bdd26e8 100644 --- a/dlls/mstask/mstask_private.h +++ b/dlls/mstask/mstask_private.h @@ -45,4 +45,13 @@ typedef struct } TaskSchedulerImpl; extern HRESULT TaskSchedulerConstructor(LPVOID *ppObj); +typedef struct +{ + const ITaskVtbl *lpVtbl; + const IPersistFileVtbl *persistVtbl; + LONG ref; + LPWSTR taskName; +} TaskImpl; +extern HRESULT TaskConstructor(LPCWSTR pwszTaskName, LPVOID *ppObj); + #endif /* __MSTASK_PRIVATE_H__ */ diff --git a/dlls/mstask/task.c b/dlls/mstask/task.c new file mode 100644 index 00000000000..8a24b872f3f --- /dev/null +++ b/dlls/mstask/task.c @@ -0,0 +1,578 @@ +/* + * Copyright (C) 2008 Google (Roy Shea) + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "mstask_private.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mstask); + +static void TaskDestructor(TaskImpl *This) +{ + TRACE("%p\n", This); + HeapFree(GetProcessHeap(), 0, This->taskName); + HeapFree(GetProcessHeap(), 0, This); + InterlockedDecrement(&dll_ref); +} + +static HRESULT WINAPI MSTASK_ITask_QueryInterface( + ITask* iface, + REFIID riid, + void **ppvObject) +{ + TaskImpl * This = (TaskImpl *)iface; + + TRACE("IID: %s\n", debugstr_guid(riid)); + if (ppvObject == NULL) + return E_POINTER; + + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_ITask)) + { + *ppvObject = &This->lpVtbl; + ITask_AddRef(iface); + return S_OK; + } + + WARN("Unknown interface: %s\n", debugstr_guid(riid)); + *ppvObject = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI MSTASK_ITask_AddRef( + ITask* iface) +{ + TaskImpl *This = (TaskImpl *)iface; + ULONG ref; + TRACE("\n"); + ref = InterlockedIncrement(&This->ref); + return ref; +} + +static ULONG WINAPI MSTASK_ITask_Release( + ITask* iface) +{ + TaskImpl * This = (TaskImpl *)iface; + ULONG ref; + TRACE("\n"); + ref = InterlockedDecrement(&This->ref); + if (ref == 0) + TaskDestructor(This); + return ref; +} + +static HRESULT WINAPI MSTASK_ITask_CreateTrigger( + ITask* iface, + WORD *piNewTrigger, + ITaskTrigger **ppTrigger) +{ + FIXME("(%p, %p, %p): stub\n", iface, piNewTrigger, ppTrigger); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_DeleteTrigger( + ITask* iface, + WORD iTrigger) +{ + FIXME("(%p, %d): stub\n", iface, iTrigger); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetTriggerCount( + ITask* iface, + WORD *plCount) +{ + FIXME("(%p, %p): stub\n", iface, plCount); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetTrigger( + ITask* iface, + WORD iTrigger, + ITaskTrigger **ppTrigger) +{ + FIXME("(%p, %d, %p): stub\n", iface, iTrigger, ppTrigger); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetTriggerString( + ITask* iface, + WORD iTrigger, + LPWSTR *ppwszTrigger) +{ + FIXME("(%p, %d, %p): stub\n", iface, iTrigger, ppwszTrigger); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetRunTimes( + ITask* iface, + const LPSYSTEMTIME pstBegin, + const LPSYSTEMTIME pstEnd, + WORD *pCount, + LPSYSTEMTIME *rgstTaskTimes) +{ + FIXME("(%p, %p, %p, %p, %p): stub\n", iface, pstBegin, pstEnd, pCount, + rgstTaskTimes); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetNextRunTime( + ITask* iface, + SYSTEMTIME *pstNextRun) +{ + FIXME("(%p, %p): stub\n", iface, pstNextRun); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetIdleWait( + ITask* iface, + WORD wIdleMinutes, + WORD wDeadlineMinutes) +{ + FIXME("(%p, %d, %d): stub\n", iface, wIdleMinutes, wDeadlineMinutes); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetIdleWait( + ITask* iface, + WORD *pwIdleMinutes, + WORD *pwDeadlineMinutes) +{ + FIXME("(%p, %p, %p): stub\n", iface, pwIdleMinutes, pwDeadlineMinutes); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_Run( + ITask* iface) +{ + FIXME("(%p): stub\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_Terminate( + ITask* iface) +{ + FIXME("(%p): stub\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_EditWorkItem( + ITask* iface, + HWND hParent, + DWORD dwReserved) +{ + FIXME("(%p, %p, %d): stub\n", iface, hParent, dwReserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetMostRecentRunTime( + ITask* iface, + SYSTEMTIME *pstLastRun) +{ + FIXME("(%p, %p): stub\n", iface, pstLastRun); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetStatus( + ITask* iface, + HRESULT *phrStatus) +{ + FIXME("(%p, %p): stub\n", iface, phrStatus); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetExitCode( + ITask* iface, + DWORD *pdwExitCode) +{ + FIXME("(%p, %p): stub\n", iface, pdwExitCode); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetComment( + ITask* iface, + LPCWSTR pwszComment) +{ + FIXME("(%p, %s): stub\n", iface, debugstr_w(pwszComment)); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetComment( + ITask* iface, + LPWSTR *ppwszComment) +{ + FIXME("(%p, %p): stub\n", iface, ppwszComment); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetCreator( + ITask* iface, + LPCWSTR pwszCreator) +{ + FIXME("(%p, %p): stub\n", iface, pwszCreator); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetCreator( + ITask* iface, + LPWSTR *ppwszCreator) +{ + FIXME("(%p, %p): stub\n", iface, ppwszCreator); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetWorkItemData( + ITask* iface, + WORD cBytes, + BYTE rgbData[]) +{ + FIXME("(%p, %d, %p): stub\n", iface, cBytes, rgbData); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetWorkItemData( + ITask* iface, + WORD *pcBytes, + BYTE **ppBytes) +{ + FIXME("(%p, %p, %p): stub\n", iface, pcBytes, ppBytes); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetErrorRetryCount( + ITask* iface, + WORD wRetryCount) +{ + FIXME("(%p, %d): stub\n", iface, wRetryCount); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetErrorRetryCount( + ITask* iface, + WORD *pwRetryCount) +{ + FIXME("(%p, %p): stub\n", iface, pwRetryCount); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetErrorRetryInterval( + ITask* iface, + WORD wRetryInterval) +{ + FIXME("(%p, %d): stub\n", iface, wRetryInterval); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetErrorRetryInterval( + ITask* iface, + WORD *pwRetryInterval) +{ + FIXME("(%p, %p): stub\n", iface, pwRetryInterval); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetFlags( + ITask* iface, + DWORD dwFlags) +{ + FIXME("(%p, 0x%08x): stub\n", iface, dwFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetFlags( + ITask* iface, + DWORD *pdwFlags) +{ + FIXME("(%p, %p): stub\n", iface, pdwFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetAccountInformation( + ITask* iface, + LPCWSTR pwszAccountName, + LPCWSTR pwszPassword) +{ + FIXME("(%p, %s, %s): stub\n", iface, debugstr_w(pwszAccountName), + debugstr_w(pwszPassword)); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetAccountInformation( + ITask* iface, + LPWSTR *ppwszAccountName) +{ + FIXME("(%p, %p): stub\n", iface, ppwszAccountName); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetApplicationName( + ITask* iface, + LPCWSTR pwszApplicationName) +{ + FIXME("(%p, %s): stub\n", iface, debugstr_w(pwszApplicationName)); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetApplicationName( + ITask* iface, + LPWSTR *ppwszApplicationName) +{ + FIXME("(%p, %p): stub\n", iface, ppwszApplicationName); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetParameters( + ITask* iface, + LPCWSTR pwszParameters) +{ + FIXME("(%p, %s): stub\n", iface, debugstr_w(pwszParameters)); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetParameters( + ITask* iface, + LPWSTR *ppwszParameters) +{ + FIXME("(%p, %p): stub\n", iface, ppwszParameters); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetWorkingDirectory( + ITask* iface, + LPCWSTR pwszWorkingDirectory) +{ + FIXME("(%p, %s): stub\n", iface, debugstr_w(pwszWorkingDirectory)); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetWorkingDirectory( + ITask* iface, + LPWSTR *ppwszWorkingDirectory) +{ + FIXME("(%p, %p): stub\n", iface, ppwszWorkingDirectory); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetPriority( + ITask* iface, + DWORD dwPriority) +{ + FIXME("(%p, 0x%08x): stub\n", iface, dwPriority); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetPriority( + ITask* iface, + DWORD *pdwPriority) +{ + FIXME("(%p, %p): stub\n", iface, pdwPriority); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetTaskFlags( + ITask* iface, + DWORD dwFlags) +{ + FIXME("(%p, 0x%08x): stub\n", iface, dwFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetTaskFlags( + ITask* iface, + DWORD *pdwFlags) +{ + FIXME("(%p, %p): stub\n", iface, pdwFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_SetMaxRunTime( + ITask* iface, + DWORD dwMaxRunTime) +{ + FIXME("(%p, %d): stub\n", iface, dwMaxRunTime); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_ITask_GetMaxRunTime( + ITask* iface, + DWORD *pdwMaxRunTime) +{ + FIXME("(%p, %p): stub\n", iface, pdwMaxRunTime); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_IPersistFile_QueryInterface( + IPersistFile* iface, + REFIID riid, + void **ppvObject) +{ + FIXME("(%p, %s, %p): stub\n", iface, debugstr_guid(riid), ppvObject); + return E_NOTIMPL; +} + +static ULONG WINAPI MSTASK_IPersistFile_AddRef( + IPersistFile* iface) +{ + FIXME("(%p): stub\n", iface); + return E_NOTIMPL; +} + +static ULONG WINAPI MSTASK_IPersistFile_Release( + IPersistFile* iface) +{ + FIXME("(%p): stub\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_IPersistFile_GetClassID( + IPersistFile* iface, + CLSID *pClassID) +{ + FIXME("(%p, %p): stub\n", iface, pClassID); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_IPersistFile_IsDirty( + IPersistFile* iface) +{ + FIXME("(%p): stub\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_IPersistFile_Load( + IPersistFile* iface, + LPCOLESTR pszFileName, + DWORD dwMode) +{ + FIXME("(%p, %p, 0x%08x): stub\n", iface, pszFileName, dwMode); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_IPersistFile_Save( + IPersistFile* iface, + LPCOLESTR pszFileName, + BOOL fRemember) +{ + FIXME("(%p, %p, %d): stub\n", iface, pszFileName, fRemember); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_IPersistFile_SaveCompleted( + IPersistFile* iface, + LPCOLESTR pszFileName) +{ + FIXME("(%p, %p): stub\n", iface, pszFileName); + return E_NOTIMPL; +} + +static HRESULT WINAPI MSTASK_IPersistFile_GetCurFile( + IPersistFile* iface, + LPOLESTR *ppszFileName) +{ + FIXME("(%p, %p): stub\n", iface, ppszFileName); + return E_NOTIMPL; +} + + +static const ITaskVtbl MSTASK_ITaskVtbl = +{ + MSTASK_ITask_QueryInterface, + MSTASK_ITask_AddRef, + MSTASK_ITask_Release, + MSTASK_ITask_CreateTrigger, + MSTASK_ITask_DeleteTrigger, + MSTASK_ITask_GetTriggerCount, + MSTASK_ITask_GetTrigger, + MSTASK_ITask_GetTriggerString, + MSTASK_ITask_GetRunTimes, + MSTASK_ITask_GetNextRunTime, + MSTASK_ITask_SetIdleWait, + MSTASK_ITask_GetIdleWait, + MSTASK_ITask_Run, + MSTASK_ITask_Terminate, + MSTASK_ITask_EditWorkItem, + MSTASK_ITask_GetMostRecentRunTime, + MSTASK_ITask_GetStatus, + MSTASK_ITask_GetExitCode, + MSTASK_ITask_SetComment, + MSTASK_ITask_GetComment, + MSTASK_ITask_SetCreator, + MSTASK_ITask_GetCreator, + MSTASK_ITask_SetWorkItemData, + MSTASK_ITask_GetWorkItemData, + MSTASK_ITask_SetErrorRetryCount, + MSTASK_ITask_GetErrorRetryCount, + MSTASK_ITask_SetErrorRetryInterval, + MSTASK_ITask_GetErrorRetryInterval, + MSTASK_ITask_SetFlags, + MSTASK_ITask_GetFlags, + MSTASK_ITask_SetAccountInformation, + MSTASK_ITask_GetAccountInformation, + MSTASK_ITask_SetApplicationName, + MSTASK_ITask_GetApplicationName, + MSTASK_ITask_SetParameters, + MSTASK_ITask_GetParameters, + MSTASK_ITask_SetWorkingDirectory, + MSTASK_ITask_GetWorkingDirectory, + MSTASK_ITask_SetPriority, + MSTASK_ITask_GetPriority, + MSTASK_ITask_SetTaskFlags, + MSTASK_ITask_GetTaskFlags, + MSTASK_ITask_SetMaxRunTime, + MSTASK_ITask_GetMaxRunTime +}; + +static const IPersistFileVtbl MSTASK_IPersistFileVtbl = +{ + MSTASK_IPersistFile_QueryInterface, + MSTASK_IPersistFile_AddRef, + MSTASK_IPersistFile_Release, + MSTASK_IPersistFile_GetClassID, + MSTASK_IPersistFile_IsDirty, + MSTASK_IPersistFile_Load, + MSTASK_IPersistFile_Save, + MSTASK_IPersistFile_SaveCompleted, + MSTASK_IPersistFile_GetCurFile +}; + +HRESULT TaskConstructor(LPCWSTR pwszTaskName, LPVOID *ppObj) +{ + TaskImpl *This; + int n; + + TRACE("(%s, %p)\n", debugstr_w(pwszTaskName), ppObj); + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This)); + if (!This) + return E_OUTOFMEMORY; + + This->lpVtbl = &MSTASK_ITaskVtbl; + This->persistVtbl = &MSTASK_IPersistFileVtbl; + This->ref = 1; + n = (lstrlenW(pwszTaskName) + 1) * sizeof(WCHAR); + This->taskName = HeapAlloc(GetProcessHeap(), 0, n); + if (!This->taskName) + { + HeapFree(GetProcessHeap(), 0, This); + return E_OUTOFMEMORY; + } + lstrcpyW(This->taskName, pwszTaskName); + + *ppObj = &This->lpVtbl; + InterlockedIncrement(&dll_ref); + return S_OK; +}