Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygentask_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
1.7.6.1
|