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_trigger.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 <stdarg.h>
00020 #include "winternl.h"
00021 #include "mstask_private.h"
00022 #include "wine/debug.h"
00023 
00024 WINE_DEFAULT_DEBUG_CHANNEL(mstask);
00025 
00026 typedef struct
00027 {
00028     ITaskTrigger ITaskTrigger_iface;
00029     LONG ref;
00030     TASK_TRIGGER triggerCond;
00031 } TaskTriggerImpl;
00032 
00033 static inline TaskTriggerImpl *impl_from_ITaskTrigger(ITaskTrigger *iface)
00034 {
00035     return CONTAINING_RECORD(iface, TaskTriggerImpl, ITaskTrigger_iface);
00036 }
00037 
00038 static HRESULT WINAPI MSTASK_ITaskTrigger_QueryInterface(
00039         ITaskTrigger* iface,
00040         REFIID riid,
00041         void **ppvObject)
00042 {
00043     TaskTriggerImpl *This = impl_from_ITaskTrigger(iface);
00044 
00045     TRACE("IID: %s\n", debugstr_guid(riid));
00046     if (ppvObject == NULL)
00047         return E_POINTER;
00048 
00049     if (IsEqualGUID(riid, &IID_IUnknown) ||
00050             IsEqualGUID(riid, &IID_ITaskTrigger))
00051     {
00052         *ppvObject = &This->ITaskTrigger_iface;
00053         ITaskTrigger_AddRef(iface);
00054         return S_OK;
00055     }
00056 
00057     WARN("Unknown interface: %s\n", debugstr_guid(riid));
00058     *ppvObject = NULL;
00059     return E_NOINTERFACE;
00060 }
00061 
00062 static ULONG WINAPI MSTASK_ITaskTrigger_AddRef(
00063         ITaskTrigger* iface)
00064 {
00065     TaskTriggerImpl *This = impl_from_ITaskTrigger(iface);
00066     ULONG ref;
00067     TRACE("\n");
00068     ref = InterlockedIncrement(&This->ref);
00069     return ref;
00070 }
00071 
00072 static ULONG WINAPI MSTASK_ITaskTrigger_Release(
00073         ITaskTrigger* iface)
00074 {
00075     TaskTriggerImpl *This = impl_from_ITaskTrigger(iface);
00076     ULONG ref;
00077     TRACE("\n");
00078     ref = InterlockedDecrement(&This->ref);
00079     if (ref == 0)
00080     {
00081         HeapFree(GetProcessHeap(), 0, This);
00082         InterlockedDecrement(&dll_ref);
00083     }
00084     return ref;
00085 }
00086 
00087 static HRESULT WINAPI MSTASK_ITaskTrigger_SetTrigger(
00088         ITaskTrigger* iface,
00089         const PTASK_TRIGGER pTrigger)
00090 {
00091     TaskTriggerImpl * This = impl_from_ITaskTrigger(iface);
00092     TIME_FIELDS field_time;
00093     LARGE_INTEGER sys_time;
00094     TASK_TRIGGER tmp_trigger_cond;
00095 
00096     TRACE("(%p, %p)\n", iface, pTrigger);
00097 
00098     /* Verify valid structure size */
00099     if (pTrigger->cbTriggerSize != sizeof(*pTrigger))
00100         return E_INVALIDARG;
00101     tmp_trigger_cond.cbTriggerSize = pTrigger->cbTriggerSize;
00102 
00103     /* Reserved field must be zero */
00104     tmp_trigger_cond.Reserved1 = 0;
00105 
00106     /* Verify and set valid start date and time */
00107     memset(&field_time, 0, sizeof(field_time));
00108     field_time.Year = pTrigger->wBeginYear;
00109     field_time.Month = pTrigger->wBeginMonth;
00110     field_time.Day = pTrigger->wBeginDay;
00111     field_time.Hour = pTrigger->wStartHour;
00112     field_time.Minute = pTrigger->wStartMinute;
00113     if (!RtlTimeFieldsToTime(&field_time, &sys_time))
00114         return E_INVALIDARG;
00115     tmp_trigger_cond.wBeginYear = pTrigger->wBeginYear;
00116     tmp_trigger_cond.wBeginMonth = pTrigger->wBeginMonth;
00117     tmp_trigger_cond.wBeginDay = pTrigger->wBeginDay;
00118     tmp_trigger_cond.wStartHour = pTrigger->wStartHour;
00119     tmp_trigger_cond.wStartMinute = pTrigger->wStartMinute;
00120 
00121     /* Verify valid end date if TASK_TRIGGER_FLAG_HAS_END_DATE flag is set */
00122     if (pTrigger->rgFlags & TASK_TRIGGER_FLAG_HAS_END_DATE)
00123     {
00124         memset(&field_time, 0, sizeof(field_time));
00125         field_time.Year = pTrigger->wEndYear;
00126         field_time.Month = pTrigger->wEndMonth;
00127         field_time.Day = pTrigger->wEndDay;
00128         if (!RtlTimeFieldsToTime(&field_time, &sys_time))
00129             return E_INVALIDARG;
00130     }
00131 
00132     /* Set valid end date independent of TASK_TRIGGER_FLAG_HAS_END_DATE flag */
00133     tmp_trigger_cond.wEndYear = pTrigger->wEndYear;
00134     tmp_trigger_cond.wEndMonth = pTrigger->wEndMonth;
00135     tmp_trigger_cond.wEndDay = pTrigger->wEndDay;
00136 
00137     /* Verify duration and interval pair */
00138     if (pTrigger->MinutesDuration <= pTrigger->MinutesInterval &&
00139             pTrigger->MinutesInterval > 0)
00140         return E_INVALIDARG;
00141     if (pTrigger->MinutesDuration > 0 && pTrigger->MinutesInterval == 0)
00142         return E_INVALIDARG;
00143     tmp_trigger_cond.MinutesDuration = pTrigger->MinutesDuration;
00144     tmp_trigger_cond.MinutesInterval = pTrigger->MinutesInterval;
00145 
00146     /* Copy over flags */
00147     tmp_trigger_cond.rgFlags = pTrigger->rgFlags;
00148 
00149     /* Set TriggerType dependent fields of Type union */
00150     tmp_trigger_cond.TriggerType = pTrigger->TriggerType;
00151     switch (pTrigger->TriggerType)
00152     {
00153         case TASK_TIME_TRIGGER_DAILY:
00154             tmp_trigger_cond.Type.Daily.DaysInterval =
00155                     pTrigger->Type.Daily.DaysInterval;
00156             break;
00157         case TASK_TIME_TRIGGER_WEEKLY:
00158             tmp_trigger_cond.Type.Weekly.WeeksInterval =
00159                     pTrigger->Type.Weekly.WeeksInterval;
00160             tmp_trigger_cond.Type.Weekly.rgfDaysOfTheWeek =
00161                     pTrigger->Type.Weekly.rgfDaysOfTheWeek;
00162             break;
00163         case TASK_TIME_TRIGGER_MONTHLYDATE:
00164             tmp_trigger_cond.Type.MonthlyDate.rgfDays =
00165                     pTrigger->Type.MonthlyDate.rgfDays;
00166             tmp_trigger_cond.Type.MonthlyDate.rgfMonths =
00167                     pTrigger->Type.MonthlyDate.rgfMonths;
00168             break;
00169         case TASK_TIME_TRIGGER_MONTHLYDOW:
00170             tmp_trigger_cond.Type.MonthlyDOW.wWhichWeek =
00171                     pTrigger->Type.MonthlyDOW.wWhichWeek;
00172             tmp_trigger_cond.Type.MonthlyDOW.rgfDaysOfTheWeek =
00173                     pTrigger->Type.MonthlyDOW.rgfDaysOfTheWeek;
00174             tmp_trigger_cond.Type.MonthlyDOW.rgfMonths =
00175                     pTrigger->Type.MonthlyDOW.rgfMonths;
00176             break;
00177         case TASK_TIME_TRIGGER_ONCE:
00178         case TASK_EVENT_TRIGGER_ON_IDLE:
00179         case TASK_EVENT_TRIGGER_AT_SYSTEMSTART:
00180         case TASK_EVENT_TRIGGER_AT_LOGON:
00181         default:
00182             tmp_trigger_cond.Type = This->triggerCond.Type;
00183             break;
00184     }
00185 
00186     /* Reserved field must be zero */
00187     tmp_trigger_cond.Reserved2 = 0;
00188 
00189     /* wRandomMinutesInterval not currently used and is initialized to zero */
00190     tmp_trigger_cond.wRandomMinutesInterval = 0;
00191 
00192     /* Update object copy of triggerCond */
00193     This->triggerCond = tmp_trigger_cond;
00194 
00195     return S_OK;
00196 }
00197 
00198 static HRESULT WINAPI MSTASK_ITaskTrigger_GetTrigger(
00199         ITaskTrigger* iface,
00200         PTASK_TRIGGER pTrigger)
00201 {
00202     TaskTriggerImpl * This = impl_from_ITaskTrigger(iface);
00203 
00204     TRACE("(%p, %p)\n", iface, pTrigger);
00205 
00206     /* Native implementation doesn't verify equivalent cbTriggerSize fields */
00207 
00208     /* Copy relevant fields of the structure */
00209     pTrigger->cbTriggerSize = This->triggerCond.cbTriggerSize;
00210     pTrigger->Reserved1 = 0;
00211     pTrigger->wBeginYear = This->triggerCond.wBeginYear;
00212     pTrigger->wBeginMonth = This->triggerCond.wBeginMonth;
00213     pTrigger->wBeginDay = This->triggerCond.wBeginDay;
00214     pTrigger->wEndYear = This->triggerCond.wEndYear;
00215     pTrigger->wEndMonth = This->triggerCond.wEndMonth;
00216     pTrigger->wEndDay = This->triggerCond.wEndDay;
00217     pTrigger->wStartHour = This->triggerCond.wStartHour;
00218     pTrigger->wStartMinute = This->triggerCond.wStartMinute;
00219     pTrigger->MinutesDuration = This->triggerCond.MinutesDuration;
00220     pTrigger->MinutesInterval = This->triggerCond.MinutesInterval;
00221     pTrigger->rgFlags = This->triggerCond.rgFlags;
00222     pTrigger->TriggerType = This->triggerCond.TriggerType;
00223     switch (This->triggerCond.TriggerType)
00224     {
00225         case TASK_TIME_TRIGGER_DAILY:
00226             pTrigger->Type.Daily.DaysInterval =
00227                     This->triggerCond.Type.Daily.DaysInterval;
00228             break;
00229         case TASK_TIME_TRIGGER_WEEKLY:
00230             pTrigger->Type.Weekly.WeeksInterval =
00231                     This->triggerCond.Type.Weekly.WeeksInterval;
00232             pTrigger->Type.Weekly.rgfDaysOfTheWeek =
00233                     This->triggerCond.Type.Weekly.rgfDaysOfTheWeek;
00234             break;
00235         case TASK_TIME_TRIGGER_MONTHLYDATE:
00236             pTrigger->Type.MonthlyDate.rgfDays =
00237                     This->triggerCond.Type.MonthlyDate.rgfDays;
00238             pTrigger->Type.MonthlyDate.rgfMonths =
00239                     This->triggerCond.Type.MonthlyDate.rgfMonths;
00240             break;
00241         case TASK_TIME_TRIGGER_MONTHLYDOW:
00242             pTrigger->Type.MonthlyDOW.wWhichWeek =
00243                     This->triggerCond.Type.MonthlyDOW.wWhichWeek;
00244             pTrigger->Type.MonthlyDOW.rgfDaysOfTheWeek =
00245                     This->triggerCond.Type.MonthlyDOW.rgfDaysOfTheWeek;
00246             pTrigger->Type.MonthlyDOW.rgfMonths =
00247                     This->triggerCond.Type.MonthlyDOW.rgfMonths;
00248             break;
00249         case TASK_TIME_TRIGGER_ONCE:
00250         case TASK_EVENT_TRIGGER_ON_IDLE:
00251         case TASK_EVENT_TRIGGER_AT_SYSTEMSTART:
00252         case TASK_EVENT_TRIGGER_AT_LOGON:
00253         default:
00254             break;
00255     }
00256     pTrigger->Reserved2 = 0;
00257     pTrigger->wRandomMinutesInterval = 0;
00258     return S_OK;
00259 }
00260 
00261 static HRESULT WINAPI MSTASK_ITaskTrigger_GetTriggerString(
00262         ITaskTrigger* iface,
00263         LPWSTR *ppwszTrigger)
00264 {
00265     FIXME("Not implemented\n");
00266     return E_NOTIMPL;
00267 }
00268 
00269 static const ITaskTriggerVtbl MSTASK_ITaskTriggerVtbl =
00270 {
00271     MSTASK_ITaskTrigger_QueryInterface,
00272     MSTASK_ITaskTrigger_AddRef,
00273     MSTASK_ITaskTrigger_Release,
00274     MSTASK_ITaskTrigger_SetTrigger,
00275     MSTASK_ITaskTrigger_GetTrigger,
00276     MSTASK_ITaskTrigger_GetTriggerString
00277 };
00278 
00279 HRESULT TaskTriggerConstructor(LPVOID *ppObj)
00280 {
00281     TaskTriggerImpl *This;
00282     SYSTEMTIME time;
00283     TRACE("(%p)\n", ppObj);
00284 
00285     This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
00286     if (!This)
00287         return E_OUTOFMEMORY;
00288 
00289     This->ITaskTrigger_iface.lpVtbl = &MSTASK_ITaskTriggerVtbl;
00290     This->ref = 1;
00291 
00292     /* Most fields of triggerCond default to zero.  Initialize other
00293      * fields to default values. */
00294     memset(&This->triggerCond, 0, sizeof(TASK_TRIGGER));
00295     GetLocalTime(&time);
00296     This->triggerCond.cbTriggerSize = sizeof(This->triggerCond);
00297     This->triggerCond.wBeginYear = time.wYear;
00298     This->triggerCond.wBeginMonth = time.wMonth;
00299     This->triggerCond.wBeginDay = time.wDay;
00300     This->triggerCond.wStartHour = time.wHour;
00301     This->triggerCond.wStartMinute = time.wMinute;
00302     This->triggerCond.rgFlags = TASK_TRIGGER_FLAG_DISABLED;
00303     This->triggerCond.TriggerType = TASK_TIME_TRIGGER_DAILY,
00304     This->triggerCond.Type.Daily.DaysInterval = 1;
00305 
00306     *ppObj = &This->ITaskTrigger_iface;
00307     InterlockedIncrement(&dll_ref);
00308     return S_OK;
00309 }

Generated on Sun May 27 2012 04:25:21 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.