ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

task.c
Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2008 Google (Roy Shea)
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00017  */
00018 
00019 #include "mstask_private.h"
00020 #include "wine/debug.h"
00021 
00022 WINE_DEFAULT_DEBUG_CHANNEL(mstask);
00023 
00024 typedef struct
00025 {
00026     ITask ITask_iface;
00027     IPersistFile IPersistFile_iface;
00028     LONG ref;
00029     LPWSTR taskName;
00030     LPWSTR applicationName;
00031     LPWSTR parameters;
00032     LPWSTR comment;
00033     DWORD maxRunTime;
00034     LPWSTR accountName;
00035 } TaskImpl;
00036 
00037 static inline TaskImpl *impl_from_ITask(ITask *iface)
00038 {
00039     return CONTAINING_RECORD(iface, TaskImpl, ITask_iface);
00040 }
00041 
00042 static inline TaskImpl *impl_from_IPersistFile( IPersistFile *iface )
00043 {
00044     return CONTAINING_RECORD(iface, TaskImpl, IPersistFile_iface);
00045 }
00046 
00047 static void TaskDestructor(TaskImpl *This)
00048 {
00049     TRACE("%p\n", This);
00050     HeapFree(GetProcessHeap(), 0, This->accountName);
00051     HeapFree(GetProcessHeap(), 0, This->comment);
00052     HeapFree(GetProcessHeap(), 0, This->parameters);
00053     HeapFree(GetProcessHeap(), 0, This->taskName);
00054     HeapFree(GetProcessHeap(), 0, This);
00055     InterlockedDecrement(&dll_ref);
00056 }
00057 
00058 static HRESULT WINAPI MSTASK_ITask_QueryInterface(
00059         ITask* iface,
00060         REFIID riid,
00061         void **ppvObject)
00062 {
00063     TaskImpl * This = impl_from_ITask(iface);
00064 
00065     TRACE("IID: %s\n", debugstr_guid(riid));
00066     if (ppvObject == NULL)
00067         return E_POINTER;
00068 
00069     if (IsEqualGUID(riid, &IID_IUnknown) ||
00070             IsEqualGUID(riid, &IID_ITask))
00071     {
00072         *ppvObject = &This->ITask_iface;
00073         ITask_AddRef(iface);
00074         return S_OK;
00075     }
00076     else if (IsEqualGUID(riid, &IID_IPersistFile))
00077     {
00078         *ppvObject = &This->IPersistFile_iface;
00079         ITask_AddRef(iface);
00080         return S_OK;
00081     }
00082 
00083     WARN("Unknown interface: %s\n", debugstr_guid(riid));
00084     *ppvObject = NULL;
00085     return E_NOINTERFACE;
00086 }
00087 
00088 static ULONG WINAPI MSTASK_ITask_AddRef(
00089         ITask* iface)
00090 {
00091     TaskImpl *This = impl_from_ITask(iface);
00092     ULONG ref;
00093     TRACE("\n");
00094     ref = InterlockedIncrement(&This->ref);
00095     return ref;
00096 }
00097 
00098 static ULONG WINAPI MSTASK_ITask_Release(
00099         ITask* iface)
00100 {
00101     TaskImpl * This = impl_from_ITask(iface);
00102     ULONG ref;
00103     TRACE("\n");
00104     ref = InterlockedDecrement(&This->ref);
00105     if (ref == 0)
00106         TaskDestructor(This);
00107     return ref;
00108 }
00109 
00110 static HRESULT WINAPI MSTASK_ITask_CreateTrigger(
00111         ITask* iface,
00112         WORD *piNewTrigger,
00113         ITaskTrigger **ppTrigger)
00114 {
00115     TRACE("(%p, %p, %p)\n", iface, piNewTrigger, ppTrigger);
00116     return TaskTriggerConstructor((LPVOID *)ppTrigger);
00117 }
00118 
00119 static HRESULT WINAPI MSTASK_ITask_DeleteTrigger(
00120         ITask* iface,
00121         WORD iTrigger)
00122 {
00123     FIXME("(%p, %d): stub\n", iface, iTrigger);
00124     return E_NOTIMPL;
00125 }
00126 
00127 static HRESULT WINAPI MSTASK_ITask_GetTriggerCount(
00128         ITask* iface,
00129         WORD *plCount)
00130 {
00131     FIXME("(%p, %p): stub\n", iface, plCount);
00132     return E_NOTIMPL;
00133 }
00134 
00135 static HRESULT WINAPI MSTASK_ITask_GetTrigger(
00136         ITask* iface,
00137         WORD iTrigger,
00138         ITaskTrigger **ppTrigger)
00139 {
00140     FIXME("(%p, %d, %p): stub\n", iface, iTrigger, ppTrigger);
00141     return E_NOTIMPL;
00142 }
00143 
00144 static HRESULT WINAPI MSTASK_ITask_GetTriggerString(
00145         ITask* iface,
00146         WORD iTrigger,
00147         LPWSTR *ppwszTrigger)
00148 {
00149     FIXME("(%p, %d, %p): stub\n", iface, iTrigger, ppwszTrigger);
00150     return E_NOTIMPL;
00151 }
00152 
00153 static HRESULT WINAPI MSTASK_ITask_GetRunTimes(
00154         ITask* iface,
00155         const LPSYSTEMTIME pstBegin,
00156         const LPSYSTEMTIME pstEnd,
00157         WORD *pCount,
00158         LPSYSTEMTIME *rgstTaskTimes)
00159 {
00160     FIXME("(%p, %p, %p, %p, %p): stub\n", iface, pstBegin, pstEnd, pCount,
00161             rgstTaskTimes);
00162     return E_NOTIMPL;
00163 }
00164 
00165 static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(
00166         ITask* iface,
00167         SYSTEMTIME *pstNextRun)
00168 {
00169     FIXME("(%p, %p): stub\n", iface, pstNextRun);
00170     return E_NOTIMPL;
00171 }
00172 
00173 static HRESULT WINAPI MSTASK_ITask_SetIdleWait(
00174         ITask* iface,
00175         WORD wIdleMinutes,
00176         WORD wDeadlineMinutes)
00177 {
00178     FIXME("(%p, %d, %d): stub\n", iface, wIdleMinutes, wDeadlineMinutes);
00179     return E_NOTIMPL;
00180 }
00181 
00182 static HRESULT WINAPI MSTASK_ITask_GetIdleWait(
00183         ITask* iface,
00184         WORD *pwIdleMinutes,
00185         WORD *pwDeadlineMinutes)
00186 {
00187     FIXME("(%p, %p, %p): stub\n", iface, pwIdleMinutes, pwDeadlineMinutes);
00188     return E_NOTIMPL;
00189 }
00190 
00191 static HRESULT WINAPI MSTASK_ITask_Run(
00192         ITask* iface)
00193 {
00194     FIXME("(%p): stub\n", iface);
00195     return E_NOTIMPL;
00196 }
00197 
00198 static HRESULT WINAPI MSTASK_ITask_Terminate(
00199         ITask* iface)
00200 {
00201     FIXME("(%p): stub\n", iface);
00202     return E_NOTIMPL;
00203 }
00204 
00205 static HRESULT WINAPI MSTASK_ITask_EditWorkItem(
00206         ITask* iface,
00207         HWND hParent,
00208         DWORD dwReserved)
00209 {
00210     FIXME("(%p, %p, %d): stub\n", iface, hParent, dwReserved);
00211     return E_NOTIMPL;
00212 }
00213 
00214 static HRESULT WINAPI MSTASK_ITask_GetMostRecentRunTime(
00215         ITask* iface,
00216         SYSTEMTIME *pstLastRun)
00217 {
00218     FIXME("(%p, %p): stub\n", iface, pstLastRun);
00219     return E_NOTIMPL;
00220 }
00221 
00222 static HRESULT WINAPI MSTASK_ITask_GetStatus(
00223         ITask* iface,
00224         HRESULT *phrStatus)
00225 {
00226     FIXME("(%p, %p): stub\n", iface, phrStatus);
00227     return E_NOTIMPL;
00228 }
00229 
00230 static HRESULT WINAPI MSTASK_ITask_GetExitCode(
00231         ITask* iface,
00232         DWORD *pdwExitCode)
00233 {
00234     FIXME("(%p, %p): stub\n", iface, pdwExitCode);
00235     return E_NOTIMPL;
00236 }
00237 
00238 static HRESULT WINAPI MSTASK_ITask_SetComment(
00239         ITask* iface,
00240         LPCWSTR pwszComment)
00241 {
00242     DWORD n;
00243     TaskImpl *This = impl_from_ITask(iface);
00244     LPWSTR tmp_comment;
00245 
00246     TRACE("(%p, %s)\n", iface, debugstr_w(pwszComment));
00247 
00248     /* Empty comment */
00249     if (pwszComment[0] == 0)
00250     {
00251         HeapFree(GetProcessHeap(), 0, This->comment);
00252         This->comment = NULL;
00253         return S_OK;
00254     }
00255 
00256     /* Set to pwszComment */
00257     n = (lstrlenW(pwszComment) + 1);
00258     tmp_comment = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
00259     if (!tmp_comment)
00260         return E_OUTOFMEMORY;
00261     lstrcpyW(tmp_comment, pwszComment);
00262     HeapFree(GetProcessHeap(), 0, This->comment);
00263     This->comment = tmp_comment;
00264 
00265     return S_OK;
00266 }
00267 
00268 static HRESULT WINAPI MSTASK_ITask_GetComment(
00269         ITask* iface,
00270         LPWSTR *ppwszComment)
00271 {
00272     DWORD n;
00273     TaskImpl *This = impl_from_ITask(iface);
00274 
00275     TRACE("(%p, %p)\n", iface, ppwszComment);
00276 
00277     n = This->comment ? lstrlenW(This->comment) + 1 : 1;
00278     *ppwszComment = CoTaskMemAlloc(n * sizeof(WCHAR));
00279     if (!*ppwszComment)
00280         return E_OUTOFMEMORY;
00281 
00282     if (!This->comment)
00283         *ppwszComment[0] = 0;
00284     else
00285         lstrcpyW(*ppwszComment, This->comment);
00286 
00287     return S_OK;
00288 }
00289 
00290 static HRESULT WINAPI MSTASK_ITask_SetCreator(
00291         ITask* iface,
00292         LPCWSTR pwszCreator)
00293 {
00294     FIXME("(%p, %p): stub\n", iface, pwszCreator);
00295     return E_NOTIMPL;
00296 }
00297 
00298 static HRESULT WINAPI MSTASK_ITask_GetCreator(
00299         ITask* iface,
00300         LPWSTR *ppwszCreator)
00301 {
00302     FIXME("(%p, %p): stub\n", iface, ppwszCreator);
00303     return E_NOTIMPL;
00304 }
00305 
00306 static HRESULT WINAPI MSTASK_ITask_SetWorkItemData(
00307         ITask* iface,
00308         WORD cBytes,
00309         BYTE rgbData[])
00310 {
00311     FIXME("(%p, %d, %p): stub\n", iface, cBytes, rgbData);
00312     return E_NOTIMPL;
00313 }
00314 
00315 static HRESULT WINAPI MSTASK_ITask_GetWorkItemData(
00316         ITask* iface,
00317         WORD *pcBytes,
00318         BYTE **ppBytes)
00319 {
00320     FIXME("(%p, %p, %p): stub\n", iface, pcBytes, ppBytes);
00321     return E_NOTIMPL;
00322 }
00323 
00324 static HRESULT WINAPI MSTASK_ITask_SetErrorRetryCount(
00325         ITask* iface,
00326         WORD wRetryCount)
00327 {
00328     FIXME("(%p, %d): stub\n", iface, wRetryCount);
00329     return E_NOTIMPL;
00330 }
00331 
00332 static HRESULT WINAPI MSTASK_ITask_GetErrorRetryCount(
00333         ITask* iface,
00334         WORD *pwRetryCount)
00335 {
00336     FIXME("(%p, %p): stub\n", iface, pwRetryCount);
00337     return E_NOTIMPL;
00338 }
00339 
00340 static HRESULT WINAPI MSTASK_ITask_SetErrorRetryInterval(
00341         ITask* iface,
00342         WORD wRetryInterval)
00343 {
00344     FIXME("(%p, %d): stub\n", iface, wRetryInterval);
00345     return E_NOTIMPL;
00346 }
00347 
00348 static HRESULT WINAPI MSTASK_ITask_GetErrorRetryInterval(
00349         ITask* iface,
00350         WORD *pwRetryInterval)
00351 {
00352     FIXME("(%p, %p): stub\n", iface, pwRetryInterval);
00353     return E_NOTIMPL;
00354 }
00355 
00356 static HRESULT WINAPI MSTASK_ITask_SetFlags(
00357         ITask* iface,
00358         DWORD dwFlags)
00359 {
00360     FIXME("(%p, 0x%08x): stub\n", iface, dwFlags);
00361     return E_NOTIMPL;
00362 }
00363 
00364 static HRESULT WINAPI MSTASK_ITask_GetFlags(
00365         ITask* iface,
00366         DWORD *pdwFlags)
00367 {
00368     FIXME("(%p, %p): stub\n", iface, pdwFlags);
00369     return E_NOTIMPL;
00370 }
00371 
00372 static HRESULT WINAPI MSTASK_ITask_SetAccountInformation(
00373         ITask* iface,
00374         LPCWSTR pwszAccountName,
00375         LPCWSTR pwszPassword)
00376 {
00377     DWORD n;
00378     TaskImpl *This = impl_from_ITask(iface);
00379     LPWSTR tmp_account_name;
00380 
00381     TRACE("(%p, %s, %s): partial stub\n", iface, debugstr_w(pwszAccountName),
00382             debugstr_w(pwszPassword));
00383 
00384     if (pwszPassword)
00385         FIXME("Partial stub ignores passwords\n");
00386 
00387     n = (lstrlenW(pwszAccountName) + 1);
00388     tmp_account_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
00389     if (!tmp_account_name)
00390         return E_OUTOFMEMORY;
00391     lstrcpyW(tmp_account_name, pwszAccountName);
00392     HeapFree(GetProcessHeap(), 0, This->accountName);
00393     This->accountName = tmp_account_name;
00394     return S_OK;
00395 }
00396 
00397 static HRESULT WINAPI MSTASK_ITask_GetAccountInformation(
00398         ITask* iface,
00399         LPWSTR *ppwszAccountName)
00400 {
00401     DWORD n;
00402     TaskImpl *This = impl_from_ITask(iface);
00403 
00404     TRACE("(%p, %p): partial stub\n", iface, ppwszAccountName);
00405 
00406     /* This implements the WinXP behavior when accountName has not yet
00407      * set.  Win2K behaves differently, returning SCHED_E_CANNOT_OPEN_TASK */
00408     if (!This->accountName)
00409         return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
00410 
00411     n = (lstrlenW(This->accountName) + 1);
00412     *ppwszAccountName = CoTaskMemAlloc(n * sizeof(WCHAR));
00413     if (!*ppwszAccountName)
00414         return E_OUTOFMEMORY;
00415     lstrcpyW(*ppwszAccountName, This->accountName);
00416     return S_OK;
00417 }
00418 
00419 static HRESULT WINAPI MSTASK_ITask_SetApplicationName(
00420         ITask* iface,
00421         LPCWSTR pwszApplicationName)
00422 {
00423     DWORD n;
00424     TaskImpl *This = impl_from_ITask(iface);
00425     LPWSTR tmp_name;
00426 
00427     TRACE("(%p, %s)\n", iface, debugstr_w(pwszApplicationName));
00428 
00429     /* Empty application name */
00430     if (pwszApplicationName[0] == 0)
00431     {
00432         HeapFree(GetProcessHeap(), 0, This->applicationName);
00433         This->applicationName = NULL;
00434         return S_OK;
00435     }
00436 
00437     /* Attempt to set pwszApplicationName to a path resolved application name */
00438     n = SearchPathW(NULL, pwszApplicationName, NULL, 0, NULL, NULL);
00439     if (n)
00440     {
00441         tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
00442         if (!tmp_name)
00443             return E_OUTOFMEMORY;
00444         n = SearchPathW(NULL, pwszApplicationName, NULL, n, tmp_name, NULL);
00445         if (n)
00446         {
00447             HeapFree(GetProcessHeap(), 0, This->applicationName);
00448             This->applicationName = tmp_name;
00449             return S_OK;
00450         }
00451         else
00452             HeapFree(GetProcessHeap(), 0, tmp_name);
00453     }
00454 
00455     /* If unable to path resolve name, simply set to pwszApplicationName */
00456     n = (lstrlenW(pwszApplicationName) + 1);
00457     tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
00458     if (!tmp_name)
00459         return E_OUTOFMEMORY;
00460     lstrcpyW(tmp_name, pwszApplicationName);
00461     HeapFree(GetProcessHeap(), 0, This->applicationName);
00462     This->applicationName = tmp_name;
00463     return S_OK;
00464 }
00465 
00466 static HRESULT WINAPI MSTASK_ITask_GetApplicationName(
00467         ITask* iface,
00468         LPWSTR *ppwszApplicationName)
00469 {
00470     DWORD n;
00471     TaskImpl *This = impl_from_ITask(iface);
00472 
00473     TRACE("(%p, %p)\n", iface, ppwszApplicationName);
00474 
00475     n = This->applicationName ? lstrlenW(This->applicationName) + 1 : 1;
00476     *ppwszApplicationName = CoTaskMemAlloc(n * sizeof(WCHAR));
00477     if (!*ppwszApplicationName)
00478         return E_OUTOFMEMORY;
00479 
00480     if (!This->applicationName)
00481         *ppwszApplicationName[0] = 0;
00482     else
00483         lstrcpyW(*ppwszApplicationName, This->applicationName);
00484 
00485     return S_OK;
00486 }
00487 
00488 static HRESULT WINAPI MSTASK_ITask_SetParameters(
00489         ITask* iface,
00490         LPCWSTR pwszParameters)
00491 {
00492     DWORD n;
00493     TaskImpl *This = impl_from_ITask(iface);
00494     LPWSTR tmp_parameters;
00495 
00496     TRACE("(%p, %s)\n", iface, debugstr_w(pwszParameters));
00497 
00498     /* Empty parameter list */
00499     if (pwszParameters[0] == 0)
00500     {
00501         HeapFree(GetProcessHeap(), 0, This->parameters);
00502         This->parameters = NULL;
00503         return S_OK;
00504     }
00505 
00506     /* Set to pwszParameters */
00507     n = (lstrlenW(pwszParameters) + 1);
00508     tmp_parameters = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR));
00509     if (!tmp_parameters)
00510         return E_OUTOFMEMORY;
00511     lstrcpyW(tmp_parameters, pwszParameters);
00512     HeapFree(GetProcessHeap(), 0, This->parameters);
00513     This->parameters = tmp_parameters;
00514     return S_OK;
00515 }
00516 
00517 static HRESULT WINAPI MSTASK_ITask_GetParameters(
00518         ITask* iface,
00519         LPWSTR *ppwszParameters)
00520 {
00521     DWORD n;
00522     TaskImpl *This = impl_from_ITask(iface);
00523 
00524     TRACE("(%p, %p)\n", iface, ppwszParameters);
00525 
00526     n = This->parameters ? lstrlenW(This->parameters) + 1 : 1;
00527     *ppwszParameters = CoTaskMemAlloc(n * sizeof(WCHAR));
00528     if (!*ppwszParameters)
00529         return E_OUTOFMEMORY;
00530 
00531     if (!This->parameters)
00532         *ppwszParameters[0] = 0;
00533     else
00534         lstrcpyW(*ppwszParameters, This->parameters);
00535 
00536     return S_OK;
00537 }
00538 
00539 static HRESULT WINAPI MSTASK_ITask_SetWorkingDirectory(
00540         ITask* iface,
00541         LPCWSTR pwszWorkingDirectory)
00542 {
00543     FIXME("(%p, %s): stub\n", iface, debugstr_w(pwszWorkingDirectory));
00544     return E_NOTIMPL;
00545 }
00546 
00547 static HRESULT WINAPI MSTASK_ITask_GetWorkingDirectory(
00548         ITask* iface,
00549         LPWSTR *ppwszWorkingDirectory)
00550 {
00551     FIXME("(%p, %p): stub\n", iface, ppwszWorkingDirectory);
00552     return E_NOTIMPL;
00553 }
00554 
00555 static HRESULT WINAPI MSTASK_ITask_SetPriority(
00556         ITask* iface,
00557         DWORD dwPriority)
00558 {
00559     FIXME("(%p, 0x%08x): stub\n", iface, dwPriority);
00560     return E_NOTIMPL;
00561 }
00562 
00563 static HRESULT WINAPI MSTASK_ITask_GetPriority(
00564         ITask* iface,
00565         DWORD *pdwPriority)
00566 {
00567     FIXME("(%p, %p): stub\n", iface, pdwPriority);
00568     return E_NOTIMPL;
00569 }
00570 
00571 static HRESULT WINAPI MSTASK_ITask_SetTaskFlags(
00572         ITask* iface,
00573         DWORD dwFlags)
00574 {
00575     FIXME("(%p, 0x%08x): stub\n", iface, dwFlags);
00576     return E_NOTIMPL;
00577 }
00578 
00579 static HRESULT WINAPI MSTASK_ITask_GetTaskFlags(
00580         ITask* iface,
00581         DWORD *pdwFlags)
00582 {
00583     FIXME("(%p, %p): stub\n", iface, pdwFlags);
00584     return E_NOTIMPL;
00585 }
00586 
00587 static HRESULT WINAPI MSTASK_ITask_SetMaxRunTime(
00588         ITask* iface,
00589         DWORD dwMaxRunTime)
00590 {
00591     TaskImpl *This = impl_from_ITask(iface);
00592 
00593     TRACE("(%p, %d)\n", iface, dwMaxRunTime);
00594 
00595     This->maxRunTime = dwMaxRunTime;
00596     return S_OK;
00597 }
00598 
00599 static HRESULT WINAPI MSTASK_ITask_GetMaxRunTime(
00600         ITask* iface,
00601         DWORD *pdwMaxRunTime)
00602 {
00603     TaskImpl *This = impl_from_ITask(iface);
00604 
00605     TRACE("(%p, %p)\n", iface, pdwMaxRunTime);
00606 
00607     *pdwMaxRunTime = This->maxRunTime;
00608     return S_OK;
00609 }
00610 
00611 static HRESULT WINAPI MSTASK_IPersistFile_QueryInterface(
00612         IPersistFile* iface,
00613         REFIID riid,
00614         void **ppvObject)
00615 {
00616     TaskImpl *This = impl_from_IPersistFile(iface);
00617     TRACE("(%p, %s, %p)\n", iface, debugstr_guid(riid), ppvObject);
00618     return ITask_QueryInterface(&This->ITask_iface, riid, ppvObject);
00619 }
00620 
00621 static ULONG WINAPI MSTASK_IPersistFile_AddRef(
00622         IPersistFile* iface)
00623 {
00624     TaskImpl *This = impl_from_IPersistFile(iface);
00625     ULONG ref;
00626     TRACE("\n");
00627     ref = InterlockedIncrement(&This->ref);
00628     return ref;
00629 }
00630 
00631 static ULONG WINAPI MSTASK_IPersistFile_Release(
00632         IPersistFile* iface)
00633 {
00634     TaskImpl *This = impl_from_IPersistFile(iface);
00635     ULONG ref;
00636     TRACE("\n");
00637     ref = InterlockedDecrement(&This->ref);
00638     if (ref == 0)
00639         TaskDestructor(This);
00640     return ref;
00641 }
00642 
00643 static HRESULT WINAPI MSTASK_IPersistFile_GetClassID(
00644         IPersistFile* iface,
00645         CLSID *pClassID)
00646 {
00647     FIXME("(%p, %p): stub\n", iface, pClassID);
00648     return E_NOTIMPL;
00649 }
00650 
00651 static HRESULT WINAPI MSTASK_IPersistFile_IsDirty(
00652         IPersistFile* iface)
00653 {
00654     FIXME("(%p): stub\n", iface);
00655     return E_NOTIMPL;
00656 }
00657 
00658 static HRESULT WINAPI MSTASK_IPersistFile_Load(
00659         IPersistFile* iface,
00660         LPCOLESTR pszFileName,
00661         DWORD dwMode)
00662 {
00663     FIXME("(%p, %p, 0x%08x): stub\n", iface, pszFileName, dwMode);
00664     return E_NOTIMPL;
00665 }
00666 
00667 static HRESULT WINAPI MSTASK_IPersistFile_Save(
00668         IPersistFile* iface,
00669         LPCOLESTR pszFileName,
00670         BOOL fRemember)
00671 {
00672     FIXME("(%p, %p, %d): stub\n", iface, pszFileName, fRemember);
00673     WARN("Returning S_OK but not writing to disk: %s %d\n",
00674             debugstr_w(pszFileName), fRemember);
00675     return S_OK;
00676 }
00677 
00678 static HRESULT WINAPI MSTASK_IPersistFile_SaveCompleted(
00679         IPersistFile* iface,
00680         LPCOLESTR pszFileName)
00681 {
00682     FIXME("(%p, %p): stub\n", iface, pszFileName);
00683     return E_NOTIMPL;
00684 }
00685 
00686 static HRESULT WINAPI MSTASK_IPersistFile_GetCurFile(
00687         IPersistFile* iface,
00688         LPOLESTR *ppszFileName)
00689 {
00690     FIXME("(%p, %p): stub\n", iface, ppszFileName);
00691     return E_NOTIMPL;
00692 }
00693 
00694 
00695 static const ITaskVtbl MSTASK_ITaskVtbl =
00696 {
00697     MSTASK_ITask_QueryInterface,
00698     MSTASK_ITask_AddRef,
00699     MSTASK_ITask_Release,
00700     MSTASK_ITask_CreateTrigger,
00701     MSTASK_ITask_DeleteTrigger,
00702     MSTASK_ITask_GetTriggerCount,
00703     MSTASK_ITask_GetTrigger,
00704     MSTASK_ITask_GetTriggerString,
00705     MSTASK_ITask_GetRunTimes,
00706     MSTASK_ITask_GetNextRunTime,
00707     MSTASK_ITask_SetIdleWait,
00708     MSTASK_ITask_GetIdleWait,
00709     MSTASK_ITask_Run,
00710     MSTASK_ITask_Terminate,
00711     MSTASK_ITask_EditWorkItem,
00712     MSTASK_ITask_GetMostRecentRunTime,
00713     MSTASK_ITask_GetStatus,
00714     MSTASK_ITask_GetExitCode,
00715     MSTASK_ITask_SetComment,
00716     MSTASK_ITask_GetComment,
00717     MSTASK_ITask_SetCreator,
00718     MSTASK_ITask_GetCreator,
00719     MSTASK_ITask_SetWorkItemData,
00720     MSTASK_ITask_GetWorkItemData,
00721     MSTASK_ITask_SetErrorRetryCount,
00722     MSTASK_ITask_GetErrorRetryCount,
00723     MSTASK_ITask_SetErrorRetryInterval,
00724     MSTASK_ITask_GetErrorRetryInterval,
00725     MSTASK_ITask_SetFlags,
00726     MSTASK_ITask_GetFlags,
00727     MSTASK_ITask_SetAccountInformation,
00728     MSTASK_ITask_GetAccountInformation,
00729     MSTASK_ITask_SetApplicationName,
00730     MSTASK_ITask_GetApplicationName,
00731     MSTASK_ITask_SetParameters,
00732     MSTASK_ITask_GetParameters,
00733     MSTASK_ITask_SetWorkingDirectory,
00734     MSTASK_ITask_GetWorkingDirectory,
00735     MSTASK_ITask_SetPriority,
00736     MSTASK_ITask_GetPriority,
00737     MSTASK_ITask_SetTaskFlags,
00738     MSTASK_ITask_GetTaskFlags,
00739     MSTASK_ITask_SetMaxRunTime,
00740     MSTASK_ITask_GetMaxRunTime
00741 };
00742 
00743 static const IPersistFileVtbl MSTASK_IPersistFileVtbl =
00744 {
00745     MSTASK_IPersistFile_QueryInterface,
00746     MSTASK_IPersistFile_AddRef,
00747     MSTASK_IPersistFile_Release,
00748     MSTASK_IPersistFile_GetClassID,
00749     MSTASK_IPersistFile_IsDirty,
00750     MSTASK_IPersistFile_Load,
00751     MSTASK_IPersistFile_Save,
00752     MSTASK_IPersistFile_SaveCompleted,
00753     MSTASK_IPersistFile_GetCurFile
00754 };
00755 
00756 HRESULT TaskConstructor(LPCWSTR pwszTaskName, LPVOID *ppObj)
00757 {
00758     TaskImpl *This;
00759     int n;
00760 
00761     TRACE("(%s, %p)\n", debugstr_w(pwszTaskName), ppObj);
00762 
00763     This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
00764     if (!This)
00765         return E_OUTOFMEMORY;
00766 
00767     This->ITask_iface.lpVtbl = &MSTASK_ITaskVtbl;
00768     This->IPersistFile_iface.lpVtbl = &MSTASK_IPersistFileVtbl;
00769     This->ref = 1;
00770     n = (lstrlenW(pwszTaskName) + 1) * sizeof(WCHAR);
00771     This->taskName = HeapAlloc(GetProcessHeap(), 0, n);
00772     if (!This->taskName)
00773     {
00774         HeapFree(GetProcessHeap(), 0, This);
00775         return E_OUTOFMEMORY;
00776     }
00777     lstrcpyW(This->taskName, pwszTaskName);
00778     This->applicationName = NULL;
00779     This->parameters = NULL;
00780     This->comment = NULL;
00781     This->accountName = NULL;
00782 
00783     /* Default time is 3 days = 259200000 ms */
00784     This->maxRunTime = 259200000;
00785 
00786     *ppObj = &This->ITask_iface;
00787     InterlockedIncrement(&dll_ref);
00788     return S_OK;
00789 }

Generated on Mon May 28 2012 04:24:46 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.