Changeset 6711 for trunk/src/oleaut32
- Timestamp:
- Sep 15, 2001, 11:32:00 AM (24 years ago)
- Location:
- trunk/src/oleaut32
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/oleaut32/connpt.c
r6689 r6711 72 72 CONNECTDATA *pCD; 73 73 DWORD nConns; 74 74 75 75 /* Next connection to enumerate from */ 76 76 DWORD nCur; … … 79 79 80 80 static EnumConnectionsImpl *EnumConnectionsImpl_Construct(IUnknown *pUnk, 81 82 81 DWORD nSinks, 82 CONNECTDATA *pCD); 83 83 84 84 … … 87 87 */ 88 88 static ConnectionPointImpl *ConnectionPointImpl_Construct(IUnknown *pUnk, 89 89 REFIID riid) 90 90 { 91 91 ConnectionPointImpl *Obj; … … 97 97 Obj->iid = *riid; 98 98 Obj->maxSinks = MAXSINKS; 99 Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 100 99 Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 100 sizeof(IUnknown*) * MAXSINKS); 101 101 Obj->nSinks = 0; 102 102 return Obj; … … 139 139 if ( (This==0) || (ppvObject==0) ) 140 140 return E_INVALIDARG; 141 141 142 142 /* 143 143 * Initialize the return parameter. 144 144 */ 145 145 *ppvObject = 0; 146 146 147 147 /* 148 148 * Compare the riid with the interface IDs implemented by this object. 149 149 */ 150 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 150 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 151 151 { 152 152 *ppvObject = (IConnectionPoint*)This; 153 153 } 154 else if (memcmp(&IID_IConnectionPoint, riid, sizeof(IID_IConnectionPoint)) == 0) 154 else if (memcmp(&IID_IConnectionPoint, riid, sizeof(IID_IConnectionPoint)) == 0) 155 155 { 156 156 *ppvObject = (IConnectionPoint*)This; 157 157 } 158 158 159 159 /* 160 160 * Check that we obtained an interface. … … 165 165 return E_NOINTERFACE; 166 166 } 167 167 168 168 /* 169 169 * Query Interface always increases the reference count by one when it is … … 189 189 return This->ref; 190 190 } 191 191 192 192 /************************************************************************ 193 193 * ConnectionPointImpl_Release (IUnknown) … … 195 195 * See Windows documentation for more details on IUnknown methods. 196 196 */ 197 static ULONG WINAPI ConnectionPointImpl_Release( 197 static ULONG WINAPI ConnectionPointImpl_Release( 198 198 IConnectionPoint* iface) 199 199 { … … 215 215 return 0; 216 216 } 217 217 218 218 return This->ref; 219 219 } … … 224 224 */ 225 225 static HRESULT WINAPI ConnectionPointImpl_GetConnectionInterface( 226 227 226 IConnectionPoint *iface, 227 IID *piid) 228 228 { 229 229 ICOM_THIS(ConnectionPointImpl, iface); … … 238 238 */ 239 239 static HRESULT WINAPI ConnectionPointImpl_GetConnectionPointContainer( 240 241 240 IConnectionPoint *iface, 241 IConnectionPointContainer **ppCPC) 242 242 { 243 243 ICOM_THIS(ConnectionPointImpl, iface); … … 245 245 246 246 return IUnknown_QueryInterface(This->Obj, 247 248 247 &IID_IConnectionPointContainer, 248 (LPVOID)ppCPC); 249 249 } 250 250 … … 254 254 */ 255 255 static HRESULT WINAPI ConnectionPointImpl_Advise(IConnectionPoint *iface, 256 257 256 IUnknown *lpUnk, 257 DWORD *pdwCookie) 258 258 { 259 259 DWORD i; … … 273 273 This->maxSinks += MAXSINKS; 274 274 This->sinks = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->sinks, 275 275 This->maxSinks * sizeof(IUnknown *)); 276 276 } 277 277 This->sinks[i] = lpSink; … … 287 287 */ 288 288 static HRESULT WINAPI ConnectionPointImpl_Unadvise(IConnectionPoint *iface, 289 289 DWORD dwCookie) 290 290 { 291 291 ICOM_THIS(ConnectionPointImpl, iface); … … 307 307 */ 308 308 static HRESULT WINAPI ConnectionPointImpl_EnumConnections( 309 310 311 { 309 IConnectionPoint *iface, 310 LPENUMCONNECTIONS *ppEnum) 311 { 312 312 ICOM_THIS(ConnectionPointImpl, iface); 313 313 CONNECTDATA *pCD; … … 317 317 318 318 TRACE("(%p)->(%p)\n", This, ppEnum); 319 319 320 320 *ppEnum = NULL; 321 321 … … 339 339 EnumObj = EnumConnectionsImpl_Construct((IUnknown*)This, This->nSinks, pCD); 340 340 hr = IEnumConnections_QueryInterface((IEnumConnections*)EnumObj, 341 341 &IID_IEnumConnections, (LPVOID)ppEnum); 342 342 IEnumConnections_Release((IEnumConnections*)EnumObj); 343 343 … … 367 367 */ 368 368 static EnumConnectionsImpl *EnumConnectionsImpl_Construct(IUnknown *pUnk, 369 370 369 DWORD nSinks, 370 CONNECTDATA *pCD) 371 371 { 372 372 EnumConnectionsImpl *Obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*Obj)); … … 420 420 if ( (This==0) || (ppvObject==0) ) 421 421 return E_INVALIDARG; 422 422 423 423 /* 424 424 * Initialize the return parameter. 425 425 */ 426 426 *ppvObject = 0; 427 427 428 428 /* 429 429 * Compare the riid with the interface IDs implemented by this object. 430 430 */ 431 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 431 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 432 432 { 433 433 *ppvObject = (IEnumConnections*)This; 434 434 } 435 else if (memcmp(&IID_IEnumConnections, riid, sizeof(IID_IEnumConnections)) == 0) 435 else if (memcmp(&IID_IEnumConnections, riid, sizeof(IID_IEnumConnections)) == 0) 436 436 { 437 437 *ppvObject = (IEnumConnections*)This; 438 438 } 439 439 440 440 /* 441 441 * Check that we obtained an interface. … … 446 446 return E_NOINTERFACE; 447 447 } 448 448 449 449 /* 450 450 * Query Interface always increases the reference count by one when it is … … 470 470 return This->ref; 471 471 } 472 472 473 473 /************************************************************************ 474 474 * EnumConnectionsImpl_Release (IUnknown) … … 497 497 return 0; 498 498 } 499 499 500 500 return This->ref; 501 501 } … … 506 506 */ 507 507 static HRESULT WINAPI EnumConnectionsImpl_Next(IEnumConnections* iface, 508 509 508 ULONG cConn, LPCONNECTDATA pCD, 509 ULONG *pEnum) 510 510 { 511 511 ICOM_THIS(EnumConnectionsImpl, iface); … … 542 542 */ 543 543 static HRESULT WINAPI EnumConnectionsImpl_Skip(IEnumConnections* iface, 544 544 ULONG cSkip) 545 545 { 546 546 ICOM_THIS(EnumConnectionsImpl, iface); … … 576 576 */ 577 577 static HRESULT WINAPI EnumConnectionsImpl_Clone(IEnumConnections* iface, 578 578 LPENUMCONNECTIONS *ppEnum) 579 579 { 580 580 ICOM_THIS(EnumConnectionsImpl, iface); 581 581 EnumConnectionsImpl *newObj; 582 582 TRACE("(%p)->(%p)\n", This, ppEnum); 583 583 584 584 newObj = EnumConnectionsImpl_Construct(This->pUnk, This->nConns, This->pCD); 585 585 newObj->nCur = This->nCur; … … 588 588 return S_OK; 589 589 } 590 590 591 591 static ICOM_VTABLE(IEnumConnections) EnumConnectionsImpl_VTable = 592 592 { … … 616 616 */ 617 617 HRESULT CreateConnectionPoint(IUnknown *pUnk, REFIID riid, 618 618 IConnectionPoint **pCP) 619 619 { 620 620 ConnectionPointImpl *Obj; … … 624 624 if(!Obj) return E_OUTOFMEMORY; 625 625 626 hr = IConnectionPoint_QueryInterface((IConnectionPoint *)Obj, 627 626 hr = IConnectionPoint_QueryInterface((IConnectionPoint *)Obj, 627 &IID_IConnectionPoint, (LPVOID)pCP); 628 628 IConnectionPoint_Release((IConnectionPoint *)Obj); 629 629 return hr; -
trunk/src/oleaut32/dispatch.c
r6689 r6711 37 37 * 38 38 * NOTES 39 * - Defermethod invocation to ITypeInfo::Invoke()39 * - Defer method invocation to ITypeInfo::Invoke() 40 40 * 41 41 * RETURNS 42 42 * 43 * 43 * S_OK on success. 44 44 */ 45 45 HRESULT WINAPI … … 76 76 * DispGetIDsOfNames (OLEAUT32.29) 77 77 * 78 * Convert a set of names to dispids, based on information 78 * Convert a set of names to dispids, based on information 79 79 * contained in object's type library. 80 * 80 * 81 81 * NOTES 82 * 82 * - Defers to ITypeInfo::GetIDsOfNames() 83 83 * 84 84 * RETURNS 85 85 * 86 * 86 * S_OK on success. 87 87 */ 88 88 HRESULT WINAPI … … 109 109 * 110 110 * NOTES 111 * 111 * Coercion is done using system (0) locale. 112 112 * 113 113 * RETURNS 114 114 * 115 * 115 * S_OK on success. 116 116 */ 117 117 HRESULT WINAPI DispGetParam(DISPPARAMS* pdispparams, UINT position, -
trunk/src/oleaut32/initterm.cpp
r6689 r6711 59 59 { 60 60 case DLL_PROCESS_ATTACH: 61 61 return TRUE; 62 62 63 63 case DLL_THREAD_ATTACH: 64 64 case DLL_THREAD_DETACH: 65 65 return TRUE; 66 66 67 67 case DLL_PROCESS_DETACH: 68 69 70 68 ctordtorTerm(); 69 ClosePrivateLogFiles(); 70 return TRUE; 71 71 } 72 72 return FALSE; … … 95 95 case 0 : 96 96 { 97 97 loadNr = globLoadNr++; 98 98 99 100 101 99 DosQueryModuleName(hModule, sizeof(oleaut32Path), oleaut32Path); 100 char *endofpath = strrchr(oleaut32Path, '\\'); 101 *(endofpath+1) = 0; 102 102 103 103 ctordtorInit(); … … 105 105 CheckVersionFromHMOD(PE2LX_VERSION, hModule); /*PLF Wed 98-03-18 05:28:48*/ 106 106 107 108 if(dllHandle == 0) 109 107 dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab); 108 if(dllHandle == 0) 109 return 0UL; 110 110 111 111 #ifdef DEFAULT_LOGGING_OFF 112 112 if(getenv("WIN32LOG_ENABLED")) { 113 113 #else 114 114 if(!getenv("NOWIN32LOG")) { 115 115 #endif 116 117 116 OpenPrivateLogFiles(); 117 } 118 118 Hash_Initialise(); 119 119 … … 122 122 case 1 : 123 123 if(dllHandle) { 124 124 UnregisterLxDll(dllHandle); 125 125 } 126 126 break; -
trunk/src/oleaut32/ole2disp.c
r6689 r6711 1 1 /* 2 * 2 * OLE2DISP library 3 3 * 4 * Copyright 1995Martin von Loewis4 * Copyright 1995 Martin von Loewis 5 5 */ 6 6 #ifdef __WIN32OS2__ … … 31 31 32 32 /****************************************************************************** 33 * BSTR_AllocBytes[Internal]33 * BSTR_AllocBytes [Internal] 34 34 */ 35 35 static BSTR16 BSTR_AllocBytes(int n) … … 56 56 57 57 /****************************************************************************** 58 * SysAllocString16[OLE2DISP.2]58 * SysAllocString16 [OLE2DISP.2] 59 59 */ 60 60 BSTR16 WINAPI SysAllocString16(LPCOLESTR16 in) 61 61 { 62 BSTR16 out; 63 62 BSTR16 out; 63 64 if (!in) return 0; 65 66 out = BSTR_AllocBytes(strlen(in)+1); 67 if(!out)return 0; 68 strcpy(BSTR_GetAddr(out),in); 69 return out; 70 } 71 #endif 72 73 /****************************************************************************** 74 * SysAllocString [OLEAUT32.2] 75 */ 76 BSTR WINAPI SysAllocString(LPCOLESTR in) 77 { 64 78 if (!in) return 0; 65 66 out = BSTR_AllocBytes(strlen(in)+1); 67 if(!out)return 0; 68 strcpy(BSTR_GetAddr(out),in); 69 return out; 70 } 71 #endif 72 73 /****************************************************************************** 74 * SysAllocString [OLEAUT32.2] 75 */ 76 BSTR WINAPI SysAllocString(LPCOLESTR in) 77 { 78 if (!in) return 0; 79 79 80 80 /* Delegate this to the SysAllocStringLen32 method. */ 81 81 return SysAllocStringLen(in, lstrlenW(in)); … … 84 84 #ifndef __WIN32OS2__ 85 85 /****************************************************************************** 86 * SysReAllocString16[OLE2DISP.3]86 * SysReAllocString16 [OLE2DISP.3] 87 87 */ 88 88 INT16 WINAPI SysReAllocString16(LPBSTR16 old,LPCOLESTR16 in) 89 89 { 90 91 92 93 94 } 95 #endif 96 97 /****************************************************************************** 98 * SysReAllocString[OLEAUT32.3]90 BSTR16 new=SysAllocString16(in); 91 BSTR_Free(*old); 92 *old=new; 93 return 1; 94 } 95 #endif 96 97 /****************************************************************************** 98 * SysReAllocString [OLEAUT32.3] 99 99 */ 100 100 INT WINAPI SysReAllocString(LPBSTR old,LPCOLESTR in) … … 103 103 * Sanity check 104 104 */ 105 if (old==NULL) 105 if (old==NULL) 106 106 return 0; 107 107 … … 109 109 * Make sure we free the old string. 110 110 */ 111 if (*old!=NULL) 111 if (*old!=NULL) 112 112 SysFreeString(*old); 113 113 … … 122 122 #ifndef __WIN32OS2__ 123 123 /****************************************************************************** 124 * SysAllocStringLen16[OLE2DISP.4]124 * SysAllocStringLen16 [OLE2DISP.4] 125 125 */ 126 126 BSTR16 WINAPI SysAllocStringLen16(const char *in, int len) 127 127 { 128 129 130 131 128 BSTR16 out=BSTR_AllocBytes(len+1); 129 130 if (!out) 131 return 0; 132 132 133 133 /* … … 137 137 */ 138 138 if (in != 0) 139 139 strcpy(BSTR_GetAddr(out),in); 140 140 else 141 141 memset(BSTR_GetAddr(out), 0, len+1); 142 142 143 143 return out; 144 144 } 145 145 #endif … … 152 152 * he describes it as a "DWORD count of characters". By experimenting with 153 153 * a windows application, this count seems to be a DWORD count of bytes in 154 * the string. Meaning that the count is double the number of wide 154 * the string. Meaning that the count is double the number of wide 155 155 * characters in the string. 156 156 */ … … 214 214 #ifndef __WIN32OS2__ 215 215 /****************************************************************************** 216 * SysReAllocStringLen16[OLE2DISP.5]216 * SysReAllocStringLen16 [OLE2DISP.5] 217 217 */ 218 218 int WINAPI SysReAllocStringLen16(BSTR16 *old,const char *in,int len) 219 219 { 220 BSTR16 new=SysAllocStringLen16(in,len); 221 BSTR_Free(*old); 222 *old=new; 220 BSTR16 new=SysAllocStringLen16(in,len); 221 BSTR_Free(*old); 222 *old=new; 223 return 1; 224 } 225 #endif 226 227 228 /****************************************************************************** 229 * SysReAllocStringLen [OLEAUT32.5] 230 */ 231 int WINAPI SysReAllocStringLen(BSTR* old, const OLECHAR* in, unsigned int len) 232 { 233 /* 234 * Sanity check 235 */ 236 if (old==NULL) 237 return 0; 238 239 /* 240 * Make sure we free the old string. 241 */ 242 if (*old!=NULL) 243 SysFreeString(*old); 244 245 /* 246 * Allocate the new string 247 */ 248 *old = SysAllocStringLen(in, len); 249 223 250 return 1; 224 251 } 225 #endif 226 227 228 /****************************************************************************** 229 * SysReAllocStringLen [OLEAUT32.5] 230 */ 231 int WINAPI SysReAllocStringLen(BSTR* old, const OLECHAR* in, unsigned int len) 232 { 233 /* 234 * Sanity check 235 */ 236 if (old==NULL) 237 return 0; 238 239 /* 240 * Make sure we free the old string. 241 */ 242 if (*old!=NULL) 243 SysFreeString(*old); 244 245 /* 246 * Allocate the new string 247 */ 248 *old = SysAllocStringLen(in, len); 249 250 return 1; 251 } 252 253 #ifndef __WIN32OS2__ 254 /****************************************************************************** 255 * SysFreeString16 [OLE2DISP.6] 252 253 #ifndef __WIN32OS2__ 254 /****************************************************************************** 255 * SysFreeString16 [OLE2DISP.6] 256 256 */ 257 257 void WINAPI SysFreeString16(BSTR16 in) 258 258 { 259 260 } 261 #endif 262 263 /****************************************************************************** 264 * SysFreeString[OLEAUT32.6]259 BSTR_Free(in); 260 } 261 #endif 262 263 /****************************************************************************** 264 * SysFreeString [OLEAUT32.6] 265 265 */ 266 266 void WINAPI SysFreeString(BSTR in) 267 267 { 268 268 DWORD* bufferPointer; 269 269 270 270 /* NULL is a valid parameter */ 271 271 if(!in) return; … … 288 288 #ifndef __WIN32OS2__ 289 289 /****************************************************************************** 290 * SysStringLen16[OLE2DISP.7]290 * SysStringLen16 [OLE2DISP.7] 291 291 */ 292 292 int WINAPI SysStringLen16(BSTR16 str) 293 293 { 294 294 return strlen(BSTR_GetAddr(str)); 295 295 } 296 296 #endif … … 310 310 if (!str) return 0; 311 311 /* 312 * The length of the string (in bytes) is contained in a DWORD placed 312 * The length of the string (in bytes) is contained in a DWORD placed 313 313 * just before the BSTR pointer 314 314 */ … … 334 334 if (!str) return 0; 335 335 /* 336 * The length of the string (in bytes) is contained in a DWORD placed 336 * The length of the string (in bytes) is contained in a DWORD placed 337 337 * just before the BSTR pointer 338 338 */ … … 349 349 */ 350 350 HRESULT WINAPI CreateDispTypeInfo16( 351 352 353 354 { 355 356 351 INTERFACEDATA *pidata, 352 LCID lcid, 353 ITypeInfo **pptinfo) 354 { 355 FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo); 356 return 0; 357 357 } 358 358 #endif … … 362 362 */ 363 363 HRESULT WINAPI CreateDispTypeInfo( 364 365 366 367 { 368 369 364 INTERFACEDATA *pidata, 365 LCID lcid, 366 ITypeInfo **pptinfo) 367 { 368 FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo); 369 return 0; 370 370 } 371 371 … … 377 377 IUnknown* punkOuter, 378 378 void* pvThis, 379 380 381 { 382 379 ITypeInfo* ptinfo, 380 IUnknown** ppunkStdDisp) 381 { 382 FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo, 383 383 ppunkStdDisp); 384 384 return 0; 385 385 } 386 386 #endif … … 392 392 IUnknown* punkOuter, 393 393 void* pvThis, 394 395 396 { 397 394 ITypeInfo* ptinfo, 395 IUnknown** ppunkStdDisp) 396 { 397 FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo, 398 398 ppunkStdDisp); 399 399 return 0; 400 400 } 401 401 … … 405 405 */ 406 406 HRESULT WINAPI RegisterActiveObject16( 407 407 IUnknown *punk, REFCLSID rclsid, DWORD dwFlags, unsigned long *pdwRegister 408 408 ) { 409 410 411 } 412 #endif 413 414 /****************************************************************************** 415 * OleTranslateColor[OLEAUT32.421]409 FIXME("(%p,%s,0x%08lx,%p):stub\n",punk,debugstr_guid(rclsid),dwFlags,pdwRegister); 410 return 0; 411 } 412 #endif 413 414 /****************************************************************************** 415 * OleTranslateColor [OLEAUT32.421] 416 416 * 417 417 * Converts an OLE_COLOR to a COLORREF. 418 418 * See the documentation for conversion rules. 419 * pColorRef can be NULL. In that case the user only wants to test the 419 * pColorRef can be NULL. In that case the user only wants to test the 420 420 * conversion. 421 421 */ -
trunk/src/oleaut32/oleaut.c
r6689 r6711 1 1 /* 2 * 2 * OLEAUT32 3 3 * 4 4 */ … … 17 17 DEFAULT_DEBUG_CHANNEL(ole); 18 18 19 static WCHAR 20 static WCHAR 19 static WCHAR _delimiter[2] = {'!',0}; /* default delimiter apparently */ 20 static WCHAR *pdelimiter = &_delimiter[0]; 21 21 22 22 /*********************************************************************** 23 * 23 * RegisterActiveObject (OLEAUT32.33) 24 24 */ 25 25 HRESULT WINAPI RegisterActiveObject( 26 26 LPUNKNOWN punk,REFCLSID rcid,DWORD dwFlags,LPDWORD pdwRegister 27 27 ) { 28 WCHARguidbuf[80];29 HRESULTret;30 LPRUNNINGOBJECTTABLErunobtable;31 LPMONIKERmoniker;28 WCHAR guidbuf[80]; 29 HRESULT ret; 30 LPRUNNINGOBJECTTABLE runobtable; 31 LPMONIKER moniker; 32 32 33 33 StringFromGUID2(rcid,guidbuf,39); 34 34 #ifdef __WIN32OS2__ 35 35 dprintf(("RegisterActiveObject %x %ls (%x) %x %x", punk, guidbuf, rcid, dwFlags, pdwRegister)); 36 36 #endif 37 38 if (FAILED(ret)) 39 40 41 42 43 44 45 46 47 48 37 ret = CreateItemMoniker(pdelimiter,guidbuf,&moniker); 38 if (FAILED(ret)) 39 return ret; 40 ret = GetRunningObjectTable(0,&runobtable); 41 if (FAILED(ret)) { 42 IMoniker_Release(moniker); 43 return ret; 44 } 45 ret = IRunningObjectTable_Register(runobtable,dwFlags,punk,moniker,pdwRegister); 46 IRunningObjectTable_Release(runobtable); 47 IMoniker_Release(moniker); 48 return ret; 49 49 } 50 50 51 51 /*********************************************************************** 52 * 52 * RevokeActiveObject (OLEAUT32.34) 53 53 */ 54 54 HRESULT WINAPI RevokeActiveObject(DWORD xregister,LPVOID reserved) 55 55 { 56 LPRUNNINGOBJECTTABLErunobtable;57 HRESULTret;56 LPRUNNINGOBJECTTABLE runobtable; 57 HRESULT ret; 58 58 59 59 #ifdef __WIN32OS2__ … … 61 61 #endif 62 62 63 64 65 66 67 68 63 ret = GetRunningObjectTable(0,&runobtable); 64 if (FAILED(ret)) return ret; 65 ret = IRunningObjectTable_Revoke(runobtable,xregister); 66 if (SUCCEEDED(ret)) ret = S_OK; 67 IRunningObjectTable_Release(runobtable); 68 return ret; 69 69 } 70 70 71 71 /*********************************************************************** 72 * 72 * GetActiveObject (OLEAUT32.35) 73 73 */ 74 74 HRESULT WINAPI GetActiveObject(REFCLSID rcid,LPVOID preserved,LPUNKNOWN *ppunk) 75 75 { 76 WCHARguidbuf[80];77 HRESULTret;78 LPRUNNINGOBJECTTABLErunobtable;79 LPMONIKERmoniker;76 WCHAR guidbuf[80]; 77 HRESULT ret; 78 LPRUNNINGOBJECTTABLE runobtable; 79 LPMONIKER moniker; 80 80 81 81 StringFromGUID2(rcid,guidbuf,39); 82 82 #ifdef __WIN32OS2__ 83 83 dprintf(("GetActiveObject %ls (%x) %x %x", guidbuf, rcid, preserved, ppunk)); 84 84 #endif 85 86 if (FAILED(ret)) 87 88 89 90 91 92 93 94 95 96 85 ret = CreateItemMoniker(pdelimiter,guidbuf,&moniker); 86 if (FAILED(ret)) 87 return ret; 88 ret = GetRunningObjectTable(0,&runobtable); 89 if (FAILED(ret)) { 90 IMoniker_Release(moniker); 91 return ret; 92 } 93 ret = IRunningObjectTable_GetObject(runobtable,moniker,ppunk); 94 IRunningObjectTable_Release(runobtable); 95 IMoniker_Release(moniker); 96 return ret; 97 97 } 98 98 … … 101 101 * 102 102 * known OLEAUT32.DLL versions: 103 * OLE 2.1 NT 1993-9510 3023104 * OLE 2.1 105 * OLE 2.20 W95/NT 1993-9620 4112106 * OLE 2.20 W95/NT 1993-9620 4118107 * OLE 2.20 W95/NT 1993-9620 4122108 * OLE 2.30 W95/NT 1993-9830 4265109 * OLE 2.40 NT?? 1993-9840 4267110 * OLE 2.40 W98 SE orig. file 1993-9840 4275103 * OLE 2.1 NT 1993-95 10 3023 104 * OLE 2.1 10 3027 105 * OLE 2.20 W95/NT 1993-96 20 4112 106 * OLE 2.20 W95/NT 1993-96 20 4118 107 * OLE 2.20 W95/NT 1993-96 20 4122 108 * OLE 2.30 W95/NT 1993-98 30 4265 109 * OLE 2.40 NT?? 1993-98 40 4267 110 * OLE 2.40 W98 SE orig. file 1993-98 40 4275 111 111 */ 112 112 UINT WINAPI OaBuildVersion() … … 120 120 { 121 121 case 0x80000a03: /* WIN31 */ 122 122 return MAKELONG(4049, 20); /* from Win32s 1.1e */ 123 123 case 0x80000004: /* WIN95 */ 124 124 return MAKELONG(4265, 30); 125 125 case 0x80000a04: /* WIN98 */ 126 126 return MAKELONG(4275, 40); /* value of W98 SE; orig. W98 AFAIK has 4265, 30 just as W95 */ 127 127 case 0x00003303: /* NT351 */ 128 128 return MAKELONG(4265, 30); /* value borrowed from Win95 */ 129 129 case 0x00000004: /* NT40 */ 130 130 #ifdef __WIN32OS2__ 131 131 return 0x2810b5; //returned by NT4, SP6 132 132 #else 133 133 return MAKELONG(4122, 20); /* ouch ! Quite old, I guess */ 134 134 #endif 135 135 default: 136 137 136 ERR("Version value not known yet. Please investigate it !\n"); 137 return 0x0; 138 138 } 139 139 } … … 141 141 #ifndef __WIN32OS2__ 142 142 /*********************************************************************** 143 * 143 * DllRegisterServer 144 144 */ 145 HRESULT WINAPI OLEAUT32_DllRegisterServer() { 145 HRESULT WINAPI OLEAUT32_DllRegisterServer() { 146 146 FIXME("stub!\n"); 147 147 return S_OK; … … 149 149 150 150 /*********************************************************************** 151 * 151 * DllUnregisterServer 152 152 */ 153 153 HRESULT WINAPI OLEAUT32_DllUnregisterServer() { -
trunk/src/oleaut32/olefont.c
r6689 r6711 46 46 { 47 47 /* 48 * This class supports many interfaces. IUnknown, IFont, 48 * This class supports many interfaces. IUnknown, IFont, 49 49 * IDispatch, IDispFont IPersistStream and IConnectionPointContainer. 50 50 * The first two are supported by the first vtable, the next two are … … 85 85 86 86 /* 87 * Here, I define utility macros to help with the casting of the 87 * Here, I define utility macros to help with the casting of the 88 88 * "this" parameter. 89 89 * There is a version to accomodate all of the VTables implemented … … 91 91 */ 92 92 #define _ICOM_THIS(class,name) class* this = (class*)name; 93 #define _ICOM_THIS_From_IDispatch(class, name) class* this = (class*)(((char*)name)-sizeof(void*)); 94 #define _ICOM_THIS_From_IPersistStream(class, name) class* this = (class*)(((char*)name)-2*sizeof(void*)); 95 #define _ICOM_THIS_From_IConnectionPointContainer(class, name) class* this = (class*)(((char*)name)-3*sizeof(void*)); 93 #define _ICOM_THIS_From_IDispatch(class, name) class* this = (class*)(((char*)name)-sizeof(void*)); 94 #define _ICOM_THIS_From_IPersistStream(class, name) class* this = (class*)(((char*)name)-2*sizeof(void*)); 95 #define _ICOM_THIS_From_IConnectionPointContainer(class, name) class* this = (class*)(((char*)name)-3*sizeof(void*)); 96 96 97 97 … … 134 134 * interface 135 135 */ 136 static HRESULT WINAPI OLEFontImpl_IDispatch_QueryInterface(IDispatch* iface, 137 REFIID riid, 138 136 static HRESULT WINAPI OLEFontImpl_IDispatch_QueryInterface(IDispatch* iface, 137 REFIID riid, 138 VOID** ppvoid); 139 139 static ULONG WINAPI OLEFontImpl_IDispatch_AddRef(IDispatch* iface); 140 140 static ULONG WINAPI OLEFontImpl_IDispatch_Release(IDispatch* iface); 141 static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount(IDispatch* iface, 142 143 static HRESULT WINAPI OLEFontImpl_GetTypeInfo(IDispatch* iface, 144 145 LCID lcid, 146 141 static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount(IDispatch* iface, 142 unsigned int* pctinfo); 143 static HRESULT WINAPI OLEFontImpl_GetTypeInfo(IDispatch* iface, 144 UINT iTInfo, 145 LCID lcid, 146 ITypeInfo** ppTInfo); 147 147 static HRESULT WINAPI OLEFontImpl_GetIDsOfNames(IDispatch* iface, 148 REFIID riid, 149 LPOLESTR* rgszNames, 150 UINT cNames, 151 152 148 REFIID riid, 149 LPOLESTR* rgszNames, 150 UINT cNames, 151 LCID lcid, 152 DISPID* rgDispId); 153 153 static HRESULT WINAPI OLEFontImpl_Invoke(IDispatch* iface, 154 DISPID dispIdMember, 155 REFIID riid, 156 LCID lcid, 157 158 159 VARIANT* pVarResult, 160 161 UINT* puArgErr); 154 DISPID dispIdMember, 155 REFIID riid, 156 LCID lcid, 157 WORD wFlags, 158 DISPPARAMS* pDispParams, 159 VARIANT* pVarResult, 160 EXCEPINFO* pExepInfo, 161 UINT* puArgErr); 162 162 163 163 /*********************************************************************** … … 165 165 * interface 166 166 */ 167 static HRESULT WINAPI OLEFontImpl_IPersistStream_QueryInterface(IPersistStream* iface, 168 REFIID riid, 169 167 static HRESULT WINAPI OLEFontImpl_IPersistStream_QueryInterface(IPersistStream* iface, 168 REFIID riid, 169 VOID** ppvoid); 170 170 static ULONG WINAPI OLEFontImpl_IPersistStream_AddRef(IPersistStream* iface); 171 171 static ULONG WINAPI OLEFontImpl_IPersistStream_Release(IPersistStream* iface); 172 static HRESULT WINAPI OLEFontImpl_GetClassID(IPersistStream* iface, 173 172 static HRESULT WINAPI OLEFontImpl_GetClassID(IPersistStream* iface, 173 CLSID* pClassID); 174 174 static HRESULT WINAPI OLEFontImpl_IsDirty(IPersistStream* iface); 175 175 static HRESULT WINAPI OLEFontImpl_Load(IPersistStream* iface, 176 176 IStream* pLoadStream); 177 177 static HRESULT WINAPI OLEFontImpl_Save(IPersistStream* iface, 178 179 BOOL fClearDirty); 178 IStream* pOutStream, 179 BOOL fClearDirty); 180 180 static HRESULT WINAPI OLEFontImpl_GetSizeMax(IPersistStream* iface, 181 ULARGE_INTEGER* pcbSize); 181 ULARGE_INTEGER* pcbSize); 182 182 183 183 /*********************************************************************** … … 186 186 */ 187 187 static HRESULT WINAPI OLEFontImpl_IConnectionPointContainer_QueryInterface( 188 IConnectionPointContainer* iface, 189 REFIID riid, 190 188 IConnectionPointContainer* iface, 189 REFIID riid, 190 VOID** ppvoid); 191 191 static ULONG WINAPI OLEFontImpl_IConnectionPointContainer_AddRef( 192 192 IConnectionPointContainer* iface); 193 193 static ULONG WINAPI OLEFontImpl_IConnectionPointContainer_Release( 194 194 IConnectionPointContainer* iface); 195 195 static HRESULT WINAPI OLEFontImpl_EnumConnectionPoints( 196 197 196 IConnectionPointContainer* iface, 197 IEnumConnectionPoints **ppEnum); 198 198 static HRESULT WINAPI OLEFontImpl_FindConnectionPoint( 199 200 201 199 IConnectionPointContainer* iface, 200 REFIID riid, 201 IConnectionPoint **ppCp); 202 202 203 203 /* … … 227 227 OLEFontImpl_put_Charset, 228 228 OLEFontImpl_get_hFont, 229 OLEFontImpl_Clone, 229 OLEFontImpl_Clone, 230 230 OLEFontImpl_IsEqual, 231 231 OLEFontImpl_SetRatio, … … 273 273 274 274 /****************************************************************************** 275 * OleCreateFontIndirect[OLEAUT32.420]275 * OleCreateFontIndirect [OLEAUT32.420] 276 276 */ 277 277 HRESULT WINAPI OleCreateFontIndirect( … … 331 331 332 332 IConnectionPoint_EnumConnections(this->pCP, &pEnum); 333 333 334 334 while(IEnumConnections_Next(pEnum, 1, &CD, NULL) == S_OK) { 335 335 IPropertyNotifySink *sink; … … 343 343 return; 344 344 } 345 345 346 346 /************************************************************************ 347 347 * OLEFontImpl_Construct … … 364 364 if (newObject==0) 365 365 return newObject; 366 366 367 367 /* 368 368 * Initialize the virtual function table. … … 372 372 newObject->lpvtbl3 = &OLEFontImpl_IPersistStream_VTable; 373 373 newObject->lpvtbl4 = &OLEFontImpl_IConnectionPointContainer_VTable; 374 375 /* 376 * Start with one reference count. The caller of this function 374 375 /* 376 * Start with one reference count. The caller of this function 377 377 * must release the interface pointer when it is done. 378 378 */ … … 386 386 newObject->description.cbSizeofstruct = sizeof(FONTDESC); 387 387 newObject->description.lpstrName = HeapAlloc(GetProcessHeap(), 388 0, 389 388 0, 389 (lstrlenW(fontDesc->lpstrName)+1) * sizeof(WCHAR)); 390 390 strcpyW(newObject->description.lpstrName, fontDesc->lpstrName); 391 391 newObject->description.cySize = fontDesc->cySize; … … 448 448 if ( (this==0) || (ppvObject==0) ) 449 449 return E_INVALIDARG; 450 450 451 451 /* 452 452 * Initialize the return parameter. 453 453 */ 454 454 *ppvObject = 0; 455 455 456 456 /* 457 457 * Compare the riid with the interface IDs implemented by this object. 458 458 */ 459 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 459 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 460 460 { 461 461 *ppvObject = (IFont*)this; 462 462 } 463 else if (memcmp(&IID_IFont, riid, sizeof(IID_IFont)) == 0) 463 else if (memcmp(&IID_IFont, riid, sizeof(IID_IFont)) == 0) 464 464 { 465 465 *ppvObject = (IFont*)this; 466 466 } 467 else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 467 else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 468 468 { 469 469 *ppvObject = (IDispatch*)&(this->lpvtbl2); 470 470 } 471 else if (memcmp(&IID_IFontDisp, riid, sizeof(IID_IFontDisp)) == 0) 471 else if (memcmp(&IID_IFontDisp, riid, sizeof(IID_IFontDisp)) == 0) 472 472 { 473 473 *ppvObject = (IDispatch*)&(this->lpvtbl2); 474 474 } 475 else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 475 else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 476 476 { 477 477 *ppvObject = (IPersistStream*)&(this->lpvtbl3); 478 478 } 479 479 else if (memcmp(&IID_IConnectionPointContainer, riid, 480 sizeof(IID_IConnectionPointContainer)) == 0) 480 sizeof(IID_IConnectionPointContainer)) == 0) 481 481 { 482 482 *ppvObject = (IPersistStream*)&(this->lpvtbl4); 483 483 } 484 484 485 485 /* 486 486 * Check that we obtained an interface. … … 491 491 return E_NOINTERFACE; 492 492 } 493 493 494 494 /* 495 495 * Query Interface always increases the reference count by one when it is … … 500 500 return S_OK;; 501 501 } 502 502 503 503 /************************************************************************ 504 504 * OLEFontImpl_AddRef (IUnknown) … … 506 506 * See Windows documentation for more details on IUnknown methods. 507 507 */ 508 ULONG WINAPI OLEFontImpl_AddRef( 508 ULONG WINAPI OLEFontImpl_AddRef( 509 509 IFont* iface) 510 510 { … … 515 515 return this->ref; 516 516 } 517 517 518 518 /************************************************************************ 519 519 * OLEFontImpl_Release (IUnknown) … … 521 521 * See Windows documentation for more details on IUnknown methods. 522 522 */ 523 ULONG WINAPI OLEFontImpl_Release( 523 ULONG WINAPI OLEFontImpl_Release( 524 524 IFont* iface) 525 525 { … … 541 541 return 0; 542 542 } 543 543 544 544 return this->ref; 545 545 } 546 546 547 547 /************************************************************************ 548 548 * OLEFontImpl_get_Name (IFont) … … 551 551 */ 552 552 static HRESULT WINAPI OLEFontImpl_get_Name( 553 IFont* iface, 553 IFont* iface, 554 554 BSTR* pname) 555 555 { … … 576 576 */ 577 577 static HRESULT WINAPI OLEFontImpl_put_Name( 578 IFont* iface, 578 IFont* iface, 579 579 BSTR name) 580 580 { … … 585 585 { 586 586 this->description.lpstrName = HeapAlloc(GetProcessHeap(), 587 0, 588 587 0, 588 (lstrlenW(name)+1) * sizeof(WCHAR)); 589 589 } 590 590 else 591 591 { 592 592 this->description.lpstrName = HeapReAlloc(GetProcessHeap(), 593 0, 594 595 593 0, 594 this->description.lpstrName, 595 (lstrlenW(name)+1) * sizeof(WCHAR)); 596 596 } 597 597 … … 611 611 */ 612 612 static HRESULT WINAPI OLEFontImpl_get_Size( 613 IFont* iface, 613 IFont* iface, 614 614 CY* psize) 615 615 { … … 635 635 */ 636 636 static HRESULT WINAPI OLEFontImpl_put_Size( 637 IFont* iface, 637 IFont* iface, 638 638 CY size) 639 639 { … … 653 653 */ 654 654 static HRESULT WINAPI OLEFontImpl_get_Bold( 655 IFont* iface, 655 IFont* iface, 656 656 BOOL* pbold) 657 657 { … … 692 692 */ 693 693 static HRESULT WINAPI OLEFontImpl_get_Italic( 694 IFont* iface, 694 IFont* iface, 695 695 BOOL* pitalic) 696 696 { … … 714 714 */ 715 715 static HRESULT WINAPI OLEFontImpl_put_Italic( 716 IFont* iface, 716 IFont* iface, 717 717 BOOL italic) 718 718 { … … 732 732 */ 733 733 static HRESULT WINAPI OLEFontImpl_get_Underline( 734 IFont* iface, 734 IFont* iface, 735 735 BOOL* punderline) 736 736 { … … 773 773 */ 774 774 static HRESULT WINAPI OLEFontImpl_get_Strikethrough( 775 IFont* iface, 775 IFont* iface, 776 776 BOOL* pstrikethrough) 777 777 { … … 796 796 */ 797 797 static HRESULT WINAPI OLEFontImpl_put_Strikethrough( 798 IFont* iface, 798 IFont* iface, 799 799 BOOL strikethrough) 800 800 { … … 814 814 */ 815 815 static HRESULT WINAPI OLEFontImpl_get_Weight( 816 IFont* iface, 816 IFont* iface, 817 817 short* pweight) 818 818 { … … 837 837 */ 838 838 static HRESULT WINAPI OLEFontImpl_put_Weight( 839 IFont* iface, 839 IFont* iface, 840 840 short weight) 841 841 { … … 855 855 */ 856 856 static HRESULT WINAPI OLEFontImpl_get_Charset( 857 IFont* iface, 857 IFont* iface, 858 858 short* pcharset) 859 859 { … … 878 878 */ 879 879 static HRESULT WINAPI OLEFontImpl_put_Charset( 880 IFont* iface, 880 IFont* iface, 881 881 short charset) 882 882 { … … 912 912 INT fontHeight; 913 913 CY cySize; 914 914 915 915 /* 916 916 * The height of the font returned by the get_Size property is the … … 982 982 */ 983 983 newObject->description.lpstrName = HeapAlloc( 984 985 984 GetProcessHeap(),0, 985 (1+strlenW(this->description.lpstrName))*2 986 986 ); 987 987 /* We need to clone the HFONT too. This is just cut & paste from above */ … … 994 994 995 995 logFont.lfHeight = ((fontHeight%10000L)>5000L) ? (-fontHeight/10000L)-1 : 996 996 (-fontHeight/10000L); 997 997 logFont.lfItalic = this->description.fItalic; 998 998 logFont.lfUnderline = this->description.fUnderline; … … 1023 1023 */ 1024 1024 static HRESULT WINAPI OLEFontImpl_IsEqual( 1025 IFont* iface, 1025 IFont* iface, 1026 1026 IFont* pFontOther) 1027 1027 { … … 1055 1055 */ 1056 1056 static HRESULT WINAPI OLEFontImpl_QueryTextMetrics( 1057 IFont* iface, 1057 IFont* iface, 1058 1058 TEXTMETRICOLE* ptm) 1059 1059 { … … 1068 1068 */ 1069 1069 static HRESULT WINAPI OLEFontImpl_AddRefHfont( 1070 IFont* iface, 1070 IFont* iface, 1071 1071 HFONT hfont) 1072 1072 { … … 1107 1107 { 1108 1108 DeleteObject(this->gdiFont); 1109 this->gdiFont = 0; 1109 this->gdiFont = 0; 1110 1110 } 1111 1111 … … 1174 1174 */ 1175 1175 static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount( 1176 IDispatch* iface, 1176 IDispatch* iface, 1177 1177 unsigned int* pctinfo) 1178 1178 { … … 1189 1189 */ 1190 1190 static HRESULT WINAPI OLEFontImpl_GetTypeInfo( 1191 IDispatch* iface, 1191 IDispatch* iface, 1192 1192 UINT iTInfo, 1193 LCID lcid, 1193 LCID lcid, 1194 1194 ITypeInfo** ppTInfo) 1195 1195 { … … 1207 1207 static HRESULT WINAPI OLEFontImpl_GetIDsOfNames( 1208 1208 IDispatch* iface, 1209 REFIID riid, 1210 LPOLESTR* rgszNames, 1211 UINT cNames, 1209 REFIID riid, 1210 LPOLESTR* rgszNames, 1211 UINT cNames, 1212 1212 LCID lcid, 1213 1213 DISPID* rgDispId) … … 1226 1226 static HRESULT WINAPI OLEFontImpl_Invoke( 1227 1227 IDispatch* iface, 1228 DISPID dispIdMember, 1229 REFIID riid, 1230 LCID lcid, 1228 DISPID dispIdMember, 1229 REFIID riid, 1230 LCID lcid, 1231 1231 WORD wFlags, 1232 1232 DISPPARAMS* pDispParams, 1233 VARIANT* pVarResult, 1233 VARIANT* pVarResult, 1234 1234 EXCEPINFO* pExepInfo, 1235 1235 UINT* puArgErr) … … 1289 1289 */ 1290 1290 static HRESULT WINAPI OLEFontImpl_GetClassID( 1291 IPersistStream* iface, 1291 IPersistStream* iface, 1292 1292 CLSID* pClassID) 1293 1293 { … … 1343 1343 1344 1344 _ICOM_THIS_From_IPersistStream(OLEFontImpl, iface); 1345 1345 1346 1346 /* 1347 1347 * Read the version byte … … 1372 1372 this->description.fStrikethrough = (bAttributes & FONTPERSIST_STRIKETHROUGH) != 0; 1373 1373 this->description.fUnderline = (bAttributes & FONTPERSIST_UNDERLINE) != 0; 1374 1374 1375 1375 /* 1376 1376 * Weight … … 1408 1408 HeapFree(GetProcessHeap(), 0, this->description.lpstrName); 1409 1409 1410 this->description.lpstrName = HEAP_strdupAtoW(GetProcessHeap(), 1411 1412 1410 this->description.lpstrName = HEAP_strdupAtoW(GetProcessHeap(), 1411 HEAP_ZERO_MEMORY, 1412 readBuffer); 1413 1413 1414 1414 return S_OK; … … 1430 1430 BYTE bAttributes; 1431 1431 BYTE bStringSize; 1432 1432 1433 1433 _ICOM_THIS_From_IPersistStream(OLEFontImpl, iface); 1434 1434 … … 1459 1459 if (this->description.fStrikethrough) 1460 1460 bAttributes |= FONTPERSIST_STRIKETHROUGH; 1461 1461 1462 1462 if (this->description.fUnderline) 1463 1463 bAttributes |= FONTPERSIST_UNDERLINE; … … 1467 1467 if (cbWritten!=1) 1468 1468 return E_FAIL; 1469 1469 1470 1470 /* 1471 1471 * Weight … … 1499 1499 if (bStringSize!=0) 1500 1500 { 1501 writeBuffer = HEAP_strdupWtoA(GetProcessHeap(), 1502 1503 1501 writeBuffer = HEAP_strdupWtoA(GetProcessHeap(), 1502 HEAP_ZERO_MEMORY, 1503 this->description.lpstrName); 1504 1504 1505 1505 if (writeBuffer==0) … … 1507 1507 1508 1508 IStream_Write(pOutStream, writeBuffer, bStringSize, &cbWritten); 1509 1509 1510 1510 HeapFree(GetProcessHeap(), 0, writeBuffer); 1511 1511 … … 1620 1620 if(memcmp(riid, &IID_IPropertyNotifySink, sizeof(IID_IPropertyNotifySink)) == 0) { 1621 1621 return IConnectionPoint_QueryInterface(this->pCP, &IID_IConnectionPoint, 1622 1622 (LPVOID)ppCp); 1623 1623 } else { 1624 1624 FIXME("Tried to find connection point on %s\n", debugstr_guid(riid)); … … 1637 1637 } IClassFactoryImpl; 1638 1638 1639 static HRESULT WINAPI 1639 static HRESULT WINAPI 1640 1640 SFCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { 1641 1642 1643 1644 1641 ICOM_THIS(IClassFactoryImpl,iface); 1642 1643 FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj); 1644 return E_NOINTERFACE; 1645 1645 } 1646 1646 1647 1647 static ULONG WINAPI 1648 1648 SFCF_AddRef(LPCLASSFACTORY iface) { 1649 1650 1649 ICOM_THIS(IClassFactoryImpl,iface); 1650 return ++(This->ref); 1651 1651 } 1652 1652 1653 1653 static ULONG WINAPI SFCF_Release(LPCLASSFACTORY iface) { 1654 1655 1656 1654 ICOM_THIS(IClassFactoryImpl,iface); 1655 /* static class, won't be freed */ 1656 return --(This->ref); 1657 1657 } 1658 1658 1659 1659 static HRESULT WINAPI SFCF_CreateInstance( 1660 1660 LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj 1661 1661 ) { 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 fd.sWeight= 0;1674 1675 fd.fItalic= 0;1676 1677 1678 1679 1680 1681 1682 1662 ICOM_THIS(IClassFactoryImpl,iface); 1663 1664 if (IsEqualGUID(riid,&IID_IFont)) { 1665 FONTDESC fd; 1666 1667 WCHAR fname[] = { 'S','y','s','t','e','m',0 }; 1668 1669 fd.cbSizeofstruct = sizeof(fd); 1670 fd.lpstrName = fname; 1671 fd.cySize.s.Lo = 80000; 1672 fd.cySize.s.Hi = 0; 1673 fd.sWeight = 0; 1674 fd.sCharset = 0; 1675 fd.fItalic = 0; 1676 fd.fUnderline = 0; 1677 fd.fStrikethrough = 0; 1678 return OleCreateFontIndirect(&fd,riid,ppobj); 1679 } 1680 1681 FIXME("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); 1682 return E_NOINTERFACE; 1683 1683 } 1684 1684 1685 1685 static HRESULT WINAPI SFCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { 1686 1687 1688 1686 ICOM_THIS(IClassFactoryImpl,iface); 1687 FIXME("(%p)->(%d),stub!\n",This,dolock); 1688 return S_OK; 1689 1689 } 1690 1690 1691 1691 static ICOM_VTABLE(IClassFactory) SFCF_Vtbl = { 1692 1693 1694 1695 1696 1697 1692 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 1693 SFCF_QueryInterface, 1694 SFCF_AddRef, 1695 SFCF_Release, 1696 SFCF_CreateInstance, 1697 SFCF_LockServer 1698 1698 }; 1699 1699 static IClassFactoryImpl STDFONT_CF = {&SFCF_Vtbl, 1 }; -
trunk/src/oleaut32/olepicture.c
r6689 r6711 50 50 #ifdef HAVE_LIBJPEG 51 51 /* This is a hack, so jpeglib.h does not redefine INT32 and the like*/ 52 #define XMD_H 52 #define XMD_H 53 53 #ifdef HAVE_JPEGLIB_H 54 54 # include <jpeglib.h> … … 90 90 /* We own the object and must destroy it ourselves */ 91 91 BOOL fOwn; 92 92 93 93 /* Picture description */ 94 94 PICTDESC desc; … … 105 105 106 106 BOOL keepOrigFormat; 107 HDC 107 HDC hDCCur; 108 108 } OLEPictureImpl; 109 109 … … 174 174 if (newObject==0) 175 175 return newObject; 176 176 177 177 /* 178 178 * Initialize the virtual function table. … … 186 186 187 187 /* 188 * Start with one reference count. The caller of this function 188 * Start with one reference count. The caller of this function 189 189 * must release the interface pointer when it is done. 190 190 */ 191 newObject->ref 192 newObject->hDCCur 193 194 newObject->fOwn 191 newObject->ref = 1; 192 newObject->hDCCur = 0; 193 194 newObject->fOwn = fOwn; 195 195 196 196 /* dunno about original value */ … … 199 199 if (pictDesc) { 200 200 if(pictDesc->cbSizeofstruct != sizeof(PICTDESC)) { 201 201 FIXME("struct size = %d\n", pictDesc->cbSizeofstruct); 202 202 } 203 203 memcpy(&newObject->desc, pictDesc, sizeof(PICTDESC)); … … 206 206 switch(pictDesc->picType) { 207 207 case PICTYPE_BITMAP: 208 209 208 OLEPictureImpl_SetBitmap(newObject); 209 break; 210 210 211 211 case PICTYPE_METAFILE: 212 213 214 215 212 TRACE("metafile handle %08x\n", pictDesc->u.wmf.hmeta); 213 newObject->himetricWidth = pictDesc->u.wmf.xExt; 214 newObject->himetricHeight = pictDesc->u.wmf.yExt; 215 break; 216 216 217 217 case PICTYPE_ICON: 218 218 case PICTYPE_ENHMETAFILE: 219 219 default: 220 221 222 220 FIXME("Unsupported type %d\n", pictDesc->picType); 221 newObject->himetricWidth = newObject->himetricHeight = 0; 222 break; 223 223 } 224 224 } else { 225 225 newObject->desc.picType = PICTYPE_UNINITIALIZED; 226 226 } 227 227 228 228 TRACE("returning %p\n", newObject); 229 229 return newObject; … … 237 237 * this object. */ 238 238 static void OLEPictureImpl_Destroy(OLEPictureImpl* Obj) 239 { 239 { 240 240 TRACE("(%p)\n", Obj); 241 241 … … 282 282 if ( (This==0) || (ppvObject==0) ) 283 283 return E_INVALIDARG; 284 284 285 285 /* 286 286 * Initialize the return parameter. 287 287 */ 288 288 *ppvObject = 0; 289 289 290 290 /* 291 291 * Compare the riid with the interface IDs implemented by this object. 292 292 */ 293 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 293 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 294 294 { 295 295 *ppvObject = (IPicture*)This; 296 296 } 297 else if (memcmp(&IID_IPicture, riid, sizeof(IID_IPicture)) == 0) 297 else if (memcmp(&IID_IPicture, riid, sizeof(IID_IPicture)) == 0) 298 298 { 299 299 *ppvObject = (IPicture*)This; 300 300 } 301 else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 301 else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 302 302 { 303 303 *ppvObject = (IDispatch*)&(This->lpvtbl2); 304 304 } 305 else if (memcmp(&IID_IPictureDisp, riid, sizeof(IID_IPictureDisp)) == 0) 305 else if (memcmp(&IID_IPictureDisp, riid, sizeof(IID_IPictureDisp)) == 0) 306 306 { 307 307 *ppvObject = (IDispatch*)&(This->lpvtbl2); 308 308 } 309 else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 309 else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 310 310 { 311 311 *ppvObject = (IPersistStream*)&(This->lpvtbl3); 312 312 } 313 else if (memcmp(&IID_IConnectionPointContainer, riid, sizeof(IID_IConnectionPointContainer)) == 0) 313 else if (memcmp(&IID_IConnectionPointContainer, riid, sizeof(IID_IConnectionPointContainer)) == 0) 314 314 { 315 315 *ppvObject = (IConnectionPointContainer*)&(This->lpvtbl4); … … 323 323 return E_NOINTERFACE; 324 324 } 325 325 326 326 /* 327 327 * Query Interface always increases the reference count by one when it is … … 362 362 * See Windows documentation for more details on IUnknown methods. 363 363 */ 364 static ULONG WINAPI OLEPictureImpl_AddRef( 364 static ULONG WINAPI OLEPictureImpl_AddRef( 365 365 IPicture* iface) 366 366 { … … 371 371 return This->ref; 372 372 } 373 373 374 374 /************************************************************************ 375 375 * OLEPictureImpl_Release (IUnknown) … … 377 377 * See Windows documentation for more details on IUnknown methods. 378 378 */ 379 static ULONG WINAPI OLEPictureImpl_Release( 379 static ULONG WINAPI OLEPictureImpl_Release( 380 380 IPicture* iface) 381 381 { … … 397 397 return 0; 398 398 } 399 399 400 400 return This->ref; 401 401 } … … 404 404 /************************************************************************ 405 405 * OLEPictureImpl_get_Handle 406 */ 406 */ 407 407 static HRESULT WINAPI OLEPictureImpl_get_Handle(IPicture *iface, 408 408 OLE_HANDLE *phandle) 409 409 { 410 410 ICOM_THIS(OLEPictureImpl, iface); … … 433 433 /************************************************************************ 434 434 * OLEPictureImpl_get_hPal 435 */ 435 */ 436 436 static HRESULT WINAPI OLEPictureImpl_get_hPal(IPicture *iface, 437 437 OLE_HANDLE *phandle) 438 438 { 439 439 ICOM_THIS(OLEPictureImpl, iface); … … 444 444 /************************************************************************ 445 445 * OLEPictureImpl_get_Type 446 */ 446 */ 447 447 static HRESULT WINAPI OLEPictureImpl_get_Type(IPicture *iface, 448 448 short *ptype) 449 449 { 450 450 ICOM_THIS(OLEPictureImpl, iface); … … 456 456 /************************************************************************ 457 457 * OLEPictureImpl_get_Width 458 */ 458 */ 459 459 static HRESULT WINAPI OLEPictureImpl_get_Width(IPicture *iface, 460 460 OLE_XSIZE_HIMETRIC *pwidth) 461 461 { 462 462 ICOM_THIS(OLEPictureImpl, iface); … … 468 468 /************************************************************************ 469 469 * OLEPictureImpl_get_Height 470 */ 470 */ 471 471 static HRESULT WINAPI OLEPictureImpl_get_Height(IPicture *iface, 472 472 OLE_YSIZE_HIMETRIC *pheight) 473 473 { 474 474 ICOM_THIS(OLEPictureImpl, iface); … … 480 480 /************************************************************************ 481 481 * OLEPictureImpl_Render 482 */ 482 */ 483 483 static HRESULT WINAPI OLEPictureImpl_Render(IPicture *iface, HDC hdc, 484 485 486 487 488 489 484 long x, long y, long cx, long cy, 485 OLE_XPOS_HIMETRIC xSrc, 486 OLE_YPOS_HIMETRIC ySrc, 487 OLE_XSIZE_HIMETRIC cxSrc, 488 OLE_YSIZE_HIMETRIC cySrc, 489 LPCRECT prcWBounds) 490 490 { 491 491 ICOM_THIS(OLEPictureImpl, iface); 492 492 TRACE("(%p)->(%08x, (%ld,%ld), (%ld,%ld) <- (%ld,%ld), (%ld,%ld), %p)\n", 493 493 This, hdc, x, y, cx, cy, xSrc, ySrc, cxSrc, cySrc, prcWBounds); 494 494 if(prcWBounds) 495 495 TRACE("prcWBounds (%d,%d) - (%d,%d)\n", prcWBounds->left, prcWBounds->top, 496 496 prcWBounds->right, prcWBounds->bottom); 497 497 498 498 /* … … 542 542 /************************************************************************ 543 543 * OLEPictureImpl_set_hPal 544 */ 544 */ 545 545 static HRESULT WINAPI OLEPictureImpl_set_hPal(IPicture *iface, 546 546 OLE_HANDLE hpal) 547 547 { 548 548 ICOM_THIS(OLEPictureImpl, iface); … … 554 554 /************************************************************************ 555 555 * OLEPictureImpl_get_CurDC 556 */ 556 */ 557 557 static HRESULT WINAPI OLEPictureImpl_get_CurDC(IPicture *iface, 558 558 HDC *phdc) 559 559 { 560 560 ICOM_THIS(OLEPictureImpl, iface); … … 566 566 /************************************************************************ 567 567 * OLEPictureImpl_SelectPicture 568 */ 568 */ 569 569 static HRESULT WINAPI OLEPictureImpl_SelectPicture(IPicture *iface, 570 571 572 570 HDC hdcIn, 571 HDC *phdcOut, 572 OLE_HANDLE *phbmpOut) 573 573 { 574 574 ICOM_THIS(OLEPictureImpl, iface); … … 578 578 579 579 if (phdcOut) 580 580 *phdcOut = This->hDCCur; 581 581 This->hDCCur = hdcIn; 582 582 if (phbmpOut) 583 583 *phbmpOut = This->desc.u.bmp.hbitmap; 584 584 return S_OK; 585 585 } else { … … 591 591 /************************************************************************ 592 592 * OLEPictureImpl_get_KeepOriginalFormat 593 */ 593 */ 594 594 static HRESULT WINAPI OLEPictureImpl_get_KeepOriginalFormat(IPicture *iface, 595 595 BOOL *pfKeep) 596 596 { 597 597 ICOM_THIS(OLEPictureImpl, iface); … … 605 605 /************************************************************************ 606 606 * OLEPictureImpl_put_KeepOriginalFormat 607 */ 607 */ 608 608 static HRESULT WINAPI OLEPictureImpl_put_KeepOriginalFormat(IPicture *iface, 609 609 BOOL keep) 610 610 { 611 611 ICOM_THIS(OLEPictureImpl, iface); … … 618 618 /************************************************************************ 619 619 * OLEPictureImpl_PictureChanged 620 */ 620 */ 621 621 static HRESULT WINAPI OLEPictureImpl_PictureChanged(IPicture *iface) 622 622 { … … 629 629 /************************************************************************ 630 630 * OLEPictureImpl_SaveAsFile 631 */ 631 */ 632 632 static HRESULT WINAPI OLEPictureImpl_SaveAsFile(IPicture *iface, 633 634 635 633 IStream *pstream, 634 BOOL SaveMemCopy, 635 LONG *pcbSize) 636 636 { 637 637 ICOM_THIS(OLEPictureImpl, iface); … … 642 642 /************************************************************************ 643 643 * OLEPictureImpl_get_Attributes 644 */ 644 */ 645 645 static HRESULT WINAPI OLEPictureImpl_get_Attributes(IPicture *iface, 646 646 DWORD *pdwAttr) 647 647 { 648 648 ICOM_THIS(OLEPictureImpl, iface); … … 650 650 *pdwAttr = 0; 651 651 switch (This->desc.picType) { 652 case PICTYPE_BITMAP: break;/* not 'truely' scalable, see MSDN. */652 case PICTYPE_BITMAP: break; /* not 'truely' scalable, see MSDN. */ 653 653 case PICTYPE_ICON: *pdwAttr = PICTURE_TRANSPARENT;break; 654 654 case PICTYPE_METAFILE: *pdwAttr = PICTURE_TRANSPARENT|PICTURE_SCALABLE;break; … … 706 706 ICOM_THIS_From_IConnectionPointContainer(OLEPictureImpl, iface); 707 707 TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppCP); 708 if (!ppCP) 708 if (!ppCP) 709 709 return E_POINTER; 710 710 *ppCP = NULL; … … 805 805 * Loads the binary data from the IStream. Starts at current position. 806 806 * There appears to be an 2 DWORD header: 807 * 808 * 807 * DWORD magic; 808 * DWORD len; 809 809 * 810 810 * Currently implemented: BITMAP, ICON, JPEG. 811 811 */ 812 812 static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) { 813 HRESULT 814 ULONG 815 BYTE 816 DWORD 817 WORD 813 HRESULT hr = E_FAIL; 814 ULONG xread; 815 BYTE *xbuf; 816 DWORD header[2]; 817 WORD magic; 818 818 ICOM_THIS_From_IPersistStream(OLEPictureImpl, iface); 819 819 … … 828 828 xbuf = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,header[1]); 829 829 while (xread < header[1]) { 830 ULONG nread; 830 ULONG nread; 831 831 hr = IStream_Read(pStm,xbuf+xread,header[1]-xread,&nread); 832 832 xread+=nread; … … 841 841 case 0xd8ff: { /* JPEG */ 842 842 #ifdef HAVE_LIBJPEG 843 struct jpeg_decompress_struct 844 struct jpeg_error_mgr 845 int 846 JDIMENSION 847 JSAMPROW 848 BITMAPINFOHEADER 849 LPBYTE 850 HDC 851 struct jpeg_source_mgr 843 struct jpeg_decompress_struct jd; 844 struct jpeg_error_mgr jerr; 845 int ret; 846 JDIMENSION x; 847 JSAMPROW samprow; 848 BITMAPINFOHEADER bmi; 849 LPBYTE bits; 850 HDC hdcref; 851 struct jpeg_source_mgr xjsm; 852 852 853 853 /* This is basically so we can use in-memory data for jpeg decompression. 854 854 * We need to have all the functions. 855 855 */ 856 xjsm.next_input_byte 857 xjsm.bytes_in_buffer 858 xjsm.init_source 859 xjsm.fill_input_buffer 860 xjsm.skip_input_data 861 xjsm.resync_to_restart 862 xjsm.term_source 856 xjsm.next_input_byte = xbuf; 857 xjsm.bytes_in_buffer = xread; 858 xjsm.init_source = _jpeg_init_source; 859 xjsm.fill_input_buffer = _jpeg_fill_input_buffer; 860 xjsm.skip_input_data = _jpeg_skip_input_data; 861 xjsm.resync_to_restart = _jpeg_resync_to_restart; 862 xjsm.term_source = _jpeg_term_source; 863 863 864 864 jd.err = jpeg_std_error(&jerr); … … 868 868 jpeg_start_decompress(&jd); 869 869 if (ret != JPEG_HEADER_OK) { 870 871 872 870 ERR("Jpeg image in stream has bad format, read header returned %d.\n",ret); 871 HeapFree(GetProcessHeap(),0,xbuf); 872 return E_FAIL; 873 873 } 874 874 bits = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(jd.output_height+1)*jd.output_width*jd.output_components); … … 877 877 x = jpeg_read_scanlines(&jd,&samprow,1); 878 878 if (x != 1) { 879 880 879 FIXME("failed to read current scanline?\n"); 880 break; 881 881 } 882 882 memcpy( bits+jd.output_scanline*jd.output_width*jd.output_components, 883 884 883 samprow, 884 jd.output_width*jd.output_components 885 885 ); 886 886 } 887 bmi.biSize 888 bmi.biWidth 889 bmi.biHeight 890 bmi.biPlanes 891 bmi.biBitCount 892 bmi.biCompression 893 bmi.biSizeImage 894 bmi.biXPelsPerMeter 895 bmi.biYPelsPerMeter 896 bmi.biClrUsed 897 bmi.biClrImportant 887 bmi.biSize = sizeof(bmi); 888 bmi.biWidth = jd.output_width; 889 bmi.biHeight = -jd.output_height; 890 bmi.biPlanes = 1; 891 bmi.biBitCount = jd.output_components<<3; 892 bmi.biCompression = BI_RGB; 893 bmi.biSizeImage = jd.output_height*jd.output_width*jd.output_components; 894 bmi.biXPelsPerMeter = 0; 895 bmi.biYPelsPerMeter = 0; 896 bmi.biClrUsed = 0; 897 bmi.biClrImportant = 0; 898 898 899 899 HeapFree(GetProcessHeap(),0,samprow); … … 902 902 hdcref = GetDC(0); 903 903 This->desc.u.bmp.hbitmap=CreateDIBitmap( 904 905 906 907 908 909 904 hdcref, 905 &bmi, 906 CBM_INIT, 907 bits, 908 (BITMAPINFO*)&bmi, 909 DIB_RGB_COLORS 910 910 ); 911 911 DeleteDC(hdcref); … … 921 921 } 922 922 case 0x4d42: { /* Bitmap */ 923 BITMAPFILEHEADER 924 BITMAPINFO 925 HDC 923 BITMAPFILEHEADER *bfh = (BITMAPFILEHEADER*)xbuf; 924 BITMAPINFO *bi = (BITMAPINFO*)(bfh+1); 925 HDC hdcref; 926 926 927 927 /* Does not matter whether this is a coreheader or not, we only use … … 930 930 hdcref = GetDC(0); 931 931 This->desc.u.bmp.hbitmap = CreateDIBitmap( 932 933 934 935 936 937 932 hdcref, 933 &(bi->bmiHeader), 934 CBM_INIT, 935 xbuf+bfh->bfOffBits, 936 bi, 937 (bi->bmiHeader.biBitCount<=8)?DIB_PAL_COLORS:DIB_RGB_COLORS 938 938 ); 939 939 DeleteDC(hdcref); … … 945 945 case 0x0000: { /* ICON , first word is dwReserved */ 946 946 HICON hicon; 947 CURSORICONFILEDIR 948 int 947 CURSORICONFILEDIR *cifd = (CURSORICONFILEDIR*)xbuf; 948 int i; 949 949 950 950 /* … … 954 954 955 955 for (i=0;i<cifd->idCount;i++) { 956 957 958 959 960 961 962 963 956 FIXME("[%d] width %d\n",i,cifd->idEntries[i].bWidth); 957 FIXME("[%d] height %d\n",i,cifd->idEntries[i].bHeight); 958 FIXME("[%d] bColorCount %d\n",i,cifd->idEntries[i].bColorCount); 959 FIXME("[%d] bReserved %d\n",i,cifd->idEntries[i].bReserved); 960 FIXME("[%d] xHotspot %d\n",i,cifd->idEntries[i].xHotspot); 961 FIXME("[%d] yHotspot %d\n",i,cifd->idEntries[i].yHotspot); 962 FIXME("[%d] dwDIBSize %d\n",i,cifd->idEntries[i].dwDIBSize); 963 FIXME("[%d] dwDIBOffset %d\n",i,cifd->idEntries[i].dwDIBOffset); 964 964 } 965 965 */ … … 969 969 */ 970 970 if (cifd->idCount!=1) { 971 for (i=0;i<cifd->idCount;i++) { 972 if (cifd->idEntries[i].bWidth == 32) 973 break; 971 for (i=0;i<cifd->idCount;i++) { 972 if (cifd->idEntries[i].bWidth == 32) 973 break; 974 } 975 if (i==cifd->idCount) i=0; 974 976 } 975 if (i==cifd->idCount) i=0;976 }977 977 978 978 hicon = CreateIconFromResourceEx( 979 980 981 982 983 984 985 979 xbuf+cifd->idEntries[i].dwDIBOffset, 980 cifd->idEntries[i].dwDIBSize, 981 TRUE, /* is icon */ 982 0x00030000, 983 cifd->idEntries[i].bWidth, 984 cifd->idEntries[i].bHeight, 985 0 986 986 ); 987 987 if (!hicon) { 988 989 988 FIXME("CreateIcon failed.\n"); 989 hr = E_FAIL; 990 990 } else { 991 992 993 991 This->desc.picType = PICTYPE_ICON; 992 This->desc.u.icon.hicon = hicon; 993 hr = S_OK; 994 994 } 995 995 break; … … 1074 1074 */ 1075 1075 static HRESULT WINAPI OLEPictureImpl_GetTypeInfoCount( 1076 IDispatch* iface, 1076 IDispatch* iface, 1077 1077 unsigned int* pctinfo) 1078 1078 { … … 1088 1088 */ 1089 1089 static HRESULT WINAPI OLEPictureImpl_GetTypeInfo( 1090 IDispatch* iface, 1090 IDispatch* iface, 1091 1091 UINT iTInfo, 1092 LCID lcid, 1092 LCID lcid, 1093 1093 ITypeInfo** ppTInfo) 1094 1094 { … … 1105 1105 static HRESULT WINAPI OLEPictureImpl_GetIDsOfNames( 1106 1106 IDispatch* iface, 1107 REFIID riid, 1108 LPOLESTR* rgszNames, 1109 UINT cNames, 1107 REFIID riid, 1108 LPOLESTR* rgszNames, 1109 UINT cNames, 1110 1110 LCID lcid, 1111 1111 DISPID* rgDispId) … … 1123 1123 static HRESULT WINAPI OLEPictureImpl_Invoke( 1124 1124 IDispatch* iface, 1125 DISPID dispIdMember, 1126 REFIID riid, 1127 LCID lcid, 1125 DISPID dispIdMember, 1126 REFIID riid, 1127 LCID lcid, 1128 1128 WORD wFlags, 1129 1129 DISPPARAMS* pDispParams, 1130 VARIANT* pVarResult, 1130 VARIANT* pVarResult, 1131 1131 EXCEPINFO* pExepInfo, 1132 1132 UINT* puArgErr) … … 1202 1202 */ 1203 1203 HRESULT WINAPI OleCreatePictureIndirect(LPPICTDESC lpPictDesc, REFIID riid, 1204 1204 BOOL fOwn, LPVOID *ppvObj ) 1205 1205 { 1206 1206 OLEPictureImpl* newPict = NULL; … … 1244 1244 */ 1245 1245 HRESULT WINAPI OleLoadPicture( LPSTREAM lpstream, LONG lSize, BOOL fRunmode, 1246 1246 REFIID riid, LPVOID *ppvObj ) 1247 1247 { 1248 1248 LPPERSISTSTREAM ps; 1249 IPicture 1249 IPicture *newpic; 1250 1250 HRESULT hr; 1251 1251 1252 1252 TRACE("(%p,%ld,%d,%s,%p), partially implemented.\n", 1253 1253 lpstream, lSize, fRunmode, debugstr_guid(riid), ppvObj); 1254 1254 1255 1255 hr = OleCreatePictureIndirect(NULL,riid,!fRunmode,(LPVOID*)&newpic); … … 1276 1276 */ 1277 1277 HRESULT WINAPI OleLoadPictureEx( LPSTREAM lpstream, LONG lSize, BOOL fRunmode, 1278 1278 REFIID reed, DWORD xsiz, DWORD ysiz, DWORD flags, LPVOID *ppvObj ) 1279 1279 { 1280 1280 FIXME("(%p,%ld,%d,%p,%lx,%lx,%lx,%p), not implemented\n", 1281 1281 lpstream, lSize, fRunmode, reed, xsiz, ysiz, flags, ppvObj); 1282 1282 return S_OK; 1283 1283 } 1284 1284 1285 1285 #ifdef __WIN32OS2__ 1286 1286 … … 1308 1308 // ---------------------------------------------------------------------- 1309 1309 HRESULT WIN32API OleLoadPicturePath 1310 (LPOLESTR 1311 LPUNKNOWN 1312 DWORD 1313 OLE_COLOR 1314 REFIID 1315 LPVOID * 1310 (LPOLESTR szURLorPath, 1311 LPUNKNOWN punkCaller, 1312 DWORD dwReserved, 1313 OLE_COLOR clrReserved, 1314 REFIID riid, 1315 LPVOID * ppvRet ) 1316 1316 { 1317 1317 dprintf(("OLEAUT32: OleLoadPicturePath - stub")); -
trunk/src/oleaut32/parsedt.c
r6689 r6711 26 26 * 27 27 * dt.c-- 28 * 28 * Functions for the built-in type "dt". 29 29 * 30 30 * Copyright (c) 1994, Regents of the University of California … … 45 45 46 46 static datetkn *datebsearch(char *key, datetkn *base, unsigned int nel); 47 static int 47 static int DecodeDate(char *str, int fmask, int *tmask, struct tm * tm); 48 48 static int DecodeNumber(int flen, char *field, 49 49 int fmask, int *tmask, struct tm * tm, double *fsec); 50 50 static int DecodeNumberField(int len, char *str, 51 52 static int 51 int fmask, int *tmask, struct tm * tm, double *fsec); 52 static int DecodeSpecial(int field, char *lowtoken, int *val); 53 53 static int DecodeTime(char *str, int fmask, int *tmask, 54 55 static int 54 struct tm * tm, double *fsec); 55 static int DecodeTimezone(char *str, int *tzp); 56 56 57 57 #define USE_DATE_CACHE 1 … … 66 66 "Thursday", "Friday", "Saturday", NULL}; 67 67 68 /* those three vars are useless, and not even initialized, so 68 /* those three vars are useless, and not even initialized, so 69 69 * I'd rather remove them all (EPP) 70 70 */ 71 int DateStyle;72 bool 73 int 71 int DateStyle; 72 bool EuroDates; 73 int CTimeZone; 74 74 75 75 #define UTIME_MINYEAR (1901) … … 91 91 92 92 /***************************************************************************** 93 * PRIVATE ROUTINES*93 * PRIVATE ROUTINES * 94 94 *****************************************************************************/ 95 95 96 96 /* definitions for squeezing values into "value" */ 97 #define ABS_SIGNBIT 98 #define VALMASK 99 #define NEG(n) 100 #define SIGNEDCHAR(c) 101 #define FROMVAL(tp) 102 #define TOVAL(tp, v) 97 #define ABS_SIGNBIT (char) 0200 98 #define VALMASK (char) 0177 99 #define NEG(n) ((n)|ABS_SIGNBIT) 100 #define SIGNEDCHAR(c) ((c)&ABS_SIGNBIT? -((c)&VALMASK): (c)) 101 #define FROMVAL(tp) (-SIGNEDCHAR((tp)->value) * 10) /* uncompress */ 102 #define TOVAL(tp, v) ((tp)->value = ((v) < 0? NEG((-(v))/10): (v)/10)) 103 103 104 104 /* … … 108 108 */ 109 109 static datetkn datetktbl[] = { 110 /* text tokenlexval */111 112 {"acsst", DTZ, 63},/* Cent. Australia */113 {"acst", TZ, 57},/* Cent. Australia */114 {DA_D, ADBC, AD},/* "ad" for years >= 0 */115 {"abstime", IGNOREFIELD, 0},/* "abstime" for pre-v6.1 "Invalid116 117 {"adt", DTZ, NEG(18)},/* Atlantic Daylight Time */118 {"aesst", DTZ, 66},/* E. Australia */119 {"aest", TZ, 60},/* Australia Eastern Std Time */120 {"ahst", TZ, 60},/* Alaska-Hawaii Std Time */121 {"allballs", RESERV, DTK_ZULU},/* 00:00:00 */122 123 124 125 {"ast", TZ, NEG(24)},/* Atlantic Std Time (Canada) */126 {"at", IGNOREFIELD, 0},/* "at" (throwaway) */127 128 129 {"awsst", DTZ, 54},/* W. Australia */130 {"awst", TZ, 48},/* W. Australia */131 {DB_C, ADBC, BC},/* "bc" for years < 0 */132 {"bst", TZ, 6},/* British Summer Time */133 {"bt", TZ, 18},/* Baghdad Time */134 {"cadt", DTZ, 63},/* Central Australian DST */135 {"cast", TZ, 57},/* Central Australian ST */136 {"cat", TZ, NEG(60)},/* Central Alaska Time */137 {"cct", TZ, 48},/* China Coast */138 {"cdt", DTZ, NEG(30)},/* Central Daylight Time */139 {"cet", TZ, 6},/* Central European Time */140 {"cetdst", DTZ, 12},/* Central European Dayl.Time */141 {"cst", TZ, NEG(36)},/* Central Standard Time */142 {DCURRENT, RESERV, DTK_CURRENT},/* "current" is always now */143 144 145 {"dnt", TZ, 6},/* Dansk Normal Tid */146 {"dow", RESERV, DTK_DOW},/* day of week */147 {"doy", RESERV, DTK_DOY},/* day of year */148 149 {"east", TZ, NEG(60)},/* East Australian Std Time */150 {"edt", DTZ, NEG(24)},/* Eastern Daylight Time */151 {"eet", TZ, 12},/* East. Europe, USSR Zone 1 */152 {"eetdst", DTZ, 18},/* Eastern Europe */153 110 /* text token lexval */ 111 {EARLY, RESERV, DTK_EARLY}, /* "-infinity" reserved for "early time" */ 112 {"acsst", DTZ, 63}, /* Cent. Australia */ 113 {"acst", TZ, 57}, /* Cent. Australia */ 114 {DA_D, ADBC, AD}, /* "ad" for years >= 0 */ 115 {"abstime", IGNOREFIELD, 0}, /* "abstime" for pre-v6.1 "Invalid 116 * Abstime" */ 117 {"adt", DTZ, NEG(18)}, /* Atlantic Daylight Time */ 118 {"aesst", DTZ, 66}, /* E. Australia */ 119 {"aest", TZ, 60}, /* Australia Eastern Std Time */ 120 {"ahst", TZ, 60}, /* Alaska-Hawaii Std Time */ 121 {"allballs", RESERV, DTK_ZULU}, /* 00:00:00 */ 122 {"am", AMPM, AM}, 123 {"apr", MONTH, 4}, 124 {"april", MONTH, 4}, 125 {"ast", TZ, NEG(24)}, /* Atlantic Std Time (Canada) */ 126 {"at", IGNOREFIELD, 0}, /* "at" (throwaway) */ 127 {"aug", MONTH, 8}, 128 {"august", MONTH, 8}, 129 {"awsst", DTZ, 54}, /* W. Australia */ 130 {"awst", TZ, 48}, /* W. Australia */ 131 {DB_C, ADBC, BC}, /* "bc" for years < 0 */ 132 {"bst", TZ, 6}, /* British Summer Time */ 133 {"bt", TZ, 18}, /* Baghdad Time */ 134 {"cadt", DTZ, 63}, /* Central Australian DST */ 135 {"cast", TZ, 57}, /* Central Australian ST */ 136 {"cat", TZ, NEG(60)}, /* Central Alaska Time */ 137 {"cct", TZ, 48}, /* China Coast */ 138 {"cdt", DTZ, NEG(30)}, /* Central Daylight Time */ 139 {"cet", TZ, 6}, /* Central European Time */ 140 {"cetdst", DTZ, 12}, /* Central European Dayl.Time */ 141 {"cst", TZ, NEG(36)}, /* Central Standard Time */ 142 {DCURRENT, RESERV, DTK_CURRENT}, /* "current" is always now */ 143 {"dec", MONTH, 12}, 144 {"december", MONTH, 12}, 145 {"dnt", TZ, 6}, /* Dansk Normal Tid */ 146 {"dow", RESERV, DTK_DOW}, /* day of week */ 147 {"doy", RESERV, DTK_DOY}, /* day of year */ 148 {"dst", DTZMOD, 6}, 149 {"east", TZ, NEG(60)}, /* East Australian Std Time */ 150 {"edt", DTZ, NEG(24)}, /* Eastern Daylight Time */ 151 {"eet", TZ, 12}, /* East. Europe, USSR Zone 1 */ 152 {"eetdst", DTZ, 18}, /* Eastern Europe */ 153 {EPOCH, RESERV, DTK_EPOCH}, /* "epoch" reserved for system epoch time */ 154 154 #if USE_AUSTRALIAN_RULES 155 {"est", TZ, 60},/* Australia Eastern Std Time */155 {"est", TZ, 60}, /* Australia Eastern Std Time */ 156 156 #else 157 {"est", TZ, NEG(30)},/* Eastern Standard Time */158 #endif 159 160 161 162 163 {"fst", TZ, 6},/* French Summer Time */164 {"fwt", DTZ, 12},/* French Winter Time */165 {"gmt", TZ, 0},/* Greenwish Mean Time */166 {"gst", TZ, 60},/* Guam Std Time, USSR Zone 9 */167 {"hdt", DTZ, NEG(54)},/* Hawaii/Alaska */168 {"hmt", DTZ, 18},/* Hellas ? ? */169 {"hst", TZ, NEG(60)},/* Hawaii Std Time */170 {"idle", TZ, 72},/* Intl. Date Line, East */171 {"idlw", TZ, NEG(72)}, /* Intl. Date Line,,est */172 {LATE, RESERV, DTK_LATE},/* "infinity" reserved for "late time" */173 {INVALID, RESERV, DTK_INVALID},/* "invalid" reserved for invalid174 175 {"ist", TZ, 12},/* Israel */176 {"it", TZ, 22},/* Iran Time */177 178 179 {"jst", TZ, 54},/* Japan Std Time,USSR Zone 8 */180 {"jt", TZ, 45},/* Java Time */181 182 183 184 185 {"kst", TZ, 54},/* Korea Standard Time */186 {"ligt", TZ, 60},/* From Melbourne, Australia */187 188 189 190 {"mdt", DTZ, NEG(36)},/* Mountain Daylight Time */191 {"mest", DTZ, 12},/* Middle Europe Summer Time */192 {"met", TZ, 6},/* Middle Europe Time */193 {"metdst", DTZ, 12},/* Middle Europe Daylight Time */194 {"mewt", TZ, 6},/* Middle Europe Winter Time */195 {"mez", TZ, 6},/* Middle Europe Zone */196 197 198 {"mst", TZ, NEG(42)},/* Mountain Standard Time */199 {"mt", TZ, 51},/* Moluccas Time */200 {"ndt", DTZ, NEG(15)},/* Nfld. Daylight Time */201 {"nft", TZ, NEG(21)},/* Newfoundland Standard Time */202 {"nor", TZ, 6},/* Norway Standard Time */203 204 205 {NOW, RESERV, DTK_NOW},/* current transaction time */206 {"nst", TZ, NEG(21)},/* Nfld. Standard Time */207 {"nt", TZ, NEG(66)},/* Nome Time */208 {"nzdt", DTZ, 78},/* New Zealand Daylight Time */209 {"nzst", TZ, 72},/* New Zealand Standard Time */210 {"nzt", TZ, 72},/* New Zealand Time */211 212 213 {"on", IGNOREFIELD, 0},/* "on" (throwaway) */214 {"pdt", DTZ, NEG(42)},/* Pacific Daylight Time */215 216 {"pst", TZ, NEG(48)},/* Pacific Standard Time */217 {"sadt", DTZ, 63},/* S. Australian Dayl. Time */218 {"sast", TZ, 57},/* South Australian Std Time */219 220 221 222 223 224 {"set", TZ, NEG(6)},/* Seychelles Time ?? */225 {"sst", DTZ, 12},/* Swedish Summer Time */226 227 228 {"swt", TZ, 6}, /* Swedish Winter Time*/229 230 231 232 233 234 {TOMORROW, RESERV, DTK_TOMORROW},/* tomorrow midnight */235 236 237 238 239 240 241 242 {"wadt", DTZ, 48},/* West Australian DST */243 {"wast", TZ, 42},/* West Australian Std Time */244 {"wat", TZ, NEG(6)},/* West Africa Time */245 {"wdt", DTZ, 54},/* West Australian DST */246 247 248 249 {"wet", TZ, 0},/* Western Europe */250 {"wetdst", DTZ, 6},/* Western Europe */251 {"wst", TZ, 48},/* West Australian Std Time */252 {"ydt", DTZ, NEG(48)},/* Yukon Daylight Time */253 254 {"yst", TZ, NEG(54)},/* Yukon Standard Time */255 {"zp4", TZ, NEG(24)},/* GMT +4 hours. */256 {"zp5", TZ, NEG(30)},/* GMT +5 hours. */257 {"zp6", TZ, NEG(36)},/* GMT +6 hours. */258 {"z", RESERV, DTK_ZULU},/* 00:00:00 */259 {ZULU, RESERV, DTK_ZULU},/* 00:00:00 */157 {"est", TZ, NEG(30)}, /* Eastern Standard Time */ 158 #endif 159 {"feb", MONTH, 2}, 160 {"february", MONTH, 2}, 161 {"fri", DOW, 5}, 162 {"friday", DOW, 5}, 163 {"fst", TZ, 6}, /* French Summer Time */ 164 {"fwt", DTZ, 12}, /* French Winter Time */ 165 {"gmt", TZ, 0}, /* Greenwish Mean Time */ 166 {"gst", TZ, 60}, /* Guam Std Time, USSR Zone 9 */ 167 {"hdt", DTZ, NEG(54)}, /* Hawaii/Alaska */ 168 {"hmt", DTZ, 18}, /* Hellas ? ? */ 169 {"hst", TZ, NEG(60)}, /* Hawaii Std Time */ 170 {"idle", TZ, 72}, /* Intl. Date Line, East */ 171 {"idlw", TZ, NEG(72)}, /* Intl. Date Line,, est */ 172 {LATE, RESERV, DTK_LATE}, /* "infinity" reserved for "late time" */ 173 {INVALID, RESERV, DTK_INVALID}, /* "invalid" reserved for invalid 174 * time */ 175 {"ist", TZ, 12}, /* Israel */ 176 {"it", TZ, 22}, /* Iran Time */ 177 {"jan", MONTH, 1}, 178 {"january", MONTH, 1}, 179 {"jst", TZ, 54}, /* Japan Std Time,USSR Zone 8 */ 180 {"jt", TZ, 45}, /* Java Time */ 181 {"jul", MONTH, 7}, 182 {"july", MONTH, 7}, 183 {"jun", MONTH, 6}, 184 {"june", MONTH, 6}, 185 {"kst", TZ, 54}, /* Korea Standard Time */ 186 {"ligt", TZ, 60}, /* From Melbourne, Australia */ 187 {"mar", MONTH, 3}, 188 {"march", MONTH, 3}, 189 {"may", MONTH, 5}, 190 {"mdt", DTZ, NEG(36)}, /* Mountain Daylight Time */ 191 {"mest", DTZ, 12}, /* Middle Europe Summer Time */ 192 {"met", TZ, 6}, /* Middle Europe Time */ 193 {"metdst", DTZ, 12}, /* Middle Europe Daylight Time */ 194 {"mewt", TZ, 6}, /* Middle Europe Winter Time */ 195 {"mez", TZ, 6}, /* Middle Europe Zone */ 196 {"mon", DOW, 1}, 197 {"monday", DOW, 1}, 198 {"mst", TZ, NEG(42)}, /* Mountain Standard Time */ 199 {"mt", TZ, 51}, /* Moluccas Time */ 200 {"ndt", DTZ, NEG(15)}, /* Nfld. Daylight Time */ 201 {"nft", TZ, NEG(21)}, /* Newfoundland Standard Time */ 202 {"nor", TZ, 6}, /* Norway Standard Time */ 203 {"nov", MONTH, 11}, 204 {"november", MONTH, 11}, 205 {NOW, RESERV, DTK_NOW}, /* current transaction time */ 206 {"nst", TZ, NEG(21)}, /* Nfld. Standard Time */ 207 {"nt", TZ, NEG(66)}, /* Nome Time */ 208 {"nzdt", DTZ, 78}, /* New Zealand Daylight Time */ 209 {"nzst", TZ, 72}, /* New Zealand Standard Time */ 210 {"nzt", TZ, 72}, /* New Zealand Time */ 211 {"oct", MONTH, 10}, 212 {"october", MONTH, 10}, 213 {"on", IGNOREFIELD, 0}, /* "on" (throwaway) */ 214 {"pdt", DTZ, NEG(42)}, /* Pacific Daylight Time */ 215 {"pm", AMPM, PM}, 216 {"pst", TZ, NEG(48)}, /* Pacific Standard Time */ 217 {"sadt", DTZ, 63}, /* S. Australian Dayl. Time */ 218 {"sast", TZ, 57}, /* South Australian Std Time */ 219 {"sat", DOW, 6}, 220 {"saturday", DOW, 6}, 221 {"sep", MONTH, 9}, 222 {"sept", MONTH, 9}, 223 {"september", MONTH, 9}, 224 {"set", TZ, NEG(6)}, /* Seychelles Time ?? */ 225 {"sst", DTZ, 12}, /* Swedish Summer Time */ 226 {"sun", DOW, 0}, 227 {"sunday", DOW, 0}, 228 {"swt", TZ, 6}, /* Swedish Winter Time */ 229 {"thu", DOW, 4}, 230 {"thur", DOW, 4}, 231 {"thurs", DOW, 4}, 232 {"thursday", DOW, 4}, 233 {TODAY, RESERV, DTK_TODAY}, /* midnight */ 234 {TOMORROW, RESERV, DTK_TOMORROW}, /* tomorrow midnight */ 235 {"tue", DOW, 2}, 236 {"tues", DOW, 2}, 237 {"tuesday", DOW, 2}, 238 {"undefined", RESERV, DTK_INVALID}, /* "undefined" pre-v6.1 invalid 239 * time */ 240 {"ut", TZ, 0}, 241 {"utc", TZ, 0}, 242 {"wadt", DTZ, 48}, /* West Australian DST */ 243 {"wast", TZ, 42}, /* West Australian Std Time */ 244 {"wat", TZ, NEG(6)}, /* West Africa Time */ 245 {"wdt", DTZ, 54}, /* West Australian DST */ 246 {"wed", DOW, 3}, 247 {"wednesday", DOW, 3}, 248 {"weds", DOW, 3}, 249 {"wet", TZ, 0}, /* Western Europe */ 250 {"wetdst", DTZ, 6}, /* Western Europe */ 251 {"wst", TZ, 48}, /* West Australian Std Time */ 252 {"ydt", DTZ, NEG(48)}, /* Yukon Daylight Time */ 253 {YESTERDAY, RESERV, DTK_YESTERDAY}, /* yesterday midnight */ 254 {"yst", TZ, NEG(54)}, /* Yukon Standard Time */ 255 {"zp4", TZ, NEG(24)}, /* GMT +4 hours. */ 256 {"zp5", TZ, NEG(30)}, /* GMT +5 hours. */ 257 {"zp6", TZ, NEG(36)}, /* GMT +6 hours. */ 258 {"z", RESERV, DTK_ZULU}, /* 00:00:00 */ 259 {ZULU, RESERV, DTK_ZULU}, /* 00:00:00 */ 260 260 }; 261 261 … … 275 275 * Calendar time to Julian date conversions. 276 276 * Julian date is commonly used in astronomical applications, 277 * 277 * since it is numerically accurate and computationally simple. 278 278 * The algorithms here will accurately convert between Julian day 279 * 280 * 279 * and calendar date for all non-negative Julian days 280 * (i.e. from Nov 23, -4713 on). 281 281 * 282 282 * Ref: Explanatory Supplement to the Astronomical Almanac, 1992. 283 * 283 * University Science Books, 20 Edgehill Rd. Mill Valley CA 94941. 284 284 * 285 285 * Use the algorithm by Henry Fliegel, a former NASA/JPL colleague 286 * 286 * now at Aerospace Corp. (hi, Henry!) 287 287 * 288 288 * These routines will be used by other date/time packages - tgl 97/02/25 … … 290 290 291 291 /* Set the minimum year to one greater than the year of the first valid day 292 * 292 * to avoid having to check year and day both. - tgl 97/05/08 293 293 */ 294 294 … … 304 304 date2j(int y, int m, int d) 305 305 { 306 intm12 = (m - 14) / 12;307 308 309 310 } 306 int m12 = (m - 14) / 12; 307 308 return ((1461 * (y + 4800 + m12)) / 4 + (367 * (m - 2 - 12 * (m12))) / 12 309 - (3 * ((y + 4900 + m12) / 100)) / 4 + d - 32075); 310 } /* date2j() */ 311 311 312 312 void 313 313 j2date(int jd, int *year, int *month, int *day) 314 314 { 315 intj,316 317 318 319 320 inti,321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 } 315 int j, 316 y, 317 m, 318 d; 319 320 int i, 321 l, 322 n; 323 324 l = jd + 68569; 325 n = (4 * l) / 146097; 326 l -= (146097 * n + 3) / 4; 327 i = (4000 * (l + 1)) / 1461001; 328 l += 31 - (1461 * i) / 4; 329 j = (80 * l) / 2447; 330 d = l - (2447 * j) / 80; 331 l = j / 11; 332 m = (j + 2) - (12 * l); 333 y = 100 * (n - 49) + i + l; 334 335 *year = y; 336 *month = m; 337 *day = d; 338 return; 339 } /* j2date() */ 340 340 341 341 … … 353 353 int 354 354 ParseDateTime(char *timestr, char *lowstr, 355 355 char **field, int *ftype, int maxfields, int *numfields) 356 356 { 357 intnf = 0;358 char*cp = timestr;359 char*lp = lowstr;360 361 #ifdef DATEDEBUG 362 363 #endif 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 #ifdef DATEDEBUG 474 475 #endif 476 477 478 479 480 481 } 357 int nf = 0; 358 char *cp = timestr; 359 char *lp = lowstr; 360 361 #ifdef DATEDEBUG 362 printf("ParseDateTime- input string is %s\n", timestr); 363 #endif 364 /* outer loop through fields */ 365 while (*cp != '\0') 366 { 367 field[nf] = lp; 368 369 /* leading digit? then date or time */ 370 if (isdigit(*cp) || (*cp == '.')) 371 { 372 *lp++ = *cp++; 373 while (isdigit(*cp)) 374 *lp++ = *cp++; 375 /* time field? */ 376 if (*cp == ':') 377 { 378 ftype[nf] = DTK_TIME; 379 while (isdigit(*cp) || (*cp == ':') || (*cp == '.')) 380 *lp++ = *cp++; 381 382 } 383 /* date field? allow embedded text month */ 384 else if ((*cp == '-') || (*cp == '/') || (*cp == '.')) 385 { 386 ftype[nf] = DTK_DATE; 387 while (isalnum(*cp) || (*cp == '-') || (*cp == '/') || (*cp == '.')) 388 *lp++ = tolower(*cp++); 389 390 } 391 392 /* 393 * otherwise, number only and will determine year, month, or 394 * day later 395 */ 396 else 397 ftype[nf] = DTK_NUMBER; 398 399 } 400 401 /* 402 * text? then date string, month, day of week, special, or 403 * timezone 404 */ 405 else if (isalpha(*cp)) 406 { 407 ftype[nf] = DTK_STRING; 408 *lp++ = tolower(*cp++); 409 while (isalpha(*cp)) 410 *lp++ = tolower(*cp++); 411 412 /* full date string with leading text month? */ 413 if ((*cp == '-') || (*cp == '/') || (*cp == '.')) 414 { 415 ftype[nf] = DTK_DATE; 416 while (isdigit(*cp) || (*cp == '-') || (*cp == '/') || (*cp == '.')) 417 *lp++ = tolower(*cp++); 418 } 419 420 /* skip leading spaces */ 421 } 422 else if (isspace(*cp)) 423 { 424 cp++; 425 continue; 426 427 /* sign? then special or numeric timezone */ 428 } 429 else if ((*cp == '+') || (*cp == '-')) 430 { 431 *lp++ = *cp++; 432 /* soak up leading whitespace */ 433 while (isspace(*cp)) 434 cp++; 435 /* numeric timezone? */ 436 if (isdigit(*cp)) 437 { 438 ftype[nf] = DTK_TZ; 439 *lp++ = *cp++; 440 while (isdigit(*cp) || (*cp == ':')) 441 *lp++ = *cp++; 442 443 /* special? */ 444 } 445 else if (isalpha(*cp)) 446 { 447 ftype[nf] = DTK_SPECIAL; 448 *lp++ = tolower(*cp++); 449 while (isalpha(*cp)) 450 *lp++ = tolower(*cp++); 451 452 /* otherwise something wrong... */ 453 } 454 else 455 return -1; 456 457 /* ignore punctuation but use as delimiter */ 458 } 459 else if (ispunct(*cp)) 460 { 461 cp++; 462 continue; 463 464 } 465 else 466 return -1; 467 468 /* force in a delimiter */ 469 *lp++ = '\0'; 470 nf++; 471 if (nf > MAXDATEFIELDS) 472 return -1; 473 #ifdef DATEDEBUG 474 printf("ParseDateTime- set field[%d] to %s type %d\n", (nf - 1), field[nf - 1], ftype[nf - 1]); 475 #endif 476 } 477 478 *numfields = nf; 479 480 return 0; 481 } /* ParseDateTime() */ 482 482 483 483 … … 485 485 * Interpret previously parsed fields for general date and time. 486 486 * Return 0 if full date, 1 if only time, and -1 if problems. 487 * 488 * 489 * 490 * 491 * 492 * 493 * "1997.038 15:23:27"(day of year 1-366)494 * 495 * 496 * 487 * External format(s): 488 * "<weekday> <month>-<day>-<year> <hour>:<minute>:<second>" 489 * "Fri Feb-7-1997 15:23:27" 490 * "Feb-7-1997 15:23:27" 491 * "2-7-1997 15:23:27" 492 * "1997-2-7 15:23:27" 493 * "1997.038 15:23:27" (day of year 1-366) 494 * Also supports input in compact time: 495 * "970207 152327" 496 * "97038 152327" 497 497 * 498 498 * Use the system-provided functions to get the current time zone 499 * 499 * if not specified in the input string. 500 500 * If the date is outside the time_t system-supported time range, 501 * 501 * then assume GMT time zone. - tgl 97/05/27 502 502 */ 503 503 int 504 504 DecodeDateTime(char **field, int *ftype, int nf, 505 505 int *dtype, struct tm * tm, double *fsec, int *tzp) 506 506 { 507 intfmask = 0,508 509 510 inti;511 intflen,512 513 intmer = HR24;514 intbc = FALSE;515 516 517 518 519 520 521 tm->tm_isdst = -1;/* don't know daylight savings time status522 523 524 525 526 527 528 #ifdef DATEDEBUG 529 530 #endif 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 #ifdef DATEDEBUG 578 579 #endif 580 581 582 583 584 585 586 587 #ifdef DATEDEBUG 588 589 #endif 590 591 592 593 594 595 596 597 598 599 600 #ifdef DATEDEBUG 601 602 #endif 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 #ifdef DATEDEBUG 663 664 665 #endif 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 #ifdef DATEDEBUG 684 685 686 687 #endif 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 507 int fmask = 0, 508 tmask, 509 type; 510 int i; 511 int flen, 512 val; 513 int mer = HR24; 514 int bc = FALSE; 515 516 *dtype = DTK_DATE; 517 tm->tm_hour = 0; 518 tm->tm_min = 0; 519 tm->tm_sec = 0; 520 *fsec = 0; 521 tm->tm_isdst = -1; /* don't know daylight savings time status 522 * apriori */ 523 if (tzp != NULL) 524 *tzp = 0; 525 526 for (i = 0; i < nf; i++) 527 { 528 #ifdef DATEDEBUG 529 printf("DecodeDateTime- field[%d] is %s (type %d)\n", i, field[i], ftype[i]); 530 #endif 531 switch (ftype[i]) 532 { 533 case DTK_DATE: 534 if (DecodeDate(field[i], fmask, &tmask, tm) != 0) 535 return -1; 536 break; 537 538 case DTK_TIME: 539 if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0) 540 return -1; 541 542 /* 543 * check upper limit on hours; other limits checked in 544 * DecodeTime() 545 */ 546 if (tm->tm_hour > 23) 547 return -1; 548 break; 549 550 case DTK_TZ: 551 if (tzp == NULL) 552 return -1; 553 if (DecodeTimezone(field[i], tzp) != 0) 554 return -1; 555 tmask = DTK_M(TZ); 556 break; 557 558 case DTK_NUMBER: 559 flen = strlen(field[i]); 560 561 if (flen > 4) 562 { 563 if (DecodeNumberField(flen, field[i], fmask, &tmask, tm, fsec) != 0) 564 return -1; 565 566 } 567 else 568 { 569 if (DecodeNumber(flen, field[i], fmask, &tmask, tm, fsec) != 0) 570 return -1; 571 } 572 break; 573 574 case DTK_STRING: 575 case DTK_SPECIAL: 576 type = DecodeSpecial(i, field[i], &val); 577 #ifdef DATEDEBUG 578 printf("DecodeDateTime- special field[%d] %s type=%d value=%d\n", i, field[i], type, val); 579 #endif 580 if (type == IGNOREFIELD) 581 continue; 582 583 tmask = DTK_M(type); 584 switch (type) 585 { 586 case RESERV: 587 #ifdef DATEDEBUG 588 printf("DecodeDateTime- RESERV field %s value is %d\n", field[i], val); 589 #endif 590 switch (val) 591 { 592 593 default: 594 *dtype = val; 595 } 596 597 break; 598 599 case MONTH: 600 #ifdef DATEDEBUG 601 printf("DecodeDateTime- month field %s value is %d\n", field[i], val); 602 #endif 603 tm->tm_mon = val; 604 break; 605 606 /* 607 * daylight savings time modifier (solves "MET 608 * DST" syntax) 609 */ 610 case DTZMOD: 611 tmask |= DTK_M(DTZ); 612 tm->tm_isdst = 1; 613 if (tzp == NULL) 614 return -1; 615 *tzp += val * 60; 616 break; 617 618 case DTZ: 619 620 /* 621 * set mask for TZ here _or_ check for DTZ later 622 * when getting default timezone 623 */ 624 tmask |= DTK_M(TZ); 625 tm->tm_isdst = 1; 626 if (tzp == NULL) 627 return -1; 628 *tzp = val * 60; 629 break; 630 631 case TZ: 632 tm->tm_isdst = 0; 633 if (tzp == NULL) 634 return -1; 635 *tzp = val * 60; 636 break; 637 638 case IGNOREFIELD: 639 break; 640 641 case AMPM: 642 mer = val; 643 break; 644 645 case ADBC: 646 bc = (val == BC); 647 break; 648 649 case DOW: 650 tm->tm_wday = val; 651 break; 652 653 default: 654 return -1; 655 } 656 break; 657 658 default: 659 return -1; 660 } 661 662 #ifdef DATEDEBUG 663 printf("DecodeDateTime- field[%d] %s (%08x/%08x) value is %d\n", 664 i, field[i], fmask, tmask, val); 665 #endif 666 667 if (tmask & fmask) 668 return -1; 669 fmask |= tmask; 670 } 671 672 /* there is no year zero in AD/BC notation; i.e. "1 BC" == year 0 */ 673 if (bc) 674 tm->tm_year = -(tm->tm_year - 1); 675 676 if ((mer != HR24) && (tm->tm_hour > 12)) 677 return -1; 678 if ((mer == AM) && (tm->tm_hour == 12)) 679 tm->tm_hour = 0; 680 else if ((mer == PM) && (tm->tm_hour != 12)) 681 tm->tm_hour += 12; 682 683 #ifdef DATEDEBUG 684 printf("DecodeDateTime- mask %08x (%08x)", fmask, DTK_DATE_M); 685 printf(" set y%04d m%02d d%02d", tm->tm_year, tm->tm_mon, tm->tm_mday); 686 printf(" %02d:%02d:%02d\n", tm->tm_hour, tm->tm_min, tm->tm_sec); 687 #endif 688 689 if ((*dtype == DTK_DATE) && ((fmask & DTK_DATE_M) != DTK_DATE_M)) 690 return ((fmask & DTK_TIME_M) == DTK_TIME_M) ? 1 : -1; 691 692 /* timezone not specified? then find local timezone if possible */ 693 if ((*dtype == DTK_DATE) && ((fmask & DTK_DATE_M) == DTK_DATE_M) 694 && (tzp != NULL) && (!(fmask & DTK_M(TZ)))) 695 { 696 697 /* 698 * daylight savings time modifier but no standard timezone? then 699 * error 700 */ 701 if (fmask & DTK_M(DTZMOD)) 702 return -1; 703 704 if (IS_VALID_UTIME(tm->tm_year, tm->tm_mon, tm->tm_mday)) 705 { 706 706 #ifdef USE_POSIX_TIME 707 708 709 710 711 712 707 tm->tm_year -= 1900; 708 tm->tm_mon -= 1; 709 tm->tm_isdst = -1; 710 mktime(tm); 711 tm->tm_year += 1900; 712 tm->tm_mon += 1; 713 713 714 714 #ifdef HAVE_INT_TIMEZONE 715 716 717 #else 718 *tzp = -(tm->tm_gmtoff);/* tm_gmtoff is Sun/DEC-ism */719 #endif 720 721 #else 722 723 #endif 724 725 726 727 728 729 730 731 732 733 } 715 *tzp = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone); 716 717 #else /* !HAVE_INT_TIMEZONE */ 718 *tzp = -(tm->tm_gmtoff); /* tm_gmtoff is Sun/DEC-ism */ 719 #endif 720 721 #else /* !USE_POSIX_TIME */ 722 *tzp = CTimeZone; 723 #endif 724 } 725 else 726 { 727 tm->tm_isdst = 0; 728 *tzp = 0; 729 } 730 } 731 732 return 0; 733 } /* DecodeDateTime() */ 734 734 735 735 … … 740 740 DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct tm * tm, double *fsec) 741 741 { 742 intfmask,743 744 745 inti;746 intflen,747 748 intmer = HR24;749 750 751 752 753 754 tm->tm_isdst = -1;/* don't know daylight savings time status755 756 757 758 759 760 761 762 #ifdef DATEDEBUG 763 764 #endif 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 #ifdef DATEDEBUG 783 784 #endif 785 786 787 788 789 790 791 792 #ifdef DATEDEBUG 793 794 #endif 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 #ifdef DATEDEBUG 825 826 #endif 827 828 829 #ifdef DATEDEBUG 830 831 832 #endif 833 834 835 836 837 838 839 840 841 842 843 844 845 } 742 int fmask, 743 tmask, 744 type; 745 int i; 746 int flen, 747 val; 748 int mer = HR24; 749 750 *dtype = DTK_TIME; 751 tm->tm_hour = 0; 752 tm->tm_min = 0; 753 tm->tm_sec = 0; 754 tm->tm_isdst = -1; /* don't know daylight savings time status 755 * apriori */ 756 *fsec = 0; 757 758 fmask = DTK_DATE_M; 759 760 for (i = 0; i < nf; i++) 761 { 762 #ifdef DATEDEBUG 763 printf("DecodeTimeOnly- field[%d] is %s (type %d)\n", i, field[i], ftype[i]); 764 #endif 765 switch (ftype[i]) 766 { 767 case DTK_TIME: 768 if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0) 769 return -1; 770 break; 771 772 case DTK_NUMBER: 773 flen = strlen(field[i]); 774 775 if (DecodeNumberField(flen, field[i], fmask, &tmask, tm, fsec) != 0) 776 return -1; 777 break; 778 779 case DTK_STRING: 780 case DTK_SPECIAL: 781 type = DecodeSpecial(i, field[i], &val); 782 #ifdef DATEDEBUG 783 printf("DecodeTimeOnly- special field[%d] %s type=%d value=%d\n", i, field[i], type, val); 784 #endif 785 if (type == IGNOREFIELD) 786 continue; 787 788 tmask = DTK_M(type); 789 switch (type) 790 { 791 case RESERV: 792 #ifdef DATEDEBUG 793 printf("DecodeTimeOnly- RESERV field %s value is %d\n", field[i], val); 794 #endif 795 switch (val) 796 { 797 798 default: 799 return -1; 800 } 801 802 break; 803 804 case IGNOREFIELD: 805 break; 806 807 case AMPM: 808 mer = val; 809 break; 810 811 default: 812 return -1; 813 } 814 break; 815 816 default: 817 return -1; 818 } 819 820 if (tmask & fmask) 821 return -1; 822 fmask |= tmask; 823 824 #ifdef DATEDEBUG 825 printf("DecodeTimeOnly- field[%d] %s value is %d\n", i, field[i], val); 826 #endif 827 } 828 829 #ifdef DATEDEBUG 830 printf("DecodeTimeOnly- mask %08x (%08x)", fmask, DTK_TIME_M); 831 printf(" %02d:%02d:%02d (%f)\n", tm->tm_hour, tm->tm_min, tm->tm_sec, *fsec); 832 #endif 833 834 if ((mer != HR24) && (tm->tm_hour > 12)) 835 return -1; 836 if ((mer == AM) && (tm->tm_hour == 12)) 837 tm->tm_hour = 0; 838 else if ((mer == PM) && (tm->tm_hour != 12)) 839 tm->tm_hour += 12; 840 841 if ((fmask & DTK_TIME_M) != DTK_TIME_M) 842 return -1; 843 844 return 0; 845 } /* DecodeTimeOnly() */ 846 846 847 847 … … 853 853 DecodeDate(char *str, int fmask, int *tmask, struct tm * tm) 854 854 { 855 doublefsec;856 857 intnf = 0;858 inti,859 860 inttype,861 862 863 char*field[MAXDATEFIELDS];864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 #ifdef DATEDEBUG 909 910 #endif 911 912 913 914 915 #ifdef DATEDEBUG 916 917 #endif 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 } 855 double fsec; 856 857 int nf = 0; 858 int i, 859 len; 860 int type, 861 val, 862 dmask = 0; 863 char *field[MAXDATEFIELDS]; 864 865 /* parse this string... */ 866 while ((*str != '\0') && (nf < MAXDATEFIELDS)) 867 { 868 /* skip field separators */ 869 while (!isalnum(*str)) 870 str++; 871 872 field[nf] = str; 873 if (isdigit(*str)) 874 { 875 while (isdigit(*str)) 876 str++; 877 } 878 else if (isalpha(*str)) 879 { 880 while (isalpha(*str)) 881 str++; 882 } 883 884 if (*str != '\0') 885 *str++ = '\0'; 886 nf++; 887 } 888 889 /* don't allow too many fields */ 890 if (nf > 3) 891 return -1; 892 893 *tmask = 0; 894 895 /* look first for text fields, since that will be unambiguous month */ 896 for (i = 0; i < nf; i++) 897 { 898 if (isalpha(*field[i])) 899 { 900 type = DecodeSpecial(i, field[i], &val); 901 if (type == IGNOREFIELD) 902 continue; 903 904 dmask = DTK_M(type); 905 switch (type) 906 { 907 case MONTH: 908 #ifdef DATEDEBUG 909 printf("DecodeDate- month field %s value is %d\n", field[i], val); 910 #endif 911 tm->tm_mon = val; 912 break; 913 914 default: 915 #ifdef DATEDEBUG 916 printf("DecodeDate- illegal field %s value is %d\n", field[i], val); 917 #endif 918 return -1; 919 } 920 if (fmask & dmask) 921 return -1; 922 923 fmask |= dmask; 924 *tmask |= dmask; 925 926 /* mark this field as being completed */ 927 field[i] = NULL; 928 } 929 } 930 931 /* now pick up remaining numeric fields */ 932 for (i = 0; i < nf; i++) 933 { 934 if (field[i] == NULL) 935 continue; 936 937 if ((len = strlen(field[i])) <= 0) 938 return -1; 939 940 if (DecodeNumber(len, field[i], fmask, &dmask, tm, &fsec) != 0) 941 return -1; 942 943 if (fmask & dmask) 944 return -1; 945 946 fmask |= dmask; 947 *tmask |= dmask; 948 } 949 950 return 0; 951 } /* DecodeDate() */ 952 952 953 953 … … 955 955 * Decode time string which includes delimiters. 956 956 * Only check the lower limit on hours, since this same code 957 * 957 * can be used to represent time spans. 958 958 */ 959 959 static int 960 960 DecodeTime(char *str, int fmask, int *tmask, struct tm * tm, double *fsec) 961 961 { 962 char*cp;963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 } 962 char *cp; 963 964 *tmask = DTK_TIME_M; 965 966 tm->tm_hour = strtol(str, &cp, 10); 967 if (*cp != ':') 968 return -1; 969 str = cp + 1; 970 tm->tm_min = strtol(str, &cp, 10); 971 if (*cp == '\0') 972 { 973 tm->tm_sec = 0; 974 *fsec = 0; 975 976 } 977 else if (*cp != ':') 978 { 979 return -1; 980 981 } 982 else 983 { 984 str = cp + 1; 985 tm->tm_sec = strtol(str, &cp, 10); 986 if (*cp == '\0') 987 *fsec = 0; 988 else if (*cp == '.') 989 { 990 str = cp; 991 *fsec = strtod(str, &cp); 992 if (cp == str) 993 return -1; 994 } 995 else 996 return -1; 997 } 998 999 /* do a sanity check */ 1000 if ((tm->tm_hour < 0) 1001 || (tm->tm_min < 0) || (tm->tm_min > 59) 1002 || (tm->tm_sec < 0) || (tm->tm_sec > 59)) 1003 return -1; 1004 1005 return 0; 1006 } /* DecodeTime() */ 1007 1007 1008 1008 … … 1013 1013 DecodeNumber(int flen, char *str, int fmask, int *tmask, struct tm * tm, double *fsec) 1014 1014 { 1015 intval;1016 char*cp;1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 #ifdef DATEDEBUG 1031 1032 #endif 1033 1034 1035 1036 1037 #ifdef DATEDEBUG 1038 1039 #endif 1040 1041 1042 1043 1044 1045 1046 1047 1048 #ifdef DATEDEBUG 1049 1050 #endif 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 #ifdef DATEDEBUG 1074 1075 #endif 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 #ifdef DATEDEBUG 1086 1087 #endif 1088 1089 1090 1091 1092 1093 1094 1095 #ifdef DATEDEBUG 1096 1097 #endif 1098 1099 1100 1101 1102 1103 1104 1105 #ifdef DATEDEBUG 1106 1107 #endif 1108 1109 1110 1111 1112 1113 1114 #ifdef DATEDEBUG 1115 1116 #endif 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 } 1015 int val; 1016 char *cp; 1017 1018 *tmask = 0; 1019 1020 val = strtol(str, &cp, 10); 1021 if (cp == str) 1022 return -1; 1023 if (*cp == '.') 1024 { 1025 *fsec = strtod(cp, &cp); 1026 if (*cp != '\0') 1027 return -1; 1028 } 1029 1030 #ifdef DATEDEBUG 1031 printf("DecodeNumber- %s is %d fmask=%08x tmask=%08x\n", str, val, fmask, *tmask); 1032 #endif 1033 1034 /* enough digits to be unequivocal year? */ 1035 if (flen == 4) 1036 { 1037 #ifdef DATEDEBUG 1038 printf("DecodeNumber- match %d (%s) as year\n", val, str); 1039 #endif 1040 *tmask = DTK_M(YEAR); 1041 1042 /* already have a year? then see if we can substitute... */ 1043 if (fmask & DTK_M(YEAR)) 1044 { 1045 if ((!(fmask & DTK_M(DAY))) 1046 && ((tm->tm_year >= 1) && (tm->tm_year <= 31))) 1047 { 1048 #ifdef DATEDEBUG 1049 printf("DecodeNumber- misidentified year previously; swap with day %d\n", tm->tm_mday); 1050 #endif 1051 tm->tm_mday = tm->tm_year; 1052 *tmask = DTK_M(DAY); 1053 } 1054 } 1055 1056 tm->tm_year = val; 1057 1058 /* special case day of year? */ 1059 } 1060 else if ((flen == 3) && (fmask & DTK_M(YEAR)) 1061 && ((val >= 1) && (val <= 366))) 1062 { 1063 *tmask = (DTK_M(DOY) | DTK_M(MONTH) | DTK_M(DAY)); 1064 tm->tm_yday = val; 1065 j2date((date2j(tm->tm_year, 1, 1) + tm->tm_yday - 1), 1066 &tm->tm_year, &tm->tm_mon, &tm->tm_mday); 1067 1068 /* already have year? then could be month */ 1069 } 1070 else if ((fmask & DTK_M(YEAR)) && (!(fmask & DTK_M(MONTH))) 1071 && ((val >= 1) && (val <= 12))) 1072 { 1073 #ifdef DATEDEBUG 1074 printf("DecodeNumber- match %d (%s) as month\n", val, str); 1075 #endif 1076 *tmask = DTK_M(MONTH); 1077 tm->tm_mon = val; 1078 1079 /* no year and EuroDates enabled? then could be day */ 1080 } 1081 else if ((EuroDates || (fmask & DTK_M(MONTH))) 1082 && (!(fmask & DTK_M(YEAR)) && !(fmask & DTK_M(DAY))) 1083 && ((val >= 1) && (val <= 31))) 1084 { 1085 #ifdef DATEDEBUG 1086 printf("DecodeNumber- match %d (%s) as day\n", val, str); 1087 #endif 1088 *tmask = DTK_M(DAY); 1089 tm->tm_mday = val; 1090 1091 } 1092 else if ((!(fmask & DTK_M(MONTH))) 1093 && ((val >= 1) && (val <= 12))) 1094 { 1095 #ifdef DATEDEBUG 1096 printf("DecodeNumber- (2) match %d (%s) as month\n", val, str); 1097 #endif 1098 *tmask = DTK_M(MONTH); 1099 tm->tm_mon = val; 1100 1101 } 1102 else if ((!(fmask & DTK_M(DAY))) 1103 && ((val >= 1) && (val <= 31))) 1104 { 1105 #ifdef DATEDEBUG 1106 printf("DecodeNumber- (2) match %d (%s) as day\n", val, str); 1107 #endif 1108 *tmask = DTK_M(DAY); 1109 tm->tm_mday = val; 1110 1111 } 1112 else if (!(fmask & DTK_M(YEAR))) 1113 { 1114 #ifdef DATEDEBUG 1115 printf("DecodeNumber- (2) match %d (%s) as year\n", val, str); 1116 #endif 1117 *tmask = DTK_M(YEAR); 1118 tm->tm_year = val; 1119 if (tm->tm_year < 70) 1120 tm->tm_year += 2000; 1121 else if (tm->tm_year < 100) 1122 tm->tm_year += 1900; 1123 1124 } 1125 else 1126 return -1; 1127 1128 return 0; 1129 } /* DecodeNumber() */ 1130 1130 1131 1131 … … 1136 1136 DecodeNumberField(int len, char *str, int fmask, int *tmask, struct tm * tm, double *fsec) 1137 1137 { 1138 char*cp;1139 1140 1141 1142 1143 #ifdef DATEDEBUG 1144 1145 #endif 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 #ifdef DATEDEBUG 1160 1161 #endif 1162 1163 1164 #ifdef DATEDEBUG 1165 1166 #endif 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 #ifdef DATEDEBUG 1178 1179 #endif 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 #ifdef DATEDEBUG 1192 1193 #endif 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 } 1138 char *cp; 1139 1140 /* yyyymmdd? */ 1141 if (len == 8) 1142 { 1143 #ifdef DATEDEBUG 1144 printf("DecodeNumberField- %s is 8 character date fmask=%08x tmask=%08x\n", str, fmask, *tmask); 1145 #endif 1146 1147 *tmask = DTK_DATE_M; 1148 1149 tm->tm_mday = atoi(str + 6); 1150 *(str + 6) = '\0'; 1151 tm->tm_mon = atoi(str + 4); 1152 *(str + 4) = '\0'; 1153 tm->tm_year = atoi(str + 0); 1154 1155 /* yymmdd or hhmmss? */ 1156 } 1157 else if (len == 6) 1158 { 1159 #ifdef DATEDEBUG 1160 printf("DecodeNumberField- %s is 6 characters fmask=%08x tmask=%08x\n", str, fmask, *tmask); 1161 #endif 1162 if (fmask & DTK_DATE_M) 1163 { 1164 #ifdef DATEDEBUG 1165 printf("DecodeNumberField- %s is time field fmask=%08x tmask=%08x\n", str, fmask, *tmask); 1166 #endif 1167 *tmask = DTK_TIME_M; 1168 tm->tm_sec = atoi(str + 4); 1169 *(str + 4) = '\0'; 1170 tm->tm_min = atoi(str + 2); 1171 *(str + 2) = '\0'; 1172 tm->tm_hour = atoi(str + 0); 1173 1174 } 1175 else 1176 { 1177 #ifdef DATEDEBUG 1178 printf("DecodeNumberField- %s is date field fmask=%08x tmask=%08x\n", str, fmask, *tmask); 1179 #endif 1180 *tmask = DTK_DATE_M; 1181 tm->tm_mday = atoi(str + 4); 1182 *(str + 4) = '\0'; 1183 tm->tm_mon = atoi(str + 2); 1184 *(str + 2) = '\0'; 1185 tm->tm_year = atoi(str + 0); 1186 } 1187 1188 } 1189 else if (strchr(str, '.') != NULL) 1190 { 1191 #ifdef DATEDEBUG 1192 printf("DecodeNumberField- %s is time field fmask=%08x tmask=%08x\n", str, fmask, *tmask); 1193 #endif 1194 *tmask = DTK_TIME_M; 1195 tm->tm_sec = strtod((str + 4), &cp); 1196 if (cp == (str + 4)) 1197 return -1; 1198 if (*cp == '.') 1199 *fsec = strtod(cp, NULL); 1200 *(str + 4) = '\0'; 1201 tm->tm_min = strtod((str + 2), &cp); 1202 *(str + 2) = '\0'; 1203 tm->tm_hour = strtod((str + 0), &cp); 1204 1205 } 1206 else 1207 return -1; 1208 1209 return 0; 1210 } /* DecodeNumberField() */ 1211 1211 1212 1212 … … 1217 1217 DecodeTimezone(char *str, int *tzp) 1218 1218 { 1219 inttz;1220 inthr,1221 1222 char*cp;1223 intlen;1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 } 1219 int tz; 1220 int hr, 1221 min; 1222 char *cp; 1223 int len; 1224 1225 /* assume leading character is "+" or "-" */ 1226 hr = strtol((str + 1), &cp, 10); 1227 1228 /* explicit delimiter? */ 1229 if (*cp == ':') 1230 { 1231 min = strtol((cp + 1), &cp, 10); 1232 1233 /* otherwise, might have run things together... */ 1234 } 1235 else if ((*cp == '\0') && ((len = strlen(str)) > 3)) 1236 { 1237 min = strtol((str + len - 2), &cp, 10); 1238 *(str + len - 2) = '\0'; 1239 hr = strtol((str + 1), &cp, 10); 1240 1241 } 1242 else 1243 min = 0; 1244 1245 tz = (hr * 60 + min) * 60; 1246 if (*str == '-') 1247 tz = -tz; 1248 1249 *tzp = -tz; 1250 return *cp != '\0'; 1251 } /* DecodeTimezone() */ 1252 1252 1253 1253 … … 1255 1255 * Decode text string using lookup table. 1256 1256 * Implement a cache lookup since it is likely that dates 1257 * 1257 * will be related in format. 1258 1258 */ 1259 1259 static int 1260 1260 DecodeSpecial(int field, char *lowtoken, int *val) 1261 1261 { 1262 inttype;1263 1262 int type; 1263 datetkn *tp; 1264 1264 1265 1265 #if USE_DATE_CACHE 1266 1267 1268 1269 1270 1271 #endif 1272 1266 if ((datecache[field] != NULL) 1267 && (strncmp(lowtoken, datecache[field]->token, TOKMAXLEN) == 0)) 1268 tp = datecache[field]; 1269 else 1270 { 1271 #endif 1272 tp = datebsearch(lowtoken, datetktbl, szdatetktbl); 1273 1273 #if USE_DATE_CACHE 1274 1275 1276 #endif 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 } 1274 } 1275 datecache[field] = tp; 1276 #endif 1277 if (tp == NULL) 1278 { 1279 type = IGNOREFIELD; 1280 *val = 0; 1281 } 1282 else 1283 { 1284 type = tp->type; 1285 switch (type) 1286 { 1287 case TZ: 1288 case DTZ: 1289 case DTZMOD: 1290 *val = FROMVAL(tp); 1291 break; 1292 1293 default: 1294 *val = tp->value; 1295 break; 1296 } 1297 } 1298 1299 return type; 1300 } /* DecodeSpecial() */ 1301 1301 1302 1302 … … 1309 1309 datebsearch(char *key, datetkn *base, unsigned int nel) 1310 1310 { 1311 1312 1313 intresult;1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1311 datetkn *last = base + nel - 1, 1312 *position; 1313 int result; 1314 1315 while (last >= base) 1316 { 1317 position = base + ((last - base) >> 1); 1318 result = key[0] - position->token[0]; 1319 if (result == 0) 1320 { 1321 result = strncmp(key, position->token, TOKMAXLEN); 1322 if (result == 0) 1323 return position; 1324 } 1325 if (result < 0) 1326 last = position - 1; 1327 else 1328 base = position + 1; 1329 } 1330 return NULL; 1331 1331 } 1332 1332 -
trunk/src/oleaut32/safearray.c
r6689 r6711 25 25 26 26 /* Localy used methods */ 27 static INT 27 static INT 28 28 endOfDim(LONG *coor, SAFEARRAYBOUND *mat, LONG dim, LONG realDim); 29 29 30 static ULONG 30 static ULONG 31 31 calcDisplacement(LONG *coor, SAFEARRAYBOUND *mat, LONG dim); 32 32 33 static BOOL 33 static BOOL 34 34 isPointer(USHORT feature); 35 35 36 static INT 36 static INT 37 37 getFeatures(VARTYPE vt); 38 38 39 static BOOL 39 static BOOL 40 40 validCoordinate(LONG *coor, SAFEARRAY *psa); 41 41 42 static BOOL 42 static BOOL 43 43 resizeSafeArray(SAFEARRAY *psa, LONG lDelta); 44 44 45 static BOOL 45 static BOOL 46 46 validArg(SAFEARRAY *psa); 47 47 48 static ULONG 48 static ULONG 49 49 getArraySize(SAFEARRAY *psa); 50 50 51 static HRESULT 51 static HRESULT 52 52 duplicateData(SAFEARRAY *psa, SAFEARRAY **ppsaOut); 53 53 … … 59 59 { 60 60 /* this is taken from wtypes.h. Only [S]es are supported by the SafeArray */ 61 VARTYPE_NOT_SUPPORTED, /* VT_EMPTY [V] [P] nothing*/62 VARTYPE_NOT_SUPPORTED, /* VT_NULL [V] [P] SQL style Nul*/63 2, 64 4, 65 4, /* VT_R4 [V][T][P][S] 4 byte real*/66 8, /* VT_R8 [V][T][P][S] 8 byte real*/61 VARTYPE_NOT_SUPPORTED, /* VT_EMPTY [V] [P] nothing */ 62 VARTYPE_NOT_SUPPORTED, /* VT_NULL [V] [P] SQL style Nul */ 63 2, /* VT_I2 [V][T][P][S] 2 byte signed int */ 64 4, /* VT_I4 [V][T][P][S] 4 byte signed int */ 65 4, /* VT_R4 [V][T][P][S] 4 byte real */ 66 8, /* VT_R8 [V][T][P][S] 8 byte real */ 67 67 8, /* VT_CY [V][T][P][S] currency */ 68 8, 69 4, 70 4, /* VT_DISPATCH [V][T][P][S] IDispatch **/71 4, /* VT_ERROR [V][T] [S] SCODE 72 4, 73 24, /* VT_VARIANT [V][T][P][S] VARIANT * 74 4, 75 16, /* VT_DECIMAL [V][T] [S] 16 byte fixed point*/68 8, /* VT_DATE [V][T][P][S] date */ 69 4, /* VT_BSTR [V][T][P][S] OLE Automation string*/ 70 4, /* VT_DISPATCH [V][T][P][S] IDispatch * */ 71 4, /* VT_ERROR [V][T] [S] SCODE */ 72 4, /* VT_BOOL [V][T][P][S] True=-1, False=0*/ 73 24, /* VT_VARIANT [V][T][P][S] VARIANT * */ 74 4, /* VT_UNKNOWN [V][T] [S] IUnknown * */ 75 16, /* VT_DECIMAL [V][T] [S] 16 byte fixed point */ 76 76 VARTYPE_NOT_SUPPORTED, /* no VARTYPE here..... */ 77 VARTYPE_NOT_SUPPORTED, /* VT_I1 [T] signed char*/78 1, /* VT_UI1 [V][T][P][S] unsigned char*/79 VARTYPE_NOT_SUPPORTED, /* VT_UI2 [T][P] unsigned short*/80 VARTYPE_NOT_SUPPORTED, /* VT_UI4 [T][P] unsigned short*/81 VARTYPE_NOT_SUPPORTED, /* VT_I8 [T][P] signed 64-bit int*/82 VARTYPE_NOT_SUPPORTED, /* VT_UI8 [T][P] unsigned 64-bit int*/83 VARTYPE_NOT_SUPPORTED, /* VT_INT [T] signed machine int*/84 VARTYPE_NOT_SUPPORTED, /* VT_UINT [T] unsigned machine int*/85 VARTYPE_NOT_SUPPORTED, /* VT_VOID [T] C style void*/86 VARTYPE_NOT_SUPPORTED, /* VT_HRESULT [T] Standard return type*/87 VARTYPE_NOT_SUPPORTED, /* VT_PTR [T] pointer type*/88 VARTYPE_NOT_SUPPORTED, 89 VARTYPE_NOT_SUPPORTED, /* VT_CARRAY [T] C style array*/90 VARTYPE_NOT_SUPPORTED, /* VT_USERDEFINED [T] user defined type*/91 VARTYPE_NOT_SUPPORTED, /* VT_LPSTR [T][P] null terminated string*/92 VARTYPE_NOT_SUPPORTED, /* VT_LPWSTR [T][P] wide null term string*/93 VARTYPE_NOT_SUPPORTED, /* VT_FILETIME [P] FILETIME*/94 VARTYPE_NOT_SUPPORTED, 95 VARTYPE_NOT_SUPPORTED, /* VT_STREAM [P] Name of stream follows*/96 VARTYPE_NOT_SUPPORTED, /* VT_STORAGE [P] Name of storage follows*/97 VARTYPE_NOT_SUPPORTED, 98 VARTYPE_NOT_SUPPORTED, 99 VARTYPE_NOT_SUPPORTED, 100 VARTYPE_NOT_SUPPORTED, /* VT_CF [P] Clipboard format*/101 VARTYPE_NOT_SUPPORTED, /* VT_CLSID [P] A Class ID*/102 VARTYPE_NOT_SUPPORTED, /* VT_VECTOR [P] simple counted array*/103 VARTYPE_NOT_SUPPORTED, /* VT_ARRAY [V] SAFEARRAY**/104 VARTYPE_NOT_SUPPORTED /* VT_BYREF [V] void* for local use*/77 VARTYPE_NOT_SUPPORTED, /* VT_I1 [T] signed char */ 78 1, /* VT_UI1 [V][T][P][S] unsigned char */ 79 VARTYPE_NOT_SUPPORTED, /* VT_UI2 [T][P] unsigned short */ 80 VARTYPE_NOT_SUPPORTED, /* VT_UI4 [T][P] unsigned short */ 81 VARTYPE_NOT_SUPPORTED, /* VT_I8 [T][P] signed 64-bit int */ 82 VARTYPE_NOT_SUPPORTED, /* VT_UI8 [T][P] unsigned 64-bit int */ 83 VARTYPE_NOT_SUPPORTED, /* VT_INT [T] signed machine int */ 84 VARTYPE_NOT_SUPPORTED, /* VT_UINT [T] unsigned machine int */ 85 VARTYPE_NOT_SUPPORTED, /* VT_VOID [T] C style void */ 86 VARTYPE_NOT_SUPPORTED, /* VT_HRESULT [T] Standard return type */ 87 VARTYPE_NOT_SUPPORTED, /* VT_PTR [T] pointer type */ 88 VARTYPE_NOT_SUPPORTED, /* VT_SAFEARRAY [T] (use VT_ARRAY in VARIANT)*/ 89 VARTYPE_NOT_SUPPORTED, /* VT_CARRAY [T] C style array */ 90 VARTYPE_NOT_SUPPORTED, /* VT_USERDEFINED [T] user defined type */ 91 VARTYPE_NOT_SUPPORTED, /* VT_LPSTR [T][P] null terminated string */ 92 VARTYPE_NOT_SUPPORTED, /* VT_LPWSTR [T][P] wide null term string */ 93 VARTYPE_NOT_SUPPORTED, /* VT_FILETIME [P] FILETIME */ 94 VARTYPE_NOT_SUPPORTED, /* VT_BLOB [P] Length prefixed bytes */ 95 VARTYPE_NOT_SUPPORTED, /* VT_STREAM [P] Name of stream follows */ 96 VARTYPE_NOT_SUPPORTED, /* VT_STORAGE [P] Name of storage follows */ 97 VARTYPE_NOT_SUPPORTED, /* VT_STREAMED_OBJECT[P] Stream contains an object*/ 98 VARTYPE_NOT_SUPPORTED, /* VT_STORED_OBJECT [P] Storage contains object*/ 99 VARTYPE_NOT_SUPPORTED, /* VT_BLOB_OBJECT [P] Blob contains an object*/ 100 VARTYPE_NOT_SUPPORTED, /* VT_CF [P] Clipboard format */ 101 VARTYPE_NOT_SUPPORTED, /* VT_CLSID [P] A Class ID */ 102 VARTYPE_NOT_SUPPORTED, /* VT_VECTOR [P] simple counted array */ 103 VARTYPE_NOT_SUPPORTED, /* VT_ARRAY [V] SAFEARRAY* */ 104 VARTYPE_NOT_SUPPORTED /* VT_BYREF [V] void* for local use */ 105 105 }; 106 106 … … 109 109 110 110 /************************************************************************* 111 * 111 * SafeArrayAllocDescriptor 112 112 * Allocate the appropriate amount of memory for the SafeArray descriptor 113 113 */ 114 HRESULT WINAPI SafeArrayAllocDescriptor( 115 UINT cDims, 116 SAFEARRAY **ppsaOut) 114 HRESULT WINAPI SafeArrayAllocDescriptor( 115 UINT cDims, 116 SAFEARRAY **ppsaOut) 117 117 { 118 118 SAFEARRAYBOUND *sab; … … 124 124 125 125 /* Allocate memory for SAFEARRAY struc */ 126 if(( (*ppsaOut)=HeapAlloc( 126 if(( (*ppsaOut)=HeapAlloc( 127 127 GetProcessHeap(), HEAP_ZERO_MEMORY, allocSize)) == NULL){ 128 128 return(E_UNEXPECTED); … … 134 134 135 135 /************************************************************************* 136 * 136 * SafeArrayAllocData 137 137 * Allocate the appropriate amount of data for the SafeArray data 138 138 */ 139 139 HRESULT WINAPI SafeArrayAllocData( 140 SAFEARRAY *psa) 140 SAFEARRAY *psa) 141 141 { 142 142 ULONG ulWholeArraySize; /* to store the size of the whole thing */ … … 144 144 dprintf(("SafeArrayAllocData %x", psa)); 145 145 146 if(! validArg(psa)) 146 if(! validArg(psa)) 147 147 return E_INVALIDARG; 148 148 … … 150 150 151 151 /* Allocate memory for the data itself */ 152 if((psa->pvData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 152 if((psa->pvData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 153 153 psa->cbElements*ulWholeArraySize)) == NULL) 154 154 return(E_UNEXPECTED); 155 155 156 TRACE("SafeArray: %lu bytes allocated for data at %p (%lu objects).\n", 156 TRACE("SafeArray: %lu bytes allocated for data at %p (%lu objects).\n", 157 157 psa->cbElements*ulWholeArraySize, psa->pvData, ulWholeArraySize); 158 158 … … 161 161 162 162 /************************************************************************* 163 * 164 * Create a SafeArray object by encapsulating AllocDescriptor and AllocData 163 * SafeArrayCreate 164 * Create a SafeArray object by encapsulating AllocDescriptor and AllocData 165 165 */ 166 166 SAFEARRAY* WINAPI SafeArrayCreate( 167 VARTYPE vt, 168 UINT cDims, 167 VARTYPE vt, 168 UINT cDims, 169 169 SAFEARRAYBOUND *rgsabound) 170 170 { … … 184 184 return NULL; 185 185 186 /* setup data members... */ 186 /* setup data members... */ 187 187 psa->cDims = cDims; 188 188 psa->fFeatures = getFeatures(vt); … … 197 197 } 198 198 199 /* allocate memory for the data... */ 199 /* allocate memory for the data... */ 200 200 if( FAILED( hRes = SafeArrayAllocData(psa))) { 201 SafeArrayDestroyDescriptor(psa); 201 SafeArrayDestroyDescriptor(psa); 202 202 ERR("() : Failed to allocate the Safe Array data\n"); 203 203 return NULL; 204 204 } 205 205 206 return(psa); 207 } 208 209 /************************************************************************* 210 * 206 return(psa); 207 } 208 209 /************************************************************************* 210 * SafeArrayDestroyDescriptor 211 211 * Frees the memory associated with the descriptor. 212 212 */ … … 217 217 218 218 /* Check for lockness before to free... */ 219 if(psa->cLocks > 0) 219 if(psa->cLocks > 0) 220 220 return DISP_E_ARRAYISLOCKED; 221 221 222 222 /* The array is unlocked, then, deallocate memory */ 223 if(HeapFree( GetProcessHeap(), 0, psa) == FALSE) 223 if(HeapFree( GetProcessHeap(), 0, psa) == FALSE) 224 224 return E_UNEXPECTED; 225 225 226 226 return(S_OK); 227 227 } … … 229 229 230 230 /************************************************************************* 231 * 231 * SafeArrayLock 232 232 * Increment the lock counter 233 233 * 234 234 * Doc says (MSDN Library ) that psa->pvData should be made available (!= NULL) 235 * only when psa->cLocks is > 0... I don't get it since pvData is allocated 236 * before the array is locked, therefore 235 * only when psa->cLocks is > 0... I don't get it since pvData is allocated 236 * before the array is locked, therefore 237 237 */ 238 238 HRESULT WINAPI SafeArrayLock( … … 241 241 dprintf(("SafeArrayLock %x", psa)); 242 242 243 if(! validArg(psa)) 243 if(! validArg(psa)) 244 244 return E_INVALIDARG; 245 245 … … 250 250 251 251 /************************************************************************* 252 * 252 * SafeArrayUnlock 253 253 * Decrement the lock counter 254 254 */ … … 258 258 dprintf(("SafeArrayUnlock %x", psa)); 259 259 260 if(! validArg(psa)) 261 return E_INVALIDARG; 262 263 if (psa->cLocks > 0) 260 if(! validArg(psa)) 261 return E_INVALIDARG; 262 263 if (psa->cLocks > 0) 264 264 psa->cLocks--; 265 265 … … 269 269 270 270 /************************************************************************* 271 * 271 * SafeArrayPutElement 272 272 * Set the data at the given coordinate 273 273 */ 274 274 HRESULT WINAPI SafeArrayPutElement( 275 SAFEARRAY *psa, 276 LONG *rgIndices, 275 SAFEARRAY *psa, 276 LONG *rgIndices, 277 277 void *pv) 278 278 { 279 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 279 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 280 280 the desired one... */ 281 281 PVOID elementStorageAddress = NULL; /* Adress to store the data */ … … 285 285 286 286 /* Validate the index given */ 287 if(! validCoordinate(rgIndices, psa)) 287 if(! validCoordinate(rgIndices, psa)) 288 288 return DISP_E_BADINDEX; 289 289 if(! validArg(psa)) … … 294 294 /* Figure out the number of items to skip */ 295 295 stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims); 296 296 297 297 /* Figure out the number of byte to skip ... */ 298 298 elementStorageAddress = (char *) psa->pvData+(stepCountInSAData*psa->cbElements); 299 299 300 300 if(isPointer(psa->fFeatures)) { /* increment ref count for this pointer */ 301 301 302 *((VOID**)elementStorageAddress) = *(VOID**)pv; 302 *((VOID**)elementStorageAddress) = *(VOID**)pv; 303 303 IUnknown_AddRef( *(IUnknown**)pv); 304 304 305 } else { 305 } else { 306 306 307 307 if(psa->fFeatures == FADF_BSTR) { /* Create a new object */ 308 308 309 309 if((pbstrReAllocStr = SysAllocString( (OLECHAR*)pv )) == NULL) { 310 SafeArrayUnlock(psa); 310 SafeArrayUnlock(psa); 311 311 return E_OUTOFMEMORY; 312 } else 312 } else 313 313 *((BSTR*)elementStorageAddress) = pbstrReAllocStr; 314 314 … … 323 323 324 324 TRACE("SafeArray: item put at adress %p.\n",elementStorageAddress); 325 return SafeArrayUnlock(psa); 326 } 327 328 329 /************************************************************************* 330 * 325 return SafeArrayUnlock(psa); 326 } 327 328 329 /************************************************************************* 330 * SafeArrayGetElement 331 331 * Return the data element corresponding the the given coordinate 332 332 */ 333 333 HRESULT WINAPI SafeArrayGetElement( 334 SAFEARRAY *psa, 335 LONG *rgIndices, 334 SAFEARRAY *psa, 335 LONG *rgIndices, 336 336 void *pv) 337 337 { 338 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 338 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 339 339 the desired one... */ 340 340 PVOID elementStorageAddress = NULL; /* Adress to store the data */ … … 343 343 dprintf(("SafeArrayGetElement %x %x %x", psa, rgIndices, pv)); 344 344 345 if(! validArg(psa)) 346 return E_INVALIDARG; 347 345 if(! validArg(psa)) 346 return E_INVALIDARG; 347 348 348 if(! validCoordinate(rgIndices, psa)) /* Validate the index given */ 349 349 return(DISP_E_BADINDEX); … … 353 353 /* Figure out the number of items to skip */ 354 354 stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims); 355 355 356 356 /* Figure out the number of byte to skip ... */ 357 357 elementStorageAddress = (char *) psa->pvData+(stepCountInSAData*psa->cbElements); 358 358 359 359 if( psa->fFeatures == FADF_BSTR) { /* reallocate the obj */ 360 if( (pbstrReturnedStr = 360 if( (pbstrReturnedStr = 361 361 SysAllocString( *(OLECHAR**)elementStorageAddress )) == NULL) { 362 362 SafeArrayUnlock(psa); 363 363 return E_OUTOFMEMORY; 364 } else 365 *((BSTR*)pv) = pbstrReturnedStr; 366 364 } else 365 *((BSTR*)pv) = pbstrReturnedStr; 366 367 367 } else if( isPointer(psa->fFeatures) ) /* simply copy the pointer */ 368 pv = *((PVOID*)elementStorageAddress); 368 pv = *((PVOID*)elementStorageAddress); 369 369 else /* copy the bytes */ 370 370 memcpy(pv, elementStorageAddress, SafeArrayGetElemsize(psa) ); … … 375 375 } 376 376 377 return( SafeArrayUnlock(psa) ); 378 } 379 380 /************************************************************************* 381 * 377 return( SafeArrayUnlock(psa) ); 378 } 379 380 /************************************************************************* 381 * SafeArrayGetUBound 382 382 * return the UP bound for a given array dimension 383 383 */ 384 384 HRESULT WINAPI SafeArrayGetUBound( 385 SAFEARRAY *psa, 385 SAFEARRAY *psa, 386 386 UINT nDim, 387 387 LONG *plUbound) … … 390 390 dprintf(("SafeArrayGetUBound %x %x %x", psa, nDim, plUbound)); 391 391 392 if(! validArg(psa)) 393 return E_INVALIDARG; 394 395 if(nDim > psa->cDims) 392 if(! validArg(psa)) 393 return E_INVALIDARG; 394 395 if(nDim > psa->cDims) 396 396 return DISP_E_BADINDEX; 397 397 398 *plUbound = psa->rgsabound[nDim-1].lLbound + 398 *plUbound = psa->rgsabound[nDim-1].lLbound + 399 399 psa->rgsabound[nDim-1].cElements - 1; 400 400 … … 403 403 404 404 /************************************************************************* 405 * 406 * Return the LO bound for a given array dimension 405 * SafeArrayGetLBound 406 * Return the LO bound for a given array dimension 407 407 */ 408 408 HRESULT WINAPI SafeArrayGetLBound( 409 409 SAFEARRAY *psa, 410 UINT nDim, 410 UINT nDim, 411 411 LONG *plLbound) 412 412 { 413 if(! validArg(psa)) 414 return E_INVALIDARG; 415 416 if(nDim > psa->cDims) 413 if(! validArg(psa)) 414 return E_INVALIDARG; 415 416 if(nDim > psa->cDims) 417 417 return DISP_E_BADINDEX; 418 418 … … 422 422 423 423 /************************************************************************* 424 * 424 * SafeArrayGetDim 425 425 * returns the number of dimension in the array 426 426 */ 427 427 UINT WINAPI SafeArrayGetDim( 428 428 SAFEARRAY * psa) 429 { 429 { 430 430 /* 431 431 * A quick test in Windows shows that the behavior here for an invalid 432 432 * pointer is to return 0. 433 433 */ 434 if(! validArg(psa)) 434 if(! validArg(psa)) 435 435 return 0; 436 436 … … 439 439 440 440 /************************************************************************* 441 * 441 * SafeArrayGetElemsize 442 442 * Return the size of the element in the array 443 443 */ 444 444 UINT WINAPI SafeArrayGetElemsize( 445 445 SAFEARRAY * psa) 446 { 446 { 447 447 /* 448 448 * A quick test in Windows shows that the behavior here for an invalid 449 449 * pointer is to return 0. 450 450 */ 451 if(! validArg(psa)) 451 if(! validArg(psa)) 452 452 return 0; 453 453 … … 456 456 457 457 /************************************************************************* 458 * 459 * increment the access count and return the data 458 * SafeArrayAccessData 459 * increment the access count and return the data 460 460 */ 461 461 HRESULT WINAPI SafeArrayAccessData( 462 SAFEARRAY *psa, 462 SAFEARRAY *psa, 463 463 void **ppvData) 464 { 464 { 465 465 HRESULT hRes; 466 466 467 if(! validArg(psa)) 467 if(! validArg(psa)) 468 468 return E_INVALIDARG; 469 469 … … 471 471 472 472 switch (hRes) { 473 case S_OK: 473 case S_OK: 474 474 (*ppvData) = psa->pvData; 475 475 break; … … 478 478 return E_INVALIDARG; 479 479 } 480 480 481 481 return S_OK; 482 482 } … … 484 484 485 485 /************************************************************************* 486 * 486 * SafeArrayUnaccessData 487 487 * Decrement the access count 488 488 */ 489 489 HRESULT WINAPI SafeArrayUnaccessData( 490 490 SAFEARRAY * psa) 491 { 492 if(! validArg(psa)) 491 { 492 if(! validArg(psa)) 493 493 return E_INVALIDARG; 494 494 … … 496 496 } 497 497 498 /************************************************************************ 499 * 498 /************************************************************************ 499 * SafeArrayPtrOfIndex 500 500 * Return a pointer to the element at rgIndices 501 501 */ 502 502 HRESULT WINAPI SafeArrayPtrOfIndex( 503 SAFEARRAY *psa, 504 LONG *rgIndices, 503 SAFEARRAY *psa, 504 LONG *rgIndices, 505 505 void **ppvData) 506 { 507 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 506 { 507 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 508 508 the desired one... */ 509 509 510 if(! validArg(psa)) 511 return E_INVALIDARG; 512 513 if(! validCoordinate(rgIndices, psa)) 510 if(! validArg(psa)) 511 return E_INVALIDARG; 512 513 if(! validCoordinate(rgIndices, psa)) 514 514 return DISP_E_BADINDEX; 515 515 516 516 /* Figure out the number of items to skip */ 517 517 stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims); 518 518 519 519 *ppvData = (char *) psa->pvData+(stepCountInSAData*psa->cbElements); 520 520 … … 522 522 } 523 523 524 /************************************************************************ 525 * 524 /************************************************************************ 525 * SafeArrayDestroyData 526 526 * Frees the memory data bloc 527 527 */ 528 528 HRESULT WINAPI SafeArrayDestroyData( 529 529 SAFEARRAY *psa) 530 { 530 { 531 531 HRESULT hRes; 532 532 ULONG ulWholeArraySize; /* count spot in array */ … … 535 535 BSTR bstr; 536 536 537 if(! validArg(psa)) 538 return E_INVALIDARG; 539 540 if(psa->cLocks > 0) 537 if(! validArg(psa)) 538 return E_INVALIDARG; 539 540 if(psa->cLocks > 0) 541 541 return DISP_E_ARRAYISLOCKED; 542 542 … … 546 546 547 547 for(ulDataIter=0; ulDataIter < ulWholeArraySize; ulDataIter++) { 548 punk = *(IUnknown**)((char *) psa->pvData+(ulDataIter*(psa->cbElements))); 549 550 if( punk != NULL) 548 punk = *(IUnknown**)((char *) psa->pvData+(ulDataIter*(psa->cbElements))); 549 550 if( punk != NULL) 551 551 IUnknown_Release(punk); 552 552 } … … 557 557 bstr = *(BSTR*)((char *) psa->pvData+(ulDataIter*(psa->cbElements))); 558 558 559 if( bstr != NULL) 559 if( bstr != NULL) 560 560 SysFreeString( bstr ); 561 561 } 562 562 } 563 564 /* check if this array is a Vector, in which case do not free the data 563 564 /* check if this array is a Vector, in which case do not free the data 565 565 block since it has been allocated by AllocDescriptor and therefore 566 566 deserve to be freed by DestroyDescriptor */ … … 573 573 psa->pvData = NULL; 574 574 } 575 575 576 576 return S_OK; 577 577 } 578 578 579 /************************************************************************ 580 * 579 /************************************************************************ 580 * SafeArrayCopyData 581 581 * Copy the psaSource's data block into psaTarget if dimension and size 582 582 * permits it. … … 585 585 SAFEARRAY *psaSource, 586 586 SAFEARRAY **psaTarget) 587 { 587 { 588 588 USHORT cDimCount; /* looper */ 589 589 LONG lDelta; /* looper */ 590 IUnknown *punk; 590 IUnknown *punk; 591 591 ULONG ulWholeArraySize; /* Number of item in SA */ 592 592 BSTR bstr; 593 593 594 if(! (validArg(psaSource) && validArg(*psaTarget)) ) 594 if(! (validArg(psaSource) && validArg(*psaTarget)) ) 595 595 return E_INVALIDARG; 596 596 … … 598 598 return E_INVALIDARG; 599 599 600 ulWholeArraySize = getArraySize(psaSource); 600 ulWholeArraySize = getArraySize(psaSource); 601 601 602 602 /* The two arrays boundaries must be of same lenght */ 603 603 for(cDimCount=0;cDimCount < psaSource->cDims; cDimCount++) 604 if( psaSource->rgsabound[cDimCount].cElements != 604 if( psaSource->rgsabound[cDimCount].cElements != 605 605 (*psaTarget)->rgsabound[cDimCount].cElements) 606 606 return E_INVALIDARG; 607 607 608 if( isPointer((*psaTarget)->fFeatures) ) { /* the target contains ptr 608 if( isPointer((*psaTarget)->fFeatures) ) { /* the target contains ptr 609 609 that must be released */ 610 610 for(lDelta=0;lDelta < ulWholeArraySize; lDelta++) { … … 612 612 ((char *) (*psaTarget)->pvData + (lDelta * (*psaTarget)->cbElements)); 613 613 614 if( punk != NULL) 614 if( punk != NULL) 615 615 IUnknown_Release(punk); 616 616 } 617 617 618 618 } else if( (*psaTarget)->fFeatures & FADF_BSTR) { /* the target contain BSTR 619 that must be freed */ 619 that must be freed */ 620 620 for(lDelta=0;lDelta < ulWholeArraySize; lDelta++) { 621 bstr = 621 bstr = 622 622 *(BSTR*)((char *) (*psaTarget)->pvData + (lDelta * (*psaTarget)->cbElements)); 623 623 624 if( bstr != NULL) 624 if( bstr != NULL) 625 625 SysFreeString( bstr ); 626 626 } … … 630 630 } 631 631 632 /************************************************************************ 633 * 632 /************************************************************************ 633 * SafeArrayDestroy 634 634 * Deallocates all memory reserved for the SafeArray 635 635 */ 636 636 HRESULT WINAPI SafeArrayDestroy( 637 637 SAFEARRAY * psa) 638 { 638 { 639 639 HRESULT hRes; 640 640 641 if(! validArg(psa)) 642 return E_INVALIDARG; 643 644 if(psa->cLocks > 0) 641 if(! validArg(psa)) 642 return E_INVALIDARG; 643 644 if(psa->cLocks > 0) 645 645 return DISP_E_ARRAYISLOCKED; 646 646 … … 652 652 } 653 653 654 /************************************************************************ 655 * 654 /************************************************************************ 655 * SafeArrayCopy 656 656 * Make a dupplicate of a SafeArray 657 657 */ 658 658 HRESULT WINAPI SafeArrayCopy( 659 SAFEARRAY *psa, 659 SAFEARRAY *psa, 660 660 SAFEARRAY **ppsaOut) 661 { 661 { 662 662 HRESULT hRes; 663 663 DWORD dAllocSize; 664 664 ULONG ulWholeArraySize; /* size of the thing */ 665 665 666 if(! validArg(psa)) 666 if(! validArg(psa)) 667 667 return E_INVALIDARG; 668 668 … … 670 670 671 671 /* Duplicate the SAFEARRAY struc */ 672 memcpy(*ppsaOut, psa, 672 memcpy(*ppsaOut, psa, 673 673 sizeof(*psa)+(sizeof(*(psa->rgsabound))*(psa->cDims-1))); 674 674 … … 677 677 /* make sure the new safe array doesn't have the FADF_CREATEVECTOR flag, 678 678 because the data has not been allocated with the descriptor. */ 679 (*ppsaOut)->fFeatures &= ~FADF_CREATEVECTOR; 680 681 /* Get the allocated memory size for source and allocate it for target */ 679 (*ppsaOut)->fFeatures &= ~FADF_CREATEVECTOR; 680 681 /* Get the allocated memory size for source and allocate it for target */ 682 682 ulWholeArraySize = getArraySize(psa); /* Number of item in SA */ 683 683 dAllocSize = ulWholeArraySize*psa->cbElements; 684 684 685 (*ppsaOut)->pvData = 685 (*ppsaOut)->pvData = 686 686 HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dAllocSize); 687 687 if( (*ppsaOut)->pvData != NULL) { /* HeapAlloc succeed */ … … 693 693 return hRes; 694 694 } 695 695 696 696 } else { /* failed to allocate or dupplicate... */ 697 697 SafeArrayDestroyDescriptor(*ppsaOut); … … 705 705 } 706 706 707 /************************************************************************ 708 * 709 * Creates a one dimension safearray where the data is next to the 707 /************************************************************************ 708 * SafeArrayCreateVector 709 * Creates a one dimension safearray where the data is next to the 710 710 * SAFEARRAY structure. 711 711 */ 712 712 SAFEARRAY* WINAPI SafeArrayCreateVector( 713 VARTYPE vt, 714 LONG lLbound, 715 ULONG cElements) 716 { 713 VARTYPE vt, 714 LONG lLbound, 715 ULONG cElements) 716 { 717 717 SAFEARRAY *psa; 718 718 … … 723 723 724 724 /* Allocate memory for the array descriptor and data contiguously */ 725 if( FAILED( psa = HeapAlloc( GetProcessHeap(), 726 HEAP_ZERO_MEMORY, 725 if( FAILED( psa = HeapAlloc( GetProcessHeap(), 726 HEAP_ZERO_MEMORY, 727 727 (sizeof(*psa) + (VARTYPE_SIZE[vt] * cElements))))) { 728 728 return NULL; 729 729 } 730 731 /* setup data members... */ 730 731 /* setup data members... */ 732 732 psa->cDims = 1; /* always and forever */ 733 733 psa->fFeatures = getFeatures(vt) | FADF_CREATEVECTOR; /* undocumented flag used by Microsoft */ … … 739 739 psa->rgsabound[0].lLbound = lLbound; 740 740 741 return(psa); 742 } 743 744 /************************************************************************ 745 * 741 return(psa); 742 } 743 744 /************************************************************************ 745 * SafeArrayRedim 746 746 * Changes the caracteristics of the last dimension of the SafeArray 747 747 */ 748 748 HRESULT WINAPI SafeArrayRedim( 749 SAFEARRAY *psa, 749 SAFEARRAY *psa, 750 750 SAFEARRAYBOUND *psaboundNew) 751 { 751 { 752 752 LONG lDelta; /* hold difference in size */ 753 753 USHORT cDims=1; /* dims counter */ 754 754 755 if( !validArg(psa) ) 756 return E_INVALIDARG; 757 758 if( psa->cLocks > 0 ) 755 if( !validArg(psa) ) 756 return E_INVALIDARG; 757 758 if( psa->cLocks > 0 ) 759 759 return DISP_E_ARRAYISLOCKED; 760 760 761 if( psa->fFeatures & FADF_FIXEDSIZE ) 762 return E_INVALIDARG; 763 764 if( SafeArrayLock(psa)==E_UNEXPECTED ) 761 if( psa->fFeatures & FADF_FIXEDSIZE ) 762 return E_INVALIDARG; 763 764 if( SafeArrayLock(psa)==E_UNEXPECTED ) 765 765 return E_UNEXPECTED;/* UNDOC error condition */ 766 766 … … 774 774 775 775 } else /* need to enlarge (lDelta +) reduce (lDelta -) */ 776 if(! resizeSafeArray(psa, lDelta)) 776 if(! resizeSafeArray(psa, lDelta)) 777 777 return E_UNEXPECTED; /* UNDOC error condition */ 778 778 779 /* the only modifyable dimension sits in [0] as the dimensions were reversed 779 /* the only modifyable dimension sits in [0] as the dimensions were reversed 780 780 at array creation time... */ 781 781 psa->rgsabound[0].cElements = psaboundNew->cElements; … … 789 789 ************************************************************************/ 790 790 791 /************************************************************************ 791 /************************************************************************ 792 792 * Used to validate the SAFEARRAY type of arg 793 793 */ 794 794 static BOOL validArg( 795 SAFEARRAY *psa) 795 SAFEARRAY *psa) 796 796 { 797 797 SAFEARRAYBOUND *sab; … … 822 822 } 823 823 824 /************************************************************************ 824 /************************************************************************ 825 825 * Used to reallocate memory 826 826 */ 827 827 static BOOL resizeSafeArray( 828 SAFEARRAY *psa, 828 SAFEARRAY *psa, 829 829 LONG lDelta) 830 830 { 831 831 ULONG ulWholeArraySize; /* use as multiplicator */ 832 PVOID pvNewBlock = NULL; 832 PVOID pvNewBlock = NULL; 833 833 IUnknown *punk; 834 834 BSTR bstr; … … 838 838 if(lDelta < 0) { /* array needs to be shorthen */ 839 839 if( isPointer(psa->fFeatures)) /* ptr that need to be released */ 840 841 840 for(;lDelta < 0; lDelta++) { 841 punk = *(IUnknown**) 842 842 ((char *) psa->pvData+((ulWholeArraySize+lDelta)*psa->cbElements)); 843 843 844 844 if( punk != NULL ) 845 845 IUnknown_Release(punk); 846 846 } 847 847 848 848 else if(psa->fFeatures & FADF_BSTR) /* BSTR that need to be freed */ 849 849 for(;lDelta < 0; lDelta++) { 850 850 bstr = *(BSTR*) 851 851 ((char *) psa->pvData+((ulWholeArraySize+lDelta)*psa->cbElements)); … … 858 858 if (!(psa->fFeatures & FADF_CREATEVECTOR)) 859 859 { 860 /* Ok now, if we are enlarging the array, we *MUST* move the whole block 860 /* Ok now, if we are enlarging the array, we *MUST* move the whole block 861 861 pointed to by pvData. If we are shorthening the array, this move is 862 optional but we do it anyway becuase the benefit is that we are 862 optional but we do it anyway becuase the benefit is that we are 863 863 releasing to the system the unused memory */ 864 864 865 if((pvNewBlock = HeapReAlloc(GetProcessHeap(), 0, psa->pvData, 866 (ulWholeArraySize + lDelta) * psa->cbElements)) == NULL) 865 if((pvNewBlock = HeapReAlloc(GetProcessHeap(), 0, psa->pvData, 866 (ulWholeArraySize + lDelta) * psa->cbElements)) == NULL) 867 867 return FALSE; /* TODO If we get here it means: 868 868 SHRINK situation : we've deleted the undesired … … 873 873 else 874 874 { 875 /* Allocate a new block, because the previous data has been allocated with 875 /* Allocate a new block, because the previous data has been allocated with 876 876 the descriptor in SafeArrayCreateVector function. */ 877 877 878 878 if((pvNewBlock = HeapAlloc(GetProcessHeap(), 0, 879 ulWholeArraySize * psa->cbElements)) == NULL) 879 ulWholeArraySize * psa->cbElements)) == NULL) 880 880 return FALSE; 881 881 … … 887 887 } 888 888 889 /************************************************************************ 890 * Used to set the fFeatures data member of the SAFEARRAY structure. 889 /************************************************************************ 890 * Used to set the fFeatures data member of the SAFEARRAY structure. 891 891 */ 892 892 static INT getFeatures( 893 VARTYPE vt) 893 VARTYPE vt) 894 894 { 895 895 switch(vt) { … … 901 901 } 902 902 903 /************************************************************************ 904 * Used to figure out if the fFeatures data member of the SAFEARRAY 905 * structure contain any information about the type of data stored... 903 /************************************************************************ 904 * Used to figure out if the fFeatures data member of the SAFEARRAY 905 * structure contain any information about the type of data stored... 906 906 */ 907 907 static BOOL isPointer( 908 USHORT feature) 908 USHORT feature) 909 909 { 910 910 switch(feature) { … … 915 915 } 916 916 917 /************************************************************************ 918 * Used to calculate the displacement when accessing or modifying 917 /************************************************************************ 918 * Used to calculate the displacement when accessing or modifying 919 919 * safearray data set. 920 920 * … … 926 926 */ 927 927 static ULONG calcDisplacement( 928 LONG *coor, 929 SAFEARRAYBOUND *mat, 930 LONG dim) 928 LONG *coor, 929 SAFEARRAYBOUND *mat, 930 LONG dim) 931 931 { 932 932 ULONG res = 0; 933 933 LONG iterDim; 934 934 935 for(iterDim=0; iterDim<dim; iterDim++) 935 for(iterDim=0; iterDim<dim; iterDim++) 936 936 /* the -mat[dim] bring coor[dim] relative to 0 for calculation */ 937 res += ((coor[iterDim]-mat[iterDim].lLbound) * 937 res += ((coor[iterDim]-mat[iterDim].lLbound) * 938 938 endOfDim(coor, mat, iterDim+1, dim)); 939 939 … … 942 942 } 943 943 944 /************************************************************************ 945 * Recursivity agent for calcDisplacement method. Used within Put and 944 /************************************************************************ 945 * Recursivity agent for calcDisplacement method. Used within Put and 946 946 * Get methods. 947 947 */ 948 948 static INT endOfDim( 949 LONG *coor, 950 SAFEARRAYBOUND *mat, 951 LONG dim, 952 LONG realDim) 953 { 954 if(dim==realDim) 949 LONG *coor, 950 SAFEARRAYBOUND *mat, 951 LONG dim, 952 LONG realDim) 953 { 954 if(dim==realDim) 955 955 return 1; 956 else 956 else 957 957 return (endOfDim(coor, mat, dim+1, realDim) * mat[dim].cElements); 958 958 } 959 959 960 960 961 /************************************************************************ 962 * Method used to validate the coordinate received in Put and Get 961 /************************************************************************ 962 * Method used to validate the coordinate received in Put and Get 963 963 * methods. 964 964 */ 965 965 static BOOL validCoordinate( 966 LONG *coor, 967 SAFEARRAY *psa) 966 LONG *coor, 967 SAFEARRAY *psa) 968 968 { 969 969 INT iter=0; … … 977 977 if((hRes = SafeArrayGetUBound(psa, iter, &lUBound)) != S_OK) 978 978 return FALSE; 979 980 if(lLBound == lUBound) 981 return FALSE; 982 979 980 if(lLBound == lUBound) 981 return FALSE; 982 983 983 if((coor[iter] >= lLBound) && (coor[iter] <= lUBound)) 984 984 return TRUE; … … 987 987 } 988 988 return FALSE; 989 } 990 991 /************************************************************************ 989 } 990 991 /************************************************************************ 992 992 * Method used to calculate the number of cells of the SA 993 993 */ 994 994 static ULONG getArraySize( 995 SAFEARRAY *psa) 996 { 997 USHORT cCount; 995 SAFEARRAY *psa) 996 { 997 USHORT cCount; 998 998 ULONG ulWholeArraySize = 1; 999 999 … … 1001 1001 ulWholeArraySize *= psa->rgsabound[cCount].cElements; 1002 1002 1003 return ulWholeArraySize; 1004 } 1005 1006 1007 /************************************************************************ 1003 return ulWholeArraySize; 1004 } 1005 1006 1007 /************************************************************************ 1008 1008 * Method used to handle data space dupplication for Copy32 and CopyData32 1009 1009 */ 1010 1010 static HRESULT duplicateData( 1011 SAFEARRAY *psa, 1012 SAFEARRAY **ppsaOut) 1011 SAFEARRAY *psa, 1012 SAFEARRAY **ppsaOut) 1013 1013 { 1014 1014 ULONG ulWholeArraySize; /* size of the thing */ … … 1018 1018 1019 1019 ulWholeArraySize = getArraySize(psa); /* Number of item in SA */ 1020 1020 1021 1021 SafeArrayLock(*ppsaOut); 1022 1022 1023 if( isPointer(psa->fFeatures) ) { /* If datatype is object increment 1023 if( isPointer(psa->fFeatures) ) { /* If datatype is object increment 1024 1024 object's reference count */ 1025 1025 … … 1032 1032 1033 1033 /* Copy the source array data into target array */ 1034 memcpy((*ppsaOut)->pvData, psa->pvData, 1034 memcpy((*ppsaOut)->pvData, psa->pvData, 1035 1035 ulWholeArraySize*psa->cbElements); 1036 1036 1037 } else if( psa->fFeatures & FADF_BSTR ) { /* if datatype is BSTR allocate 1037 } else if( psa->fFeatures & FADF_BSTR ) { /* if datatype is BSTR allocate 1038 1038 the BSTR in the new array */ 1039 1039 … … 1046 1046 } 1047 1047 1048 *((BSTR*)((char *) (*ppsaOut)->pvData+(lDelta * psa->cbElements))) = 1048 *((BSTR*)((char *) (*ppsaOut)->pvData+(lDelta * psa->cbElements))) = 1049 1049 pbstrReAllocStr; 1050 1050 } … … 1052 1052 } else { /* Simply copy the source array data into target array */ 1053 1053 1054 memcpy((*ppsaOut)->pvData, psa->pvData, 1054 memcpy((*ppsaOut)->pvData, psa->pvData, 1055 1055 ulWholeArraySize*psa->cbElements); 1056 1056 } … … 1062 1062 1063 1063 1064 /************************************************************************ 1065 * 1064 /************************************************************************ 1065 * SafeArrayGetVarType 1066 1066 * Returns the VARTYPE stored in the given safearray 1067 1067 */ … … 1099 1099 hr = S_OK; 1100 1100 } 1101 1101 1102 1102 TRACE("HRESULT = %08lx", hr); 1103 1103 return hr; -
trunk/src/oleaut32/typelib.c
r6689 r6711 2394 2394 } 2395 2395 2396 static voidSLTG_ProcessCoClass(char *pBlk, ITypeInfoImpl *pTI,2397 char *pNameTable)2396 static SLTG_TypeInfoTail *SLTG_ProcessCoClass(char *pBlk, ITypeInfoImpl *pTI, 2397 char *pNameTable) 2398 2398 { 2399 2399 SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk; … … 2415 2415 } 2416 2416 2417 return ;2418 } 2419 2420 2421 static voidSLTG_ProcessInterface(char *pBlk, ITypeInfoImpl *pTI,2422 2417 return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra); 2418 } 2419 2420 2421 static SLTG_TypeInfoTail *SLTG_ProcessInterface(char *pBlk, ITypeInfoImpl *pTI, 2422 char *pNameTable) 2423 2423 { 2424 2424 SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk; … … 2451 2451 pFunc->magic != SLTG_FUNCTION_WITH_FLAGS_MAGIC) { 2452 2452 FIXME("func magic = %02x\n", pFunc->magic); 2453 return ;2453 return NULL; 2454 2454 } 2455 2455 *ppFuncDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, … … 2530 2530 pTI->TypeAttr.cFuncs = num; 2531 2531 dump_TLBFuncDesc(pTI->funclist); 2532 } 2533 2534 static void SLTG_ProcessRecord(char *pBlk, ITypeInfoImpl *pTI, char *pNameTable) 2532 return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra); 2533 } 2534 2535 static SLTG_TypeInfoTail *SLTG_ProcessRecord(char *pBlk, ITypeInfoImpl *pTI, 2536 char *pNameTable) 2535 2537 { 2536 2538 SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk; … … 2550 2552 if(pItem->magic != SLTG_RECORD_MAGIC) { 2551 2553 FIXME("record magic = %02x\n", pItem->magic); 2552 return ;2554 return NULL; 2553 2555 } 2554 2556 *ppVarDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, … … 2579 2581 } 2580 2582 pTI->TypeAttr.cVars = num; 2581 } 2582 2583 static void SLTG_ProcessEnum(char *pBlk, ITypeInfoImpl *pTI, char *pNameTable) 2583 return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra); 2584 } 2585 2586 static SLTG_TypeInfoTail *SLTG_ProcessEnum(char *pBlk, ITypeInfoImpl *pTI, 2587 char *pNameTable) 2584 2588 { 2585 2589 SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk; … … 2616 2620 } 2617 2621 pTI->TypeAttr.cVars = num; 2622 return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra); 2618 2623 } 2619 2624 … … 2801 2806 2802 2807 SLTG_TypeInfoHeader *pTIHeader; 2808 SLTG_TypeInfoTail *pTITail; 2803 2809 2804 2810 if(strcmp(pBlkEntry[order].index_string + (char*)pMagic, … … 2841 2847 switch(pTIHeader->typekind) { 2842 2848 case TKIND_ENUM: 2843 SLTG_ProcessEnum(pBlk, *ppTypeInfoImpl, pNameTable);2849 pTITail = SLTG_ProcessEnum(pBlk, *ppTypeInfoImpl, pNameTable); 2844 2850 break; 2845 2851 2846 2852 case TKIND_RECORD: 2847 SLTG_ProcessRecord(pBlk, *ppTypeInfoImpl, pNameTable);2853 pTITail = SLTG_ProcessRecord(pBlk, *ppTypeInfoImpl, pNameTable); 2848 2854 break; 2849 2855 2850 2856 case TKIND_INTERFACE: 2851 SLTG_ProcessInterface(pBlk, *ppTypeInfoImpl, pNameTable);2857 pTITail = SLTG_ProcessInterface(pBlk, *ppTypeInfoImpl, pNameTable); 2852 2858 break; 2853 2859 2854 2860 case TKIND_COCLASS: 2855 SLTG_ProcessCoClass(pBlk, *ppTypeInfoImpl, pNameTable);2861 pTITail = SLTG_ProcessCoClass(pBlk, *ppTypeInfoImpl, pNameTable); 2856 2862 break; 2857 2863 2858 2864 default: 2859 2865 FIXME("Not processing typekind %d\n", pTIHeader->typekind); 2866 pTITail = NULL; 2860 2867 break; 2861 2868 2862 2869 } 2863 2870 2871 if(pTITail) { /* could get cFuncs, cVars and cImplTypes from here 2872 but we've already set those */ 2873 (*ppTypeInfoImpl)->TypeAttr.cbAlignment = pTITail->cbAlignment; 2874 (*ppTypeInfoImpl)->TypeAttr.cbSizeInstance = pTITail->cbSizeInstance; 2875 (*ppTypeInfoImpl)->TypeAttr.cbSizeVft = pTITail->cbSizeVft; 2876 } 2864 2877 ppTypeInfoImpl = &((*ppTypeInfoImpl)->next); 2865 2878 #ifdef __WIN32OS2__ … … 3098 3111 ICOM_THIS( ITypeLibImpl, iface); 3099 3112 TRACE("(%p)\n",This); 3100 /* FIXME: must do a copy here */3101 *ppTLibAttr=&This->LibAttr;3113 *ppTLibAttr = HeapAlloc(GetProcessHeap(), 0, sizeof(**ppTLibAttr)); 3114 memcpy(*ppTLibAttr, &This->LibAttr, sizeof(**ppTLibAttr)); 3102 3115 return S_OK; 3103 3116 } … … 3294 3307 ICOM_THIS( ITypeLibImpl, iface); 3295 3308 TRACE("freeing (%p)\n",This); 3296 /* nothing to do */ 3309 HeapFree(GetProcessHeap(),0,pTLibAttr); 3310 3297 3311 } 3298 3312 -
trunk/src/oleaut32/typelib.h
r6689 r6711 23 23 24 24 /* There are two known file formats, those created with ICreateTypeLib 25 * have the signature "SL GT" as their first four bytes, while those created25 * have the signature "SLTG" as their first four bytes, while those created 26 26 * with ICreateTypeLib2 have "MSFT". 27 27 */ … … 377 377 378 378 typedef struct { 379 /*00*/ WORD cFuncs; 380 /*02*/ WORD cVars; 381 /*04*/ WORD cImplTypes; 382 /*06*/ WORD res06; 383 /*08*/ WORD res08; 384 /*0a*/ WORD res0a; 385 /*0c*/ WORD res0c; 386 /*0e*/ WORD res0e; 387 /*10*/ WORD res10; 388 /*12*/ WORD res12; 389 /*14*/ WORD res14; 390 /*16*/ WORD res16; 391 /*18*/ WORD res18; 392 /*1a*/ WORD res1a; 393 /*1c*/ WORD res1c; 394 /*1e*/ WORD res1e; 395 /*20*/ WORD cbSizeInstance; 396 /*22*/ WORD cbAlignment; 397 /*24*/ WORD res24; 398 /*26*/ WORD res26; 399 /*28*/ WORD cbSizeVft; 400 /*2a*/ WORD res2a; 401 /*2c*/ WORD res2c; 402 /*2e*/ WORD res2e; 403 /*30*/ WORD res30; 404 /*32*/ WORD res32; 405 /*34*/ WORD res34; 406 } SLTG_TypeInfoTail; 407 408 typedef struct { 379 409 /*00*/ WORD res00; /* 0x0001 sometimes 0x0003 ?? */ 380 410 /*02*/ WORD res02; /* 0xffff */ -
trunk/src/oleaut32/variant.c
r6689 r6711 28 28 29 29 #include "config.h" 30 30 31 31 #include <string.h> 32 32 #include <stdlib.h> … … 106 106 107 107 /****************************************************************************** 108 * DateTimeStringToTm[INTERNAL]108 * DateTimeStringToTm [INTERNAL] 109 109 * 110 110 * Converts a string representation of a date and/or time to a tm structure. … … 122 122 static BOOL DateTimeStringToTm( OLECHAR* strIn, DWORD dwFlags, struct tm* pTm ) 123 123 { 124 125 doublefsec;126 inttzp;127 intdtype;128 intnf;129 char*field[MAXDATEFIELDS];130 intftype[MAXDATEFIELDS];131 charlowstr[MAXDATELEN + 1];132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 } 194 195 196 197 198 199 200 /****************************************************************************** 201 * TmToDATE[INTERNAL]124 BOOL res = FALSE; 125 double fsec; 126 int tzp; 127 int dtype; 128 int nf; 129 char *field[MAXDATEFIELDS]; 130 int ftype[MAXDATEFIELDS]; 131 char lowstr[MAXDATELEN + 1]; 132 char* strDateTime = NULL; 133 134 /* Convert the string to ASCII since this is the only format 135 * postgesql can handle. 136 */ 137 strDateTime = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 138 139 if( strDateTime != NULL ) 140 { 141 /* Make sure we don't go over the maximum length 142 * accepted by postgesql. 143 */ 144 if( strlen( strDateTime ) <= MAXDATELEN ) 145 { 146 if( ParseDateTime( strDateTime, lowstr, field, ftype, MAXDATEFIELDS, &nf) == 0 ) 147 { 148 if( dwFlags & VAR_DATEVALUEONLY ) 149 { 150 /* Get the date information. 151 * It returns 0 if date information was 152 * present and 1 if only time information was present. 153 * -1 if an error occures. 154 */ 155 if( DecodeDateTime(field, ftype, nf, &dtype, pTm, &fsec, &tzp) == 0 ) 156 { 157 /* Eliminate the time information since we 158 * were asked to get date information only. 159 */ 160 pTm->tm_sec = 0; 161 pTm->tm_min = 0; 162 pTm->tm_hour = 0; 163 res = TRUE; 164 } 165 } 166 if( dwFlags & VAR_TIMEVALUEONLY ) 167 { 168 /* Get time information only. 169 */ 170 if( DecodeTimeOnly(field, ftype, nf, &dtype, pTm, &fsec) == 0 ) 171 { 172 res = TRUE; 173 } 174 } 175 else 176 { 177 /* Get both date and time information. 178 * It returns 0 if date information was 179 * present and 1 if only time information was present. 180 * -1 if an error occures. 181 */ 182 if( DecodeDateTime(field, ftype, nf, &dtype, pTm, &fsec, &tzp) != -1 ) 183 { 184 res = TRUE; 185 } 186 } 187 } 188 } 189 HeapFree( GetProcessHeap(), 0, strDateTime ); 190 } 191 192 return res; 193 } 194 195 196 197 198 199 200 /****************************************************************************** 201 * TmToDATE [INTERNAL] 202 202 * 203 203 * The date is implemented using an 8 byte floating-point number. … … 216 216 * The tm structure is as follows: 217 217 * struct tm { 218 * int tm_sec;seconds after the minute - [0,59]219 * int tm_min;minutes after the hour - [0,59]220 * int tm_hour;hours since midnight - [0,23]221 * int tm_mday;day of the month - [1,31]222 * int tm_mon;months since January - [0,11]223 * int tm_year;years224 * int tm_wday;days since Sunday - [0,6]225 * int tm_yday;days since January 1 - [0,365]226 * 227 * 218 * int tm_sec; seconds after the minute - [0,59] 219 * int tm_min; minutes after the hour - [0,59] 220 * int tm_hour; hours since midnight - [0,23] 221 * int tm_mday; day of the month - [1,31] 222 * int tm_mon; months since January - [0,11] 223 * int tm_year; years 224 * int tm_wday; days since Sunday - [0,6] 225 * int tm_yday; days since January 1 - [0,365] 226 * int tm_isdst; daylight savings time flag 227 * }; 228 228 * 229 229 * Note: This function does not use the tm_wday, tm_yday, tm_wday, … … 235 235 static BOOL TmToDATE( struct tm* pTm, DATE *pDateOut ) 236 236 { 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 } 324 325 /****************************************************************************** 326 * DateToTm[INTERNAL]237 if( (pTm->tm_year - 1900) >= 0 ) 238 { 239 int leapYear = 0; 240 241 /* Start at 1. This is the way DATE is defined. 242 * January 1, 1900 at Midnight is 1.00. 243 * January 1, 1900 at 6AM is 1.25. 244 * and so on. 245 */ 246 *pDateOut = 1; 247 248 /* Add the number of days corresponding to 249 * tm_year. 250 */ 251 *pDateOut += (pTm->tm_year - 1900) * 365; 252 253 /* Add the leap days in the previous years between now and 1900. 254 * Note a leap year is one that is a multiple of 4 255 * but not of a 100. Except if it is a multiple of 256 * 400 then it is a leap year. 257 */ 258 *pDateOut += ( (pTm->tm_year - 1) / 4 ) - ( 1900 / 4 ); 259 *pDateOut -= ( (pTm->tm_year - 1) / 100 ) - ( 1900 / 100 ); 260 *pDateOut += ( (pTm->tm_year - 1) / 400 ) - ( 1900 / 400 ); 261 262 /* Set the leap year flag if the 263 * current year specified by tm_year is a 264 * leap year. This will be used to add a day 265 * to the day count. 266 */ 267 if( isleap( pTm->tm_year ) ) 268 leapYear = 1; 269 270 /* Add the number of days corresponding to 271 * the month. 272 */ 273 switch( pTm->tm_mon ) 274 { 275 case 2: 276 *pDateOut += 31; 277 break; 278 case 3: 279 *pDateOut += ( 59 + leapYear ); 280 break; 281 case 4: 282 *pDateOut += ( 90 + leapYear ); 283 break; 284 case 5: 285 *pDateOut += ( 120 + leapYear ); 286 break; 287 case 6: 288 *pDateOut += ( 151 + leapYear ); 289 break; 290 case 7: 291 *pDateOut += ( 181 + leapYear ); 292 break; 293 case 8: 294 *pDateOut += ( 212 + leapYear ); 295 break; 296 case 9: 297 *pDateOut += ( 243 + leapYear ); 298 break; 299 case 10: 300 *pDateOut += ( 273 + leapYear ); 301 break; 302 case 11: 303 *pDateOut += ( 304 + leapYear ); 304 break; 305 case 12: 306 *pDateOut += ( 334 + leapYear ); 307 break; 308 } 309 /* Add the number of days in this month. 310 */ 311 *pDateOut += pTm->tm_mday; 312 313 /* Add the number of seconds, minutes, and hours 314 * to the DATE. Note these are the fracionnal part 315 * of the DATE so seconds / number of seconds in a day. 316 */ 317 *pDateOut += pTm->tm_hour / 24.0; 318 *pDateOut += pTm->tm_min / 1440.0; 319 *pDateOut += pTm->tm_sec / 86400.0; 320 return TRUE; 321 } 322 return FALSE; 323 } 324 325 /****************************************************************************** 326 * DateToTm [INTERNAL] 327 327 * 328 328 * This function converts a windows DATE to a tm structure. … … 339 339 static BOOL DateToTm( DATE dateIn, DWORD dwFlags, struct tm* pTm ) 340 340 { 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 } 468 469 470 471 /****************************************************************************** 472 * SizeOfVariantData[INTERNAL]341 /* Do not process dates smaller than January 1, 1900. 342 * Which corresponds to 2.0 in the windows DATE format. 343 */ 344 if( dateIn >= 2.0 ) 345 { 346 double decimalPart = 0.0; 347 double wholePart = 0.0; 348 349 memset(pTm,0,sizeof(*pTm)); 350 351 /* Because of the nature of DATE format which 352 * associates 2.0 to January 1, 1900. We will 353 * remove 1.0 from the whole part of the DATE 354 * so that in the following code 1.0 355 * will correspond to January 1, 1900. 356 * This simplifies the processing of the DATE value. 357 */ 358 dateIn -= 1.0; 359 360 wholePart = (double) floor( dateIn ); 361 decimalPart = fmod( dateIn, wholePart ); 362 363 if( !(dwFlags & VAR_TIMEVALUEONLY) ) 364 { 365 int nDay = 0; 366 int leapYear = 0; 367 double yearsSince1900 = 0; 368 /* Start at 1900, this is where the DATE time 0.0 starts. 369 */ 370 pTm->tm_year = 1900; 371 /* find in what year the day in the "wholePart" falls into. 372 * add the value to the year field. 373 */ 374 yearsSince1900 = floor( (wholePart / DAYS_IN_ONE_YEAR) + 0.001 ); 375 pTm->tm_year += yearsSince1900; 376 /* determine if this is a leap year. 377 */ 378 if( isleap( pTm->tm_year ) ) 379 { 380 leapYear = 1; 381 wholePart++; 382 } 383 384 /* find what day of that year the "wholePart" corresponds to. 385 * Note: nDay is in [1-366] format 386 */ 387 nDay = (int) ( wholePart - floor( yearsSince1900 * DAYS_IN_ONE_YEAR ) ); 388 /* Set the tm_yday value. 389 * Note: The day must be converted from [1-366] to [0-365] 390 */ 391 /*pTm->tm_yday = nDay - 1;*/ 392 /* find which month this day corresponds to. 393 */ 394 if( nDay <= 31 ) 395 { 396 pTm->tm_mday = nDay; 397 pTm->tm_mon = 0; 398 } 399 else if( nDay <= ( 59 + leapYear ) ) 400 { 401 pTm->tm_mday = nDay - 31; 402 pTm->tm_mon = 1; 403 } 404 else if( nDay <= ( 90 + leapYear ) ) 405 { 406 pTm->tm_mday = nDay - ( 59 + leapYear ); 407 pTm->tm_mon = 2; 408 } 409 else if( nDay <= ( 120 + leapYear ) ) 410 { 411 pTm->tm_mday = nDay - ( 90 + leapYear ); 412 pTm->tm_mon = 3; 413 } 414 else if( nDay <= ( 151 + leapYear ) ) 415 { 416 pTm->tm_mday = nDay - ( 120 + leapYear ); 417 pTm->tm_mon = 4; 418 } 419 else if( nDay <= ( 181 + leapYear ) ) 420 { 421 pTm->tm_mday = nDay - ( 151 + leapYear ); 422 pTm->tm_mon = 5; 423 } 424 else if( nDay <= ( 212 + leapYear ) ) 425 { 426 pTm->tm_mday = nDay - ( 181 + leapYear ); 427 pTm->tm_mon = 6; 428 } 429 else if( nDay <= ( 243 + leapYear ) ) 430 { 431 pTm->tm_mday = nDay - ( 212 + leapYear ); 432 pTm->tm_mon = 7; 433 } 434 else if( nDay <= ( 273 + leapYear ) ) 435 { 436 pTm->tm_mday = nDay - ( 243 + leapYear ); 437 pTm->tm_mon = 8; 438 } 439 else if( nDay <= ( 304 + leapYear ) ) 440 { 441 pTm->tm_mday = nDay - ( 273 + leapYear ); 442 pTm->tm_mon = 9; 443 } 444 else if( nDay <= ( 334 + leapYear ) ) 445 { 446 pTm->tm_mday = nDay - ( 304 + leapYear ); 447 pTm->tm_mon = 10; 448 } 449 else if( nDay <= ( 365 + leapYear ) ) 450 { 451 pTm->tm_mday = nDay - ( 334 + leapYear ); 452 pTm->tm_mon = 11; 453 } 454 } 455 if( !(dwFlags & VAR_DATEVALUEONLY) ) 456 { 457 /* find the number of seconds in this day. 458 * fractional part times, hours, minutes, seconds. 459 */ 460 pTm->tm_hour = (int) ( decimalPart * 24 ); 461 pTm->tm_min = (int) ( ( ( decimalPart * 24 ) - pTm->tm_hour ) * 60 ); 462 pTm->tm_sec = (int) ( ( ( decimalPart * 24 * 60 ) - ( pTm->tm_hour * 60 ) - pTm->tm_min ) * 60 ); 463 } 464 return TRUE; 465 } 466 return FALSE; 467 } 468 469 470 471 /****************************************************************************** 472 * SizeOfVariantData [INTERNAL] 473 473 * 474 474 * This function finds the size of the data referenced by a Variant based … … 528 528 } 529 529 /****************************************************************************** 530 * StringDupAtoBstr[INTERNAL]531 * 530 * StringDupAtoBstr [INTERNAL] 531 * 532 532 */ 533 533 static BSTR StringDupAtoBstr( char* strIn ) 534 534 { 535 536 537 538 539 540 541 } 542 543 /****************************************************************************** 544 * round[INTERNAL]535 BSTR bstr = NULL; 536 OLECHAR* pNewString = NULL; 537 pNewString = HEAP_strdupAtoW( GetProcessHeap(), 0, strIn ); 538 bstr = SysAllocString( pNewString ); 539 HeapFree( GetProcessHeap(), 0, pNewString ); 540 return bstr; 541 } 542 543 /****************************************************************************** 544 * round [INTERNAL] 545 545 * 546 546 * Round the double value to the nearest integer value. … … 556 556 nSign = (d >= 0.0) ? 1 : -1; 557 557 d = fabs( d ); 558 559 560 558 559 /* Remove the decimals. 560 */ 561 561 integerValue = floor( d ); 562 562 … … 573 573 decimals = d - integerValue; 574 574 575 576 577 575 /* Note: Ceil returns the smallest integer that is greater that x. 576 * and floor returns the largest integer that is less than or equal to x. 577 */ 578 578 if( decimals > 0.5 ) 579 579 { … … 603 603 } 604 604 605 606 } 607 608 /****************************************************************************** 609 * RemoveCharacterFromString[INTERNAL]605 return roundedValue * nSign; 606 } 607 608 /****************************************************************************** 609 * RemoveCharacterFromString [INTERNAL] 610 610 * 611 611 * Removes any of the characters in "strOfCharToRemove" from the "str" argument. … … 613 613 static void RemoveCharacterFromString( LPSTR str, LPSTR strOfCharToRemove ) 614 614 { 615 616 617 618 619 620 621 622 623 624 625 626 while( strToken != NULL ) { 627 628 629 630 631 632 633 } 634 635 /****************************************************************************** 636 * GetValidRealString[INTERNAL]615 LPSTR pNewString = NULL; 616 LPSTR strToken = NULL; 617 618 619 /* Check if we have a valid argument 620 */ 621 if( str != NULL ) 622 { 623 pNewString = strdup( str ); 624 str[0] = '\0'; 625 strToken = strtok( pNewString, strOfCharToRemove ); 626 while( strToken != NULL ) { 627 strcat( str, strToken ); 628 strToken = strtok( NULL, strOfCharToRemove ); 629 } 630 free( pNewString ); 631 } 632 return; 633 } 634 635 /****************************************************************************** 636 * GetValidRealString [INTERNAL] 637 637 * 638 638 * Checks if the string is of proper format to be converted to a real value. … … 640 640 static BOOL IsValidRealString( LPSTR strRealString ) 641 641 { 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 while( strToken != NULL ) { 681 nTokens++; 682 strToken = strtok( NULL, " " ); 683 684 685 686 687 688 689 690 691 692 693 694 695 642 /* Real values that have a decimal point are required to either have 643 * digits before or after the decimal point. We will assume that 644 * we do not have any digits at either position. If we do encounter 645 * some we will disable this flag. 646 */ 647 BOOL bDigitsRequired = TRUE; 648 /* Processed fields in the string representation of the real number. 649 */ 650 BOOL bWhiteSpaceProcessed = FALSE; 651 BOOL bFirstSignProcessed = FALSE; 652 BOOL bFirstDigitsProcessed = FALSE; 653 BOOL bDecimalPointProcessed = FALSE; 654 BOOL bSecondDigitsProcessed = FALSE; 655 BOOL bExponentProcessed = FALSE; 656 BOOL bSecondSignProcessed = FALSE; 657 BOOL bThirdDigitsProcessed = FALSE; 658 /* Assume string parameter "strRealString" is valid and try to disprove it. 659 */ 660 BOOL bValidRealString = TRUE; 661 662 /* Used to count the number of tokens in the "strRealString". 663 */ 664 LPSTR strToken = NULL; 665 int nTokens = 0; 666 LPSTR pChar = NULL; 667 668 /* Check if we have a valid argument 669 */ 670 if( strRealString == NULL ) 671 { 672 bValidRealString = FALSE; 673 } 674 675 if( bValidRealString == TRUE ) 676 { 677 /* Make sure we only have ONE token in the string. 678 */ 679 strToken = strtok( strRealString, " " ); 680 while( strToken != NULL ) { 681 nTokens++; 682 strToken = strtok( NULL, " " ); 683 } 684 685 if( nTokens != 1 ) 686 { 687 bValidRealString = FALSE; 688 } 689 } 690 691 692 /* Make sure this token contains only valid characters. 693 * The string argument to atof has the following form: 694 * [whitespace] [sign] [digits] [.digits] [ {d | D | e | E }[sign]digits] 695 * Whitespace consists of space and|or <TAB> characters, which are ignored. 696 696 * Sign is either plus '+' or minus '-'. 697 697 * Digits are one or more decimal digits. … … 700 700 * The decimal digits may be followed by an exponent. 701 701 * An Exponent consists of an introductory letter ( D, d, E, or e) and 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 702 * an optionally signed decimal integer. 703 */ 704 pChar = strRealString; 705 while( bValidRealString == TRUE && *pChar != '\0' ) 706 { 707 switch( *pChar ) 708 { 709 /* If whitespace... 710 */ 711 case ' ': 712 case '\t': 713 if( bWhiteSpaceProcessed || 714 bFirstSignProcessed || 715 bFirstDigitsProcessed || 716 bDecimalPointProcessed || 717 bSecondDigitsProcessed || 718 bExponentProcessed || 719 bSecondSignProcessed || 720 bThirdDigitsProcessed ) 721 { 722 bValidRealString = FALSE; 723 } 724 break; 725 /* If sign... 726 */ 727 case '+': 728 case '-': 729 if( bFirstSignProcessed == FALSE ) 730 { 731 if( bFirstDigitsProcessed || 732 bDecimalPointProcessed || 733 bSecondDigitsProcessed || 734 bExponentProcessed || 735 bSecondSignProcessed || 736 bThirdDigitsProcessed ) 737 { 738 bValidRealString = FALSE; 739 } 740 bWhiteSpaceProcessed = TRUE; 741 bFirstSignProcessed = TRUE; 742 } 743 else if( bSecondSignProcessed == FALSE ) 744 { 745 745 /* Note: The exponent must be present in 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 case '9': 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 746 * order to accept the second sign... 747 */ 748 if( bExponentProcessed == FALSE || 749 bThirdDigitsProcessed || 750 bDigitsRequired ) 751 { 752 bValidRealString = FALSE; 753 } 754 bFirstSignProcessed = TRUE; 755 bWhiteSpaceProcessed = TRUE; 756 bFirstDigitsProcessed = TRUE; 757 bDecimalPointProcessed = TRUE; 758 bSecondDigitsProcessed = TRUE; 759 bSecondSignProcessed = TRUE; 760 } 761 break; 762 763 /* If decimals... 764 */ 765 case '0': 766 case '1': 767 case '2': 768 case '3': 769 case '4': 770 case '5': 771 case '6': 772 case '7': 773 case '8': 774 case '9': 775 if( bFirstDigitsProcessed == FALSE ) 776 { 777 if( bDecimalPointProcessed || 778 bSecondDigitsProcessed || 779 bExponentProcessed || 780 bSecondSignProcessed || 781 bThirdDigitsProcessed ) 782 { 783 bValidRealString = FALSE; 784 } 785 bFirstSignProcessed = TRUE; 786 bWhiteSpaceProcessed = TRUE; 787 /* We have found some digits before the decimal point 788 * so disable the "Digits required" flag. 789 */ 790 bDigitsRequired = FALSE; 791 } 792 else if( bSecondDigitsProcessed == FALSE ) 793 { 794 if( bExponentProcessed || 795 bSecondSignProcessed || 796 bThirdDigitsProcessed ) 797 { 798 bValidRealString = FALSE; 799 } 800 bFirstSignProcessed = TRUE; 801 bWhiteSpaceProcessed = TRUE; 802 bFirstDigitsProcessed = TRUE; 803 bDecimalPointProcessed = TRUE; 804 /* We have found some digits after the decimal point 805 * so disable the "Digits required" flag. 806 */ 807 bDigitsRequired = FALSE; 808 } 809 else if( bThirdDigitsProcessed == FALSE ) 810 { 811 /* Getting here means everything else should be processed. 812 812 * If we get anything else than a decimal following this 813 813 * digit it will be flagged by the other cases, so 814 815 816 817 818 819 820 case '.': 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 } 873 874 875 /****************************************************************************** 876 * Coerce[INTERNAL]814 * we do not really need to do anything in here. 815 */ 816 } 817 break; 818 /* If DecimalPoint... 819 */ 820 case '.': 821 if( bDecimalPointProcessed || 822 bSecondDigitsProcessed || 823 bExponentProcessed || 824 bSecondSignProcessed || 825 bThirdDigitsProcessed ) 826 { 827 bValidRealString = FALSE; 828 } 829 bFirstSignProcessed = TRUE; 830 bWhiteSpaceProcessed = TRUE; 831 bFirstDigitsProcessed = TRUE; 832 bDecimalPointProcessed = TRUE; 833 break; 834 /* If Exponent... 835 */ 836 case 'e': 837 case 'E': 838 case 'd': 839 case 'D': 840 if( bExponentProcessed || 841 bSecondSignProcessed || 842 bThirdDigitsProcessed || 843 bDigitsRequired ) 844 { 845 bValidRealString = FALSE; 846 } 847 bFirstSignProcessed = TRUE; 848 bWhiteSpaceProcessed = TRUE; 849 bFirstDigitsProcessed = TRUE; 850 bDecimalPointProcessed = TRUE; 851 bSecondDigitsProcessed = TRUE; 852 bExponentProcessed = TRUE; 853 break; 854 default: 855 bValidRealString = FALSE; 856 break; 857 } 858 /* Process next character. 859 */ 860 pChar++; 861 } 862 863 /* If the required digits were not present we have an invalid 864 * string representation of a real number. 865 */ 866 if( bDigitsRequired == TRUE ) 867 { 868 bValidRealString = FALSE; 869 } 870 871 return bValidRealString; 872 } 873 874 875 /****************************************************************************** 876 * Coerce [INTERNAL] 877 877 * 878 878 * This function dispatches execution to the proper conversion API … … 880 880 * 881 881 * FIXME: Passing down dwFlags to the conversion functions is wrong, this 882 * 882 * is a different flagmask. Check MSDN. 883 883 */ 884 884 static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps, VARTYPE vt ) 885 885 { 886 887 888 889 890 891 892 893 894 895 896 897 /* Trivial Case: If the coercion is from two types that are 898 899 900 901 902 903 904 905 906 886 HRESULT res = S_OK; 887 unsigned short vtFrom = 0; 888 vtFrom = V_VT(ps) & VT_TYPEMASK; 889 890 891 /* Note: Since "long" and "int" values both have 4 bytes and are 892 * both signed integers "int" will be treated as "long" in the 893 * following code. 894 * The same goes for their unsigned versions. 895 */ 896 897 /* Trivial Case: If the coercion is from two types that are 898 * identical then we can blindly copy from one argument to another.*/ 899 if ((vt==vtFrom)) 900 { 901 return VariantCopy(pd,ps); 902 } 903 904 /* Cases requiring thought*/ 905 switch( vt ) 906 { 907 907 908 908 case( VT_EMPTY ): … … 916 916 } 917 917 break; 918 919 918 case( VT_I1 ): 919 switch( vtFrom ) 920 920 { 921 921 case( VT_I1 ): 922 922 res = VariantCopy( pd, ps ); 923 923 break; 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 924 case( VT_I2 ): 925 res = VarI1FromI2( V_UNION(ps,iVal), &V_UNION(pd,cVal) ); 926 break; 927 case( VT_INT ): 928 case( VT_I4 ): 929 res = VarI1FromI4( V_UNION(ps,lVal), &V_UNION(pd,cVal) ); 930 break; 931 case( VT_UI1 ): 932 res = VarI1FromUI1( V_UNION(ps,bVal), &V_UNION(pd,cVal) ); 933 break; 934 case( VT_UI2 ): 935 res = VarI1FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,cVal) ); 936 break; 937 case( VT_UINT ): 938 case( VT_UI4 ): 939 res = VarI1FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,cVal) ); 940 break; 941 case( VT_R4 ): 942 res = VarI1FromR4( V_UNION(ps,fltVal), &V_UNION(pd,cVal) ); 943 break; 944 case( VT_R8 ): 945 res = VarI1FromR8( V_UNION(ps,dblVal), &V_UNION(pd,cVal) ); 946 break; 947 case( VT_DATE ): 948 res = VarI1FromDate( V_UNION(ps,date), &V_UNION(pd,cVal) ); 949 break; 950 case( VT_BOOL ): 951 res = VarI1FromBool( V_UNION(ps,boolVal), &V_UNION(pd,cVal) ); 952 break; 953 case( VT_BSTR ): 954 res = VarI1FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,cVal) ); 955 break; 956 case( VT_CY ): 957 res = VarI1FromCy( V_UNION(ps,cyVal), &V_UNION(pd,cVal) ); 958 break; 959 case( VT_DISPATCH ): 960 /*res = VarI1FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,cVal) );*/ 961 case( VT_DECIMAL ): 962 /*res = VarI1FromDec( V_UNION(ps,decVal), &V_UNION(pd,cVal) );*/ 963 case( VT_UNKNOWN ): 964 default: 965 res = DISP_E_TYPEMISMATCH; 966 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 967 break; 968 } 969 break; 970 971 case( VT_I2 ): 972 switch( vtFrom ) 973 { 974 case( VT_I1 ): 975 res = VarI2FromI1( V_UNION(ps,cVal), &V_UNION(pd,iVal) ); 976 break; 977 977 case( VT_I2 ): 978 978 res = VariantCopy( pd, ps ); 979 979 break; 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 980 case( VT_INT ): 981 case( VT_I4 ): 982 res = VarI2FromI4( V_UNION(ps,lVal), &V_UNION(pd,iVal) ); 983 break; 984 case( VT_UI1 ): 985 res = VarI2FromUI1( V_UNION(ps,bVal), &V_UNION(pd,iVal) ); 986 break; 987 case( VT_UI2 ): 988 res = VarI2FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,iVal) ); 989 break; 990 case( VT_UINT ): 991 case( VT_UI4 ): 992 res = VarI2FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,iVal) ); 993 break; 994 case( VT_R4 ): 995 res = VarI2FromR4( V_UNION(ps,fltVal), &V_UNION(pd,iVal) ); 996 break; 997 case( VT_R8 ): 998 res = VarI2FromR8( V_UNION(ps,dblVal), &V_UNION(pd,iVal) ); 999 break; 1000 case( VT_DATE ): 1001 res = VarI2FromDate( V_UNION(ps,date), &V_UNION(pd,iVal) ); 1002 break; 1003 case( VT_BOOL ): 1004 res = VarI2FromBool( V_UNION(ps,boolVal), &V_UNION(pd,iVal) ); 1005 break; 1006 case( VT_BSTR ): 1007 res = VarI2FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,iVal) ); 1008 break; 1009 case( VT_CY ): 1010 res = VarI2FromCy( V_UNION(ps,cyVal), &V_UNION(pd,iVal) ); 1011 break; 1012 case( VT_DISPATCH ): 1013 /*res = VarI2FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,iVal) );*/ 1014 case( VT_DECIMAL ): 1015 /*res = VarI2FromDec( V_UNION(ps,deiVal), &V_UNION(pd,iVal) );*/ 1016 case( VT_UNKNOWN ): 1017 default: 1018 res = DISP_E_TYPEMISMATCH; 1019 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1020 break; 1021 } 1022 break; 1023 1024 case( VT_INT ): 1025 case( VT_I4 ): 1026 switch( vtFrom ) 1027 { 1028 case( VT_I1 ): 1029 res = VarI4FromI1( V_UNION(ps,cVal), &V_UNION(pd,lVal) ); 1030 break; 1031 case( VT_I2 ): 1032 res = VarI4FromI2( V_UNION(ps,iVal), &V_UNION(pd,lVal) ); 1033 1033 break; 1034 1034 case( VT_INT ): … … 1039 1039 res = VariantCopy( pd, ps ); 1040 1040 break; 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1041 case( VT_UI1 ): 1042 res = VarI4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,lVal) ); 1043 break; 1044 case( VT_UI2 ): 1045 res = VarI4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,lVal) ); 1046 break; 1047 case( VT_UINT ): 1048 case( VT_UI4 ): 1049 res = VarI4FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,lVal) ); 1050 break; 1051 case( VT_R4 ): 1052 res = VarI4FromR4( V_UNION(ps,fltVal), &V_UNION(pd,lVal) ); 1053 break; 1054 case( VT_R8 ): 1055 res = VarI4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,lVal) ); 1056 break; 1057 case( VT_DATE ): 1058 res = VarI4FromDate( V_UNION(ps,date), &V_UNION(pd,lVal) ); 1059 break; 1060 case( VT_BOOL ): 1061 res = VarI4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,lVal) ); 1062 break; 1063 case( VT_BSTR ): 1064 res = VarI4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,lVal) ); 1065 break; 1066 case( VT_CY ): 1067 res = VarI4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,lVal) ); 1068 break; 1069 case( VT_DISPATCH ): 1070 /*res = VarI4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,lVal) );*/ 1071 case( VT_DECIMAL ): 1072 /*res = VarI4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,lVal) );*/ 1073 case( VT_UNKNOWN ): 1074 default: 1075 res = DISP_E_TYPEMISMATCH; 1076 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1077 break; 1078 } 1079 break; 1080 1081 case( VT_UI1 ): 1082 switch( vtFrom ) 1083 { 1084 case( VT_I1 ): 1085 res = VarUI1FromI1( V_UNION(ps,cVal), &V_UNION(pd,bVal) ); 1086 break; 1087 case( VT_I2 ): 1088 res = VarUI1FromI2( V_UNION(ps,iVal), &V_UNION(pd,bVal) ); 1089 break; 1090 case( VT_INT ): 1091 case( VT_I4 ): 1092 res = VarUI1FromI4( V_UNION(ps,lVal), &V_UNION(pd,bVal) ); 1093 break; 1094 1094 case( VT_UI1 ): 1095 1095 res = VariantCopy( pd, ps ); 1096 1096 break; 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1097 case( VT_UI2 ): 1098 res = VarUI1FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,bVal) ); 1099 break; 1100 case( VT_UINT ): 1101 case( VT_UI4 ): 1102 res = VarUI1FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,bVal) ); 1103 break; 1104 case( VT_R4 ): 1105 res = VarUI1FromR4( V_UNION(ps,fltVal), &V_UNION(pd,bVal) ); 1106 break; 1107 case( VT_R8 ): 1108 res = VarUI1FromR8( V_UNION(ps,dblVal), &V_UNION(pd,bVal) ); 1109 break; 1110 case( VT_DATE ): 1111 res = VarUI1FromDate( V_UNION(ps,date), &V_UNION(pd,bVal) ); 1112 break; 1113 case( VT_BOOL ): 1114 res = VarUI1FromBool( V_UNION(ps,boolVal), &V_UNION(pd,bVal) ); 1115 break; 1116 case( VT_BSTR ): 1117 res = VarUI1FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,bVal) ); 1118 break; 1119 case( VT_CY ): 1120 res = VarUI1FromCy( V_UNION(ps,cyVal), &V_UNION(pd,bVal) ); 1121 break; 1122 case( VT_DISPATCH ): 1123 /*res = VarUI1FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,bVal) );*/ 1124 case( VT_DECIMAL ): 1125 /*res = VarUI1FromDec( V_UNION(ps,deiVal), &V_UNION(pd,bVal) );*/ 1126 case( VT_UNKNOWN ): 1127 default: 1128 res = DISP_E_TYPEMISMATCH; 1129 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1130 break; 1131 } 1132 break; 1133 1134 case( VT_UI2 ): 1135 switch( vtFrom ) 1136 { 1137 case( VT_I1 ): 1138 res = VarUI2FromI1( V_UNION(ps,cVal), &V_UNION(pd,uiVal) ); 1139 break; 1140 case( VT_I2 ): 1141 res = VarUI2FromI2( V_UNION(ps,iVal), &V_UNION(pd,uiVal) ); 1142 break; 1143 case( VT_INT ): 1144 case( VT_I4 ): 1145 res = VarUI2FromI4( V_UNION(ps,lVal), &V_UNION(pd,uiVal) ); 1146 break; 1147 case( VT_UI1 ): 1148 res = VarUI2FromUI1( V_UNION(ps,bVal), &V_UNION(pd,uiVal) ); 1149 break; 1150 1150 case( VT_UI2 ): 1151 1151 res = VariantCopy( pd, ps ); 1152 1152 break; 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1153 case( VT_UINT ): 1154 case( VT_UI4 ): 1155 res = VarUI2FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,uiVal) ); 1156 break; 1157 case( VT_R4 ): 1158 res = VarUI2FromR4( V_UNION(ps,fltVal), &V_UNION(pd,uiVal) ); 1159 break; 1160 case( VT_R8 ): 1161 res = VarUI2FromR8( V_UNION(ps,dblVal), &V_UNION(pd,uiVal) ); 1162 break; 1163 case( VT_DATE ): 1164 res = VarUI2FromDate( V_UNION(ps,date), &V_UNION(pd,uiVal) ); 1165 break; 1166 case( VT_BOOL ): 1167 res = VarUI2FromBool( V_UNION(ps,boolVal), &V_UNION(pd,uiVal) ); 1168 break; 1169 case( VT_BSTR ): 1170 res = VarUI2FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,uiVal) ); 1171 break; 1172 case( VT_CY ): 1173 res = VarUI2FromCy( V_UNION(ps,cyVal), &V_UNION(pd,uiVal) ); 1174 break; 1175 case( VT_DISPATCH ): 1176 /*res = VarUI2FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,uiVal) );*/ 1177 case( VT_DECIMAL ): 1178 /*res = VarUI2FromDec( V_UNION(ps,deiVal), &V_UNION(pd,uiVal) );*/ 1179 case( VT_UNKNOWN ): 1180 default: 1181 res = DISP_E_TYPEMISMATCH; 1182 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1183 break; 1184 } 1185 break; 1186 1187 case( VT_UINT ): 1188 case( VT_UI4 ): 1189 switch( vtFrom ) 1190 { 1191 case( VT_I1 ): 1192 res = VarUI4FromI1( V_UNION(ps,cVal), &V_UNION(pd,ulVal) ); 1193 break; 1194 case( VT_I2 ): 1195 res = VarUI4FromI2( V_UNION(ps,iVal), &V_UNION(pd,ulVal) ); 1196 break; 1197 case( VT_INT ): 1198 case( VT_I4 ): 1199 res = VarUI4FromI4( V_UNION(ps,lVal), &V_UNION(pd,ulVal) ); 1200 break; 1201 case( VT_UI1 ): 1202 res = VarUI4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,ulVal) ); 1203 break; 1204 case( VT_UI2 ): 1205 res = VarUI4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,ulVal) ); 1206 break; 1207 1207 case( VT_UI4 ): 1208 1208 res = VariantCopy( pd, ps ); 1209 1209 break; 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1210 case( VT_R4 ): 1211 res = VarUI4FromR4( V_UNION(ps,fltVal), &V_UNION(pd,ulVal) ); 1212 break; 1213 case( VT_R8 ): 1214 res = VarUI4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,ulVal) ); 1215 break; 1216 case( VT_DATE ): 1217 res = VarUI4FromDate( V_UNION(ps,date), &V_UNION(pd,ulVal) ); 1218 break; 1219 case( VT_BOOL ): 1220 res = VarUI4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,ulVal) ); 1221 break; 1222 case( VT_BSTR ): 1223 res = VarUI4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,ulVal) ); 1224 break; 1225 case( VT_CY ): 1226 res = VarUI4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,ulVal) ); 1227 break; 1228 case( VT_DISPATCH ): 1229 /*res = VarUI4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,ulVal) );*/ 1230 case( VT_DECIMAL ): 1231 /*res = VarUI4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,ulVal) );*/ 1232 case( VT_UNKNOWN ): 1233 default: 1234 res = DISP_E_TYPEMISMATCH; 1235 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1236 break; 1237 } 1238 break; 1239 1240 case( VT_R4 ): 1241 switch( vtFrom ) 1242 { 1243 case( VT_I1 ): 1244 res = VarR4FromI1( V_UNION(ps,cVal), &V_UNION(pd,fltVal) ); 1245 break; 1246 case( VT_I2 ): 1247 res = VarR4FromI2( V_UNION(ps,iVal), &V_UNION(pd,fltVal) ); 1248 break; 1249 case( VT_INT ): 1250 case( VT_I4 ): 1251 res = VarR4FromI4( V_UNION(ps,lVal), &V_UNION(pd,fltVal) ); 1252 break; 1253 case( VT_UI1 ): 1254 res = VarR4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,fltVal) ); 1255 break; 1256 case( VT_UI2 ): 1257 res = VarR4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,fltVal) ); 1258 break; 1259 case( VT_UINT ): 1260 case( VT_UI4 ): 1261 res = VarR4FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,fltVal) ); 1262 break; 1263 1263 case( VT_R4 ): 1264 1264 res = VariantCopy( pd, ps ); 1265 1265 break; 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1266 case( VT_R8 ): 1267 res = VarR4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,fltVal) ); 1268 break; 1269 case( VT_DATE ): 1270 res = VarR4FromDate( V_UNION(ps,date), &V_UNION(pd,fltVal) ); 1271 break; 1272 case( VT_BOOL ): 1273 res = VarR4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,fltVal) ); 1274 break; 1275 case( VT_BSTR ): 1276 res = VarR4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,fltVal) ); 1277 break; 1278 case( VT_CY ): 1279 res = VarR4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,fltVal) ); 1280 break; 1281 case( VT_DISPATCH ): 1282 /*res = VarR4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,fltVal) );*/ 1283 case( VT_DECIMAL ): 1284 /*res = VarR4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,fltVal) );*/ 1285 case( VT_UNKNOWN ): 1286 default: 1287 res = DISP_E_TYPEMISMATCH; 1288 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1289 break; 1290 } 1291 break; 1292 1293 case( VT_R8 ): 1294 switch( vtFrom ) 1295 { 1296 case( VT_I1 ): 1297 res = VarR8FromI1( V_UNION(ps,cVal), &V_UNION(pd,dblVal) ); 1298 break; 1299 case( VT_I2 ): 1300 res = VarR8FromI2( V_UNION(ps,iVal), &V_UNION(pd,dblVal) ); 1301 break; 1302 case( VT_INT ): 1303 case( VT_I4 ): 1304 res = VarR8FromI4( V_UNION(ps,lVal), &V_UNION(pd,dblVal) ); 1305 break; 1306 case( VT_UI1 ): 1307 res = VarR8FromUI1( V_UNION(ps,bVal), &V_UNION(pd,dblVal) ); 1308 break; 1309 case( VT_UI2 ): 1310 res = VarR8FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,dblVal) ); 1311 break; 1312 case( VT_UINT ): 1313 case( VT_UI4 ): 1314 res = VarR8FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,dblVal) ); 1315 break; 1316 case( VT_R4 ): 1317 res = VarR8FromR4( V_UNION(ps,fltVal), &V_UNION(pd,dblVal) ); 1318 break; 1319 1319 case( VT_R8 ): 1320 1320 res = VariantCopy( pd, ps ); 1321 1321 break; 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1322 case( VT_DATE ): 1323 res = VarR8FromDate( V_UNION(ps,date), &V_UNION(pd,dblVal) ); 1324 break; 1325 case( VT_BOOL ): 1326 res = VarR8FromBool( V_UNION(ps,boolVal), &V_UNION(pd,dblVal) ); 1327 break; 1328 case( VT_BSTR ): 1329 res = VarR8FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,dblVal) ); 1330 break; 1331 case( VT_CY ): 1332 res = VarR8FromCy( V_UNION(ps,cyVal), &V_UNION(pd,dblVal) ); 1333 break; 1334 case( VT_DISPATCH ): 1335 /*res = VarR8FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,dblVal) );*/ 1336 case( VT_DECIMAL ): 1337 /*res = VarR8FromDec( V_UNION(ps,deiVal), &V_UNION(pd,dblVal) );*/ 1338 case( VT_UNKNOWN ): 1339 default: 1340 res = DISP_E_TYPEMISMATCH; 1341 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1342 break; 1343 } 1344 break; 1345 1346 case( VT_DATE ): 1347 switch( vtFrom ) 1348 { 1349 case( VT_I1 ): 1350 res = VarDateFromI1( V_UNION(ps,cVal), &V_UNION(pd,date) ); 1351 break; 1352 case( VT_I2 ): 1353 res = VarDateFromI2( V_UNION(ps,iVal), &V_UNION(pd,date) ); 1354 break; 1355 case( VT_INT ): 1356 res = VarDateFromInt( V_UNION(ps,intVal), &V_UNION(pd,date) ); 1357 break; 1358 case( VT_I4 ): 1359 res = VarDateFromI4( V_UNION(ps,lVal), &V_UNION(pd,date) ); 1360 break; 1361 case( VT_UI1 ): 1362 res = VarDateFromUI1( V_UNION(ps,bVal), &V_UNION(pd,date) ); 1363 break; 1364 case( VT_UI2 ): 1365 res = VarDateFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,date) ); 1366 break; 1367 case( VT_UINT ): 1368 res = VarDateFromUint( V_UNION(ps,uintVal), &V_UNION(pd,date) ); 1369 break; 1370 case( VT_UI4 ): 1371 res = VarDateFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,date) ); 1372 break; 1373 case( VT_R4 ): 1374 res = VarDateFromR4( V_UNION(ps,fltVal), &V_UNION(pd,date) ); 1375 break; 1376 case( VT_R8 ): 1377 res = VarDateFromR8( V_UNION(ps,dblVal), &V_UNION(pd,date) ); 1378 break; 1379 1379 case( VT_DATE ): 1380 1380 res = VariantCopy( pd, ps ); 1381 1381 break; 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1382 case( VT_BOOL ): 1383 res = VarDateFromBool( V_UNION(ps,boolVal), &V_UNION(pd,date) ); 1384 break; 1385 case( VT_BSTR ): 1386 res = VarDateFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,date) ); 1387 break; 1388 case( VT_CY ): 1389 res = VarDateFromCy( V_UNION(ps,cyVal), &V_UNION(pd,date) ); 1390 break; 1391 case( VT_DISPATCH ): 1392 /*res = VarDateFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,date) );*/ 1393 case( VT_DECIMAL ): 1394 /*res = VarDateFromDec( V_UNION(ps,deiVal), &V_UNION(pd,date) );*/ 1395 case( VT_UNKNOWN ): 1396 default: 1397 res = DISP_E_TYPEMISMATCH; 1398 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1399 break; 1400 } 1401 break; 1402 1403 case( VT_BOOL ): 1404 switch( vtFrom ) 1405 { 1406 case( VT_I1 ): 1407 res = VarBoolFromI1( V_UNION(ps,cVal), &V_UNION(pd,boolVal) ); 1408 break; 1409 case( VT_I2 ): 1410 res = VarBoolFromI2( V_UNION(ps,iVal), &V_UNION(pd,boolVal) ); 1411 break; 1412 case( VT_INT ): 1413 res = VarBoolFromInt( V_UNION(ps,intVal), &V_UNION(pd,boolVal) ); 1414 break; 1415 case( VT_I4 ): 1416 res = VarBoolFromI4( V_UNION(ps,lVal), &V_UNION(pd,boolVal) ); 1417 break; 1418 case( VT_UI1 ): 1419 res = VarBoolFromUI1( V_UNION(ps,bVal), &V_UNION(pd,boolVal) ); 1420 break; 1421 case( VT_UI2 ): 1422 res = VarBoolFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,boolVal) ); 1423 break; 1424 case( VT_UINT ): 1425 res = VarBoolFromUint( V_UNION(ps,uintVal), &V_UNION(pd,boolVal) ); 1426 break; 1427 case( VT_UI4 ): 1428 res = VarBoolFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,boolVal) ); 1429 break; 1430 case( VT_R4 ): 1431 res = VarBoolFromR4( V_UNION(ps,fltVal), &V_UNION(pd,boolVal) ); 1432 break; 1433 case( VT_R8 ): 1434 res = VarBoolFromR8( V_UNION(ps,dblVal), &V_UNION(pd,boolVal) ); 1435 break; 1436 case( VT_DATE ): 1437 res = VarBoolFromDate( V_UNION(ps,date), &V_UNION(pd,boolVal) ); 1438 break; 1439 1439 case( VT_BOOL ): 1440 1440 res = VariantCopy( pd, ps ); 1441 1441 break; 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1442 case( VT_BSTR ): 1443 res = VarBoolFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,boolVal) ); 1444 break; 1445 case( VT_CY ): 1446 res = VarBoolFromCy( V_UNION(ps,cyVal), &V_UNION(pd,boolVal) ); 1447 break; 1448 case( VT_DISPATCH ): 1449 /*res = VarBoolFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,boolVal) );*/ 1450 case( VT_DECIMAL ): 1451 /*res = VarBoolFromDec( V_UNION(ps,deiVal), &V_UNION(pd,boolVal) );*/ 1452 case( VT_UNKNOWN ): 1453 default: 1454 res = DISP_E_TYPEMISMATCH; 1455 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1456 break; 1457 } 1458 break; 1459 1460 case( VT_BSTR ): 1461 switch( vtFrom ) 1462 { 1463 case( VT_EMPTY ): 1464 if ((V_UNION(pd,bstrVal) = SysAllocStringLen(NULL, 0))) 1465 res = S_OK; 1466 else 1467 res = E_OUTOFMEMORY; 1468 break; 1469 case( VT_I1 ): 1470 res = VarBstrFromI1( V_UNION(ps,cVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1471 break; 1472 case( VT_I2 ): 1473 res = VarBstrFromI2( V_UNION(ps,iVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1474 break; 1475 case( VT_INT ): 1476 res = VarBstrFromInt( V_UNION(ps,intVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1477 break; 1478 case( VT_I4 ): 1479 res = VarBstrFromI4( V_UNION(ps,lVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1480 break; 1481 case( VT_UI1 ): 1482 res = VarBstrFromUI1( V_UNION(ps,bVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1483 break; 1484 case( VT_UI2 ): 1485 res = VarBstrFromUI2( V_UNION(ps,uiVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1486 break; 1487 case( VT_UINT ): 1488 res = VarBstrFromUint( V_UNION(ps,uintVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1489 break; 1490 case( VT_UI4 ): 1491 res = VarBstrFromUI4( V_UNION(ps,ulVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1492 break; 1493 case( VT_R4 ): 1494 res = VarBstrFromR4( V_UNION(ps,fltVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1495 break; 1496 case( VT_R8 ): 1497 res = VarBstrFromR8( V_UNION(ps,dblVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1498 break; 1499 case( VT_DATE ): 1500 res = VarBstrFromDate( V_UNION(ps,date), lcid, 0, &V_UNION(pd,bstrVal) ); 1501 break; 1502 case( VT_BOOL ): 1503 res = VarBstrFromBool( V_UNION(ps,boolVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1504 break; 1505 case( VT_BSTR ): 1506 res = VariantCopy( pd, ps ); 1507 break; 1508 case( VT_CY ): 1509 res = VarBstrFromCy( V_UNION(ps,cyVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1510 break; 1511 case( VT_DISPATCH ): 1512 /*res = VarBstrFromDisp( V_UNION(ps,pdispVal), lcid, 0, &(pd,bstrVal) );*/ 1513 case( VT_DECIMAL ): 1514 /*res = VarBstrFromDec( V_UNION(ps,deiVal), lcid, 0, &(pd,bstrVal) );*/ 1515 case( VT_UNKNOWN ): 1516 default: 1517 res = DISP_E_TYPEMISMATCH; 1518 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1519 break; 1520 } 1521 break; 1522 1522 1523 1523 case( VT_CY ): 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 } 1589 1590 /****************************************************************************** 1591 * ValidateVtRange[INTERNAL]1524 switch( vtFrom ) 1525 { 1526 case( VT_I1 ): 1527 res = VarCyFromI1( V_UNION(ps,cVal), &V_UNION(pd,cyVal) ); 1528 break; 1529 case( VT_I2 ): 1530 res = VarCyFromI2( V_UNION(ps,iVal), &V_UNION(pd,cyVal) ); 1531 break; 1532 case( VT_INT ): 1533 res = VarCyFromInt( V_UNION(ps,intVal), &V_UNION(pd,cyVal) ); 1534 break; 1535 case( VT_I4 ): 1536 res = VarCyFromI4( V_UNION(ps,lVal), &V_UNION(pd,cyVal) ); 1537 break; 1538 case( VT_UI1 ): 1539 res = VarCyFromUI1( V_UNION(ps,bVal), &V_UNION(pd,cyVal) ); 1540 break; 1541 case( VT_UI2 ): 1542 res = VarCyFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,cyVal) ); 1543 break; 1544 case( VT_UINT ): 1545 res = VarCyFromUint( V_UNION(ps,uintVal), &V_UNION(pd,cyVal) ); 1546 break; 1547 case( VT_UI4 ): 1548 res = VarCyFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,cyVal) ); 1549 break; 1550 case( VT_R4 ): 1551 res = VarCyFromR4( V_UNION(ps,fltVal), &V_UNION(pd,cyVal) ); 1552 break; 1553 case( VT_R8 ): 1554 res = VarCyFromR8( V_UNION(ps,dblVal), &V_UNION(pd,cyVal) ); 1555 break; 1556 case( VT_DATE ): 1557 res = VarCyFromDate( V_UNION(ps,date), &V_UNION(pd,cyVal) ); 1558 break; 1559 case( VT_BOOL ): 1560 res = VarCyFromBool( V_UNION(ps,date), &V_UNION(pd,cyVal) ); 1561 break; 1562 case( VT_CY ): 1563 res = VariantCopy( pd, ps ); 1564 break; 1565 case( VT_BSTR ): 1566 res = VarCyFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,cyVal) ); 1567 break; 1568 case( VT_DISPATCH ): 1569 /*res = VarCyFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,cyVal) );*/ 1570 case( VT_DECIMAL ): 1571 /*res = VarCyFromDec( V_UNION(ps,deiVal), &V_UNION(pd,cyVal) );*/ 1572 break; 1573 case( VT_UNKNOWN ): 1574 default: 1575 res = DISP_E_TYPEMISMATCH; 1576 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1577 break; 1578 } 1579 break; 1580 1581 default: 1582 res = DISP_E_TYPEMISMATCH; 1583 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1584 break; 1585 } 1586 1587 return res; 1588 } 1589 1590 /****************************************************************************** 1591 * ValidateVtRange [INTERNAL] 1592 1592 * 1593 1593 * Used internally by the hi-level Variant API to determine … … 1608 1608 1609 1609 /****************************************************************************** 1610 * ValidateVartype[INTERNAL]1610 * ValidateVartype [INTERNAL] 1611 1611 * 1612 1612 * Used internally by the hi-level Variant API to determine … … 1615 1615 static HRESULT WINAPI ValidateVariantType( VARTYPE vt ) 1616 1616 { 1617 1618 1619 1620 1621 1617 HRESULT res = S_OK; 1618 1619 /* check if we have a valid argument. 1620 */ 1621 if( vt & VT_BYREF ) 1622 1622 { 1623 1623 /* if by reference check that the type is in … … 1626 1626 if( ( vt & VT_TYPEMASK ) == VT_EMPTY || 1627 1627 ( vt & VT_TYPEMASK ) == VT_NULL || 1628 1629 1630 1631 1632 1628 ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE ) 1629 { 1630 res = E_INVALIDARG; 1631 } 1632 1633 1633 } 1634 1634 else … … 1636 1636 res = ValidateVtRange( vt ); 1637 1637 } 1638 1639 1640 } 1641 1642 /****************************************************************************** 1643 * ValidateVt[INTERNAL]1638 1639 return res; 1640 } 1641 1642 /****************************************************************************** 1643 * ValidateVt [INTERNAL] 1644 1644 * 1645 1645 * Used internally by the hi-level Variant API to determine … … 1648 1648 static HRESULT WINAPI ValidateVt( VARTYPE vt ) 1649 1649 { 1650 1651 1652 1653 1654 1650 HRESULT res = S_OK; 1651 1652 /* check if we have a valid argument. 1653 */ 1654 if( vt & VT_BYREF ) 1655 1655 { 1656 1656 /* if by reference check that the type is in … … 1659 1659 if( ( vt & VT_TYPEMASK ) == VT_EMPTY || 1660 1660 ( vt & VT_TYPEMASK ) == VT_NULL || 1661 1662 1663 1664 1665 1661 ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE ) 1662 { 1663 res = DISP_E_BADVARTYPE; 1664 } 1665 1666 1666 } 1667 1667 else … … 1669 1669 res = ValidateVtRange( vt ); 1670 1670 } 1671 1672 1673 } 1674 1675 1676 1677 1678 1679 /****************************************************************************** 1680 * VariantInit[OLEAUT32.8]1671 1672 return res; 1673 } 1674 1675 1676 1677 1678 1679 /****************************************************************************** 1680 * VariantInit [OLEAUT32.8] 1681 1681 * 1682 1682 * Initializes the Variant. Unlike VariantClear it does not interpret the current … … 1694 1694 1695 1695 /****************************************************************************** 1696 * VariantClear[OLEAUT32.9]1696 * VariantClear [OLEAUT32.9] 1697 1697 * 1698 1698 * This function clears the VARIANT by setting the vt field to VT_EMPTY. It also 1699 * sets the wReservedX field to 0. 1699 * sets the wReservedX field to 0. The current contents of the VARIANT are 1700 1700 * freed. If the vt is VT_BSTR the string is freed. If VT_DISPATCH the object is 1701 1701 * released. If VT_ARRAY the array is freed. … … 1716 1716 if ( (V_VT(pvarg) & VT_ARRAY) != 0) 1717 1717 { 1718 1718 SafeArrayDestroy(V_UNION(pvarg,parray)); 1719 1719 } 1720 1720 else 1721 1721 { 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1722 switch( V_VT(pvarg) & VT_TYPEMASK ) 1723 { 1724 case( VT_BSTR ): 1725 SysFreeString( V_UNION(pvarg,bstrVal) ); 1726 break; 1727 case( VT_DISPATCH ): 1728 if(V_UNION(pvarg,pdispVal)!=NULL) 1729 ICOM_CALL(Release,V_UNION(pvarg,pdispVal)); 1730 break; 1731 case( VT_VARIANT ): 1732 VariantClear(V_UNION(pvarg,pvarVal)); 1733 break; 1734 case( VT_UNKNOWN ): 1735 if(V_UNION(pvarg,punkVal)!=NULL) 1736 ICOM_CALL(Release,V_UNION(pvarg,punkVal)); 1737 break; 1738 case( VT_SAFEARRAY ): 1739 SafeArrayDestroy(V_UNION(pvarg,parray)); 1740 break; 1741 default: 1742 break; 1743 } 1744 1744 } 1745 1745 } 1746 1746 1747 1747 /* 1748 1748 * Empty all the fields and mark the type as empty. … … 1756 1756 1757 1757 /****************************************************************************** 1758 * VariantCopy[OLEAUT32.10]1758 * VariantCopy [OLEAUT32.10] 1759 1759 * 1760 1760 * Frees up the designation variant and makes a copy of the source. … … 1774 1774 { 1775 1775 res = VariantClear( pvargDest ); 1776 1776 1777 1777 if( res == S_OK ) 1778 1778 { 1779 1779 if( V_VT(pvargSrc) & VT_BYREF ) 1780 1780 { 1781 1782 1783 1784 1785 1781 /* In the case of byreference we only need 1782 * to copy the pointer. 1783 */ 1784 pvargDest->n1.n2.n3 = pvargSrc->n1.n2.n3; 1785 V_VT(pvargDest) = V_VT(pvargSrc); 1786 1786 } 1787 1787 else 1788 1788 { 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 } 1789 /* 1790 * The VT_ARRAY flag is another way to designate a safe array. 1791 */ 1792 if (V_VT(pvargSrc) & VT_ARRAY) 1793 { 1794 SafeArrayCopy(V_UNION(pvargSrc,parray), &V_UNION(pvargDest,parray)); 1795 } 1796 else 1797 { 1798 /* In the case of by value we need to 1799 * copy the actuall value. In the case of 1800 * VT_BSTR a copy of the string is made, 1801 * if VT_DISPATCH or VT_IUNKNOWN AddReff is 1802 * called to increment the object's reference count. 1803 */ 1804 switch( V_VT(pvargSrc) & VT_TYPEMASK ) 1805 { 1806 case( VT_BSTR ): 1807 V_UNION(pvargDest,bstrVal) = SysAllocString( V_UNION(pvargSrc,bstrVal) ); 1808 break; 1809 case( VT_DISPATCH ): 1810 V_UNION(pvargDest,pdispVal) = V_UNION(pvargSrc,pdispVal); 1811 if (V_UNION(pvargDest,pdispVal)!=NULL) 1812 ICOM_CALL(AddRef,V_UNION(pvargDest,pdispVal)); 1813 break; 1814 case( VT_VARIANT ): 1815 VariantCopy(V_UNION(pvargDest,pvarVal),V_UNION(pvargSrc,pvarVal)); 1816 break; 1817 case( VT_UNKNOWN ): 1818 V_UNION(pvargDest,punkVal) = V_UNION(pvargSrc,punkVal); 1819 if (V_UNION(pvargDest,pdispVal)!=NULL) 1820 ICOM_CALL(AddRef,V_UNION(pvargDest,punkVal)); 1821 break; 1822 case( VT_SAFEARRAY ): 1823 SafeArrayCopy(V_UNION(pvargSrc,parray), &V_UNION(pvargDest,parray)); 1824 break; 1825 default: 1826 pvargDest->n1.n2.n3 = pvargSrc->n1.n2.n3; 1827 break; 1828 } 1829 } 1830 1831 V_VT(pvargDest) = V_VT(pvargSrc); 1832 } 1833 1833 } 1834 1834 } … … 1839 1839 1840 1840 /****************************************************************************** 1841 * VariantCopyInd[OLEAUT32.11]1841 * VariantCopyInd [OLEAUT32.11] 1842 1842 * 1843 1843 * Frees up the destination variant and makes a copy of the source. If … … 1854 1854 if( res != S_OK ) 1855 1855 return res; 1856 1856 1857 1857 if( V_VT(pvargSrc) & VT_BYREF ) 1858 1858 { … … 1876 1876 if( res == S_OK ) 1877 1877 { 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 * returned. 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1878 /* 1879 * The VT_ARRAY flag is another way to designate a safearray variant. 1880 */ 1881 if ( V_VT(pvargSrc) & VT_ARRAY) 1882 { 1883 SafeArrayCopy(*V_UNION(pvargSrc,pparray), &V_UNION(pvargDest,parray)); 1884 } 1885 else 1886 { 1887 /* In the case of by reference we need 1888 * to copy the date pointed to by the variant. 1889 */ 1890 1891 /* Get the variant type. 1892 */ 1893 switch( V_VT(pvargSrc) & VT_TYPEMASK ) 1894 { 1895 case( VT_BSTR ): 1896 V_UNION(pvargDest,bstrVal) = SysAllocString( *(V_UNION(pvargSrc,pbstrVal)) ); 1897 break; 1898 case( VT_DISPATCH ): 1899 break; 1900 case( VT_VARIANT ): 1901 { 1902 /* Prevent from cycling. According to tests on 1903 * VariantCopyInd in Windows and the documentation 1904 * this API dereferences the inner Variants to only one depth. 1905 * If the inner Variant itself contains an 1906 * other inner variant the E_INVALIDARG error is 1907 * returned. 1908 */ 1909 if( pvargSrc->n1.n2.wReserved1 & PROCESSING_INNER_VARIANT ) 1910 { 1911 /* If we get here we are attempting to deference 1912 * an inner variant that that is itself contained 1913 * in an inner variant so report E_INVALIDARG error. 1914 */ 1915 res = E_INVALIDARG; 1916 } 1917 else 1918 { 1919 /* Set the processing inner variant flag. 1920 * We will set this flag in the inner variant 1921 * that will be passed to the VariantCopyInd function. 1922 */ 1923 (V_UNION(pvargSrc,pvarVal))->n1.n2.wReserved1 |= PROCESSING_INNER_VARIANT; 1924 1925 /* Dereference the inner variant. 1926 */ 1927 res = VariantCopyInd( pvargDest, V_UNION(pvargSrc,pvarVal) ); 1928 /* We must also copy its type, I think. 1929 */ 1930 V_VT(pvargSrc) = V_VT(V_UNION(pvargSrc,pvarVal)); 1931 } 1932 } 1933 break; 1934 case( VT_UNKNOWN ): 1935 break; 1936 case( VT_SAFEARRAY ): 1937 SafeArrayCopy(*V_UNION(pvargSrc,pparray), &V_UNION(pvargDest,parray)); 1938 break; 1939 default: 1940 /* This is a by reference Variant which means that the union 1941 * part of the Variant contains a pointer to some data of 1942 * type "V_VT(pvargSrc) & VT_TYPEMASK". 1943 * We will deference this data in a generic fashion using 1944 * the void pointer "Variant.u.byref". 1945 * We will copy this data into the union of the destination 1946 * Variant. 1947 */ 1948 memcpy( &pvargDest->n1.n2, V_UNION(pvargSrc,byref), SizeOfVariantData( pvargSrc ) ); 1949 break; 1950 } 1951 } 1952 1953 V_VT(pvargDest) = V_VT(pvargSrc) & VT_TYPEMASK; 1954 1954 } 1955 1955 } … … 1968 1968 1969 1969 /****************************************************************************** 1970 * VariantChangeType[OLEAUT32.12]1970 * VariantChangeType [OLEAUT32.12] 1971 1971 */ 1972 1972 HRESULT WINAPI VariantChangeType(VARIANTARG* pvargDest, VARIANTARG* pvargSrc, 1973 1974 { 1975 1976 } 1977 1978 /****************************************************************************** 1979 * VariantChangeTypeEx[OLEAUT32.147]1973 USHORT wFlags, VARTYPE vt) 1974 { 1975 return VariantChangeTypeEx( pvargDest, pvargSrc, 0, wFlags, vt ); 1976 } 1977 1978 /****************************************************************************** 1979 * VariantChangeTypeEx [OLEAUT32.147] 1980 1980 */ 1981 1981 HRESULT WINAPI VariantChangeTypeEx(VARIANTARG* pvargDest, VARIANTARG* pvargSrc, 1982 1983 { 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 } 2052 2053 2054 2055 2056 /****************************************************************************** 2057 * VarUI1FromI2[OLEAUT32.130]1982 LCID lcid, USHORT wFlags, VARTYPE vt) 1983 { 1984 HRESULT res = S_OK; 1985 VARIANTARG varg; 1986 VariantInit( &varg ); 1987 1988 TRACE("(%p, %p, %ld, %u, %u),stub\n", pvargDest, pvargSrc, lcid, wFlags, vt); 1989 1990 /* validate our source argument. 1991 */ 1992 res = ValidateVariantType( V_VT(pvargSrc) ); 1993 1994 /* validate the vartype. 1995 */ 1996 if( res == S_OK ) 1997 { 1998 res = ValidateVt( vt ); 1999 } 2000 2001 /* if we are doing an in-place conversion make a copy of the source. 2002 */ 2003 if( res == S_OK && pvargDest == pvargSrc ) 2004 { 2005 res = VariantCopy( &varg, pvargSrc ); 2006 pvargSrc = &varg; 2007 } 2008 2009 if( res == S_OK ) 2010 { 2011 /* free up the destination variant. 2012 */ 2013 res = VariantClear( pvargDest ); 2014 } 2015 2016 if( res == S_OK ) 2017 { 2018 if( V_VT(pvargSrc) & VT_BYREF ) 2019 { 2020 /* Convert the source variant to a "byvalue" variant. 2021 */ 2022 VARIANTARG Variant; 2023 VariantInit( &Variant ); 2024 res = VariantCopyInd( &Variant, pvargSrc ); 2025 if( res == S_OK ) 2026 { 2027 res = Coerce( pvargDest, lcid, wFlags, &Variant, vt ); 2028 /* this should not fail. 2029 */ 2030 VariantClear( &Variant ); 2031 } 2032 2033 } 2034 else 2035 { 2036 /* Use the current "byvalue" source variant. 2037 */ 2038 res = Coerce( pvargDest, lcid, wFlags, pvargSrc, vt ); 2039 } 2040 } 2041 /* this should not fail. 2042 */ 2043 VariantClear( &varg ); 2044 2045 /* set the type of the destination 2046 */ 2047 if ( res == S_OK ) 2048 V_VT(pvargDest) = vt; 2049 2050 return res; 2051 } 2052 2053 2054 2055 2056 /****************************************************************************** 2057 * VarUI1FromI2 [OLEAUT32.130] 2058 2058 */ 2059 2059 HRESULT WINAPI VarUI1FromI2(short sIn, BYTE* pbOut) 2060 2060 { 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 } 2074 2075 /****************************************************************************** 2076 * VarUI1FromI4[OLEAUT32.131]2061 TRACE("( %d, %p ), stub\n", sIn, pbOut ); 2062 2063 /* Check range of value. 2064 */ 2065 if( sIn < UI1_MIN || sIn > UI1_MAX ) 2066 { 2067 return DISP_E_OVERFLOW; 2068 } 2069 2070 *pbOut = (BYTE) sIn; 2071 2072 return S_OK; 2073 } 2074 2075 /****************************************************************************** 2076 * VarUI1FromI4 [OLEAUT32.131] 2077 2077 */ 2078 2078 HRESULT WINAPI VarUI1FromI4(LONG lIn, BYTE* pbOut) 2079 2079 { 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 } 2093 2094 2095 /****************************************************************************** 2096 * VarUI1FromR4[OLEAUT32.132]2080 TRACE("( %ld, %p ), stub\n", lIn, pbOut ); 2081 2082 /* Check range of value. 2083 */ 2084 if( lIn < UI1_MIN || lIn > UI1_MAX ) 2085 { 2086 return DISP_E_OVERFLOW; 2087 } 2088 2089 *pbOut = (BYTE) lIn; 2090 2091 return S_OK; 2092 } 2093 2094 2095 /****************************************************************************** 2096 * VarUI1FromR4 [OLEAUT32.132] 2097 2097 */ 2098 2098 HRESULT WINAPI VarUI1FromR4(FLOAT fltIn, BYTE* pbOut) 2099 2099 { 2100 2101 2102 2100 TRACE("( %f, %p ), stub\n", fltIn, pbOut ); 2101 2102 /* Check range of value. 2103 2103 */ 2104 2104 fltIn = round( fltIn ); 2105 2106 2107 2108 2109 2110 2111 2112 2113 } 2114 2115 /****************************************************************************** 2116 * VarUI1FromR8[OLEAUT32.133]2105 if( fltIn < UI1_MIN || fltIn > UI1_MAX ) 2106 { 2107 return DISP_E_OVERFLOW; 2108 } 2109 2110 *pbOut = (BYTE) fltIn; 2111 2112 return S_OK; 2113 } 2114 2115 /****************************************************************************** 2116 * VarUI1FromR8 [OLEAUT32.133] 2117 2117 */ 2118 2118 HRESULT WINAPI VarUI1FromR8(double dblIn, BYTE* pbOut) 2119 2119 { 2120 2121 2122 2120 TRACE("( %f, %p ), stub\n", dblIn, pbOut ); 2121 2122 /* Check range of value. 2123 2123 */ 2124 2124 dblIn = round( dblIn ); 2125 2126 2127 2128 2129 2130 2131 2132 2133 } 2134 2135 /****************************************************************************** 2136 * VarUI1FromDate[OLEAUT32.135]2125 if( dblIn < UI1_MIN || dblIn > UI1_MAX ) 2126 { 2127 return DISP_E_OVERFLOW; 2128 } 2129 2130 *pbOut = (BYTE) dblIn; 2131 2132 return S_OK; 2133 } 2134 2135 /****************************************************************************** 2136 * VarUI1FromDate [OLEAUT32.135] 2137 2137 */ 2138 2138 HRESULT WINAPI VarUI1FromDate(DATE dateIn, BYTE* pbOut) 2139 2139 { 2140 2141 2142 2140 TRACE("( %f, %p ), stub\n", dateIn, pbOut ); 2141 2142 /* Check range of value. 2143 2143 */ 2144 2144 dateIn = round( dateIn ); 2145 2146 2147 2148 2149 2150 2151 2152 2153 } 2154 2155 /****************************************************************************** 2156 * VarUI1FromBool[OLEAUT32.138]2145 if( dateIn < UI1_MIN || dateIn > UI1_MAX ) 2146 { 2147 return DISP_E_OVERFLOW; 2148 } 2149 2150 *pbOut = (BYTE) dateIn; 2151 2152 return S_OK; 2153 } 2154 2155 /****************************************************************************** 2156 * VarUI1FromBool [OLEAUT32.138] 2157 2157 */ 2158 2158 HRESULT WINAPI VarUI1FromBool(VARIANT_BOOL boolIn, BYTE* pbOut) 2159 2159 { 2160 2161 2162 2163 2164 2165 } 2166 2167 /****************************************************************************** 2168 * VarUI1FromI1[OLEAUT32.237]2160 TRACE("( %d, %p ), stub\n", boolIn, pbOut ); 2161 2162 *pbOut = (BYTE) boolIn; 2163 2164 return S_OK; 2165 } 2166 2167 /****************************************************************************** 2168 * VarUI1FromI1 [OLEAUT32.237] 2169 2169 */ 2170 2170 HRESULT WINAPI VarUI1FromI1(CHAR cIn, BYTE* pbOut) 2171 2171 { 2172 2173 2174 2175 2176 2177 } 2178 2179 /****************************************************************************** 2180 * VarUI1FromUI2[OLEAUT32.238]2172 TRACE("( %c, %p ), stub\n", cIn, pbOut ); 2173 2174 *pbOut = cIn; 2175 2176 return S_OK; 2177 } 2178 2179 /****************************************************************************** 2180 * VarUI1FromUI2 [OLEAUT32.238] 2181 2181 */ 2182 2182 HRESULT WINAPI VarUI1FromUI2(USHORT uiIn, BYTE* pbOut) 2183 2183 { 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 } 2197 2198 /****************************************************************************** 2199 * VarUI1FromUI4[OLEAUT32.239]2184 TRACE("( %d, %p ), stub\n", uiIn, pbOut ); 2185 2186 /* Check range of value. 2187 */ 2188 if( uiIn > UI1_MAX ) 2189 { 2190 return DISP_E_OVERFLOW; 2191 } 2192 2193 *pbOut = (BYTE) uiIn; 2194 2195 return S_OK; 2196 } 2197 2198 /****************************************************************************** 2199 * VarUI1FromUI4 [OLEAUT32.239] 2200 2200 */ 2201 2201 HRESULT WINAPI VarUI1FromUI4(ULONG ulIn, BYTE* pbOut) 2202 2202 { 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 } 2216 2217 2218 /****************************************************************************** 2219 * VarUI1FromStr[OLEAUT32.136]2203 TRACE("( %ld, %p ), stub\n", ulIn, pbOut ); 2204 2205 /* Check range of value. 2206 */ 2207 if( ulIn > UI1_MAX ) 2208 { 2209 return DISP_E_OVERFLOW; 2210 } 2211 2212 *pbOut = (BYTE) ulIn; 2213 2214 return S_OK; 2215 } 2216 2217 2218 /****************************************************************************** 2219 * VarUI1FromStr [OLEAUT32.136] 2220 2220 */ 2221 2221 HRESULT WINAPI VarUI1FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, BYTE* pbOut) 2222 2222 { 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2223 double dValue = 0.0; 2224 LPSTR pNewString = NULL; 2225 2226 TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, pbOut ); 2227 2228 /* Check if we have a valid argument 2229 */ 2230 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 2231 RemoveCharacterFromString( pNewString, "," ); 2232 if( IsValidRealString( pNewString ) == FALSE ) 2233 { 2234 return DISP_E_TYPEMISMATCH; 2235 } 2236 2237 /* Convert the valid string to a floating point number. 2238 */ 2239 dValue = atof( pNewString ); 2240 2241 /* We don't need the string anymore so free it. 2242 */ 2243 HeapFree( GetProcessHeap(), 0 , pNewString ); 2244 2245 /* Check range of value. 2246 2246 */ 2247 2247 dValue = round( dValue ); 2248 2249 2250 2251 2252 2253 2254 2255 2248 if( dValue < UI1_MIN || dValue > UI1_MAX ) 2249 { 2250 return DISP_E_OVERFLOW; 2251 } 2252 2253 *pbOut = (BYTE) dValue; 2254 2255 return S_OK; 2256 2256 } 2257 2257 … … 2262 2262 HRESULT WINAPI VarUI1FromCy(CY cyIn, BYTE* pbOut) { 2263 2263 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 2264 2264 2265 2265 if (t > UI1_MAX || t < UI1_MIN) return DISP_E_OVERFLOW; 2266 2266 2267 2267 *pbOut = (BYTE)t; 2268 2268 return S_OK; … … 2270 2270 2271 2271 /****************************************************************************** 2272 * VarI2FromUI1[OLEAUT32.48]2272 * VarI2FromUI1 [OLEAUT32.48] 2273 2273 */ 2274 2274 HRESULT WINAPI VarI2FromUI1(BYTE bIn, short* psOut) 2275 2275 { 2276 2277 2278 2279 2280 2281 } 2282 2283 /****************************************************************************** 2284 * VarI2FromI4[OLEAUT32.49]2276 TRACE("( 0x%08x, %p ), stub\n", bIn, psOut ); 2277 2278 *psOut = (short) bIn; 2279 2280 return S_OK; 2281 } 2282 2283 /****************************************************************************** 2284 * VarI2FromI4 [OLEAUT32.49] 2285 2285 */ 2286 2286 HRESULT WINAPI VarI2FromI4(LONG lIn, short* psOut) 2287 2287 { 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 } 2301 2302 /****************************************************************************** 2303 * VarI2FromR4[OLEAUT32.50]2288 TRACE("( %lx, %p ), stub\n", lIn, psOut ); 2289 2290 /* Check range of value. 2291 */ 2292 if( lIn < I2_MIN || lIn > I2_MAX ) 2293 { 2294 return DISP_E_OVERFLOW; 2295 } 2296 2297 *psOut = (short) lIn; 2298 2299 return S_OK; 2300 } 2301 2302 /****************************************************************************** 2303 * VarI2FromR4 [OLEAUT32.50] 2304 2304 */ 2305 2305 HRESULT WINAPI VarI2FromR4(FLOAT fltIn, short* psOut) 2306 2306 { 2307 2308 2309 2307 TRACE("( %f, %p ), stub\n", fltIn, psOut ); 2308 2309 /* Check range of value. 2310 2310 */ 2311 2311 fltIn = round( fltIn ); 2312 2313 2314 2315 2316 2317 2318 2319 2320 } 2321 2322 /****************************************************************************** 2323 * VarI2FromR8[OLEAUT32.51]2312 if( fltIn < I2_MIN || fltIn > I2_MAX ) 2313 { 2314 return DISP_E_OVERFLOW; 2315 } 2316 2317 *psOut = (short) fltIn; 2318 2319 return S_OK; 2320 } 2321 2322 /****************************************************************************** 2323 * VarI2FromR8 [OLEAUT32.51] 2324 2324 */ 2325 2325 HRESULT WINAPI VarI2FromR8(double dblIn, short* psOut) 2326 2326 { 2327 2328 2329 2327 TRACE("( %f, %p ), stub\n", dblIn, psOut ); 2328 2329 /* Check range of value. 2330 2330 */ 2331 2331 dblIn = round( dblIn ); 2332 2333 2334 2335 2336 2337 2338 2339 2340 } 2341 2342 /****************************************************************************** 2343 * VarI2FromDate[OLEAUT32.53]2332 if( dblIn < I2_MIN || dblIn > I2_MAX ) 2333 { 2334 return DISP_E_OVERFLOW; 2335 } 2336 2337 *psOut = (short) dblIn; 2338 2339 return S_OK; 2340 } 2341 2342 /****************************************************************************** 2343 * VarI2FromDate [OLEAUT32.53] 2344 2344 */ 2345 2345 HRESULT WINAPI VarI2FromDate(DATE dateIn, short* psOut) 2346 2346 { 2347 2348 2349 2347 TRACE("( %f, %p ), stub\n", dateIn, psOut ); 2348 2349 /* Check range of value. 2350 2350 */ 2351 2351 dateIn = round( dateIn ); 2352 2353 2354 2355 2356 2357 2358 2359 2360 } 2361 2362 /****************************************************************************** 2363 * VarI2FromBool[OLEAUT32.56]2352 if( dateIn < I2_MIN || dateIn > I2_MAX ) 2353 { 2354 return DISP_E_OVERFLOW; 2355 } 2356 2357 *psOut = (short) dateIn; 2358 2359 return S_OK; 2360 } 2361 2362 /****************************************************************************** 2363 * VarI2FromBool [OLEAUT32.56] 2364 2364 */ 2365 2365 HRESULT WINAPI VarI2FromBool(VARIANT_BOOL boolIn, short* psOut) 2366 2366 { 2367 2368 2369 2370 2371 2372 } 2373 2374 /****************************************************************************** 2375 * VarI2FromI1[OLEAUT32.205]2367 TRACE("( %d, %p ), stub\n", boolIn, psOut ); 2368 2369 *psOut = (short) boolIn; 2370 2371 return S_OK; 2372 } 2373 2374 /****************************************************************************** 2375 * VarI2FromI1 [OLEAUT32.205] 2376 2376 */ 2377 2377 HRESULT WINAPI VarI2FromI1(CHAR cIn, short* psOut) 2378 2378 { 2379 2380 2381 2382 2383 2384 } 2385 2386 /****************************************************************************** 2387 * VarI2FromUI2[OLEAUT32.206]2379 TRACE("( %c, %p ), stub\n", cIn, psOut ); 2380 2381 *psOut = (short) cIn; 2382 2383 return S_OK; 2384 } 2385 2386 /****************************************************************************** 2387 * VarI2FromUI2 [OLEAUT32.206] 2388 2388 */ 2389 2389 HRESULT WINAPI VarI2FromUI2(USHORT uiIn, short* psOut) 2390 2390 { 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 } 2404 2405 /****************************************************************************** 2406 * VarI2FromUI4[OLEAUT32.207]2391 TRACE("( %d, %p ), stub\n", uiIn, psOut ); 2392 2393 /* Check range of value. 2394 */ 2395 if( uiIn > I2_MAX ) 2396 { 2397 return DISP_E_OVERFLOW; 2398 } 2399 2400 *psOut = (short) uiIn; 2401 2402 return S_OK; 2403 } 2404 2405 /****************************************************************************** 2406 * VarI2FromUI4 [OLEAUT32.207] 2407 2407 */ 2408 2408 HRESULT WINAPI VarI2FromUI4(ULONG ulIn, short* psOut) 2409 2409 { 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 } 2423 2424 /****************************************************************************** 2425 * VarI2FromStr[OLEAUT32.54]2410 TRACE("( %lx, %p ), stub\n", ulIn, psOut ); 2411 2412 /* Check range of value. 2413 */ 2414 if( ulIn < I2_MIN || ulIn > I2_MAX ) 2415 { 2416 return DISP_E_OVERFLOW; 2417 } 2418 2419 *psOut = (short) ulIn; 2420 2421 return S_OK; 2422 } 2423 2424 /****************************************************************************** 2425 * VarI2FromStr [OLEAUT32.54] 2426 2426 */ 2427 2427 HRESULT WINAPI VarI2FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, short* psOut) 2428 2428 { 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2429 double dValue = 0.0; 2430 LPSTR pNewString = NULL; 2431 2432 TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, psOut ); 2433 2434 /* Check if we have a valid argument 2435 */ 2436 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 2437 RemoveCharacterFromString( pNewString, "," ); 2438 if( IsValidRealString( pNewString ) == FALSE ) 2439 { 2440 return DISP_E_TYPEMISMATCH; 2441 } 2442 2443 /* Convert the valid string to a floating point number. 2444 */ 2445 dValue = atof( pNewString ); 2446 2447 /* We don't need the string anymore so free it. 2448 */ 2449 HeapFree( GetProcessHeap(), 0, pNewString ); 2450 2451 /* Check range of value. 2452 2452 */ 2453 2453 dValue = round( dValue ); 2454 2455 2456 2457 2458 2459 2460 2461 2454 if( dValue < I2_MIN || dValue > I2_MAX ) 2455 { 2456 return DISP_E_OVERFLOW; 2457 } 2458 2459 *psOut = (short) dValue; 2460 2461 return S_OK; 2462 2462 } 2463 2463 … … 2468 2468 HRESULT WINAPI VarI2FromCy(CY cyIn, short* psOut) { 2469 2469 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 2470 2470 2471 2471 if (t > I2_MAX || t < I2_MIN) return DISP_E_OVERFLOW; 2472 2472 2473 2473 *psOut = (SHORT)t; 2474 2474 return S_OK; … … 2476 2476 2477 2477 /****************************************************************************** 2478 * VarI4FromUI1[OLEAUT32.58]2478 * VarI4FromUI1 [OLEAUT32.58] 2479 2479 */ 2480 2480 HRESULT WINAPI VarI4FromUI1(BYTE bIn, LONG* plOut) 2481 2481 { 2482 2483 2484 2485 2486 2487 } 2488 2489 2490 /****************************************************************************** 2491 * VarI4FromR4[OLEAUT32.60]2482 TRACE("( %X, %p ), stub\n", bIn, plOut ); 2483 2484 *plOut = (LONG) bIn; 2485 2486 return S_OK; 2487 } 2488 2489 2490 /****************************************************************************** 2491 * VarI4FromR4 [OLEAUT32.60] 2492 2492 */ 2493 2493 HRESULT WINAPI VarI4FromR4(FLOAT fltIn, LONG* plOut) 2494 2494 { 2495 2496 2497 2495 TRACE("( %f, %p ), stub\n", fltIn, plOut ); 2496 2497 /* Check range of value. 2498 2498 */ 2499 2499 fltIn = round( fltIn ); 2500 2501 2502 2503 2504 2505 2506 2507 2508 } 2509 2510 /****************************************************************************** 2511 * VarI4FromR8[OLEAUT32.61]2500 if( fltIn < I4_MIN || fltIn > I4_MAX ) 2501 { 2502 return DISP_E_OVERFLOW; 2503 } 2504 2505 *plOut = (LONG) fltIn; 2506 2507 return S_OK; 2508 } 2509 2510 /****************************************************************************** 2511 * VarI4FromR8 [OLEAUT32.61] 2512 2512 */ 2513 2513 HRESULT WINAPI VarI4FromR8(double dblIn, LONG* plOut) 2514 2514 { 2515 2516 2517 2515 TRACE("( %f, %p ), stub\n", dblIn, plOut ); 2516 2517 /* Check range of value. 2518 2518 */ 2519 2519 dblIn = round( dblIn ); 2520 2521 2522 2523 2524 2525 2526 2527 2528 } 2529 2530 /****************************************************************************** 2531 * VarI4FromDate[OLEAUT32.63]2520 if( dblIn < I4_MIN || dblIn > I4_MAX ) 2521 { 2522 return DISP_E_OVERFLOW; 2523 } 2524 2525 *plOut = (LONG) dblIn; 2526 2527 return S_OK; 2528 } 2529 2530 /****************************************************************************** 2531 * VarI4FromDate [OLEAUT32.63] 2532 2532 */ 2533 2533 HRESULT WINAPI VarI4FromDate(DATE dateIn, LONG* plOut) 2534 2534 { 2535 2536 2537 2535 TRACE("( %f, %p ), stub\n", dateIn, plOut ); 2536 2537 /* Check range of value. 2538 2538 */ 2539 2539 dateIn = round( dateIn ); 2540 2541 2542 2543 2544 2545 2546 2547 2548 } 2549 2550 /****************************************************************************** 2551 * VarI4FromBool[OLEAUT32.66]2540 if( dateIn < I4_MIN || dateIn > I4_MAX ) 2541 { 2542 return DISP_E_OVERFLOW; 2543 } 2544 2545 *plOut = (LONG) dateIn; 2546 2547 return S_OK; 2548 } 2549 2550 /****************************************************************************** 2551 * VarI4FromBool [OLEAUT32.66] 2552 2552 */ 2553 2553 HRESULT WINAPI VarI4FromBool(VARIANT_BOOL boolIn, LONG* plOut) 2554 2554 { 2555 2556 2557 2558 2559 2560 } 2561 2562 /****************************************************************************** 2563 * VarI4FromI1[OLEAUT32.209]2555 TRACE("( %d, %p ), stub\n", boolIn, plOut ); 2556 2557 *plOut = (LONG) boolIn; 2558 2559 return S_OK; 2560 } 2561 2562 /****************************************************************************** 2563 * VarI4FromI1 [OLEAUT32.209] 2564 2564 */ 2565 2565 HRESULT WINAPI VarI4FromI1(CHAR cIn, LONG* plOut) 2566 2566 { 2567 2568 2569 2570 2571 2572 } 2573 2574 /****************************************************************************** 2575 * VarI4FromUI2[OLEAUT32.210]2567 TRACE("( %c, %p ), stub\n", cIn, plOut ); 2568 2569 *plOut = (LONG) cIn; 2570 2571 return S_OK; 2572 } 2573 2574 /****************************************************************************** 2575 * VarI4FromUI2 [OLEAUT32.210] 2576 2576 */ 2577 2577 HRESULT WINAPI VarI4FromUI2(USHORT uiIn, LONG* plOut) 2578 2578 { 2579 2580 2581 2582 2583 2584 } 2585 2586 /****************************************************************************** 2587 * VarI4FromUI4[OLEAUT32.211]2579 TRACE("( %d, %p ), stub\n", uiIn, plOut ); 2580 2581 *plOut = (LONG) uiIn; 2582 2583 return S_OK; 2584 } 2585 2586 /****************************************************************************** 2587 * VarI4FromUI4 [OLEAUT32.211] 2588 2588 */ 2589 2589 HRESULT WINAPI VarI4FromUI4(ULONG ulIn, LONG* plOut) 2590 2590 { 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 } 2604 2605 /****************************************************************************** 2606 * VarI4FromI2[OLEAUT32.59]2591 TRACE("( %lx, %p ), stub\n", ulIn, plOut ); 2592 2593 /* Check range of value. 2594 */ 2595 if( ulIn < I4_MIN || ulIn > I4_MAX ) 2596 { 2597 return DISP_E_OVERFLOW; 2598 } 2599 2600 *plOut = (LONG) ulIn; 2601 2602 return S_OK; 2603 } 2604 2605 /****************************************************************************** 2606 * VarI4FromI2 [OLEAUT32.59] 2607 2607 */ 2608 2608 HRESULT WINAPI VarI4FromI2(short sIn, LONG* plOut) 2609 2609 { 2610 2611 2612 2613 2614 2615 } 2616 2617 /****************************************************************************** 2618 * VarI4FromStr[OLEAUT32.64]2610 TRACE("( %d, %p ), stub\n", sIn, plOut ); 2611 2612 *plOut = (LONG) sIn; 2613 2614 return S_OK; 2615 } 2616 2617 /****************************************************************************** 2618 * VarI4FromStr [OLEAUT32.64] 2619 2619 */ 2620 2620 HRESULT WINAPI VarI4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, LONG* plOut) 2621 2621 { 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2622 double dValue = 0.0; 2623 LPSTR pNewString = NULL; 2624 2625 TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, plOut ); 2626 2627 /* Check if we have a valid argument 2628 */ 2629 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 2630 RemoveCharacterFromString( pNewString, "," ); 2631 if( IsValidRealString( pNewString ) == FALSE ) 2632 { 2633 return DISP_E_TYPEMISMATCH; 2634 } 2635 2636 /* Convert the valid string to a floating point number. 2637 */ 2638 dValue = atof( pNewString ); 2639 2640 /* We don't need the string anymore so free it. 2641 */ 2642 HeapFree( GetProcessHeap(), 0, pNewString ); 2643 2644 /* Check range of value. 2645 2645 */ 2646 2646 dValue = round( dValue ); 2647 2648 2649 2650 2651 2652 2653 2654 2647 if( dValue < I4_MIN || dValue > I4_MAX ) 2648 { 2649 return DISP_E_OVERFLOW; 2650 } 2651 2652 *plOut = (LONG) dValue; 2653 2654 return S_OK; 2655 2655 } 2656 2656 … … 2661 2661 HRESULT WINAPI VarI4FromCy(CY cyIn, LONG* plOut) { 2662 2662 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 2663 2663 2664 2664 if (t > I4_MAX || t < I4_MIN) return DISP_E_OVERFLOW; 2665 2665 2666 2666 *plOut = (LONG)t; 2667 2667 return S_OK; … … 2669 2669 2670 2670 /****************************************************************************** 2671 * VarR4FromUI1[OLEAUT32.68]2671 * VarR4FromUI1 [OLEAUT32.68] 2672 2672 */ 2673 2673 HRESULT WINAPI VarR4FromUI1(BYTE bIn, FLOAT* pfltOut) 2674 2674 { 2675 2676 2677 2678 2679 2680 } 2681 2682 /****************************************************************************** 2683 * VarR4FromI2[OLEAUT32.69]2675 TRACE("( %X, %p ), stub\n", bIn, pfltOut ); 2676 2677 *pfltOut = (FLOAT) bIn; 2678 2679 return S_OK; 2680 } 2681 2682 /****************************************************************************** 2683 * VarR4FromI2 [OLEAUT32.69] 2684 2684 */ 2685 2685 HRESULT WINAPI VarR4FromI2(short sIn, FLOAT* pfltOut) 2686 2686 { 2687 2688 2689 2690 2691 2692 } 2693 2694 /****************************************************************************** 2695 * VarR4FromI4[OLEAUT32.70]2687 TRACE("( %d, %p ), stub\n", sIn, pfltOut ); 2688 2689 *pfltOut = (FLOAT) sIn; 2690 2691 return S_OK; 2692 } 2693 2694 /****************************************************************************** 2695 * VarR4FromI4 [OLEAUT32.70] 2696 2696 */ 2697 2697 HRESULT WINAPI VarR4FromI4(LONG lIn, FLOAT* pfltOut) 2698 2698 { 2699 2700 2701 2702 2703 2704 } 2705 2706 /****************************************************************************** 2707 * VarR4FromR8[OLEAUT32.71]2699 TRACE("( %lx, %p ), stub\n", lIn, pfltOut ); 2700 2701 *pfltOut = (FLOAT) lIn; 2702 2703 return S_OK; 2704 } 2705 2706 /****************************************************************************** 2707 * VarR4FromR8 [OLEAUT32.71] 2708 2708 */ 2709 2709 HRESULT WINAPI VarR4FromR8(double dblIn, FLOAT* pfltOut) 2710 2710 { 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 } 2724 2725 /****************************************************************************** 2726 * VarR4FromDate[OLEAUT32.73]2711 TRACE("( %f, %p ), stub\n", dblIn, pfltOut ); 2712 2713 /* Check range of value. 2714 */ 2715 if( dblIn < -(FLT_MAX) || dblIn > FLT_MAX ) 2716 { 2717 return DISP_E_OVERFLOW; 2718 } 2719 2720 *pfltOut = (FLOAT) dblIn; 2721 2722 return S_OK; 2723 } 2724 2725 /****************************************************************************** 2726 * VarR4FromDate [OLEAUT32.73] 2727 2727 */ 2728 2728 HRESULT WINAPI VarR4FromDate(DATE dateIn, FLOAT* pfltOut) 2729 2729 { 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 } 2743 2744 /****************************************************************************** 2745 * VarR4FromBool[OLEAUT32.76]2730 TRACE("( %f, %p ), stub\n", dateIn, pfltOut ); 2731 2732 /* Check range of value. 2733 */ 2734 if( dateIn < -(FLT_MAX) || dateIn > FLT_MAX ) 2735 { 2736 return DISP_E_OVERFLOW; 2737 } 2738 2739 *pfltOut = (FLOAT) dateIn; 2740 2741 return S_OK; 2742 } 2743 2744 /****************************************************************************** 2745 * VarR4FromBool [OLEAUT32.76] 2746 2746 */ 2747 2747 HRESULT WINAPI VarR4FromBool(VARIANT_BOOL boolIn, FLOAT* pfltOut) 2748 2748 { 2749 2750 2751 2752 2753 2754 } 2755 2756 /****************************************************************************** 2757 * VarR4FromI1[OLEAUT32.213]2749 TRACE("( %d, %p ), stub\n", boolIn, pfltOut ); 2750 2751 *pfltOut = (FLOAT) boolIn; 2752 2753 return S_OK; 2754 } 2755 2756 /****************************************************************************** 2757 * VarR4FromI1 [OLEAUT32.213] 2758 2758 */ 2759 2759 HRESULT WINAPI VarR4FromI1(CHAR cIn, FLOAT* pfltOut) 2760 2760 { 2761 2762 2763 2764 2765 2766 } 2767 2768 /****************************************************************************** 2769 * VarR4FromUI2[OLEAUT32.214]2761 TRACE("( %c, %p ), stub\n", cIn, pfltOut ); 2762 2763 *pfltOut = (FLOAT) cIn; 2764 2765 return S_OK; 2766 } 2767 2768 /****************************************************************************** 2769 * VarR4FromUI2 [OLEAUT32.214] 2770 2770 */ 2771 2771 HRESULT WINAPI VarR4FromUI2(USHORT uiIn, FLOAT* pfltOut) 2772 2772 { 2773 2774 2775 2776 2777 2778 } 2779 2780 /****************************************************************************** 2781 * VarR4FromUI4[OLEAUT32.215]2773 TRACE("( %d, %p ), stub\n", uiIn, pfltOut ); 2774 2775 *pfltOut = (FLOAT) uiIn; 2776 2777 return S_OK; 2778 } 2779 2780 /****************************************************************************** 2781 * VarR4FromUI4 [OLEAUT32.215] 2782 2782 */ 2783 2783 HRESULT WINAPI VarR4FromUI4(ULONG ulIn, FLOAT* pfltOut) 2784 2784 { 2785 2786 2787 2788 2789 2790 } 2791 2792 /****************************************************************************** 2793 * VarR4FromStr[OLEAUT32.74]2785 TRACE("( %ld, %p ), stub\n", ulIn, pfltOut ); 2786 2787 *pfltOut = (FLOAT) ulIn; 2788 2789 return S_OK; 2790 } 2791 2792 /****************************************************************************** 2793 * VarR4FromStr [OLEAUT32.74] 2794 2794 */ 2795 2795 HRESULT WINAPI VarR4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, FLOAT* pfltOut) 2796 2796 { 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2797 double dValue = 0.0; 2798 LPSTR pNewString = NULL; 2799 2800 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pfltOut ); 2801 2802 /* Check if we have a valid argument 2803 */ 2804 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 2805 RemoveCharacterFromString( pNewString, "," ); 2806 if( IsValidRealString( pNewString ) == FALSE ) 2807 { 2808 return DISP_E_TYPEMISMATCH; 2809 } 2810 2811 /* Convert the valid string to a floating point number. 2812 */ 2813 dValue = atof( pNewString ); 2814 2815 /* We don't need the string anymore so free it. 2816 */ 2817 HeapFree( GetProcessHeap(), 0, pNewString ); 2818 2819 /* Check range of value. 2820 */ 2821 if( dValue < -(FLT_MAX) || dValue > FLT_MAX ) 2822 { 2823 return DISP_E_OVERFLOW; 2824 } 2825 2826 *pfltOut = (FLOAT) dValue; 2827 2828 return S_OK; 2829 2829 } 2830 2830 … … 2835 2835 HRESULT WINAPI VarR4FromCy(CY cyIn, FLOAT* pfltOut) { 2836 2836 *pfltOut = (FLOAT)((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 2837 2837 2838 2838 return S_OK; 2839 2839 } 2840 2840 2841 2841 /****************************************************************************** 2842 * VarR8FromUI1[OLEAUT32.78]2842 * VarR8FromUI1 [OLEAUT32.78] 2843 2843 */ 2844 2844 HRESULT WINAPI VarR8FromUI1(BYTE bIn, double* pdblOut) 2845 2845 { 2846 2847 2848 2849 2850 2851 } 2852 2853 /****************************************************************************** 2854 * VarR8FromI2[OLEAUT32.79]2846 TRACE("( %d, %p ), stub\n", bIn, pdblOut ); 2847 2848 *pdblOut = (double) bIn; 2849 2850 return S_OK; 2851 } 2852 2853 /****************************************************************************** 2854 * VarR8FromI2 [OLEAUT32.79] 2855 2855 */ 2856 2856 HRESULT WINAPI VarR8FromI2(short sIn, double* pdblOut) 2857 2857 { 2858 2859 2860 2861 2862 2863 } 2864 2865 /****************************************************************************** 2866 * VarR8FromI4[OLEAUT32.80]2858 TRACE("( %d, %p ), stub\n", sIn, pdblOut ); 2859 2860 *pdblOut = (double) sIn; 2861 2862 return S_OK; 2863 } 2864 2865 /****************************************************************************** 2866 * VarR8FromI4 [OLEAUT32.80] 2867 2867 */ 2868 2868 HRESULT WINAPI VarR8FromI4(LONG lIn, double* pdblOut) 2869 2869 { 2870 2871 2872 2873 2874 2875 } 2876 2877 /****************************************************************************** 2878 * VarR8FromR4[OLEAUT32.81]2870 TRACE("( %ld, %p ), stub\n", lIn, pdblOut ); 2871 2872 *pdblOut = (double) lIn; 2873 2874 return S_OK; 2875 } 2876 2877 /****************************************************************************** 2878 * VarR8FromR4 [OLEAUT32.81] 2879 2879 */ 2880 2880 HRESULT WINAPI VarR8FromR4(FLOAT fltIn, double* pdblOut) 2881 2881 { 2882 2883 2884 2885 2886 2887 } 2888 2889 /****************************************************************************** 2890 * VarR8FromDate[OLEAUT32.83]2882 TRACE("( %f, %p ), stub\n", fltIn, pdblOut ); 2883 2884 *pdblOut = (double) fltIn; 2885 2886 return S_OK; 2887 } 2888 2889 /****************************************************************************** 2890 * VarR8FromDate [OLEAUT32.83] 2891 2891 */ 2892 2892 HRESULT WINAPI VarR8FromDate(DATE dateIn, double* pdblOut) 2893 2893 { 2894 2895 2896 2897 2898 2899 } 2900 2901 /****************************************************************************** 2902 * VarR8FromBool[OLEAUT32.86]2894 TRACE("( %f, %p ), stub\n", dateIn, pdblOut ); 2895 2896 *pdblOut = (double) dateIn; 2897 2898 return S_OK; 2899 } 2900 2901 /****************************************************************************** 2902 * VarR8FromBool [OLEAUT32.86] 2903 2903 */ 2904 2904 HRESULT WINAPI VarR8FromBool(VARIANT_BOOL boolIn, double* pdblOut) 2905 2905 { 2906 2907 2908 2909 2910 2911 } 2912 2913 /****************************************************************************** 2914 * VarR8FromI1[OLEAUT32.217]2906 TRACE("( %d, %p ), stub\n", boolIn, pdblOut ); 2907 2908 *pdblOut = (double) boolIn; 2909 2910 return S_OK; 2911 } 2912 2913 /****************************************************************************** 2914 * VarR8FromI1 [OLEAUT32.217] 2915 2915 */ 2916 2916 HRESULT WINAPI VarR8FromI1(CHAR cIn, double* pdblOut) 2917 2917 { 2918 2919 2920 2921 2922 2923 } 2924 2925 /****************************************************************************** 2926 * VarR8FromUI2[OLEAUT32.218]2918 TRACE("( %c, %p ), stub\n", cIn, pdblOut ); 2919 2920 *pdblOut = (double) cIn; 2921 2922 return S_OK; 2923 } 2924 2925 /****************************************************************************** 2926 * VarR8FromUI2 [OLEAUT32.218] 2927 2927 */ 2928 2928 HRESULT WINAPI VarR8FromUI2(USHORT uiIn, double* pdblOut) 2929 2929 { 2930 2931 2932 2933 2934 2935 } 2936 2937 /****************************************************************************** 2938 * VarR8FromUI4[OLEAUT32.219]2930 TRACE("( %d, %p ), stub\n", uiIn, pdblOut ); 2931 2932 *pdblOut = (double) uiIn; 2933 2934 return S_OK; 2935 } 2936 2937 /****************************************************************************** 2938 * VarR8FromUI4 [OLEAUT32.219] 2939 2939 */ 2940 2940 HRESULT WINAPI VarR8FromUI4(ULONG ulIn, double* pdblOut) 2941 2941 { 2942 2943 2944 2945 2946 2947 } 2948 2949 /****************************************************************************** 2950 * VarR8FromStr[OLEAUT32.84]2942 TRACE("( %ld, %p ), stub\n", ulIn, pdblOut ); 2943 2944 *pdblOut = (double) ulIn; 2945 2946 return S_OK; 2947 } 2948 2949 /****************************************************************************** 2950 * VarR8FromStr [OLEAUT32.84] 2951 2951 */ 2952 2952 HRESULT WINAPI VarR8FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, double* pdblOut) 2953 2953 { 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2954 double dValue = 0.0; 2955 LPSTR pNewString = NULL; 2956 2957 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pdblOut ); 2958 2959 /* Check if we have a valid argument 2960 */ 2961 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 2962 RemoveCharacterFromString( pNewString, "," ); 2963 if( IsValidRealString( pNewString ) == FALSE ) 2964 { 2965 return DISP_E_TYPEMISMATCH; 2966 } 2967 2968 /* Convert the valid string to a floating point number. 2969 */ 2970 dValue = atof( pNewString ); 2971 2972 /* We don't need the string anymore so free it. 2973 */ 2974 HeapFree( GetProcessHeap(), 0, pNewString ); 2975 2976 *pdblOut = dValue; 2977 2978 return S_OK; 2979 2979 } 2980 2980 … … 2985 2985 HRESULT WINAPI VarR8FromCy(CY cyIn, double* pdblOut) { 2986 2986 *pdblOut = (double)((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 2987 2987 2988 2988 return S_OK; 2989 2989 } 2990 2990 2991 2991 /****************************************************************************** 2992 * VarDateFromUI1[OLEAUT32.88]2992 * VarDateFromUI1 [OLEAUT32.88] 2993 2993 */ 2994 2994 HRESULT WINAPI VarDateFromUI1(BYTE bIn, DATE* pdateOut) 2995 2995 { 2996 2997 2998 2999 3000 3001 } 3002 3003 /****************************************************************************** 3004 * VarDateFromI2[OLEAUT32.89]2996 TRACE("( %d, %p ), stub\n", bIn, pdateOut ); 2997 2998 *pdateOut = (DATE) bIn; 2999 3000 return S_OK; 3001 } 3002 3003 /****************************************************************************** 3004 * VarDateFromI2 [OLEAUT32.89] 3005 3005 */ 3006 3006 HRESULT WINAPI VarDateFromI2(short sIn, DATE* pdateOut) 3007 3007 { 3008 3009 3010 3011 3012 3013 } 3014 3015 /****************************************************************************** 3016 * VarDateFromI4[OLEAUT32.90]3008 TRACE("( %d, %p ), stub\n", sIn, pdateOut ); 3009 3010 *pdateOut = (DATE) sIn; 3011 3012 return S_OK; 3013 } 3014 3015 /****************************************************************************** 3016 * VarDateFromI4 [OLEAUT32.90] 3017 3017 */ 3018 3018 HRESULT WINAPI VarDateFromI4(LONG lIn, DATE* pdateOut) 3019 3019 { 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 } 3031 3032 /****************************************************************************** 3033 * VarDateFromR4[OLEAUT32.91]3020 TRACE("( %ld, %p ), stub\n", lIn, pdateOut ); 3021 3022 if( lIn < DATE_MIN || lIn > DATE_MAX ) 3023 { 3024 return DISP_E_OVERFLOW; 3025 } 3026 3027 *pdateOut = (DATE) lIn; 3028 3029 return S_OK; 3030 } 3031 3032 /****************************************************************************** 3033 * VarDateFromR4 [OLEAUT32.91] 3034 3034 */ 3035 3035 HRESULT WINAPI VarDateFromR4(FLOAT fltIn, DATE* pdateOut) … … 3038 3038 3039 3039 if( ceil(fltIn) < DATE_MIN || floor(fltIn) > DATE_MAX ) 3040 3041 3042 3043 3044 3045 3046 3047 } 3048 3049 /****************************************************************************** 3050 * VarDateFromR8[OLEAUT32.92]3040 { 3041 return DISP_E_OVERFLOW; 3042 } 3043 3044 *pdateOut = (DATE) fltIn; 3045 3046 return S_OK; 3047 } 3048 3049 /****************************************************************************** 3050 * VarDateFromR8 [OLEAUT32.92] 3051 3051 */ 3052 3052 HRESULT WINAPI VarDateFromR8(double dblIn, DATE* pdateOut) … … 3054 3054 TRACE("( %f, %p ), stub\n", dblIn, pdateOut ); 3055 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 } 3065 3066 /****************************************************************************** 3067 * VarDateFromStr[OLEAUT32.94]3056 if( ceil(dblIn) < DATE_MIN || floor(dblIn) > DATE_MAX ) 3057 { 3058 return DISP_E_OVERFLOW; 3059 } 3060 3061 *pdateOut = (DATE) dblIn; 3062 3063 return S_OK; 3064 } 3065 3066 /****************************************************************************** 3067 * VarDateFromStr [OLEAUT32.94] 3068 3068 * The string representing the date is composed of two parts, a date and time. 3069 3069 * … … 3074 3074 * 3075 3075 * The formats for the date part are has follows: 3076 * mm/[dd/][yy]yy 3076 * mm/[dd/][yy]yy 3077 3077 * [dd/]mm/[yy]yy 3078 * [yy]yy/mm/dd 3078 * [yy]yy/mm/dd 3079 3079 * January dd[,] [yy]yy 3080 3080 * dd January [yy]yy … … 3083 3083 * 3084 3084 * The formats for the date and time string are has follows. 3085 * date[whitespace][time] 3085 * date[whitespace][time] 3086 3086 * [time][whitespace]date 3087 3087 * … … 3111 3111 3112 3112 3113 3114 } 3115 3116 /****************************************************************************** 3117 * VarDateFromI1[OLEAUT32.221]3113 return ret; 3114 } 3115 3116 /****************************************************************************** 3117 * VarDateFromI1 [OLEAUT32.221] 3118 3118 */ 3119 3119 HRESULT WINAPI VarDateFromI1(CHAR cIn, DATE* pdateOut) 3120 3120 { 3121 3122 3123 3124 3125 3126 } 3127 3128 /****************************************************************************** 3129 * VarDateFromUI2[OLEAUT32.222]3121 TRACE("( %c, %p ), stub\n", cIn, pdateOut ); 3122 3123 *pdateOut = (DATE) cIn; 3124 3125 return S_OK; 3126 } 3127 3128 /****************************************************************************** 3129 * VarDateFromUI2 [OLEAUT32.222] 3130 3130 */ 3131 3131 HRESULT WINAPI VarDateFromUI2(USHORT uiIn, DATE* pdateOut) 3132 3132 { 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 } 3144 3145 /****************************************************************************** 3146 * VarDateFromUI4[OLEAUT32.223]3133 TRACE("( %d, %p ), stub\n", uiIn, pdateOut ); 3134 3135 if( uiIn > DATE_MAX ) 3136 { 3137 return DISP_E_OVERFLOW; 3138 } 3139 3140 *pdateOut = (DATE) uiIn; 3141 3142 return S_OK; 3143 } 3144 3145 /****************************************************************************** 3146 * VarDateFromUI4 [OLEAUT32.223] 3147 3147 */ 3148 3148 HRESULT WINAPI VarDateFromUI4(ULONG ulIn, DATE* pdateOut) 3149 3149 { 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 } 3161 3162 /****************************************************************************** 3163 * VarDateFromBool[OLEAUT32.96]3150 TRACE("( %ld, %p ), stub\n", ulIn, pdateOut ); 3151 3152 if( ulIn < DATE_MIN || ulIn > DATE_MAX ) 3153 { 3154 return DISP_E_OVERFLOW; 3155 } 3156 3157 *pdateOut = (DATE) ulIn; 3158 3159 return S_OK; 3160 } 3161 3162 /****************************************************************************** 3163 * VarDateFromBool [OLEAUT32.96] 3164 3164 */ 3165 3165 HRESULT WINAPI VarDateFromBool(VARIANT_BOOL boolIn, DATE* pdateOut) 3166 3166 { 3167 3168 3169 3170 3171 3167 TRACE("( %d, %p ), stub\n", boolIn, pdateOut ); 3168 3169 *pdateOut = (DATE) boolIn; 3170 3171 return S_OK; 3172 3172 } 3173 3173 … … 3184 3184 3185 3185 /****************************************************************************** 3186 * VarBstrFromUI1[OLEAUT32.108]3186 * VarBstrFromUI1 [OLEAUT32.108] 3187 3187 */ 3188 3188 HRESULT WINAPI VarBstrFromUI1(BYTE bVal, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3189 3189 { 3190 3191 3192 3193 3194 3195 3196 } 3197 3198 /****************************************************************************** 3199 * VarBstrFromI2[OLEAUT32.109]3190 TRACE("( %d, %ld, %ld, %p ), stub\n", bVal, lcid, dwFlags, pbstrOut ); 3191 sprintf( pBuffer, "%d", bVal ); 3192 3193 *pbstrOut = StringDupAtoBstr( pBuffer ); 3194 3195 return S_OK; 3196 } 3197 3198 /****************************************************************************** 3199 * VarBstrFromI2 [OLEAUT32.109] 3200 3200 */ 3201 3201 HRESULT WINAPI VarBstrFromI2(short iVal, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3202 3202 { 3203 3204 3205 3206 3207 3208 } 3209 3210 /****************************************************************************** 3211 * VarBstrFromI4[OLEAUT32.110]3203 TRACE("( %d, %ld, %ld, %p ), stub\n", iVal, lcid, dwFlags, pbstrOut ); 3204 sprintf( pBuffer, "%d", iVal ); 3205 *pbstrOut = StringDupAtoBstr( pBuffer ); 3206 3207 return S_OK; 3208 } 3209 3210 /****************************************************************************** 3211 * VarBstrFromI4 [OLEAUT32.110] 3212 3212 */ 3213 3213 HRESULT WINAPI VarBstrFromI4(LONG lIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3214 3214 { 3215 3216 3217 3218 3219 3220 3221 } 3222 3223 /****************************************************************************** 3224 * VarBstrFromR4[OLEAUT32.111]3215 TRACE("( %ld, %ld, %ld, %p ), stub\n", lIn, lcid, dwFlags, pbstrOut ); 3216 3217 sprintf( pBuffer, "%ld", lIn ); 3218 *pbstrOut = StringDupAtoBstr( pBuffer ); 3219 3220 return S_OK; 3221 } 3222 3223 /****************************************************************************** 3224 * VarBstrFromR4 [OLEAUT32.111] 3225 3225 */ 3226 3226 HRESULT WINAPI VarBstrFromR4(FLOAT fltIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3227 3227 { 3228 3229 3230 3231 3232 3233 3234 } 3235 3236 /****************************************************************************** 3237 * VarBstrFromR8[OLEAUT32.112]3228 TRACE("( %f, %ld, %ld, %p ), stub\n", fltIn, lcid, dwFlags, pbstrOut ); 3229 3230 sprintf( pBuffer, "%.7g", fltIn ); 3231 *pbstrOut = StringDupAtoBstr( pBuffer ); 3232 3233 return S_OK; 3234 } 3235 3236 /****************************************************************************** 3237 * VarBstrFromR8 [OLEAUT32.112] 3238 3238 */ 3239 3239 HRESULT WINAPI VarBstrFromR8(double dblIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3240 3240 { 3241 3242 3243 3244 3245 3246 3241 TRACE("( %f, %ld, %ld, %p ), stub\n", dblIn, lcid, dwFlags, pbstrOut ); 3242 3243 sprintf( pBuffer, "%.15g", dblIn ); 3244 *pbstrOut = StringDupAtoBstr( pBuffer ); 3245 3246 return S_OK; 3247 3247 } 3248 3248 … … 3251 3251 */ 3252 3252 HRESULT WINAPI VarBstrFromCy(CY cyIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut) { 3253 3254 3255 } 3256 3257 3258 /****************************************************************************** 3259 * VarBstrFromDate[OLEAUT32.114]3253 /* FIXME */ 3254 return E_NOTIMPL; 3255 } 3256 3257 3258 /****************************************************************************** 3259 * VarBstrFromDate [OLEAUT32.114] 3260 3260 * 3261 3261 * The date is implemented using an 8 byte floating-point number. … … 3274 3274 * The tm structure is as follows: 3275 3275 * struct tm { 3276 * int tm_sec;seconds after the minute - [0,59]3277 * int tm_min;minutes after the hour - [0,59]3278 * int tm_hour;hours since midnight - [0,23]3279 * int tm_mday;day of the month - [1,31]3280 * int tm_mon;months since January - [0,11]3281 * int tm_year;years3282 * int tm_wday;days since Sunday - [0,6]3283 * int tm_yday;days since January 1 - [0,365]3284 * 3285 * 3276 * int tm_sec; seconds after the minute - [0,59] 3277 * int tm_min; minutes after the hour - [0,59] 3278 * int tm_hour; hours since midnight - [0,23] 3279 * int tm_mday; day of the month - [1,31] 3280 * int tm_mon; months since January - [0,11] 3281 * int tm_year; years 3282 * int tm_wday; days since Sunday - [0,6] 3283 * int tm_yday; days since January 1 - [0,365] 3284 * int tm_isdst; daylight savings time flag 3285 * }; 3286 3286 */ 3287 3287 HRESULT WINAPI VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) … … 3293 3293 3294 3294 if( DateToTm( dateIn, dwFlags, &TM ) == FALSE ) 3295 3295 { 3296 3296 return E_INVALIDARG; 3297 3297 } 3298 3298 3299 3299 if( dwFlags & VAR_DATEVALUEONLY ) 3300 3300 strftime( pBuffer, BUFFER_MAX, "%x", &TM ); 3301 3301 else if( dwFlags & VAR_TIMEVALUEONLY ) 3302 3303 3302 strftime( pBuffer, BUFFER_MAX, "%X", &TM ); 3303 else 3304 3304 strftime( pBuffer, BUFFER_MAX, "%x %X", &TM ); 3305 3305 3306 3307 3308 3309 } 3310 3311 /****************************************************************************** 3312 * VarBstrFromBool[OLEAUT32.116]3306 *pbstrOut = StringDupAtoBstr( pBuffer ); 3307 3308 return S_OK; 3309 } 3310 3311 /****************************************************************************** 3312 * VarBstrFromBool [OLEAUT32.116] 3313 3313 */ 3314 3314 HRESULT WINAPI VarBstrFromBool(VARIANT_BOOL boolIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3315 3315 { 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 } 3331 3332 /****************************************************************************** 3333 * VarBstrFromI1[OLEAUT32.229]3316 TRACE("( %d, %ld, %ld, %p ), stub\n", boolIn, lcid, dwFlags, pbstrOut ); 3317 3318 if( boolIn == VARIANT_FALSE ) 3319 { 3320 sprintf( pBuffer, "False" ); 3321 } 3322 else 3323 { 3324 sprintf( pBuffer, "True" ); 3325 } 3326 3327 *pbstrOut = StringDupAtoBstr( pBuffer ); 3328 3329 return S_OK; 3330 } 3331 3332 /****************************************************************************** 3333 * VarBstrFromI1 [OLEAUT32.229] 3334 3334 */ 3335 3335 HRESULT WINAPI VarBstrFromI1(CHAR cIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3336 3336 { 3337 3338 3339 3340 3341 3342 } 3343 3344 /****************************************************************************** 3345 * VarBstrFromUI2[OLEAUT32.230]3337 TRACE("( %c, %ld, %ld, %p ), stub\n", cIn, lcid, dwFlags, pbstrOut ); 3338 sprintf( pBuffer, "%d", cIn ); 3339 *pbstrOut = StringDupAtoBstr( pBuffer ); 3340 3341 return S_OK; 3342 } 3343 3344 /****************************************************************************** 3345 * VarBstrFromUI2 [OLEAUT32.230] 3346 3346 */ 3347 3347 HRESULT WINAPI VarBstrFromUI2(USHORT uiIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3348 3348 { 3349 3350 3351 3352 3353 3354 } 3355 3356 /****************************************************************************** 3357 * VarBstrFromUI4[OLEAUT32.231]3349 TRACE("( %d, %ld, %ld, %p ), stub\n", uiIn, lcid, dwFlags, pbstrOut ); 3350 sprintf( pBuffer, "%d", uiIn ); 3351 *pbstrOut = StringDupAtoBstr( pBuffer ); 3352 3353 return S_OK; 3354 } 3355 3356 /****************************************************************************** 3357 * VarBstrFromUI4 [OLEAUT32.231] 3358 3358 */ 3359 3359 HRESULT WINAPI VarBstrFromUI4(ULONG ulIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3360 3360 { 3361 3362 3363 3364 3365 3366 } 3367 3368 /****************************************************************************** 3369 * VarBoolFromUI1[OLEAUT32.118]3361 TRACE("( %ld, %ld, %ld, %p ), stub\n", ulIn, lcid, dwFlags, pbstrOut ); 3362 sprintf( pBuffer, "%ld", ulIn ); 3363 *pbstrOut = StringDupAtoBstr( pBuffer ); 3364 3365 return S_OK; 3366 } 3367 3368 /****************************************************************************** 3369 * VarBoolFromUI1 [OLEAUT32.118] 3370 3370 */ 3371 3371 HRESULT WINAPI VarBoolFromUI1(BYTE bIn, VARIANT_BOOL* pboolOut) 3372 3372 { 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 } 3386 3387 /****************************************************************************** 3388 * VarBoolFromI2[OLEAUT32.119]3373 TRACE("( %d, %p ), stub\n", bIn, pboolOut ); 3374 3375 if( bIn == 0 ) 3376 { 3377 *pboolOut = VARIANT_FALSE; 3378 } 3379 else 3380 { 3381 *pboolOut = VARIANT_TRUE; 3382 } 3383 3384 return S_OK; 3385 } 3386 3387 /****************************************************************************** 3388 * VarBoolFromI2 [OLEAUT32.119] 3389 3389 */ 3390 3390 HRESULT WINAPI VarBoolFromI2(short sIn, VARIANT_BOOL* pboolOut) 3391 3391 { 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 } 3405 3406 /****************************************************************************** 3407 * VarBoolFromI4[OLEAUT32.120]3392 TRACE("( %d, %p ), stub\n", sIn, pboolOut ); 3393 3394 if( sIn == 0 ) 3395 { 3396 *pboolOut = VARIANT_FALSE; 3397 } 3398 else 3399 { 3400 *pboolOut = VARIANT_TRUE; 3401 } 3402 3403 return S_OK; 3404 } 3405 3406 /****************************************************************************** 3407 * VarBoolFromI4 [OLEAUT32.120] 3408 3408 */ 3409 3409 HRESULT WINAPI VarBoolFromI4(LONG lIn, VARIANT_BOOL* pboolOut) 3410 3410 { 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 } 3424 3425 /****************************************************************************** 3426 * VarBoolFromR4[OLEAUT32.121]3411 TRACE("( %ld, %p ), stub\n", lIn, pboolOut ); 3412 3413 if( lIn == 0 ) 3414 { 3415 *pboolOut = VARIANT_FALSE; 3416 } 3417 else 3418 { 3419 *pboolOut = VARIANT_TRUE; 3420 } 3421 3422 return S_OK; 3423 } 3424 3425 /****************************************************************************** 3426 * VarBoolFromR4 [OLEAUT32.121] 3427 3427 */ 3428 3428 HRESULT WINAPI VarBoolFromR4(FLOAT fltIn, VARIANT_BOOL* pboolOut) 3429 3429 { 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 } 3443 3444 /****************************************************************************** 3445 * VarBoolFromR8[OLEAUT32.122]3430 TRACE("( %f, %p ), stub\n", fltIn, pboolOut ); 3431 3432 if( fltIn == 0.0 ) 3433 { 3434 *pboolOut = VARIANT_FALSE; 3435 } 3436 else 3437 { 3438 *pboolOut = VARIANT_TRUE; 3439 } 3440 3441 return S_OK; 3442 } 3443 3444 /****************************************************************************** 3445 * VarBoolFromR8 [OLEAUT32.122] 3446 3446 */ 3447 3447 HRESULT WINAPI VarBoolFromR8(double dblIn, VARIANT_BOOL* pboolOut) 3448 3448 { 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 } 3462 3463 /****************************************************************************** 3464 * VarBoolFromDate[OLEAUT32.123]3449 TRACE("( %f, %p ), stub\n", dblIn, pboolOut ); 3450 3451 if( dblIn == 0.0 ) 3452 { 3453 *pboolOut = VARIANT_FALSE; 3454 } 3455 else 3456 { 3457 *pboolOut = VARIANT_TRUE; 3458 } 3459 3460 return S_OK; 3461 } 3462 3463 /****************************************************************************** 3464 * VarBoolFromDate [OLEAUT32.123] 3465 3465 */ 3466 3466 HRESULT WINAPI VarBoolFromDate(DATE dateIn, VARIANT_BOOL* pboolOut) 3467 3467 { 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 } 3481 3482 /****************************************************************************** 3483 * VarBoolFromStr[OLEAUT32.125]3468 TRACE("( %f, %p ), stub\n", dateIn, pboolOut ); 3469 3470 if( dateIn == 0.0 ) 3471 { 3472 *pboolOut = VARIANT_FALSE; 3473 } 3474 else 3475 { 3476 *pboolOut = VARIANT_TRUE; 3477 } 3478 3479 return S_OK; 3480 } 3481 3482 /****************************************************************************** 3483 * VarBoolFromStr [OLEAUT32.125] 3484 3484 */ 3485 3485 HRESULT WINAPI VarBoolFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, VARIANT_BOOL* pboolOut) 3486 3486 { 3487 3488 3489 3490 3487 HRESULT ret = S_OK; 3488 char* pNewString = NULL; 3489 3490 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pboolOut ); 3491 3491 3492 3492 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 3493 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 } 3534 3535 /****************************************************************************** 3536 * VarBoolFromI1[OLEAUT32.233]3494 if( pNewString == NULL || strlen( pNewString ) == 0 ) 3495 { 3496 ret = DISP_E_TYPEMISMATCH; 3497 } 3498 3499 if( ret == S_OK ) 3500 { 3501 if( strncasecmp( pNewString, "True", strlen( pNewString ) ) == 0 ) 3502 { 3503 *pboolOut = VARIANT_TRUE; 3504 } 3505 else if( strncasecmp( pNewString, "False", strlen( pNewString ) ) == 0 ) 3506 { 3507 *pboolOut = VARIANT_FALSE; 3508 } 3509 else 3510 { 3511 /* Try converting the string to a floating point number. 3512 */ 3513 double dValue = 0.0; 3514 HRESULT res = VarR8FromStr( strIn, lcid, dwFlags, &dValue ); 3515 if( res != S_OK ) 3516 { 3517 ret = DISP_E_TYPEMISMATCH; 3518 } 3519 else if( dValue == 0.0 ) 3520 { 3521 *pboolOut = VARIANT_FALSE; 3522 } 3523 else 3524 { 3525 *pboolOut = VARIANT_TRUE; 3526 } 3527 } 3528 } 3529 3530 HeapFree( GetProcessHeap(), 0, pNewString ); 3531 3532 return ret; 3533 } 3534 3535 /****************************************************************************** 3536 * VarBoolFromI1 [OLEAUT32.233] 3537 3537 */ 3538 3538 HRESULT WINAPI VarBoolFromI1(CHAR cIn, VARIANT_BOOL* pboolOut) 3539 3539 { 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 } 3553 3554 /****************************************************************************** 3555 * VarBoolFromUI2[OLEAUT32.234]3540 TRACE("( %c, %p ), stub\n", cIn, pboolOut ); 3541 3542 if( cIn == 0 ) 3543 { 3544 *pboolOut = VARIANT_FALSE; 3545 } 3546 else 3547 { 3548 *pboolOut = VARIANT_TRUE; 3549 } 3550 3551 return S_OK; 3552 } 3553 3554 /****************************************************************************** 3555 * VarBoolFromUI2 [OLEAUT32.234] 3556 3556 */ 3557 3557 HRESULT WINAPI VarBoolFromUI2(USHORT uiIn, VARIANT_BOOL* pboolOut) 3558 3558 { 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 } 3572 3573 /****************************************************************************** 3574 * VarBoolFromUI4[OLEAUT32.235]3559 TRACE("( %d, %p ), stub\n", uiIn, pboolOut ); 3560 3561 if( uiIn == 0 ) 3562 { 3563 *pboolOut = VARIANT_FALSE; 3564 } 3565 else 3566 { 3567 *pboolOut = VARIANT_TRUE; 3568 } 3569 3570 return S_OK; 3571 } 3572 3573 /****************************************************************************** 3574 * VarBoolFromUI4 [OLEAUT32.235] 3575 3575 */ 3576 3576 HRESULT WINAPI VarBoolFromUI4(ULONG ulIn, VARIANT_BOOL* pboolOut) 3577 3577 { 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3578 TRACE("( %ld, %p ), stub\n", ulIn, pboolOut ); 3579 3580 if( ulIn == 0 ) 3581 { 3582 *pboolOut = VARIANT_FALSE; 3583 } 3584 else 3585 { 3586 *pboolOut = VARIANT_TRUE; 3587 } 3588 3589 return S_OK; 3590 3590 } 3591 3591 … … 3597 3597 if (cyIn.s.Hi || cyIn.s.Lo) *pboolOut = -1; 3598 3598 else *pboolOut = 0; 3599 3599 3600 3600 return S_OK; 3601 3601 } 3602 3602 3603 3603 /****************************************************************************** 3604 * VarI1FromUI1[OLEAUT32.244]3604 * VarI1FromUI1 [OLEAUT32.244] 3605 3605 */ 3606 3606 HRESULT WINAPI VarI1FromUI1(BYTE bIn, CHAR* pcOut) 3607 3607 { 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 } 3621 3622 /****************************************************************************** 3623 * VarI1FromI2[OLEAUT32.245]3608 TRACE("( %d, %p ), stub\n", bIn, pcOut ); 3609 3610 /* Check range of value. 3611 */ 3612 if( bIn > CHAR_MAX ) 3613 { 3614 return DISP_E_OVERFLOW; 3615 } 3616 3617 *pcOut = (CHAR) bIn; 3618 3619 return S_OK; 3620 } 3621 3622 /****************************************************************************** 3623 * VarI1FromI2 [OLEAUT32.245] 3624 3624 */ 3625 3625 HRESULT WINAPI VarI1FromI2(short uiIn, CHAR* pcOut) 3626 3626 { 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 } 3638 3639 /****************************************************************************** 3640 * VarI1FromI4[OLEAUT32.246]3627 TRACE("( %d, %p ), stub\n", uiIn, pcOut ); 3628 3629 if( uiIn > CHAR_MAX ) 3630 { 3631 return DISP_E_OVERFLOW; 3632 } 3633 3634 *pcOut = (CHAR) uiIn; 3635 3636 return S_OK; 3637 } 3638 3639 /****************************************************************************** 3640 * VarI1FromI4 [OLEAUT32.246] 3641 3641 */ 3642 3642 HRESULT WINAPI VarI1FromI4(LONG lIn, CHAR* pcOut) 3643 3643 { 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 } 3655 3656 /****************************************************************************** 3657 * VarI1FromR4[OLEAUT32.247]3644 TRACE("( %ld, %p ), stub\n", lIn, pcOut ); 3645 3646 if( lIn < CHAR_MIN || lIn > CHAR_MAX ) 3647 { 3648 return DISP_E_OVERFLOW; 3649 } 3650 3651 *pcOut = (CHAR) lIn; 3652 3653 return S_OK; 3654 } 3655 3656 /****************************************************************************** 3657 * VarI1FromR4 [OLEAUT32.247] 3658 3658 */ 3659 3659 HRESULT WINAPI VarI1FromR4(FLOAT fltIn, CHAR* pcOut) 3660 3660 { 3661 3661 TRACE("( %f, %p ), stub\n", fltIn, pcOut ); 3662 3662 3663 3663 fltIn = round( fltIn ); 3664 3665 3666 3667 3668 3669 3670 3671 3672 } 3673 3674 /****************************************************************************** 3675 * VarI1FromR8[OLEAUT32.248]3664 if( fltIn < CHAR_MIN || fltIn > CHAR_MAX ) 3665 { 3666 return DISP_E_OVERFLOW; 3667 } 3668 3669 *pcOut = (CHAR) fltIn; 3670 3671 return S_OK; 3672 } 3673 3674 /****************************************************************************** 3675 * VarI1FromR8 [OLEAUT32.248] 3676 3676 */ 3677 3677 HRESULT WINAPI VarI1FromR8(double dblIn, CHAR* pcOut) 3678 3678 { 3679 3679 TRACE("( %f, %p ), stub\n", dblIn, pcOut ); 3680 3680 3681 3681 dblIn = round( dblIn ); 3682 3682 if( dblIn < CHAR_MIN || dblIn > CHAR_MAX ) 3683 3684 3685 3686 3687 3688 3689 3690 } 3691 3692 /****************************************************************************** 3693 * VarI1FromDate[OLEAUT32.249]3683 { 3684 return DISP_E_OVERFLOW; 3685 } 3686 3687 *pcOut = (CHAR) dblIn; 3688 3689 return S_OK; 3690 } 3691 3692 /****************************************************************************** 3693 * VarI1FromDate [OLEAUT32.249] 3694 3694 */ 3695 3695 HRESULT WINAPI VarI1FromDate(DATE dateIn, CHAR* pcOut) 3696 3696 { 3697 3697 TRACE("( %f, %p ), stub\n", dateIn, pcOut ); 3698 3698 3699 3699 dateIn = round( dateIn ); 3700 3701 3702 3703 3704 3705 3706 3707 3708 } 3709 3710 /****************************************************************************** 3711 * VarI1FromStr[OLEAUT32.251]3700 if( dateIn < CHAR_MIN || dateIn > CHAR_MAX ) 3701 { 3702 return DISP_E_OVERFLOW; 3703 } 3704 3705 *pcOut = (CHAR) dateIn; 3706 3707 return S_OK; 3708 } 3709 3710 /****************************************************************************** 3711 * VarI1FromStr [OLEAUT32.251] 3712 3712 */ 3713 3713 HRESULT WINAPI VarI1FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, CHAR* pcOut) 3714 3714 { 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3715 double dValue = 0.0; 3716 LPSTR pNewString = NULL; 3717 3718 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pcOut ); 3719 3720 /* Check if we have a valid argument 3721 */ 3722 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 3723 RemoveCharacterFromString( pNewString, "," ); 3724 if( IsValidRealString( pNewString ) == FALSE ) 3725 { 3726 return DISP_E_TYPEMISMATCH; 3727 } 3728 3729 /* Convert the valid string to a floating point number. 3730 */ 3731 dValue = atof( pNewString ); 3732 3733 /* We don't need the string anymore so free it. 3734 */ 3735 HeapFree( GetProcessHeap(), 0, pNewString ); 3736 3737 /* Check range of value. 3738 3738 */ 3739 3739 dValue = round( dValue ); 3740 3741 3742 3743 3744 3745 3746 3747 3748 } 3749 3750 /****************************************************************************** 3751 * VarI1FromBool[OLEAUT32.253]3740 if( dValue < CHAR_MIN || dValue > CHAR_MAX ) 3741 { 3742 return DISP_E_OVERFLOW; 3743 } 3744 3745 *pcOut = (CHAR) dValue; 3746 3747 return S_OK; 3748 } 3749 3750 /****************************************************************************** 3751 * VarI1FromBool [OLEAUT32.253] 3752 3752 */ 3753 3753 HRESULT WINAPI VarI1FromBool(VARIANT_BOOL boolIn, CHAR* pcOut) 3754 3754 { 3755 3756 3757 3758 3759 3760 } 3761 3762 /****************************************************************************** 3763 * VarI1FromUI2[OLEAUT32.254]3755 TRACE("( %d, %p ), stub\n", boolIn, pcOut ); 3756 3757 *pcOut = (CHAR) boolIn; 3758 3759 return S_OK; 3760 } 3761 3762 /****************************************************************************** 3763 * VarI1FromUI2 [OLEAUT32.254] 3764 3764 */ 3765 3765 HRESULT WINAPI VarI1FromUI2(USHORT uiIn, CHAR* pcOut) 3766 3766 { 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 } 3778 3779 /****************************************************************************** 3780 * VarI1FromUI4[OLEAUT32.255]3767 TRACE("( %d, %p ), stub\n", uiIn, pcOut ); 3768 3769 if( uiIn > CHAR_MAX ) 3770 { 3771 return DISP_E_OVERFLOW; 3772 } 3773 3774 *pcOut = (CHAR) uiIn; 3775 3776 return S_OK; 3777 } 3778 3779 /****************************************************************************** 3780 * VarI1FromUI4 [OLEAUT32.255] 3781 3781 */ 3782 3782 HRESULT WINAPI VarI1FromUI4(ULONG ulIn, CHAR* pcOut) 3783 3783 { 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3784 TRACE("( %ld, %p ), stub\n", ulIn, pcOut ); 3785 3786 if( ulIn > CHAR_MAX ) 3787 { 3788 return DISP_E_OVERFLOW; 3789 } 3790 3791 *pcOut = (CHAR) ulIn; 3792 3793 return S_OK; 3794 3794 } 3795 3795 … … 3800 3800 HRESULT WINAPI VarI1FromCy(CY cyIn, CHAR* pcOut) { 3801 3801 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 3802 3802 3803 3803 if (t > CHAR_MAX || t < CHAR_MIN) return DISP_E_OVERFLOW; 3804 3804 3805 3805 *pcOut = (CHAR)t; 3806 3806 return S_OK; … … 3808 3808 3809 3809 /****************************************************************************** 3810 * VarUI2FromUI1[OLEAUT32.257]3810 * VarUI2FromUI1 [OLEAUT32.257] 3811 3811 */ 3812 3812 HRESULT WINAPI VarUI2FromUI1(BYTE bIn, USHORT* puiOut) 3813 3813 { 3814 3815 3816 3817 3818 3819 } 3820 3821 /****************************************************************************** 3822 * VarUI2FromI2[OLEAUT32.258]3814 TRACE("( %d, %p ), stub\n", bIn, puiOut ); 3815 3816 *puiOut = (USHORT) bIn; 3817 3818 return S_OK; 3819 } 3820 3821 /****************************************************************************** 3822 * VarUI2FromI2 [OLEAUT32.258] 3823 3823 */ 3824 3824 HRESULT WINAPI VarUI2FromI2(short uiIn, USHORT* puiOut) 3825 3825 { 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 } 3837 3838 /****************************************************************************** 3839 * VarUI2FromI4[OLEAUT32.259]3826 TRACE("( %d, %p ), stub\n", uiIn, puiOut ); 3827 3828 if( uiIn < UI2_MIN ) 3829 { 3830 return DISP_E_OVERFLOW; 3831 } 3832 3833 *puiOut = (USHORT) uiIn; 3834 3835 return S_OK; 3836 } 3837 3838 /****************************************************************************** 3839 * VarUI2FromI4 [OLEAUT32.259] 3840 3840 */ 3841 3841 HRESULT WINAPI VarUI2FromI4(LONG lIn, USHORT* puiOut) 3842 3842 { 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 } 3854 3855 /****************************************************************************** 3856 * VarUI2FromR4[OLEAUT32.260]3843 TRACE("( %ld, %p ), stub\n", lIn, puiOut ); 3844 3845 if( lIn < UI2_MIN || lIn > UI2_MAX ) 3846 { 3847 return DISP_E_OVERFLOW; 3848 } 3849 3850 *puiOut = (USHORT) lIn; 3851 3852 return S_OK; 3853 } 3854 3855 /****************************************************************************** 3856 * VarUI2FromR4 [OLEAUT32.260] 3857 3857 */ 3858 3858 HRESULT WINAPI VarUI2FromR4(FLOAT fltIn, USHORT* puiOut) 3859 3859 { 3860 3860 TRACE("( %f, %p ), stub\n", fltIn, puiOut ); 3861 3861 3862 3862 fltIn = round( fltIn ); 3863 3864 3865 3866 3867 3868 3869 3870 3871 } 3872 3873 /****************************************************************************** 3874 * VarUI2FromR8[OLEAUT32.261]3863 if( fltIn < UI2_MIN || fltIn > UI2_MAX ) 3864 { 3865 return DISP_E_OVERFLOW; 3866 } 3867 3868 *puiOut = (USHORT) fltIn; 3869 3870 return S_OK; 3871 } 3872 3873 /****************************************************************************** 3874 * VarUI2FromR8 [OLEAUT32.261] 3875 3875 */ 3876 3876 HRESULT WINAPI VarUI2FromR8(double dblIn, USHORT* puiOut) 3877 3877 { 3878 3878 TRACE("( %f, %p ), stub\n", dblIn, puiOut ); 3879 3879 3880 3880 dblIn = round( dblIn ); 3881 3881 if( dblIn < UI2_MIN || dblIn > UI2_MAX ) 3882 3883 3884 3885 3886 3887 3888 3889 } 3890 3891 /****************************************************************************** 3892 * VarUI2FromDate[OLEAUT32.262]3882 { 3883 return DISP_E_OVERFLOW; 3884 } 3885 3886 *puiOut = (USHORT) dblIn; 3887 3888 return S_OK; 3889 } 3890 3891 /****************************************************************************** 3892 * VarUI2FromDate [OLEAUT32.262] 3893 3893 */ 3894 3894 HRESULT WINAPI VarUI2FromDate(DATE dateIn, USHORT* puiOut) 3895 3895 { 3896 3896 TRACE("( %f, %p ), stub\n", dateIn, puiOut ); 3897 3897 3898 3898 dateIn = round( dateIn ); 3899 3900 3901 3902 3903 3904 3905 3906 3907 } 3908 3909 /****************************************************************************** 3910 * VarUI2FromStr[OLEAUT32.264]3899 if( dateIn < UI2_MIN || dateIn > UI2_MAX ) 3900 { 3901 return DISP_E_OVERFLOW; 3902 } 3903 3904 *puiOut = (USHORT) dateIn; 3905 3906 return S_OK; 3907 } 3908 3909 /****************************************************************************** 3910 * VarUI2FromStr [OLEAUT32.264] 3911 3911 */ 3912 3912 HRESULT WINAPI VarUI2FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, USHORT* puiOut) 3913 3913 { 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3914 double dValue = 0.0; 3915 LPSTR pNewString = NULL; 3916 3917 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, puiOut ); 3918 3919 /* Check if we have a valid argument 3920 */ 3921 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 3922 RemoveCharacterFromString( pNewString, "," ); 3923 if( IsValidRealString( pNewString ) == FALSE ) 3924 { 3925 return DISP_E_TYPEMISMATCH; 3926 } 3927 3928 /* Convert the valid string to a floating point number. 3929 */ 3930 dValue = atof( pNewString ); 3931 3932 /* We don't need the string anymore so free it. 3933 */ 3934 HeapFree( GetProcessHeap(), 0, pNewString ); 3935 3936 /* Check range of value. 3937 3937 */ 3938 3938 dValue = round( dValue ); 3939 3940 3941 3942 3943 3944 3945 3946 3947 } 3948 3949 /****************************************************************************** 3950 * VarUI2FromBool[OLEAUT32.266]3939 if( dValue < UI2_MIN || dValue > UI2_MAX ) 3940 { 3941 return DISP_E_OVERFLOW; 3942 } 3943 3944 *puiOut = (USHORT) dValue; 3945 3946 return S_OK; 3947 } 3948 3949 /****************************************************************************** 3950 * VarUI2FromBool [OLEAUT32.266] 3951 3951 */ 3952 3952 HRESULT WINAPI VarUI2FromBool(VARIANT_BOOL boolIn, USHORT* puiOut) 3953 3953 { 3954 3955 3956 3957 3958 3959 } 3960 3961 /****************************************************************************** 3962 * VarUI2FromI1[OLEAUT32.267]3954 TRACE("( %d, %p ), stub\n", boolIn, puiOut ); 3955 3956 *puiOut = (USHORT) boolIn; 3957 3958 return S_OK; 3959 } 3960 3961 /****************************************************************************** 3962 * VarUI2FromI1 [OLEAUT32.267] 3963 3963 */ 3964 3964 HRESULT WINAPI VarUI2FromI1(CHAR cIn, USHORT* puiOut) 3965 3965 { 3966 3967 3968 3969 3970 3971 } 3972 3973 /****************************************************************************** 3974 * VarUI2FromUI4[OLEAUT32.268]3966 TRACE("( %c, %p ), stub\n", cIn, puiOut ); 3967 3968 *puiOut = (USHORT) cIn; 3969 3970 return S_OK; 3971 } 3972 3973 /****************************************************************************** 3974 * VarUI2FromUI4 [OLEAUT32.268] 3975 3975 */ 3976 3976 HRESULT WINAPI VarUI2FromUI4(ULONG ulIn, USHORT* puiOut) 3977 3977 { 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 } 3989 3990 /****************************************************************************** 3991 * VarUI4FromStr[OLEAUT32.277]3978 TRACE("( %ld, %p ), stub\n", ulIn, puiOut ); 3979 3980 if( ulIn < UI2_MIN || ulIn > UI2_MAX ) 3981 { 3982 return DISP_E_OVERFLOW; 3983 } 3984 3985 *puiOut = (USHORT) ulIn; 3986 3987 return S_OK; 3988 } 3989 3990 /****************************************************************************** 3991 * VarUI4FromStr [OLEAUT32.277] 3992 3992 */ 3993 3993 HRESULT WINAPI VarUI4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, ULONG* pulOut) 3994 3994 { 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 3995 double dValue = 0.0; 3996 LPSTR pNewString = NULL; 3997 3998 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pulOut ); 3999 4000 /* Check if we have a valid argument 4001 */ 4002 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 4003 RemoveCharacterFromString( pNewString, "," ); 4004 if( IsValidRealString( pNewString ) == FALSE ) 4005 { 4006 return DISP_E_TYPEMISMATCH; 4007 } 4008 4009 /* Convert the valid string to a floating point number. 4010 */ 4011 dValue = atof( pNewString ); 4012 4013 /* We don't need the string anymore so free it. 4014 */ 4015 HeapFree( GetProcessHeap(), 0, pNewString ); 4016 4017 /* Check range of value. 4018 4018 */ 4019 4019 dValue = round( dValue ); 4020 4021 4022 4023 4024 4025 4026 4027 4020 if( dValue < UI4_MIN || dValue > UI4_MAX ) 4021 { 4022 return DISP_E_OVERFLOW; 4023 } 4024 4025 *pulOut = (ULONG) dValue; 4026 4027 return S_OK; 4028 4028 } 4029 4029 … … 4034 4034 HRESULT WINAPI VarUI2FromCy(CY cyIn, USHORT* pusOut) { 4035 4035 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 4036 4036 4037 4037 if (t > UI2_MAX || t < UI2_MIN) return DISP_E_OVERFLOW; 4038 4038 4039 4039 *pusOut = (USHORT)t; 4040 4040 4041 4041 return S_OK; 4042 4042 } 4043 4043 4044 4044 /****************************************************************************** 4045 * VarUI4FromUI1[OLEAUT32.270]4045 * VarUI4FromUI1 [OLEAUT32.270] 4046 4046 */ 4047 4047 HRESULT WINAPI VarUI4FromUI1(BYTE bIn, ULONG* pulOut) 4048 4048 { 4049 4050 4051 4052 4053 4054 } 4055 4056 /****************************************************************************** 4057 * VarUI4FromI2[OLEAUT32.271]4049 TRACE("( %d, %p ), stub\n", bIn, pulOut ); 4050 4051 *pulOut = (USHORT) bIn; 4052 4053 return S_OK; 4054 } 4055 4056 /****************************************************************************** 4057 * VarUI4FromI2 [OLEAUT32.271] 4058 4058 */ 4059 4059 HRESULT WINAPI VarUI4FromI2(short uiIn, ULONG* pulOut) 4060 4060 { 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 } 4072 4073 /****************************************************************************** 4074 * VarUI4FromI4[OLEAUT32.272]4061 TRACE("( %d, %p ), stub\n", uiIn, pulOut ); 4062 4063 if( uiIn < UI4_MIN ) 4064 { 4065 return DISP_E_OVERFLOW; 4066 } 4067 4068 *pulOut = (ULONG) uiIn; 4069 4070 return S_OK; 4071 } 4072 4073 /****************************************************************************** 4074 * VarUI4FromI4 [OLEAUT32.272] 4075 4075 */ 4076 4076 HRESULT WINAPI VarUI4FromI4(LONG lIn, ULONG* pulOut) 4077 4077 { 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 } 4089 4090 /****************************************************************************** 4091 * VarUI4FromR4[OLEAUT32.273]4078 TRACE("( %ld, %p ), stub\n", lIn, pulOut ); 4079 4080 if( lIn < UI4_MIN ) 4081 { 4082 return DISP_E_OVERFLOW; 4083 } 4084 4085 *pulOut = (ULONG) lIn; 4086 4087 return S_OK; 4088 } 4089 4090 /****************************************************************************** 4091 * VarUI4FromR4 [OLEAUT32.273] 4092 4092 */ 4093 4093 HRESULT WINAPI VarUI4FromR4(FLOAT fltIn, ULONG* pulOut) … … 4095 4095 fltIn = round( fltIn ); 4096 4096 if( fltIn < UI4_MIN || fltIn > UI4_MAX ) 4097 { 4098 return DISP_E_OVERFLOW; 4097 { 4098 return DISP_E_OVERFLOW; 4099 } 4100 4101 *pulOut = (ULONG) fltIn; 4102 4103 return S_OK; 4104 } 4105 4106 /****************************************************************************** 4107 * VarUI4FromR8 [OLEAUT32.274] 4108 */ 4109 HRESULT WINAPI VarUI4FromR8(double dblIn, ULONG* pulOut) 4110 { 4111 TRACE("( %f, %p ), stub\n", dblIn, pulOut ); 4112 4113 dblIn = round( dblIn ); 4114 if( dblIn < UI4_MIN || dblIn > UI4_MAX ) 4115 { 4116 return DISP_E_OVERFLOW; 4099 4117 } 4100 4118 4101 *pulOut = (ULONG) fltIn; 4102 4103 return S_OK; 4104 } 4105 4106 /****************************************************************************** 4107 * VarUI4FromR8 [OLEAUT32.274] 4108 */ 4109 HRESULT WINAPI VarUI4FromR8(double dblIn, ULONG* pulOut) 4110 { 4111 TRACE("( %f, %p ), stub\n", dblIn, pulOut ); 4112 4113 dblIn = round( dblIn ); 4114 if( dblIn < UI4_MIN || dblIn > UI4_MAX ) 4115 { 4116 return DISP_E_OVERFLOW; 4117 } 4118 4119 *pulOut = (ULONG) dblIn; 4120 4121 return S_OK; 4122 } 4123 4124 /****************************************************************************** 4125 * VarUI4FromDate [OLEAUT32.275] 4119 *pulOut = (ULONG) dblIn; 4120 4121 return S_OK; 4122 } 4123 4124 /****************************************************************************** 4125 * VarUI4FromDate [OLEAUT32.275] 4126 4126 */ 4127 4127 HRESULT WINAPI VarUI4FromDate(DATE dateIn, ULONG* pulOut) 4128 4128 { 4129 4129 TRACE("( %f, %p ), stub\n", dateIn, pulOut ); 4130 4130 4131 4131 dateIn = round( dateIn ); 4132 4132 if( dateIn < UI4_MIN || dateIn > UI4_MAX ) 4133 4134 4135 4136 4137 4138 4139 4140 } 4141 4142 /****************************************************************************** 4143 * VarUI4FromBool[OLEAUT32.279]4133 { 4134 return DISP_E_OVERFLOW; 4135 } 4136 4137 *pulOut = (ULONG) dateIn; 4138 4139 return S_OK; 4140 } 4141 4142 /****************************************************************************** 4143 * VarUI4FromBool [OLEAUT32.279] 4144 4144 */ 4145 4145 HRESULT WINAPI VarUI4FromBool(VARIANT_BOOL boolIn, ULONG* pulOut) 4146 4146 { 4147 4148 4149 4150 4151 4152 } 4153 4154 /****************************************************************************** 4155 * VarUI4FromI1[OLEAUT32.280]4147 TRACE("( %d, %p ), stub\n", boolIn, pulOut ); 4148 4149 *pulOut = (ULONG) boolIn; 4150 4151 return S_OK; 4152 } 4153 4154 /****************************************************************************** 4155 * VarUI4FromI1 [OLEAUT32.280] 4156 4156 */ 4157 4157 HRESULT WINAPI VarUI4FromI1(CHAR cIn, ULONG* pulOut) 4158 4158 { 4159 4160 4161 4162 4163 4164 } 4165 4166 /****************************************************************************** 4167 * VarUI4FromUI2[OLEAUT32.281]4159 TRACE("( %c, %p ), stub\n", cIn, pulOut ); 4160 4161 *pulOut = (ULONG) cIn; 4162 4163 return S_OK; 4164 } 4165 4166 /****************************************************************************** 4167 * VarUI4FromUI2 [OLEAUT32.281] 4168 4168 */ 4169 4169 HRESULT WINAPI VarUI4FromUI2(USHORT uiIn, ULONG* pulOut) 4170 4170 { 4171 4172 4173 4174 4175 4171 TRACE("( %d, %p ), stub\n", uiIn, pulOut ); 4172 4173 *pulOut = (ULONG) uiIn; 4174 4175 return S_OK; 4176 4176 } 4177 4177 … … 4182 4182 HRESULT WINAPI VarUI4FromCy(CY cyIn, ULONG* pulOut) { 4183 4183 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 4184 4184 4185 4185 if (t > UI4_MAX || t < UI4_MIN) return DISP_E_OVERFLOW; 4186 4186 … … 4197 4197 pcyOut->s.Hi = 0; 4198 4198 pcyOut->s.Lo = ((ULONG)bIn) * 10000; 4199 4199 4200 4200 return S_OK; 4201 4201 } … … 4209 4209 else pcyOut->s.Hi = 0; 4210 4210 pcyOut->s.Lo = ((ULONG)sIn) * 10000; 4211 4211 4212 4212 return S_OK; 4213 4213 } … … 4222 4222 pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0); 4223 4223 if (lIn < 0) pcyOut->s.Hi--; 4224 4224 4225 4225 return S_OK; 4226 4226 } … … 4235 4235 pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0); 4236 4236 if (fltIn < 0) pcyOut->s.Hi--; 4237 4237 4238 4238 return S_OK; 4239 4239 } … … 4269 4269 */ 4270 4270 HRESULT WINAPI VarCyFromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, CY *pcyOut) { 4271 4272 4273 } 4274 4275 4271 /* FIXME */ 4272 return E_NOTIMPL; 4273 } 4274 4275 4276 4276 /********************************************************************** 4277 4277 * VarCyFromBool [OLEAUT32.106] … … 4282 4282 else pcyOut->s.Hi = 0; 4283 4283 pcyOut->s.Lo = (ULONG)boolIn * (ULONG)10000; 4284 4284 4285 4285 return S_OK; 4286 4286 } … … 4294 4294 else pcyOut->s.Hi = 0; 4295 4295 pcyOut->s.Lo = (ULONG)cIn * (ULONG)10000; 4296 4296 4297 4297 return S_OK; 4298 4298 } … … 4305 4305 pcyOut->s.Hi = 0; 4306 4306 pcyOut->s.Lo = (ULONG)usIn * (ULONG)10000; 4307 4307 4308 4308 return S_OK; 4309 4309 } … … 4317 4317 pcyOut->s.Hi = (LONG)(t / (double)4294967296.0); 4318 4318 pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0); 4319 4319 4320 4320 return S_OK; 4321 4321 } … … 4333 4333 4334 4334 TRACE("( 0x%x, 0x%x, 0x%p ), stub\n", wDosDate, wDosTime, pvtime ); 4335 4335 4336 4336 t.tm_sec = (wDosTime & 0x001f) * 2; 4337 4337 t.tm_min = (wDosTime & 0x07e0) >> 5; 4338 4338 t.tm_hour = (wDosTime & 0xf800) >> 11; 4339 4339 4340 4340 t.tm_mday = (wDosDate & 0x001f); 4341 4341 t.tm_mon = (wDosDate & 0x01e0) >> 5; … … 4363 4363 cDig = 0; 4364 4364 for (i=0; strIn[i] ;i++) { 4365 if ((strIn[i]>='0') && (strIn[i]<='9')) { 4366 if (pnumprs->cDig > cDig) { 4367 *(rgbDig++)=strIn[i]-'0'; 4368 cDig++; 4369 lastent = i; 4370 } 4365 if ((strIn[i]>='0') && (strIn[i]<='9')) { 4366 if (pnumprs->cDig > cDig) { 4367 *(rgbDig++)=strIn[i]-'0'; 4368 cDig++; 4369 lastent = i; 4370 } 4371 } 4371 4372 } 4372 } 4373 pnumprs->cDig = cDig; 4373 pnumprs->cDig = cDig; 4374 4374 4375 4375 /* FIXME: Just patching some values in */ 4376 pnumprs->nPwr10 4377 pnumprs->nBaseShift 4378 pnumprs->cchUsed 4379 pnumprs->dwOutFlags 4376 pnumprs->nPwr10 = 0; 4377 pnumprs->nBaseShift = 0; 4378 pnumprs->cchUsed = lastent; 4379 pnumprs->dwOutFlags = NUMPRS_DECIMAL; 4380 4380 return S_OK; 4381 4381 } … … 4394 4394 xint = 0; 4395 4395 for (i=0;i<pnumprs->cDig;i++) 4396 4396 xint = xint*10 + rgbDig[i]; 4397 4397 4398 4398 VariantInit(pvar); 4399 4399 if (dwVtBits & VTBIT_I4) { 4400 4401 4402 4400 V_VT(pvar) = VT_I4; 4401 V_UNION(pvar,intVal) = xint; 4402 return S_OK; 4403 4403 } 4404 4404 if (dwVtBits & VTBIT_R8) { 4405 4406 4407 4405 V_VT(pvar) = VT_R8; 4406 V_UNION(pvar,dblVal) = xint; 4407 return S_OK; 4408 4408 } else { 4409 4410 4409 FIXME("vtbitmask is unsupported %lx\n",dwVtBits); 4410 return E_FAIL; 4411 4411 } 4412 4412 } … … 4659 4659 * VarBstrCmp [OLEAUT32.440] 4660 4660 * 4661 * flags can be: 4661 * flags can be: 4662 4662 * NORM_IGNORECASE, NORM_IGNORENONSPACE, NORM_IGNORESYMBOLS 4663 4663 * NORM_IGNORESTRINGWIDTH, NORM_IGNOREKANATYPE, NORM_IGNOREKASHIDA
Note:
See TracChangeset
for help on using the changeset viewer.