Changeset 6648 for trunk/src/oleaut32
- Timestamp:
- Sep 5, 2001, 3:19:02 PM (24 years ago)
- Location:
- trunk/src/oleaut32
- Files:
-
- 11 edited
-
connpt.c (modified) (30 diffs)
-
dispatch.c (modified) (4 diffs)
-
initterm.cpp (modified) (5 diffs)
-
ole2disp.c (modified) (21 diffs)
-
oleaut.c (modified) (7 diffs)
-
olefont.c (modified) (58 diffs)
-
olepicture.c (modified) (51 diffs)
-
parsedt.c (modified) (19 diffs)
-
safearray.c (modified) (68 diffs)
-
typelib.c (modified) (171 diffs)
-
variant.c (modified) (68 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/oleaut32/connpt.c
r4837 r6648 1 /* $Id: connpt.c,v 1.2 2001-09-05 13:18:59 bird Exp $ */ 1 2 /* 2 3 * Implementation of a generic ConnectionPoint object. … … 72 73 CONNECTDATA *pCD; 73 74 DWORD nConns; 74 75 75 76 /* Next connection to enumerate from */ 76 77 DWORD nCur; … … 79 80 80 81 static EnumConnectionsImpl *EnumConnectionsImpl_Construct(IUnknown *pUnk, 81 DWORD nSinks,82 CONNECTDATA *pCD);82 DWORD nSinks, 83 CONNECTDATA *pCD); 83 84 84 85 … … 87 88 */ 88 89 static ConnectionPointImpl *ConnectionPointImpl_Construct(IUnknown *pUnk, 89 REFIID riid)90 REFIID riid) 90 91 { 91 92 ConnectionPointImpl *Obj; … … 97 98 Obj->iid = *riid; 98 99 Obj->maxSinks = MAXSINKS; 99 Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 100 sizeof(IUnknown*) * MAXSINKS);100 Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 101 sizeof(IUnknown*) * MAXSINKS); 101 102 Obj->nSinks = 0; 102 103 return Obj; … … 139 140 if ( (This==0) || (ppvObject==0) ) 140 141 return E_INVALIDARG; 141 142 142 143 /* 143 144 * Initialize the return parameter. 144 145 */ 145 146 *ppvObject = 0; 146 147 147 148 /* 148 149 * Compare the riid with the interface IDs implemented by this object. 149 150 */ 150 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 151 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 151 152 { 152 153 *ppvObject = (IConnectionPoint*)This; 153 154 } 154 else if (memcmp(&IID_IConnectionPoint, riid, sizeof(IID_IConnectionPoint)) == 0) 155 else if (memcmp(&IID_IConnectionPoint, riid, sizeof(IID_IConnectionPoint)) == 0) 155 156 { 156 157 *ppvObject = (IConnectionPoint*)This; 157 158 } 158 159 159 160 /* 160 161 * Check that we obtained an interface. … … 165 166 return E_NOINTERFACE; 166 167 } 167 168 168 169 /* 169 170 * Query Interface always increases the reference count by one when it is … … 189 190 return This->ref; 190 191 } 191 192 192 193 /************************************************************************ 193 194 * ConnectionPointImpl_Release (IUnknown) … … 195 196 * See Windows documentation for more details on IUnknown methods. 196 197 */ 197 static ULONG WINAPI ConnectionPointImpl_Release( 198 static ULONG WINAPI ConnectionPointImpl_Release( 198 199 IConnectionPoint* iface) 199 200 { … … 215 216 return 0; 216 217 } 217 218 218 219 return This->ref; 219 220 } … … 224 225 */ 225 226 static HRESULT WINAPI ConnectionPointImpl_GetConnectionInterface( 226 IConnectionPoint *iface,227 IID *piid)227 IConnectionPoint *iface, 228 IID *piid) 228 229 { 229 230 ICOM_THIS(ConnectionPointImpl, iface); … … 238 239 */ 239 240 static HRESULT WINAPI ConnectionPointImpl_GetConnectionPointContainer( 240 IConnectionPoint *iface,241 IConnectionPointContainer **ppCPC)241 IConnectionPoint *iface, 242 IConnectionPointContainer **ppCPC) 242 243 { 243 244 ICOM_THIS(ConnectionPointImpl, iface); … … 245 246 246 247 return IUnknown_QueryInterface(This->Obj, 247 &IID_IConnectionPointContainer,248 (LPVOID)ppCPC);248 &IID_IConnectionPointContainer, 249 (LPVOID)ppCPC); 249 250 } 250 251 … … 254 255 */ 255 256 static HRESULT WINAPI ConnectionPointImpl_Advise(IConnectionPoint *iface, 256 IUnknown *lpUnk,257 DWORD *pdwCookie)257 IUnknown *lpUnk, 258 DWORD *pdwCookie) 258 259 { 259 260 DWORD i; … … 273 274 This->maxSinks += MAXSINKS; 274 275 This->sinks = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->sinks, 275 This->maxSinks * sizeof(IUnknown *));276 This->maxSinks * sizeof(IUnknown *)); 276 277 } 277 278 This->sinks[i] = lpSink; … … 287 288 */ 288 289 static HRESULT WINAPI ConnectionPointImpl_Unadvise(IConnectionPoint *iface, 289 DWORD dwCookie)290 DWORD dwCookie) 290 291 { 291 292 ICOM_THIS(ConnectionPointImpl, iface); … … 307 308 */ 308 309 static HRESULT WINAPI ConnectionPointImpl_EnumConnections( 309 IConnectionPoint *iface,310 LPENUMCONNECTIONS *ppEnum)311 { 310 IConnectionPoint *iface, 311 LPENUMCONNECTIONS *ppEnum) 312 { 312 313 ICOM_THIS(ConnectionPointImpl, iface); 313 314 CONNECTDATA *pCD; … … 317 318 318 319 TRACE("(%p)->(%p)\n", This, ppEnum); 319 320 320 321 *ppEnum = NULL; 321 322 … … 339 340 EnumObj = EnumConnectionsImpl_Construct((IUnknown*)This, This->nSinks, pCD); 340 341 hr = IEnumConnections_QueryInterface((IEnumConnections*)EnumObj, 341 &IID_IEnumConnections, (LPVOID)ppEnum);342 &IID_IEnumConnections, (LPVOID)ppEnum); 342 343 IEnumConnections_Release((IEnumConnections*)EnumObj); 343 344 … … 367 368 */ 368 369 static EnumConnectionsImpl *EnumConnectionsImpl_Construct(IUnknown *pUnk, 369 DWORD nSinks,370 CONNECTDATA *pCD)370 DWORD nSinks, 371 CONNECTDATA *pCD) 371 372 { 372 373 EnumConnectionsImpl *Obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*Obj)); … … 420 421 if ( (This==0) || (ppvObject==0) ) 421 422 return E_INVALIDARG; 422 423 423 424 /* 424 425 * Initialize the return parameter. 425 426 */ 426 427 *ppvObject = 0; 427 428 428 429 /* 429 430 * Compare the riid with the interface IDs implemented by this object. 430 431 */ 431 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 432 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 432 433 { 433 434 *ppvObject = (IEnumConnections*)This; 434 435 } 435 else if (memcmp(&IID_IEnumConnections, riid, sizeof(IID_IEnumConnections)) == 0) 436 else if (memcmp(&IID_IEnumConnections, riid, sizeof(IID_IEnumConnections)) == 0) 436 437 { 437 438 *ppvObject = (IEnumConnections*)This; 438 439 } 439 440 440 441 /* 441 442 * Check that we obtained an interface. … … 446 447 return E_NOINTERFACE; 447 448 } 448 449 449 450 /* 450 451 * Query Interface always increases the reference count by one when it is … … 470 471 return This->ref; 471 472 } 472 473 473 474 /************************************************************************ 474 475 * EnumConnectionsImpl_Release (IUnknown) … … 497 498 return 0; 498 499 } 499 500 500 501 return This->ref; 501 502 } … … 506 507 */ 507 508 static HRESULT WINAPI EnumConnectionsImpl_Next(IEnumConnections* iface, 508 ULONG cConn, LPCONNECTDATA pCD,509 ULONG *pEnum)509 ULONG cConn, LPCONNECTDATA pCD, 510 ULONG *pEnum) 510 511 { 511 512 ICOM_THIS(EnumConnectionsImpl, iface); … … 542 543 */ 543 544 static HRESULT WINAPI EnumConnectionsImpl_Skip(IEnumConnections* iface, 544 ULONG cSkip)545 ULONG cSkip) 545 546 { 546 547 ICOM_THIS(EnumConnectionsImpl, iface); … … 576 577 */ 577 578 static HRESULT WINAPI EnumConnectionsImpl_Clone(IEnumConnections* iface, 578 LPENUMCONNECTIONS *ppEnum)579 LPENUMCONNECTIONS *ppEnum) 579 580 { 580 581 ICOM_THIS(EnumConnectionsImpl, iface); 581 582 EnumConnectionsImpl *newObj; 582 583 TRACE("(%p)->(%p)\n", This, ppEnum); 583 584 584 585 newObj = EnumConnectionsImpl_Construct(This->pUnk, This->nConns, This->pCD); 585 586 newObj->nCur = This->nCur; … … 588 589 return S_OK; 589 590 } 590 591 591 592 static ICOM_VTABLE(IEnumConnections) EnumConnectionsImpl_VTable = 592 593 { … … 616 617 */ 617 618 HRESULT CreateConnectionPoint(IUnknown *pUnk, REFIID riid, 618 IConnectionPoint **pCP)619 IConnectionPoint **pCP) 619 620 { 620 621 ConnectionPointImpl *Obj; … … 624 625 if(!Obj) return E_OUTOFMEMORY; 625 626 626 hr = IConnectionPoint_QueryInterface((IConnectionPoint *)Obj, 627 &IID_IConnectionPoint, (LPVOID)pCP);627 hr = IConnectionPoint_QueryInterface((IConnectionPoint *)Obj, 628 &IID_IConnectionPoint, (LPVOID)pCP); 628 629 IConnectionPoint_Release((IConnectionPoint *)Obj); 629 630 return hr; -
trunk/src/oleaut32/dispatch.c
r4837 r6648 1 /* $Id: dispatch.c,v 1.2 2001-09-05 13:19:00 bird Exp $ */ 1 2 /** 2 3 * Dispatch API functions … … 37 38 * 38 39 * NOTES 39 * - Defermethod invocation to ITypeInfo::Invoke()40 * - Defer method invocation to ITypeInfo::Invoke() 40 41 * 41 42 * RETURNS 42 43 * 43 * S_OK on success.44 * S_OK on success. 44 45 */ 45 46 HRESULT WINAPI … … 76 77 * DispGetIDsOfNames (OLEAUT32.29) 77 78 * 78 * Convert a set of names to dispids, based on information 79 * Convert a set of names to dispids, based on information 79 80 * contained in object's type library. 80 * 81 * 81 82 * NOTES 82 * - Defers to ITypeInfo::GetIDsOfNames()83 * - Defers to ITypeInfo::GetIDsOfNames() 83 84 * 84 85 * RETURNS 85 86 * 86 * S_OK on success.87 * S_OK on success. 87 88 */ 88 89 HRESULT WINAPI … … 109 110 * 110 111 * NOTES 111 * Coercion is done using system (0) locale.112 * Coercion is done using system (0) locale. 112 113 * 113 114 * RETURNS 114 115 * 115 * S_OK on success.116 * S_OK on success. 116 117 */ 117 118 HRESULT WINAPI DispGetParam(DISPPARAMS* pdispparams, UINT position, -
trunk/src/oleaut32/initterm.cpp
r5135 r6648 1 /* $Id: initterm.cpp,v 1.10 2001-09-05 13:19:00 bird Exp $ */ 1 2 /* 2 3 * DLL entry point … … 59 60 { 60 61 case DLL_PROCESS_ATTACH: 61 return TRUE;62 return TRUE; 62 63 63 64 case DLL_THREAD_ATTACH: 64 65 case DLL_THREAD_DETACH: 65 return TRUE;66 return TRUE; 66 67 67 68 case DLL_PROCESS_DETACH: 68 ctordtorTerm();69 ClosePrivateLogFiles();70 return TRUE;69 ctordtorTerm(); 70 ClosePrivateLogFiles(); 71 return TRUE; 71 72 } 72 73 return FALSE; … … 95 96 case 0 : 96 97 { 97 loadNr = globLoadNr++;98 loadNr = globLoadNr++; 98 99 99 DosQueryModuleName(hModule, sizeof(oleaut32Path), oleaut32Path);100 char *endofpath = strrchr(oleaut32Path, '\\');101 *(endofpath+1) = 0;100 DosQueryModuleName(hModule, sizeof(oleaut32Path), oleaut32Path); 101 char *endofpath = strrchr(oleaut32Path, '\\'); 102 *(endofpath+1) = 0; 102 103 103 104 ctordtorInit(); … … 105 106 CheckVersionFromHMOD(PE2LX_VERSION, hModule); /*PLF Wed 98-03-18 05:28:48*/ 106 107 107 dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab);108 if(dllHandle == 0) 109 return 0UL;108 dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab); 109 if(dllHandle == 0) 110 return 0UL; 110 111 111 112 #ifdef DEFAULT_LOGGING_OFF 112 if(getenv("WIN32LOG_ENABLED")) {113 if(getenv("WIN32LOG_ENABLED")) { 113 114 #else 114 if(!getenv("NOWIN32LOG")) {115 if(!getenv("NOWIN32LOG")) { 115 116 #endif 116 OpenPrivateLogFiles();117 }117 OpenPrivateLogFiles(); 118 } 118 119 Hash_Initialise(); 119 120 … … 122 123 case 1 : 123 124 if(dllHandle) { 124 UnregisterLxDll(dllHandle);125 UnregisterLxDll(dllHandle); 125 126 } 126 127 break; -
trunk/src/oleaut32/ole2disp.c
r4837 r6648 1 /* $Id: ole2disp.c,v 1.2 2001-09-05 13:19:00 bird Exp $ */ 1 2 /* 2 * OLE2DISP library3 * OLE2DISP library 3 4 * 4 * Copyright 1995Martin von Loewis5 * Copyright 1995 Martin von Loewis 5 6 */ 6 7 #ifdef __WIN32OS2__ … … 31 32 32 33 /****************************************************************************** 33 * BSTR_AllocBytes[Internal]34 * BSTR_AllocBytes [Internal] 34 35 */ 35 36 static BSTR16 BSTR_AllocBytes(int n) … … 56 57 57 58 /****************************************************************************** 58 * SysAllocString16[OLE2DISP.2]59 * SysAllocString16 [OLE2DISP.2] 59 60 */ 60 61 BSTR16 WINAPI SysAllocString16(LPCOLESTR16 in) 61 62 { 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]63 BSTR16 out; 64 65 if (!in) return 0; 66 67 out = BSTR_AllocBytes(strlen(in)+1); 68 if(!out)return 0; 69 strcpy(BSTR_GetAddr(out),in); 70 return out; 71 } 72 #endif 73 74 /****************************************************************************** 75 * SysAllocString [OLEAUT32.2] 75 76 */ 76 77 BSTR WINAPI SysAllocString(LPCOLESTR in) 77 78 { 78 79 if (!in) return 0; 79 80 80 81 /* Delegate this to the SysAllocStringLen32 method. */ 81 82 return SysAllocStringLen(in, lstrlenW(in)); … … 84 85 #ifndef __WIN32OS2__ 85 86 /****************************************************************************** 86 * SysReAllocString16[OLE2DISP.3]87 * SysReAllocString16 [OLE2DISP.3] 87 88 */ 88 89 INT16 WINAPI SysReAllocString16(LPBSTR16 old,LPCOLESTR16 in) 89 90 { 90 BSTR16 new=SysAllocString16(in);91 BSTR_Free(*old);92 *old=new;93 return 1;94 } 95 #endif 96 97 /****************************************************************************** 98 * SysReAllocString[OLEAUT32.3]91 BSTR16 new=SysAllocString16(in); 92 BSTR_Free(*old); 93 *old=new; 94 return 1; 95 } 96 #endif 97 98 /****************************************************************************** 99 * SysReAllocString [OLEAUT32.3] 99 100 */ 100 101 INT WINAPI SysReAllocString(LPBSTR old,LPCOLESTR in) … … 103 104 * Sanity check 104 105 */ 105 if (old==NULL) 106 if (old==NULL) 106 107 return 0; 107 108 … … 109 110 * Make sure we free the old string. 110 111 */ 111 if (*old!=NULL) 112 if (*old!=NULL) 112 113 SysFreeString(*old); 113 114 … … 122 123 #ifndef __WIN32OS2__ 123 124 /****************************************************************************** 124 * SysAllocStringLen16[OLE2DISP.4]125 * SysAllocStringLen16 [OLE2DISP.4] 125 126 */ 126 127 BSTR16 WINAPI SysAllocStringLen16(const char *in, int len) 127 128 { 128 BSTR16 out=BSTR_AllocBytes(len+1);129 130 if (!out)131 return 0;129 BSTR16 out=BSTR_AllocBytes(len+1); 130 131 if (!out) 132 return 0; 132 133 133 134 /* … … 137 138 */ 138 139 if (in != 0) 139 strcpy(BSTR_GetAddr(out),in);140 strcpy(BSTR_GetAddr(out),in); 140 141 else 141 142 memset(BSTR_GetAddr(out), 0, len+1); 142 143 143 return out;144 return out; 144 145 } 145 146 #endif … … 152 153 * he describes it as a "DWORD count of characters". By experimenting with 153 154 * 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 155 * the string. Meaning that the count is double the number of wide 155 156 * characters in the string. 156 157 */ … … 214 215 #ifndef __WIN32OS2__ 215 216 /****************************************************************************** 216 * SysReAllocStringLen16[OLE2DISP.5]217 * SysReAllocStringLen16 [OLE2DISP.5] 217 218 */ 218 219 int WINAPI SysReAllocStringLen16(BSTR16 *old,const char *in,int len) 219 220 { 220 BSTR16 new=SysAllocStringLen16(in,len);221 BSTR_Free(*old);222 *old=new;223 return 1;224 } 225 #endif 226 227 221 BSTR16 new=SysAllocStringLen16(in,len); 222 BSTR_Free(*old); 223 *old=new; 224 return 1; 225 } 226 #endif 227 228 228 229 /****************************************************************************** 229 230 * SysReAllocStringLen [OLEAUT32.5] … … 234 235 * Sanity check 235 236 */ 236 if (old==NULL) 237 if (old==NULL) 237 238 return 0; 238 239 … … 240 241 * Make sure we free the old string. 241 242 */ 242 if (*old!=NULL) 243 if (*old!=NULL) 243 244 SysFreeString(*old); 244 245 … … 253 254 #ifndef __WIN32OS2__ 254 255 /****************************************************************************** 255 * SysFreeString16[OLE2DISP.6]256 * SysFreeString16 [OLE2DISP.6] 256 257 */ 257 258 void WINAPI SysFreeString16(BSTR16 in) 258 259 { 259 BSTR_Free(in);260 } 261 #endif 262 263 /****************************************************************************** 264 * SysFreeString[OLEAUT32.6]260 BSTR_Free(in); 261 } 262 #endif 263 264 /****************************************************************************** 265 * SysFreeString [OLEAUT32.6] 265 266 */ 266 267 void WINAPI SysFreeString(BSTR in) 267 268 { 268 269 DWORD* bufferPointer; 269 270 270 271 /* NULL is a valid parameter */ 271 272 if(!in) return; … … 288 289 #ifndef __WIN32OS2__ 289 290 /****************************************************************************** 290 * SysStringLen16[OLE2DISP.7]291 * SysStringLen16 [OLE2DISP.7] 291 292 */ 292 293 int WINAPI SysStringLen16(BSTR16 str) 293 294 { 294 return strlen(BSTR_GetAddr(str));295 return strlen(BSTR_GetAddr(str)); 295 296 } 296 297 #endif … … 310 311 if (!str) return 0; 311 312 /* 312 * The length of the string (in bytes) is contained in a DWORD placed 313 * The length of the string (in bytes) is contained in a DWORD placed 313 314 * just before the BSTR pointer 314 315 */ … … 334 335 if (!str) return 0; 335 336 /* 336 * The length of the string (in bytes) is contained in a DWORD placed 337 * The length of the string (in bytes) is contained in a DWORD placed 337 338 * just before the BSTR pointer 338 339 */ … … 349 350 */ 350 351 HRESULT WINAPI CreateDispTypeInfo16( 351 INTERFACEDATA *pidata,352 LCID lcid,353 ITypeInfo **pptinfo)354 { 355 FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);356 return 0;352 INTERFACEDATA *pidata, 353 LCID lcid, 354 ITypeInfo **pptinfo) 355 { 356 FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo); 357 return 0; 357 358 } 358 359 #endif … … 362 363 */ 363 364 HRESULT WINAPI CreateDispTypeInfo( 364 INTERFACEDATA *pidata,365 LCID lcid,366 ITypeInfo **pptinfo)367 { 368 FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);369 return 0;365 INTERFACEDATA *pidata, 366 LCID lcid, 367 ITypeInfo **pptinfo) 368 { 369 FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo); 370 return 0; 370 371 } 371 372 … … 377 378 IUnknown* punkOuter, 378 379 void* pvThis, 379 ITypeInfo* ptinfo,380 IUnknown** ppunkStdDisp)381 { 382 FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo,380 ITypeInfo* ptinfo, 381 IUnknown** ppunkStdDisp) 382 { 383 FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo, 383 384 ppunkStdDisp); 384 return 0;385 return 0; 385 386 } 386 387 #endif … … 392 393 IUnknown* punkOuter, 393 394 void* pvThis, 394 ITypeInfo* ptinfo,395 IUnknown** ppunkStdDisp)396 { 397 FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo,395 ITypeInfo* ptinfo, 396 IUnknown** ppunkStdDisp) 397 { 398 FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo, 398 399 ppunkStdDisp); 399 return 0;400 return 0; 400 401 } 401 402 … … 405 406 */ 406 407 HRESULT WINAPI RegisterActiveObject16( 407 IUnknown *punk, REFCLSID rclsid, DWORD dwFlags, unsigned long *pdwRegister408 IUnknown *punk, REFCLSID rclsid, DWORD dwFlags, unsigned long *pdwRegister 408 409 ) { 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]410 FIXME("(%p,%s,0x%08lx,%p):stub\n",punk,debugstr_guid(rclsid),dwFlags,pdwRegister); 411 return 0; 412 } 413 #endif 414 415 /****************************************************************************** 416 * OleTranslateColor [OLEAUT32.421] 416 417 * 417 418 * Converts an OLE_COLOR to a COLORREF. 418 419 * See the documentation for conversion rules. 419 * pColorRef can be NULL. In that case the user only wants to test the 420 * pColorRef can be NULL. In that case the user only wants to test the 420 421 * conversion. 421 422 */ -
trunk/src/oleaut32/oleaut.c
r6311 r6648 1 /* $Id: oleaut.c,v 1.2 2001-09-05 13:19:00 bird Exp $ */ 1 2 /* 2 * OLEAUT323 * OLEAUT32 3 4 * 4 5 */ … … 17 18 DEFAULT_DEBUG_CHANNEL(ole); 18 19 19 static WCHAR _delimiter[2] = {'!',0}; /* default delimiter apparently */20 static WCHAR *pdelimiter = &_delimiter[0];20 static WCHAR _delimiter[2] = {'!',0}; /* default delimiter apparently */ 21 static WCHAR *pdelimiter = &_delimiter[0]; 21 22 22 23 /*********************************************************************** 23 * RegisterActiveObject (OLEAUT32.33)24 * RegisterActiveObject (OLEAUT32.33) 24 25 */ 25 26 HRESULT WINAPI RegisterActiveObject( 26 LPUNKNOWN punk,REFCLSID rcid,DWORD dwFlags,LPDWORD pdwRegister27 LPUNKNOWN punk,REFCLSID rcid,DWORD dwFlags,LPDWORD pdwRegister 27 28 ) { 28 WCHARguidbuf[80];29 HRESULTret;30 LPRUNNINGOBJECTTABLErunobtable;31 LPMONIKERmoniker;29 WCHAR guidbuf[80]; 30 HRESULT ret; 31 LPRUNNINGOBJECTTABLE runobtable; 32 LPMONIKER moniker; 32 33 33 StringFromGUID2(rcid,guidbuf,39);34 StringFromGUID2(rcid,guidbuf,39); 34 35 #ifdef __WIN32OS2__ 35 36 dprintf(("RegisterActiveObject %x %ls (%x) %x %x", punk, guidbuf, rcid, dwFlags, pdwRegister)); 36 37 #endif 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;38 ret = CreateItemMoniker(pdelimiter,guidbuf,&moniker); 39 if (FAILED(ret)) 40 return ret; 41 ret = GetRunningObjectTable(0,&runobtable); 42 if (FAILED(ret)) { 43 IMoniker_Release(moniker); 44 return ret; 45 } 46 ret = IRunningObjectTable_Register(runobtable,dwFlags,punk,moniker,pdwRegister); 47 IRunningObjectTable_Release(runobtable); 48 IMoniker_Release(moniker); 49 return ret; 49 50 } 50 51 51 52 /*********************************************************************** 52 * RevokeActiveObject (OLEAUT32.34)53 * RevokeActiveObject (OLEAUT32.34) 53 54 */ 54 55 HRESULT WINAPI RevokeActiveObject(DWORD xregister,LPVOID reserved) 55 56 { 56 LPRUNNINGOBJECTTABLErunobtable;57 HRESULTret;57 LPRUNNINGOBJECTTABLE runobtable; 58 HRESULT ret; 58 59 59 60 #ifdef __WIN32OS2__ … … 61 62 #endif 62 63 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;64 ret = GetRunningObjectTable(0,&runobtable); 65 if (FAILED(ret)) return ret; 66 ret = IRunningObjectTable_Revoke(runobtable,xregister); 67 if (SUCCEEDED(ret)) ret = S_OK; 68 IRunningObjectTable_Release(runobtable); 69 return ret; 69 70 } 70 71 71 72 /*********************************************************************** 72 * GetActiveObject (OLEAUT32.35)73 * GetActiveObject (OLEAUT32.35) 73 74 */ 74 75 HRESULT WINAPI GetActiveObject(REFCLSID rcid,LPVOID preserved,LPUNKNOWN *ppunk) 75 76 { 76 WCHARguidbuf[80];77 HRESULTret;78 LPRUNNINGOBJECTTABLErunobtable;79 LPMONIKERmoniker;77 WCHAR guidbuf[80]; 78 HRESULT ret; 79 LPRUNNINGOBJECTTABLE runobtable; 80 LPMONIKER moniker; 80 81 81 StringFromGUID2(rcid,guidbuf,39);82 StringFromGUID2(rcid,guidbuf,39); 82 83 #ifdef __WIN32OS2__ 83 84 dprintf(("GetActiveObject %ls (%x) %x %x", guidbuf, rcid, preserved, ppunk)); 84 85 #endif 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;86 ret = CreateItemMoniker(pdelimiter,guidbuf,&moniker); 87 if (FAILED(ret)) 88 return ret; 89 ret = GetRunningObjectTable(0,&runobtable); 90 if (FAILED(ret)) { 91 IMoniker_Release(moniker); 92 return ret; 93 } 94 ret = IRunningObjectTable_GetObject(runobtable,moniker,ppunk); 95 IRunningObjectTable_Release(runobtable); 96 IMoniker_Release(moniker); 97 return ret; 97 98 } 98 99 … … 101 102 * 102 103 * known OLEAUT32.DLL versions: 103 * OLE 2.1 NT 1993-9510 3023104 * OLE 2.1 10 3027105 * 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 4275104 * OLE 2.1 NT 1993-95 10 3023 105 * OLE 2.1 10 3027 106 * OLE 2.20 W95/NT 1993-96 20 4112 107 * OLE 2.20 W95/NT 1993-96 20 4118 108 * OLE 2.20 W95/NT 1993-96 20 4122 109 * OLE 2.30 W95/NT 1993-98 30 4265 110 * OLE 2.40 NT?? 1993-98 40 4267 111 * OLE 2.40 W98 SE orig. file 1993-98 40 4275 111 112 */ 112 113 UINT WINAPI OaBuildVersion() … … 120 121 { 121 122 case 0x80000a03: /* WIN31 */ 122 return MAKELONG(4049, 20); /* from Win32s 1.1e */123 return MAKELONG(4049, 20); /* from Win32s 1.1e */ 123 124 case 0x80000004: /* WIN95 */ 124 return MAKELONG(4265, 30);125 return MAKELONG(4265, 30); 125 126 case 0x80000a04: /* WIN98 */ 126 return MAKELONG(4275, 40); /* value of W98 SE; orig. W98 AFAIK has 4265, 30 just as W95 */127 return MAKELONG(4275, 40); /* value of W98 SE; orig. W98 AFAIK has 4265, 30 just as W95 */ 127 128 case 0x00003303: /* NT351 */ 128 return MAKELONG(4265, 30); /* value borrowed from Win95 */129 return MAKELONG(4265, 30); /* value borrowed from Win95 */ 129 130 case 0x00000004: /* NT40 */ 130 131 #ifdef __WIN32OS2__ 131 132 return 0x2810b5; //returned by NT4, SP6 132 133 #else 133 return MAKELONG(4122, 20); /* ouch ! Quite old, I guess */134 return MAKELONG(4122, 20); /* ouch ! Quite old, I guess */ 134 135 #endif 135 136 default: 136 ERR("Version value not known yet. Please investigate it !\n");137 return 0x0;137 ERR("Version value not known yet. Please investigate it !\n"); 138 return 0x0; 138 139 } 139 140 } … … 141 142 #ifndef __WIN32OS2__ 142 143 /*********************************************************************** 143 * DllRegisterServer144 * DllRegisterServer 144 145 */ 145 HRESULT WINAPI OLEAUT32_DllRegisterServer() { 146 HRESULT WINAPI OLEAUT32_DllRegisterServer() { 146 147 FIXME("stub!\n"); 147 148 return S_OK; … … 149 150 150 151 /*********************************************************************** 151 * DllUnregisterServer152 * DllUnregisterServer 152 153 */ 153 154 HRESULT WINAPI OLEAUT32_DllUnregisterServer() { -
trunk/src/oleaut32/olefont.c
r6575 r6648 1 /* $Id: olefont.c,v 1.3 2001-09-05 13:19:00 bird Exp $ */ 1 2 /* 2 3 * OLE Font encapsulation implementation … … 46 47 { 47 48 /* 48 * This class supports many interfaces. IUnknown, IFont, 49 * This class supports many interfaces. IUnknown, IFont, 49 50 * IDispatch, IDispFont IPersistStream and IConnectionPointContainer. 50 51 * The first two are supported by the first vtable, the next two are … … 85 86 86 87 /* 87 * Here, I define utility macros to help with the casting of the 88 * Here, I define utility macros to help with the casting of the 88 89 * "this" parameter. 89 90 * There is a version to accomodate all of the VTables implemented … … 91 92 */ 92 93 #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*)); 94 #define _ICOM_THIS_From_IDispatch(class, name) class* this = (class*)(((char*)name)-sizeof(void*)); 95 #define _ICOM_THIS_From_IPersistStream(class, name) class* this = (class*)(((char*)name)-2*sizeof(void*)); 96 #define _ICOM_THIS_From_IConnectionPointContainer(class, name) class* this = (class*)(((char*)name)-3*sizeof(void*)); 96 97 97 98 … … 134 135 * interface 135 136 */ 136 static HRESULT WINAPI OLEFontImpl_IDispatch_QueryInterface(IDispatch* iface, 137 REFIID riid, 138 VOID** ppvoid);137 static HRESULT WINAPI OLEFontImpl_IDispatch_QueryInterface(IDispatch* iface, 138 REFIID riid, 139 VOID** ppvoid); 139 140 static ULONG WINAPI OLEFontImpl_IDispatch_AddRef(IDispatch* iface); 140 141 static ULONG WINAPI OLEFontImpl_IDispatch_Release(IDispatch* iface); 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);142 static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount(IDispatch* iface, 143 unsigned int* pctinfo); 144 static HRESULT WINAPI OLEFontImpl_GetTypeInfo(IDispatch* iface, 145 UINT iTInfo, 146 LCID lcid, 147 ITypeInfo** ppTInfo); 147 148 static HRESULT WINAPI OLEFontImpl_GetIDsOfNames(IDispatch* iface, 148 REFIID riid, 149 LPOLESTR* rgszNames, 150 UINT cNames, 151 LCID lcid,152 DISPID* rgDispId);149 REFIID riid, 150 LPOLESTR* rgszNames, 151 UINT cNames, 152 LCID lcid, 153 DISPID* rgDispId); 153 154 static HRESULT WINAPI OLEFontImpl_Invoke(IDispatch* iface, 154 DISPID dispIdMember, 155 REFIID riid, 156 LCID lcid, 157 WORD wFlags,158 DISPPARAMS* pDispParams,159 VARIANT* pVarResult, 160 EXCEPINFO* pExepInfo,161 UINT* puArgErr); 155 DISPID dispIdMember, 156 REFIID riid, 157 LCID lcid, 158 WORD wFlags, 159 DISPPARAMS* pDispParams, 160 VARIANT* pVarResult, 161 EXCEPINFO* pExepInfo, 162 UINT* puArgErr); 162 163 163 164 /*********************************************************************** … … 165 166 * interface 166 167 */ 167 static HRESULT WINAPI OLEFontImpl_IPersistStream_QueryInterface(IPersistStream* iface, 168 REFIID riid, 169 VOID** ppvoid);168 static HRESULT WINAPI OLEFontImpl_IPersistStream_QueryInterface(IPersistStream* iface, 169 REFIID riid, 170 VOID** ppvoid); 170 171 static ULONG WINAPI OLEFontImpl_IPersistStream_AddRef(IPersistStream* iface); 171 172 static ULONG WINAPI OLEFontImpl_IPersistStream_Release(IPersistStream* iface); 172 static HRESULT WINAPI OLEFontImpl_GetClassID(IPersistStream* iface, 173 CLSID* pClassID);173 static HRESULT WINAPI OLEFontImpl_GetClassID(IPersistStream* iface, 174 CLSID* pClassID); 174 175 static HRESULT WINAPI OLEFontImpl_IsDirty(IPersistStream* iface); 175 176 static HRESULT WINAPI OLEFontImpl_Load(IPersistStream* iface, 176 IStream* pLoadStream);177 IStream* pLoadStream); 177 178 static HRESULT WINAPI OLEFontImpl_Save(IPersistStream* iface, 178 IStream* pOutStream,179 BOOL fClearDirty); 179 IStream* pOutStream, 180 BOOL fClearDirty); 180 181 static HRESULT WINAPI OLEFontImpl_GetSizeMax(IPersistStream* iface, 181 ULARGE_INTEGER* pcbSize); 182 ULARGE_INTEGER* pcbSize); 182 183 183 184 /*********************************************************************** … … 186 187 */ 187 188 static HRESULT WINAPI OLEFontImpl_IConnectionPointContainer_QueryInterface( 188 IConnectionPointContainer* iface, 189 REFIID riid, 190 VOID** ppvoid);189 IConnectionPointContainer* iface, 190 REFIID riid, 191 VOID** ppvoid); 191 192 static ULONG WINAPI OLEFontImpl_IConnectionPointContainer_AddRef( 192 IConnectionPointContainer* iface);193 IConnectionPointContainer* iface); 193 194 static ULONG WINAPI OLEFontImpl_IConnectionPointContainer_Release( 194 IConnectionPointContainer* iface);195 IConnectionPointContainer* iface); 195 196 static HRESULT WINAPI OLEFontImpl_EnumConnectionPoints( 196 IConnectionPointContainer* iface,197 IEnumConnectionPoints **ppEnum);197 IConnectionPointContainer* iface, 198 IEnumConnectionPoints **ppEnum); 198 199 static HRESULT WINAPI OLEFontImpl_FindConnectionPoint( 199 IConnectionPointContainer* iface,200 REFIID riid,201 IConnectionPoint **ppCp);200 IConnectionPointContainer* iface, 201 REFIID riid, 202 IConnectionPoint **ppCp); 202 203 203 204 /* … … 227 228 OLEFontImpl_put_Charset, 228 229 OLEFontImpl_get_hFont, 229 OLEFontImpl_Clone, 230 OLEFontImpl_Clone, 230 231 OLEFontImpl_IsEqual, 231 232 OLEFontImpl_SetRatio, … … 273 274 274 275 /****************************************************************************** 275 * OleCreateFontIndirect[OLEAUT32.420]276 * OleCreateFontIndirect [OLEAUT32.420] 276 277 */ 277 278 HRESULT WINAPI OleCreateFontIndirect( … … 331 332 332 333 IConnectionPoint_EnumConnections(this->pCP, &pEnum); 333 334 334 335 while(IEnumConnections_Next(pEnum, 1, &CD, NULL) == S_OK) { 335 336 IPropertyNotifySink *sink; … … 343 344 return; 344 345 } 345 346 346 347 /************************************************************************ 347 348 * OLEFontImpl_Construct … … 364 365 if (newObject==0) 365 366 return newObject; 366 367 367 368 /* 368 369 * Initialize the virtual function table. … … 372 373 newObject->lpvtbl3 = &OLEFontImpl_IPersistStream_VTable; 373 374 newObject->lpvtbl4 = &OLEFontImpl_IConnectionPointContainer_VTable; 374 375 /* 376 * Start with one reference count. The caller of this function 375 376 /* 377 * Start with one reference count. The caller of this function 377 378 * must release the interface pointer when it is done. 378 379 */ … … 386 387 newObject->description.cbSizeofstruct = sizeof(FONTDESC); 387 388 newObject->description.lpstrName = HeapAlloc(GetProcessHeap(), 388 0, 389 (lstrlenW(fontDesc->lpstrName)+1) * sizeof(WCHAR));389 0, 390 (lstrlenW(fontDesc->lpstrName)+1) * sizeof(WCHAR)); 390 391 strcpyW(newObject->description.lpstrName, fontDesc->lpstrName); 391 392 newObject->description.cySize = fontDesc->cySize; … … 448 449 if ( (this==0) || (ppvObject==0) ) 449 450 return E_INVALIDARG; 450 451 451 452 /* 452 453 * Initialize the return parameter. 453 454 */ 454 455 *ppvObject = 0; 455 456 456 457 /* 457 458 * Compare the riid with the interface IDs implemented by this object. 458 459 */ 459 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 460 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 460 461 { 461 462 *ppvObject = (IFont*)this; 462 463 } 463 else if (memcmp(&IID_IFont, riid, sizeof(IID_IFont)) == 0) 464 else if (memcmp(&IID_IFont, riid, sizeof(IID_IFont)) == 0) 464 465 { 465 466 *ppvObject = (IFont*)this; 466 467 } 467 else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 468 else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 468 469 { 469 470 *ppvObject = (IDispatch*)&(this->lpvtbl2); 470 471 } 471 else if (memcmp(&IID_IFontDisp, riid, sizeof(IID_IFontDisp)) == 0) 472 else if (memcmp(&IID_IFontDisp, riid, sizeof(IID_IFontDisp)) == 0) 472 473 { 473 474 *ppvObject = (IDispatch*)&(this->lpvtbl2); 474 475 } 475 else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 476 else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 476 477 { 477 478 *ppvObject = (IPersistStream*)&(this->lpvtbl3); 478 479 } 479 480 else if (memcmp(&IID_IConnectionPointContainer, riid, 480 sizeof(IID_IConnectionPointContainer)) == 0) 481 sizeof(IID_IConnectionPointContainer)) == 0) 481 482 { 482 483 *ppvObject = (IPersistStream*)&(this->lpvtbl4); 483 484 } 484 485 485 486 /* 486 487 * Check that we obtained an interface. … … 491 492 return E_NOINTERFACE; 492 493 } 493 494 494 495 /* 495 496 * Query Interface always increases the reference count by one when it is … … 500 501 return S_OK;; 501 502 } 502 503 503 504 /************************************************************************ 504 505 * OLEFontImpl_AddRef (IUnknown) … … 506 507 * See Windows documentation for more details on IUnknown methods. 507 508 */ 508 ULONG WINAPI OLEFontImpl_AddRef( 509 ULONG WINAPI OLEFontImpl_AddRef( 509 510 IFont* iface) 510 511 { … … 515 516 return this->ref; 516 517 } 517 518 518 519 /************************************************************************ 519 520 * OLEFontImpl_Release (IUnknown) … … 521 522 * See Windows documentation for more details on IUnknown methods. 522 523 */ 523 ULONG WINAPI OLEFontImpl_Release( 524 ULONG WINAPI OLEFontImpl_Release( 524 525 IFont* iface) 525 526 { … … 541 542 return 0; 542 543 } 543 544 544 545 return this->ref; 545 546 } 546 547 547 548 /************************************************************************ 548 549 * OLEFontImpl_get_Name (IFont) … … 551 552 */ 552 553 static HRESULT WINAPI OLEFontImpl_get_Name( 553 IFont* iface, 554 IFont* iface, 554 555 BSTR* pname) 555 556 { … … 576 577 */ 577 578 static HRESULT WINAPI OLEFontImpl_put_Name( 578 IFont* iface, 579 IFont* iface, 579 580 BSTR name) 580 581 { … … 585 586 { 586 587 this->description.lpstrName = HeapAlloc(GetProcessHeap(), 587 0, 588 (lstrlenW(name)+1) * sizeof(WCHAR));588 0, 589 (lstrlenW(name)+1) * sizeof(WCHAR)); 589 590 } 590 591 else 591 592 { 592 593 this->description.lpstrName = HeapReAlloc(GetProcessHeap(), 593 0, 594 this->description.lpstrName,595 (lstrlenW(name)+1) * sizeof(WCHAR));594 0, 595 this->description.lpstrName, 596 (lstrlenW(name)+1) * sizeof(WCHAR)); 596 597 } 597 598 … … 611 612 */ 612 613 static HRESULT WINAPI OLEFontImpl_get_Size( 613 IFont* iface, 614 IFont* iface, 614 615 CY* psize) 615 616 { … … 635 636 */ 636 637 static HRESULT WINAPI OLEFontImpl_put_Size( 637 IFont* iface, 638 IFont* iface, 638 639 CY size) 639 640 { … … 653 654 */ 654 655 static HRESULT WINAPI OLEFontImpl_get_Bold( 655 IFont* iface, 656 IFont* iface, 656 657 BOOL* pbold) 657 658 { … … 692 693 */ 693 694 static HRESULT WINAPI OLEFontImpl_get_Italic( 694 IFont* iface, 695 IFont* iface, 695 696 BOOL* pitalic) 696 697 { … … 714 715 */ 715 716 static HRESULT WINAPI OLEFontImpl_put_Italic( 716 IFont* iface, 717 IFont* iface, 717 718 BOOL italic) 718 719 { … … 732 733 */ 733 734 static HRESULT WINAPI OLEFontImpl_get_Underline( 734 IFont* iface, 735 IFont* iface, 735 736 BOOL* punderline) 736 737 { … … 773 774 */ 774 775 static HRESULT WINAPI OLEFontImpl_get_Strikethrough( 775 IFont* iface, 776 IFont* iface, 776 777 BOOL* pstrikethrough) 777 778 { … … 796 797 */ 797 798 static HRESULT WINAPI OLEFontImpl_put_Strikethrough( 798 IFont* iface, 799 IFont* iface, 799 800 BOOL strikethrough) 800 801 { … … 814 815 */ 815 816 static HRESULT WINAPI OLEFontImpl_get_Weight( 816 IFont* iface, 817 IFont* iface, 817 818 short* pweight) 818 819 { … … 837 838 */ 838 839 static HRESULT WINAPI OLEFontImpl_put_Weight( 839 IFont* iface, 840 IFont* iface, 840 841 short weight) 841 842 { … … 855 856 */ 856 857 static HRESULT WINAPI OLEFontImpl_get_Charset( 857 IFont* iface, 858 IFont* iface, 858 859 short* pcharset) 859 860 { … … 878 879 */ 879 880 static HRESULT WINAPI OLEFontImpl_put_Charset( 880 IFont* iface, 881 IFont* iface, 881 882 short charset) 882 883 { … … 912 913 INT fontHeight; 913 914 CY cySize; 914 915 915 916 /* 916 917 * The height of the font returned by the get_Size property is the … … 982 983 */ 983 984 newObject->description.lpstrName = HeapAlloc( 984 GetProcessHeap(),0,985 (1+strlenW(this->description.lpstrName))*2985 GetProcessHeap(),0, 986 (1+strlenW(this->description.lpstrName))*2 986 987 ); 987 988 /* We need to clone the HFONT too. This is just cut & paste from above */ … … 994 995 995 996 logFont.lfHeight = ((fontHeight%10000L)>5000L) ? (-fontHeight/10000L)-1 : 996 (-fontHeight/10000L);997 (-fontHeight/10000L); 997 998 logFont.lfItalic = this->description.fItalic; 998 999 logFont.lfUnderline = this->description.fUnderline; … … 1023 1024 */ 1024 1025 static HRESULT WINAPI OLEFontImpl_IsEqual( 1025 IFont* iface, 1026 IFont* iface, 1026 1027 IFont* pFontOther) 1027 1028 { … … 1055 1056 */ 1056 1057 static HRESULT WINAPI OLEFontImpl_QueryTextMetrics( 1057 IFont* iface, 1058 IFont* iface, 1058 1059 TEXTMETRICOLE* ptm) 1059 1060 { … … 1068 1069 */ 1069 1070 static HRESULT WINAPI OLEFontImpl_AddRefHfont( 1070 IFont* iface, 1071 IFont* iface, 1071 1072 HFONT hfont) 1072 1073 { … … 1107 1108 { 1108 1109 DeleteObject(this->gdiFont); 1109 this->gdiFont = 0; 1110 this->gdiFont = 0; 1110 1111 } 1111 1112 … … 1174 1175 */ 1175 1176 static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount( 1176 IDispatch* iface, 1177 IDispatch* iface, 1177 1178 unsigned int* pctinfo) 1178 1179 { … … 1189 1190 */ 1190 1191 static HRESULT WINAPI OLEFontImpl_GetTypeInfo( 1191 IDispatch* iface, 1192 IDispatch* iface, 1192 1193 UINT iTInfo, 1193 LCID lcid, 1194 LCID lcid, 1194 1195 ITypeInfo** ppTInfo) 1195 1196 { … … 1207 1208 static HRESULT WINAPI OLEFontImpl_GetIDsOfNames( 1208 1209 IDispatch* iface, 1209 REFIID riid, 1210 LPOLESTR* rgszNames, 1211 UINT cNames, 1210 REFIID riid, 1211 LPOLESTR* rgszNames, 1212 UINT cNames, 1212 1213 LCID lcid, 1213 1214 DISPID* rgDispId) … … 1226 1227 static HRESULT WINAPI OLEFontImpl_Invoke( 1227 1228 IDispatch* iface, 1228 DISPID dispIdMember, 1229 REFIID riid, 1230 LCID lcid, 1229 DISPID dispIdMember, 1230 REFIID riid, 1231 LCID lcid, 1231 1232 WORD wFlags, 1232 1233 DISPPARAMS* pDispParams, 1233 VARIANT* pVarResult, 1234 VARIANT* pVarResult, 1234 1235 EXCEPINFO* pExepInfo, 1235 1236 UINT* puArgErr) … … 1289 1290 */ 1290 1291 static HRESULT WINAPI OLEFontImpl_GetClassID( 1291 IPersistStream* iface, 1292 IPersistStream* iface, 1292 1293 CLSID* pClassID) 1293 1294 { … … 1343 1344 1344 1345 _ICOM_THIS_From_IPersistStream(OLEFontImpl, iface); 1345 1346 1346 1347 /* 1347 1348 * Read the version byte … … 1372 1373 this->description.fStrikethrough = (bAttributes & FONTPERSIST_STRIKETHROUGH) != 0; 1373 1374 this->description.fUnderline = (bAttributes & FONTPERSIST_UNDERLINE) != 0; 1374 1375 1375 1376 /* 1376 1377 * Weight … … 1408 1409 HeapFree(GetProcessHeap(), 0, this->description.lpstrName); 1409 1410 1410 this->description.lpstrName = HEAP_strdupAtoW(GetProcessHeap(), 1411 HEAP_ZERO_MEMORY,1412 readBuffer);1411 this->description.lpstrName = HEAP_strdupAtoW(GetProcessHeap(), 1412 HEAP_ZERO_MEMORY, 1413 readBuffer); 1413 1414 1414 1415 return S_OK; … … 1430 1431 BYTE bAttributes; 1431 1432 BYTE bStringSize; 1432 1433 1433 1434 _ICOM_THIS_From_IPersistStream(OLEFontImpl, iface); 1434 1435 … … 1459 1460 if (this->description.fStrikethrough) 1460 1461 bAttributes |= FONTPERSIST_STRIKETHROUGH; 1461 1462 1462 1463 if (this->description.fUnderline) 1463 1464 bAttributes |= FONTPERSIST_UNDERLINE; … … 1467 1468 if (cbWritten!=1) 1468 1469 return E_FAIL; 1469 1470 1470 1471 /* 1471 1472 * Weight … … 1499 1500 if (bStringSize!=0) 1500 1501 { 1501 writeBuffer = HEAP_strdupWtoA(GetProcessHeap(), 1502 HEAP_ZERO_MEMORY,1503 this->description.lpstrName);1502 writeBuffer = HEAP_strdupWtoA(GetProcessHeap(), 1503 HEAP_ZERO_MEMORY, 1504 this->description.lpstrName); 1504 1505 1505 1506 if (writeBuffer==0) … … 1507 1508 1508 1509 IStream_Write(pOutStream, writeBuffer, bStringSize, &cbWritten); 1509 1510 1510 1511 HeapFree(GetProcessHeap(), 0, writeBuffer); 1511 1512 … … 1620 1621 if(memcmp(riid, &IID_IPropertyNotifySink, sizeof(IID_IPropertyNotifySink)) == 0) { 1621 1622 return IConnectionPoint_QueryInterface(this->pCP, &IID_IConnectionPoint, 1622 (LPVOID)ppCp);1623 (LPVOID)ppCp); 1623 1624 } else { 1624 1625 FIXME("Tried to find connection point on %s\n", debugstr_guid(riid)); … … 1637 1638 } IClassFactoryImpl; 1638 1639 1639 static HRESULT WINAPI 1640 static HRESULT WINAPI 1640 1641 SFCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { 1641 ICOM_THIS(IClassFactoryImpl,iface);1642 1643 FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);1644 return E_NOINTERFACE;1642 ICOM_THIS(IClassFactoryImpl,iface); 1643 1644 FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj); 1645 return E_NOINTERFACE; 1645 1646 } 1646 1647 1647 1648 static ULONG WINAPI 1648 1649 SFCF_AddRef(LPCLASSFACTORY iface) { 1649 ICOM_THIS(IClassFactoryImpl,iface);1650 return ++(This->ref);1650 ICOM_THIS(IClassFactoryImpl,iface); 1651 return ++(This->ref); 1651 1652 } 1652 1653 1653 1654 static ULONG WINAPI SFCF_Release(LPCLASSFACTORY iface) { 1654 ICOM_THIS(IClassFactoryImpl,iface);1655 /* static class, won't be freed */1656 return --(This->ref);1655 ICOM_THIS(IClassFactoryImpl,iface); 1656 /* static class, won't be freed */ 1657 return --(This->ref); 1657 1658 } 1658 1659 1659 1660 static HRESULT WINAPI SFCF_CreateInstance( 1660 LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj1661 LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj 1661 1662 ) { 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;1663 ICOM_THIS(IClassFactoryImpl,iface); 1664 1665 if (IsEqualGUID(riid,&IID_IFont)) { 1666 FONTDESC fd; 1667 1668 WCHAR fname[] = { 'S','y','s','t','e','m',0 }; 1669 1670 fd.cbSizeofstruct = sizeof(fd); 1671 fd.lpstrName = fname; 1672 fd.cySize.s.Lo = 80000; 1673 fd.cySize.s.Hi = 0; 1674 fd.sWeight = 0; 1675 fd.sCharset = 0; 1676 fd.fItalic = 0; 1677 fd.fUnderline = 0; 1678 fd.fStrikethrough = 0; 1679 return OleCreateFontIndirect(&fd,riid,ppobj); 1680 } 1681 1682 FIXME("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); 1683 return E_NOINTERFACE; 1683 1684 } 1684 1685 1685 1686 static HRESULT WINAPI SFCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { 1686 ICOM_THIS(IClassFactoryImpl,iface);1687 FIXME("(%p)->(%d),stub!\n",This,dolock);1688 return S_OK;1687 ICOM_THIS(IClassFactoryImpl,iface); 1688 FIXME("(%p)->(%d),stub!\n",This,dolock); 1689 return S_OK; 1689 1690 } 1690 1691 1691 1692 static ICOM_VTABLE(IClassFactory) SFCF_Vtbl = { 1692 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE1693 SFCF_QueryInterface,1694 SFCF_AddRef,1695 SFCF_Release,1696 SFCF_CreateInstance,1697 SFCF_LockServer1693 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 1694 SFCF_QueryInterface, 1695 SFCF_AddRef, 1696 SFCF_Release, 1697 SFCF_CreateInstance, 1698 SFCF_LockServer 1698 1699 }; 1699 1700 static IClassFactoryImpl STDFONT_CF = {&SFCF_Vtbl, 1 }; -
trunk/src/oleaut32/olepicture.c
r6575 r6648 1 /* $Id: olepicture.c,v 1.5 2001-09-05 13:19:01 bird Exp $ */ 1 2 /* 2 3 * OLE Picture object … … 50 51 #ifdef HAVE_LIBJPEG 51 52 /* This is a hack, so jpeglib.h does not redefine INT32 and the like*/ 52 #define XMD_H 53 #define XMD_H 53 54 #ifdef HAVE_JPEGLIB_H 54 55 # include <jpeglib.h> … … 90 91 /* We own the object and must destroy it ourselves */ 91 92 BOOL fOwn; 92 93 93 94 /* Picture description */ 94 95 PICTDESC desc; … … 105 106 106 107 BOOL keepOrigFormat; 107 HDC hDCCur;108 HDC hDCCur; 108 109 } OLEPictureImpl; 109 110 … … 174 175 if (newObject==0) 175 176 return newObject; 176 177 177 178 /* 178 179 * Initialize the virtual function table. … … 186 187 187 188 /* 188 * Start with one reference count. The caller of this function 189 * Start with one reference count. The caller of this function 189 190 * must release the interface pointer when it is done. 190 191 */ 191 newObject->ref = 1;192 newObject->hDCCur = 0;193 194 newObject->fOwn = fOwn;192 newObject->ref = 1; 193 newObject->hDCCur = 0; 194 195 newObject->fOwn = fOwn; 195 196 196 197 /* dunno about original value */ … … 199 200 if (pictDesc) { 200 201 if(pictDesc->cbSizeofstruct != sizeof(PICTDESC)) { 201 FIXME("struct size = %d\n", pictDesc->cbSizeofstruct);202 FIXME("struct size = %d\n", pictDesc->cbSizeofstruct); 202 203 } 203 204 memcpy(&newObject->desc, pictDesc, sizeof(PICTDESC)); … … 206 207 switch(pictDesc->picType) { 207 208 case PICTYPE_BITMAP: 208 OLEPictureImpl_SetBitmap(newObject);209 break;209 OLEPictureImpl_SetBitmap(newObject); 210 break; 210 211 211 212 case PICTYPE_METAFILE: 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;213 TRACE("metafile handle %08x\n", pictDesc->u.wmf.hmeta); 214 newObject->himetricWidth = pictDesc->u.wmf.xExt; 215 newObject->himetricHeight = pictDesc->u.wmf.yExt; 216 break; 216 217 217 218 case PICTYPE_ICON: 218 219 case PICTYPE_ENHMETAFILE: 219 220 default: 220 FIXME("Unsupported type %d\n", pictDesc->picType);221 newObject->himetricWidth = newObject->himetricHeight = 0;222 break;221 FIXME("Unsupported type %d\n", pictDesc->picType); 222 newObject->himetricWidth = newObject->himetricHeight = 0; 223 break; 223 224 } 224 225 } else { 225 226 newObject->desc.picType = PICTYPE_UNINITIALIZED; 226 227 } 227 228 228 229 TRACE("returning %p\n", newObject); 229 230 return newObject; … … 237 238 * this object. */ 238 239 static void OLEPictureImpl_Destroy(OLEPictureImpl* Obj) 239 { 240 { 240 241 TRACE("(%p)\n", Obj); 241 242 … … 282 283 if ( (This==0) || (ppvObject==0) ) 283 284 return E_INVALIDARG; 284 285 285 286 /* 286 287 * Initialize the return parameter. 287 288 */ 288 289 *ppvObject = 0; 289 290 290 291 /* 291 292 * Compare the riid with the interface IDs implemented by this object. 292 293 */ 293 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 294 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 294 295 { 295 296 *ppvObject = (IPicture*)This; 296 297 } 297 else if (memcmp(&IID_IPicture, riid, sizeof(IID_IPicture)) == 0) 298 else if (memcmp(&IID_IPicture, riid, sizeof(IID_IPicture)) == 0) 298 299 { 299 300 *ppvObject = (IPicture*)This; 300 301 } 301 else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 302 else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 302 303 { 303 304 *ppvObject = (IDispatch*)&(This->lpvtbl2); 304 305 } 305 else if (memcmp(&IID_IPictureDisp, riid, sizeof(IID_IPictureDisp)) == 0) 306 else if (memcmp(&IID_IPictureDisp, riid, sizeof(IID_IPictureDisp)) == 0) 306 307 { 307 308 *ppvObject = (IDispatch*)&(This->lpvtbl2); 308 309 } 309 else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 310 else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 310 311 { 311 312 *ppvObject = (IPersistStream*)&(This->lpvtbl3); 312 313 } 313 else if (memcmp(&IID_IConnectionPointContainer, riid, sizeof(IID_IConnectionPointContainer)) == 0) 314 else if (memcmp(&IID_IConnectionPointContainer, riid, sizeof(IID_IConnectionPointContainer)) == 0) 314 315 { 315 316 *ppvObject = (IConnectionPointContainer*)&(This->lpvtbl4); … … 323 324 return E_NOINTERFACE; 324 325 } 325 326 326 327 /* 327 328 * Query Interface always increases the reference count by one when it is … … 362 363 * See Windows documentation for more details on IUnknown methods. 363 364 */ 364 static ULONG WINAPI OLEPictureImpl_AddRef( 365 static ULONG WINAPI OLEPictureImpl_AddRef( 365 366 IPicture* iface) 366 367 { … … 371 372 return This->ref; 372 373 } 373 374 374 375 /************************************************************************ 375 376 * OLEPictureImpl_Release (IUnknown) … … 377 378 * See Windows documentation for more details on IUnknown methods. 378 379 */ 379 static ULONG WINAPI OLEPictureImpl_Release( 380 static ULONG WINAPI OLEPictureImpl_Release( 380 381 IPicture* iface) 381 382 { … … 397 398 return 0; 398 399 } 399 400 400 401 return This->ref; 401 402 } … … 404 405 /************************************************************************ 405 406 * OLEPictureImpl_get_Handle 406 */ 407 */ 407 408 static HRESULT WINAPI OLEPictureImpl_get_Handle(IPicture *iface, 408 OLE_HANDLE *phandle)409 OLE_HANDLE *phandle) 409 410 { 410 411 ICOM_THIS(OLEPictureImpl, iface); … … 433 434 /************************************************************************ 434 435 * OLEPictureImpl_get_hPal 435 */ 436 */ 436 437 static HRESULT WINAPI OLEPictureImpl_get_hPal(IPicture *iface, 437 OLE_HANDLE *phandle)438 OLE_HANDLE *phandle) 438 439 { 439 440 ICOM_THIS(OLEPictureImpl, iface); … … 444 445 /************************************************************************ 445 446 * OLEPictureImpl_get_Type 446 */ 447 */ 447 448 static HRESULT WINAPI OLEPictureImpl_get_Type(IPicture *iface, 448 short *ptype)449 short *ptype) 449 450 { 450 451 ICOM_THIS(OLEPictureImpl, iface); … … 456 457 /************************************************************************ 457 458 * OLEPictureImpl_get_Width 458 */ 459 */ 459 460 static HRESULT WINAPI OLEPictureImpl_get_Width(IPicture *iface, 460 OLE_XSIZE_HIMETRIC *pwidth)461 OLE_XSIZE_HIMETRIC *pwidth) 461 462 { 462 463 ICOM_THIS(OLEPictureImpl, iface); … … 468 469 /************************************************************************ 469 470 * OLEPictureImpl_get_Height 470 */ 471 */ 471 472 static HRESULT WINAPI OLEPictureImpl_get_Height(IPicture *iface, 472 OLE_YSIZE_HIMETRIC *pheight)473 OLE_YSIZE_HIMETRIC *pheight) 473 474 { 474 475 ICOM_THIS(OLEPictureImpl, iface); … … 480 481 /************************************************************************ 481 482 * OLEPictureImpl_Render 482 */ 483 */ 483 484 static HRESULT WINAPI OLEPictureImpl_Render(IPicture *iface, HDC hdc, 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)485 long x, long y, long cx, long cy, 486 OLE_XPOS_HIMETRIC xSrc, 487 OLE_YPOS_HIMETRIC ySrc, 488 OLE_XSIZE_HIMETRIC cxSrc, 489 OLE_YSIZE_HIMETRIC cySrc, 490 LPCRECT prcWBounds) 490 491 { 491 492 ICOM_THIS(OLEPictureImpl, iface); 492 493 TRACE("(%p)->(%08x, (%ld,%ld), (%ld,%ld) <- (%ld,%ld), (%ld,%ld), %p)\n", 493 This, hdc, x, y, cx, cy, xSrc, ySrc, cxSrc, cySrc, prcWBounds);494 This, hdc, x, y, cx, cy, xSrc, ySrc, cxSrc, cySrc, prcWBounds); 494 495 if(prcWBounds) 495 496 TRACE("prcWBounds (%d,%d) - (%d,%d)\n", prcWBounds->left, prcWBounds->top, 496 prcWBounds->right, prcWBounds->bottom);497 prcWBounds->right, prcWBounds->bottom); 497 498 498 499 /* … … 542 543 /************************************************************************ 543 544 * OLEPictureImpl_set_hPal 544 */ 545 */ 545 546 static HRESULT WINAPI OLEPictureImpl_set_hPal(IPicture *iface, 546 OLE_HANDLE hpal)547 OLE_HANDLE hpal) 547 548 { 548 549 ICOM_THIS(OLEPictureImpl, iface); … … 554 555 /************************************************************************ 555 556 * OLEPictureImpl_get_CurDC 556 */ 557 */ 557 558 static HRESULT WINAPI OLEPictureImpl_get_CurDC(IPicture *iface, 558 HDC *phdc)559 HDC *phdc) 559 560 { 560 561 ICOM_THIS(OLEPictureImpl, iface); … … 566 567 /************************************************************************ 567 568 * OLEPictureImpl_SelectPicture 568 */ 569 */ 569 570 static HRESULT WINAPI OLEPictureImpl_SelectPicture(IPicture *iface, 570 HDC hdcIn,571 HDC *phdcOut,572 OLE_HANDLE *phbmpOut)571 HDC hdcIn, 572 HDC *phdcOut, 573 OLE_HANDLE *phbmpOut) 573 574 { 574 575 ICOM_THIS(OLEPictureImpl, iface); … … 578 579 579 580 if (phdcOut) 580 *phdcOut = This->hDCCur;581 *phdcOut = This->hDCCur; 581 582 This->hDCCur = hdcIn; 582 583 if (phbmpOut) 583 *phbmpOut = This->desc.u.bmp.hbitmap;584 *phbmpOut = This->desc.u.bmp.hbitmap; 584 585 return S_OK; 585 586 } else { … … 591 592 /************************************************************************ 592 593 * OLEPictureImpl_get_KeepOriginalFormat 593 */ 594 */ 594 595 static HRESULT WINAPI OLEPictureImpl_get_KeepOriginalFormat(IPicture *iface, 595 BOOL *pfKeep)596 BOOL *pfKeep) 596 597 { 597 598 ICOM_THIS(OLEPictureImpl, iface); … … 605 606 /************************************************************************ 606 607 * OLEPictureImpl_put_KeepOriginalFormat 607 */ 608 */ 608 609 static HRESULT WINAPI OLEPictureImpl_put_KeepOriginalFormat(IPicture *iface, 609 BOOL keep)610 BOOL keep) 610 611 { 611 612 ICOM_THIS(OLEPictureImpl, iface); … … 618 619 /************************************************************************ 619 620 * OLEPictureImpl_PictureChanged 620 */ 621 */ 621 622 static HRESULT WINAPI OLEPictureImpl_PictureChanged(IPicture *iface) 622 623 { … … 629 630 /************************************************************************ 630 631 * OLEPictureImpl_SaveAsFile 631 */ 632 */ 632 633 static HRESULT WINAPI OLEPictureImpl_SaveAsFile(IPicture *iface, 633 IStream *pstream,634 BOOL SaveMemCopy,635 LONG *pcbSize)634 IStream *pstream, 635 BOOL SaveMemCopy, 636 LONG *pcbSize) 636 637 { 637 638 ICOM_THIS(OLEPictureImpl, iface); … … 642 643 /************************************************************************ 643 644 * OLEPictureImpl_get_Attributes 644 */ 645 */ 645 646 static HRESULT WINAPI OLEPictureImpl_get_Attributes(IPicture *iface, 646 DWORD *pdwAttr)647 DWORD *pdwAttr) 647 648 { 648 649 ICOM_THIS(OLEPictureImpl, iface); … … 650 651 *pdwAttr = 0; 651 652 switch (This->desc.picType) { 652 case PICTYPE_BITMAP: break;/* not 'truely' scalable, see MSDN. */653 case PICTYPE_BITMAP: break; /* not 'truely' scalable, see MSDN. */ 653 654 case PICTYPE_ICON: *pdwAttr = PICTURE_TRANSPARENT;break; 654 655 case PICTYPE_METAFILE: *pdwAttr = PICTURE_TRANSPARENT|PICTURE_SCALABLE;break; … … 706 707 ICOM_THIS_From_IConnectionPointContainer(OLEPictureImpl, iface); 707 708 TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppCP); 708 if (!ppCP) 709 if (!ppCP) 709 710 return E_POINTER; 710 711 *ppCP = NULL; … … 805 806 * Loads the binary data from the IStream. Starts at current position. 806 807 * There appears to be an 2 DWORD header: 807 * DWORD magic;808 * DWORD len;808 * DWORD magic; 809 * DWORD len; 809 810 * 810 811 * Currently implemented: BITMAP, ICON, JPEG. 811 812 */ 812 813 static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) { 813 HRESULT hr = E_FAIL;814 ULONG xread;815 BYTE *xbuf;816 DWORD header[2];817 WORD magic;814 HRESULT hr = E_FAIL; 815 ULONG xread; 816 BYTE *xbuf; 817 DWORD header[2]; 818 WORD magic; 818 819 ICOM_THIS_From_IPersistStream(OLEPictureImpl, iface); 819 820 … … 828 829 xbuf = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,header[1]); 829 830 while (xread < header[1]) { 830 ULONG nread; 831 ULONG nread; 831 832 hr = IStream_Read(pStm,xbuf+xread,header[1]-xread,&nread); 832 833 xread+=nread; … … 841 842 case 0xd8ff: { /* JPEG */ 842 843 #ifdef HAVE_LIBJPEG 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;844 struct jpeg_decompress_struct jd; 845 struct jpeg_error_mgr jerr; 846 int ret; 847 JDIMENSION x; 848 JSAMPROW samprow; 849 BITMAPINFOHEADER bmi; 850 LPBYTE bits; 851 HDC hdcref; 852 struct jpeg_source_mgr xjsm; 852 853 853 854 /* This is basically so we can use in-memory data for jpeg decompression. 854 855 * We need to have all the functions. 855 856 */ 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;857 xjsm.next_input_byte = xbuf; 858 xjsm.bytes_in_buffer = xread; 859 xjsm.init_source = _jpeg_init_source; 860 xjsm.fill_input_buffer = _jpeg_fill_input_buffer; 861 xjsm.skip_input_data = _jpeg_skip_input_data; 862 xjsm.resync_to_restart = _jpeg_resync_to_restart; 863 xjsm.term_source = _jpeg_term_source; 863 864 864 865 jd.err = jpeg_std_error(&jerr); … … 868 869 jpeg_start_decompress(&jd); 869 870 if (ret != JPEG_HEADER_OK) { 870 ERR("Jpeg image in stream has bad format, read header returned %d.\n",ret);871 HeapFree(GetProcessHeap(),0,xbuf);872 return E_FAIL;871 ERR("Jpeg image in stream has bad format, read header returned %d.\n",ret); 872 HeapFree(GetProcessHeap(),0,xbuf); 873 return E_FAIL; 873 874 } 874 875 bits = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(jd.output_height+1)*jd.output_width*jd.output_components); … … 877 878 x = jpeg_read_scanlines(&jd,&samprow,1); 878 879 if (x != 1) { 879 FIXME("failed to read current scanline?\n");880 break;880 FIXME("failed to read current scanline?\n"); 881 break; 881 882 } 882 883 memcpy( bits+jd.output_scanline*jd.output_width*jd.output_components, 883 samprow,884 jd.output_width*jd.output_components884 samprow, 885 jd.output_width*jd.output_components 885 886 ); 886 887 } 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;888 bmi.biSize = sizeof(bmi); 889 bmi.biWidth = jd.output_width; 890 bmi.biHeight = -jd.output_height; 891 bmi.biPlanes = 1; 892 bmi.biBitCount = jd.output_components<<3; 893 bmi.biCompression = BI_RGB; 894 bmi.biSizeImage = jd.output_height*jd.output_width*jd.output_components; 895 bmi.biXPelsPerMeter = 0; 896 bmi.biYPelsPerMeter = 0; 897 bmi.biClrUsed = 0; 898 bmi.biClrImportant = 0; 898 899 899 900 HeapFree(GetProcessHeap(),0,samprow); … … 902 903 hdcref = GetDC(0); 903 904 This->desc.u.bmp.hbitmap=CreateDIBitmap( 904 hdcref,905 &bmi,906 CBM_INIT,907 bits,908 (BITMAPINFO*)&bmi,909 DIB_RGB_COLORS905 hdcref, 906 &bmi, 907 CBM_INIT, 908 bits, 909 (BITMAPINFO*)&bmi, 910 DIB_RGB_COLORS 910 911 ); 911 912 DeleteDC(hdcref); … … 921 922 } 922 923 case 0x4d42: { /* Bitmap */ 923 BITMAPFILEHEADER *bfh = (BITMAPFILEHEADER*)xbuf;924 BITMAPINFO *bi = (BITMAPINFO*)(bfh+1);925 HDC hdcref;924 BITMAPFILEHEADER *bfh = (BITMAPFILEHEADER*)xbuf; 925 BITMAPINFO *bi = (BITMAPINFO*)(bfh+1); 926 HDC hdcref; 926 927 927 928 /* Does not matter whether this is a coreheader or not, we only use … … 930 931 hdcref = GetDC(0); 931 932 This->desc.u.bmp.hbitmap = CreateDIBitmap( 932 hdcref,933 &(bi->bmiHeader),934 CBM_INIT,935 xbuf+bfh->bfOffBits,936 bi,937 (bi->bmiHeader.biBitCount<=8)?DIB_PAL_COLORS:DIB_RGB_COLORS933 hdcref, 934 &(bi->bmiHeader), 935 CBM_INIT, 936 xbuf+bfh->bfOffBits, 937 bi, 938 (bi->bmiHeader.biBitCount<=8)?DIB_PAL_COLORS:DIB_RGB_COLORS 938 939 ); 939 940 DeleteDC(hdcref); … … 945 946 case 0x0000: { /* ICON , first word is dwReserved */ 946 947 HICON hicon; 947 CURSORICONFILEDIR *cifd = (CURSORICONFILEDIR*)xbuf;948 int i;948 CURSORICONFILEDIR *cifd = (CURSORICONFILEDIR*)xbuf; 949 int i; 949 950 950 951 /* … … 954 955 955 956 for (i=0;i<cifd->idCount;i++) { 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);957 FIXME("[%d] width %d\n",i,cifd->idEntries[i].bWidth); 958 FIXME("[%d] height %d\n",i,cifd->idEntries[i].bHeight); 959 FIXME("[%d] bColorCount %d\n",i,cifd->idEntries[i].bColorCount); 960 FIXME("[%d] bReserved %d\n",i,cifd->idEntries[i].bReserved); 961 FIXME("[%d] xHotspot %d\n",i,cifd->idEntries[i].xHotspot); 962 FIXME("[%d] yHotspot %d\n",i,cifd->idEntries[i].yHotspot); 963 FIXME("[%d] dwDIBSize %d\n",i,cifd->idEntries[i].dwDIBSize); 964 FIXME("[%d] dwDIBOffset %d\n",i,cifd->idEntries[i].dwDIBOffset); 964 965 } 965 966 */ … … 969 970 */ 970 971 if (cifd->idCount!=1) { 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; 972 for (i=0;i<cifd->idCount;i++) { 973 if (cifd->idEntries[i].bWidth == 32) 974 break; 976 975 } 976 if (i==cifd->idCount) i=0; 977 } 977 978 978 979 hicon = CreateIconFromResourceEx( 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 0980 xbuf+cifd->idEntries[i].dwDIBOffset, 981 cifd->idEntries[i].dwDIBSize, 982 TRUE, /* is icon */ 983 0x00030000, 984 cifd->idEntries[i].bWidth, 985 cifd->idEntries[i].bHeight, 986 0 986 987 ); 987 988 if (!hicon) { 988 FIXME("CreateIcon failed.\n");989 hr = E_FAIL;989 FIXME("CreateIcon failed.\n"); 990 hr = E_FAIL; 990 991 } else { 991 This->desc.picType = PICTYPE_ICON;992 This->desc.u.icon.hicon = hicon;993 hr = S_OK;992 This->desc.picType = PICTYPE_ICON; 993 This->desc.u.icon.hicon = hicon; 994 hr = S_OK; 994 995 } 995 996 break; … … 1074 1075 */ 1075 1076 static HRESULT WINAPI OLEPictureImpl_GetTypeInfoCount( 1076 IDispatch* iface, 1077 IDispatch* iface, 1077 1078 unsigned int* pctinfo) 1078 1079 { … … 1088 1089 */ 1089 1090 static HRESULT WINAPI OLEPictureImpl_GetTypeInfo( 1090 IDispatch* iface, 1091 IDispatch* iface, 1091 1092 UINT iTInfo, 1092 LCID lcid, 1093 LCID lcid, 1093 1094 ITypeInfo** ppTInfo) 1094 1095 { … … 1105 1106 static HRESULT WINAPI OLEPictureImpl_GetIDsOfNames( 1106 1107 IDispatch* iface, 1107 REFIID riid, 1108 LPOLESTR* rgszNames, 1109 UINT cNames, 1108 REFIID riid, 1109 LPOLESTR* rgszNames, 1110 UINT cNames, 1110 1111 LCID lcid, 1111 1112 DISPID* rgDispId) … … 1123 1124 static HRESULT WINAPI OLEPictureImpl_Invoke( 1124 1125 IDispatch* iface, 1125 DISPID dispIdMember, 1126 REFIID riid, 1127 LCID lcid, 1126 DISPID dispIdMember, 1127 REFIID riid, 1128 LCID lcid, 1128 1129 WORD wFlags, 1129 1130 DISPPARAMS* pDispParams, 1130 VARIANT* pVarResult, 1131 VARIANT* pVarResult, 1131 1132 EXCEPINFO* pExepInfo, 1132 1133 UINT* puArgErr) … … 1202 1203 */ 1203 1204 HRESULT WINAPI OleCreatePictureIndirect(LPPICTDESC lpPictDesc, REFIID riid, 1204 BOOL fOwn, LPVOID *ppvObj )1205 BOOL fOwn, LPVOID *ppvObj ) 1205 1206 { 1206 1207 OLEPictureImpl* newPict = NULL; … … 1244 1245 */ 1245 1246 HRESULT WINAPI OleLoadPicture( LPSTREAM lpstream, LONG lSize, BOOL fRunmode, 1246 REFIID riid, LPVOID *ppvObj )1247 REFIID riid, LPVOID *ppvObj ) 1247 1248 { 1248 1249 LPPERSISTSTREAM ps; 1249 IPicture *newpic;1250 IPicture *newpic; 1250 1251 HRESULT hr; 1251 1252 1252 1253 TRACE("(%p,%ld,%d,%s,%p), partially implemented.\n", 1253 lpstream, lSize, fRunmode, debugstr_guid(riid), ppvObj);1254 lpstream, lSize, fRunmode, debugstr_guid(riid), ppvObj); 1254 1255 1255 1256 hr = OleCreatePictureIndirect(NULL,riid,!fRunmode,(LPVOID*)&newpic); … … 1276 1277 */ 1277 1278 HRESULT WINAPI OleLoadPictureEx( LPSTREAM lpstream, LONG lSize, BOOL fRunmode, 1278 REFIID reed, DWORD xsiz, DWORD ysiz, DWORD flags, LPVOID *ppvObj )1279 REFIID reed, DWORD xsiz, DWORD ysiz, DWORD flags, LPVOID *ppvObj ) 1279 1280 { 1280 1281 FIXME("(%p,%ld,%d,%p,%lx,%lx,%lx,%p), not implemented\n", 1281 lpstream, lSize, fRunmode, reed, xsiz, ysiz, flags, ppvObj);1282 lpstream, lSize, fRunmode, reed, xsiz, ysiz, flags, ppvObj); 1282 1283 return S_OK; 1283 1284 } 1284 1285 1285 1286 #ifdef __WIN32OS2__ 1286 1287 … … 1308 1309 // ---------------------------------------------------------------------- 1309 1310 HRESULT WIN32API OleLoadPicturePath 1310 (LPOLESTR szURLorPath,1311 LPUNKNOWN punkCaller,1312 DWORD dwReserved,1313 OLE_COLOR clrReserved,1314 REFIID riid,1315 LPVOID * ppvRet )1311 (LPOLESTR szURLorPath, 1312 LPUNKNOWN punkCaller, 1313 DWORD dwReserved, 1314 OLE_COLOR clrReserved, 1315 REFIID riid, 1316 LPVOID * ppvRet ) 1316 1317 { 1317 1318 dprintf(("OLEAUT32: OleLoadPicturePath - stub")); -
trunk/src/oleaut32/parsedt.c
r4837 r6648 1 /* $Id: parsedt.c,v 1.2 2001-09-05 13:19:01 bird Exp $ */ 1 2 /* 2 3 PostgreSQL Data Base Management System (formerly known as Postgres, then … … 26 27 * 27 28 * dt.c-- 28 * Functions for the built-in type "dt".29 * Functions for the built-in type "dt". 29 30 * 30 31 * Copyright (c) 1994, Regents of the University of California … … 45 46 46 47 static datetkn *datebsearch(char *key, datetkn *base, unsigned int nel); 47 static int DecodeDate(char *str, int fmask, int *tmask, struct tm * tm);48 static int DecodeDate(char *str, int fmask, int *tmask, struct tm * tm); 48 49 static int DecodeNumber(int flen, char *field, 49 int fmask, int *tmask, struct tm * tm, double *fsec);50 int fmask, int *tmask, struct tm * tm, double *fsec); 50 51 static int DecodeNumberField(int len, char *str, 51 int fmask, int *tmask, struct tm * tm, double *fsec);52 static int DecodeSpecial(int field, char *lowtoken, int *val);52 int fmask, int *tmask, struct tm * tm, double *fsec); 53 static int DecodeSpecial(int field, char *lowtoken, int *val); 53 54 static int DecodeTime(char *str, int fmask, int *tmask, 54 struct tm * tm, double *fsec);55 static int DecodeTimezone(char *str, int *tzp);55 struct tm * tm, double *fsec); 56 static int DecodeTimezone(char *str, int *tzp); 56 57 57 58 #define USE_DATE_CACHE 1 … … 66 67 "Thursday", "Friday", "Saturday", NULL}; 67 68 68 /* those three vars are useless, and not even initialized, so 69 /* those three vars are useless, and not even initialized, so 69 70 * I'd rather remove them all (EPP) 70 71 */ 71 int DateStyle;72 bool EuroDates;73 int CTimeZone;72 int DateStyle; 73 bool EuroDates; 74 int CTimeZone; 74 75 75 76 #define UTIME_MINYEAR (1901) … … 91 92 92 93 /***************************************************************************** 93 * PRIVATE ROUTINES*94 * PRIVATE ROUTINES * 94 95 *****************************************************************************/ 95 96 96 97 /* definitions for squeezing values into "value" */ 97 #define ABS_SIGNBIT (char) 020098 #define VALMASK (char) 017799 #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))98 #define ABS_SIGNBIT (char) 0200 99 #define VALMASK (char) 0177 100 #define NEG(n) ((n)|ABS_SIGNBIT) 101 #define SIGNEDCHAR(c) ((c)&ABS_SIGNBIT? -((c)&VALMASK): (c)) 102 #define FROMVAL(tp) (-SIGNEDCHAR((tp)->value) * 10) /* uncompress */ 103 #define TOVAL(tp, v) ((tp)->value = ((v) < 0? NEG((-(v))/10): (v)/10)) 103 104 104 105 /* … … 108 109 */ 109 110 static datetkn datetktbl[] = { 110 /* text tokenlexval */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 "Invalid116 * 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 */111 /* text token lexval */ 112 {EARLY, RESERV, DTK_EARLY}, /* "-infinity" reserved for "early time" */ 113 {"acsst", DTZ, 63}, /* Cent. Australia */ 114 {"acst", TZ, 57}, /* Cent. Australia */ 115 {DA_D, ADBC, AD}, /* "ad" for years >= 0 */ 116 {"abstime", IGNOREFIELD, 0}, /* "abstime" for pre-v6.1 "Invalid 117 * Abstime" */ 118 {"adt", DTZ, NEG(18)}, /* Atlantic Daylight Time */ 119 {"aesst", DTZ, 66}, /* E. Australia */ 120 {"aest", TZ, 60}, /* Australia Eastern Std Time */ 121 {"ahst", TZ, 60}, /* Alaska-Hawaii Std Time */ 122 {"allballs", RESERV, DTK_ZULU}, /* 00:00:00 */ 123 {"am", AMPM, AM}, 124 {"apr", MONTH, 4}, 125 {"april", MONTH, 4}, 126 {"ast", TZ, NEG(24)}, /* Atlantic Std Time (Canada) */ 127 {"at", IGNOREFIELD, 0}, /* "at" (throwaway) */ 128 {"aug", MONTH, 8}, 129 {"august", MONTH, 8}, 130 {"awsst", DTZ, 54}, /* W. Australia */ 131 {"awst", TZ, 48}, /* W. Australia */ 132 {DB_C, ADBC, BC}, /* "bc" for years < 0 */ 133 {"bst", TZ, 6}, /* British Summer Time */ 134 {"bt", TZ, 18}, /* Baghdad Time */ 135 {"cadt", DTZ, 63}, /* Central Australian DST */ 136 {"cast", TZ, 57}, /* Central Australian ST */ 137 {"cat", TZ, NEG(60)}, /* Central Alaska Time */ 138 {"cct", TZ, 48}, /* China Coast */ 139 {"cdt", DTZ, NEG(30)}, /* Central Daylight Time */ 140 {"cet", TZ, 6}, /* Central European Time */ 141 {"cetdst", DTZ, 12}, /* Central European Dayl.Time */ 142 {"cst", TZ, NEG(36)}, /* Central Standard Time */ 143 {DCURRENT, RESERV, DTK_CURRENT}, /* "current" is always now */ 144 {"dec", MONTH, 12}, 145 {"december", MONTH, 12}, 146 {"dnt", TZ, 6}, /* Dansk Normal Tid */ 147 {"dow", RESERV, DTK_DOW}, /* day of week */ 148 {"doy", RESERV, DTK_DOY}, /* day of year */ 149 {"dst", DTZMOD, 6}, 150 {"east", TZ, NEG(60)}, /* East Australian Std Time */ 151 {"edt", DTZ, NEG(24)}, /* Eastern Daylight Time */ 152 {"eet", TZ, 12}, /* East. Europe, USSR Zone 1 */ 153 {"eetdst", DTZ, 18}, /* Eastern Europe */ 154 {EPOCH, RESERV, DTK_EPOCH}, /* "epoch" reserved for system epoch time */ 154 155 #if USE_AUSTRALIAN_RULES 155 {"est", TZ, 60},/* Australia Eastern Std Time */156 {"est", TZ, 60}, /* Australia Eastern Std Time */ 156 157 #else 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 invalid174 * 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 invalid239 * 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 */158 {"est", TZ, NEG(30)}, /* Eastern Standard Time */ 159 #endif 160 {"feb", MONTH, 2}, 161 {"february", MONTH, 2}, 162 {"fri", DOW, 5}, 163 {"friday", DOW, 5}, 164 {"fst", TZ, 6}, /* French Summer Time */ 165 {"fwt", DTZ, 12}, /* French Winter Time */ 166 {"gmt", TZ, 0}, /* Greenwish Mean Time */ 167 {"gst", TZ, 60}, /* Guam Std Time, USSR Zone 9 */ 168 {"hdt", DTZ, NEG(54)}, /* Hawaii/Alaska */ 169 {"hmt", DTZ, 18}, /* Hellas ? ? */ 170 {"hst", TZ, NEG(60)}, /* Hawaii Std Time */ 171 {"idle", TZ, 72}, /* Intl. Date Line, East */ 172 {"idlw", TZ, NEG(72)}, /* Intl. Date Line,, est */ 173 {LATE, RESERV, DTK_LATE}, /* "infinity" reserved for "late time" */ 174 {INVALID, RESERV, DTK_INVALID}, /* "invalid" reserved for invalid 175 * time */ 176 {"ist", TZ, 12}, /* Israel */ 177 {"it", TZ, 22}, /* Iran Time */ 178 {"jan", MONTH, 1}, 179 {"january", MONTH, 1}, 180 {"jst", TZ, 54}, /* Japan Std Time,USSR Zone 8 */ 181 {"jt", TZ, 45}, /* Java Time */ 182 {"jul", MONTH, 7}, 183 {"july", MONTH, 7}, 184 {"jun", MONTH, 6}, 185 {"june", MONTH, 6}, 186 {"kst", TZ, 54}, /* Korea Standard Time */ 187 {"ligt", TZ, 60}, /* From Melbourne, Australia */ 188 {"mar", MONTH, 3}, 189 {"march", MONTH, 3}, 190 {"may", MONTH, 5}, 191 {"mdt", DTZ, NEG(36)}, /* Mountain Daylight Time */ 192 {"mest", DTZ, 12}, /* Middle Europe Summer Time */ 193 {"met", TZ, 6}, /* Middle Europe Time */ 194 {"metdst", DTZ, 12}, /* Middle Europe Daylight Time */ 195 {"mewt", TZ, 6}, /* Middle Europe Winter Time */ 196 {"mez", TZ, 6}, /* Middle Europe Zone */ 197 {"mon", DOW, 1}, 198 {"monday", DOW, 1}, 199 {"mst", TZ, NEG(42)}, /* Mountain Standard Time */ 200 {"mt", TZ, 51}, /* Moluccas Time */ 201 {"ndt", DTZ, NEG(15)}, /* Nfld. Daylight Time */ 202 {"nft", TZ, NEG(21)}, /* Newfoundland Standard Time */ 203 {"nor", TZ, 6}, /* Norway Standard Time */ 204 {"nov", MONTH, 11}, 205 {"november", MONTH, 11}, 206 {NOW, RESERV, DTK_NOW}, /* current transaction time */ 207 {"nst", TZ, NEG(21)}, /* Nfld. Standard Time */ 208 {"nt", TZ, NEG(66)}, /* Nome Time */ 209 {"nzdt", DTZ, 78}, /* New Zealand Daylight Time */ 210 {"nzst", TZ, 72}, /* New Zealand Standard Time */ 211 {"nzt", TZ, 72}, /* New Zealand Time */ 212 {"oct", MONTH, 10}, 213 {"october", MONTH, 10}, 214 {"on", IGNOREFIELD, 0}, /* "on" (throwaway) */ 215 {"pdt", DTZ, NEG(42)}, /* Pacific Daylight Time */ 216 {"pm", AMPM, PM}, 217 {"pst", TZ, NEG(48)}, /* Pacific Standard Time */ 218 {"sadt", DTZ, 63}, /* S. Australian Dayl. Time */ 219 {"sast", TZ, 57}, /* South Australian Std Time */ 220 {"sat", DOW, 6}, 221 {"saturday", DOW, 6}, 222 {"sep", MONTH, 9}, 223 {"sept", MONTH, 9}, 224 {"september", MONTH, 9}, 225 {"set", TZ, NEG(6)}, /* Seychelles Time ?? */ 226 {"sst", DTZ, 12}, /* Swedish Summer Time */ 227 {"sun", DOW, 0}, 228 {"sunday", DOW, 0}, 229 {"swt", TZ, 6}, /* Swedish Winter Time */ 230 {"thu", DOW, 4}, 231 {"thur", DOW, 4}, 232 {"thurs", DOW, 4}, 233 {"thursday", DOW, 4}, 234 {TODAY, RESERV, DTK_TODAY}, /* midnight */ 235 {TOMORROW, RESERV, DTK_TOMORROW}, /* tomorrow midnight */ 236 {"tue", DOW, 2}, 237 {"tues", DOW, 2}, 238 {"tuesday", DOW, 2}, 239 {"undefined", RESERV, DTK_INVALID}, /* "undefined" pre-v6.1 invalid 240 * time */ 241 {"ut", TZ, 0}, 242 {"utc", TZ, 0}, 243 {"wadt", DTZ, 48}, /* West Australian DST */ 244 {"wast", TZ, 42}, /* West Australian Std Time */ 245 {"wat", TZ, NEG(6)}, /* West Africa Time */ 246 {"wdt", DTZ, 54}, /* West Australian DST */ 247 {"wed", DOW, 3}, 248 {"wednesday", DOW, 3}, 249 {"weds", DOW, 3}, 250 {"wet", TZ, 0}, /* Western Europe */ 251 {"wetdst", DTZ, 6}, /* Western Europe */ 252 {"wst", TZ, 48}, /* West Australian Std Time */ 253 {"ydt", DTZ, NEG(48)}, /* Yukon Daylight Time */ 254 {YESTERDAY, RESERV, DTK_YESTERDAY}, /* yesterday midnight */ 255 {"yst", TZ, NEG(54)}, /* Yukon Standard Time */ 256 {"zp4", TZ, NEG(24)}, /* GMT +4 hours. */ 257 {"zp5", TZ, NEG(30)}, /* GMT +5 hours. */ 258 {"zp6", TZ, NEG(36)}, /* GMT +6 hours. */ 259 {"z", RESERV, DTK_ZULU}, /* 00:00:00 */ 260 {ZULU, RESERV, DTK_ZULU}, /* 00:00:00 */ 260 261 }; 261 262 … … 275 276 * Calendar time to Julian date conversions. 276 277 * Julian date is commonly used in astronomical applications, 277 * since it is numerically accurate and computationally simple.278 * since it is numerically accurate and computationally simple. 278 279 * The algorithms here will accurately convert between Julian day 279 * and calendar date for all non-negative Julian days280 * (i.e. from Nov 23, -4713 on).280 * and calendar date for all non-negative Julian days 281 * (i.e. from Nov 23, -4713 on). 281 282 * 282 283 * Ref: Explanatory Supplement to the Astronomical Almanac, 1992. 283 * University Science Books, 20 Edgehill Rd. Mill Valley CA 94941.284 * University Science Books, 20 Edgehill Rd. Mill Valley CA 94941. 284 285 * 285 286 * Use the algorithm by Henry Fliegel, a former NASA/JPL colleague 286 * now at Aerospace Corp. (hi, Henry!)287 * now at Aerospace Corp. (hi, Henry!) 287 288 * 288 289 * These routines will be used by other date/time packages - tgl 97/02/25 … … 290 291 291 292 /* Set the minimum year to one greater than the year of the first valid day 292 * to avoid having to check year and day both. - tgl 97/05/08293 * to avoid having to check year and day both. - tgl 97/05/08 293 294 */ 294 295 … … 304 305 date2j(int y, int m, int d) 305 306 { 306 intm12 = (m - 14) / 12;307 308 return ((1461 * (y + 4800 + m12)) / 4 + (367 * (m - 2 - 12 * (m12))) / 12309 - (3 * ((y + 4900 + m12) / 100)) / 4 + d - 32075);310 } /* date2j() */307 int m12 = (m - 14) / 12; 308 309 return ((1461 * (y + 4800 + m12)) / 4 + (367 * (m - 2 - 12 * (m12))) / 12 310 - (3 * ((y + 4900 + m12) / 100)) / 4 + d - 32075); 311 } /* date2j() */ 311 312 312 313 void 313 314 j2date(int jd, int *year, int *month, int *day) 314 315 { 315 intj,316 y,317 m,318 d;319 320 inti,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() */316 int j, 317 y, 318 m, 319 d; 320 321 int i, 322 l, 323 n; 324 325 l = jd + 68569; 326 n = (4 * l) / 146097; 327 l -= (146097 * n + 3) / 4; 328 i = (4000 * (l + 1)) / 1461001; 329 l += 31 - (1461 * i) / 4; 330 j = (80 * l) / 2447; 331 d = l - (2447 * j) / 80; 332 l = j / 11; 333 m = (j + 2) - (12 * l); 334 y = 100 * (n - 49) + i + l; 335 336 *year = y; 337 *month = m; 338 *day = d; 339 return; 340 } /* j2date() */ 340 341 341 342 … … 353 354 int 354 355 ParseDateTime(char *timestr, char *lowstr, 355 char **field, int *ftype, int maxfields, int *numfields)356 char **field, int *ftype, int maxfields, int *numfields) 356 357 { 357 intnf = 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, or394 * day later395 */396 else397 ftype[nf] = DTK_NUMBER;398 399 }400 401 /*402 * text? then date string, month, day of week, special, or403 * timezone404 */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 else455 return -1;456 457 /* ignore punctuation but use as delimiter */458 }459 else if (ispunct(*cp))460 {461 cp++;462 continue;463 464 }465 else466 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() */358 int nf = 0; 359 char *cp = timestr; 360 char *lp = lowstr; 361 362 #ifdef DATEDEBUG 363 printf("ParseDateTime- input string is %s\n", timestr); 364 #endif 365 /* outer loop through fields */ 366 while (*cp != '\0') 367 { 368 field[nf] = lp; 369 370 /* leading digit? then date or time */ 371 if (isdigit(*cp) || (*cp == '.')) 372 { 373 *lp++ = *cp++; 374 while (isdigit(*cp)) 375 *lp++ = *cp++; 376 /* time field? */ 377 if (*cp == ':') 378 { 379 ftype[nf] = DTK_TIME; 380 while (isdigit(*cp) || (*cp == ':') || (*cp == '.')) 381 *lp++ = *cp++; 382 383 } 384 /* date field? allow embedded text month */ 385 else if ((*cp == '-') || (*cp == '/') || (*cp == '.')) 386 { 387 ftype[nf] = DTK_DATE; 388 while (isalnum(*cp) || (*cp == '-') || (*cp == '/') || (*cp == '.')) 389 *lp++ = tolower(*cp++); 390 391 } 392 393 /* 394 * otherwise, number only and will determine year, month, or 395 * day later 396 */ 397 else 398 ftype[nf] = DTK_NUMBER; 399 400 } 401 402 /* 403 * text? then date string, month, day of week, special, or 404 * timezone 405 */ 406 else if (isalpha(*cp)) 407 { 408 ftype[nf] = DTK_STRING; 409 *lp++ = tolower(*cp++); 410 while (isalpha(*cp)) 411 *lp++ = tolower(*cp++); 412 413 /* full date string with leading text month? */ 414 if ((*cp == '-') || (*cp == '/') || (*cp == '.')) 415 { 416 ftype[nf] = DTK_DATE; 417 while (isdigit(*cp) || (*cp == '-') || (*cp == '/') || (*cp == '.')) 418 *lp++ = tolower(*cp++); 419 } 420 421 /* skip leading spaces */ 422 } 423 else if (isspace(*cp)) 424 { 425 cp++; 426 continue; 427 428 /* sign? then special or numeric timezone */ 429 } 430 else if ((*cp == '+') || (*cp == '-')) 431 { 432 *lp++ = *cp++; 433 /* soak up leading whitespace */ 434 while (isspace(*cp)) 435 cp++; 436 /* numeric timezone? */ 437 if (isdigit(*cp)) 438 { 439 ftype[nf] = DTK_TZ; 440 *lp++ = *cp++; 441 while (isdigit(*cp) || (*cp == ':')) 442 *lp++ = *cp++; 443 444 /* special? */ 445 } 446 else if (isalpha(*cp)) 447 { 448 ftype[nf] = DTK_SPECIAL; 449 *lp++ = tolower(*cp++); 450 while (isalpha(*cp)) 451 *lp++ = tolower(*cp++); 452 453 /* otherwise something wrong... */ 454 } 455 else 456 return -1; 457 458 /* ignore punctuation but use as delimiter */ 459 } 460 else if (ispunct(*cp)) 461 { 462 cp++; 463 continue; 464 465 } 466 else 467 return -1; 468 469 /* force in a delimiter */ 470 *lp++ = '\0'; 471 nf++; 472 if (nf > MAXDATEFIELDS) 473 return -1; 474 #ifdef DATEDEBUG 475 printf("ParseDateTime- set field[%d] to %s type %d\n", (nf - 1), field[nf - 1], ftype[nf - 1]); 476 #endif 477 } 478 479 *numfields = nf; 480 481 return 0; 482 } /* ParseDateTime() */ 482 483 483 484 … … 485 486 * Interpret previously parsed fields for general date and time. 486 487 * Return 0 if full date, 1 if only time, and -1 if problems. 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"488 * External format(s): 489 * "<weekday> <month>-<day>-<year> <hour>:<minute>:<second>" 490 * "Fri Feb-7-1997 15:23:27" 491 * "Feb-7-1997 15:23:27" 492 * "2-7-1997 15:23:27" 493 * "1997-2-7 15:23:27" 494 * "1997.038 15:23:27" (day of year 1-366) 495 * Also supports input in compact time: 496 * "970207 152327" 497 * "97038 152327" 497 498 * 498 499 * Use the system-provided functions to get the current time zone 499 * if not specified in the input string.500 * if not specified in the input string. 500 501 * If the date is outside the time_t system-supported time range, 501 * then assume GMT time zone. - tgl 97/05/27502 * then assume GMT time zone. - tgl 97/05/27 502 503 */ 503 504 int 504 505 DecodeDateTime(char **field, int *ftype, int nf, 505 int *dtype, struct tm * tm, double *fsec, int *tzp)506 int *dtype, struct tm * tm, double *fsec, int *tzp) 506 507 { 507 intfmask = 0,508 tmask,509 type;510 inti;511 intflen,512 val;513 intmer = HR24;514 intbc = 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 status522 * 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 in544 * 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 else568 {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 "MET608 * 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 later622 * when getting default timezone623 */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? then699 * error700 */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 {508 int fmask = 0, 509 tmask, 510 type; 511 int i; 512 int flen, 513 val; 514 int mer = HR24; 515 int bc = FALSE; 516 517 *dtype = DTK_DATE; 518 tm->tm_hour = 0; 519 tm->tm_min = 0; 520 tm->tm_sec = 0; 521 *fsec = 0; 522 tm->tm_isdst = -1; /* don't know daylight savings time status 523 * apriori */ 524 if (tzp != NULL) 525 *tzp = 0; 526 527 for (i = 0; i < nf; i++) 528 { 529 #ifdef DATEDEBUG 530 printf("DecodeDateTime- field[%d] is %s (type %d)\n", i, field[i], ftype[i]); 531 #endif 532 switch (ftype[i]) 533 { 534 case DTK_DATE: 535 if (DecodeDate(field[i], fmask, &tmask, tm) != 0) 536 return -1; 537 break; 538 539 case DTK_TIME: 540 if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0) 541 return -1; 542 543 /* 544 * check upper limit on hours; other limits checked in 545 * DecodeTime() 546 */ 547 if (tm->tm_hour > 23) 548 return -1; 549 break; 550 551 case DTK_TZ: 552 if (tzp == NULL) 553 return -1; 554 if (DecodeTimezone(field[i], tzp) != 0) 555 return -1; 556 tmask = DTK_M(TZ); 557 break; 558 559 case DTK_NUMBER: 560 flen = strlen(field[i]); 561 562 if (flen > 4) 563 { 564 if (DecodeNumberField(flen, field[i], fmask, &tmask, tm, fsec) != 0) 565 return -1; 566 567 } 568 else 569 { 570 if (DecodeNumber(flen, field[i], fmask, &tmask, tm, fsec) != 0) 571 return -1; 572 } 573 break; 574 575 case DTK_STRING: 576 case DTK_SPECIAL: 577 type = DecodeSpecial(i, field[i], &val); 578 #ifdef DATEDEBUG 579 printf("DecodeDateTime- special field[%d] %s type=%d value=%d\n", i, field[i], type, val); 580 #endif 581 if (type == IGNOREFIELD) 582 continue; 583 584 tmask = DTK_M(type); 585 switch (type) 586 { 587 case RESERV: 588 #ifdef DATEDEBUG 589 printf("DecodeDateTime- RESERV field %s value is %d\n", field[i], val); 590 #endif 591 switch (val) 592 { 593 594 default: 595 *dtype = val; 596 } 597 598 break; 599 600 case MONTH: 601 #ifdef DATEDEBUG 602 printf("DecodeDateTime- month field %s value is %d\n", field[i], val); 603 #endif 604 tm->tm_mon = val; 605 break; 606 607 /* 608 * daylight savings time modifier (solves "MET 609 * DST" syntax) 610 */ 611 case DTZMOD: 612 tmask |= DTK_M(DTZ); 613 tm->tm_isdst = 1; 614 if (tzp == NULL) 615 return -1; 616 *tzp += val * 60; 617 break; 618 619 case DTZ: 620 621 /* 622 * set mask for TZ here _or_ check for DTZ later 623 * when getting default timezone 624 */ 625 tmask |= DTK_M(TZ); 626 tm->tm_isdst = 1; 627 if (tzp == NULL) 628 return -1; 629 *tzp = val * 60; 630 break; 631 632 case TZ: 633 tm->tm_isdst = 0; 634 if (tzp == NULL) 635 return -1; 636 *tzp = val * 60; 637 break; 638 639 case IGNOREFIELD: 640 break; 641 642 case AMPM: 643 mer = val; 644 break; 645 646 case ADBC: 647 bc = (val == BC); 648 break; 649 650 case DOW: 651 tm->tm_wday = val; 652 break; 653 654 default: 655 return -1; 656 } 657 break; 658 659 default: 660 return -1; 661 } 662 663 #ifdef DATEDEBUG 664 printf("DecodeDateTime- field[%d] %s (%08x/%08x) value is %d\n", 665 i, field[i], fmask, tmask, val); 666 #endif 667 668 if (tmask & fmask) 669 return -1; 670 fmask |= tmask; 671 } 672 673 /* there is no year zero in AD/BC notation; i.e. "1 BC" == year 0 */ 674 if (bc) 675 tm->tm_year = -(tm->tm_year - 1); 676 677 if ((mer != HR24) && (tm->tm_hour > 12)) 678 return -1; 679 if ((mer == AM) && (tm->tm_hour == 12)) 680 tm->tm_hour = 0; 681 else if ((mer == PM) && (tm->tm_hour != 12)) 682 tm->tm_hour += 12; 683 684 #ifdef DATEDEBUG 685 printf("DecodeDateTime- mask %08x (%08x)", fmask, DTK_DATE_M); 686 printf(" set y%04d m%02d d%02d", tm->tm_year, tm->tm_mon, tm->tm_mday); 687 printf(" %02d:%02d:%02d\n", tm->tm_hour, tm->tm_min, tm->tm_sec); 688 #endif 689 690 if ((*dtype == DTK_DATE) && ((fmask & DTK_DATE_M) != DTK_DATE_M)) 691 return ((fmask & DTK_TIME_M) == DTK_TIME_M) ? 1 : -1; 692 693 /* timezone not specified? then find local timezone if possible */ 694 if ((*dtype == DTK_DATE) && ((fmask & DTK_DATE_M) == DTK_DATE_M) 695 && (tzp != NULL) && (!(fmask & DTK_M(TZ)))) 696 { 697 698 /* 699 * daylight savings time modifier but no standard timezone? then 700 * error 701 */ 702 if (fmask & DTK_M(DTZMOD)) 703 return -1; 704 705 if (IS_VALID_UTIME(tm->tm_year, tm->tm_mon, tm->tm_mday)) 706 { 706 707 #ifdef USE_POSIX_TIME 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;708 tm->tm_year -= 1900; 709 tm->tm_mon -= 1; 710 tm->tm_isdst = -1; 711 mktime(tm); 712 tm->tm_year += 1900; 713 tm->tm_mon += 1; 713 714 714 715 #ifdef HAVE_INT_TIMEZONE 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 else726 {727 tm->tm_isdst = 0;728 *tzp = 0;729 }730 }731 732 return 0;733 } /* DecodeDateTime() */716 *tzp = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone); 717 718 #else /* !HAVE_INT_TIMEZONE */ 719 *tzp = -(tm->tm_gmtoff); /* tm_gmtoff is Sun/DEC-ism */ 720 #endif 721 722 #else /* !USE_POSIX_TIME */ 723 *tzp = CTimeZone; 724 #endif 725 } 726 else 727 { 728 tm->tm_isdst = 0; 729 *tzp = 0; 730 } 731 } 732 733 return 0; 734 } /* DecodeDateTime() */ 734 735 735 736 … … 740 741 DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct tm * tm, double *fsec) 741 742 { 742 intfmask,743 tmask,744 type;745 inti;746 intflen,747 val;748 intmer = 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 status755 * 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() */743 int fmask, 744 tmask, 745 type; 746 int i; 747 int flen, 748 val; 749 int mer = HR24; 750 751 *dtype = DTK_TIME; 752 tm->tm_hour = 0; 753 tm->tm_min = 0; 754 tm->tm_sec = 0; 755 tm->tm_isdst = -1; /* don't know daylight savings time status 756 * apriori */ 757 *fsec = 0; 758 759 fmask = DTK_DATE_M; 760 761 for (i = 0; i < nf; i++) 762 { 763 #ifdef DATEDEBUG 764 printf("DecodeTimeOnly- field[%d] is %s (type %d)\n", i, field[i], ftype[i]); 765 #endif 766 switch (ftype[i]) 767 { 768 case DTK_TIME: 769 if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0) 770 return -1; 771 break; 772 773 case DTK_NUMBER: 774 flen = strlen(field[i]); 775 776 if (DecodeNumberField(flen, field[i], fmask, &tmask, tm, fsec) != 0) 777 return -1; 778 break; 779 780 case DTK_STRING: 781 case DTK_SPECIAL: 782 type = DecodeSpecial(i, field[i], &val); 783 #ifdef DATEDEBUG 784 printf("DecodeTimeOnly- special field[%d] %s type=%d value=%d\n", i, field[i], type, val); 785 #endif 786 if (type == IGNOREFIELD) 787 continue; 788 789 tmask = DTK_M(type); 790 switch (type) 791 { 792 case RESERV: 793 #ifdef DATEDEBUG 794 printf("DecodeTimeOnly- RESERV field %s value is %d\n", field[i], val); 795 #endif 796 switch (val) 797 { 798 799 default: 800 return -1; 801 } 802 803 break; 804 805 case IGNOREFIELD: 806 break; 807 808 case AMPM: 809 mer = val; 810 break; 811 812 default: 813 return -1; 814 } 815 break; 816 817 default: 818 return -1; 819 } 820 821 if (tmask & fmask) 822 return -1; 823 fmask |= tmask; 824 825 #ifdef DATEDEBUG 826 printf("DecodeTimeOnly- field[%d] %s value is %d\n", i, field[i], val); 827 #endif 828 } 829 830 #ifdef DATEDEBUG 831 printf("DecodeTimeOnly- mask %08x (%08x)", fmask, DTK_TIME_M); 832 printf(" %02d:%02d:%02d (%f)\n", tm->tm_hour, tm->tm_min, tm->tm_sec, *fsec); 833 #endif 834 835 if ((mer != HR24) && (tm->tm_hour > 12)) 836 return -1; 837 if ((mer == AM) && (tm->tm_hour == 12)) 838 tm->tm_hour = 0; 839 else if ((mer == PM) && (tm->tm_hour != 12)) 840 tm->tm_hour += 12; 841 842 if ((fmask & DTK_TIME_M) != DTK_TIME_M) 843 return -1; 844 845 return 0; 846 } /* DecodeTimeOnly() */ 846 847 847 848 … … 853 854 DecodeDate(char *str, int fmask, int *tmask, struct tm * tm) 854 855 { 855 doublefsec;856 857 intnf = 0;858 inti,859 len;860 inttype,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() */856 double fsec; 857 858 int nf = 0; 859 int i, 860 len; 861 int type, 862 val, 863 dmask = 0; 864 char *field[MAXDATEFIELDS]; 865 866 /* parse this string... */ 867 while ((*str != '\0') && (nf < MAXDATEFIELDS)) 868 { 869 /* skip field separators */ 870 while (!isalnum(*str)) 871 str++; 872 873 field[nf] = str; 874 if (isdigit(*str)) 875 { 876 while (isdigit(*str)) 877 str++; 878 } 879 else if (isalpha(*str)) 880 { 881 while (isalpha(*str)) 882 str++; 883 } 884 885 if (*str != '\0') 886 *str++ = '\0'; 887 nf++; 888 } 889 890 /* don't allow too many fields */ 891 if (nf > 3) 892 return -1; 893 894 *tmask = 0; 895 896 /* look first for text fields, since that will be unambiguous month */ 897 for (i = 0; i < nf; i++) 898 { 899 if (isalpha(*field[i])) 900 { 901 type = DecodeSpecial(i, field[i], &val); 902 if (type == IGNOREFIELD) 903 continue; 904 905 dmask = DTK_M(type); 906 switch (type) 907 { 908 case MONTH: 909 #ifdef DATEDEBUG 910 printf("DecodeDate- month field %s value is %d\n", field[i], val); 911 #endif 912 tm->tm_mon = val; 913 break; 914 915 default: 916 #ifdef DATEDEBUG 917 printf("DecodeDate- illegal field %s value is %d\n", field[i], val); 918 #endif 919 return -1; 920 } 921 if (fmask & dmask) 922 return -1; 923 924 fmask |= dmask; 925 *tmask |= dmask; 926 927 /* mark this field as being completed */ 928 field[i] = NULL; 929 } 930 } 931 932 /* now pick up remaining numeric fields */ 933 for (i = 0; i < nf; i++) 934 { 935 if (field[i] == NULL) 936 continue; 937 938 if ((len = strlen(field[i])) <= 0) 939 return -1; 940 941 if (DecodeNumber(len, field[i], fmask, &dmask, tm, &fsec) != 0) 942 return -1; 943 944 if (fmask & dmask) 945 return -1; 946 947 fmask |= dmask; 948 *tmask |= dmask; 949 } 950 951 return 0; 952 } /* DecodeDate() */ 952 953 953 954 … … 955 956 * Decode time string which includes delimiters. 956 957 * Only check the lower limit on hours, since this same code 957 * can be used to represent time spans.958 * can be used to represent time spans. 958 959 */ 959 960 static int 960 961 DecodeTime(char *str, int fmask, int *tmask, struct tm * tm, double *fsec) 961 962 { 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 else983 {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 else996 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() */963 char *cp; 964 965 *tmask = DTK_TIME_M; 966 967 tm->tm_hour = strtol(str, &cp, 10); 968 if (*cp != ':') 969 return -1; 970 str = cp + 1; 971 tm->tm_min = strtol(str, &cp, 10); 972 if (*cp == '\0') 973 { 974 tm->tm_sec = 0; 975 *fsec = 0; 976 977 } 978 else if (*cp != ':') 979 { 980 return -1; 981 982 } 983 else 984 { 985 str = cp + 1; 986 tm->tm_sec = strtol(str, &cp, 10); 987 if (*cp == '\0') 988 *fsec = 0; 989 else if (*cp == '.') 990 { 991 str = cp; 992 *fsec = strtod(str, &cp); 993 if (cp == str) 994 return -1; 995 } 996 else 997 return -1; 998 } 999 1000 /* do a sanity check */ 1001 if ((tm->tm_hour < 0) 1002 || (tm->tm_min < 0) || (tm->tm_min > 59) 1003 || (tm->tm_sec < 0) || (tm->tm_sec > 59)) 1004 return -1; 1005 1006 return 0; 1007 } /* DecodeTime() */ 1007 1008 1008 1009 … … 1013 1014 DecodeNumber(int flen, char *str, int fmask, int *tmask, struct tm * tm, double *fsec) 1014 1015 { 1015 intval;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 else1126 return -1;1127 1128 return 0;1129 } /* DecodeNumber() */1016 int val; 1017 char *cp; 1018 1019 *tmask = 0; 1020 1021 val = strtol(str, &cp, 10); 1022 if (cp == str) 1023 return -1; 1024 if (*cp == '.') 1025 { 1026 *fsec = strtod(cp, &cp); 1027 if (*cp != '\0') 1028 return -1; 1029 } 1030 1031 #ifdef DATEDEBUG 1032 printf("DecodeNumber- %s is %d fmask=%08x tmask=%08x\n", str, val, fmask, *tmask); 1033 #endif 1034 1035 /* enough digits to be unequivocal year? */ 1036 if (flen == 4) 1037 { 1038 #ifdef DATEDEBUG 1039 printf("DecodeNumber- match %d (%s) as year\n", val, str); 1040 #endif 1041 *tmask = DTK_M(YEAR); 1042 1043 /* already have a year? then see if we can substitute... */ 1044 if (fmask & DTK_M(YEAR)) 1045 { 1046 if ((!(fmask & DTK_M(DAY))) 1047 && ((tm->tm_year >= 1) && (tm->tm_year <= 31))) 1048 { 1049 #ifdef DATEDEBUG 1050 printf("DecodeNumber- misidentified year previously; swap with day %d\n", tm->tm_mday); 1051 #endif 1052 tm->tm_mday = tm->tm_year; 1053 *tmask = DTK_M(DAY); 1054 } 1055 } 1056 1057 tm->tm_year = val; 1058 1059 /* special case day of year? */ 1060 } 1061 else if ((flen == 3) && (fmask & DTK_M(YEAR)) 1062 && ((val >= 1) && (val <= 366))) 1063 { 1064 *tmask = (DTK_M(DOY) | DTK_M(MONTH) | DTK_M(DAY)); 1065 tm->tm_yday = val; 1066 j2date((date2j(tm->tm_year, 1, 1) + tm->tm_yday - 1), 1067 &tm->tm_year, &tm->tm_mon, &tm->tm_mday); 1068 1069 /* already have year? then could be month */ 1070 } 1071 else if ((fmask & DTK_M(YEAR)) && (!(fmask & DTK_M(MONTH))) 1072 && ((val >= 1) && (val <= 12))) 1073 { 1074 #ifdef DATEDEBUG 1075 printf("DecodeNumber- match %d (%s) as month\n", val, str); 1076 #endif 1077 *tmask = DTK_M(MONTH); 1078 tm->tm_mon = val; 1079 1080 /* no year and EuroDates enabled? then could be day */ 1081 } 1082 else if ((EuroDates || (fmask & DTK_M(MONTH))) 1083 && (!(fmask & DTK_M(YEAR)) && !(fmask & DTK_M(DAY))) 1084 && ((val >= 1) && (val <= 31))) 1085 { 1086 #ifdef DATEDEBUG 1087 printf("DecodeNumber- match %d (%s) as day\n", val, str); 1088 #endif 1089 *tmask = DTK_M(DAY); 1090 tm->tm_mday = val; 1091 1092 } 1093 else if ((!(fmask & DTK_M(MONTH))) 1094 && ((val >= 1) && (val <= 12))) 1095 { 1096 #ifdef DATEDEBUG 1097 printf("DecodeNumber- (2) match %d (%s) as month\n", val, str); 1098 #endif 1099 *tmask = DTK_M(MONTH); 1100 tm->tm_mon = val; 1101 1102 } 1103 else if ((!(fmask & DTK_M(DAY))) 1104 && ((val >= 1) && (val <= 31))) 1105 { 1106 #ifdef DATEDEBUG 1107 printf("DecodeNumber- (2) match %d (%s) as day\n", val, str); 1108 #endif 1109 *tmask = DTK_M(DAY); 1110 tm->tm_mday = val; 1111 1112 } 1113 else if (!(fmask & DTK_M(YEAR))) 1114 { 1115 #ifdef DATEDEBUG 1116 printf("DecodeNumber- (2) match %d (%s) as year\n", val, str); 1117 #endif 1118 *tmask = DTK_M(YEAR); 1119 tm->tm_year = val; 1120 if (tm->tm_year < 70) 1121 tm->tm_year += 2000; 1122 else if (tm->tm_year < 100) 1123 tm->tm_year += 1900; 1124 1125 } 1126 else 1127 return -1; 1128 1129 return 0; 1130 } /* DecodeNumber() */ 1130 1131 1131 1132 … … 1136 1137 DecodeNumberField(int len, char *str, int fmask, int *tmask, struct tm * tm, double *fsec) 1137 1138 { 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 else1176 {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 else1207 return -1;1208 1209 return 0;1210 } /* DecodeNumberField() */1139 char *cp; 1140 1141 /* yyyymmdd? */ 1142 if (len == 8) 1143 { 1144 #ifdef DATEDEBUG 1145 printf("DecodeNumberField- %s is 8 character date fmask=%08x tmask=%08x\n", str, fmask, *tmask); 1146 #endif 1147 1148 *tmask = DTK_DATE_M; 1149 1150 tm->tm_mday = atoi(str + 6); 1151 *(str + 6) = '\0'; 1152 tm->tm_mon = atoi(str + 4); 1153 *(str + 4) = '\0'; 1154 tm->tm_year = atoi(str + 0); 1155 1156 /* yymmdd or hhmmss? */ 1157 } 1158 else if (len == 6) 1159 { 1160 #ifdef DATEDEBUG 1161 printf("DecodeNumberField- %s is 6 characters fmask=%08x tmask=%08x\n", str, fmask, *tmask); 1162 #endif 1163 if (fmask & DTK_DATE_M) 1164 { 1165 #ifdef DATEDEBUG 1166 printf("DecodeNumberField- %s is time field fmask=%08x tmask=%08x\n", str, fmask, *tmask); 1167 #endif 1168 *tmask = DTK_TIME_M; 1169 tm->tm_sec = atoi(str + 4); 1170 *(str + 4) = '\0'; 1171 tm->tm_min = atoi(str + 2); 1172 *(str + 2) = '\0'; 1173 tm->tm_hour = atoi(str + 0); 1174 1175 } 1176 else 1177 { 1178 #ifdef DATEDEBUG 1179 printf("DecodeNumberField- %s is date field fmask=%08x tmask=%08x\n", str, fmask, *tmask); 1180 #endif 1181 *tmask = DTK_DATE_M; 1182 tm->tm_mday = atoi(str + 4); 1183 *(str + 4) = '\0'; 1184 tm->tm_mon = atoi(str + 2); 1185 *(str + 2) = '\0'; 1186 tm->tm_year = atoi(str + 0); 1187 } 1188 1189 } 1190 else if (strchr(str, '.') != NULL) 1191 { 1192 #ifdef DATEDEBUG 1193 printf("DecodeNumberField- %s is time field fmask=%08x tmask=%08x\n", str, fmask, *tmask); 1194 #endif 1195 *tmask = DTK_TIME_M; 1196 tm->tm_sec = strtod((str + 4), &cp); 1197 if (cp == (str + 4)) 1198 return -1; 1199 if (*cp == '.') 1200 *fsec = strtod(cp, NULL); 1201 *(str + 4) = '\0'; 1202 tm->tm_min = strtod((str + 2), &cp); 1203 *(str + 2) = '\0'; 1204 tm->tm_hour = strtod((str + 0), &cp); 1205 1206 } 1207 else 1208 return -1; 1209 1210 return 0; 1211 } /* DecodeNumberField() */ 1211 1212 1212 1213 … … 1217 1218 DecodeTimezone(char *str, int *tzp) 1218 1219 { 1219 inttz;1220 inthr,1221 min;1222 char*cp;1223 intlen;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 else1243 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() */1220 int tz; 1221 int hr, 1222 min; 1223 char *cp; 1224 int len; 1225 1226 /* assume leading character is "+" or "-" */ 1227 hr = strtol((str + 1), &cp, 10); 1228 1229 /* explicit delimiter? */ 1230 if (*cp == ':') 1231 { 1232 min = strtol((cp + 1), &cp, 10); 1233 1234 /* otherwise, might have run things together... */ 1235 } 1236 else if ((*cp == '\0') && ((len = strlen(str)) > 3)) 1237 { 1238 min = strtol((str + len - 2), &cp, 10); 1239 *(str + len - 2) = '\0'; 1240 hr = strtol((str + 1), &cp, 10); 1241 1242 } 1243 else 1244 min = 0; 1245 1246 tz = (hr * 60 + min) * 60; 1247 if (*str == '-') 1248 tz = -tz; 1249 1250 *tzp = -tz; 1251 return *cp != '\0'; 1252 } /* DecodeTimezone() */ 1252 1253 1253 1254 … … 1255 1256 * Decode text string using lookup table. 1256 1257 * Implement a cache lookup since it is likely that dates 1257 * will be related in format.1258 * will be related in format. 1258 1259 */ 1259 1260 static int 1260 1261 DecodeSpecial(int field, char *lowtoken, int *val) 1261 1262 { 1262 inttype;1263 datetkn *tp;1263 int type; 1264 datetkn *tp; 1264 1265 1265 1266 #if USE_DATE_CACHE 1266 if ((datecache[field] != NULL)1267 && (strncmp(lowtoken, datecache[field]->token, TOKMAXLEN) == 0))1268 tp = datecache[field];1269 else1270 {1271 #endif 1272 tp = datebsearch(lowtoken, datetktbl, szdatetktbl);1267 if ((datecache[field] != NULL) 1268 && (strncmp(lowtoken, datecache[field]->token, TOKMAXLEN) == 0)) 1269 tp = datecache[field]; 1270 else 1271 { 1272 #endif 1273 tp = datebsearch(lowtoken, datetktbl, szdatetktbl); 1273 1274 #if USE_DATE_CACHE 1274 }1275 datecache[field] = tp;1276 #endif 1277 if (tp == NULL)1278 {1279 type = IGNOREFIELD;1280 *val = 0;1281 }1282 else1283 {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() */1275 } 1276 datecache[field] = tp; 1277 #endif 1278 if (tp == NULL) 1279 { 1280 type = IGNOREFIELD; 1281 *val = 0; 1282 } 1283 else 1284 { 1285 type = tp->type; 1286 switch (type) 1287 { 1288 case TZ: 1289 case DTZ: 1290 case DTZMOD: 1291 *val = FROMVAL(tp); 1292 break; 1293 1294 default: 1295 *val = tp->value; 1296 break; 1297 } 1298 } 1299 1300 return type; 1301 } /* DecodeSpecial() */ 1301 1302 1302 1303 … … 1309 1310 datebsearch(char *key, datetkn *base, unsigned int nel) 1310 1311 { 1311 datetkn *last = base + nel - 1,1312 *position;1313 intresult;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 else1328 base = position + 1;1329 }1330 return NULL;1312 datetkn *last = base + nel - 1, 1313 *position; 1314 int result; 1315 1316 while (last >= base) 1317 { 1318 position = base + ((last - base) >> 1); 1319 result = key[0] - position->token[0]; 1320 if (result == 0) 1321 { 1322 result = strncmp(key, position->token, TOKMAXLEN); 1323 if (result == 0) 1324 return position; 1325 } 1326 if (result < 0) 1327 last = position - 1; 1328 else 1329 base = position + 1; 1330 } 1331 return NULL; 1331 1332 } 1332 1333 -
trunk/src/oleaut32/safearray.c
r6507 r6648 1 /* $Id: safearray.c,v 1.3 2001-09-05 13:19:01 bird Exp $ */ 1 2 /************************************************************************* 2 3 * OLE Automation … … 25 26 26 27 /* Localy used methods */ 27 static INT 28 static INT 28 29 endOfDim(LONG *coor, SAFEARRAYBOUND *mat, LONG dim, LONG realDim); 29 30 30 static ULONG 31 static ULONG 31 32 calcDisplacement(LONG *coor, SAFEARRAYBOUND *mat, LONG dim); 32 33 33 static BOOL 34 static BOOL 34 35 isPointer(USHORT feature); 35 36 36 static INT 37 static INT 37 38 getFeatures(VARTYPE vt); 38 39 39 static BOOL 40 static BOOL 40 41 validCoordinate(LONG *coor, SAFEARRAY *psa); 41 42 42 static BOOL 43 static BOOL 43 44 resizeSafeArray(SAFEARRAY *psa, LONG lDelta); 44 45 45 static BOOL 46 static BOOL 46 47 validArg(SAFEARRAY *psa); 47 48 48 static ULONG 49 static ULONG 49 50 getArraySize(SAFEARRAY *psa); 50 51 51 static HRESULT 52 static HRESULT 52 53 duplicateData(SAFEARRAY *psa, SAFEARRAY **ppsaOut); 53 54 … … 59 60 { 60 61 /* 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, /* 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*/62 VARTYPE_NOT_SUPPORTED, /* VT_EMPTY [V] [P] nothing */ 63 VARTYPE_NOT_SUPPORTED, /* VT_NULL [V] [P] SQL style Nul */ 64 2, /* VT_I2 [V][T][P][S] 2 byte signed int */ 65 4, /* VT_I4 [V][T][P][S] 4 byte signed int */ 66 4, /* VT_R4 [V][T][P][S] 4 byte real */ 67 8, /* VT_R8 [V][T][P][S] 8 byte real */ 67 68 8, /* VT_CY [V][T][P][S] currency */ 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*/69 8, /* VT_DATE [V][T][P][S] date */ 70 4, /* VT_BSTR [V][T][P][S] OLE Automation string*/ 71 4, /* VT_DISPATCH [V][T][P][S] IDispatch * */ 72 4, /* VT_ERROR [V][T] [S] SCODE */ 73 4, /* VT_BOOL [V][T][P][S] True=-1, False=0*/ 74 24, /* VT_VARIANT [V][T][P][S] VARIANT * */ 75 4, /* VT_UNKNOWN [V][T] [S] IUnknown * */ 76 16, /* VT_DECIMAL [V][T] [S] 16 byte fixed point */ 76 77 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, /* 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*/78 VARTYPE_NOT_SUPPORTED, /* VT_I1 [T] signed char */ 79 1, /* VT_UI1 [V][T][P][S] unsigned char */ 80 VARTYPE_NOT_SUPPORTED, /* VT_UI2 [T][P] unsigned short */ 81 VARTYPE_NOT_SUPPORTED, /* VT_UI4 [T][P] unsigned short */ 82 VARTYPE_NOT_SUPPORTED, /* VT_I8 [T][P] signed 64-bit int */ 83 VARTYPE_NOT_SUPPORTED, /* VT_UI8 [T][P] unsigned 64-bit int */ 84 VARTYPE_NOT_SUPPORTED, /* VT_INT [T] signed machine int */ 85 VARTYPE_NOT_SUPPORTED, /* VT_UINT [T] unsigned machine int */ 86 VARTYPE_NOT_SUPPORTED, /* VT_VOID [T] C style void */ 87 VARTYPE_NOT_SUPPORTED, /* VT_HRESULT [T] Standard return type */ 88 VARTYPE_NOT_SUPPORTED, /* VT_PTR [T] pointer type */ 89 VARTYPE_NOT_SUPPORTED, /* VT_SAFEARRAY [T] (use VT_ARRAY in VARIANT)*/ 90 VARTYPE_NOT_SUPPORTED, /* VT_CARRAY [T] C style array */ 91 VARTYPE_NOT_SUPPORTED, /* VT_USERDEFINED [T] user defined type */ 92 VARTYPE_NOT_SUPPORTED, /* VT_LPSTR [T][P] null terminated string */ 93 VARTYPE_NOT_SUPPORTED, /* VT_LPWSTR [T][P] wide null term string */ 94 VARTYPE_NOT_SUPPORTED, /* VT_FILETIME [P] FILETIME */ 95 VARTYPE_NOT_SUPPORTED, /* VT_BLOB [P] Length prefixed bytes */ 96 VARTYPE_NOT_SUPPORTED, /* VT_STREAM [P] Name of stream follows */ 97 VARTYPE_NOT_SUPPORTED, /* VT_STORAGE [P] Name of storage follows */ 98 VARTYPE_NOT_SUPPORTED, /* VT_STREAMED_OBJECT[P] Stream contains an object*/ 99 VARTYPE_NOT_SUPPORTED, /* VT_STORED_OBJECT [P] Storage contains object*/ 100 VARTYPE_NOT_SUPPORTED, /* VT_BLOB_OBJECT [P] Blob contains an object*/ 101 VARTYPE_NOT_SUPPORTED, /* VT_CF [P] Clipboard format */ 102 VARTYPE_NOT_SUPPORTED, /* VT_CLSID [P] A Class ID */ 103 VARTYPE_NOT_SUPPORTED, /* VT_VECTOR [P] simple counted array */ 104 VARTYPE_NOT_SUPPORTED, /* VT_ARRAY [V] SAFEARRAY* */ 105 VARTYPE_NOT_SUPPORTED /* VT_BYREF [V] void* for local use */ 105 106 }; 106 107 … … 109 110 110 111 /************************************************************************* 111 * SafeArrayAllocDescriptor112 * SafeArrayAllocDescriptor 112 113 * Allocate the appropriate amount of memory for the SafeArray descriptor 113 114 */ 114 HRESULT WINAPI SafeArrayAllocDescriptor( 115 UINT cDims, 116 SAFEARRAY **ppsaOut) 115 HRESULT WINAPI SafeArrayAllocDescriptor( 116 UINT cDims, 117 SAFEARRAY **ppsaOut) 117 118 { 118 119 SAFEARRAYBOUND *sab; … … 124 125 125 126 /* Allocate memory for SAFEARRAY struc */ 126 if(( (*ppsaOut)=HeapAlloc( 127 if(( (*ppsaOut)=HeapAlloc( 127 128 GetProcessHeap(), HEAP_ZERO_MEMORY, allocSize)) == NULL){ 128 129 return(E_UNEXPECTED); … … 134 135 135 136 /************************************************************************* 136 * SafeArrayAllocData137 * SafeArrayAllocData 137 138 * Allocate the appropriate amount of data for the SafeArray data 138 139 */ 139 140 HRESULT WINAPI SafeArrayAllocData( 140 SAFEARRAY *psa) 141 SAFEARRAY *psa) 141 142 { 142 143 ULONG ulWholeArraySize; /* to store the size of the whole thing */ … … 144 145 dprintf(("SafeArrayAllocData %x", psa)); 145 146 146 if(! validArg(psa)) 147 if(! validArg(psa)) 147 148 return E_INVALIDARG; 148 149 … … 150 151 151 152 /* Allocate memory for the data itself */ 152 if((psa->pvData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 153 if((psa->pvData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 153 154 psa->cbElements*ulWholeArraySize)) == NULL) 154 155 return(E_UNEXPECTED); 155 156 156 TRACE("SafeArray: %lu bytes allocated for data at %p (%lu objects).\n", 157 TRACE("SafeArray: %lu bytes allocated for data at %p (%lu objects).\n", 157 158 psa->cbElements*ulWholeArraySize, psa->pvData, ulWholeArraySize); 158 159 … … 161 162 162 163 /************************************************************************* 163 * SafeArrayCreate164 * Create a SafeArray object by encapsulating AllocDescriptor and AllocData 164 * SafeArrayCreate 165 * Create a SafeArray object by encapsulating AllocDescriptor and AllocData 165 166 */ 166 167 SAFEARRAY* WINAPI SafeArrayCreate( 167 VARTYPE vt, 168 UINT cDims, 168 VARTYPE vt, 169 UINT cDims, 169 170 SAFEARRAYBOUND *rgsabound) 170 171 { … … 184 185 return NULL; 185 186 186 /* setup data members... */ 187 /* setup data members... */ 187 188 psa->cDims = cDims; 188 189 psa->fFeatures = getFeatures(vt); … … 197 198 } 198 199 199 /* allocate memory for the data... */ 200 /* allocate memory for the data... */ 200 201 if( FAILED( hRes = SafeArrayAllocData(psa))) { 201 SafeArrayDestroyDescriptor(psa); 202 SafeArrayDestroyDescriptor(psa); 202 203 ERR("() : Failed to allocate the Safe Array data\n"); 203 204 return NULL; 204 205 } 205 206 206 return(psa); 207 } 208 209 /************************************************************************* 210 * SafeArrayDestroyDescriptor207 return(psa); 208 } 209 210 /************************************************************************* 211 * SafeArrayDestroyDescriptor 211 212 * Frees the memory associated with the descriptor. 212 213 */ … … 217 218 218 219 /* Check for lockness before to free... */ 219 if(psa->cLocks > 0) 220 if(psa->cLocks > 0) 220 221 return DISP_E_ARRAYISLOCKED; 221 222 222 223 /* The array is unlocked, then, deallocate memory */ 223 if(HeapFree( GetProcessHeap(), 0, psa) == FALSE) 224 if(HeapFree( GetProcessHeap(), 0, psa) == FALSE) 224 225 return E_UNEXPECTED; 225 226 226 227 return(S_OK); 227 228 } … … 229 230 230 231 /************************************************************************* 231 * SafeArrayLock232 * SafeArrayLock 232 233 * Increment the lock counter 233 234 * 234 235 * 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 236 * only when psa->cLocks is > 0... I don't get it since pvData is allocated 237 * before the array is locked, therefore 237 238 */ 238 239 HRESULT WINAPI SafeArrayLock( … … 241 242 dprintf(("SafeArrayLock %x", psa)); 242 243 243 if(! validArg(psa)) 244 if(! validArg(psa)) 244 245 return E_INVALIDARG; 245 246 … … 250 251 251 252 /************************************************************************* 252 * SafeArrayUnlock253 * SafeArrayUnlock 253 254 * Decrement the lock counter 254 255 */ … … 258 259 dprintf(("SafeArrayUnlock %x", psa)); 259 260 260 if(! validArg(psa)) 261 return E_INVALIDARG; 262 263 if (psa->cLocks > 0) 261 if(! validArg(psa)) 262 return E_INVALIDARG; 263 264 if (psa->cLocks > 0) 264 265 psa->cLocks--; 265 266 … … 269 270 270 271 /************************************************************************* 271 * SafeArrayPutElement272 * SafeArrayPutElement 272 273 * Set the data at the given coordinate 273 274 */ 274 275 HRESULT WINAPI SafeArrayPutElement( 275 SAFEARRAY *psa, 276 LONG *rgIndices, 276 SAFEARRAY *psa, 277 LONG *rgIndices, 277 278 void *pv) 278 279 { 279 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 280 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 280 281 the desired one... */ 281 282 PVOID elementStorageAddress = NULL; /* Adress to store the data */ … … 285 286 286 287 /* Validate the index given */ 287 if(! validCoordinate(rgIndices, psa)) 288 if(! validCoordinate(rgIndices, psa)) 288 289 return DISP_E_BADINDEX; 289 290 if(! validArg(psa)) … … 294 295 /* Figure out the number of items to skip */ 295 296 stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims); 296 297 297 298 /* Figure out the number of byte to skip ... */ 298 299 elementStorageAddress = (char *) psa->pvData+(stepCountInSAData*psa->cbElements); 299 300 300 301 if(isPointer(psa->fFeatures)) { /* increment ref count for this pointer */ 301 302 302 *((VOID**)elementStorageAddress) = *(VOID**)pv; 303 *((VOID**)elementStorageAddress) = *(VOID**)pv; 303 304 IUnknown_AddRef( *(IUnknown**)pv); 304 305 305 } else { 306 } else { 306 307 307 308 if(psa->fFeatures == FADF_BSTR) { /* Create a new object */ 308 309 309 310 if((pbstrReAllocStr = SysAllocString( (OLECHAR*)pv )) == NULL) { 310 SafeArrayUnlock(psa); 311 SafeArrayUnlock(psa); 311 312 return E_OUTOFMEMORY; 312 } else 313 } else 313 314 *((BSTR*)elementStorageAddress) = pbstrReAllocStr; 314 315 … … 323 324 324 325 TRACE("SafeArray: item put at adress %p.\n",elementStorageAddress); 325 return SafeArrayUnlock(psa); 326 } 327 328 329 /************************************************************************* 330 * SafeArrayGetElement326 return SafeArrayUnlock(psa); 327 } 328 329 330 /************************************************************************* 331 * SafeArrayGetElement 331 332 * Return the data element corresponding the the given coordinate 332 333 */ 333 334 HRESULT WINAPI SafeArrayGetElement( 334 SAFEARRAY *psa, 335 LONG *rgIndices, 335 SAFEARRAY *psa, 336 LONG *rgIndices, 336 337 void *pv) 337 338 { 338 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 339 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 339 340 the desired one... */ 340 341 PVOID elementStorageAddress = NULL; /* Adress to store the data */ … … 343 344 dprintf(("SafeArrayGetElement %x %x %x", psa, rgIndices, pv)); 344 345 345 if(! validArg(psa)) 346 return E_INVALIDARG; 347 346 if(! validArg(psa)) 347 return E_INVALIDARG; 348 348 349 if(! validCoordinate(rgIndices, psa)) /* Validate the index given */ 349 350 return(DISP_E_BADINDEX); … … 353 354 /* Figure out the number of items to skip */ 354 355 stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims); 355 356 356 357 /* Figure out the number of byte to skip ... */ 357 358 elementStorageAddress = (char *) psa->pvData+(stepCountInSAData*psa->cbElements); 358 359 359 360 if( psa->fFeatures == FADF_BSTR) { /* reallocate the obj */ 360 if( (pbstrReturnedStr = 361 if( (pbstrReturnedStr = 361 362 SysAllocString( *(OLECHAR**)elementStorageAddress )) == NULL) { 362 363 SafeArrayUnlock(psa); 363 364 return E_OUTOFMEMORY; 364 } else 365 *((BSTR*)pv) = pbstrReturnedStr; 366 365 } else 366 *((BSTR*)pv) = pbstrReturnedStr; 367 367 368 } else if( isPointer(psa->fFeatures) ) /* simply copy the pointer */ 368 pv = *((PVOID*)elementStorageAddress); 369 pv = *((PVOID*)elementStorageAddress); 369 370 else /* copy the bytes */ 370 371 memcpy(pv, elementStorageAddress, SafeArrayGetElemsize(psa) ); … … 375 376 } 376 377 377 return( SafeArrayUnlock(psa) ); 378 } 379 380 /************************************************************************* 381 * SafeArrayGetUBound378 return( SafeArrayUnlock(psa) ); 379 } 380 381 /************************************************************************* 382 * SafeArrayGetUBound 382 383 * return the UP bound for a given array dimension 383 384 */ 384 385 HRESULT WINAPI SafeArrayGetUBound( 385 SAFEARRAY *psa, 386 SAFEARRAY *psa, 386 387 UINT nDim, 387 388 LONG *plUbound) … … 390 391 dprintf(("SafeArrayGetUBound %x %x %x", psa, nDim, plUbound)); 391 392 392 if(! validArg(psa)) 393 return E_INVALIDARG; 394 395 if(nDim > psa->cDims) 393 if(! validArg(psa)) 394 return E_INVALIDARG; 395 396 if(nDim > psa->cDims) 396 397 return DISP_E_BADINDEX; 397 398 398 *plUbound = psa->rgsabound[nDim-1].lLbound + 399 *plUbound = psa->rgsabound[nDim-1].lLbound + 399 400 psa->rgsabound[nDim-1].cElements - 1; 400 401 … … 403 404 404 405 /************************************************************************* 405 * SafeArrayGetLBound406 * Return the LO bound for a given array dimension 406 * SafeArrayGetLBound 407 * Return the LO bound for a given array dimension 407 408 */ 408 409 HRESULT WINAPI SafeArrayGetLBound( 409 410 SAFEARRAY *psa, 410 UINT nDim, 411 UINT nDim, 411 412 LONG *plLbound) 412 413 { 413 if(! validArg(psa)) 414 return E_INVALIDARG; 415 416 if(nDim > psa->cDims) 414 if(! validArg(psa)) 415 return E_INVALIDARG; 416 417 if(nDim > psa->cDims) 417 418 return DISP_E_BADINDEX; 418 419 … … 422 423 423 424 /************************************************************************* 424 * SafeArrayGetDim425 * SafeArrayGetDim 425 426 * returns the number of dimension in the array 426 427 */ 427 428 UINT WINAPI SafeArrayGetDim( 428 429 SAFEARRAY * psa) 429 { 430 { 430 431 /* 431 432 * A quick test in Windows shows that the behavior here for an invalid 432 433 * pointer is to return 0. 433 434 */ 434 if(! validArg(psa)) 435 if(! validArg(psa)) 435 436 return 0; 436 437 … … 439 440 440 441 /************************************************************************* 441 * SafeArrayGetElemsize442 * SafeArrayGetElemsize 442 443 * Return the size of the element in the array 443 444 */ 444 445 UINT WINAPI SafeArrayGetElemsize( 445 446 SAFEARRAY * psa) 446 { 447 { 447 448 /* 448 449 * A quick test in Windows shows that the behavior here for an invalid 449 450 * pointer is to return 0. 450 451 */ 451 if(! validArg(psa)) 452 if(! validArg(psa)) 452 453 return 0; 453 454 … … 456 457 457 458 /************************************************************************* 458 * SafeArrayAccessData459 * increment the access count and return the data 459 * SafeArrayAccessData 460 * increment the access count and return the data 460 461 */ 461 462 HRESULT WINAPI SafeArrayAccessData( 462 SAFEARRAY *psa, 463 SAFEARRAY *psa, 463 464 void **ppvData) 464 { 465 { 465 466 HRESULT hRes; 466 467 467 if(! validArg(psa)) 468 if(! validArg(psa)) 468 469 return E_INVALIDARG; 469 470 … … 471 472 472 473 switch (hRes) { 473 case S_OK: 474 case S_OK: 474 475 (*ppvData) = psa->pvData; 475 476 break; … … 478 479 return E_INVALIDARG; 479 480 } 480 481 481 482 return S_OK; 482 483 } … … 484 485 485 486 /************************************************************************* 486 * SafeArrayUnaccessData487 * SafeArrayUnaccessData 487 488 * Decrement the access count 488 489 */ 489 490 HRESULT WINAPI SafeArrayUnaccessData( 490 491 SAFEARRAY * psa) 491 { 492 if(! validArg(psa)) 492 { 493 if(! validArg(psa)) 493 494 return E_INVALIDARG; 494 495 … … 496 497 } 497 498 498 /************************************************************************ 499 * SafeArrayPtrOfIndex499 /************************************************************************ 500 * SafeArrayPtrOfIndex 500 501 * Return a pointer to the element at rgIndices 501 502 */ 502 503 HRESULT WINAPI SafeArrayPtrOfIndex( 503 SAFEARRAY *psa, 504 LONG *rgIndices, 504 SAFEARRAY *psa, 505 LONG *rgIndices, 505 506 void **ppvData) 506 { 507 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 507 { 508 ULONG stepCountInSAData = 0; /* Number of array item to skip to get to 508 509 the desired one... */ 509 510 510 if(! validArg(psa)) 511 return E_INVALIDARG; 512 513 if(! validCoordinate(rgIndices, psa)) 511 if(! validArg(psa)) 512 return E_INVALIDARG; 513 514 if(! validCoordinate(rgIndices, psa)) 514 515 return DISP_E_BADINDEX; 515 516 516 517 /* Figure out the number of items to skip */ 517 518 stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims); 518 519 519 520 *ppvData = (char *) psa->pvData+(stepCountInSAData*psa->cbElements); 520 521 … … 522 523 } 523 524 524 /************************************************************************ 525 * SafeArrayDestroyData525 /************************************************************************ 526 * SafeArrayDestroyData 526 527 * Frees the memory data bloc 527 528 */ 528 529 HRESULT WINAPI SafeArrayDestroyData( 529 530 SAFEARRAY *psa) 530 { 531 { 531 532 HRESULT hRes; 532 533 ULONG ulWholeArraySize; /* count spot in array */ … … 535 536 BSTR bstr; 536 537 537 if(! validArg(psa)) 538 return E_INVALIDARG; 539 540 if(psa->cLocks > 0) 538 if(! validArg(psa)) 539 return E_INVALIDARG; 540 541 if(psa->cLocks > 0) 541 542 return DISP_E_ARRAYISLOCKED; 542 543 … … 546 547 547 548 for(ulDataIter=0; ulDataIter < ulWholeArraySize; ulDataIter++) { 548 punk = *(IUnknown**)((char *) psa->pvData+(ulDataIter*(psa->cbElements))); 549 550 if( punk != NULL) 549 punk = *(IUnknown**)((char *) psa->pvData+(ulDataIter*(psa->cbElements))); 550 551 if( punk != NULL) 551 552 IUnknown_Release(punk); 552 553 } … … 557 558 bstr = *(BSTR*)((char *) psa->pvData+(ulDataIter*(psa->cbElements))); 558 559 559 if( bstr != NULL) 560 if( bstr != NULL) 560 561 SysFreeString( bstr ); 561 562 } 562 563 } 563 564 /* check if this array is a Vector, in which case do not free the data 564 565 /* check if this array is a Vector, in which case do not free the data 565 566 block since it has been allocated by AllocDescriptor and therefore 566 567 deserve to be freed by DestroyDescriptor */ … … 573 574 psa->pvData = NULL; 574 575 } 575 576 576 577 return S_OK; 577 578 } 578 579 579 /************************************************************************ 580 * SafeArrayCopyData580 /************************************************************************ 581 * SafeArrayCopyData 581 582 * Copy the psaSource's data block into psaTarget if dimension and size 582 583 * permits it. … … 585 586 SAFEARRAY *psaSource, 586 587 SAFEARRAY **psaTarget) 587 { 588 { 588 589 USHORT cDimCount; /* looper */ 589 590 LONG lDelta; /* looper */ 590 IUnknown *punk; 591 IUnknown *punk; 591 592 ULONG ulWholeArraySize; /* Number of item in SA */ 592 593 BSTR bstr; 593 594 594 if(! (validArg(psaSource) && validArg(*psaTarget)) ) 595 if(! (validArg(psaSource) && validArg(*psaTarget)) ) 595 596 return E_INVALIDARG; 596 597 … … 598 599 return E_INVALIDARG; 599 600 600 ulWholeArraySize = getArraySize(psaSource); 601 ulWholeArraySize = getArraySize(psaSource); 601 602 602 603 /* The two arrays boundaries must be of same lenght */ 603 604 for(cDimCount=0;cDimCount < psaSource->cDims; cDimCount++) 604 if( psaSource->rgsabound[cDimCount].cElements != 605 if( psaSource->rgsabound[cDimCount].cElements != 605 606 (*psaTarget)->rgsabound[cDimCount].cElements) 606 607 return E_INVALIDARG; 607 608 608 if( isPointer((*psaTarget)->fFeatures) ) { /* the target contains ptr 609 if( isPointer((*psaTarget)->fFeatures) ) { /* the target contains ptr 609 610 that must be released */ 610 611 for(lDelta=0;lDelta < ulWholeArraySize; lDelta++) { … … 612 613 ((char *) (*psaTarget)->pvData + (lDelta * (*psaTarget)->cbElements)); 613 614 614 if( punk != NULL) 615 if( punk != NULL) 615 616 IUnknown_Release(punk); 616 617 } 617 618 618 619 } else if( (*psaTarget)->fFeatures & FADF_BSTR) { /* the target contain BSTR 619 that must be freed */ 620 that must be freed */ 620 621 for(lDelta=0;lDelta < ulWholeArraySize; lDelta++) { 621 bstr = 622 bstr = 622 623 *(BSTR*)((char *) (*psaTarget)->pvData + (lDelta * (*psaTarget)->cbElements)); 623 624 624 if( bstr != NULL) 625 if( bstr != NULL) 625 626 SysFreeString( bstr ); 626 627 } … … 630 631 } 631 632 632 /************************************************************************ 633 * SafeArrayDestroy633 /************************************************************************ 634 * SafeArrayDestroy 634 635 * Deallocates all memory reserved for the SafeArray 635 636 */ 636 637 HRESULT WINAPI SafeArrayDestroy( 637 638 SAFEARRAY * psa) 638 { 639 { 639 640 HRESULT hRes; 640 641 641 if(! validArg(psa)) 642 return E_INVALIDARG; 643 644 if(psa->cLocks > 0) 642 if(! validArg(psa)) 643 return E_INVALIDARG; 644 645 if(psa->cLocks > 0) 645 646 return DISP_E_ARRAYISLOCKED; 646 647 … … 652 653 } 653 654 654 /************************************************************************ 655 * SafeArrayCopy655 /************************************************************************ 656 * SafeArrayCopy 656 657 * Make a dupplicate of a SafeArray 657 658 */ 658 659 HRESULT WINAPI SafeArrayCopy( 659 SAFEARRAY *psa, 660 SAFEARRAY *psa, 660 661 SAFEARRAY **ppsaOut) 661 { 662 { 662 663 HRESULT hRes; 663 664 DWORD dAllocSize; 664 665 ULONG ulWholeArraySize; /* size of the thing */ 665 666 666 if(! validArg(psa)) 667 if(! validArg(psa)) 667 668 return E_INVALIDARG; 668 669 … … 670 671 671 672 /* Duplicate the SAFEARRAY struc */ 672 memcpy(*ppsaOut, psa, 673 memcpy(*ppsaOut, psa, 673 674 sizeof(*psa)+(sizeof(*(psa->rgsabound))*(psa->cDims-1))); 674 675 … … 677 678 /* make sure the new safe array doesn't have the FADF_CREATEVECTOR flag, 678 679 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 */ 680 (*ppsaOut)->fFeatures &= ~FADF_CREATEVECTOR; 681 682 /* Get the allocated memory size for source and allocate it for target */ 682 683 ulWholeArraySize = getArraySize(psa); /* Number of item in SA */ 683 684 dAllocSize = ulWholeArraySize*psa->cbElements; 684 685 685 (*ppsaOut)->pvData = 686 (*ppsaOut)->pvData = 686 687 HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dAllocSize); 687 688 if( (*ppsaOut)->pvData != NULL) { /* HeapAlloc succeed */ … … 693 694 return hRes; 694 695 } 695 696 696 697 } else { /* failed to allocate or dupplicate... */ 697 698 SafeArrayDestroyDescriptor(*ppsaOut); … … 705 706 } 706 707 707 /************************************************************************ 708 * SafeArrayCreateVector709 * Creates a one dimension safearray where the data is next to the 708 /************************************************************************ 709 * SafeArrayCreateVector 710 * Creates a one dimension safearray where the data is next to the 710 711 * SAFEARRAY structure. 711 712 */ 712 713 SAFEARRAY* WINAPI SafeArrayCreateVector( 713 VARTYPE vt, 714 LONG lLbound, 715 ULONG cElements) 716 { 714 VARTYPE vt, 715 LONG lLbound, 716 ULONG cElements) 717 { 717 718 SAFEARRAY *psa; 718 719 … … 723 724 724 725 /* Allocate memory for the array descriptor and data contiguously */ 725 if( FAILED( psa = HeapAlloc( GetProcessHeap(), 726 HEAP_ZERO_MEMORY, 726 if( FAILED( psa = HeapAlloc( GetProcessHeap(), 727 HEAP_ZERO_MEMORY, 727 728 (sizeof(*psa) + (VARTYPE_SIZE[vt] * cElements))))) { 728 729 return NULL; 729 730 } 730 731 /* setup data members... */ 731 732 /* setup data members... */ 732 733 psa->cDims = 1; /* always and forever */ 733 734 psa->fFeatures = getFeatures(vt) | FADF_CREATEVECTOR; /* undocumented flag used by Microsoft */ … … 739 740 psa->rgsabound[0].lLbound = lLbound; 740 741 741 return(psa); 742 } 743 744 /************************************************************************ 745 * SafeArrayRedim742 return(psa); 743 } 744 745 /************************************************************************ 746 * SafeArrayRedim 746 747 * Changes the caracteristics of the last dimension of the SafeArray 747 748 */ 748 749 HRESULT WINAPI SafeArrayRedim( 749 SAFEARRAY *psa, 750 SAFEARRAY *psa, 750 751 SAFEARRAYBOUND *psaboundNew) 751 { 752 { 752 753 LONG lDelta; /* hold difference in size */ 753 754 USHORT cDims=1; /* dims counter */ 754 755 755 if( !validArg(psa) ) 756 return E_INVALIDARG; 757 758 if( psa->cLocks > 0 ) 756 if( !validArg(psa) ) 757 return E_INVALIDARG; 758 759 if( psa->cLocks > 0 ) 759 760 return DISP_E_ARRAYISLOCKED; 760 761 761 if( psa->fFeatures & FADF_FIXEDSIZE ) 762 return E_INVALIDARG; 763 764 if( SafeArrayLock(psa)==E_UNEXPECTED ) 762 if( psa->fFeatures & FADF_FIXEDSIZE ) 763 return E_INVALIDARG; 764 765 if( SafeArrayLock(psa)==E_UNEXPECTED ) 765 766 return E_UNEXPECTED;/* UNDOC error condition */ 766 767 … … 774 775 775 776 } else /* need to enlarge (lDelta +) reduce (lDelta -) */ 776 if(! resizeSafeArray(psa, lDelta)) 777 if(! resizeSafeArray(psa, lDelta)) 777 778 return E_UNEXPECTED; /* UNDOC error condition */ 778 779 779 /* the only modifyable dimension sits in [0] as the dimensions were reversed 780 /* the only modifyable dimension sits in [0] as the dimensions were reversed 780 781 at array creation time... */ 781 782 psa->rgsabound[0].cElements = psaboundNew->cElements; … … 789 790 ************************************************************************/ 790 791 791 /************************************************************************ 792 /************************************************************************ 792 793 * Used to validate the SAFEARRAY type of arg 793 794 */ 794 795 static BOOL validArg( 795 SAFEARRAY *psa) 796 SAFEARRAY *psa) 796 797 { 797 798 SAFEARRAYBOUND *sab; … … 822 823 } 823 824 824 /************************************************************************ 825 /************************************************************************ 825 826 * Used to reallocate memory 826 827 */ 827 828 static BOOL resizeSafeArray( 828 SAFEARRAY *psa, 829 SAFEARRAY *psa, 829 830 LONG lDelta) 830 831 { 831 832 ULONG ulWholeArraySize; /* use as multiplicator */ 832 PVOID pvNewBlock = NULL; 833 PVOID pvNewBlock = NULL; 833 834 IUnknown *punk; 834 835 BSTR bstr; … … 838 839 if(lDelta < 0) { /* array needs to be shorthen */ 839 840 if( isPointer(psa->fFeatures)) /* ptr that need to be released */ 840 for(;lDelta < 0; lDelta++) {841 punk = *(IUnknown**)841 for(;lDelta < 0; lDelta++) { 842 punk = *(IUnknown**) 842 843 ((char *) psa->pvData+((ulWholeArraySize+lDelta)*psa->cbElements)); 843 844 844 845 if( punk != NULL ) 845 846 IUnknown_Release(punk); 846 }847 } 847 848 848 849 else if(psa->fFeatures & FADF_BSTR) /* BSTR that need to be freed */ 849 for(;lDelta < 0; lDelta++) {850 for(;lDelta < 0; lDelta++) { 850 851 bstr = *(BSTR*) 851 852 ((char *) psa->pvData+((ulWholeArraySize+lDelta)*psa->cbElements)); … … 858 859 if (!(psa->fFeatures & FADF_CREATEVECTOR)) 859 860 { 860 /* Ok now, if we are enlarging the array, we *MUST* move the whole block 861 /* Ok now, if we are enlarging the array, we *MUST* move the whole block 861 862 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 863 optional but we do it anyway becuase the benefit is that we are 863 864 releasing to the system the unused memory */ 864 865 865 if((pvNewBlock = HeapReAlloc(GetProcessHeap(), 0, psa->pvData, 866 (ulWholeArraySize + lDelta) * psa->cbElements)) == NULL) 866 if((pvNewBlock = HeapReAlloc(GetProcessHeap(), 0, psa->pvData, 867 (ulWholeArraySize + lDelta) * psa->cbElements)) == NULL) 867 868 return FALSE; /* TODO If we get here it means: 868 869 SHRINK situation : we've deleted the undesired … … 873 874 else 874 875 { 875 /* Allocate a new block, because the previous data has been allocated with 876 /* Allocate a new block, because the previous data has been allocated with 876 877 the descriptor in SafeArrayCreateVector function. */ 877 878 878 879 if((pvNewBlock = HeapAlloc(GetProcessHeap(), 0, 879 ulWholeArraySize * psa->cbElements)) == NULL) 880 ulWholeArraySize * psa->cbElements)) == NULL) 880 881 return FALSE; 881 882 … … 887 888 } 888 889 889 /************************************************************************ 890 * Used to set the fFeatures data member of the SAFEARRAY structure. 890 /************************************************************************ 891 * Used to set the fFeatures data member of the SAFEARRAY structure. 891 892 */ 892 893 static INT getFeatures( 893 VARTYPE vt) 894 VARTYPE vt) 894 895 { 895 896 switch(vt) { … … 901 902 } 902 903 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... 904 /************************************************************************ 905 * Used to figure out if the fFeatures data member of the SAFEARRAY 906 * structure contain any information about the type of data stored... 906 907 */ 907 908 static BOOL isPointer( 908 USHORT feature) 909 USHORT feature) 909 910 { 910 911 switch(feature) { … … 915 916 } 916 917 917 /************************************************************************ 918 * Used to calculate the displacement when accessing or modifying 918 /************************************************************************ 919 * Used to calculate the displacement when accessing or modifying 919 920 * safearray data set. 920 921 * … … 926 927 */ 927 928 static ULONG calcDisplacement( 928 LONG *coor, 929 SAFEARRAYBOUND *mat, 930 LONG dim) 929 LONG *coor, 930 SAFEARRAYBOUND *mat, 931 LONG dim) 931 932 { 932 933 ULONG res = 0; 933 934 LONG iterDim; 934 935 935 for(iterDim=0; iterDim<dim; iterDim++) 936 for(iterDim=0; iterDim<dim; iterDim++) 936 937 /* the -mat[dim] bring coor[dim] relative to 0 for calculation */ 937 res += ((coor[iterDim]-mat[iterDim].lLbound) * 938 res += ((coor[iterDim]-mat[iterDim].lLbound) * 938 939 endOfDim(coor, mat, iterDim+1, dim)); 939 940 … … 942 943 } 943 944 944 /************************************************************************ 945 * Recursivity agent for calcDisplacement method. Used within Put and 945 /************************************************************************ 946 * Recursivity agent for calcDisplacement method. Used within Put and 946 947 * Get methods. 947 948 */ 948 949 static INT endOfDim( 949 LONG *coor, 950 SAFEARRAYBOUND *mat, 951 LONG dim, 952 LONG realDim) 953 { 954 if(dim==realDim) 950 LONG *coor, 951 SAFEARRAYBOUND *mat, 952 LONG dim, 953 LONG realDim) 954 { 955 if(dim==realDim) 955 956 return 1; 956 else 957 else 957 958 return (endOfDim(coor, mat, dim+1, realDim) * mat[dim].cElements); 958 959 } 959 960 960 961 961 /************************************************************************ 962 * Method used to validate the coordinate received in Put and Get 962 /************************************************************************ 963 * Method used to validate the coordinate received in Put and Get 963 964 * methods. 964 965 */ 965 966 static BOOL validCoordinate( 966 LONG *coor, 967 SAFEARRAY *psa) 967 LONG *coor, 968 SAFEARRAY *psa) 968 969 { 969 970 INT iter=0; … … 977 978 if((hRes = SafeArrayGetUBound(psa, iter, &lUBound)) != S_OK) 978 979 return FALSE; 979 980 if(lLBound == lUBound) 981 return FALSE; 982 980 981 if(lLBound == lUBound) 982 return FALSE; 983 983 984 if((coor[iter] >= lLBound) && (coor[iter] <= lUBound)) 984 985 return TRUE; … … 987 988 } 988 989 return FALSE; 989 } 990 991 /************************************************************************ 990 } 991 992 /************************************************************************ 992 993 * Method used to calculate the number of cells of the SA 993 994 */ 994 995 static ULONG getArraySize( 995 SAFEARRAY *psa) 996 { 997 USHORT cCount; 996 SAFEARRAY *psa) 997 { 998 USHORT cCount; 998 999 ULONG ulWholeArraySize = 1; 999 1000 … … 1001 1002 ulWholeArraySize *= psa->rgsabound[cCount].cElements; 1002 1003 1003 return ulWholeArraySize; 1004 } 1005 1006 1007 /************************************************************************ 1004 return ulWholeArraySize; 1005 } 1006 1007 1008 /************************************************************************ 1008 1009 * Method used to handle data space dupplication for Copy32 and CopyData32 1009 1010 */ 1010 1011 static HRESULT duplicateData( 1011 SAFEARRAY *psa, 1012 SAFEARRAY **ppsaOut) 1012 SAFEARRAY *psa, 1013 SAFEARRAY **ppsaOut) 1013 1014 { 1014 1015 ULONG ulWholeArraySize; /* size of the thing */ … … 1018 1019 1019 1020 ulWholeArraySize = getArraySize(psa); /* Number of item in SA */ 1020 1021 1021 1022 SafeArrayLock(*ppsaOut); 1022 1023 1023 if( isPointer(psa->fFeatures) ) { /* If datatype is object increment 1024 if( isPointer(psa->fFeatures) ) { /* If datatype is object increment 1024 1025 object's reference count */ 1025 1026 … … 1032 1033 1033 1034 /* Copy the source array data into target array */ 1034 memcpy((*ppsaOut)->pvData, psa->pvData, 1035 memcpy((*ppsaOut)->pvData, psa->pvData, 1035 1036 ulWholeArraySize*psa->cbElements); 1036 1037 1037 } else if( psa->fFeatures & FADF_BSTR ) { /* if datatype is BSTR allocate 1038 } else if( psa->fFeatures & FADF_BSTR ) { /* if datatype is BSTR allocate 1038 1039 the BSTR in the new array */ 1039 1040 … … 1046 1047 } 1047 1048 1048 *((BSTR*)((char *) (*ppsaOut)->pvData+(lDelta * psa->cbElements))) = 1049 *((BSTR*)((char *) (*ppsaOut)->pvData+(lDelta * psa->cbElements))) = 1049 1050 pbstrReAllocStr; 1050 1051 } … … 1052 1053 } else { /* Simply copy the source array data into target array */ 1053 1054 1054 memcpy((*ppsaOut)->pvData, psa->pvData, 1055 memcpy((*ppsaOut)->pvData, psa->pvData, 1055 1056 ulWholeArraySize*psa->cbElements); 1056 1057 } … … 1062 1063 1063 1064 1064 /************************************************************************ 1065 * SafeArrayGetVarType1065 /************************************************************************ 1066 * SafeArrayGetVarType 1066 1067 * Returns the VARTYPE stored in the given safearray 1067 1068 */ … … 1099 1100 hr = S_OK; 1100 1101 } 1101 1102 1102 1103 TRACE("HRESULT = %08lx", hr); 1103 1104 return hr; -
trunk/src/oleaut32/typelib.c
r6575 r6648 1 /* $Id: typelib.c,v 1.6 2001-09-05 13:19:01 bird Exp $ */ 1 2 /* 2 * TYPELIB3 * 4 * Copyright 1997Marcus Meissner5 * 1999 Rein Klazes6 * 2000 Francois Jacques3 * TYPELIB 4 * 5 * Copyright 1997 Marcus Meissner 6 * 1999 Rein Klazes 7 * 2000 Francois Jacques 7 8 * -------------------------------------------------------------------------------------- 8 9 * Known problems (2000, Francois Jacques) 9 10 * 10 11 * - Tested using OLEVIEW (Platform SDK tool) only. 11 * 12 * - dual interface dispinterfaces. vtable-interface ITypeInfo instances are 13 * creating by doing a straight copy of the dispinterface instance and just changing 12 * 13 * - dual interface dispinterfaces. vtable-interface ITypeInfo instances are 14 * creating by doing a straight copy of the dispinterface instance and just changing 14 15 * its typekind. Pointed structures aren't copied - only the address of the pointers. 15 16 * So when you release the dispinterface, you delete the vtable-interface structures 16 17 * as well... fortunately, clean up of structures is not implemented. 17 * 18 * 18 19 * - locale stuff is partially implemented but hasn't been tested. 19 20 * … … 39 40 * -. some methods just return pointers to internal data structures, this is 40 41 * partly laziness, partly I want to check how windows does it. 41 * 42 * 42 43 */ 43 44 #ifdef __WIN32OS2__ … … 84 85 #ifndef __WIN32OS2__ 85 86 /**************************************************************************** 86 * QueryPathOfRegTypeLib[TYPELIB.14]87 * QueryPathOfRegTypeLib [TYPELIB.14] 87 88 * 88 89 * the path is "Classes\Typelib\<guid>\<major>.<minor>\<lcid>\win16\" 89 90 * RETURNS 90 * path of typelib91 * path of typelib 91 92 */ 92 93 HRESULT WINAPI 93 QueryPathOfRegTypeLib16( 94 REFGUID guid,/* [in] referenced guid */95 WORD wMaj,/* [in] major version */96 WORD wMin,/* [in] minor version */97 LCID lcid,/* [in] locale id */98 LPBSTR16 path/* [out] path of typelib */94 QueryPathOfRegTypeLib16( 95 REFGUID guid, /* [in] referenced guid */ 96 WORD wMaj, /* [in] major version */ 97 WORD wMin, /* [in] minor version */ 98 LCID lcid, /* [in] locale id */ 99 LPBSTR16 path /* [out] path of typelib */ 99 100 ) { 100 charxguid[80];101 chartypelibkey[100],pathname[260];102 DWORDplen;103 104 TRACE("\n");105 106 if (HIWORD(guid)) {101 char xguid[80]; 102 char typelibkey[100],pathname[260]; 103 DWORD plen; 104 105 TRACE("\n"); 106 107 if (HIWORD(guid)) { 107 108 sprintf( typelibkey, "SOFTWARE\\Classes\\Typelib\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\%d.%d\\%lx\\win16", 108 109 guid->Data1, guid->Data2, guid->Data3, … … 110 111 guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7], 111 112 wMaj,wMin,lcid); 112 } else {113 sprintf(xguid,"<guid 0x%08lx>",(DWORD)guid);114 FIXME("(%s,%d,%d,0x%04lx,%p),can't handle non-string guids.\n",xguid,wMaj,wMin,(DWORD)lcid,path);115 return E_FAIL;116 }117 plen = sizeof(pathname);118 if (RegQueryValueA(HKEY_LOCAL_MACHINE,typelibkey,pathname,&plen)) {119 /* try again without lang specific id */120 if (SUBLANGID(lcid))121 return QueryPathOfRegTypeLib16(guid,wMaj,wMin,PRIMARYLANGID(lcid),path);122 FIXME("key %s not found\n",typelibkey);123 return E_FAIL;124 }125 *path = SysAllocString16(pathname);126 return S_OK;113 } else { 114 sprintf(xguid,"<guid 0x%08lx>",(DWORD)guid); 115 FIXME("(%s,%d,%d,0x%04lx,%p),can't handle non-string guids.\n",xguid,wMaj,wMin,(DWORD)lcid,path); 116 return E_FAIL; 117 } 118 plen = sizeof(pathname); 119 if (RegQueryValueA(HKEY_LOCAL_MACHINE,typelibkey,pathname,&plen)) { 120 /* try again without lang specific id */ 121 if (SUBLANGID(lcid)) 122 return QueryPathOfRegTypeLib16(guid,wMaj,wMin,PRIMARYLANGID(lcid),path); 123 FIXME("key %s not found\n",typelibkey); 124 return E_FAIL; 125 } 126 *path = SysAllocString16(pathname); 127 return S_OK; 127 128 } 128 129 #endif 129 130 130 131 /**************************************************************************** 131 * QueryPathOfRegTypeLib[OLEAUT32.164]132 * QueryPathOfRegTypeLib [OLEAUT32.164] 132 133 * RETURNS 133 * path of typelib134 * path of typelib 134 135 */ 135 136 HRESULT WINAPI 136 QueryPathOfRegTypeLib( 137 REFGUID guid,/* [in] referenced guid */138 WORD wMaj,/* [in] major version */139 WORD wMin,/* [in] minor version */140 LCID lcid,/* [in] locale id */141 LPBSTR path )/* [out] path of typelib */137 QueryPathOfRegTypeLib( 138 REFGUID guid, /* [in] referenced guid */ 139 WORD wMaj, /* [in] major version */ 140 WORD wMin, /* [in] minor version */ 141 LCID lcid, /* [in] locale id */ 142 LPBSTR path ) /* [out] path of typelib */ 142 143 { 143 144 /* don't need to ZeroMemory those arrays since sprintf and RegQueryValue add … … 171 172 "SOFTWARE\\Classes\\Typelib\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\%d.%d\\%lx\\win32", 172 173 guid->Data1, guid->Data2, guid->Data3, 173 guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], 174 guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], 174 175 guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7], 175 176 wMaj, … … 211 212 } 212 213 } 213 214 214 215 if (hr != S_OK) 215 TRACE_(typelib)("%s not found\n", szTypeLibKey);216 216 TRACE_(typelib)("%s not found\n", szTypeLibKey); 217 217 218 return hr; 218 219 } … … 226 227 */ 227 228 HRESULT WINAPI CreateTypeLib( 228 SYSKIND syskind, LPCOLESTR szFile, ICreateTypeLib** ppctlib229 SYSKIND syskind, LPCOLESTR szFile, ICreateTypeLib** ppctlib 229 230 ) { 230 231 FIXME("(%d,%s,%p), stub!\n",syskind,debugstr_w(szFile),ppctlib); … … 256 257 257 258 /****************************************************************************** 258 * LoadTypeLib[OLEAUT32.161]259 * LoadTypeLib [OLEAUT32.161] 259 260 * Loads and registers a type library 260 261 * NOTES … … 277 278 278 279 /****************************************************************************** 279 * LoadTypeLibEx[OLEAUT32.183]280 * LoadTypeLibEx [OLEAUT32.183] 280 281 * Loads and optionally registers a type library 281 282 * … … 292 293 HRESULT res; 293 294 TRACE("(%s,%d,%p)\n",debugstr_w(szFile), regkind, pptLib); 294 295 295 296 p=HEAP_strdupWtoA(GetProcessHeap(),0,szFile); 296 297 297 298 res= TLB_ReadTypeLib(p, (ITypeLib2**)pptLib); 298 299 … … 323 324 324 325 /****************************************************************************** 325 * LoadRegTypeLib[OLEAUT32.162]326 */ 327 HRESULT WINAPI LoadRegTypeLib( 328 REFGUID rguid,/* [in] referenced guid */329 WORD wVerMajor,/* [in] major version */330 WORD wVerMinor,/* [in] minor version */331 LCID lcid,/* [in] locale id */332 ITypeLib **ppTLib)/* [out] path of typelib */326 * LoadRegTypeLib [OLEAUT32.162] 327 */ 328 HRESULT WINAPI LoadRegTypeLib( 329 REFGUID rguid, /* [in] referenced guid */ 330 WORD wVerMajor, /* [in] major version */ 331 WORD wVerMinor, /* [in] minor version */ 332 LCID lcid, /* [in] locale id */ 333 ITypeLib **ppTLib) /* [out] path of typelib */ 333 334 { 334 335 BSTR bstr=NULL; … … 344 345 345 346 return res; 346 } 347 } 347 348 348 349 349 350 /****************************************************************************** 350 * RegisterTypeLib[OLEAUT32.163]351 * Adds information about a type library to the System Registry 351 * RegisterTypeLib [OLEAUT32.163] 352 * Adds information about a type library to the System Registry 352 353 * NOTES 353 354 * Docs: ITypeLib FAR * ptlib … … 363 364 OLECHAR * szFullPath, /* [in] full Path of the library*/ 364 365 OLECHAR * szHelpDir) /* [in] dir to the helpfile for the library, 365 may be NULL*/366 may be NULL*/ 366 367 { 367 368 HRESULT res; … … 444 445 445 446 /****************************************************************************** 446 * UnRegisterTypeLib[OLEAUT32.186]447 * Removes information about a type library from the System Registry 447 * UnRegisterTypeLib [OLEAUT32.186] 448 * Removes information about a type library from the System Registry 448 449 * NOTES 449 450 * … … 453 454 */ 454 455 HRESULT WINAPI UnRegisterTypeLib( 455 REFGUID libid, /* [in] Guid of the library */456 WORD wVerMajor,/* [in] major version */457 WORD wVerMinor,/* [in] minor version */458 LCID lcid,/* [in] locale id */459 SYSKIND syskind)460 { 456 REFGUID libid, /* [in] Guid of the library */ 457 WORD wVerMajor, /* [in] major version */ 458 WORD wVerMinor, /* [in] minor version */ 459 LCID lcid, /* [in] locale id */ 460 SYSKIND syskind) 461 { 461 462 TRACE("(IID: %s): stub\n",debugstr_guid(libid)); 462 return S_OK; /* FIXME: pretend everything is OK */463 return S_OK; /* FIXME: pretend everything is OK */ 463 464 } 464 465 465 466 #ifndef __WIN32OS2__ 466 467 /**************************************************************************** 467 * OaBuildVersion(TYPELIB.15)468 * OaBuildVersion (TYPELIB.15) 468 469 * 469 470 * known TYPELIB.DLL versions: 470 471 * 471 * OLE 2.01 no OaBuildVersion() avail 1993 -----472 * OLE 2.02 1993-9402 3002473 * OLE 2.03 23730474 * OLE 2.03 03 3025475 * OLE 2.03 W98 SE orig. file !! 1993-9510 3024476 * OLE 2.1 NT 1993-95 ?????477 * OLE 2.3.1 W95 23700478 * OLE2 4.0 NT4SP6 1993-9840 4277472 * OLE 2.01 no OaBuildVersion() avail 1993 -- --- 473 * OLE 2.02 1993-94 02 3002 474 * OLE 2.03 23 730 475 * OLE 2.03 03 3025 476 * OLE 2.03 W98 SE orig. file !! 1993-95 10 3024 477 * OLE 2.1 NT 1993-95 ?? ??? 478 * OLE 2.3.1 W95 23 700 479 * OLE2 4.0 NT4SP6 1993-98 40 4277 479 480 */ 480 481 DWORD WINAPI OaBuildVersion16(void) … … 488 489 { 489 490 case 0x80000a03: /* WIN31 */ 490 return MAKELONG(3027, 3); /* WfW 3.11 */491 return MAKELONG(3027, 3); /* WfW 3.11 */ 491 492 case 0x80000004: /* WIN95 */ 492 return MAKELONG(700, 23); /* Win95A */493 return MAKELONG(700, 23); /* Win95A */ 493 494 case 0x80000a04: /* WIN98 */ 494 return MAKELONG(3024, 10); /* W98 SE */495 return MAKELONG(3024, 10); /* W98 SE */ 495 496 case 0x00000004: /* NT4 */ 496 return MAKELONG(4277, 40); /* NT4 SP6 */497 return MAKELONG(4277, 40); /* NT4 SP6 */ 497 498 default: 498 FIXME("Version value not known yet. Please investigate it!\n");499 return 0;499 FIXME("Version value not known yet. Please investigate it!\n"); 500 return 0; 500 501 } 501 502 } … … 507 508 /*======================= ITypeLib implementation =======================*/ 508 509 509 typedef struct tagTLBCustData 510 typedef struct tagTLBCustData 510 511 { 511 512 GUID guid; … … 521 522 BSTR name; /* name; */ 522 523 523 LCID lcid;/* lcid of imported typelib */524 525 WORD wVersionMajor; /* major version number */524 LCID lcid; /* lcid of imported typelib */ 525 526 WORD wVersionMajor; /* major version number */ 526 527 WORD wVersionMinor; /* minor version number */ 527 528 … … 536 537 UINT ref; 537 538 TLIBATTR LibAttr; /* guid,lcid,syskind,version,flags */ 538 539 539 540 /* strings can be stored in tlb as multibyte strings BUT they are *always* 540 * exported to the application as a UNICODE string.541 */542 BSTR Name;541 * exported to the application as a UNICODE string. 542 */ 543 BSTR Name; 543 544 BSTR DocString; 544 545 BSTR HelpFile; … … 579 580 int ctCustData; 580 581 TLBCustData * pCustData; /* linked list to cust data; */ 581 TLBRefType * pRefType;/* linked list to referenced types */582 TLBRefType * pRefType; /* linked list to referenced types */ 582 583 } TLBParDesc; 583 584 … … 594 595 int ctCustData; 595 596 TLBCustData * pCustData; /* linked list to cust data; */ 596 struct tagTLBFuncDesc * next; 597 struct tagTLBFuncDesc * next; 597 598 } TLBFuncDesc; 598 599 … … 607 608 int ctCustData; 608 609 TLBCustData * pCustData;/* linked list to cust data; */ 609 struct tagTLBVarDesc * next; 610 struct tagTLBVarDesc * next; 610 611 } TLBVarDesc; 611 612 … … 618 619 ITypeLibImpl * pTypeLib; /* back pointer to typelib */ 619 620 int index; /* index in this typelib; */ 620 /* type libs seem to store the doc strings in ascii 621 /* type libs seem to store the doc strings in ascii 621 622 * so why should we do it in unicode? 622 623 */ … … 633 634 634 635 /* Implemented Interfaces */ 635 TLBRefType * impltypelist; 636 TLBRefType * impltypelist; 636 637 int ctCustData; 637 638 TLBCustData * pCustData; /* linked list to cust data; */ … … 645 646 typedef struct tagTLBContext 646 647 { 647 unsigned int oStart; /* start of TLB in file */648 unsigned int pos; /* current pos */649 unsigned int length; /* total length */650 void *mapping; /* memory mapping */651 TLBSegDir * pTblDir;652 ITypeLibImpl* pLibInfo;648 unsigned int oStart; /* start of TLB in file */ 649 unsigned int pos; /* current pos */ 650 unsigned int length; /* total length */ 651 void *mapping; /* memory mapping */ 652 TLBSegDir * pTblDir; 653 ITypeLibImpl* pLibInfo; 653 654 } TLBContext; 654 655 … … 744 745 static void dump_TLBFuncDesc(TLBFuncDesc * pfd) 745 746 { 746 while (pfd)747 {748 dump_TLBFuncDescOne(pfd);749 pfd = pfd->next;750 };747 while (pfd) 748 { 749 dump_TLBFuncDescOne(pfd); 750 pfd = pfd->next; 751 }; 751 752 } 752 753 static void dump_TLBVarDesc(TLBVarDesc * pvd) 753 754 { 754 while (pvd)755 {756 TRACE_(typelib)("%s\n", debugstr_w(pvd->Name));757 pvd = pvd->next;758 };755 while (pvd) 756 { 757 TRACE_(typelib)("%s\n", debugstr_w(pvd->Name)); 758 pvd = pvd->next; 759 }; 759 760 } 760 761 static void dump_TLBRefType(TLBRefType * prt) 761 762 { 762 while (prt)763 {764 TRACE_(typelib)("%s\n", debugstr_guid(&(prt->guid)));765 TRACE_(typelib)(" href:0x%08lx\n", prt->reference);766 prt = prt->next;767 };763 while (prt) 764 { 765 TRACE_(typelib)("%s\n", debugstr_guid(&(prt->guid))); 766 TRACE_(typelib)(" href:0x%08lx\n", prt->reference); 767 prt = prt->next; 768 }; 768 769 } 769 770 … … 771 772 { 772 773 char szVarType[15]; 773 774 774 775 TRACE("(%p)\n", pvar); 775 776 776 777 if (!pvar) return; 777 778 778 779 ZeroMemory(szVarType, sizeof(szVarType)); 779 780 780 781 /* FIXME : we could have better trace here, depending on the VARTYPE 781 782 * of the variant … … 784 785 785 786 TRACE("VARTYPE: %s\n", szVarType); 786 787 787 788 switch (V_VT(pvar)) 788 789 { … … 790 791 TRACE("%3.3e\n", V_UNION(pvar, fltVal)); 791 792 break; 792 793 793 794 case VT_R8: 794 795 TRACE("%3.3e\n", V_UNION(pvar, dblVal)); 795 796 break; 796 797 797 798 default: 798 799 TRACE("%ld\n", V_UNION(pvar, lVal)); 799 800 break; 800 } 801 } 801 802 802 803 if (V_VT(pvar) & VT_BYREF) … … 807 808 { 808 809 int index = 0; 809 810 810 811 TRACE("args=%u named args=%u\n", pdp->cArgs, pdp->cNamedArgs); 811 812 … … 819 820 static char * typekind_desc[] = 820 821 { 821 "TKIND_ENUM",822 "TKIND_RECORD",823 "TKIND_MODULE",824 "TKIND_INTERFACE",825 "TKIND_DISPATCH",826 "TKIND_COCLASS",827 "TKIND_ALIAS",828 "TKIND_UNION",829 "TKIND_MAX"822 "TKIND_ENUM", 823 "TKIND_RECORD", 824 "TKIND_MODULE", 825 "TKIND_INTERFACE", 826 "TKIND_DISPATCH", 827 "TKIND_COCLASS", 828 "TKIND_ALIAS", 829 "TKIND_UNION", 830 "TKIND_MAX" 830 831 }; 831 832 … … 846 847 static char * typekind_desc[] = 847 848 { 848 "TKIND_ENUM",849 "TKIND_RECORD",850 "TKIND_MODULE",851 "TKIND_INTERFACE",852 "TKIND_DISPATCH",853 "TKIND_COCLASS",854 "TKIND_ALIAS",855 "TKIND_UNION",856 "TKIND_MAX"849 "TKIND_ENUM", 850 "TKIND_RECORD", 851 "TKIND_MODULE", 852 "TKIND_INTERFACE", 853 "TKIND_DISPATCH", 854 "TKIND_COCLASS", 855 "TKIND_ALIAS", 856 "TKIND_UNION", 857 "TKIND_MAX" 857 858 }; 858 859 #define dump_TypeInfo(a) … … 936 937 937 938 TLB_Read(&niName, sizeof(niName), pcx, 938 pcx->pTblDir->pNametab.offset+offset);939 pcx->pTblDir->pNametab.offset+offset); 939 940 niName.namelen &= 0xFF; /* FIXME: correct ? */ 940 941 name=TLB_Alloc((niName.namelen & 0xff) +1); … … 996 997 } 997 998 /* 998 * read a value and fill a VARIANT structure 999 * read a value and fill a VARIANT structure 999 1000 */ 1000 1001 static void TLB_ReadValue( VARIANT * pVar, int offset, TLBContext *pcx ) … … 1009 1010 return; 1010 1011 } 1011 TLB_Read(&(V_VT(pVar)), sizeof(VARTYPE), pcx, 1012 TLB_Read(&(V_VT(pVar)), sizeof(VARTYPE), pcx, 1012 1013 pcx->pTblDir->pCustData.offset + offset ); 1013 1014 TRACE_(typelib)("Vartype = %x\n", V_VT(pVar)); … … 1018 1019 case VT_I4 : 1019 1020 case VT_R4 : 1020 case VT_ERROR : 1021 case VT_BOOL : 1022 case VT_I1 : 1023 case VT_UI1 : 1024 case VT_UI2 : 1025 case VT_UI4 : 1026 case VT_INT : 1027 case VT_UINT : 1021 case VT_ERROR : 1022 case VT_BOOL : 1023 case VT_I1 : 1024 case VT_UI1 : 1025 case VT_UI2 : 1026 case VT_UI4 : 1027 case VT_INT : 1028 case VT_UINT : 1028 1029 case VT_VOID : /* FIXME: is this right? */ 1029 case VT_HRESULT : 1030 case VT_HRESULT : 1030 1031 size=4; break; 1031 1032 case VT_R8 : 1032 1033 case VT_CY : 1033 case VT_DATE : 1034 case VT_I8 : 1035 case VT_UI8 : 1034 case VT_DATE : 1035 case VT_I8 : 1036 case VT_UI8 : 1036 1037 case VT_DECIMAL : /* FIXME: is this right? */ 1037 1038 case VT_FILETIME : … … 1041 1042 char * ptr; 1042 1043 TLB_Read(&size, sizeof(INT), pcx, DO_NOT_SEEK ); 1043 if(size <= 0) {1044 FIXME("BSTR length = %d?\n", size);1045 } else {1044 if(size <= 0) { 1045 FIXME("BSTR length = %d?\n", size); 1046 } else { 1046 1047 ptr=TLB_Alloc(size);/* allocate temp buffer */ 1047 TLB_Read(ptr, size, pcx, DO_NOT_SEEK); /* read string (ANSI) */1048 V_UNION(pVar, bstrVal)=SysAllocStringLen(NULL,size);1049 /* FIXME: do we need a AtoW conversion here? */1050 V_UNION(pVar, bstrVal[size])=L'\0';1051 while(size--) V_UNION(pVar, bstrVal[size])=ptr[size];1052 TLB_Free(ptr);1053 }1054 }1055 size=-4; break;1048 TLB_Read(ptr, size, pcx, DO_NOT_SEEK); /* read string (ANSI) */ 1049 V_UNION(pVar, bstrVal)=SysAllocStringLen(NULL,size); 1050 /* FIXME: do we need a AtoW conversion here? */ 1051 V_UNION(pVar, bstrVal[size])=L'\0'; 1052 while(size--) V_UNION(pVar, bstrVal[size])=ptr[size]; 1053 TLB_Free(ptr); 1054 } 1055 } 1056 size=-4; break; 1056 1057 /* FIXME: this will not work AT ALL when the variant contains a pointer */ 1057 1058 case VT_DISPATCH : 1058 case VT_VARIANT : 1059 case VT_UNKNOWN : 1060 case VT_PTR : 1059 case VT_VARIANT : 1060 case VT_UNKNOWN : 1061 case VT_PTR : 1061 1062 case VT_SAFEARRAY : 1062 case VT_CARRAY : 1063 case VT_USERDEFINED : 1064 case VT_LPSTR : 1065 case VT_LPWSTR : 1066 case VT_BLOB : 1067 case VT_STREAM : 1068 case VT_STORAGE : 1069 case VT_STREAMED_OBJECT : 1070 case VT_STORED_OBJECT : 1071 case VT_BLOB_OBJECT : 1072 case VT_CF : 1073 case VT_CLSID : 1074 default: 1075 size=0; 1063 case VT_CARRAY : 1064 case VT_USERDEFINED : 1065 case VT_LPSTR : 1066 case VT_LPWSTR : 1067 case VT_BLOB : 1068 case VT_STREAM : 1069 case VT_STORAGE : 1070 case VT_STREAMED_OBJECT : 1071 case VT_STORED_OBJECT : 1072 case VT_BLOB_OBJECT : 1073 case VT_CF : 1074 case VT_CLSID : 1075 default: 1076 size=0; 1076 1077 FIXME("VARTYPE %d is not supported, setting pointer to NULL\n", 1077 1078 V_VT(pVar)); … … 1096 1097 count++; 1097 1098 pNew=TLB_Alloc(sizeof(TLBCustData)); 1098 TLB_Read(&entry, sizeof(entry), pcx, 1099 TLB_Read(&entry, sizeof(entry), pcx, 1099 1100 pcx->pTblDir->pCDGuids.offset+offset); 1100 1101 TLB_ReadGuid(&(pNew->guid), entry.GuidOffset , pcx); … … 1118 1119 } 1119 1120 1120 static void 1121 TLB_DoFuncs(TLBContext* pcx, 1122 int cFuncs, 1121 static void 1122 TLB_DoFuncs(TLBContext* pcx, 1123 int cFuncs, 1123 1124 int cVars, 1124 int offset, 1125 int offset, 1125 1126 TLBFuncDesc** pptfd) 1126 1127 { 1127 /* 1128 /* 1128 1129 * member information is stored in a data structure at offset 1129 1130 * indicated by the memoffset field of the typeinfo structure 1130 1131 * There are several distinctive parts. 1131 * the first part starts with a field that holds the total length 1132 * the first part starts with a field that holds the total length 1132 1133 * of this (first) part excluding this field. Then follow the records, 1133 1134 * for each member there is one record. 1134 1135 * 1135 1136 * First entry is always the length of the record (excluding this 1136 * length word). 1137 * Rest of the record depends on the type of the member. If there is 1137 * length word). 1138 * Rest of the record depends on the type of the member. If there is 1138 1139 * a field indicating the member type (function variable intereface etc) 1139 1140 * I have not found it yet. At this time we depend on the information … … 1142 1143 * Second follows an array sized nrMEM*sizeof(INT) with a memeber id 1143 1144 * for each member; 1144 * 1145 * Third is a equal sized array with file offsets to the name entry 1145 * 1146 * Third is a equal sized array with file offsets to the name entry 1146 1147 * of each member. 1147 * 1148 * 1148 1149 * Forth and last (?) part is an array with offsets to the records in the 1149 1150 * first part of this file segment. … … 1165 1166 1166 1167 /* name, eventually add to a hash table */ 1167 TLB_Read(&nameoffset, 1168 sizeof(INT), 1169 pcx, 1168 TLB_Read(&nameoffset, 1169 sizeof(INT), 1170 pcx, 1170 1171 offset + infolen + (cFuncs + cVars + i + 1) * sizeof(INT)); 1171 1172 … … 1174 1175 /* read the function information record */ 1175 1176 TLB_Read(&reclength, sizeof(INT), pcx, recoffset); 1176 1177 1177 1178 reclength &= 0x1ff; 1178 1179 1179 TLB_Read(pFuncRec, reclength - sizeof(INT), pcx, DO_NOT_SEEK) ; 1180 TLB_Read(pFuncRec, reclength - sizeof(INT), pcx, DO_NOT_SEEK) ; 1180 1181 1181 1182 /* do the attributes */ … … 1186 1187 { 1187 1188 (*pptfd)->helpcontext = pFuncRec->OptAttr[0] ; 1188 1189 1189 1190 if ( nrattributes > 1 ) 1190 1191 { … … 1209 1210 if ( nrattributes > 6 && pFuncRec->FKCCIC & 0x80 ) 1210 1211 { 1211 TLB_CustData(pcx, 1212 TLB_CustData(pcx, 1212 1213 pFuncRec->OptAttr[6], 1213 1214 &(*pptfd)->pCustData); … … 1219 1220 1220 1221 /* fill the FuncDesc Structure */ 1221 TLB_Read( & (*pptfd)->funcdesc.memid, 1222 sizeof(INT), pcx, 1222 TLB_Read( & (*pptfd)->funcdesc.memid, 1223 sizeof(INT), pcx, 1223 1224 offset + infolen + ( i + 1) * sizeof(INT)); 1224 1225 … … 1231 1232 (*pptfd)->funcdesc.wFuncFlags = LOWORD(pFuncRec->Flags) ; 1232 1233 1233 TLB_GetTdesc(pcx, 1234 pFuncRec->DataType, 1234 TLB_GetTdesc(pcx, 1235 pFuncRec->DataType, 1235 1236 &(*pptfd)->funcdesc.elemdescFunc.tdesc) ; 1236 1237 … … 1241 1242 TLBParameterInfo paraminfo; 1242 1243 1243 (*pptfd)->funcdesc.lprgelemdescParam = 1244 (*pptfd)->funcdesc.lprgelemdescParam = 1244 1245 TLB_Alloc(pFuncRec->nrargs * sizeof(ELEMDESC)); 1245 1246 1246 (*pptfd)->pParamDesc = 1247 (*pptfd)->pParamDesc = 1247 1248 TLB_Alloc(pFuncRec->nrargs * sizeof(TLBParDesc)); 1248 1249 1249 1250 TLB_Read(¶minfo, 1250 sizeof(paraminfo), 1251 pcx, 1251 sizeof(paraminfo), 1252 pcx, 1252 1253 recoffset + reclength - 1253 1254 pFuncRec->nrargs * sizeof(TLBParameterInfo)); … … 1257 1258 TYPEDESC* lpArgTypeDesc = 0; 1258 1259 1259 TLB_GetTdesc(pcx, 1260 paraminfo.DataType, 1260 TLB_GetTdesc(pcx, 1261 paraminfo.DataType, 1261 1262 &(*pptfd)->funcdesc.lprgelemdescParam[j].tdesc) ; 1262 1263 … … 1265 1266 (*pptfd)->pParamDesc[j].Name = (void *) paraminfo.oName; 1266 1267 1267 /* SEEK value = jump to offset, 1268 /* SEEK value = jump to offset, 1268 1269 * from there jump to the end of record, 1269 1270 * go back by (j-1) arguments … … 1271 1272 TLB_Read( ¶minfo , 1272 1273 sizeof(TLBParameterInfo), pcx, 1273 recoffset + reclength - ((pFuncRec->nrargs - j - 1) 1274 recoffset + reclength - ((pFuncRec->nrargs - j - 1) 1274 1275 * sizeof(TLBParameterInfo))); 1275 lpArgTypeDesc = 1276 lpArgTypeDesc = 1276 1277 & ((*pptfd)->funcdesc.lprgelemdescParam[j].tdesc); 1277 1278 … … 1289 1290 1290 1291 case VT_USERDEFINED: 1291 (*pptfd)->pParamDesc[j].pRefType = 1292 (*pptfd)->pParamDesc[j].pRefType = 1292 1293 TLB_Alloc(sizeof(TLBRefType)); 1293 1294 1294 TLB_DoRefType(pcx, 1295 lpArgTypeDesc->u.hreftype, 1295 TLB_DoRefType(pcx, 1296 lpArgTypeDesc->u.hreftype, 1296 1297 & ( (*pptfd)->pParamDesc[j].pRefType )); 1297 1298 … … 1311 1312 TYPEDESC* lpArgTypeDesc; 1312 1313 1313 (*pptfd)->funcdesc.elemdescFunc = 1314 (*pptfd)->funcdesc.elemdescFunc = 1314 1315 (*pptfd)->funcdesc.lprgelemdescParam[j]; 1315 1316 … … 1324 1325 break; 1325 1326 case VT_CARRAY: 1326 lpArgTypeDesc = 1327 lpArgTypeDesc = 1327 1328 & (lpArgTypeDesc->u.lpadesc->tdescElem); 1328 1329 … … 1330 1331 1331 1332 case VT_USERDEFINED: 1332 (*pptfd)->pParamDesc[j].pRefType 1333 (*pptfd)->pParamDesc[j].pRefType 1333 1334 = TLB_Alloc(sizeof(TLBRefType)); 1334 1335 1335 TLB_DoRefType(pcx, 1336 lpArgTypeDesc->u.hreftype, 1336 TLB_DoRefType(pcx, 1337 lpArgTypeDesc->u.hreftype, 1337 1338 &((*pptfd)->pParamDesc[j].pRefType)); 1338 1339 … … 1354 1355 1355 1356 /* default value */ 1356 if ( (PARAMFLAG_FHASDEFAULT & 1357 if ( (PARAMFLAG_FHASDEFAULT & 1357 1358 (*pptfd)->funcdesc.lprgelemdescParam[j].u.paramdesc.wParamFlags) && 1358 1359 ((pFuncRec->FKCCIC) & 0x1000) ) 1359 1360 { 1360 INT* pInt = (INT *)((char *)pFuncRec + 1361 reclength - 1361 INT* pInt = (INT *)((char *)pFuncRec + 1362 reclength - 1362 1363 (pFuncRec->nrargs * 4 + 1) * sizeof(INT) ); 1363 1364 … … 1367 1368 pParamDesc->pparamdescex->cBytes = sizeof(PARAMDESCEX); 1368 1369 1369 TLB_ReadValue(&(pParamDesc->pparamdescex->varDefaultValue), 1370 TLB_ReadValue(&(pParamDesc->pparamdescex->varDefaultValue), 1370 1371 pInt[j], pcx); 1371 1372 } … … 1373 1374 if ( nrattributes > 7 + j && pFuncRec->FKCCIC & 0x80 ) 1374 1375 { 1375 TLB_CustData(pcx, 1376 TLB_CustData(pcx, 1376 1377 pFuncRec->OptAttr[7+j], 1377 1378 &(*pptfd)->pParamDesc[j].pCustData); … … 1400 1401 1401 1402 TLB_Read(&infolen,sizeof(INT), pcx, offset); 1402 TLB_Read(&recoffset,sizeof(INT), pcx, offset + infolen + 1403 TLB_Read(&recoffset,sizeof(INT), pcx, offset + infolen + 1403 1404 ((cFuncs+cVars)*2+cFuncs + 1)*sizeof(INT)); 1404 1405 recoffset += offset+sizeof(INT); … … 1406 1407 *pptvd=TLB_Alloc(sizeof(TLBVarDesc)); 1407 1408 /* name, eventually add to a hash table */ 1408 TLB_Read(&nameoffset, sizeof(INT), pcx, 1409 TLB_Read(&nameoffset, sizeof(INT), pcx, 1409 1410 offset + infolen + (cFuncs + cVars + i + 1) * sizeof(INT)); 1410 1411 (*pptvd)->Name=TLB_ReadName(pcx, nameoffset); … … 1412 1413 TLB_Read(&reclength, sizeof(INT), pcx, recoffset); 1413 1414 reclength &=0xff; 1414 TLB_Read(pVarRec, reclength - sizeof(INT), pcx, DO_NOT_SEEK) ; 1415 TLB_Read(pVarRec, reclength - sizeof(INT), pcx, DO_NOT_SEEK) ; 1415 1416 /* Optional data */ 1416 1417 if(reclength >(6*sizeof(INT)) ) … … 1422 1423 (*pptvd)->HelpStringContext=pVarRec->HelpStringContext; 1423 1424 /* fill the VarDesc Structure */ 1424 TLB_Read(&(*pptvd)->vardesc.memid, sizeof(INT), pcx, 1425 TLB_Read(&(*pptvd)->vardesc.memid, sizeof(INT), pcx, 1425 1426 offset + infolen + ( i + 1) * sizeof(INT)); 1426 1427 (*pptvd)->vardesc.varkind = pVarRec->VarKind; 1427 1428 (*pptvd)->vardesc.wVarFlags = pVarRec->Flags; 1428 TLB_GetTdesc(pcx, pVarRec->DataType, 1429 TLB_GetTdesc(pcx, pVarRec->DataType, 1429 1430 &(*pptvd)->vardesc.elemdescVar.tdesc) ; 1430 1431 /* (*pptvd)->vardesc.lpstrSchema; is reserved (SDK) fixme?? */ … … 1443 1444 * If comes from import, its an offset+1 in the ImpInfo table 1444 1445 * */ 1445 static void TLB_DoRefType(TLBContext *pcx, 1446 static void TLB_DoRefType(TLBContext *pcx, 1446 1447 int offset, TLBRefType ** pprtd) 1447 1448 { … … 1457 1458 TRACE_(typelib)("offset %x, masked offset %x\n", offset, offset + (offset & 0xfffffffc)); 1458 1459 1459 TLB_Read(&impinfo, sizeof(impinfo), pcx, 1460 TLB_Read(&impinfo, sizeof(impinfo), pcx, 1460 1461 pcx->pTblDir->pImpInfo.offset + (offset & 0xfffffffc)); 1461 1462 for(j=0;pImpLib;j++){ /* search the known offsets of all import libraries */ … … 1538 1539 ptiRet->TypeAttr.cbSizeVft=tiBase.cbSizeVft; /* FIXME: this is only the non inherited part */ 1539 1540 if(ptiRet->TypeAttr.typekind == TKIND_ALIAS) 1540 TLB_GetTdesc(pcx, tiBase.datatype1, 1541 TLB_GetTdesc(pcx, tiBase.datatype1, 1541 1542 &ptiRet->TypeAttr.tdescAlias) ; 1542 1543 … … 1556 1557 /* functions */ 1557 1558 if(ptiRet->TypeAttr.cFuncs >0 ) 1558 TLB_DoFuncs(pcx, ptiRet->TypeAttr.cFuncs ,ptiRet->TypeAttr.cVars, 1559 TLB_DoFuncs(pcx, ptiRet->TypeAttr.cFuncs ,ptiRet->TypeAttr.cVars, 1559 1560 tiBase.memoffset, & ptiRet->funclist); 1560 1561 /* variables */ 1561 1562 if(ptiRet->TypeAttr.cVars >0 ) 1562 TLB_DoVars(pcx, ptiRet->TypeAttr.cFuncs ,ptiRet->TypeAttr.cVars, 1563 TLB_DoVars(pcx, ptiRet->TypeAttr.cFuncs ,ptiRet->TypeAttr.cVars, 1563 1564 tiBase.memoffset, & ptiRet->varlist); 1564 1565 if(ptiRet->TypeAttr.cImplTypes >0 ){ … … 1566 1567 { 1567 1568 case TKIND_COCLASS: 1568 TLB_DoImplTypes(pcx, ptiRet->TypeAttr.cImplTypes , 1569 TLB_DoImplTypes(pcx, ptiRet->TypeAttr.cImplTypes , 1569 1570 tiBase.datatype1, & ptiRet->impltypelist); 1570 1571 break; 1571 1572 case TKIND_DISPATCH: 1572 1573 ptiRet->impltypelist=TLB_Alloc(sizeof(TLBRefType)); 1573 1574 1574 1575 if (tiBase.datatype1 != -1) 1575 1576 { … … 1580 1581 char* szStdOle = "stdole2.tlb\0"; 1581 1582 int nStdOleLen = strlen(szStdOle); 1582 1583 1583 1584 ptiRet->impltypelist->guid = IID_IDispatch; 1584 1585 ptiRet->impltypelist->reference = -1; 1585 1586 ptiRet->impltypelist->pImpTLInfo = TLB_Alloc(sizeof(TLBImpLib)); 1586 ptiRet->impltypelist->pImpTLInfo->guid = IID_StdOle; 1587 ptiRet->impltypelist->pImpTLInfo->guid = IID_StdOle; 1587 1588 ptiRet->impltypelist->pImpTLInfo->name = SysAllocStringLen(NULL, nStdOleLen + 1); 1588 1589 1589 1590 MultiByteToWideChar(CP_ACP, 1590 1591 MB_PRECOMPOSED, … … 1593 1594 ptiRet->impltypelist->pImpTLInfo->name, 1594 1595 SysStringLen(ptiRet->impltypelist->pImpTLInfo->name)); 1595 1596 1596 1597 ptiRet->impltypelist->pImpTLInfo->lcid = 0; 1597 1598 ptiRet->impltypelist->pImpTLInfo->wVersionMajor = 2; … … 1617 1618 1618 1619 /**************************************************************************** 1619 * TLB_ReadTypeLib1620 * TLB_ReadTypeLib 1620 1621 * 1621 1622 * find the type of the typelib file and map the typelib resource into … … 1639 1640 1640 1641 /* is it a DLL? */ 1641 for (i=0 ; i < nStrLen ; ++i)1642 {1643 pszFileName[i] = tolower(pszFileName[i]);1644 }1642 for (i=0 ; i < nStrLen ; ++i) 1643 { 1644 pszFileName[i] = tolower(pszFileName[i]); 1645 } 1645 1646 pszTypeLibIndex = strstr(pszFileName, ".dll"); 1646 1647 … … 1656 1657 /* yes -> it's a index! store DLL name, without the trailing back-slash */ 1657 1658 size_t nMemToAlloc = pszTypeLibIndex - pszFileName; 1658 1659 1659 1660 pszDllName = HeapAlloc(GetProcessHeap(), 1660 HEAP_ZERO_MEMORY, 1661 HEAP_ZERO_MEMORY, 1661 1662 nMemToAlloc + 1); 1662 1663 1663 1664 strncpy(pszDllName, pszFileName, nMemToAlloc); 1664 1665 1665 1666 /* move index string pointer pass the backslash */ 1666 1667 while (*pszTypeLibIndex == '\\') … … 1671 1672 /* No index, reset variable to 1 */ 1672 1673 pszDllName = HeapAlloc(GetProcessHeap(), 1673 HEAP_ZERO_MEMORY, 1674 HEAP_ZERO_MEMORY, 1674 1675 nStrLen + 1); 1675 1676 1676 1677 strncpy(pszDllName, pszFileName, nStrLen); 1677 1678 1678 1679 pszTypeLibIndex = "1\0"; 1679 1680 } … … 1699 1700 /* retrieve file size */ 1700 1701 DWORD dwTLBLength = GetFileSize(hFile, NULL); 1701 1702 1702 1703 *ppTypeLib = ITypeLib2_Constructor(pBase, dwTLBLength); 1703 1704 ITypeLib2_AddRef(*ppTypeLib); … … 1725 1726 LPVOID pBase = LockResource(hGlobal); 1726 1727 DWORD dwTLBLength = SizeofResource(hinstDLL, hrsrc); 1727 1728 1728 1729 if (pBase) 1729 1730 { … … 1760 1761 1761 1762 /**************************************************************************** 1762 * ITypeLib2_Constructor1763 * ITypeLib2_Constructor 1763 1764 * 1764 1765 * loading a typelib from a in-memory image … … 1786 1787 cx.pLibInfo = pTypeLibImpl; 1787 1788 cx.length = dwTLBLength; 1788 1789 1789 1790 /* read header */ 1790 1791 TLB_Read((void*)&tlbHeader, sizeof(tlbHeader), &cx, 0); … … 1792 1793 TRACE("\tmagic1=0x%08x ,magic2=0x%08x\n",tlbHeader.magic1,tlbHeader.magic2 ); 1793 1794 if (memcmp(&tlbHeader.magic1,TLBMAGIC2,4)) { 1794 FIXME("Header type magic 0x%08x not supported.\n",tlbHeader.magic1);1795 return NULL;1795 FIXME("Header type magic 0x%08x not supported.\n",tlbHeader.magic1); 1796 return NULL; 1796 1797 } 1797 1798 /* there is a small number of information here until the next important … … 1802 1803 /* now read the segment directory */ 1803 1804 TRACE("read segment directory (at %ld)\n",lPSegDir); 1804 TLB_Read((void*)&tlbSegDir, sizeof(tlbSegDir), &cx, lPSegDir); 1805 TLB_Read((void*)&tlbSegDir, sizeof(tlbSegDir), &cx, lPSegDir); 1805 1806 cx.pTblDir = &tlbSegDir; 1806 1807 … … 1809 1810 { 1810 1811 ERR("cannot find the table directory, ptr=0x%lx\n",lPSegDir); 1811 HeapFree(GetProcessHeap(),0,pTypeLibImpl);1812 return NULL;1812 HeapFree(GetProcessHeap(),0,pTypeLibImpl); 1813 return NULL; 1813 1814 } 1814 1815 … … 1852 1853 TLB_Read(td, sizeof(td), &cx, tlbSegDir.pTypdescTab.offset); 1853 1854 for(i=0; i<cTD; ) 1854 {1855 { 1855 1856 /* FIXME: add several sanity checks here */ 1856 1857 pTypeLibImpl->pTypeDesc[i].vt = td[0] & VT_TYPEMASK; 1857 1858 if(td[0] == VT_PTR || td[0] == VT_SAFEARRAY) 1858 {1859 /* FIXME: check safearray */1859 { 1860 /* FIXME: check safearray */ 1860 1861 if(td[3] < 0) 1861 1862 pTypeLibImpl->pTypeDesc[i].u.lptdesc= & stndTypeDesc[td[2]]; … … 1863 1864 pTypeLibImpl->pTypeDesc[i].u.lptdesc= & pTypeLibImpl->pTypeDesc[td[2]/8]; 1864 1865 } 1865 else if(td[0] == VT_CARRAY)1866 else if(td[0] == VT_CARRAY) 1866 1867 { 1867 /* array descr table here */1868 pTypeLibImpl->pTypeDesc[i].u.lpadesc = (void *)((int) td[2]); /* temp store offset in*/1868 /* array descr table here */ 1869 pTypeLibImpl->pTypeDesc[i].u.lpadesc = (void *)((int) td[2]); /* temp store offset in*/ 1869 1870 } 1870 1871 else if(td[0] == VT_USERDEFINED) 1871 {1872 { 1872 1873 pTypeLibImpl->pTypeDesc[i].u.hreftype = MAKELONG(td[2],td[3]); 1873 1874 } 1874 if(++i<cTD) TLB_Read(td, sizeof(td), &cx, DO_NOT_SEEK);1875 if(++i<cTD) TLB_Read(td, sizeof(td), &cx, DO_NOT_SEEK); 1875 1876 } 1876 1877 1877 1878 /* second time around to fill the array subscript info */ 1878 1879 for(i=0;i<cTD;i++) 1879 {1880 { 1880 1881 if(pTypeLibImpl->pTypeDesc[i].vt != VT_CARRAY) continue; 1881 1882 if(tlbSegDir.pArrayDescriptions.offset>0) 1882 {1883 { 1883 1884 TLB_Read(td, sizeof(td), &cx, tlbSegDir.pArrayDescriptions.offset + (int) pTypeLibImpl->pTypeDesc[i].u.lpadesc); 1884 1885 pTypeLibImpl->pTypeDesc[i].u.lpadesc = TLB_Alloc(sizeof(ARRAYDESC)+sizeof(SAFEARRAYBOUND)*(td[3]-1)); … … 1892 1893 1893 1894 for(j = 0; j<td[2]; j++) 1894 {1895 TLB_Read(& pTypeLibImpl->pTypeDesc[i].u.lpadesc->rgbounds[j].cElements, 1895 { 1896 TLB_Read(& pTypeLibImpl->pTypeDesc[i].u.lpadesc->rgbounds[j].cElements, 1896 1897 sizeof(INT), &cx, DO_NOT_SEEK); 1897 TLB_Read(& pTypeLibImpl->pTypeDesc[i].u.lpadesc->rgbounds[j].lLbound, 1898 TLB_Read(& pTypeLibImpl->pTypeDesc[i].u.lpadesc->rgbounds[j].lLbound, 1898 1899 sizeof(INT), &cx, DO_NOT_SEEK); 1899 1900 } 1900 1901 } 1901 else1902 {1902 else 1903 { 1903 1904 pTypeLibImpl->pTypeDesc[i].u.lpadesc = NULL; 1904 1905 ERR("didn't find array description data\n"); … … 1915 1916 1916 1917 while(offset < tlbSegDir.pImpFiles.offset +tlbSegDir.pImpFiles.length) 1917 {1918 { 1918 1919 *ppImpLib = TLB_Alloc(sizeof(TLBImpLib)); 1919 1920 (*ppImpLib)->offset = offset - tlbSegDir.pImpFiles.offset; 1920 1921 TLB_Read(&oGuid, sizeof(INT), &cx, offset); 1921 1922 1922 TLB_Read(&(*ppImpLib)->lcid, sizeof(LCID), &cx, DO_NOT_SEEK);1923 TLB_Read(&(*ppImpLib)->lcid, sizeof(LCID), &cx, DO_NOT_SEEK); 1923 1924 TLB_Read(&(*ppImpLib)->wVersionMajor, sizeof(WORD), &cx, DO_NOT_SEEK); 1924 1925 TLB_Read(&(*ppImpLib)->wVersionMinor, sizeof(WORD), &cx, DO_NOT_SEEK); … … 1959 1960 */ 1960 1961 static HRESULT WINAPI ITypeLib2_fnQueryInterface( 1961 ITypeLib2 * iface,1962 REFIID riid,1963 VOID **ppvObject)1962 ITypeLib2 * iface, 1963 REFIID riid, 1964 VOID **ppvObject) 1964 1965 { 1965 1966 ICOM_THIS( ITypeLibImpl, iface); … … 1968 1969 1969 1970 *ppvObject=NULL; 1970 if(IsEqualIID(riid, &IID_IUnknown) || 1971 if(IsEqualIID(riid, &IID_IUnknown) || 1971 1972 IsEqualIID(riid,&IID_ITypeLib)|| 1972 1973 IsEqualIID(riid,&IID_ITypeLib2)) … … 2003 2004 2004 2005 --(This->ref); 2005 2006 2006 2007 TRACE("(%p)->(%u)\n",This, This->ref); 2007 2008 … … 2035 2036 This->HelpStringDll = NULL; 2036 2037 } 2037 2038 2038 2039 ITypeInfo_Release((ITypeInfo*) This->pTypeInfo); 2039 2040 HeapFree(GetProcessHeap(),0,This); … … 2045 2046 2046 2047 /* ITypeLib::GetTypeInfoCount 2047 * 2048 * 2048 2049 * Returns the number of type descriptions in the type library 2049 2050 */ … … 2061 2062 static HRESULT WINAPI ITypeLib2_fnGetTypeInfo( 2062 2063 ITypeLib2 *iface, 2063 UINT index, 2064 UINT index, 2064 2065 ITypeInfo **ppTInfo) 2065 2066 { 2066 2067 int i; 2067 2068 2068 2069 ICOM_THIS( ITypeLibImpl, iface); 2069 2070 ITypeInfoImpl *pTypeInfo = This->pTypeInfo; … … 2072 2073 2073 2074 if (!ppTInfo) return E_INVALIDARG; 2074 2075 2075 2076 /* search element n in list */ 2076 2077 for(i=0; i < index; i++) … … 2082 2083 return TYPE_E_ELEMENTNOTFOUND; 2083 2084 } 2084 } 2085 } 2085 2086 2086 2087 *ppTInfo = (ITypeInfo *) pTypeInfo; 2087 2088 2088 2089 ITypeInfo_AddRef(*ppTInfo); 2089 2090 TRACE("-- found (%p)\n",*ppTInfo); … … 2108 2109 2109 2110 if(!pTKind) return E_INVALIDARG; 2110 2111 2111 2112 /* search element n in list */ 2112 2113 for(i=0; i < index; i++) … … 2155 2156 } 2156 2157 2157 TRACE("-- found (%p, %s)\n", 2158 pTypeInfo, 2158 TRACE("-- found (%p, %s)\n", 2159 pTypeInfo, 2159 2160 debugstr_w(pTypeInfo->Name)); 2160 2161 … … 2170 2171 */ 2171 2172 static HRESULT WINAPI ITypeLib2_fnGetLibAttr( 2172 ITypeLib2 *iface, 2173 LPTLIBATTR *ppTLibAttr)2173 ITypeLib2 *iface, 2174 LPTLIBATTR *ppTLibAttr) 2174 2175 { 2175 2176 ICOM_THIS( ITypeLibImpl, iface); … … 2187 2188 */ 2188 2189 static HRESULT WINAPI ITypeLib2_fnGetTypeComp( 2189 ITypeLib2 *iface,2190 ITypeComp **ppTComp)2190 ITypeLib2 *iface, 2191 ITypeComp **ppTComp) 2191 2192 { 2192 2193 ICOM_THIS( ITypeLibImpl, iface); … … 2207 2208 BSTR *pBstrName, 2208 2209 BSTR *pBstrDocString, 2209 DWORD *pdwHelpContext, 2210 DWORD *pdwHelpContext, 2210 2211 BSTR *pBstrHelpFile) 2211 2212 { 2212 2213 ICOM_THIS( ITypeLibImpl, iface); 2213 2214 2214 2215 HRESULT result = E_INVALIDARG; 2215 2216 2216 2217 ITypeInfo *pTInfo; 2217 2218 2218 2219 2219 2220 TRACE("(%p) index %d Name(%p) DocString(%p) HelpContext(%p) HelpFile(%p)\n", 2220 2221 This, index, 2221 pBstrName, pBstrDocString, 2222 pBstrName, pBstrDocString, 2222 2223 pdwHelpContext, pBstrHelpFile); 2223 2224 2224 2225 if(index<0) 2225 { 2226 { 2226 2227 /* documentation for the typelib */ 2227 2228 if(pBstrName && This->Name) … … 2237 2238 if (!(*pBstrDocString)) return STG_E_INSUFFICIENTMEMORY; 2238 2239 } 2239 2240 2240 2241 if(pdwHelpContext) 2241 2242 { … … 2251 2252 result = S_OK; 2252 2253 } 2253 else 2254 else 2254 2255 { 2255 2256 /* for a typeinfo */ … … 2258 2259 if(SUCCEEDED(result)) 2259 2260 { 2260 result = ITypeInfo_GetDocumentation(pTInfo, 2261 MEMBERID_NIL, 2261 result = ITypeInfo_GetDocumentation(pTInfo, 2262 MEMBERID_NIL, 2262 2263 pBstrName, 2263 pBstrDocString, 2264 pBstrDocString, 2264 2265 pdwHelpContext, pBstrHelpFile); 2265 2266 2266 2267 ITypeInfo_Release(pTInfo); 2267 2268 } … … 2277 2278 */ 2278 2279 static HRESULT WINAPI ITypeLib2_fnIsName( 2279 ITypeLib2 *iface,2280 LPOLESTR szNameBuf,2281 ULONG lHashVal,2282 BOOL *pfName)2280 ITypeLib2 *iface, 2281 LPOLESTR szNameBuf, 2282 ULONG lHashVal, 2283 BOOL *pfName) 2283 2284 { 2284 2285 ICOM_THIS( ITypeLibImpl, iface); … … 2290 2291 2291 2292 TRACE("(%p)->(%s,%08lx,%p)\n", This, debugstr_w(szNameBuf), lHashVal, 2292 pfName);2293 pfName); 2293 2294 2294 2295 *pfName=TRUE; … … 2303 2304 for(pVInfo=pTInfo->varlist;pVInfo;pVInfo=pVInfo->next) 2304 2305 if(!memcmp(szNameBuf,pVInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; 2305 2306 2306 2307 } 2307 2308 *pfName=FALSE; … … 2310 2311 TRACE("(%p)slow! search for %s: %s found!\n", This, 2311 2312 debugstr_w(szNameBuf), *pfName?"NOT":""); 2312 2313 2313 2314 return S_OK; 2314 2315 } … … 2321 2322 */ 2322 2323 static HRESULT WINAPI ITypeLib2_fnFindName( 2323 ITypeLib2 *iface,2324 LPOLESTR szNameBuf,2325 ULONG lHashVal,2326 ITypeInfo **ppTInfo,2327 MEMBERID *rgMemId,2328 UINT16 *pcFound)2324 ITypeLib2 *iface, 2325 LPOLESTR szNameBuf, 2326 ULONG lHashVal, 2327 ITypeInfo **ppTInfo, 2328 MEMBERID *rgMemId, 2329 UINT16 *pcFound) 2329 2330 { 2330 2331 ICOM_THIS( ITypeLibImpl, iface); … … 2333 2334 TLBVarDesc *pVInfo; 2334 2335 int i,j = 0; 2335 2336 2336 2337 UINT nNameBufLen = SysStringLen(szNameBuf); 2337 2338 … … 2356 2357 2357 2358 *pcFound=j; 2358 2359 2359 2360 return S_OK; 2360 2361 } … … 2366 2367 */ 2367 2368 static VOID WINAPI ITypeLib2_fnReleaseTLibAttr( 2368 ITypeLib2 *iface,2369 TLIBATTR *pTLibAttr)2369 ITypeLib2 *iface, 2370 TLIBATTR *pTLibAttr) 2370 2371 { 2371 2372 ICOM_THIS( ITypeLibImpl, iface); … … 2379 2380 */ 2380 2381 static HRESULT WINAPI ITypeLib2_fnGetCustData( 2381 ITypeLib2 * iface,2382 REFGUID guid, 2382 ITypeLib2 * iface, 2383 REFGUID guid, 2383 2384 VARIANT *pVarVal) 2384 2385 { … … 2390 2391 if( IsEqualIID(guid, &pCData->guid)) break; 2391 2392 } 2392 2393 2393 2394 TRACE("(%p) guid %s %s found!x)\n", This, debugstr_guid(guid), pCData? "" : "NOT"); 2394 2395 … … 2409 2410 */ 2410 2411 static HRESULT WINAPI ITypeLib2_fnGetLibStatistics( 2411 ITypeLib2 * iface, 2412 ITypeLib2 * iface, 2412 2413 ULONG *pcUniqueNames, 2413 ULONG *pcchUniqueNames)2414 ULONG *pcchUniqueNames) 2414 2415 { 2415 2416 ICOM_THIS( ITypeLibImpl, iface); … … 2430 2431 */ 2431 2432 static HRESULT WINAPI ITypeLib2_fnGetDocumentation2( 2432 ITypeLib2 * iface, 2433 ITypeLib2 * iface, 2433 2434 INT index, 2434 LCID lcid,2435 BSTR *pbstrHelpString,2435 LCID lcid, 2436 BSTR *pbstrHelpString, 2436 2437 DWORD *pdwHelpStringContext, 2437 BSTR *pbstrHelpStringDll)2438 BSTR *pbstrHelpStringDll) 2438 2439 { 2439 2440 ICOM_THIS( ITypeLibImpl, iface); … … 2463 2464 /* for a typeinfo */ 2464 2465 result=ITypeLib2_GetTypeInfo(iface, index, &pTInfo); 2465 2466 2466 2467 if(SUCCEEDED(result)) 2467 { 2468 { 2468 2469 ITypeInfo2 * pTInfo2; 2469 result = ITypeInfo_QueryInterface(pTInfo, 2470 &IID_ITypeInfo2, 2470 result = ITypeInfo_QueryInterface(pTInfo, 2471 &IID_ITypeInfo2, 2471 2472 (LPVOID*) &pTInfo2); 2472 2473 2473 2474 if(SUCCEEDED(result)) 2474 2475 { 2475 result = ITypeInfo2_GetDocumentation2(pTInfo2, 2476 MEMBERID_NIL, 2476 result = ITypeInfo2_GetDocumentation2(pTInfo2, 2477 MEMBERID_NIL, 2477 2478 lcid, 2478 pbstrHelpString, 2479 pdwHelpStringContext, 2479 pbstrHelpString, 2480 pdwHelpStringContext, 2480 2481 pbstrHelpStringDll); 2481 2482 2482 2483 ITypeInfo2_Release(pTInfo2); 2483 2484 } 2484 2485 2485 2486 ITypeInfo_Release(pTInfo); 2486 2487 } … … 2491 2492 /* ITypeLib2::GetAllCustData 2492 2493 * 2493 * Gets all custom data items for the library. 2494 * Gets all custom data items for the library. 2494 2495 * 2495 2496 */ 2496 2497 static HRESULT WINAPI ITypeLib2_fnGetAllCustData( 2497 ITypeLib2 * iface,2498 ITypeLib2 * iface, 2498 2499 CUSTDATA *pCustData) 2499 2500 { … … 2501 2502 TLBCustData *pCData; 2502 2503 int i; 2503 TRACE("(%p) returning %d items\n", This, This->ctCustData); 2504 TRACE("(%p) returning %d items\n", This, This->ctCustData); 2504 2505 pCustData->prgCustData = TLB_Alloc(This->ctCustData * sizeof(CUSTDATAITEM)); 2505 2506 if(pCustData->prgCustData ){ … … 2556 2557 */ 2557 2558 static HRESULT WINAPI ITypeInfo_fnQueryInterface( 2558 ITypeInfo2 *iface,2559 REFIID riid,2560 VOID **ppvObject)2559 ITypeInfo2 *iface, 2560 REFIID riid, 2561 VOID **ppvObject) 2561 2562 { 2562 2563 ICOM_THIS( ITypeLibImpl, iface); … … 2565 2566 2566 2567 *ppvObject=NULL; 2567 if(IsEqualIID(riid, &IID_IUnknown) || 2568 if(IsEqualIID(riid, &IID_IUnknown) || 2568 2569 IsEqualIID(riid,&IID_ITypeInfo)|| 2569 2570 IsEqualIID(riid,&IID_ITypeInfo2)) … … 2598 2599 2599 2600 --(This->ref); 2600 2601 2601 2602 TRACE("(%p)->(%u)\n",This, This->ref); 2602 2603 … … 2605 2606 FIXME("destroy child objects\n"); 2606 2607 2607 TRACE("destroying ITypeInfo(%p)\n",This); 2608 TRACE("destroying ITypeInfo(%p)\n",This); 2608 2609 if (This->Name) 2609 2610 { … … 2611 2612 This->Name = 0; 2612 2613 } 2613 2614 2614 2615 if (This->DocString) 2615 2616 { … … 2670 2671 ICOM_THIS( ITypeInfoImpl, iface); 2671 2672 int i; 2672 TLBFuncDesc * pFDesc; 2673 TLBFuncDesc * pFDesc; 2673 2674 TRACE("(%p) index %d\n", This, index); 2674 2675 for(i=0, pFDesc=This->funclist; i!=index && pFDesc; i++, pFDesc=pFDesc->next) … … 2684 2685 /* ITypeInfo::GetVarDesc 2685 2686 * 2686 * Retrieves a VARDESC structure that describes the specified variable. 2687 * Retrieves a VARDESC structure that describes the specified variable. 2687 2688 * 2688 2689 */ … … 2692 2693 ICOM_THIS( ITypeInfoImpl, iface); 2693 2694 int i; 2694 TLBVarDesc * pVDesc; 2695 TLBVarDesc * pVDesc; 2695 2696 TRACE("(%p) index %d\n", This, index); 2696 2697 for(i=0, pVDesc=This->varlist; i!=index && pVDesc; i++, pVDesc=pVDesc->next) … … 2714 2715 { 2715 2716 ICOM_THIS( ITypeInfoImpl, iface); 2716 TLBFuncDesc * pFDesc; 2717 TLBVarDesc * pVDesc; 2717 TLBFuncDesc * pFDesc; 2718 TLBVarDesc * pVDesc; 2718 2719 int i; 2719 2720 TRACE("(%p) memid=0x%08lx Maxname=%d\n", This, memid, cMaxNames); … … 2725 2726 { 2726 2727 if(!i) 2727 *rgBstrNames=SysAllocString(pFDesc->Name);2728 *rgBstrNames=SysAllocString(pFDesc->Name); 2728 2729 else 2729 2730 rgBstrNames[i]=SysAllocString(pFDesc->pParamDesc[i-1].Name); … … 2748 2749 result=ITypeInfo_GetRefTypeInfo(iface, This->impltypelist->reference, &pTInfo); 2749 2750 if(SUCCEEDED(result)) 2750 {2751 { 2751 2752 result=ITypeInfo_GetNames(pTInfo, memid, rgBstrNames, cMaxNames, pcNames); 2752 2753 ITypeInfo_Release(pTInfo); … … 2756 2757 } 2757 2758 else 2758 {2759 { 2759 2760 WARN("no names found\n"); 2760 }2761 } 2761 2762 *pcNames=0; 2762 2763 return TYPE_E_ELEMENTNOTFOUND; … … 2776 2777 */ 2777 2778 static HRESULT WINAPI ITypeInfo_fnGetRefTypeOfImplType( 2778 ITypeInfo2 *iface,2779 ITypeInfo2 *iface, 2779 2780 UINT index, 2780 HREFTYPE *pRefType)2781 HREFTYPE *pRefType) 2781 2782 { 2782 2783 ICOM_THIS( ITypeInfoImpl, iface); … … 2793 2794 */ 2794 2795 if( This->TypeAttr.typekind != TKIND_DISPATCH) return E_INVALIDARG; 2795 2796 2796 2797 if (This->TypeAttr.wTypeFlags & TYPEFLAG_FDISPATCHABLE && 2797 2798 This->TypeAttr.wTypeFlags & TYPEFLAG_FDUAL ) … … 2812 2813 pIref = pIref->next; 2813 2814 } 2814 2815 2815 2816 if (!pIref) return TYPE_E_ELEMENTNOTFOUND; 2816 2817 2817 2818 *pRefType = pIref->reference; 2818 2819 2819 2820 TRACE("-- 0x%08lx %s\n",pIref->reference, debugstr_guid(&pIref->guid) ); 2820 2821 } 2821 2822 2822 2823 return S_OK; 2823 2824 2824 2825 } 2825 2826 2826 2827 /* ITypeInfo::GetImplTypeFlags 2827 * 2828 * Retrieves the IMPLTYPEFLAGS enumeration for one implemented interface 2828 * 2829 * Retrieves the IMPLTYPEFLAGS enumeration for one implemented interface 2829 2830 * or base interface in a type description. 2830 2831 */ … … 2854 2855 { 2855 2856 ICOM_THIS( ITypeInfoImpl, iface); 2856 TLBFuncDesc * pFDesc; 2857 TLBVarDesc * pVDesc; 2857 TLBFuncDesc * pFDesc; 2858 TLBVarDesc * pVDesc; 2858 2859 HRESULT ret=S_OK; 2859 UINT nNameLen = SysStringLen(*rgszNames);2860 2860 UINT nNameLen = SysStringLen(*rgszNames); 2861 2861 2862 TRACE("(%p) Name %s cNames %d\n", This, debugstr_w(*rgszNames), 2862 2863 cNames); … … 2866 2867 if(cNames) *pMemId=pFDesc->funcdesc.memid; 2867 2868 for(i=1; i < cNames; i++){ 2868 UINT nParamLen = SysStringLen(rgszNames[i]);2869 UINT nParamLen = SysStringLen(rgszNames[i]); 2869 2870 for(j=0; j<pFDesc->funcdesc.cParams; j++) 2870 2871 if(memcmp(rgszNames[i],pFDesc->pParamDesc[j].Name, nParamLen)) … … 2877 2878 return ret; 2878 2879 } 2879 } 2880 } 2880 2881 for(pVDesc=This->varlist; pVDesc; pVDesc=pVDesc->next) { 2881 2882 if( !memcmp(*rgszNames, pVDesc->Name, nNameLen)) { … … 2884 2885 } 2885 2886 } 2886 /* not found, see if this is and interface with an inheritance */ 2887 if(This->TypeAttr.typekind==TKIND_INTERFACE && 2887 /* not found, see if this is and interface with an inheritance */ 2888 if(This->TypeAttr.typekind==TKIND_INTERFACE && 2888 2889 This->TypeAttr.cImplTypes ){ 2889 2890 /* recursive search */ 2890 2891 ITypeInfo *pTInfo; 2891 ret=ITypeInfo_GetRefTypeInfo(iface, 2892 ret=ITypeInfo_GetRefTypeInfo(iface, 2892 2893 This->impltypelist->reference, &pTInfo); 2893 2894 if(SUCCEEDED(ret)){ … … 2903 2904 2904 2905 /* ITypeInfo::Invoke 2905 * 2906 * 2906 2907 * Invokes a method, or accesses a property of an object, that implements the 2907 2908 * interface described by the type description. … … 2911 2912 2912 2913 if (TRACE_ON(ole)) { 2913 int i;2914 MESSAGE("Calling %p(",func);2915 for (i=0;i<nrargs;i++) MESSAGE("%08lx,",args[i]);2916 MESSAGE(")\n");2914 int i; 2915 MESSAGE("Calling %p(",func); 2916 for (i=0;i<nrargs;i++) MESSAGE("%08lx,",args[i]); 2917 MESSAGE(")\n"); 2917 2918 } 2918 2919 … … 2920 2921 case CC_STDCALL: 2921 2922 2922 switch (nrargs) {2923 case 0: {2923 switch (nrargs) { 2924 case 0: { 2924 2925 #ifdef __WIN32OS2__ 2925 DWORD (* WINAPI xfunc)() = func;2926 DWORD (* WINAPI xfunc)() = func; 2926 2927 #else 2927 DWORD (WINAPI *xfunc)() = func;2928 DWORD (WINAPI *xfunc)() = func; 2928 2929 #endif 2929 res = xfunc();2930 break;2931 }2932 case 1: {2930 res = xfunc(); 2931 break; 2932 } 2933 case 1: { 2933 2934 #ifdef __WIN32OS2__ 2934 DWORD (* WINAPI xfunc)(DWORD) = func;2935 DWORD (* WINAPI xfunc)(DWORD) = func; 2935 2936 #else 2936 DWORD (WINAPI *xfunc)(DWORD) = func;2937 DWORD (WINAPI *xfunc)(DWORD) = func; 2937 2938 #endif 2938 res = xfunc(args[0]);2939 break;2940 }2941 case 2: {2939 res = xfunc(args[0]); 2940 break; 2941 } 2942 case 2: { 2942 2943 #ifdef __WIN32OS2__ 2943 DWORD (* WINAPI xfunc)(DWORD,DWORD) = func;2944 DWORD (* WINAPI xfunc)(DWORD,DWORD) = func; 2944 2945 #else 2945 DWORD (WINAPI *xfunc)(DWORD,DWORD) = func;2946 DWORD (WINAPI *xfunc)(DWORD,DWORD) = func; 2946 2947 #endif 2947 res = xfunc(args[0],args[1]);2948 break;2949 }2950 case 3: {2948 res = xfunc(args[0],args[1]); 2949 break; 2950 } 2951 case 3: { 2951 2952 #ifdef __WIN32OS2__ 2952 DWORD (* WINAPI xfunc)(DWORD,DWORD,DWORD) = func;2953 DWORD (* WINAPI xfunc)(DWORD,DWORD,DWORD) = func; 2953 2954 #else 2954 DWORD (WINAPI *xfunc)(DWORD,DWORD,DWORD) = func;2955 DWORD (WINAPI *xfunc)(DWORD,DWORD,DWORD) = func; 2955 2956 #endif 2956 res = xfunc(args[0],args[1],args[2]); 2957 break; 2958 } 2959 default: 2960 FIXME("unsupported number of arguments %d in stdcall\n",nrargs); 2961 res = -1; 2962 break; 2963 } 2964 break; 2957 res = xfunc(args[0],args[1],args[2]); 2958 break; 2959 } 2965 2960 default: 2966 FIXME("unsupported calling convention %d\n",callconv); 2967 res = -1; 2968 break; 2961 FIXME("unsupported number of arguments %d in stdcall\n",nrargs); 2962 res = -1; 2963 break; 2964 } 2965 break; 2966 default: 2967 FIXME("unsupported calling convention %d\n",callconv); 2968 res = -1; 2969 break; 2969 2970 } 2970 2971 TRACE("returns %08lx\n",res); … … 2983 2984 { 2984 2985 ICOM_THIS( ITypeInfoImpl, iface); 2985 TLBFuncDesc * pFDesc; 2986 TLBVarDesc * pVDesc; 2986 TLBFuncDesc * pFDesc; 2987 TLBVarDesc * pVDesc; 2987 2988 int i; 2988 2989 … … 2993 2994 2994 2995 for(pFDesc=This->funclist; pFDesc; pFDesc=pFDesc->next) 2995 if (pFDesc->funcdesc.memid == memid) {2996 if (pFDesc->funcdesc.invkind & (dwFlags & ~DISPATCH_METHOD))2997 break;2998 }2996 if (pFDesc->funcdesc.memid == memid) { 2997 if (pFDesc->funcdesc.invkind & (dwFlags & ~DISPATCH_METHOD)) 2998 break; 2999 } 2999 3000 if (pFDesc) { 3000 dump_TLBFuncDescOne(pFDesc);3001 switch (pFDesc->funcdesc.funckind) {3002 case FUNC_PUREVIRTUAL:3003 case FUNC_VIRTUAL: {3004 DWORD res;3005 DWORD *args = (DWORD*)HeapAlloc(GetProcessHeap(),0,sizeof(DWORD)*(pFDesc->funcdesc.cParams+1));3006 DWORD *args2 = (DWORD*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DWORD)*(pFDesc->funcdesc.cParams));3007 args[0] = (DWORD)pIUnk;3008 3009 for (i=0;i<pFDesc->funcdesc.cParams;i++) {3010 if (i<pDispParams->cArgs) {3011 TRACE("set %d to disparg type %d vs %d\n",i,3012 V_VT(pDispParams->rgvarg+i),3013 pFDesc->funcdesc.lprgelemdescParam[i].tdesc.vt3014 );3015 args[i+1] = V_UNION(pDispParams->rgvarg+i,lVal);3016 } else {3017 TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i].tdesc);3018 TRACE("set %d to pointer for get (type is %d)\n",i,tdesc->vt);3019 /*FIXME: give pointers for the rest, so propertyget works*/3020 args[i+1] = (DWORD)&args2[i];3021 3022 /* If pointer to variant, pass reference to variant3023 * in result variant array.3024 */3025 if ((tdesc->vt == VT_PTR) &&3026 (tdesc->u.lptdesc->vt == VT_VARIANT) &&3027 pVarResult3028 )3029 args[i+1] = (DWORD)(pVarResult+(i-pDispParams->cArgs));3030 }3031 }3032 if (pFDesc->funcdesc.cParamsOpt)3033 FIXME("Does not support optional parameters (%d)\n",3034 pFDesc->funcdesc.cParamsOpt3035 );3036 3037 res = _invoke((*(DWORD***)pIUnk)[pFDesc->funcdesc.oVft/4],3038 pFDesc->funcdesc.callconv,3039 pFDesc->funcdesc.cParams+1,3040 args3041 );3042 if (pVarResult && (dwFlags & (DISPATCH_PROPERTYGET))) {3043 for (i=0;i<pFDesc->funcdesc.cParams-pDispParams->cArgs;i++) {3044 TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i].tdesc);3045 /* If we are a pointer to a variant, we are done already */3046 if ((tdesc->vt==VT_PTR)&&(tdesc->u.lptdesc->vt==VT_VARIANT))3047 continue;3048 3049 VariantInit(&pVarResult[i]);3050 V_UNION(pVarResult+i,intVal) = args2[i];3051 3052 if (tdesc->vt == VT_PTR)3053 tdesc = tdesc->u.lptdesc;3054 V_VT(pVarResult+i) = tdesc->vt;3055 3056 /* HACK: VB5 likes this.3057 * I do not know why. There is 1 example in MSDN which uses3058 * this which appears broken (mixes int vals and3059 * IDispatch*.).3060 */3061 if ((tdesc->vt == VT_PTR) && (dwFlags & DISPATCH_METHOD))3062 V_VT(pVarResult+i) = VT_DISPATCH;3063 TRACE("storing into variant: [%d] type %d, val %08x\n",3064 i,V_VT(pVarResult+i),V_UNION(pVarResult+i,intVal)3065 );3066 }3067 }3068 HeapFree(GetProcessHeap(),0,args2);3069 HeapFree(GetProcessHeap(),0,args);3070 return S_OK;3071 }3072 case FUNC_DISPATCH: {3073 IDispatch *disp;3074 HRESULT hr;3075 3076 hr = IUnknown_QueryInterface((LPUNKNOWN)pIUnk,&IID_IDispatch,(LPVOID*)&disp);3077 if (hr) {3078 FIXME("FUNC_DISPATCH used on object without IDispatch iface?\n");3079 return hr;3080 }3081 FIXME("Calling Invoke in IDispatch iface. untested!\n");3082 hr = IDispatch_Invoke(3083 disp,memid,&IID_NULL,LOCALE_USER_DEFAULT,dwFlags,pDispParams,3084 pVarResult,pExcepInfo,pArgErr3085 );3086 if (hr)3087 FIXME("IDispatch::Invoke failed with %08lx. (Could be not a real error?)\n",hr);3088 IDispatch_Release(disp);3089 return hr;3090 }3091 default:3092 FIXME("Unknown function invocation type %d\n",pFDesc->funcdesc.funckind);3093 return E_FAIL;3094 }3001 dump_TLBFuncDescOne(pFDesc); 3002 switch (pFDesc->funcdesc.funckind) { 3003 case FUNC_PUREVIRTUAL: 3004 case FUNC_VIRTUAL: { 3005 DWORD res; 3006 DWORD *args = (DWORD*)HeapAlloc(GetProcessHeap(),0,sizeof(DWORD)*(pFDesc->funcdesc.cParams+1)); 3007 DWORD *args2 = (DWORD*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DWORD)*(pFDesc->funcdesc.cParams)); 3008 args[0] = (DWORD)pIUnk; 3009 3010 for (i=0;i<pFDesc->funcdesc.cParams;i++) { 3011 if (i<pDispParams->cArgs) { 3012 TRACE("set %d to disparg type %d vs %d\n",i, 3013 V_VT(pDispParams->rgvarg+i), 3014 pFDesc->funcdesc.lprgelemdescParam[i].tdesc.vt 3015 ); 3016 args[i+1] = V_UNION(pDispParams->rgvarg+i,lVal); 3017 } else { 3018 TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i].tdesc); 3019 TRACE("set %d to pointer for get (type is %d)\n",i,tdesc->vt); 3020 /*FIXME: give pointers for the rest, so propertyget works*/ 3021 args[i+1] = (DWORD)&args2[i]; 3022 3023 /* If pointer to variant, pass reference to variant 3024 * in result variant array. 3025 */ 3026 if ((tdesc->vt == VT_PTR) && 3027 (tdesc->u.lptdesc->vt == VT_VARIANT) && 3028 pVarResult 3029 ) 3030 args[i+1] = (DWORD)(pVarResult+(i-pDispParams->cArgs)); 3031 } 3032 } 3033 if (pFDesc->funcdesc.cParamsOpt) 3034 FIXME("Does not support optional parameters (%d)\n", 3035 pFDesc->funcdesc.cParamsOpt 3036 ); 3037 3038 res = _invoke((*(DWORD***)pIUnk)[pFDesc->funcdesc.oVft/4], 3039 pFDesc->funcdesc.callconv, 3040 pFDesc->funcdesc.cParams+1, 3041 args 3042 ); 3043 if (pVarResult && (dwFlags & (DISPATCH_PROPERTYGET))) { 3044 for (i=0;i<pFDesc->funcdesc.cParams-pDispParams->cArgs;i++) { 3045 TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i].tdesc); 3046 /* If we are a pointer to a variant, we are done already */ 3047 if ((tdesc->vt==VT_PTR)&&(tdesc->u.lptdesc->vt==VT_VARIANT)) 3048 continue; 3049 3050 VariantInit(&pVarResult[i]); 3051 V_UNION(pVarResult+i,intVal) = args2[i]; 3052 3053 if (tdesc->vt == VT_PTR) 3054 tdesc = tdesc->u.lptdesc; 3055 V_VT(pVarResult+i) = tdesc->vt; 3056 3057 /* HACK: VB5 likes this. 3058 * I do not know why. There is 1 example in MSDN which uses 3059 * this which appears broken (mixes int vals and 3060 * IDispatch*.). 3061 */ 3062 if ((tdesc->vt == VT_PTR) && (dwFlags & DISPATCH_METHOD)) 3063 V_VT(pVarResult+i) = VT_DISPATCH; 3064 TRACE("storing into variant: [%d] type %d, val %08x\n", 3065 i,V_VT(pVarResult+i),V_UNION(pVarResult+i,intVal) 3066 ); 3067 } 3068 } 3069 HeapFree(GetProcessHeap(),0,args2); 3070 HeapFree(GetProcessHeap(),0,args); 3071 return S_OK; 3072 } 3073 case FUNC_DISPATCH: { 3074 IDispatch *disp; 3075 HRESULT hr; 3076 3077 hr = IUnknown_QueryInterface((LPUNKNOWN)pIUnk,&IID_IDispatch,(LPVOID*)&disp); 3078 if (hr) { 3079 FIXME("FUNC_DISPATCH used on object without IDispatch iface?\n"); 3080 return hr; 3081 } 3082 FIXME("Calling Invoke in IDispatch iface. untested!\n"); 3083 hr = IDispatch_Invoke( 3084 disp,memid,&IID_NULL,LOCALE_USER_DEFAULT,dwFlags,pDispParams, 3085 pVarResult,pExcepInfo,pArgErr 3086 ); 3087 if (hr) 3088 FIXME("IDispatch::Invoke failed with %08lx. (Could be not a real error?)\n",hr); 3089 IDispatch_Release(disp); 3090 return hr; 3091 } 3092 default: 3093 FIXME("Unknown function invocation type %d\n",pFDesc->funcdesc.funckind); 3094 return E_FAIL; 3095 } 3095 3096 } else { 3096 FIXME("variable based invoking not supported yet.\n");3097 for(pVDesc=This->varlist; pVDesc; pVDesc=pVDesc->next) {3098 if (pVDesc->vardesc.memid == memid) {3099 FIXME("varseek: Found memid name %s\n",debugstr_w(((LPWSTR)pVDesc->Name)));3100 dump_TLBVarDesc(pVDesc);3101 break;3102 }3103 }3097 FIXME("variable based invoking not supported yet.\n"); 3098 for(pVDesc=This->varlist; pVDesc; pVDesc=pVDesc->next) { 3099 if (pVDesc->vardesc.memid == memid) { 3100 FIXME("varseek: Found memid name %s\n",debugstr_w(((LPWSTR)pVDesc->Name))); 3101 dump_TLBVarDesc(pVDesc); 3102 break; 3103 } 3104 } 3104 3105 } 3105 3106 FIXME("Did not find member id %d!\n",(int)memid); … … 3108 3109 3109 3110 /* ITypeInfo::GetDocumentation 3110 * 3111 * 3111 3112 * Retrieves the documentation string, the complete Help file name and path, 3112 3113 * and the context ID for the Help topic for a specified type description. … … 3117 3118 { 3118 3119 ICOM_THIS( ITypeInfoImpl, iface); 3119 TLBFuncDesc * pFDesc; 3120 TLBVarDesc * pVDesc; 3120 TLBFuncDesc * pFDesc; 3121 TLBVarDesc * pVDesc; 3121 3122 TRACE("(%p) memid %ld Name(%p) DocString(%p)" 3122 3123 " HelpContext(%p) HelpFile(%p)\n", … … 3146 3147 3147 3148 /* ITypeInfo::GetDllEntry 3148 * 3149 * 3149 3150 * Retrieves a description or specification of an entry point for a function 3150 3151 * in a DLL. … … 3160 3161 3161 3162 /* ITypeInfo::GetRefTypeInfo 3162 * 3163 * 3163 3164 * If a type description references other type descriptions, it retrieves 3164 3165 * the referenced type descriptions. 3165 3166 */ 3166 3167 static HRESULT WINAPI ITypeInfo_fnGetRefTypeInfo( 3167 ITypeInfo2 *iface,3168 ITypeInfo2 *iface, 3168 3169 HREFTYPE hRefType, 3169 ITypeInfo **ppTInfo)3170 ITypeInfo **ppTInfo) 3170 3171 { 3171 3172 ICOM_THIS( ITypeInfoImpl, iface); … … 3183 3184 } 3184 3185 } 3185 else if (hRefType == -1 && 3186 else if (hRefType == -1 && 3186 3187 (((ITypeInfoImpl*) This)->TypeAttr.typekind == TKIND_DISPATCH) && 3187 3188 (((ITypeInfoImpl*) This)->TypeAttr.wTypeFlags & TYPEFLAG_FDUAL)) 3188 3189 { 3189 /* when we meet a DUAL dispinterface, we must create the interface 3190 * version of it.3191 */3192 ITypeInfoImpl* pTypeInfoImpl = (ITypeInfoImpl*) ITypeInfo_Constructor();3193 3194 3195 /* the interface version contains the same information as the dispinterface3196 * copy the contents of the structs.3197 */3198 *pTypeInfoImpl = *This;3199 pTypeInfoImpl->ref = 1;3200 3201 /* change the type to interface */3202 pTypeInfoImpl->TypeAttr.typekind = TKIND_INTERFACE;3203 3190 /* when we meet a DUAL dispinterface, we must create the interface 3191 * version of it. 3192 */ 3193 ITypeInfoImpl* pTypeInfoImpl = (ITypeInfoImpl*) ITypeInfo_Constructor(); 3194 3195 3196 /* the interface version contains the same information as the dispinterface 3197 * copy the contents of the structs. 3198 */ 3199 *pTypeInfoImpl = *This; 3200 pTypeInfoImpl->ref = 1; 3201 3202 /* change the type to interface */ 3203 pTypeInfoImpl->TypeAttr.typekind = TKIND_INTERFACE; 3204 3204 3205 *ppTInfo = (ITypeInfo*) pTypeInfoImpl; 3205 3206 3206 ITypeInfo_AddRef((ITypeInfo*) pTypeInfoImpl);3207 ITypeInfo_AddRef((ITypeInfo*) pTypeInfoImpl); 3207 3208 3208 3209 result = S_OK; 3209 }3210 } 3210 3211 else 3211 3212 { 3212 3213 /* imported type lib */ 3213 3214 TLBRefType *pRefType = NULL; 3214 3215 3215 3216 /* search in implemented types */ 3216 for( pRefType = This->impltypelist; 3217 for( pRefType = This->impltypelist; 3217 3218 pRefType && (pRefType->reference != hRefType); 3218 3219 pRefType = pRefType->next); 3219 3220 3220 3221 if(!pRefType) 3221 { 3222 { 3222 3223 TYPEATTR* pMyTypeAttr = &This->TypeAttr; 3223 3224 unsigned short cFuncs = pMyTypeAttr->cFuncs; 3224 3225 unsigned short cVars = pMyTypeAttr->cVars; 3225 3226 /* search in arguments */ 3226 3227 /* search in arguments */ 3227 3228 if (cFuncs > 0) 3228 3229 { 3229 3230 unsigned short cFuncIndex = 0; 3230 3231 3231 3232 TLBFuncDesc* pCurrFunc = This->funclist; 3232 3233 3233 3234 for (cFuncIndex = 0; !pRefType && cFuncIndex < cFuncs ; ++cFuncIndex) 3234 3235 { 3235 3236 FUNCDESC* pCurrFuncDesc = &pCurrFunc->funcdesc; 3236 3237 3237 3238 short cParams = pCurrFuncDesc->cParams; 3238 3239 short cParamIndex = 0; 3239 3240 for (cParamIndex = 0 ; 3241 !pRefType && cParamIndex < cParams ; 3240 3241 for (cParamIndex = 0 ; 3242 !pRefType && cParamIndex < cParams ; 3242 3243 ++cParamIndex) 3243 3244 { 3244 3245 TLBParDesc* pCurrParamDesc = &(pCurrFunc->pParamDesc[cParamIndex]); 3245 3246 3246 3247 if ( pCurrParamDesc->pRefType && pCurrParamDesc->pRefType->reference == hRefType) 3247 3248 { … … 3250 3251 } 3251 3252 } 3252 3253 3253 3254 pCurrFunc = pCurrFunc->next; 3254 3255 } … … 3261 3262 } 3262 3263 } 3263 3264 3264 3265 /* href-referenced typeinfo found! */ 3265 3266 if (pRefType || hRefType == -1) 3266 3267 { 3267 3268 ITypeLibImpl *pTypeLib = pRefType->pImpTLInfo->pImpTypeLib; 3268 3269 if(pTypeLib) 3269 3270 if(pTypeLib) 3270 3271 { 3271 3272 TRACE("typeinfo in imported typelib that is already loaded\n"); 3272 3273 result = ITypeLib2_GetTypeInfoOfGuid((LPTYPELIB)pTypeLib, 3274 &pRefType->guid, 3273 3274 result = ITypeLib2_GetTypeInfoOfGuid((LPTYPELIB)pTypeLib, 3275 &pRefType->guid, 3275 3276 ppTInfo); 3276 3277 } … … 3282 3283 pRefType->pImpTLInfo->lcid, 3283 3284 (LPTYPELIB *)&pTypeLib); 3284 3285 3285 3286 if(!SUCCEEDED(result)) 3286 {3287 { 3287 3288 BSTR libnam=SysAllocString(pRefType->pImpTLInfo->name); 3288 3289 TRACE("typeinfo in imported typelib that isn't already loaded\n"); 3289 3290 result=LoadTypeLib(libnam, (LPTYPELIB *)&pTypeLib); 3290 3291 SysFreeString(libnam); 3291 } 3292 } 3292 3293 if(SUCCEEDED(result)) 3293 3294 { 3294 3295 result=ITypeLib2_GetTypeInfoOfGuid((LPTYPELIB)pTypeLib, &pRefType->guid, ppTInfo); 3295 3296 pRefType->pImpTLInfo->pImpTypeLib = pTypeLib; 3296 ITypeLib2_AddRef((ITypeLib*) pTypeLib);3297 } 3297 ITypeLib2_AddRef((ITypeLib*) pTypeLib); 3298 } 3298 3299 } 3299 3300 } … … 3306 3307 3307 3308 /* ITypeInfo::AddressOfMember 3308 * 3309 * 3309 3310 * Retrieves the addresses of static functions or variables, such as those 3310 3311 * defined in a DLL. … … 3319 3320 3320 3321 /* ITypeInfo::CreateInstance 3321 * 3322 * Creates a new instance of a type that describes a component object class 3322 * 3323 * Creates a new instance of a type that describes a component object class 3323 3324 * (coclass). 3324 3325 */ 3325 static HRESULT WINAPI ITypeInfo_fnCreateInstance( ITypeInfo2 *iface, 3326 IUnknown *pUnk, REFIID riid, VOID **ppvObj) 3326 static HRESULT WINAPI ITypeInfo_fnCreateInstance( ITypeInfo2 *iface, 3327 IUnknown *pUnk, REFIID riid, VOID **ppvObj) 3327 3328 { 3328 3329 ICOM_THIS( ITypeInfoImpl, iface); … … 3336 3337 */ 3337 3338 static HRESULT WINAPI ITypeInfo_fnGetMops( ITypeInfo2 *iface, MEMBERID memid, 3338 BSTR *pBstrMops)3339 BSTR *pBstrMops) 3339 3340 { 3340 3341 ICOM_THIS( ITypeInfoImpl, iface); … … 3344 3345 3345 3346 /* ITypeInfo::GetContainingTypeLib 3346 * 3347 * 3347 3348 * Retrieves the containing type library and the index of the type description 3348 3349 * within that type library. … … 3379 3380 */ 3380 3381 static HRESULT WINAPI ITypeInfo_fnReleaseFuncDesc( 3381 ITypeInfo2 *iface,3382 ITypeInfo2 *iface, 3382 3383 FUNCDESC *pFuncDesc) 3383 3384 { … … 3417 3418 * Returns the type flags without any allocations. This returns a DWORD type 3418 3419 * flag, which expands the type flags without growing the TYPEATTR (type 3419 * attribute). 3420 * attribute). 3420 3421 * 3421 3422 */ … … 3442 3443 HRESULT result; 3443 3444 /* FIXME: should check for invKind??? */ 3444 for(i=0, pFuncInfo=This->funclist;pFuncInfo && 3445 for(i=0, pFuncInfo=This->funclist;pFuncInfo && 3445 3446 memid != pFuncInfo->funcdesc.memid; i++, pFuncInfo=pFuncInfo->next); 3446 3447 if(pFuncInfo){ … … 3459 3460 * 3460 3461 * Binds to a specific member based on a known DISPID, where the member name 3461 * is not known (for example, when binding to a default member). 3462 * is not known (for example, when binding to a default member). 3462 3463 * 3463 3464 */ … … 3469 3470 int i; 3470 3471 HRESULT result; 3471 for(i=0, pVarInfo=This->varlist; pVarInfo && 3472 for(i=0, pVarInfo=This->varlist; pVarInfo && 3472 3473 memid != pVarInfo->vardesc.memid; i++, pVarInfo=pVarInfo->next) 3473 3474 ; … … 3489 3490 */ 3490 3491 static HRESULT WINAPI ITypeInfo2_fnGetCustData( 3491 ITypeInfo2 * iface,3492 REFGUID guid,3493 VARIANT *pVarVal)3492 ITypeInfo2 * iface, 3493 REFGUID guid, 3494 VARIANT *pVarVal) 3494 3495 { 3495 3496 ICOM_THIS( ITypeInfoImpl, iface); … … 3515 3516 */ 3516 3517 static HRESULT WINAPI ITypeInfo2_fnGetFuncCustData( 3517 ITypeInfo2 * iface,3518 UINT index,3519 REFGUID guid,3520 VARIANT *pVarVal)3518 ITypeInfo2 * iface, 3519 UINT index, 3520 REFGUID guid, 3521 VARIANT *pVarVal) 3521 3522 { 3522 3523 ICOM_THIS( ITypeInfoImpl, iface); 3523 3524 TLBCustData *pCData=NULL; 3524 TLBFuncDesc * pFDesc; 3525 TLBFuncDesc * pFDesc; 3525 3526 int i; 3526 3527 for(i=0, pFDesc=This->funclist; i!=index && pFDesc; i++, … … 3546 3547 */ 3547 3548 static HRESULT WINAPI ITypeInfo2_fnGetParamCustData( 3548 ITypeInfo2 * iface,3549 UINT indexFunc,3550 UINT indexParam,3551 REFGUID guid,3552 VARIANT *pVarVal)3553 { 3549 ITypeInfo2 * iface, 3550 UINT indexFunc, 3551 UINT indexParam, 3552 REFGUID guid, 3553 VARIANT *pVarVal) 3554 { 3554 3555 ICOM_THIS( ITypeInfoImpl, iface); 3555 3556 TLBCustData *pCData=NULL; 3556 TLBFuncDesc * pFDesc; 3557 TLBFuncDesc * pFDesc; 3557 3558 int i; 3558 3559 … … 3560 3561 3561 3562 if(pFDesc && indexParam >=0 && indexParam<pFDesc->funcdesc.cParams) 3562 for(pCData=pFDesc->pParamDesc[indexParam].pCustData; pCData; 3563 for(pCData=pFDesc->pParamDesc[indexParam].pCustData; pCData; 3563 3564 pCData = pCData->next) 3564 3565 if( IsEqualIID(guid, &pCData->guid)) break; … … 3580 3581 */ 3581 3582 static HRESULT WINAPI ITypeInfo2_fnGetVarCustData( 3582 ITypeInfo2 * iface,3583 UINT index,3584 REFGUID guid,3585 VARIANT *pVarVal)3586 { 3583 ITypeInfo2 * iface, 3584 UINT index, 3585 REFGUID guid, 3586 VARIANT *pVarVal) 3587 { 3587 3588 ICOM_THIS( ITypeInfoImpl, iface); 3588 3589 TLBCustData *pCData=NULL; 3589 TLBVarDesc * pVDesc; 3590 TLBVarDesc * pVDesc; 3590 3591 int i; 3591 3592 … … 3616 3617 */ 3617 3618 static HRESULT WINAPI ITypeInfo2_fnGetImplTypeCustData( 3618 ITypeInfo2 * iface,3619 UINT index,3620 REFGUID guid,3621 VARIANT *pVarVal)3622 { 3619 ITypeInfo2 * iface, 3620 UINT index, 3621 REFGUID guid, 3622 VARIANT *pVarVal) 3623 { 3623 3624 ICOM_THIS( ITypeInfoImpl, iface); 3624 3625 TLBCustData *pCData=NULL; 3625 TLBRefType * pRDesc; 3626 TLBRefType * pRDesc; 3626 3627 int i; 3627 3628 … … 3635 3636 } 3636 3637 } 3637 3638 3638 3639 TRACE("(%p) guid %s %s found!x)\n", This, debugstr_guid(guid), pCData? "" : "NOT"); 3639 3640 … … 3648 3649 3649 3650 /* ITypeInfo2::GetDocumentation2 3650 * 3651 * 3651 3652 * Retrieves the documentation string, the complete Help file name and path, 3652 3653 * the localization context to use, and the context ID for the library Help … … 3655 3656 */ 3656 3657 static HRESULT WINAPI ITypeInfo2_fnGetDocumentation2( 3657 ITypeInfo2 * iface,3658 MEMBERID memid,3659 LCID lcid,3660 BSTR *pbstrHelpString,3661 DWORD *pdwHelpStringContext,3662 BSTR *pbstrHelpStringDll)3658 ITypeInfo2 * iface, 3659 MEMBERID memid, 3660 LCID lcid, 3661 BSTR *pbstrHelpString, 3662 DWORD *pdwHelpStringContext, 3663 BSTR *pbstrHelpStringDll) 3663 3664 { 3664 3665 ICOM_THIS( ITypeInfoImpl, iface); 3665 TLBFuncDesc * pFDesc; 3666 TLBVarDesc * pVDesc; 3666 TLBFuncDesc * pFDesc; 3667 TLBVarDesc * pVDesc; 3667 3668 TRACE("(%p) memid %ld lcid(0x%lx) HelpString(%p) " 3668 3669 "HelpStringContext(%p) HelpStringDll(%p)\n", … … 3711 3712 /* ITypeInfo2::GetAllCustData 3712 3713 * 3713 * Gets all custom data items for the Type info. 3714 * Gets all custom data items for the Type info. 3714 3715 * 3715 3716 */ 3716 3717 static HRESULT WINAPI ITypeInfo2_fnGetAllCustData( 3717 ITypeInfo2 * iface,3718 CUSTDATA *pCustData)3718 ITypeInfo2 * iface, 3719 CUSTDATA *pCustData) 3719 3720 { 3720 3721 ICOM_THIS( ITypeInfoImpl, iface); … … 3722 3723 int i; 3723 3724 3724 TRACE("(%p) returning %d items\n", This, This->ctCustData); 3725 TRACE("(%p) returning %d items\n", This, This->ctCustData); 3725 3726 3726 3727 pCustData->prgCustData = TLB_Alloc(This->ctCustData * sizeof(CUSTDATAITEM)); … … 3744 3745 */ 3745 3746 static HRESULT WINAPI ITypeInfo2_fnGetAllFuncCustData( 3746 ITypeInfo2 * iface,3747 UINT index,3748 CUSTDATA *pCustData)3747 ITypeInfo2 * iface, 3748 UINT index, 3749 CUSTDATA *pCustData) 3749 3750 { 3750 3751 ICOM_THIS( ITypeInfoImpl, iface); 3751 3752 TLBCustData *pCData; 3752 TLBFuncDesc * pFDesc; 3753 TLBFuncDesc * pFDesc; 3753 3754 int i; 3754 TRACE("(%p) index %d\n", This, index); 3755 TRACE("(%p) index %d\n", This, index); 3755 3756 for(i=0, pFDesc=This->funclist; i!=index && pFDesc; i++, 3756 3757 pFDesc=pFDesc->next) … … 3786 3787 ICOM_THIS( ITypeInfoImpl, iface); 3787 3788 TLBCustData *pCData=NULL; 3788 TLBFuncDesc * pFDesc; 3789 TLBFuncDesc * pFDesc; 3789 3790 int i; 3790 TRACE("(%p) index %d\n", This, indexFunc); 3791 TRACE("(%p) index %d\n", This, indexFunc); 3791 3792 for(i=0, pFDesc=This->funclist; i!=indexFunc && pFDesc; i++, 3792 3793 pFDesc=pFDesc->next) 3793 3794 ; 3794 3795 if(pFDesc && indexParam >=0 && indexParam<pFDesc->funcdesc.cParams){ 3795 pCustData->prgCustData = 3796 pCustData->prgCustData = 3796 3797 TLB_Alloc(pFDesc->pParamDesc[indexParam].ctCustData * 3797 3798 sizeof(CUSTDATAITEM)); … … 3823 3824 ICOM_THIS( ITypeInfoImpl, iface); 3824 3825 TLBCustData *pCData; 3825 TLBVarDesc * pVDesc; 3826 TLBVarDesc * pVDesc; 3826 3827 int i; 3827 TRACE("(%p) index %d\n", This, index); 3828 TRACE("(%p) index %d\n", This, index); 3828 3829 for(i=0, pVDesc=This->varlist; i!=index && pVDesc; i++, 3829 3830 pVDesc=pVDesc->next) … … 3855 3856 */ 3856 3857 static HRESULT WINAPI ITypeInfo2_fnGetAllImplTypeCustData( 3857 ITypeInfo2 * iface,3858 UINT index,3859 CUSTDATA *pCustData)3858 ITypeInfo2 * iface, 3859 UINT index, 3860 CUSTDATA *pCustData) 3860 3861 { 3861 3862 ICOM_THIS( ITypeInfoImpl, iface); 3862 3863 TLBCustData *pCData; 3863 TLBRefType * pRDesc; 3864 TLBRefType * pRDesc; 3864 3865 int i; 3865 TRACE("(%p) index %d\n", This, index); 3866 TRACE("(%p) index %d\n", This, index); 3866 3867 for(i=0, pRDesc=This->impltypelist; i!=index && pRDesc; i++, 3867 3868 pRDesc=pRDesc->next) … … 3887 3888 } 3888 3889 3889 static ICOM_VTABLE(ITypeInfo2) tinfvt = 3890 static ICOM_VTABLE(ITypeInfo2) tinfvt = 3890 3891 { 3891 3892 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE -
trunk/src/oleaut32/variant.c
r6575 r6648 1 /* $Id: variant.c,v 1.5 2001-09-05 13:19:02 bird Exp $ */ 1 2 /* 2 3 * VARIANT … … 28 29 29 30 #include "config.h" 30 31 31 32 #include <string.h> 32 33 #include <stdlib.h> … … 106 107 107 108 /****************************************************************************** 108 * DateTimeStringToTm[INTERNAL]109 * DateTimeStringToTm [INTERNAL] 109 110 * 110 111 * Converts a string representation of a date and/or time to a tm structure. … … 122 123 static BOOL DateTimeStringToTm( OLECHAR* strIn, DWORD dwFlags, struct tm* pTm ) 123 124 { 124 BOOL res = FALSE;125 doublefsec;126 inttzp;127 intdtype;128 intnf;129 char*field[MAXDATEFIELDS];130 intftype[MAXDATEFIELDS];131 charlowstr[MAXDATELEN + 1];132 char* strDateTime = NULL;133 134 /* Convert the string to ASCII since this is the only format135 * 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 length142 * 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 was152 * 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 we158 * 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 else176 {177 /* Get both date and time information.178 * It returns 0 if date information was179 * 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]125 BOOL res = FALSE; 126 double fsec; 127 int tzp; 128 int dtype; 129 int nf; 130 char *field[MAXDATEFIELDS]; 131 int ftype[MAXDATEFIELDS]; 132 char lowstr[MAXDATELEN + 1]; 133 char* strDateTime = NULL; 134 135 /* Convert the string to ASCII since this is the only format 136 * postgesql can handle. 137 */ 138 strDateTime = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 139 140 if( strDateTime != NULL ) 141 { 142 /* Make sure we don't go over the maximum length 143 * accepted by postgesql. 144 */ 145 if( strlen( strDateTime ) <= MAXDATELEN ) 146 { 147 if( ParseDateTime( strDateTime, lowstr, field, ftype, MAXDATEFIELDS, &nf) == 0 ) 148 { 149 if( dwFlags & VAR_DATEVALUEONLY ) 150 { 151 /* Get the date information. 152 * It returns 0 if date information was 153 * present and 1 if only time information was present. 154 * -1 if an error occures. 155 */ 156 if( DecodeDateTime(field, ftype, nf, &dtype, pTm, &fsec, &tzp) == 0 ) 157 { 158 /* Eliminate the time information since we 159 * were asked to get date information only. 160 */ 161 pTm->tm_sec = 0; 162 pTm->tm_min = 0; 163 pTm->tm_hour = 0; 164 res = TRUE; 165 } 166 } 167 if( dwFlags & VAR_TIMEVALUEONLY ) 168 { 169 /* Get time information only. 170 */ 171 if( DecodeTimeOnly(field, ftype, nf, &dtype, pTm, &fsec) == 0 ) 172 { 173 res = TRUE; 174 } 175 } 176 else 177 { 178 /* Get both date and time information. 179 * It returns 0 if date information was 180 * present and 1 if only time information was present. 181 * -1 if an error occures. 182 */ 183 if( DecodeDateTime(field, ftype, nf, &dtype, pTm, &fsec, &tzp) != -1 ) 184 { 185 res = TRUE; 186 } 187 } 188 } 189 } 190 HeapFree( GetProcessHeap(), 0, strDateTime ); 191 } 192 193 return res; 194 } 195 196 197 198 199 200 201 /****************************************************************************** 202 * TmToDATE [INTERNAL] 202 203 * 203 204 * The date is implemented using an 8 byte floating-point number. … … 216 217 * The tm structure is as follows: 217 218 * 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 * int tm_isdst; daylight savings time flag227 * };219 * int tm_sec; seconds after the minute - [0,59] 220 * int tm_min; minutes after the hour - [0,59] 221 * int tm_hour; hours since midnight - [0,23] 222 * int tm_mday; day of the month - [1,31] 223 * int tm_mon; months since January - [0,11] 224 * int tm_year; years 225 * int tm_wday; days since Sunday - [0,6] 226 * int tm_yday; days since January 1 - [0,365] 227 * int tm_isdst; daylight savings time flag 228 * }; 228 229 * 229 230 * Note: This function does not use the tm_wday, tm_yday, tm_wday, … … 235 236 static BOOL TmToDATE( struct tm* pTm, DATE *pDateOut ) 236 237 { 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 to249 * 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 4255 * but not of a 100. Except if it is a multiple of256 * 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 the263 * current year specified by tm_year is a264 * leap year. This will be used to add a day265 * to the day count.266 */267 if( isleap( pTm->tm_year ) )268 leapYear = 1;269 270 /* Add the number of days corresponding to271 * 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 hours314 * to the DATE. Note these are the fracionnal part315 * 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]238 if( (pTm->tm_year - 1900) >= 0 ) 239 { 240 int leapYear = 0; 241 242 /* Start at 1. This is the way DATE is defined. 243 * January 1, 1900 at Midnight is 1.00. 244 * January 1, 1900 at 6AM is 1.25. 245 * and so on. 246 */ 247 *pDateOut = 1; 248 249 /* Add the number of days corresponding to 250 * tm_year. 251 */ 252 *pDateOut += (pTm->tm_year - 1900) * 365; 253 254 /* Add the leap days in the previous years between now and 1900. 255 * Note a leap year is one that is a multiple of 4 256 * but not of a 100. Except if it is a multiple of 257 * 400 then it is a leap year. 258 */ 259 *pDateOut += ( (pTm->tm_year - 1) / 4 ) - ( 1900 / 4 ); 260 *pDateOut -= ( (pTm->tm_year - 1) / 100 ) - ( 1900 / 100 ); 261 *pDateOut += ( (pTm->tm_year - 1) / 400 ) - ( 1900 / 400 ); 262 263 /* Set the leap year flag if the 264 * current year specified by tm_year is a 265 * leap year. This will be used to add a day 266 * to the day count. 267 */ 268 if( isleap( pTm->tm_year ) ) 269 leapYear = 1; 270 271 /* Add the number of days corresponding to 272 * the month. 273 */ 274 switch( pTm->tm_mon ) 275 { 276 case 2: 277 *pDateOut += 31; 278 break; 279 case 3: 280 *pDateOut += ( 59 + leapYear ); 281 break; 282 case 4: 283 *pDateOut += ( 90 + leapYear ); 284 break; 285 case 5: 286 *pDateOut += ( 120 + leapYear ); 287 break; 288 case 6: 289 *pDateOut += ( 151 + leapYear ); 290 break; 291 case 7: 292 *pDateOut += ( 181 + leapYear ); 293 break; 294 case 8: 295 *pDateOut += ( 212 + leapYear ); 296 break; 297 case 9: 298 *pDateOut += ( 243 + leapYear ); 299 break; 300 case 10: 301 *pDateOut += ( 273 + leapYear ); 302 break; 303 case 11: 304 *pDateOut += ( 304 + leapYear ); 305 break; 306 case 12: 307 *pDateOut += ( 334 + leapYear ); 308 break; 309 } 310 /* Add the number of days in this month. 311 */ 312 *pDateOut += pTm->tm_mday; 313 314 /* Add the number of seconds, minutes, and hours 315 * to the DATE. Note these are the fracionnal part 316 * of the DATE so seconds / number of seconds in a day. 317 */ 318 *pDateOut += pTm->tm_hour / 24.0; 319 *pDateOut += pTm->tm_min / 1440.0; 320 *pDateOut += pTm->tm_sec / 86400.0; 321 return TRUE; 322 } 323 return FALSE; 324 } 325 326 /****************************************************************************** 327 * DateToTm [INTERNAL] 327 328 * 328 329 * This function converts a windows DATE to a tm structure. … … 339 340 static BOOL DateToTm( DATE dateIn, DWORD dwFlags, struct tm* pTm ) 340 341 { 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 which352 * associates 2.0 to January 1, 1900. We will353 * remove 1.0 from the whole part of the DATE354 * so that in the following code 1.0355 * 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] format386 */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]342 /* Do not process dates smaller than January 1, 1900. 343 * Which corresponds to 2.0 in the windows DATE format. 344 */ 345 if( dateIn >= 2.0 ) 346 { 347 double decimalPart = 0.0; 348 double wholePart = 0.0; 349 350 memset(pTm,0,sizeof(*pTm)); 351 352 /* Because of the nature of DATE format which 353 * associates 2.0 to January 1, 1900. We will 354 * remove 1.0 from the whole part of the DATE 355 * so that in the following code 1.0 356 * will correspond to January 1, 1900. 357 * This simplifies the processing of the DATE value. 358 */ 359 dateIn -= 1.0; 360 361 wholePart = (double) floor( dateIn ); 362 decimalPart = fmod( dateIn, wholePart ); 363 364 if( !(dwFlags & VAR_TIMEVALUEONLY) ) 365 { 366 int nDay = 0; 367 int leapYear = 0; 368 double yearsSince1900 = 0; 369 /* Start at 1900, this is where the DATE time 0.0 starts. 370 */ 371 pTm->tm_year = 1900; 372 /* find in what year the day in the "wholePart" falls into. 373 * add the value to the year field. 374 */ 375 yearsSince1900 = floor( (wholePart / DAYS_IN_ONE_YEAR) + 0.001 ); 376 pTm->tm_year += yearsSince1900; 377 /* determine if this is a leap year. 378 */ 379 if( isleap( pTm->tm_year ) ) 380 { 381 leapYear = 1; 382 wholePart++; 383 } 384 385 /* find what day of that year the "wholePart" corresponds to. 386 * Note: nDay is in [1-366] format 387 */ 388 nDay = (int) ( wholePart - floor( yearsSince1900 * DAYS_IN_ONE_YEAR ) ); 389 /* Set the tm_yday value. 390 * Note: The day must be converted from [1-366] to [0-365] 391 */ 392 /*pTm->tm_yday = nDay - 1;*/ 393 /* find which month this day corresponds to. 394 */ 395 if( nDay <= 31 ) 396 { 397 pTm->tm_mday = nDay; 398 pTm->tm_mon = 0; 399 } 400 else if( nDay <= ( 59 + leapYear ) ) 401 { 402 pTm->tm_mday = nDay - 31; 403 pTm->tm_mon = 1; 404 } 405 else if( nDay <= ( 90 + leapYear ) ) 406 { 407 pTm->tm_mday = nDay - ( 59 + leapYear ); 408 pTm->tm_mon = 2; 409 } 410 else if( nDay <= ( 120 + leapYear ) ) 411 { 412 pTm->tm_mday = nDay - ( 90 + leapYear ); 413 pTm->tm_mon = 3; 414 } 415 else if( nDay <= ( 151 + leapYear ) ) 416 { 417 pTm->tm_mday = nDay - ( 120 + leapYear ); 418 pTm->tm_mon = 4; 419 } 420 else if( nDay <= ( 181 + leapYear ) ) 421 { 422 pTm->tm_mday = nDay - ( 151 + leapYear ); 423 pTm->tm_mon = 5; 424 } 425 else if( nDay <= ( 212 + leapYear ) ) 426 { 427 pTm->tm_mday = nDay - ( 181 + leapYear ); 428 pTm->tm_mon = 6; 429 } 430 else if( nDay <= ( 243 + leapYear ) ) 431 { 432 pTm->tm_mday = nDay - ( 212 + leapYear ); 433 pTm->tm_mon = 7; 434 } 435 else if( nDay <= ( 273 + leapYear ) ) 436 { 437 pTm->tm_mday = nDay - ( 243 + leapYear ); 438 pTm->tm_mon = 8; 439 } 440 else if( nDay <= ( 304 + leapYear ) ) 441 { 442 pTm->tm_mday = nDay - ( 273 + leapYear ); 443 pTm->tm_mon = 9; 444 } 445 else if( nDay <= ( 334 + leapYear ) ) 446 { 447 pTm->tm_mday = nDay - ( 304 + leapYear ); 448 pTm->tm_mon = 10; 449 } 450 else if( nDay <= ( 365 + leapYear ) ) 451 { 452 pTm->tm_mday = nDay - ( 334 + leapYear ); 453 pTm->tm_mon = 11; 454 } 455 } 456 if( !(dwFlags & VAR_DATEVALUEONLY) ) 457 { 458 /* find the number of seconds in this day. 459 * fractional part times, hours, minutes, seconds. 460 */ 461 pTm->tm_hour = (int) ( decimalPart * 24 ); 462 pTm->tm_min = (int) ( ( ( decimalPart * 24 ) - pTm->tm_hour ) * 60 ); 463 pTm->tm_sec = (int) ( ( ( decimalPart * 24 * 60 ) - ( pTm->tm_hour * 60 ) - pTm->tm_min ) * 60 ); 464 } 465 return TRUE; 466 } 467 return FALSE; 468 } 469 470 471 472 /****************************************************************************** 473 * SizeOfVariantData [INTERNAL] 473 474 * 474 475 * This function finds the size of the data referenced by a Variant based … … 528 529 } 529 530 /****************************************************************************** 530 * StringDupAtoBstr[INTERNAL]531 * 531 * StringDupAtoBstr [INTERNAL] 532 * 532 533 */ 533 534 static BSTR StringDupAtoBstr( char* strIn ) 534 535 { 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]536 BSTR bstr = NULL; 537 OLECHAR* pNewString = NULL; 538 pNewString = HEAP_strdupAtoW( GetProcessHeap(), 0, strIn ); 539 bstr = SysAllocString( pNewString ); 540 HeapFree( GetProcessHeap(), 0, pNewString ); 541 return bstr; 542 } 543 544 /****************************************************************************** 545 * round [INTERNAL] 545 546 * 546 547 * Round the double value to the nearest integer value. … … 556 557 nSign = (d >= 0.0) ? 1 : -1; 557 558 d = fabs( d ); 558 559 /* Remove the decimals.560 */559 560 /* Remove the decimals. 561 */ 561 562 integerValue = floor( d ); 562 563 … … 573 574 decimals = d - integerValue; 574 575 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 */576 /* Note: Ceil returns the smallest integer that is greater that x. 577 * and floor returns the largest integer that is less than or equal to x. 578 */ 578 579 if( decimals > 0.5 ) 579 580 { … … 603 604 } 604 605 605 return roundedValue * nSign;606 } 607 608 /****************************************************************************** 609 * RemoveCharacterFromString[INTERNAL]606 return roundedValue * nSign; 607 } 608 609 /****************************************************************************** 610 * RemoveCharacterFromString [INTERNAL] 610 611 * 611 612 * Removes any of the characters in "strOfCharToRemove" from the "str" argument. … … 613 614 static void RemoveCharacterFromString( LPSTR str, LPSTR strOfCharToRemove ) 614 615 { 615 LPSTR pNewString = NULL;616 LPSTR strToken = NULL;617 618 619 /* Check if we have a valid argument620 */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]616 LPSTR pNewString = NULL; 617 LPSTR strToken = NULL; 618 619 620 /* Check if we have a valid argument 621 */ 622 if( str != NULL ) 623 { 624 pNewString = strdup( str ); 625 str[0] = '\0'; 626 strToken = strtok( pNewString, strOfCharToRemove ); 627 while( strToken != NULL ) { 628 strcat( str, strToken ); 629 strToken = strtok( NULL, strOfCharToRemove ); 630 } 631 free( pNewString ); 632 } 633 return; 634 } 635 636 /****************************************************************************** 637 * GetValidRealString [INTERNAL] 637 638 * 638 639 * Checks if the string is of proper format to be converted to a real value. … … 640 641 static BOOL IsValidRealString( LPSTR strRealString ) 641 642 { 642 /* Real values that have a decimal point are required to either have643 * digits before or after the decimal point. We will assume that644 * we do not have any digits at either position. If we do encounter645 * 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 argument669 */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.643 /* Real values that have a decimal point are required to either have 644 * digits before or after the decimal point. We will assume that 645 * we do not have any digits at either position. If we do encounter 646 * some we will disable this flag. 647 */ 648 BOOL bDigitsRequired = TRUE; 649 /* Processed fields in the string representation of the real number. 650 */ 651 BOOL bWhiteSpaceProcessed = FALSE; 652 BOOL bFirstSignProcessed = FALSE; 653 BOOL bFirstDigitsProcessed = FALSE; 654 BOOL bDecimalPointProcessed = FALSE; 655 BOOL bSecondDigitsProcessed = FALSE; 656 BOOL bExponentProcessed = FALSE; 657 BOOL bSecondSignProcessed = FALSE; 658 BOOL bThirdDigitsProcessed = FALSE; 659 /* Assume string parameter "strRealString" is valid and try to disprove it. 660 */ 661 BOOL bValidRealString = TRUE; 662 663 /* Used to count the number of tokens in the "strRealString". 664 */ 665 LPSTR strToken = NULL; 666 int nTokens = 0; 667 LPSTR pChar = NULL; 668 669 /* Check if we have a valid argument 670 */ 671 if( strRealString == NULL ) 672 { 673 bValidRealString = FALSE; 674 } 675 676 if( bValidRealString == TRUE ) 677 { 678 /* Make sure we only have ONE token in the string. 679 */ 680 strToken = strtok( strRealString, " " ); 681 while( strToken != NULL ) { 682 nTokens++; 683 strToken = strtok( NULL, " " ); 684 } 685 686 if( nTokens != 1 ) 687 { 688 bValidRealString = FALSE; 689 } 690 } 691 692 693 /* Make sure this token contains only valid characters. 694 * The string argument to atof has the following form: 695 * [whitespace] [sign] [digits] [.digits] [ {d | D | e | E }[sign]digits] 696 * Whitespace consists of space and|or <TAB> characters, which are ignored. 696 697 * Sign is either plus '+' or minus '-'. 697 698 * Digits are one or more decimal digits. … … 700 701 * The decimal digits may be followed by an exponent. 701 702 * An Exponent consists of an introductory letter ( D, d, E, or e) and 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 {703 * an optionally signed decimal integer. 704 */ 705 pChar = strRealString; 706 while( bValidRealString == TRUE && *pChar != '\0' ) 707 { 708 switch( *pChar ) 709 { 710 /* If whitespace... 711 */ 712 case ' ': 713 case '\t': 714 if( bWhiteSpaceProcessed || 715 bFirstSignProcessed || 716 bFirstDigitsProcessed || 717 bDecimalPointProcessed || 718 bSecondDigitsProcessed || 719 bExponentProcessed || 720 bSecondSignProcessed || 721 bThirdDigitsProcessed ) 722 { 723 bValidRealString = FALSE; 724 } 725 break; 726 /* If sign... 727 */ 728 case '+': 729 case '-': 730 if( bFirstSignProcessed == FALSE ) 731 { 732 if( bFirstDigitsProcessed || 733 bDecimalPointProcessed || 734 bSecondDigitsProcessed || 735 bExponentProcessed || 736 bSecondSignProcessed || 737 bThirdDigitsProcessed ) 738 { 739 bValidRealString = FALSE; 740 } 741 bWhiteSpaceProcessed = TRUE; 742 bFirstSignProcessed = TRUE; 743 } 744 else if( bSecondSignProcessed == FALSE ) 745 { 745 746 /* Note: The exponent must be present in 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 point788 * 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 point805 * 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.747 * order to accept the second sign... 748 */ 749 if( bExponentProcessed == FALSE || 750 bThirdDigitsProcessed || 751 bDigitsRequired ) 752 { 753 bValidRealString = FALSE; 754 } 755 bFirstSignProcessed = TRUE; 756 bWhiteSpaceProcessed = TRUE; 757 bFirstDigitsProcessed = TRUE; 758 bDecimalPointProcessed = TRUE; 759 bSecondDigitsProcessed = TRUE; 760 bSecondSignProcessed = TRUE; 761 } 762 break; 763 764 /* If decimals... 765 */ 766 case '0': 767 case '1': 768 case '2': 769 case '3': 770 case '4': 771 case '5': 772 case '6': 773 case '7': 774 case '8': 775 case '9': 776 if( bFirstDigitsProcessed == FALSE ) 777 { 778 if( bDecimalPointProcessed || 779 bSecondDigitsProcessed || 780 bExponentProcessed || 781 bSecondSignProcessed || 782 bThirdDigitsProcessed ) 783 { 784 bValidRealString = FALSE; 785 } 786 bFirstSignProcessed = TRUE; 787 bWhiteSpaceProcessed = TRUE; 788 /* We have found some digits before the decimal point 789 * so disable the "Digits required" flag. 790 */ 791 bDigitsRequired = FALSE; 792 } 793 else if( bSecondDigitsProcessed == FALSE ) 794 { 795 if( bExponentProcessed || 796 bSecondSignProcessed || 797 bThirdDigitsProcessed ) 798 { 799 bValidRealString = FALSE; 800 } 801 bFirstSignProcessed = TRUE; 802 bWhiteSpaceProcessed = TRUE; 803 bFirstDigitsProcessed = TRUE; 804 bDecimalPointProcessed = TRUE; 805 /* We have found some digits after the decimal point 806 * so disable the "Digits required" flag. 807 */ 808 bDigitsRequired = FALSE; 809 } 810 else if( bThirdDigitsProcessed == FALSE ) 811 { 812 /* Getting here means everything else should be processed. 812 813 * If we get anything else than a decimal following this 813 814 * digit it will be flagged by the other cases, so 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 invalid864 * 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]815 * we do not really need to do anything in here. 816 */ 817 } 818 break; 819 /* If DecimalPoint... 820 */ 821 case '.': 822 if( bDecimalPointProcessed || 823 bSecondDigitsProcessed || 824 bExponentProcessed || 825 bSecondSignProcessed || 826 bThirdDigitsProcessed ) 827 { 828 bValidRealString = FALSE; 829 } 830 bFirstSignProcessed = TRUE; 831 bWhiteSpaceProcessed = TRUE; 832 bFirstDigitsProcessed = TRUE; 833 bDecimalPointProcessed = TRUE; 834 break; 835 /* If Exponent... 836 */ 837 case 'e': 838 case 'E': 839 case 'd': 840 case 'D': 841 if( bExponentProcessed || 842 bSecondSignProcessed || 843 bThirdDigitsProcessed || 844 bDigitsRequired ) 845 { 846 bValidRealString = FALSE; 847 } 848 bFirstSignProcessed = TRUE; 849 bWhiteSpaceProcessed = TRUE; 850 bFirstDigitsProcessed = TRUE; 851 bDecimalPointProcessed = TRUE; 852 bSecondDigitsProcessed = TRUE; 853 bExponentProcessed = TRUE; 854 break; 855 default: 856 bValidRealString = FALSE; 857 break; 858 } 859 /* Process next character. 860 */ 861 pChar++; 862 } 863 864 /* If the required digits were not present we have an invalid 865 * string representation of a real number. 866 */ 867 if( bDigitsRequired == TRUE ) 868 { 869 bValidRealString = FALSE; 870 } 871 872 return bValidRealString; 873 } 874 875 876 /****************************************************************************** 877 * Coerce [INTERNAL] 877 878 * 878 879 * This function dispatches execution to the proper conversion API … … 880 881 * 881 882 * FIXME: Passing down dwFlags to the conversion functions is wrong, this 882 * is a different flagmask. Check MSDN.883 * is a different flagmask. Check MSDN. 883 884 */ 884 885 static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps, VARTYPE vt ) 885 886 { 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 are892 * both signed integers "int" will be treated as "long" in the893 * 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 {887 HRESULT res = S_OK; 888 unsigned short vtFrom = 0; 889 vtFrom = V_VT(ps) & VT_TYPEMASK; 890 891 892 /* Note: Since "long" and "int" values both have 4 bytes and are 893 * both signed integers "int" will be treated as "long" in the 894 * following code. 895 * The same goes for their unsigned versions. 896 */ 897 898 /* Trivial Case: If the coercion is from two types that are 899 * identical then we can blindly copy from one argument to another.*/ 900 if ((vt==vtFrom)) 901 { 902 return VariantCopy(pd,ps); 903 } 904 905 /* Cases requiring thought*/ 906 switch( vt ) 907 { 907 908 908 909 case( VT_EMPTY ): … … 916 917 } 917 918 break; 918 case( VT_I1 ):919 switch( vtFrom )919 case( VT_I1 ): 920 switch( vtFrom ) 920 921 { 921 922 case( VT_I1 ): 922 923 res = VariantCopy( pd, ps ); 923 924 break; 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;925 case( VT_I2 ): 926 res = VarI1FromI2( V_UNION(ps,iVal), &V_UNION(pd,cVal) ); 927 break; 928 case( VT_INT ): 929 case( VT_I4 ): 930 res = VarI1FromI4( V_UNION(ps,lVal), &V_UNION(pd,cVal) ); 931 break; 932 case( VT_UI1 ): 933 res = VarI1FromUI1( V_UNION(ps,bVal), &V_UNION(pd,cVal) ); 934 break; 935 case( VT_UI2 ): 936 res = VarI1FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,cVal) ); 937 break; 938 case( VT_UINT ): 939 case( VT_UI4 ): 940 res = VarI1FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,cVal) ); 941 break; 942 case( VT_R4 ): 943 res = VarI1FromR4( V_UNION(ps,fltVal), &V_UNION(pd,cVal) ); 944 break; 945 case( VT_R8 ): 946 res = VarI1FromR8( V_UNION(ps,dblVal), &V_UNION(pd,cVal) ); 947 break; 948 case( VT_DATE ): 949 res = VarI1FromDate( V_UNION(ps,date), &V_UNION(pd,cVal) ); 950 break; 951 case( VT_BOOL ): 952 res = VarI1FromBool( V_UNION(ps,boolVal), &V_UNION(pd,cVal) ); 953 break; 954 case( VT_BSTR ): 955 res = VarI1FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,cVal) ); 956 break; 957 case( VT_CY ): 958 res = VarI1FromCy( V_UNION(ps,cyVal), &V_UNION(pd,cVal) ); 959 break; 960 case( VT_DISPATCH ): 961 /*res = VarI1FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,cVal) );*/ 962 case( VT_DECIMAL ): 963 /*res = VarI1FromDec( V_UNION(ps,decVal), &V_UNION(pd,cVal) );*/ 964 case( VT_UNKNOWN ): 965 default: 966 res = DISP_E_TYPEMISMATCH; 967 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 968 break; 969 } 970 break; 971 972 case( VT_I2 ): 973 switch( vtFrom ) 974 { 975 case( VT_I1 ): 976 res = VarI2FromI1( V_UNION(ps,cVal), &V_UNION(pd,iVal) ); 977 break; 977 978 case( VT_I2 ): 978 979 res = VariantCopy( pd, ps ); 979 980 break; 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) );981 case( VT_INT ): 982 case( VT_I4 ): 983 res = VarI2FromI4( V_UNION(ps,lVal), &V_UNION(pd,iVal) ); 984 break; 985 case( VT_UI1 ): 986 res = VarI2FromUI1( V_UNION(ps,bVal), &V_UNION(pd,iVal) ); 987 break; 988 case( VT_UI2 ): 989 res = VarI2FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,iVal) ); 990 break; 991 case( VT_UINT ): 992 case( VT_UI4 ): 993 res = VarI2FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,iVal) ); 994 break; 995 case( VT_R4 ): 996 res = VarI2FromR4( V_UNION(ps,fltVal), &V_UNION(pd,iVal) ); 997 break; 998 case( VT_R8 ): 999 res = VarI2FromR8( V_UNION(ps,dblVal), &V_UNION(pd,iVal) ); 1000 break; 1001 case( VT_DATE ): 1002 res = VarI2FromDate( V_UNION(ps,date), &V_UNION(pd,iVal) ); 1003 break; 1004 case( VT_BOOL ): 1005 res = VarI2FromBool( V_UNION(ps,boolVal), &V_UNION(pd,iVal) ); 1006 break; 1007 case( VT_BSTR ): 1008 res = VarI2FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,iVal) ); 1009 break; 1010 case( VT_CY ): 1011 res = VarI2FromCy( V_UNION(ps,cyVal), &V_UNION(pd,iVal) ); 1012 break; 1013 case( VT_DISPATCH ): 1014 /*res = VarI2FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,iVal) );*/ 1015 case( VT_DECIMAL ): 1016 /*res = VarI2FromDec( V_UNION(ps,deiVal), &V_UNION(pd,iVal) );*/ 1017 case( VT_UNKNOWN ): 1018 default: 1019 res = DISP_E_TYPEMISMATCH; 1020 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1021 break; 1022 } 1023 break; 1024 1025 case( VT_INT ): 1026 case( VT_I4 ): 1027 switch( vtFrom ) 1028 { 1029 case( VT_I1 ): 1030 res = VarI4FromI1( V_UNION(ps,cVal), &V_UNION(pd,lVal) ); 1031 break; 1032 case( VT_I2 ): 1033 res = VarI4FromI2( V_UNION(ps,iVal), &V_UNION(pd,lVal) ); 1033 1034 break; 1034 1035 case( VT_INT ): … … 1039 1040 res = VariantCopy( pd, ps ); 1040 1041 break; 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;1042 case( VT_UI1 ): 1043 res = VarI4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,lVal) ); 1044 break; 1045 case( VT_UI2 ): 1046 res = VarI4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,lVal) ); 1047 break; 1048 case( VT_UINT ): 1049 case( VT_UI4 ): 1050 res = VarI4FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,lVal) ); 1051 break; 1052 case( VT_R4 ): 1053 res = VarI4FromR4( V_UNION(ps,fltVal), &V_UNION(pd,lVal) ); 1054 break; 1055 case( VT_R8 ): 1056 res = VarI4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,lVal) ); 1057 break; 1058 case( VT_DATE ): 1059 res = VarI4FromDate( V_UNION(ps,date), &V_UNION(pd,lVal) ); 1060 break; 1061 case( VT_BOOL ): 1062 res = VarI4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,lVal) ); 1063 break; 1064 case( VT_BSTR ): 1065 res = VarI4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,lVal) ); 1066 break; 1067 case( VT_CY ): 1068 res = VarI4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,lVal) ); 1069 break; 1070 case( VT_DISPATCH ): 1071 /*res = VarI4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,lVal) );*/ 1072 case( VT_DECIMAL ): 1073 /*res = VarI4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,lVal) );*/ 1074 case( VT_UNKNOWN ): 1075 default: 1076 res = DISP_E_TYPEMISMATCH; 1077 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1078 break; 1079 } 1080 break; 1081 1082 case( VT_UI1 ): 1083 switch( vtFrom ) 1084 { 1085 case( VT_I1 ): 1086 res = VarUI1FromI1( V_UNION(ps,cVal), &V_UNION(pd,bVal) ); 1087 break; 1088 case( VT_I2 ): 1089 res = VarUI1FromI2( V_UNION(ps,iVal), &V_UNION(pd,bVal) ); 1090 break; 1091 case( VT_INT ): 1092 case( VT_I4 ): 1093 res = VarUI1FromI4( V_UNION(ps,lVal), &V_UNION(pd,bVal) ); 1094 break; 1094 1095 case( VT_UI1 ): 1095 1096 res = VariantCopy( pd, ps ); 1096 1097 break; 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;1098 case( VT_UI2 ): 1099 res = VarUI1FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,bVal) ); 1100 break; 1101 case( VT_UINT ): 1102 case( VT_UI4 ): 1103 res = VarUI1FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,bVal) ); 1104 break; 1105 case( VT_R4 ): 1106 res = VarUI1FromR4( V_UNION(ps,fltVal), &V_UNION(pd,bVal) ); 1107 break; 1108 case( VT_R8 ): 1109 res = VarUI1FromR8( V_UNION(ps,dblVal), &V_UNION(pd,bVal) ); 1110 break; 1111 case( VT_DATE ): 1112 res = VarUI1FromDate( V_UNION(ps,date), &V_UNION(pd,bVal) ); 1113 break; 1114 case( VT_BOOL ): 1115 res = VarUI1FromBool( V_UNION(ps,boolVal), &V_UNION(pd,bVal) ); 1116 break; 1117 case( VT_BSTR ): 1118 res = VarUI1FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,bVal) ); 1119 break; 1120 case( VT_CY ): 1121 res = VarUI1FromCy( V_UNION(ps,cyVal), &V_UNION(pd,bVal) ); 1122 break; 1123 case( VT_DISPATCH ): 1124 /*res = VarUI1FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,bVal) );*/ 1125 case( VT_DECIMAL ): 1126 /*res = VarUI1FromDec( V_UNION(ps,deiVal), &V_UNION(pd,bVal) );*/ 1127 case( VT_UNKNOWN ): 1128 default: 1129 res = DISP_E_TYPEMISMATCH; 1130 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1131 break; 1132 } 1133 break; 1134 1135 case( VT_UI2 ): 1136 switch( vtFrom ) 1137 { 1138 case( VT_I1 ): 1139 res = VarUI2FromI1( V_UNION(ps,cVal), &V_UNION(pd,uiVal) ); 1140 break; 1141 case( VT_I2 ): 1142 res = VarUI2FromI2( V_UNION(ps,iVal), &V_UNION(pd,uiVal) ); 1143 break; 1144 case( VT_INT ): 1145 case( VT_I4 ): 1146 res = VarUI2FromI4( V_UNION(ps,lVal), &V_UNION(pd,uiVal) ); 1147 break; 1148 case( VT_UI1 ): 1149 res = VarUI2FromUI1( V_UNION(ps,bVal), &V_UNION(pd,uiVal) ); 1150 break; 1150 1151 case( VT_UI2 ): 1151 1152 res = VariantCopy( pd, ps ); 1152 1153 break; 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;1154 case( VT_UINT ): 1155 case( VT_UI4 ): 1156 res = VarUI2FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,uiVal) ); 1157 break; 1158 case( VT_R4 ): 1159 res = VarUI2FromR4( V_UNION(ps,fltVal), &V_UNION(pd,uiVal) ); 1160 break; 1161 case( VT_R8 ): 1162 res = VarUI2FromR8( V_UNION(ps,dblVal), &V_UNION(pd,uiVal) ); 1163 break; 1164 case( VT_DATE ): 1165 res = VarUI2FromDate( V_UNION(ps,date), &V_UNION(pd,uiVal) ); 1166 break; 1167 case( VT_BOOL ): 1168 res = VarUI2FromBool( V_UNION(ps,boolVal), &V_UNION(pd,uiVal) ); 1169 break; 1170 case( VT_BSTR ): 1171 res = VarUI2FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,uiVal) ); 1172 break; 1173 case( VT_CY ): 1174 res = VarUI2FromCy( V_UNION(ps,cyVal), &V_UNION(pd,uiVal) ); 1175 break; 1176 case( VT_DISPATCH ): 1177 /*res = VarUI2FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,uiVal) );*/ 1178 case( VT_DECIMAL ): 1179 /*res = VarUI2FromDec( V_UNION(ps,deiVal), &V_UNION(pd,uiVal) );*/ 1180 case( VT_UNKNOWN ): 1181 default: 1182 res = DISP_E_TYPEMISMATCH; 1183 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1184 break; 1185 } 1186 break; 1187 1188 case( VT_UINT ): 1189 case( VT_UI4 ): 1190 switch( vtFrom ) 1191 { 1192 case( VT_I1 ): 1193 res = VarUI4FromI1( V_UNION(ps,cVal), &V_UNION(pd,ulVal) ); 1194 break; 1195 case( VT_I2 ): 1196 res = VarUI4FromI2( V_UNION(ps,iVal), &V_UNION(pd,ulVal) ); 1197 break; 1198 case( VT_INT ): 1199 case( VT_I4 ): 1200 res = VarUI4FromI4( V_UNION(ps,lVal), &V_UNION(pd,ulVal) ); 1201 break; 1202 case( VT_UI1 ): 1203 res = VarUI4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,ulVal) ); 1204 break; 1205 case( VT_UI2 ): 1206 res = VarUI4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,ulVal) ); 1207 break; 1207 1208 case( VT_UI4 ): 1208 1209 res = VariantCopy( pd, ps ); 1209 1210 break; 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;1211 case( VT_R4 ): 1212 res = VarUI4FromR4( V_UNION(ps,fltVal), &V_UNION(pd,ulVal) ); 1213 break; 1214 case( VT_R8 ): 1215 res = VarUI4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,ulVal) ); 1216 break; 1217 case( VT_DATE ): 1218 res = VarUI4FromDate( V_UNION(ps,date), &V_UNION(pd,ulVal) ); 1219 break; 1220 case( VT_BOOL ): 1221 res = VarUI4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,ulVal) ); 1222 break; 1223 case( VT_BSTR ): 1224 res = VarUI4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,ulVal) ); 1225 break; 1226 case( VT_CY ): 1227 res = VarUI4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,ulVal) ); 1228 break; 1229 case( VT_DISPATCH ): 1230 /*res = VarUI4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,ulVal) );*/ 1231 case( VT_DECIMAL ): 1232 /*res = VarUI4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,ulVal) );*/ 1233 case( VT_UNKNOWN ): 1234 default: 1235 res = DISP_E_TYPEMISMATCH; 1236 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1237 break; 1238 } 1239 break; 1240 1241 case( VT_R4 ): 1242 switch( vtFrom ) 1243 { 1244 case( VT_I1 ): 1245 res = VarR4FromI1( V_UNION(ps,cVal), &V_UNION(pd,fltVal) ); 1246 break; 1247 case( VT_I2 ): 1248 res = VarR4FromI2( V_UNION(ps,iVal), &V_UNION(pd,fltVal) ); 1249 break; 1250 case( VT_INT ): 1251 case( VT_I4 ): 1252 res = VarR4FromI4( V_UNION(ps,lVal), &V_UNION(pd,fltVal) ); 1253 break; 1254 case( VT_UI1 ): 1255 res = VarR4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,fltVal) ); 1256 break; 1257 case( VT_UI2 ): 1258 res = VarR4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,fltVal) ); 1259 break; 1260 case( VT_UINT ): 1261 case( VT_UI4 ): 1262 res = VarR4FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,fltVal) ); 1263 break; 1263 1264 case( VT_R4 ): 1264 1265 res = VariantCopy( pd, ps ); 1265 1266 break; 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;1267 case( VT_R8 ): 1268 res = VarR4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,fltVal) ); 1269 break; 1270 case( VT_DATE ): 1271 res = VarR4FromDate( V_UNION(ps,date), &V_UNION(pd,fltVal) ); 1272 break; 1273 case( VT_BOOL ): 1274 res = VarR4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,fltVal) ); 1275 break; 1276 case( VT_BSTR ): 1277 res = VarR4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,fltVal) ); 1278 break; 1279 case( VT_CY ): 1280 res = VarR4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,fltVal) ); 1281 break; 1282 case( VT_DISPATCH ): 1283 /*res = VarR4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,fltVal) );*/ 1284 case( VT_DECIMAL ): 1285 /*res = VarR4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,fltVal) );*/ 1286 case( VT_UNKNOWN ): 1287 default: 1288 res = DISP_E_TYPEMISMATCH; 1289 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1290 break; 1291 } 1292 break; 1293 1294 case( VT_R8 ): 1295 switch( vtFrom ) 1296 { 1297 case( VT_I1 ): 1298 res = VarR8FromI1( V_UNION(ps,cVal), &V_UNION(pd,dblVal) ); 1299 break; 1300 case( VT_I2 ): 1301 res = VarR8FromI2( V_UNION(ps,iVal), &V_UNION(pd,dblVal) ); 1302 break; 1303 case( VT_INT ): 1304 case( VT_I4 ): 1305 res = VarR8FromI4( V_UNION(ps,lVal), &V_UNION(pd,dblVal) ); 1306 break; 1307 case( VT_UI1 ): 1308 res = VarR8FromUI1( V_UNION(ps,bVal), &V_UNION(pd,dblVal) ); 1309 break; 1310 case( VT_UI2 ): 1311 res = VarR8FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,dblVal) ); 1312 break; 1313 case( VT_UINT ): 1314 case( VT_UI4 ): 1315 res = VarR8FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,dblVal) ); 1316 break; 1317 case( VT_R4 ): 1318 res = VarR8FromR4( V_UNION(ps,fltVal), &V_UNION(pd,dblVal) ); 1319 break; 1319 1320 case( VT_R8 ): 1320 1321 res = VariantCopy( pd, ps ); 1321 1322 break; 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;1323 case( VT_DATE ): 1324 res = VarR8FromDate( V_UNION(ps,date), &V_UNION(pd,dblVal) ); 1325 break; 1326 case( VT_BOOL ): 1327 res = VarR8FromBool( V_UNION(ps,boolVal), &V_UNION(pd,dblVal) ); 1328 break; 1329 case( VT_BSTR ): 1330 res = VarR8FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,dblVal) ); 1331 break; 1332 case( VT_CY ): 1333 res = VarR8FromCy( V_UNION(ps,cyVal), &V_UNION(pd,dblVal) ); 1334 break; 1335 case( VT_DISPATCH ): 1336 /*res = VarR8FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,dblVal) );*/ 1337 case( VT_DECIMAL ): 1338 /*res = VarR8FromDec( V_UNION(ps,deiVal), &V_UNION(pd,dblVal) );*/ 1339 case( VT_UNKNOWN ): 1340 default: 1341 res = DISP_E_TYPEMISMATCH; 1342 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1343 break; 1344 } 1345 break; 1346 1347 case( VT_DATE ): 1348 switch( vtFrom ) 1349 { 1350 case( VT_I1 ): 1351 res = VarDateFromI1( V_UNION(ps,cVal), &V_UNION(pd,date) ); 1352 break; 1353 case( VT_I2 ): 1354 res = VarDateFromI2( V_UNION(ps,iVal), &V_UNION(pd,date) ); 1355 break; 1356 case( VT_INT ): 1357 res = VarDateFromInt( V_UNION(ps,intVal), &V_UNION(pd,date) ); 1358 break; 1359 case( VT_I4 ): 1360 res = VarDateFromI4( V_UNION(ps,lVal), &V_UNION(pd,date) ); 1361 break; 1362 case( VT_UI1 ): 1363 res = VarDateFromUI1( V_UNION(ps,bVal), &V_UNION(pd,date) ); 1364 break; 1365 case( VT_UI2 ): 1366 res = VarDateFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,date) ); 1367 break; 1368 case( VT_UINT ): 1369 res = VarDateFromUint( V_UNION(ps,uintVal), &V_UNION(pd,date) ); 1370 break; 1371 case( VT_UI4 ): 1372 res = VarDateFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,date) ); 1373 break; 1374 case( VT_R4 ): 1375 res = VarDateFromR4( V_UNION(ps,fltVal), &V_UNION(pd,date) ); 1376 break; 1377 case( VT_R8 ): 1378 res = VarDateFromR8( V_UNION(ps,dblVal), &V_UNION(pd,date) ); 1379 break; 1379 1380 case( VT_DATE ): 1380 1381 res = VariantCopy( pd, ps ); 1381 1382 break; 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;1383 case( VT_BOOL ): 1384 res = VarDateFromBool( V_UNION(ps,boolVal), &V_UNION(pd,date) ); 1385 break; 1386 case( VT_BSTR ): 1387 res = VarDateFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,date) ); 1388 break; 1389 case( VT_CY ): 1390 res = VarDateFromCy( V_UNION(ps,cyVal), &V_UNION(pd,date) ); 1391 break; 1392 case( VT_DISPATCH ): 1393 /*res = VarDateFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,date) );*/ 1394 case( VT_DECIMAL ): 1395 /*res = VarDateFromDec( V_UNION(ps,deiVal), &V_UNION(pd,date) );*/ 1396 case( VT_UNKNOWN ): 1397 default: 1398 res = DISP_E_TYPEMISMATCH; 1399 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1400 break; 1401 } 1402 break; 1403 1404 case( VT_BOOL ): 1405 switch( vtFrom ) 1406 { 1407 case( VT_I1 ): 1408 res = VarBoolFromI1( V_UNION(ps,cVal), &V_UNION(pd,boolVal) ); 1409 break; 1410 case( VT_I2 ): 1411 res = VarBoolFromI2( V_UNION(ps,iVal), &V_UNION(pd,boolVal) ); 1412 break; 1413 case( VT_INT ): 1414 res = VarBoolFromInt( V_UNION(ps,intVal), &V_UNION(pd,boolVal) ); 1415 break; 1416 case( VT_I4 ): 1417 res = VarBoolFromI4( V_UNION(ps,lVal), &V_UNION(pd,boolVal) ); 1418 break; 1419 case( VT_UI1 ): 1420 res = VarBoolFromUI1( V_UNION(ps,bVal), &V_UNION(pd,boolVal) ); 1421 break; 1422 case( VT_UI2 ): 1423 res = VarBoolFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,boolVal) ); 1424 break; 1425 case( VT_UINT ): 1426 res = VarBoolFromUint( V_UNION(ps,uintVal), &V_UNION(pd,boolVal) ); 1427 break; 1428 case( VT_UI4 ): 1429 res = VarBoolFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,boolVal) ); 1430 break; 1431 case( VT_R4 ): 1432 res = VarBoolFromR4( V_UNION(ps,fltVal), &V_UNION(pd,boolVal) ); 1433 break; 1434 case( VT_R8 ): 1435 res = VarBoolFromR8( V_UNION(ps,dblVal), &V_UNION(pd,boolVal) ); 1436 break; 1437 case( VT_DATE ): 1438 res = VarBoolFromDate( V_UNION(ps,date), &V_UNION(pd,boolVal) ); 1439 break; 1439 1440 case( VT_BOOL ): 1440 1441 res = VariantCopy( pd, ps ); 1441 1442 break; 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 else1467 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;1443 case( VT_BSTR ): 1444 res = VarBoolFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,boolVal) ); 1445 break; 1446 case( VT_CY ): 1447 res = VarBoolFromCy( V_UNION(ps,cyVal), &V_UNION(pd,boolVal) ); 1448 break; 1449 case( VT_DISPATCH ): 1450 /*res = VarBoolFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,boolVal) );*/ 1451 case( VT_DECIMAL ): 1452 /*res = VarBoolFromDec( V_UNION(ps,deiVal), &V_UNION(pd,boolVal) );*/ 1453 case( VT_UNKNOWN ): 1454 default: 1455 res = DISP_E_TYPEMISMATCH; 1456 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1457 break; 1458 } 1459 break; 1460 1461 case( VT_BSTR ): 1462 switch( vtFrom ) 1463 { 1464 case( VT_EMPTY ): 1465 if ((V_UNION(pd,bstrVal) = SysAllocStringLen(NULL, 0))) 1466 res = S_OK; 1467 else 1468 res = E_OUTOFMEMORY; 1469 break; 1470 case( VT_I1 ): 1471 res = VarBstrFromI1( V_UNION(ps,cVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1472 break; 1473 case( VT_I2 ): 1474 res = VarBstrFromI2( V_UNION(ps,iVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1475 break; 1476 case( VT_INT ): 1477 res = VarBstrFromInt( V_UNION(ps,intVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1478 break; 1479 case( VT_I4 ): 1480 res = VarBstrFromI4( V_UNION(ps,lVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1481 break; 1482 case( VT_UI1 ): 1483 res = VarBstrFromUI1( V_UNION(ps,bVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1484 break; 1485 case( VT_UI2 ): 1486 res = VarBstrFromUI2( V_UNION(ps,uiVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1487 break; 1488 case( VT_UINT ): 1489 res = VarBstrFromUint( V_UNION(ps,uintVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1490 break; 1491 case( VT_UI4 ): 1492 res = VarBstrFromUI4( V_UNION(ps,ulVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1493 break; 1494 case( VT_R4 ): 1495 res = VarBstrFromR4( V_UNION(ps,fltVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1496 break; 1497 case( VT_R8 ): 1498 res = VarBstrFromR8( V_UNION(ps,dblVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1499 break; 1500 case( VT_DATE ): 1501 res = VarBstrFromDate( V_UNION(ps,date), lcid, 0, &V_UNION(pd,bstrVal) ); 1502 break; 1503 case( VT_BOOL ): 1504 res = VarBstrFromBool( V_UNION(ps,boolVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1505 break; 1506 case( VT_BSTR ): 1507 res = VariantCopy( pd, ps ); 1508 break; 1509 case( VT_CY ): 1510 res = VarBstrFromCy( V_UNION(ps,cyVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1511 break; 1512 case( VT_DISPATCH ): 1513 /*res = VarBstrFromDisp( V_UNION(ps,pdispVal), lcid, 0, &(pd,bstrVal) );*/ 1514 case( VT_DECIMAL ): 1515 /*res = VarBstrFromDec( V_UNION(ps,deiVal), lcid, 0, &(pd,bstrVal) );*/ 1516 case( VT_UNKNOWN ): 1517 default: 1518 res = DISP_E_TYPEMISMATCH; 1519 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1520 break; 1521 } 1522 break; 1522 1523 1523 1524 case( VT_CY ): 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]1525 switch( vtFrom ) 1526 { 1527 case( VT_I1 ): 1528 res = VarCyFromI1( V_UNION(ps,cVal), &V_UNION(pd,cyVal) ); 1529 break; 1530 case( VT_I2 ): 1531 res = VarCyFromI2( V_UNION(ps,iVal), &V_UNION(pd,cyVal) ); 1532 break; 1533 case( VT_INT ): 1534 res = VarCyFromInt( V_UNION(ps,intVal), &V_UNION(pd,cyVal) ); 1535 break; 1536 case( VT_I4 ): 1537 res = VarCyFromI4( V_UNION(ps,lVal), &V_UNION(pd,cyVal) ); 1538 break; 1539 case( VT_UI1 ): 1540 res = VarCyFromUI1( V_UNION(ps,bVal), &V_UNION(pd,cyVal) ); 1541 break; 1542 case( VT_UI2 ): 1543 res = VarCyFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,cyVal) ); 1544 break; 1545 case( VT_UINT ): 1546 res = VarCyFromUint( V_UNION(ps,uintVal), &V_UNION(pd,cyVal) ); 1547 break; 1548 case( VT_UI4 ): 1549 res = VarCyFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,cyVal) ); 1550 break; 1551 case( VT_R4 ): 1552 res = VarCyFromR4( V_UNION(ps,fltVal), &V_UNION(pd,cyVal) ); 1553 break; 1554 case( VT_R8 ): 1555 res = VarCyFromR8( V_UNION(ps,dblVal), &V_UNION(pd,cyVal) ); 1556 break; 1557 case( VT_DATE ): 1558 res = VarCyFromDate( V_UNION(ps,date), &V_UNION(pd,cyVal) ); 1559 break; 1560 case( VT_BOOL ): 1561 res = VarCyFromBool( V_UNION(ps,date), &V_UNION(pd,cyVal) ); 1562 break; 1563 case( VT_CY ): 1564 res = VariantCopy( pd, ps ); 1565 break; 1566 case( VT_BSTR ): 1567 res = VarCyFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,cyVal) ); 1568 break; 1569 case( VT_DISPATCH ): 1570 /*res = VarCyFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,cyVal) );*/ 1571 case( VT_DECIMAL ): 1572 /*res = VarCyFromDec( V_UNION(ps,deiVal), &V_UNION(pd,cyVal) );*/ 1573 break; 1574 case( VT_UNKNOWN ): 1575 default: 1576 res = DISP_E_TYPEMISMATCH; 1577 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1578 break; 1579 } 1580 break; 1581 1582 default: 1583 res = DISP_E_TYPEMISMATCH; 1584 FIXME("Coercion from %d to %d\n", vtFrom, vt ); 1585 break; 1586 } 1587 1588 return res; 1589 } 1590 1591 /****************************************************************************** 1592 * ValidateVtRange [INTERNAL] 1592 1593 * 1593 1594 * Used internally by the hi-level Variant API to determine … … 1608 1609 1609 1610 /****************************************************************************** 1610 * ValidateVartype[INTERNAL]1611 * ValidateVartype [INTERNAL] 1611 1612 * 1612 1613 * Used internally by the hi-level Variant API to determine … … 1615 1616 static HRESULT WINAPI ValidateVariantType( VARTYPE vt ) 1616 1617 { 1617 HRESULT res = S_OK;1618 1619 /* check if we have a valid argument.1620 */1621 if( vt & VT_BYREF )1618 HRESULT res = S_OK; 1619 1620 /* check if we have a valid argument. 1621 */ 1622 if( vt & VT_BYREF ) 1622 1623 { 1623 1624 /* if by reference check that the type is in … … 1626 1627 if( ( vt & VT_TYPEMASK ) == VT_EMPTY || 1627 1628 ( vt & VT_TYPEMASK ) == VT_NULL || 1628 ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE )1629 {1630 res = E_INVALIDARG;1631 }1632 1629 ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE ) 1630 { 1631 res = E_INVALIDARG; 1632 } 1633 1633 1634 } 1634 1635 else … … 1636 1637 res = ValidateVtRange( vt ); 1637 1638 } 1638 1639 return res;1640 } 1641 1642 /****************************************************************************** 1643 * ValidateVt[INTERNAL]1639 1640 return res; 1641 } 1642 1643 /****************************************************************************** 1644 * ValidateVt [INTERNAL] 1644 1645 * 1645 1646 * Used internally by the hi-level Variant API to determine … … 1648 1649 static HRESULT WINAPI ValidateVt( VARTYPE vt ) 1649 1650 { 1650 HRESULT res = S_OK;1651 1652 /* check if we have a valid argument.1653 */1654 if( vt & VT_BYREF )1651 HRESULT res = S_OK; 1652 1653 /* check if we have a valid argument. 1654 */ 1655 if( vt & VT_BYREF ) 1655 1656 { 1656 1657 /* if by reference check that the type is in … … 1659 1660 if( ( vt & VT_TYPEMASK ) == VT_EMPTY || 1660 1661 ( vt & VT_TYPEMASK ) == VT_NULL || 1661 ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE )1662 {1663 res = DISP_E_BADVARTYPE;1664 }1665 1662 ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE ) 1663 { 1664 res = DISP_E_BADVARTYPE; 1665 } 1666 1666 1667 } 1667 1668 else … … 1669 1670 res = ValidateVtRange( vt ); 1670 1671 } 1671 1672 return res;1673 } 1674 1675 1676 1677 1678 1679 /****************************************************************************** 1680 * VariantInit[OLEAUT32.8]1672 1673 return res; 1674 } 1675 1676 1677 1678 1679 1680 /****************************************************************************** 1681 * VariantInit [OLEAUT32.8] 1681 1682 * 1682 1683 * Initializes the Variant. Unlike VariantClear it does not interpret the current … … 1694 1695 1695 1696 /****************************************************************************** 1696 * VariantClear[OLEAUT32.9]1697 * VariantClear [OLEAUT32.9] 1697 1698 * 1698 1699 * This function clears the VARIANT by setting the vt field to VT_EMPTY. It also 1699 * sets the wReservedX field to 0. The current contents of the VARIANT are1700 * sets the wReservedX field to 0. The current contents of the VARIANT are 1700 1701 * freed. If the vt is VT_BSTR the string is freed. If VT_DISPATCH the object is 1701 1702 * released. If VT_ARRAY the array is freed. … … 1716 1717 if ( (V_VT(pvarg) & VT_ARRAY) != 0) 1717 1718 { 1718 SafeArrayDestroy(V_UNION(pvarg,parray));1719 SafeArrayDestroy(V_UNION(pvarg,parray)); 1719 1720 } 1720 1721 else 1721 1722 { 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 }1723 switch( V_VT(pvarg) & VT_TYPEMASK ) 1724 { 1725 case( VT_BSTR ): 1726 SysFreeString( V_UNION(pvarg,bstrVal) ); 1727 break; 1728 case( VT_DISPATCH ): 1729 if(V_UNION(pvarg,pdispVal)!=NULL) 1730 ICOM_CALL(Release,V_UNION(pvarg,pdispVal)); 1731 break; 1732 case( VT_VARIANT ): 1733 VariantClear(V_UNION(pvarg,pvarVal)); 1734 break; 1735 case( VT_UNKNOWN ): 1736 if(V_UNION(pvarg,punkVal)!=NULL) 1737 ICOM_CALL(Release,V_UNION(pvarg,punkVal)); 1738 break; 1739 case( VT_SAFEARRAY ): 1740 SafeArrayDestroy(V_UNION(pvarg,parray)); 1741 break; 1742 default: 1743 break; 1744 } 1744 1745 } 1745 1746 } 1746 1747 1747 1748 /* 1748 1749 * Empty all the fields and mark the type as empty. … … 1756 1757 1757 1758 /****************************************************************************** 1758 * VariantCopy[OLEAUT32.10]1759 * VariantCopy [OLEAUT32.10] 1759 1760 * 1760 1761 * Frees up the designation variant and makes a copy of the source. … … 1774 1775 { 1775 1776 res = VariantClear( pvargDest ); 1776 1777 1777 1778 if( res == S_OK ) 1778 1779 { 1779 1780 if( V_VT(pvargSrc) & VT_BYREF ) 1780 1781 { 1781 /* In the case of byreference we only need1782 * to copy the pointer.1783 */1784 pvargDest->n1.n2.n3 = pvargSrc->n1.n2.n3;1785 V_VT(pvargDest) = V_VT(pvargSrc);1782 /* In the case of byreference we only need 1783 * to copy the pointer. 1784 */ 1785 pvargDest->n1.n2.n3 = pvargSrc->n1.n2.n3; 1786 V_VT(pvargDest) = V_VT(pvargSrc); 1786 1787 } 1787 1788 else 1788 1789 { 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 else1797 {1798 /* In the case of by value we need to1799 * copy the actuall value. In the case of1800 * VT_BSTR a copy of the string is made,1801 * if VT_DISPATCH or VT_IUNKNOWN AddReff is1802 * 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 } 1790 /* 1791 * The VT_ARRAY flag is another way to designate a safe array. 1792 */ 1793 if (V_VT(pvargSrc) & VT_ARRAY) 1794 { 1795 SafeArrayCopy(V_UNION(pvargSrc,parray), &V_UNION(pvargDest,parray)); 1796 } 1797 else 1798 { 1799 /* In the case of by value we need to 1800 * copy the actuall value. In the case of 1801 * VT_BSTR a copy of the string is made, 1802 * if VT_DISPATCH or VT_IUNKNOWN AddReff is 1803 * called to increment the object's reference count. 1804 */ 1805 switch( V_VT(pvargSrc) & VT_TYPEMASK ) 1806 { 1807 case( VT_BSTR ): 1808 V_UNION(pvargDest,bstrVal) = SysAllocString( V_UNION(pvargSrc,bstrVal) ); 1809 break; 1810 case( VT_DISPATCH ): 1811 V_UNION(pvargDest,pdispVal) = V_UNION(pvargSrc,pdispVal); 1812 if (V_UNION(pvargDest,pdispVal)!=NULL) 1813 ICOM_CALL(AddRef,V_UNION(pvargDest,pdispVal)); 1814 break; 1815 case( VT_VARIANT ): 1816 VariantCopy(V_UNION(pvargDest,pvarVal),V_UNION(pvargSrc,pvarVal)); 1817 break; 1818 case( VT_UNKNOWN ): 1819 V_UNION(pvargDest,punkVal) = V_UNION(pvargSrc,punkVal); 1820 if (V_UNION(pvargDest,pdispVal)!=NULL) 1821 ICOM_CALL(AddRef,V_UNION(pvargDest,punkVal)); 1822 break; 1823 case( VT_SAFEARRAY ): 1824 SafeArrayCopy(V_UNION(pvargSrc,parray), &V_UNION(pvargDest,parray)); 1825 break; 1826 default: 1827 pvargDest->n1.n2.n3 = pvargSrc->n1.n2.n3; 1828 break; 1829 } 1830 } 1831 1832 V_VT(pvargDest) = V_VT(pvargSrc); 1833 } 1833 1834 } 1834 1835 } … … 1839 1840 1840 1841 /****************************************************************************** 1841 * VariantCopyInd[OLEAUT32.11]1842 * VariantCopyInd [OLEAUT32.11] 1842 1843 * 1843 1844 * Frees up the destination variant and makes a copy of the source. If … … 1854 1855 if( res != S_OK ) 1855 1856 return res; 1856 1857 1857 1858 if( V_VT(pvargSrc) & VT_BYREF ) 1858 1859 { … … 1876 1877 if( res == S_OK ) 1877 1878 { 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 else1886 {1887 /* In the case of by reference we need1888 * 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 on1903 * VariantCopyInd in Windows and the documentation1904 * this API dereferences the inner Variants to only one depth.1905 * If the inner Variant itself contains an1906 * other inner variant the E_INVALIDARG error is1907 * returned. 1908 */1909 if( pvargSrc->n1.n2.wReserved1 & PROCESSING_INNER_VARIANT )1910 {1911 /* If we get here we are attempting to deference1912 * an inner variant that that is itself contained1913 * in an inner variant so report E_INVALIDARG error.1914 */1915 res = E_INVALIDARG;1916 }1917 else1918 {1919 /* Set the processing inner variant flag.1920 * We will set this flag in the inner variant1921 * 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 union1941 * part of the Variant contains a pointer to some data of1942 * type "V_VT(pvargSrc) & VT_TYPEMASK".1943 * We will deference this data in a generic fashion using1944 * the void pointer "Variant.u.byref".1945 * We will copy this data into the union of the destination1946 * 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;1879 /* 1880 * The VT_ARRAY flag is another way to designate a safearray variant. 1881 */ 1882 if ( V_VT(pvargSrc) & VT_ARRAY) 1883 { 1884 SafeArrayCopy(*V_UNION(pvargSrc,pparray), &V_UNION(pvargDest,parray)); 1885 } 1886 else 1887 { 1888 /* In the case of by reference we need 1889 * to copy the date pointed to by the variant. 1890 */ 1891 1892 /* Get the variant type. 1893 */ 1894 switch( V_VT(pvargSrc) & VT_TYPEMASK ) 1895 { 1896 case( VT_BSTR ): 1897 V_UNION(pvargDest,bstrVal) = SysAllocString( *(V_UNION(pvargSrc,pbstrVal)) ); 1898 break; 1899 case( VT_DISPATCH ): 1900 break; 1901 case( VT_VARIANT ): 1902 { 1903 /* Prevent from cycling. According to tests on 1904 * VariantCopyInd in Windows and the documentation 1905 * this API dereferences the inner Variants to only one depth. 1906 * If the inner Variant itself contains an 1907 * other inner variant the E_INVALIDARG error is 1908 * returned. 1909 */ 1910 if( pvargSrc->n1.n2.wReserved1 & PROCESSING_INNER_VARIANT ) 1911 { 1912 /* If we get here we are attempting to deference 1913 * an inner variant that that is itself contained 1914 * in an inner variant so report E_INVALIDARG error. 1915 */ 1916 res = E_INVALIDARG; 1917 } 1918 else 1919 { 1920 /* Set the processing inner variant flag. 1921 * We will set this flag in the inner variant 1922 * that will be passed to the VariantCopyInd function. 1923 */ 1924 (V_UNION(pvargSrc,pvarVal))->n1.n2.wReserved1 |= PROCESSING_INNER_VARIANT; 1925 1926 /* Dereference the inner variant. 1927 */ 1928 res = VariantCopyInd( pvargDest, V_UNION(pvargSrc,pvarVal) ); 1929 /* We must also copy its type, I think. 1930 */ 1931 V_VT(pvargSrc) = V_VT(V_UNION(pvargSrc,pvarVal)); 1932 } 1933 } 1934 break; 1935 case( VT_UNKNOWN ): 1936 break; 1937 case( VT_SAFEARRAY ): 1938 SafeArrayCopy(*V_UNION(pvargSrc,pparray), &V_UNION(pvargDest,parray)); 1939 break; 1940 default: 1941 /* This is a by reference Variant which means that the union 1942 * part of the Variant contains a pointer to some data of 1943 * type "V_VT(pvargSrc) & VT_TYPEMASK". 1944 * We will deference this data in a generic fashion using 1945 * the void pointer "Variant.u.byref". 1946 * We will copy this data into the union of the destination 1947 * Variant. 1948 */ 1949 memcpy( &pvargDest->n1.n2, V_UNION(pvargSrc,byref), SizeOfVariantData( pvargSrc ) ); 1950 break; 1951 } 1952 } 1953 1954 V_VT(pvargDest) = V_VT(pvargSrc) & VT_TYPEMASK; 1954 1955 } 1955 1956 } … … 1968 1969 1969 1970 /****************************************************************************** 1970 * VariantChangeType[OLEAUT32.12]1971 * VariantChangeType [OLEAUT32.12] 1971 1972 */ 1972 1973 HRESULT WINAPI VariantChangeType(VARIANTARG* pvargDest, VARIANTARG* pvargSrc, 1973 USHORT wFlags, VARTYPE vt)1974 { 1975 return VariantChangeTypeEx( pvargDest, pvargSrc, 0, wFlags, vt );1976 } 1977 1978 /****************************************************************************** 1979 * VariantChangeTypeEx[OLEAUT32.147]1974 USHORT wFlags, VARTYPE vt) 1975 { 1976 return VariantChangeTypeEx( pvargDest, pvargSrc, 0, wFlags, vt ); 1977 } 1978 1979 /****************************************************************************** 1980 * VariantChangeTypeEx [OLEAUT32.147] 1980 1981 */ 1981 1982 HRESULT WINAPI VariantChangeTypeEx(VARIANTARG* pvargDest, VARIANTARG* pvargSrc, 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 else2035 {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 destination2046 */2047 if ( res == S_OK )2048 V_VT(pvargDest) = vt;2049 2050 return res;2051 } 2052 2053 2054 2055 2056 /****************************************************************************** 2057 * VarUI1FromI2[OLEAUT32.130]1983 LCID lcid, USHORT wFlags, VARTYPE vt) 1984 { 1985 HRESULT res = S_OK; 1986 VARIANTARG varg; 1987 VariantInit( &varg ); 1988 1989 TRACE("(%p, %p, %ld, %u, %u),stub\n", pvargDest, pvargSrc, lcid, wFlags, vt); 1990 1991 /* validate our source argument. 1992 */ 1993 res = ValidateVariantType( V_VT(pvargSrc) ); 1994 1995 /* validate the vartype. 1996 */ 1997 if( res == S_OK ) 1998 { 1999 res = ValidateVt( vt ); 2000 } 2001 2002 /* if we are doing an in-place conversion make a copy of the source. 2003 */ 2004 if( res == S_OK && pvargDest == pvargSrc ) 2005 { 2006 res = VariantCopy( &varg, pvargSrc ); 2007 pvargSrc = &varg; 2008 } 2009 2010 if( res == S_OK ) 2011 { 2012 /* free up the destination variant. 2013 */ 2014 res = VariantClear( pvargDest ); 2015 } 2016 2017 if( res == S_OK ) 2018 { 2019 if( V_VT(pvargSrc) & VT_BYREF ) 2020 { 2021 /* Convert the source variant to a "byvalue" variant. 2022 */ 2023 VARIANTARG Variant; 2024 VariantInit( &Variant ); 2025 res = VariantCopyInd( &Variant, pvargSrc ); 2026 if( res == S_OK ) 2027 { 2028 res = Coerce( pvargDest, lcid, wFlags, &Variant, vt ); 2029 /* this should not fail. 2030 */ 2031 VariantClear( &Variant ); 2032 } 2033 2034 } 2035 else 2036 { 2037 /* Use the current "byvalue" source variant. 2038 */ 2039 res = Coerce( pvargDest, lcid, wFlags, pvargSrc, vt ); 2040 } 2041 } 2042 /* this should not fail. 2043 */ 2044 VariantClear( &varg ); 2045 2046 /* set the type of the destination 2047 */ 2048 if ( res == S_OK ) 2049 V_VT(pvargDest) = vt; 2050 2051 return res; 2052 } 2053 2054 2055 2056 2057 /****************************************************************************** 2058 * VarUI1FromI2 [OLEAUT32.130] 2058 2059 */ 2059 2060 HRESULT WINAPI VarUI1FromI2(short sIn, BYTE* pbOut) 2060 2061 { 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]2062 TRACE("( %d, %p ), stub\n", sIn, pbOut ); 2063 2064 /* Check range of value. 2065 */ 2066 if( sIn < UI1_MIN || sIn > UI1_MAX ) 2067 { 2068 return DISP_E_OVERFLOW; 2069 } 2070 2071 *pbOut = (BYTE) sIn; 2072 2073 return S_OK; 2074 } 2075 2076 /****************************************************************************** 2077 * VarUI1FromI4 [OLEAUT32.131] 2077 2078 */ 2078 2079 HRESULT WINAPI VarUI1FromI4(LONG lIn, BYTE* pbOut) 2079 2080 { 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]2081 TRACE("( %ld, %p ), stub\n", lIn, pbOut ); 2082 2083 /* Check range of value. 2084 */ 2085 if( lIn < UI1_MIN || lIn > UI1_MAX ) 2086 { 2087 return DISP_E_OVERFLOW; 2088 } 2089 2090 *pbOut = (BYTE) lIn; 2091 2092 return S_OK; 2093 } 2094 2095 2096 /****************************************************************************** 2097 * VarUI1FromR4 [OLEAUT32.132] 2097 2098 */ 2098 2099 HRESULT WINAPI VarUI1FromR4(FLOAT fltIn, BYTE* pbOut) 2099 2100 { 2100 TRACE("( %f, %p ), stub\n", fltIn, pbOut );2101 2102 /* Check range of value.2101 TRACE("( %f, %p ), stub\n", fltIn, pbOut ); 2102 2103 /* Check range of value. 2103 2104 */ 2104 2105 fltIn = round( fltIn ); 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]2106 if( fltIn < UI1_MIN || fltIn > UI1_MAX ) 2107 { 2108 return DISP_E_OVERFLOW; 2109 } 2110 2111 *pbOut = (BYTE) fltIn; 2112 2113 return S_OK; 2114 } 2115 2116 /****************************************************************************** 2117 * VarUI1FromR8 [OLEAUT32.133] 2117 2118 */ 2118 2119 HRESULT WINAPI VarUI1FromR8(double dblIn, BYTE* pbOut) 2119 2120 { 2120 TRACE("( %f, %p ), stub\n", dblIn, pbOut );2121 2122 /* Check range of value.2121 TRACE("( %f, %p ), stub\n", dblIn, pbOut ); 2122 2123 /* Check range of value. 2123 2124 */ 2124 2125 dblIn = round( dblIn ); 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]2126 if( dblIn < UI1_MIN || dblIn > UI1_MAX ) 2127 { 2128 return DISP_E_OVERFLOW; 2129 } 2130 2131 *pbOut = (BYTE) dblIn; 2132 2133 return S_OK; 2134 } 2135 2136 /****************************************************************************** 2137 * VarUI1FromDate [OLEAUT32.135] 2137 2138 */ 2138 2139 HRESULT WINAPI VarUI1FromDate(DATE dateIn, BYTE* pbOut) 2139 2140 { 2140 TRACE("( %f, %p ), stub\n", dateIn, pbOut );2141 2142 /* Check range of value.2141 TRACE("( %f, %p ), stub\n", dateIn, pbOut ); 2142 2143 /* Check range of value. 2143 2144 */ 2144 2145 dateIn = round( dateIn ); 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]2146 if( dateIn < UI1_MIN || dateIn > UI1_MAX ) 2147 { 2148 return DISP_E_OVERFLOW; 2149 } 2150 2151 *pbOut = (BYTE) dateIn; 2152 2153 return S_OK; 2154 } 2155 2156 /****************************************************************************** 2157 * VarUI1FromBool [OLEAUT32.138] 2157 2158 */ 2158 2159 HRESULT WINAPI VarUI1FromBool(VARIANT_BOOL boolIn, BYTE* pbOut) 2159 2160 { 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]2161 TRACE("( %d, %p ), stub\n", boolIn, pbOut ); 2162 2163 *pbOut = (BYTE) boolIn; 2164 2165 return S_OK; 2166 } 2167 2168 /****************************************************************************** 2169 * VarUI1FromI1 [OLEAUT32.237] 2169 2170 */ 2170 2171 HRESULT WINAPI VarUI1FromI1(CHAR cIn, BYTE* pbOut) 2171 2172 { 2172 TRACE("( %c, %p ), stub\n", cIn, pbOut );2173 2174 *pbOut = cIn;2175 2176 return S_OK;2177 } 2178 2179 /****************************************************************************** 2180 * VarUI1FromUI2[OLEAUT32.238]2173 TRACE("( %c, %p ), stub\n", cIn, pbOut ); 2174 2175 *pbOut = cIn; 2176 2177 return S_OK; 2178 } 2179 2180 /****************************************************************************** 2181 * VarUI1FromUI2 [OLEAUT32.238] 2181 2182 */ 2182 2183 HRESULT WINAPI VarUI1FromUI2(USHORT uiIn, BYTE* pbOut) 2183 2184 { 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]2185 TRACE("( %d, %p ), stub\n", uiIn, pbOut ); 2186 2187 /* Check range of value. 2188 */ 2189 if( uiIn > UI1_MAX ) 2190 { 2191 return DISP_E_OVERFLOW; 2192 } 2193 2194 *pbOut = (BYTE) uiIn; 2195 2196 return S_OK; 2197 } 2198 2199 /****************************************************************************** 2200 * VarUI1FromUI4 [OLEAUT32.239] 2200 2201 */ 2201 2202 HRESULT WINAPI VarUI1FromUI4(ULONG ulIn, BYTE* pbOut) 2202 2203 { 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]2204 TRACE("( %ld, %p ), stub\n", ulIn, pbOut ); 2205 2206 /* Check range of value. 2207 */ 2208 if( ulIn > UI1_MAX ) 2209 { 2210 return DISP_E_OVERFLOW; 2211 } 2212 2213 *pbOut = (BYTE) ulIn; 2214 2215 return S_OK; 2216 } 2217 2218 2219 /****************************************************************************** 2220 * VarUI1FromStr [OLEAUT32.136] 2220 2221 */ 2221 2222 HRESULT WINAPI VarUI1FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, BYTE* pbOut) 2222 2223 { 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 argument2229 */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.2224 double dValue = 0.0; 2225 LPSTR pNewString = NULL; 2226 2227 TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, pbOut ); 2228 2229 /* Check if we have a valid argument 2230 */ 2231 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 2232 RemoveCharacterFromString( pNewString, "," ); 2233 if( IsValidRealString( pNewString ) == FALSE ) 2234 { 2235 return DISP_E_TYPEMISMATCH; 2236 } 2237 2238 /* Convert the valid string to a floating point number. 2239 */ 2240 dValue = atof( pNewString ); 2241 2242 /* We don't need the string anymore so free it. 2243 */ 2244 HeapFree( GetProcessHeap(), 0 , pNewString ); 2245 2246 /* Check range of value. 2246 2247 */ 2247 2248 dValue = round( dValue ); 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;2249 if( dValue < UI1_MIN || dValue > UI1_MAX ) 2250 { 2251 return DISP_E_OVERFLOW; 2252 } 2253 2254 *pbOut = (BYTE) dValue; 2255 2256 return S_OK; 2256 2257 } 2257 2258 … … 2262 2263 HRESULT WINAPI VarUI1FromCy(CY cyIn, BYTE* pbOut) { 2263 2264 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 2264 2265 2265 2266 if (t > UI1_MAX || t < UI1_MIN) return DISP_E_OVERFLOW; 2266 2267 2267 2268 *pbOut = (BYTE)t; 2268 2269 return S_OK; … … 2270 2271 2271 2272 /****************************************************************************** 2272 * VarI2FromUI1[OLEAUT32.48]2273 * VarI2FromUI1 [OLEAUT32.48] 2273 2274 */ 2274 2275 HRESULT WINAPI VarI2FromUI1(BYTE bIn, short* psOut) 2275 2276 { 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]2277 TRACE("( 0x%08x, %p ), stub\n", bIn, psOut ); 2278 2279 *psOut = (short) bIn; 2280 2281 return S_OK; 2282 } 2283 2284 /****************************************************************************** 2285 * VarI2FromI4 [OLEAUT32.49] 2285 2286 */ 2286 2287 HRESULT WINAPI VarI2FromI4(LONG lIn, short* psOut) 2287 2288 { 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]2289 TRACE("( %lx, %p ), stub\n", lIn, psOut ); 2290 2291 /* Check range of value. 2292 */ 2293 if( lIn < I2_MIN || lIn > I2_MAX ) 2294 { 2295 return DISP_E_OVERFLOW; 2296 } 2297 2298 *psOut = (short) lIn; 2299 2300 return S_OK; 2301 } 2302 2303 /****************************************************************************** 2304 * VarI2FromR4 [OLEAUT32.50] 2304 2305 */ 2305 2306 HRESULT WINAPI VarI2FromR4(FLOAT fltIn, short* psOut) 2306 2307 { 2307 TRACE("( %f, %p ), stub\n", fltIn, psOut );2308 2309 /* Check range of value.2308 TRACE("( %f, %p ), stub\n", fltIn, psOut ); 2309 2310 /* Check range of value. 2310 2311 */ 2311 2312 fltIn = round( fltIn ); 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]2313 if( fltIn < I2_MIN || fltIn > I2_MAX ) 2314 { 2315 return DISP_E_OVERFLOW; 2316 } 2317 2318 *psOut = (short) fltIn; 2319 2320 return S_OK; 2321 } 2322 2323 /****************************************************************************** 2324 * VarI2FromR8 [OLEAUT32.51] 2324 2325 */ 2325 2326 HRESULT WINAPI VarI2FromR8(double dblIn, short* psOut) 2326 2327 { 2327 TRACE("( %f, %p ), stub\n", dblIn, psOut );2328 2329 /* Check range of value.2328 TRACE("( %f, %p ), stub\n", dblIn, psOut ); 2329 2330 /* Check range of value. 2330 2331 */ 2331 2332 dblIn = round( dblIn ); 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]2333 if( dblIn < I2_MIN || dblIn > I2_MAX ) 2334 { 2335 return DISP_E_OVERFLOW; 2336 } 2337 2338 *psOut = (short) dblIn; 2339 2340 return S_OK; 2341 } 2342 2343 /****************************************************************************** 2344 * VarI2FromDate [OLEAUT32.53] 2344 2345 */ 2345 2346 HRESULT WINAPI VarI2FromDate(DATE dateIn, short* psOut) 2346 2347 { 2347 TRACE("( %f, %p ), stub\n", dateIn, psOut );2348 2349 /* Check range of value.2348 TRACE("( %f, %p ), stub\n", dateIn, psOut ); 2349 2350 /* Check range of value. 2350 2351 */ 2351 2352 dateIn = round( dateIn ); 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]2353 if( dateIn < I2_MIN || dateIn > I2_MAX ) 2354 { 2355 return DISP_E_OVERFLOW; 2356 } 2357 2358 *psOut = (short) dateIn; 2359 2360 return S_OK; 2361 } 2362 2363 /****************************************************************************** 2364 * VarI2FromBool [OLEAUT32.56] 2364 2365 */ 2365 2366 HRESULT WINAPI VarI2FromBool(VARIANT_BOOL boolIn, short* psOut) 2366 2367 { 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]2368 TRACE("( %d, %p ), stub\n", boolIn, psOut ); 2369 2370 *psOut = (short) boolIn; 2371 2372 return S_OK; 2373 } 2374 2375 /****************************************************************************** 2376 * VarI2FromI1 [OLEAUT32.205] 2376 2377 */ 2377 2378 HRESULT WINAPI VarI2FromI1(CHAR cIn, short* psOut) 2378 2379 { 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]2380 TRACE("( %c, %p ), stub\n", cIn, psOut ); 2381 2382 *psOut = (short) cIn; 2383 2384 return S_OK; 2385 } 2386 2387 /****************************************************************************** 2388 * VarI2FromUI2 [OLEAUT32.206] 2388 2389 */ 2389 2390 HRESULT WINAPI VarI2FromUI2(USHORT uiIn, short* psOut) 2390 2391 { 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]2392 TRACE("( %d, %p ), stub\n", uiIn, psOut ); 2393 2394 /* Check range of value. 2395 */ 2396 if( uiIn > I2_MAX ) 2397 { 2398 return DISP_E_OVERFLOW; 2399 } 2400 2401 *psOut = (short) uiIn; 2402 2403 return S_OK; 2404 } 2405 2406 /****************************************************************************** 2407 * VarI2FromUI4 [OLEAUT32.207] 2407 2408 */ 2408 2409 HRESULT WINAPI VarI2FromUI4(ULONG ulIn, short* psOut) 2409 2410 { 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]2411 TRACE("( %lx, %p ), stub\n", ulIn, psOut ); 2412 2413 /* Check range of value. 2414 */ 2415 if( ulIn < I2_MIN || ulIn > I2_MAX ) 2416 { 2417 return DISP_E_OVERFLOW; 2418 } 2419 2420 *psOut = (short) ulIn; 2421 2422 return S_OK; 2423 } 2424 2425 /****************************************************************************** 2426 * VarI2FromStr [OLEAUT32.54] 2426 2427 */ 2427 2428 HRESULT WINAPI VarI2FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, short* psOut) 2428 2429 { 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 argument2435 */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.2430 double dValue = 0.0; 2431 LPSTR pNewString = NULL; 2432 2433 TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, psOut ); 2434 2435 /* Check if we have a valid argument 2436 */ 2437 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 2438 RemoveCharacterFromString( pNewString, "," ); 2439 if( IsValidRealString( pNewString ) == FALSE ) 2440 { 2441 return DISP_E_TYPEMISMATCH; 2442 } 2443 2444 /* Convert the valid string to a floating point number. 2445 */ 2446 dValue = atof( pNewString ); 2447 2448 /* We don't need the string anymore so free it. 2449 */ 2450 HeapFree( GetProcessHeap(), 0, pNewString ); 2451 2452 /* Check range of value. 2452 2453 */ 2453 2454 dValue = round( dValue ); 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;2455 if( dValue < I2_MIN || dValue > I2_MAX ) 2456 { 2457 return DISP_E_OVERFLOW; 2458 } 2459 2460 *psOut = (short) dValue; 2461 2462 return S_OK; 2462 2463 } 2463 2464 … … 2468 2469 HRESULT WINAPI VarI2FromCy(CY cyIn, short* psOut) { 2469 2470 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 2470 2471 2471 2472 if (t > I2_MAX || t < I2_MIN) return DISP_E_OVERFLOW; 2472 2473 2473 2474 *psOut = (SHORT)t; 2474 2475 return S_OK; … … 2476 2477 2477 2478 /****************************************************************************** 2478 * VarI4FromUI1[OLEAUT32.58]2479 * VarI4FromUI1 [OLEAUT32.58] 2479 2480 */ 2480 2481 HRESULT WINAPI VarI4FromUI1(BYTE bIn, LONG* plOut) 2481 2482 { 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]2483 TRACE("( %X, %p ), stub\n", bIn, plOut ); 2484 2485 *plOut = (LONG) bIn; 2486 2487 return S_OK; 2488 } 2489 2490 2491 /****************************************************************************** 2492 * VarI4FromR4 [OLEAUT32.60] 2492 2493 */ 2493 2494 HRESULT WINAPI VarI4FromR4(FLOAT fltIn, LONG* plOut) 2494 2495 { 2495 TRACE("( %f, %p ), stub\n", fltIn, plOut );2496 2497 /* Check range of value.2496 TRACE("( %f, %p ), stub\n", fltIn, plOut ); 2497 2498 /* Check range of value. 2498 2499 */ 2499 2500 fltIn = round( fltIn ); 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]2501 if( fltIn < I4_MIN || fltIn > I4_MAX ) 2502 { 2503 return DISP_E_OVERFLOW; 2504 } 2505 2506 *plOut = (LONG) fltIn; 2507 2508 return S_OK; 2509 } 2510 2511 /****************************************************************************** 2512 * VarI4FromR8 [OLEAUT32.61] 2512 2513 */ 2513 2514 HRESULT WINAPI VarI4FromR8(double dblIn, LONG* plOut) 2514 2515 { 2515 TRACE("( %f, %p ), stub\n", dblIn, plOut );2516 2517 /* Check range of value.2516 TRACE("( %f, %p ), stub\n", dblIn, plOut ); 2517 2518 /* Check range of value. 2518 2519 */ 2519 2520 dblIn = round( dblIn ); 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]2521 if( dblIn < I4_MIN || dblIn > I4_MAX ) 2522 { 2523 return DISP_E_OVERFLOW; 2524 } 2525 2526 *plOut = (LONG) dblIn; 2527 2528 return S_OK; 2529 } 2530 2531 /****************************************************************************** 2532 * VarI4FromDate [OLEAUT32.63] 2532 2533 */ 2533 2534 HRESULT WINAPI VarI4FromDate(DATE dateIn, LONG* plOut) 2534 2535 { 2535 TRACE("( %f, %p ), stub\n", dateIn, plOut );2536 2537 /* Check range of value.2536 TRACE("( %f, %p ), stub\n", dateIn, plOut ); 2537 2538 /* Check range of value. 2538 2539 */ 2539 2540 dateIn = round( dateIn ); 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]2541 if( dateIn < I4_MIN || dateIn > I4_MAX ) 2542 { 2543 return DISP_E_OVERFLOW; 2544 } 2545 2546 *plOut = (LONG) dateIn; 2547 2548 return S_OK; 2549 } 2550 2551 /****************************************************************************** 2552 * VarI4FromBool [OLEAUT32.66] 2552 2553 */ 2553 2554 HRESULT WINAPI VarI4FromBool(VARIANT_BOOL boolIn, LONG* plOut) 2554 2555 { 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]2556 TRACE("( %d, %p ), stub\n", boolIn, plOut ); 2557 2558 *plOut = (LONG) boolIn; 2559 2560 return S_OK; 2561 } 2562 2563 /****************************************************************************** 2564 * VarI4FromI1 [OLEAUT32.209] 2564 2565 */ 2565 2566 HRESULT WINAPI VarI4FromI1(CHAR cIn, LONG* plOut) 2566 2567 { 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]2568 TRACE("( %c, %p ), stub\n", cIn, plOut ); 2569 2570 *plOut = (LONG) cIn; 2571 2572 return S_OK; 2573 } 2574 2575 /****************************************************************************** 2576 * VarI4FromUI2 [OLEAUT32.210] 2576 2577 */ 2577 2578 HRESULT WINAPI VarI4FromUI2(USHORT uiIn, LONG* plOut) 2578 2579 { 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]2580 TRACE("( %d, %p ), stub\n", uiIn, plOut ); 2581 2582 *plOut = (LONG) uiIn; 2583 2584 return S_OK; 2585 } 2586 2587 /****************************************************************************** 2588 * VarI4FromUI4 [OLEAUT32.211] 2588 2589 */ 2589 2590 HRESULT WINAPI VarI4FromUI4(ULONG ulIn, LONG* plOut) 2590 2591 { 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]2592 TRACE("( %lx, %p ), stub\n", ulIn, plOut ); 2593 2594 /* Check range of value. 2595 */ 2596 if( ulIn < I4_MIN || ulIn > I4_MAX ) 2597 { 2598 return DISP_E_OVERFLOW; 2599 } 2600 2601 *plOut = (LONG) ulIn; 2602 2603 return S_OK; 2604 } 2605 2606 /****************************************************************************** 2607 * VarI4FromI2 [OLEAUT32.59] 2607 2608 */ 2608 2609 HRESULT WINAPI VarI4FromI2(short sIn, LONG* plOut) 2609 2610 { 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]2611 TRACE("( %d, %p ), stub\n", sIn, plOut ); 2612 2613 *plOut = (LONG) sIn; 2614 2615 return S_OK; 2616 } 2617 2618 /****************************************************************************** 2619 * VarI4FromStr [OLEAUT32.64] 2619 2620 */ 2620 2621 HRESULT WINAPI VarI4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, LONG* plOut) 2621 2622 { 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 argument2628 */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.2623 double dValue = 0.0; 2624 LPSTR pNewString = NULL; 2625 2626 TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, plOut ); 2627 2628 /* Check if we have a valid argument 2629 */ 2630 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 2631 RemoveCharacterFromString( pNewString, "," ); 2632 if( IsValidRealString( pNewString ) == FALSE ) 2633 { 2634 return DISP_E_TYPEMISMATCH; 2635 } 2636 2637 /* Convert the valid string to a floating point number. 2638 */ 2639 dValue = atof( pNewString ); 2640 2641 /* We don't need the string anymore so free it. 2642 */ 2643 HeapFree( GetProcessHeap(), 0, pNewString ); 2644 2645 /* Check range of value. 2645 2646 */ 2646 2647 dValue = round( dValue ); 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;2648 if( dValue < I4_MIN || dValue > I4_MAX ) 2649 { 2650 return DISP_E_OVERFLOW; 2651 } 2652 2653 *plOut = (LONG) dValue; 2654 2655 return S_OK; 2655 2656 } 2656 2657 … … 2661 2662 HRESULT WINAPI VarI4FromCy(CY cyIn, LONG* plOut) { 2662 2663 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 2663 2664 2664 2665 if (t > I4_MAX || t < I4_MIN) return DISP_E_OVERFLOW; 2665 2666 2666 2667 *plOut = (LONG)t; 2667 2668 return S_OK; … … 2669 2670 2670 2671 /****************************************************************************** 2671 * VarR4FromUI1[OLEAUT32.68]2672 * VarR4FromUI1 [OLEAUT32.68] 2672 2673 */ 2673 2674 HRESULT WINAPI VarR4FromUI1(BYTE bIn, FLOAT* pfltOut) 2674 2675 { 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]2676 TRACE("( %X, %p ), stub\n", bIn, pfltOut ); 2677 2678 *pfltOut = (FLOAT) bIn; 2679 2680 return S_OK; 2681 } 2682 2683 /****************************************************************************** 2684 * VarR4FromI2 [OLEAUT32.69] 2684 2685 */ 2685 2686 HRESULT WINAPI VarR4FromI2(short sIn, FLOAT* pfltOut) 2686 2687 { 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]2688 TRACE("( %d, %p ), stub\n", sIn, pfltOut ); 2689 2690 *pfltOut = (FLOAT) sIn; 2691 2692 return S_OK; 2693 } 2694 2695 /****************************************************************************** 2696 * VarR4FromI4 [OLEAUT32.70] 2696 2697 */ 2697 2698 HRESULT WINAPI VarR4FromI4(LONG lIn, FLOAT* pfltOut) 2698 2699 { 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]2700 TRACE("( %lx, %p ), stub\n", lIn, pfltOut ); 2701 2702 *pfltOut = (FLOAT) lIn; 2703 2704 return S_OK; 2705 } 2706 2707 /****************************************************************************** 2708 * VarR4FromR8 [OLEAUT32.71] 2708 2709 */ 2709 2710 HRESULT WINAPI VarR4FromR8(double dblIn, FLOAT* pfltOut) 2710 2711 { 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]2712 TRACE("( %f, %p ), stub\n", dblIn, pfltOut ); 2713 2714 /* Check range of value. 2715 */ 2716 if( dblIn < -(FLT_MAX) || dblIn > FLT_MAX ) 2717 { 2718 return DISP_E_OVERFLOW; 2719 } 2720 2721 *pfltOut = (FLOAT) dblIn; 2722 2723 return S_OK; 2724 } 2725 2726 /****************************************************************************** 2727 * VarR4FromDate [OLEAUT32.73] 2727 2728 */ 2728 2729 HRESULT WINAPI VarR4FromDate(DATE dateIn, FLOAT* pfltOut) 2729 2730 { 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]2731 TRACE("( %f, %p ), stub\n", dateIn, pfltOut ); 2732 2733 /* Check range of value. 2734 */ 2735 if( dateIn < -(FLT_MAX) || dateIn > FLT_MAX ) 2736 { 2737 return DISP_E_OVERFLOW; 2738 } 2739 2740 *pfltOut = (FLOAT) dateIn; 2741 2742 return S_OK; 2743 } 2744 2745 /****************************************************************************** 2746 * VarR4FromBool [OLEAUT32.76] 2746 2747 */ 2747 2748 HRESULT WINAPI VarR4FromBool(VARIANT_BOOL boolIn, FLOAT* pfltOut) 2748 2749 { 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]2750 TRACE("( %d, %p ), stub\n", boolIn, pfltOut ); 2751 2752 *pfltOut = (FLOAT) boolIn; 2753 2754 return S_OK; 2755 } 2756 2757 /****************************************************************************** 2758 * VarR4FromI1 [OLEAUT32.213] 2758 2759 */ 2759 2760 HRESULT WINAPI VarR4FromI1(CHAR cIn, FLOAT* pfltOut) 2760 2761 { 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]2762 TRACE("( %c, %p ), stub\n", cIn, pfltOut ); 2763 2764 *pfltOut = (FLOAT) cIn; 2765 2766 return S_OK; 2767 } 2768 2769 /****************************************************************************** 2770 * VarR4FromUI2 [OLEAUT32.214] 2770 2771 */ 2771 2772 HRESULT WINAPI VarR4FromUI2(USHORT uiIn, FLOAT* pfltOut) 2772 2773 { 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]2774 TRACE("( %d, %p ), stub\n", uiIn, pfltOut ); 2775 2776 *pfltOut = (FLOAT) uiIn; 2777 2778 return S_OK; 2779 } 2780 2781 /****************************************************************************** 2782 * VarR4FromUI4 [OLEAUT32.215] 2782 2783 */ 2783 2784 HRESULT WINAPI VarR4FromUI4(ULONG ulIn, FLOAT* pfltOut) 2784 2785 { 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]2786 TRACE("( %ld, %p ), stub\n", ulIn, pfltOut ); 2787 2788 *pfltOut = (FLOAT) ulIn; 2789 2790 return S_OK; 2791 } 2792 2793 /****************************************************************************** 2794 * VarR4FromStr [OLEAUT32.74] 2794 2795 */ 2795 2796 HRESULT WINAPI VarR4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, FLOAT* pfltOut) 2796 2797 { 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 argument2803 */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;2798 double dValue = 0.0; 2799 LPSTR pNewString = NULL; 2800 2801 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pfltOut ); 2802 2803 /* Check if we have a valid argument 2804 */ 2805 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 2806 RemoveCharacterFromString( pNewString, "," ); 2807 if( IsValidRealString( pNewString ) == FALSE ) 2808 { 2809 return DISP_E_TYPEMISMATCH; 2810 } 2811 2812 /* Convert the valid string to a floating point number. 2813 */ 2814 dValue = atof( pNewString ); 2815 2816 /* We don't need the string anymore so free it. 2817 */ 2818 HeapFree( GetProcessHeap(), 0, pNewString ); 2819 2820 /* Check range of value. 2821 */ 2822 if( dValue < -(FLT_MAX) || dValue > FLT_MAX ) 2823 { 2824 return DISP_E_OVERFLOW; 2825 } 2826 2827 *pfltOut = (FLOAT) dValue; 2828 2829 return S_OK; 2829 2830 } 2830 2831 … … 2835 2836 HRESULT WINAPI VarR4FromCy(CY cyIn, FLOAT* pfltOut) { 2836 2837 *pfltOut = (FLOAT)((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 2837 2838 2838 2839 return S_OK; 2839 2840 } 2840 2841 2841 2842 /****************************************************************************** 2842 * VarR8FromUI1[OLEAUT32.78]2843 * VarR8FromUI1 [OLEAUT32.78] 2843 2844 */ 2844 2845 HRESULT WINAPI VarR8FromUI1(BYTE bIn, double* pdblOut) 2845 2846 { 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]2847 TRACE("( %d, %p ), stub\n", bIn, pdblOut ); 2848 2849 *pdblOut = (double) bIn; 2850 2851 return S_OK; 2852 } 2853 2854 /****************************************************************************** 2855 * VarR8FromI2 [OLEAUT32.79] 2855 2856 */ 2856 2857 HRESULT WINAPI VarR8FromI2(short sIn, double* pdblOut) 2857 2858 { 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]2859 TRACE("( %d, %p ), stub\n", sIn, pdblOut ); 2860 2861 *pdblOut = (double) sIn; 2862 2863 return S_OK; 2864 } 2865 2866 /****************************************************************************** 2867 * VarR8FromI4 [OLEAUT32.80] 2867 2868 */ 2868 2869 HRESULT WINAPI VarR8FromI4(LONG lIn, double* pdblOut) 2869 2870 { 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]2871 TRACE("( %ld, %p ), stub\n", lIn, pdblOut ); 2872 2873 *pdblOut = (double) lIn; 2874 2875 return S_OK; 2876 } 2877 2878 /****************************************************************************** 2879 * VarR8FromR4 [OLEAUT32.81] 2879 2880 */ 2880 2881 HRESULT WINAPI VarR8FromR4(FLOAT fltIn, double* pdblOut) 2881 2882 { 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]2883 TRACE("( %f, %p ), stub\n", fltIn, pdblOut ); 2884 2885 *pdblOut = (double) fltIn; 2886 2887 return S_OK; 2888 } 2889 2890 /****************************************************************************** 2891 * VarR8FromDate [OLEAUT32.83] 2891 2892 */ 2892 2893 HRESULT WINAPI VarR8FromDate(DATE dateIn, double* pdblOut) 2893 2894 { 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]2895 TRACE("( %f, %p ), stub\n", dateIn, pdblOut ); 2896 2897 *pdblOut = (double) dateIn; 2898 2899 return S_OK; 2900 } 2901 2902 /****************************************************************************** 2903 * VarR8FromBool [OLEAUT32.86] 2903 2904 */ 2904 2905 HRESULT WINAPI VarR8FromBool(VARIANT_BOOL boolIn, double* pdblOut) 2905 2906 { 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]2907 TRACE("( %d, %p ), stub\n", boolIn, pdblOut ); 2908 2909 *pdblOut = (double) boolIn; 2910 2911 return S_OK; 2912 } 2913 2914 /****************************************************************************** 2915 * VarR8FromI1 [OLEAUT32.217] 2915 2916 */ 2916 2917 HRESULT WINAPI VarR8FromI1(CHAR cIn, double* pdblOut) 2917 2918 { 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]2919 TRACE("( %c, %p ), stub\n", cIn, pdblOut ); 2920 2921 *pdblOut = (double) cIn; 2922 2923 return S_OK; 2924 } 2925 2926 /****************************************************************************** 2927 * VarR8FromUI2 [OLEAUT32.218] 2927 2928 */ 2928 2929 HRESULT WINAPI VarR8FromUI2(USHORT uiIn, double* pdblOut) 2929 2930 { 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]2931 TRACE("( %d, %p ), stub\n", uiIn, pdblOut ); 2932 2933 *pdblOut = (double) uiIn; 2934 2935 return S_OK; 2936 } 2937 2938 /****************************************************************************** 2939 * VarR8FromUI4 [OLEAUT32.219] 2939 2940 */ 2940 2941 HRESULT WINAPI VarR8FromUI4(ULONG ulIn, double* pdblOut) 2941 2942 { 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]2943 TRACE("( %ld, %p ), stub\n", ulIn, pdblOut ); 2944 2945 *pdblOut = (double) ulIn; 2946 2947 return S_OK; 2948 } 2949 2950 /****************************************************************************** 2951 * VarR8FromStr [OLEAUT32.84] 2951 2952 */ 2952 2953 HRESULT WINAPI VarR8FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, double* pdblOut) 2953 2954 { 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 argument2960 */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;2955 double dValue = 0.0; 2956 LPSTR pNewString = NULL; 2957 2958 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pdblOut ); 2959 2960 /* Check if we have a valid argument 2961 */ 2962 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 2963 RemoveCharacterFromString( pNewString, "," ); 2964 if( IsValidRealString( pNewString ) == FALSE ) 2965 { 2966 return DISP_E_TYPEMISMATCH; 2967 } 2968 2969 /* Convert the valid string to a floating point number. 2970 */ 2971 dValue = atof( pNewString ); 2972 2973 /* We don't need the string anymore so free it. 2974 */ 2975 HeapFree( GetProcessHeap(), 0, pNewString ); 2976 2977 *pdblOut = dValue; 2978 2979 return S_OK; 2979 2980 } 2980 2981 … … 2985 2986 HRESULT WINAPI VarR8FromCy(CY cyIn, double* pdblOut) { 2986 2987 *pdblOut = (double)((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 2987 2988 2988 2989 return S_OK; 2989 2990 } 2990 2991 2991 2992 /****************************************************************************** 2992 * VarDateFromUI1[OLEAUT32.88]2993 * VarDateFromUI1 [OLEAUT32.88] 2993 2994 */ 2994 2995 HRESULT WINAPI VarDateFromUI1(BYTE bIn, DATE* pdateOut) 2995 2996 { 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]2997 TRACE("( %d, %p ), stub\n", bIn, pdateOut ); 2998 2999 *pdateOut = (DATE) bIn; 3000 3001 return S_OK; 3002 } 3003 3004 /****************************************************************************** 3005 * VarDateFromI2 [OLEAUT32.89] 3005 3006 */ 3006 3007 HRESULT WINAPI VarDateFromI2(short sIn, DATE* pdateOut) 3007 3008 { 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]3009 TRACE("( %d, %p ), stub\n", sIn, pdateOut ); 3010 3011 *pdateOut = (DATE) sIn; 3012 3013 return S_OK; 3014 } 3015 3016 /****************************************************************************** 3017 * VarDateFromI4 [OLEAUT32.90] 3017 3018 */ 3018 3019 HRESULT WINAPI VarDateFromI4(LONG lIn, DATE* pdateOut) 3019 3020 { 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]3021 TRACE("( %ld, %p ), stub\n", lIn, pdateOut ); 3022 3023 if( lIn < DATE_MIN || lIn > DATE_MAX ) 3024 { 3025 return DISP_E_OVERFLOW; 3026 } 3027 3028 *pdateOut = (DATE) lIn; 3029 3030 return S_OK; 3031 } 3032 3033 /****************************************************************************** 3034 * VarDateFromR4 [OLEAUT32.91] 3034 3035 */ 3035 3036 HRESULT WINAPI VarDateFromR4(FLOAT fltIn, DATE* pdateOut) … … 3038 3039 3039 3040 if( ceil(fltIn) < DATE_MIN || floor(fltIn) > DATE_MAX ) 3040 {3041 return DISP_E_OVERFLOW;3042 }3043 3044 *pdateOut = (DATE) fltIn;3045 3046 return S_OK;3047 } 3048 3049 /****************************************************************************** 3050 * VarDateFromR8[OLEAUT32.92]3041 { 3042 return DISP_E_OVERFLOW; 3043 } 3044 3045 *pdateOut = (DATE) fltIn; 3046 3047 return S_OK; 3048 } 3049 3050 /****************************************************************************** 3051 * VarDateFromR8 [OLEAUT32.92] 3051 3052 */ 3052 3053 HRESULT WINAPI VarDateFromR8(double dblIn, DATE* pdateOut) … … 3054 3055 TRACE("( %f, %p ), stub\n", dblIn, pdateOut ); 3055 3056 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]3057 if( ceil(dblIn) < DATE_MIN || floor(dblIn) > DATE_MAX ) 3058 { 3059 return DISP_E_OVERFLOW; 3060 } 3061 3062 *pdateOut = (DATE) dblIn; 3063 3064 return S_OK; 3065 } 3066 3067 /****************************************************************************** 3068 * VarDateFromStr [OLEAUT32.94] 3068 3069 * The string representing the date is composed of two parts, a date and time. 3069 3070 * … … 3074 3075 * 3075 3076 * The formats for the date part are has follows: 3076 * mm/[dd/][yy]yy 3077 * mm/[dd/][yy]yy 3077 3078 * [dd/]mm/[yy]yy 3078 * [yy]yy/mm/dd 3079 * [yy]yy/mm/dd 3079 3080 * January dd[,] [yy]yy 3080 3081 * dd January [yy]yy … … 3083 3084 * 3084 3085 * The formats for the date and time string are has follows. 3085 * date[whitespace][time] 3086 * date[whitespace][time] 3086 3087 * [time][whitespace]date 3087 3088 * … … 3111 3112 3112 3113 3113 return ret;3114 } 3115 3116 /****************************************************************************** 3117 * VarDateFromI1[OLEAUT32.221]3114 return ret; 3115 } 3116 3117 /****************************************************************************** 3118 * VarDateFromI1 [OLEAUT32.221] 3118 3119 */ 3119 3120 HRESULT WINAPI VarDateFromI1(CHAR cIn, DATE* pdateOut) 3120 3121 { 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]3122 TRACE("( %c, %p ), stub\n", cIn, pdateOut ); 3123 3124 *pdateOut = (DATE) cIn; 3125 3126 return S_OK; 3127 } 3128 3129 /****************************************************************************** 3130 * VarDateFromUI2 [OLEAUT32.222] 3130 3131 */ 3131 3132 HRESULT WINAPI VarDateFromUI2(USHORT uiIn, DATE* pdateOut) 3132 3133 { 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]3134 TRACE("( %d, %p ), stub\n", uiIn, pdateOut ); 3135 3136 if( uiIn > DATE_MAX ) 3137 { 3138 return DISP_E_OVERFLOW; 3139 } 3140 3141 *pdateOut = (DATE) uiIn; 3142 3143 return S_OK; 3144 } 3145 3146 /****************************************************************************** 3147 * VarDateFromUI4 [OLEAUT32.223] 3147 3148 */ 3148 3149 HRESULT WINAPI VarDateFromUI4(ULONG ulIn, DATE* pdateOut) 3149 3150 { 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]3151 TRACE("( %ld, %p ), stub\n", ulIn, pdateOut ); 3152 3153 if( ulIn < DATE_MIN || ulIn > DATE_MAX ) 3154 { 3155 return DISP_E_OVERFLOW; 3156 } 3157 3158 *pdateOut = (DATE) ulIn; 3159 3160 return S_OK; 3161 } 3162 3163 /****************************************************************************** 3164 * VarDateFromBool [OLEAUT32.96] 3164 3165 */ 3165 3166 HRESULT WINAPI VarDateFromBool(VARIANT_BOOL boolIn, DATE* pdateOut) 3166 3167 { 3167 TRACE("( %d, %p ), stub\n", boolIn, pdateOut );3168 3169 *pdateOut = (DATE) boolIn;3170 3171 return S_OK;3168 TRACE("( %d, %p ), stub\n", boolIn, pdateOut ); 3169 3170 *pdateOut = (DATE) boolIn; 3171 3172 return S_OK; 3172 3173 } 3173 3174 … … 3184 3185 3185 3186 /****************************************************************************** 3186 * VarBstrFromUI1[OLEAUT32.108]3187 * VarBstrFromUI1 [OLEAUT32.108] 3187 3188 */ 3188 3189 HRESULT WINAPI VarBstrFromUI1(BYTE bVal, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3189 3190 { 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]3191 TRACE("( %d, %ld, %ld, %p ), stub\n", bVal, lcid, dwFlags, pbstrOut ); 3192 sprintf( pBuffer, "%d", bVal ); 3193 3194 *pbstrOut = StringDupAtoBstr( pBuffer ); 3195 3196 return S_OK; 3197 } 3198 3199 /****************************************************************************** 3200 * VarBstrFromI2 [OLEAUT32.109] 3200 3201 */ 3201 3202 HRESULT WINAPI VarBstrFromI2(short iVal, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3202 3203 { 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]3204 TRACE("( %d, %ld, %ld, %p ), stub\n", iVal, lcid, dwFlags, pbstrOut ); 3205 sprintf( pBuffer, "%d", iVal ); 3206 *pbstrOut = StringDupAtoBstr( pBuffer ); 3207 3208 return S_OK; 3209 } 3210 3211 /****************************************************************************** 3212 * VarBstrFromI4 [OLEAUT32.110] 3212 3213 */ 3213 3214 HRESULT WINAPI VarBstrFromI4(LONG lIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3214 3215 { 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]3216 TRACE("( %ld, %ld, %ld, %p ), stub\n", lIn, lcid, dwFlags, pbstrOut ); 3217 3218 sprintf( pBuffer, "%ld", lIn ); 3219 *pbstrOut = StringDupAtoBstr( pBuffer ); 3220 3221 return S_OK; 3222 } 3223 3224 /****************************************************************************** 3225 * VarBstrFromR4 [OLEAUT32.111] 3225 3226 */ 3226 3227 HRESULT WINAPI VarBstrFromR4(FLOAT fltIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3227 3228 { 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]3229 TRACE("( %f, %ld, %ld, %p ), stub\n", fltIn, lcid, dwFlags, pbstrOut ); 3230 3231 sprintf( pBuffer, "%.7g", fltIn ); 3232 *pbstrOut = StringDupAtoBstr( pBuffer ); 3233 3234 return S_OK; 3235 } 3236 3237 /****************************************************************************** 3238 * VarBstrFromR8 [OLEAUT32.112] 3238 3239 */ 3239 3240 HRESULT WINAPI VarBstrFromR8(double dblIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3240 3241 { 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;3242 TRACE("( %f, %ld, %ld, %p ), stub\n", dblIn, lcid, dwFlags, pbstrOut ); 3243 3244 sprintf( pBuffer, "%.15g", dblIn ); 3245 *pbstrOut = StringDupAtoBstr( pBuffer ); 3246 3247 return S_OK; 3247 3248 } 3248 3249 … … 3251 3252 */ 3252 3253 HRESULT WINAPI VarBstrFromCy(CY cyIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut) { 3253 /* FIXME */3254 return E_NOTIMPL;3255 } 3256 3257 3258 /****************************************************************************** 3259 * VarBstrFromDate[OLEAUT32.114]3254 /* FIXME */ 3255 return E_NOTIMPL; 3256 } 3257 3258 3259 /****************************************************************************** 3260 * VarBstrFromDate [OLEAUT32.114] 3260 3261 * 3261 3262 * The date is implemented using an 8 byte floating-point number. … … 3274 3275 * The tm structure is as follows: 3275 3276 * 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 * int tm_isdst; daylight savings time flag3285 * };3277 * int tm_sec; seconds after the minute - [0,59] 3278 * int tm_min; minutes after the hour - [0,59] 3279 * int tm_hour; hours since midnight - [0,23] 3280 * int tm_mday; day of the month - [1,31] 3281 * int tm_mon; months since January - [0,11] 3282 * int tm_year; years 3283 * int tm_wday; days since Sunday - [0,6] 3284 * int tm_yday; days since January 1 - [0,365] 3285 * int tm_isdst; daylight savings time flag 3286 * }; 3286 3287 */ 3287 3288 HRESULT WINAPI VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) … … 3293 3294 3294 3295 if( DateToTm( dateIn, dwFlags, &TM ) == FALSE ) 3295 {3296 { 3296 3297 return E_INVALIDARG; 3297 }3298 } 3298 3299 3299 3300 if( dwFlags & VAR_DATEVALUEONLY ) 3300 strftime( pBuffer, BUFFER_MAX, "%x", &TM );3301 strftime( pBuffer, BUFFER_MAX, "%x", &TM ); 3301 3302 else if( dwFlags & VAR_TIMEVALUEONLY ) 3302 strftime( pBuffer, BUFFER_MAX, "%X", &TM );3303 else3303 strftime( pBuffer, BUFFER_MAX, "%X", &TM ); 3304 else 3304 3305 strftime( pBuffer, BUFFER_MAX, "%x %X", &TM ); 3305 3306 3306 *pbstrOut = StringDupAtoBstr( pBuffer );3307 3308 return S_OK;3309 } 3310 3311 /****************************************************************************** 3312 * VarBstrFromBool[OLEAUT32.116]3307 *pbstrOut = StringDupAtoBstr( pBuffer ); 3308 3309 return S_OK; 3310 } 3311 3312 /****************************************************************************** 3313 * VarBstrFromBool [OLEAUT32.116] 3313 3314 */ 3314 3315 HRESULT WINAPI VarBstrFromBool(VARIANT_BOOL boolIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3315 3316 { 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 else3323 {3324 sprintf( pBuffer, "True" );3325 }3326 3327 *pbstrOut = StringDupAtoBstr( pBuffer );3328 3329 return S_OK;3330 } 3331 3332 /****************************************************************************** 3333 * VarBstrFromI1[OLEAUT32.229]3317 TRACE("( %d, %ld, %ld, %p ), stub\n", boolIn, lcid, dwFlags, pbstrOut ); 3318 3319 if( boolIn == VARIANT_FALSE ) 3320 { 3321 sprintf( pBuffer, "False" ); 3322 } 3323 else 3324 { 3325 sprintf( pBuffer, "True" ); 3326 } 3327 3328 *pbstrOut = StringDupAtoBstr( pBuffer ); 3329 3330 return S_OK; 3331 } 3332 3333 /****************************************************************************** 3334 * VarBstrFromI1 [OLEAUT32.229] 3334 3335 */ 3335 3336 HRESULT WINAPI VarBstrFromI1(CHAR cIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3336 3337 { 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]3338 TRACE("( %c, %ld, %ld, %p ), stub\n", cIn, lcid, dwFlags, pbstrOut ); 3339 sprintf( pBuffer, "%d", cIn ); 3340 *pbstrOut = StringDupAtoBstr( pBuffer ); 3341 3342 return S_OK; 3343 } 3344 3345 /****************************************************************************** 3346 * VarBstrFromUI2 [OLEAUT32.230] 3346 3347 */ 3347 3348 HRESULT WINAPI VarBstrFromUI2(USHORT uiIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3348 3349 { 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]3350 TRACE("( %d, %ld, %ld, %p ), stub\n", uiIn, lcid, dwFlags, pbstrOut ); 3351 sprintf( pBuffer, "%d", uiIn ); 3352 *pbstrOut = StringDupAtoBstr( pBuffer ); 3353 3354 return S_OK; 3355 } 3356 3357 /****************************************************************************** 3358 * VarBstrFromUI4 [OLEAUT32.231] 3358 3359 */ 3359 3360 HRESULT WINAPI VarBstrFromUI4(ULONG ulIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut) 3360 3361 { 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]3362 TRACE("( %ld, %ld, %ld, %p ), stub\n", ulIn, lcid, dwFlags, pbstrOut ); 3363 sprintf( pBuffer, "%ld", ulIn ); 3364 *pbstrOut = StringDupAtoBstr( pBuffer ); 3365 3366 return S_OK; 3367 } 3368 3369 /****************************************************************************** 3370 * VarBoolFromUI1 [OLEAUT32.118] 3370 3371 */ 3371 3372 HRESULT WINAPI VarBoolFromUI1(BYTE bIn, VARIANT_BOOL* pboolOut) 3372 3373 { 3373 TRACE("( %d, %p ), stub\n", bIn, pboolOut );3374 3375 if( bIn == 0 )3376 {3377 *pboolOut = VARIANT_FALSE;3378 }3379 else3380 {3381 *pboolOut = VARIANT_TRUE;3382 }3383 3384 return S_OK;3385 } 3386 3387 /****************************************************************************** 3388 * VarBoolFromI2[OLEAUT32.119]3374 TRACE("( %d, %p ), stub\n", bIn, pboolOut ); 3375 3376 if( bIn == 0 ) 3377 { 3378 *pboolOut = VARIANT_FALSE; 3379 } 3380 else 3381 { 3382 *pboolOut = VARIANT_TRUE; 3383 } 3384 3385 return S_OK; 3386 } 3387 3388 /****************************************************************************** 3389 * VarBoolFromI2 [OLEAUT32.119] 3389 3390 */ 3390 3391 HRESULT WINAPI VarBoolFromI2(short sIn, VARIANT_BOOL* pboolOut) 3391 3392 { 3392 TRACE("( %d, %p ), stub\n", sIn, pboolOut );3393 3394 if( sIn == 0 )3395 {3396 *pboolOut = VARIANT_FALSE;3397 }3398 else3399 {3400 *pboolOut = VARIANT_TRUE;3401 }3402 3403 return S_OK;3404 } 3405 3406 /****************************************************************************** 3407 * VarBoolFromI4[OLEAUT32.120]3393 TRACE("( %d, %p ), stub\n", sIn, pboolOut ); 3394 3395 if( sIn == 0 ) 3396 { 3397 *pboolOut = VARIANT_FALSE; 3398 } 3399 else 3400 { 3401 *pboolOut = VARIANT_TRUE; 3402 } 3403 3404 return S_OK; 3405 } 3406 3407 /****************************************************************************** 3408 * VarBoolFromI4 [OLEAUT32.120] 3408 3409 */ 3409 3410 HRESULT WINAPI VarBoolFromI4(LONG lIn, VARIANT_BOOL* pboolOut) 3410 3411 { 3411 TRACE("( %ld, %p ), stub\n", lIn, pboolOut );3412 3413 if( lIn == 0 )3414 {3415 *pboolOut = VARIANT_FALSE;3416 }3417 else3418 {3419 *pboolOut = VARIANT_TRUE;3420 }3421 3422 return S_OK;3423 } 3424 3425 /****************************************************************************** 3426 * VarBoolFromR4[OLEAUT32.121]3412 TRACE("( %ld, %p ), stub\n", lIn, pboolOut ); 3413 3414 if( lIn == 0 ) 3415 { 3416 *pboolOut = VARIANT_FALSE; 3417 } 3418 else 3419 { 3420 *pboolOut = VARIANT_TRUE; 3421 } 3422 3423 return S_OK; 3424 } 3425 3426 /****************************************************************************** 3427 * VarBoolFromR4 [OLEAUT32.121] 3427 3428 */ 3428 3429 HRESULT WINAPI VarBoolFromR4(FLOAT fltIn, VARIANT_BOOL* pboolOut) 3429 3430 { 3430 TRACE("( %f, %p ), stub\n", fltIn, pboolOut );3431 3432 if( fltIn == 0.0 )3433 {3434 *pboolOut = VARIANT_FALSE;3435 }3436 else3437 {3438 *pboolOut = VARIANT_TRUE;3439 }3440 3441 return S_OK;3442 } 3443 3444 /****************************************************************************** 3445 * VarBoolFromR8[OLEAUT32.122]3431 TRACE("( %f, %p ), stub\n", fltIn, pboolOut ); 3432 3433 if( fltIn == 0.0 ) 3434 { 3435 *pboolOut = VARIANT_FALSE; 3436 } 3437 else 3438 { 3439 *pboolOut = VARIANT_TRUE; 3440 } 3441 3442 return S_OK; 3443 } 3444 3445 /****************************************************************************** 3446 * VarBoolFromR8 [OLEAUT32.122] 3446 3447 */ 3447 3448 HRESULT WINAPI VarBoolFromR8(double dblIn, VARIANT_BOOL* pboolOut) 3448 3449 { 3449 TRACE("( %f, %p ), stub\n", dblIn, pboolOut );3450 3451 if( dblIn == 0.0 )3452 {3453 *pboolOut = VARIANT_FALSE;3454 }3455 else3456 {3457 *pboolOut = VARIANT_TRUE;3458 }3459 3460 return S_OK;3461 } 3462 3463 /****************************************************************************** 3464 * VarBoolFromDate[OLEAUT32.123]3450 TRACE("( %f, %p ), stub\n", dblIn, pboolOut ); 3451 3452 if( dblIn == 0.0 ) 3453 { 3454 *pboolOut = VARIANT_FALSE; 3455 } 3456 else 3457 { 3458 *pboolOut = VARIANT_TRUE; 3459 } 3460 3461 return S_OK; 3462 } 3463 3464 /****************************************************************************** 3465 * VarBoolFromDate [OLEAUT32.123] 3465 3466 */ 3466 3467 HRESULT WINAPI VarBoolFromDate(DATE dateIn, VARIANT_BOOL* pboolOut) 3467 3468 { 3468 TRACE("( %f, %p ), stub\n", dateIn, pboolOut );3469 3470 if( dateIn == 0.0 )3471 {3472 *pboolOut = VARIANT_FALSE;3473 }3474 else3475 {3476 *pboolOut = VARIANT_TRUE;3477 }3478 3479 return S_OK;3480 } 3481 3482 /****************************************************************************** 3483 * VarBoolFromStr[OLEAUT32.125]3469 TRACE("( %f, %p ), stub\n", dateIn, pboolOut ); 3470 3471 if( dateIn == 0.0 ) 3472 { 3473 *pboolOut = VARIANT_FALSE; 3474 } 3475 else 3476 { 3477 *pboolOut = VARIANT_TRUE; 3478 } 3479 3480 return S_OK; 3481 } 3482 3483 /****************************************************************************** 3484 * VarBoolFromStr [OLEAUT32.125] 3484 3485 */ 3485 3486 HRESULT WINAPI VarBoolFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, VARIANT_BOOL* pboolOut) 3486 3487 { 3487 HRESULT ret = S_OK;3488 char* pNewString = NULL;3489 3490 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pboolOut );3488 HRESULT ret = S_OK; 3489 char* pNewString = NULL; 3490 3491 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pboolOut ); 3491 3492 3492 3493 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 3493 3494 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 else3510 {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 else3524 {3525 *pboolOut = VARIANT_TRUE;3526 }3527 }3528 }3529 3530 HeapFree( GetProcessHeap(), 0, pNewString );3531 3532 return ret;3533 } 3534 3535 /****************************************************************************** 3536 * VarBoolFromI1[OLEAUT32.233]3495 if( pNewString == NULL || strlen( pNewString ) == 0 ) 3496 { 3497 ret = DISP_E_TYPEMISMATCH; 3498 } 3499 3500 if( ret == S_OK ) 3501 { 3502 if( strncasecmp( pNewString, "True", strlen( pNewString ) ) == 0 ) 3503 { 3504 *pboolOut = VARIANT_TRUE; 3505 } 3506 else if( strncasecmp( pNewString, "False", strlen( pNewString ) ) == 0 ) 3507 { 3508 *pboolOut = VARIANT_FALSE; 3509 } 3510 else 3511 { 3512 /* Try converting the string to a floating point number. 3513 */ 3514 double dValue = 0.0; 3515 HRESULT res = VarR8FromStr( strIn, lcid, dwFlags, &dValue ); 3516 if( res != S_OK ) 3517 { 3518 ret = DISP_E_TYPEMISMATCH; 3519 } 3520 else if( dValue == 0.0 ) 3521 { 3522 *pboolOut = VARIANT_FALSE; 3523 } 3524 else 3525 { 3526 *pboolOut = VARIANT_TRUE; 3527 } 3528 } 3529 } 3530 3531 HeapFree( GetProcessHeap(), 0, pNewString ); 3532 3533 return ret; 3534 } 3535 3536 /****************************************************************************** 3537 * VarBoolFromI1 [OLEAUT32.233] 3537 3538 */ 3538 3539 HRESULT WINAPI VarBoolFromI1(CHAR cIn, VARIANT_BOOL* pboolOut) 3539 3540 { 3540 TRACE("( %c, %p ), stub\n", cIn, pboolOut );3541 3542 if( cIn == 0 )3543 {3544 *pboolOut = VARIANT_FALSE;3545 }3546 else3547 {3548 *pboolOut = VARIANT_TRUE;3549 }3550 3551 return S_OK;3552 } 3553 3554 /****************************************************************************** 3555 * VarBoolFromUI2[OLEAUT32.234]3541 TRACE("( %c, %p ), stub\n", cIn, pboolOut ); 3542 3543 if( cIn == 0 ) 3544 { 3545 *pboolOut = VARIANT_FALSE; 3546 } 3547 else 3548 { 3549 *pboolOut = VARIANT_TRUE; 3550 } 3551 3552 return S_OK; 3553 } 3554 3555 /****************************************************************************** 3556 * VarBoolFromUI2 [OLEAUT32.234] 3556 3557 */ 3557 3558 HRESULT WINAPI VarBoolFromUI2(USHORT uiIn, VARIANT_BOOL* pboolOut) 3558 3559 { 3559 TRACE("( %d, %p ), stub\n", uiIn, pboolOut );3560 3561 if( uiIn == 0 )3562 {3563 *pboolOut = VARIANT_FALSE;3564 }3565 else3566 {3567 *pboolOut = VARIANT_TRUE;3568 }3569 3570 return S_OK;3571 } 3572 3573 /****************************************************************************** 3574 * VarBoolFromUI4[OLEAUT32.235]3560 TRACE("( %d, %p ), stub\n", uiIn, pboolOut ); 3561 3562 if( uiIn == 0 ) 3563 { 3564 *pboolOut = VARIANT_FALSE; 3565 } 3566 else 3567 { 3568 *pboolOut = VARIANT_TRUE; 3569 } 3570 3571 return S_OK; 3572 } 3573 3574 /****************************************************************************** 3575 * VarBoolFromUI4 [OLEAUT32.235] 3575 3576 */ 3576 3577 HRESULT WINAPI VarBoolFromUI4(ULONG ulIn, VARIANT_BOOL* pboolOut) 3577 3578 { 3578 TRACE("( %ld, %p ), stub\n", ulIn, pboolOut );3579 3580 if( ulIn == 0 )3581 {3582 *pboolOut = VARIANT_FALSE;3583 }3584 else3585 {3586 *pboolOut = VARIANT_TRUE;3587 }3588 3589 return S_OK;3579 TRACE("( %ld, %p ), stub\n", ulIn, pboolOut ); 3580 3581 if( ulIn == 0 ) 3582 { 3583 *pboolOut = VARIANT_FALSE; 3584 } 3585 else 3586 { 3587 *pboolOut = VARIANT_TRUE; 3588 } 3589 3590 return S_OK; 3590 3591 } 3591 3592 … … 3597 3598 if (cyIn.s.Hi || cyIn.s.Lo) *pboolOut = -1; 3598 3599 else *pboolOut = 0; 3599 3600 3600 3601 return S_OK; 3601 3602 } 3602 3603 3603 3604 /****************************************************************************** 3604 * VarI1FromUI1[OLEAUT32.244]3605 * VarI1FromUI1 [OLEAUT32.244] 3605 3606 */ 3606 3607 HRESULT WINAPI VarI1FromUI1(BYTE bIn, CHAR* pcOut) 3607 3608 { 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]3609 TRACE("( %d, %p ), stub\n", bIn, pcOut ); 3610 3611 /* Check range of value. 3612 */ 3613 if( bIn > CHAR_MAX ) 3614 { 3615 return DISP_E_OVERFLOW; 3616 } 3617 3618 *pcOut = (CHAR) bIn; 3619 3620 return S_OK; 3621 } 3622 3623 /****************************************************************************** 3624 * VarI1FromI2 [OLEAUT32.245] 3624 3625 */ 3625 3626 HRESULT WINAPI VarI1FromI2(short uiIn, CHAR* pcOut) 3626 3627 { 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]3628 TRACE("( %d, %p ), stub\n", uiIn, pcOut ); 3629 3630 if( uiIn > CHAR_MAX ) 3631 { 3632 return DISP_E_OVERFLOW; 3633 } 3634 3635 *pcOut = (CHAR) uiIn; 3636 3637 return S_OK; 3638 } 3639 3640 /****************************************************************************** 3641 * VarI1FromI4 [OLEAUT32.246] 3641 3642 */ 3642 3643 HRESULT WINAPI VarI1FromI4(LONG lIn, CHAR* pcOut) 3643 3644 { 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]3645 TRACE("( %ld, %p ), stub\n", lIn, pcOut ); 3646 3647 if( lIn < CHAR_MIN || lIn > CHAR_MAX ) 3648 { 3649 return DISP_E_OVERFLOW; 3650 } 3651 3652 *pcOut = (CHAR) lIn; 3653 3654 return S_OK; 3655 } 3656 3657 /****************************************************************************** 3658 * VarI1FromR4 [OLEAUT32.247] 3658 3659 */ 3659 3660 HRESULT WINAPI VarI1FromR4(FLOAT fltIn, CHAR* pcOut) 3660 3661 { 3661 TRACE("( %f, %p ), stub\n", fltIn, pcOut );3662 TRACE("( %f, %p ), stub\n", fltIn, pcOut ); 3662 3663 3663 3664 fltIn = round( fltIn ); 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]3665 if( fltIn < CHAR_MIN || fltIn > CHAR_MAX ) 3666 { 3667 return DISP_E_OVERFLOW; 3668 } 3669 3670 *pcOut = (CHAR) fltIn; 3671 3672 return S_OK; 3673 } 3674 3675 /****************************************************************************** 3676 * VarI1FromR8 [OLEAUT32.248] 3676 3677 */ 3677 3678 HRESULT WINAPI VarI1FromR8(double dblIn, CHAR* pcOut) 3678 3679 { 3679 TRACE("( %f, %p ), stub\n", dblIn, pcOut );3680 TRACE("( %f, %p ), stub\n", dblIn, pcOut ); 3680 3681 3681 3682 dblIn = round( dblIn ); 3682 3683 if( dblIn < CHAR_MIN || dblIn > CHAR_MAX ) 3683 {3684 return DISP_E_OVERFLOW;3685 }3686 3687 *pcOut = (CHAR) dblIn;3688 3689 return S_OK;3690 } 3691 3692 /****************************************************************************** 3693 * VarI1FromDate[OLEAUT32.249]3684 { 3685 return DISP_E_OVERFLOW; 3686 } 3687 3688 *pcOut = (CHAR) dblIn; 3689 3690 return S_OK; 3691 } 3692 3693 /****************************************************************************** 3694 * VarI1FromDate [OLEAUT32.249] 3694 3695 */ 3695 3696 HRESULT WINAPI VarI1FromDate(DATE dateIn, CHAR* pcOut) 3696 3697 { 3697 TRACE("( %f, %p ), stub\n", dateIn, pcOut );3698 TRACE("( %f, %p ), stub\n", dateIn, pcOut ); 3698 3699 3699 3700 dateIn = round( dateIn ); 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]3701 if( dateIn < CHAR_MIN || dateIn > CHAR_MAX ) 3702 { 3703 return DISP_E_OVERFLOW; 3704 } 3705 3706 *pcOut = (CHAR) dateIn; 3707 3708 return S_OK; 3709 } 3710 3711 /****************************************************************************** 3712 * VarI1FromStr [OLEAUT32.251] 3712 3713 */ 3713 3714 HRESULT WINAPI VarI1FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, CHAR* pcOut) 3714 3715 { 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 argument3721 */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.3716 double dValue = 0.0; 3717 LPSTR pNewString = NULL; 3718 3719 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pcOut ); 3720 3721 /* Check if we have a valid argument 3722 */ 3723 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 3724 RemoveCharacterFromString( pNewString, "," ); 3725 if( IsValidRealString( pNewString ) == FALSE ) 3726 { 3727 return DISP_E_TYPEMISMATCH; 3728 } 3729 3730 /* Convert the valid string to a floating point number. 3731 */ 3732 dValue = atof( pNewString ); 3733 3734 /* We don't need the string anymore so free it. 3735 */ 3736 HeapFree( GetProcessHeap(), 0, pNewString ); 3737 3738 /* Check range of value. 3738 3739 */ 3739 3740 dValue = round( dValue ); 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]3741 if( dValue < CHAR_MIN || dValue > CHAR_MAX ) 3742 { 3743 return DISP_E_OVERFLOW; 3744 } 3745 3746 *pcOut = (CHAR) dValue; 3747 3748 return S_OK; 3749 } 3750 3751 /****************************************************************************** 3752 * VarI1FromBool [OLEAUT32.253] 3752 3753 */ 3753 3754 HRESULT WINAPI VarI1FromBool(VARIANT_BOOL boolIn, CHAR* pcOut) 3754 3755 { 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]3756 TRACE("( %d, %p ), stub\n", boolIn, pcOut ); 3757 3758 *pcOut = (CHAR) boolIn; 3759 3760 return S_OK; 3761 } 3762 3763 /****************************************************************************** 3764 * VarI1FromUI2 [OLEAUT32.254] 3764 3765 */ 3765 3766 HRESULT WINAPI VarI1FromUI2(USHORT uiIn, CHAR* pcOut) 3766 3767 { 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]3768 TRACE("( %d, %p ), stub\n", uiIn, pcOut ); 3769 3770 if( uiIn > CHAR_MAX ) 3771 { 3772 return DISP_E_OVERFLOW; 3773 } 3774 3775 *pcOut = (CHAR) uiIn; 3776 3777 return S_OK; 3778 } 3779 3780 /****************************************************************************** 3781 * VarI1FromUI4 [OLEAUT32.255] 3781 3782 */ 3782 3783 HRESULT WINAPI VarI1FromUI4(ULONG ulIn, CHAR* pcOut) 3783 3784 { 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;3785 TRACE("( %ld, %p ), stub\n", ulIn, pcOut ); 3786 3787 if( ulIn > CHAR_MAX ) 3788 { 3789 return DISP_E_OVERFLOW; 3790 } 3791 3792 *pcOut = (CHAR) ulIn; 3793 3794 return S_OK; 3794 3795 } 3795 3796 … … 3800 3801 HRESULT WINAPI VarI1FromCy(CY cyIn, CHAR* pcOut) { 3801 3802 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 3802 3803 3803 3804 if (t > CHAR_MAX || t < CHAR_MIN) return DISP_E_OVERFLOW; 3804 3805 3805 3806 *pcOut = (CHAR)t; 3806 3807 return S_OK; … … 3808 3809 3809 3810 /****************************************************************************** 3810 * VarUI2FromUI1[OLEAUT32.257]3811 * VarUI2FromUI1 [OLEAUT32.257] 3811 3812 */ 3812 3813 HRESULT WINAPI VarUI2FromUI1(BYTE bIn, USHORT* puiOut) 3813 3814 { 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]3815 TRACE("( %d, %p ), stub\n", bIn, puiOut ); 3816 3817 *puiOut = (USHORT) bIn; 3818 3819 return S_OK; 3820 } 3821 3822 /****************************************************************************** 3823 * VarUI2FromI2 [OLEAUT32.258] 3823 3824 */ 3824 3825 HRESULT WINAPI VarUI2FromI2(short uiIn, USHORT* puiOut) 3825 3826 { 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]3827 TRACE("( %d, %p ), stub\n", uiIn, puiOut ); 3828 3829 if( uiIn < UI2_MIN ) 3830 { 3831 return DISP_E_OVERFLOW; 3832 } 3833 3834 *puiOut = (USHORT) uiIn; 3835 3836 return S_OK; 3837 } 3838 3839 /****************************************************************************** 3840 * VarUI2FromI4 [OLEAUT32.259] 3840 3841 */ 3841 3842 HRESULT WINAPI VarUI2FromI4(LONG lIn, USHORT* puiOut) 3842 3843 { 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]3844 TRACE("( %ld, %p ), stub\n", lIn, puiOut ); 3845 3846 if( lIn < UI2_MIN || lIn > UI2_MAX ) 3847 { 3848 return DISP_E_OVERFLOW; 3849 } 3850 3851 *puiOut = (USHORT) lIn; 3852 3853 return S_OK; 3854 } 3855 3856 /****************************************************************************** 3857 * VarUI2FromR4 [OLEAUT32.260] 3857 3858 */ 3858 3859 HRESULT WINAPI VarUI2FromR4(FLOAT fltIn, USHORT* puiOut) 3859 3860 { 3860 TRACE("( %f, %p ), stub\n", fltIn, puiOut );3861 TRACE("( %f, %p ), stub\n", fltIn, puiOut ); 3861 3862 3862 3863 fltIn = round( fltIn ); 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]3864 if( fltIn < UI2_MIN || fltIn > UI2_MAX ) 3865 { 3866 return DISP_E_OVERFLOW; 3867 } 3868 3869 *puiOut = (USHORT) fltIn; 3870 3871 return S_OK; 3872 } 3873 3874 /****************************************************************************** 3875 * VarUI2FromR8 [OLEAUT32.261] 3875 3876 */ 3876 3877 HRESULT WINAPI VarUI2FromR8(double dblIn, USHORT* puiOut) 3877 3878 { 3878 TRACE("( %f, %p ), stub\n", dblIn, puiOut );3879 TRACE("( %f, %p ), stub\n", dblIn, puiOut ); 3879 3880 3880 3881 dblIn = round( dblIn ); 3881 3882 if( dblIn < UI2_MIN || dblIn > UI2_MAX ) 3882 {3883 return DISP_E_OVERFLOW;3884 }3885 3886 *puiOut = (USHORT) dblIn;3887 3888 return S_OK;3889 } 3890 3891 /****************************************************************************** 3892 * VarUI2FromDate[OLEAUT32.262]3883 { 3884 return DISP_E_OVERFLOW; 3885 } 3886 3887 *puiOut = (USHORT) dblIn; 3888 3889 return S_OK; 3890 } 3891 3892 /****************************************************************************** 3893 * VarUI2FromDate [OLEAUT32.262] 3893 3894 */ 3894 3895 HRESULT WINAPI VarUI2FromDate(DATE dateIn, USHORT* puiOut) 3895 3896 { 3896 TRACE("( %f, %p ), stub\n", dateIn, puiOut );3897 TRACE("( %f, %p ), stub\n", dateIn, puiOut ); 3897 3898 3898 3899 dateIn = round( dateIn ); 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]3900 if( dateIn < UI2_MIN || dateIn > UI2_MAX ) 3901 { 3902 return DISP_E_OVERFLOW; 3903 } 3904 3905 *puiOut = (USHORT) dateIn; 3906 3907 return S_OK; 3908 } 3909 3910 /****************************************************************************** 3911 * VarUI2FromStr [OLEAUT32.264] 3911 3912 */ 3912 3913 HRESULT WINAPI VarUI2FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, USHORT* puiOut) 3913 3914 { 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 argument3920 */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.3915 double dValue = 0.0; 3916 LPSTR pNewString = NULL; 3917 3918 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, puiOut ); 3919 3920 /* Check if we have a valid argument 3921 */ 3922 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 3923 RemoveCharacterFromString( pNewString, "," ); 3924 if( IsValidRealString( pNewString ) == FALSE ) 3925 { 3926 return DISP_E_TYPEMISMATCH; 3927 } 3928 3929 /* Convert the valid string to a floating point number. 3930 */ 3931 dValue = atof( pNewString ); 3932 3933 /* We don't need the string anymore so free it. 3934 */ 3935 HeapFree( GetProcessHeap(), 0, pNewString ); 3936 3937 /* Check range of value. 3937 3938 */ 3938 3939 dValue = round( dValue ); 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]3940 if( dValue < UI2_MIN || dValue > UI2_MAX ) 3941 { 3942 return DISP_E_OVERFLOW; 3943 } 3944 3945 *puiOut = (USHORT) dValue; 3946 3947 return S_OK; 3948 } 3949 3950 /****************************************************************************** 3951 * VarUI2FromBool [OLEAUT32.266] 3951 3952 */ 3952 3953 HRESULT WINAPI VarUI2FromBool(VARIANT_BOOL boolIn, USHORT* puiOut) 3953 3954 { 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]3955 TRACE("( %d, %p ), stub\n", boolIn, puiOut ); 3956 3957 *puiOut = (USHORT) boolIn; 3958 3959 return S_OK; 3960 } 3961 3962 /****************************************************************************** 3963 * VarUI2FromI1 [OLEAUT32.267] 3963 3964 */ 3964 3965 HRESULT WINAPI VarUI2FromI1(CHAR cIn, USHORT* puiOut) 3965 3966 { 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]3967 TRACE("( %c, %p ), stub\n", cIn, puiOut ); 3968 3969 *puiOut = (USHORT) cIn; 3970 3971 return S_OK; 3972 } 3973 3974 /****************************************************************************** 3975 * VarUI2FromUI4 [OLEAUT32.268] 3975 3976 */ 3976 3977 HRESULT WINAPI VarUI2FromUI4(ULONG ulIn, USHORT* puiOut) 3977 3978 { 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]3979 TRACE("( %ld, %p ), stub\n", ulIn, puiOut ); 3980 3981 if( ulIn < UI2_MIN || ulIn > UI2_MAX ) 3982 { 3983 return DISP_E_OVERFLOW; 3984 } 3985 3986 *puiOut = (USHORT) ulIn; 3987 3988 return S_OK; 3989 } 3990 3991 /****************************************************************************** 3992 * VarUI4FromStr [OLEAUT32.277] 3992 3993 */ 3993 3994 HRESULT WINAPI VarUI4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, ULONG* pulOut) 3994 3995 { 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 argument4001 */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.3996 double dValue = 0.0; 3997 LPSTR pNewString = NULL; 3998 3999 TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pulOut ); 4000 4001 /* Check if we have a valid argument 4002 */ 4003 pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn ); 4004 RemoveCharacterFromString( pNewString, "," ); 4005 if( IsValidRealString( pNewString ) == FALSE ) 4006 { 4007 return DISP_E_TYPEMISMATCH; 4008 } 4009 4010 /* Convert the valid string to a floating point number. 4011 */ 4012 dValue = atof( pNewString ); 4013 4014 /* We don't need the string anymore so free it. 4015 */ 4016 HeapFree( GetProcessHeap(), 0, pNewString ); 4017 4018 /* Check range of value. 4018 4019 */ 4019 4020 dValue = round( dValue ); 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;4021 if( dValue < UI4_MIN || dValue > UI4_MAX ) 4022 { 4023 return DISP_E_OVERFLOW; 4024 } 4025 4026 *pulOut = (ULONG) dValue; 4027 4028 return S_OK; 4028 4029 } 4029 4030 … … 4034 4035 HRESULT WINAPI VarUI2FromCy(CY cyIn, USHORT* pusOut) { 4035 4036 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 4036 4037 4037 4038 if (t > UI2_MAX || t < UI2_MIN) return DISP_E_OVERFLOW; 4038 4039 4039 4040 *pusOut = (USHORT)t; 4040 4041 4041 4042 return S_OK; 4042 4043 } 4043 4044 4044 4045 /****************************************************************************** 4045 * VarUI4FromUI1[OLEAUT32.270]4046 * VarUI4FromUI1 [OLEAUT32.270] 4046 4047 */ 4047 4048 HRESULT WINAPI VarUI4FromUI1(BYTE bIn, ULONG* pulOut) 4048 4049 { 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]4050 TRACE("( %d, %p ), stub\n", bIn, pulOut ); 4051 4052 *pulOut = (USHORT) bIn; 4053 4054 return S_OK; 4055 } 4056 4057 /****************************************************************************** 4058 * VarUI4FromI2 [OLEAUT32.271] 4058 4059 */ 4059 4060 HRESULT WINAPI VarUI4FromI2(short uiIn, ULONG* pulOut) 4060 4061 { 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]4062 TRACE("( %d, %p ), stub\n", uiIn, pulOut ); 4063 4064 if( uiIn < UI4_MIN ) 4065 { 4066 return DISP_E_OVERFLOW; 4067 } 4068 4069 *pulOut = (ULONG) uiIn; 4070 4071 return S_OK; 4072 } 4073 4074 /****************************************************************************** 4075 * VarUI4FromI4 [OLEAUT32.272] 4075 4076 */ 4076 4077 HRESULT WINAPI VarUI4FromI4(LONG lIn, ULONG* pulOut) 4077 4078 { 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]4079 TRACE("( %ld, %p ), stub\n", lIn, pulOut ); 4080 4081 if( lIn < UI4_MIN ) 4082 { 4083 return DISP_E_OVERFLOW; 4084 } 4085 4086 *pulOut = (ULONG) lIn; 4087 4088 return S_OK; 4089 } 4090 4091 /****************************************************************************** 4092 * VarUI4FromR4 [OLEAUT32.273] 4092 4093 */ 4093 4094 HRESULT WINAPI VarUI4FromR4(FLOAT fltIn, ULONG* pulOut) … … 4095 4096 fltIn = round( fltIn ); 4096 4097 if( fltIn < UI4_MIN || fltIn > UI4_MAX ) 4097 {4098 return DISP_E_OVERFLOW;4099 }4100 4101 *pulOut = (ULONG) fltIn;4102 4103 return S_OK;4104 } 4105 4106 /****************************************************************************** 4107 * VarUI4FromR8[OLEAUT32.274]4098 { 4099 return DISP_E_OVERFLOW; 4100 } 4101 4102 *pulOut = (ULONG) fltIn; 4103 4104 return S_OK; 4105 } 4106 4107 /****************************************************************************** 4108 * VarUI4FromR8 [OLEAUT32.274] 4108 4109 */ 4109 4110 HRESULT WINAPI VarUI4FromR8(double dblIn, ULONG* pulOut) 4110 4111 { 4111 TRACE("( %f, %p ), stub\n", dblIn, pulOut );4112 TRACE("( %f, %p ), stub\n", dblIn, pulOut ); 4112 4113 4113 4114 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]4115 if( dblIn < UI4_MIN || dblIn > UI4_MAX ) 4116 { 4117 return DISP_E_OVERFLOW; 4118 } 4119 4120 *pulOut = (ULONG) dblIn; 4121 4122 return S_OK; 4123 } 4124 4125 /****************************************************************************** 4126 * VarUI4FromDate [OLEAUT32.275] 4126 4127 */ 4127 4128 HRESULT WINAPI VarUI4FromDate(DATE dateIn, ULONG* pulOut) 4128 4129 { 4129 TRACE("( %f, %p ), stub\n", dateIn, pulOut );4130 TRACE("( %f, %p ), stub\n", dateIn, pulOut ); 4130 4131 4131 4132 dateIn = round( dateIn ); 4132 4133 if( dateIn < UI4_MIN || dateIn > UI4_MAX ) 4133 {4134 return DISP_E_OVERFLOW;4135 }4136 4137 *pulOut = (ULONG) dateIn;4138 4139 return S_OK;4140 } 4141 4142 /****************************************************************************** 4143 * VarUI4FromBool[OLEAUT32.279]4134 { 4135 return DISP_E_OVERFLOW; 4136 } 4137 4138 *pulOut = (ULONG) dateIn; 4139 4140 return S_OK; 4141 } 4142 4143 /****************************************************************************** 4144 * VarUI4FromBool [OLEAUT32.279] 4144 4145 */ 4145 4146 HRESULT WINAPI VarUI4FromBool(VARIANT_BOOL boolIn, ULONG* pulOut) 4146 4147 { 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]4148 TRACE("( %d, %p ), stub\n", boolIn, pulOut ); 4149 4150 *pulOut = (ULONG) boolIn; 4151 4152 return S_OK; 4153 } 4154 4155 /****************************************************************************** 4156 * VarUI4FromI1 [OLEAUT32.280] 4156 4157 */ 4157 4158 HRESULT WINAPI VarUI4FromI1(CHAR cIn, ULONG* pulOut) 4158 4159 { 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]4160 TRACE("( %c, %p ), stub\n", cIn, pulOut ); 4161 4162 *pulOut = (ULONG) cIn; 4163 4164 return S_OK; 4165 } 4166 4167 /****************************************************************************** 4168 * VarUI4FromUI2 [OLEAUT32.281] 4168 4169 */ 4169 4170 HRESULT WINAPI VarUI4FromUI2(USHORT uiIn, ULONG* pulOut) 4170 4171 { 4171 TRACE("( %d, %p ), stub\n", uiIn, pulOut );4172 4173 *pulOut = (ULONG) uiIn;4174 4175 return S_OK;4172 TRACE("( %d, %p ), stub\n", uiIn, pulOut ); 4173 4174 *pulOut = (ULONG) uiIn; 4175 4176 return S_OK; 4176 4177 } 4177 4178 … … 4182 4183 HRESULT WINAPI VarUI4FromCy(CY cyIn, ULONG* pulOut) { 4183 4184 double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000); 4184 4185 4185 4186 if (t > UI4_MAX || t < UI4_MIN) return DISP_E_OVERFLOW; 4186 4187 … … 4197 4198 pcyOut->s.Hi = 0; 4198 4199 pcyOut->s.Lo = ((ULONG)bIn) * 10000; 4199 4200 4200 4201 return S_OK; 4201 4202 } … … 4209 4210 else pcyOut->s.Hi = 0; 4210 4211 pcyOut->s.Lo = ((ULONG)sIn) * 10000; 4211 4212 4212 4213 return S_OK; 4213 4214 } … … 4222 4223 pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0); 4223 4224 if (lIn < 0) pcyOut->s.Hi--; 4224 4225 4225 4226 return S_OK; 4226 4227 } … … 4235 4236 pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0); 4236 4237 if (fltIn < 0) pcyOut->s.Hi--; 4237 4238 4238 4239 return S_OK; 4239 4240 } … … 4269 4270 */ 4270 4271 HRESULT WINAPI VarCyFromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, CY *pcyOut) { 4271 /* FIXME */4272 return E_NOTIMPL;4273 } 4274 4275 4272 /* FIXME */ 4273 return E_NOTIMPL; 4274 } 4275 4276 4276 4277 /********************************************************************** 4277 4278 * VarCyFromBool [OLEAUT32.106] … … 4282 4283 else pcyOut->s.Hi = 0; 4283 4284 pcyOut->s.Lo = (ULONG)boolIn * (ULONG)10000; 4284 4285 4285 4286 return S_OK; 4286 4287 } … … 4294 4295 else pcyOut->s.Hi = 0; 4295 4296 pcyOut->s.Lo = (ULONG)cIn * (ULONG)10000; 4296 4297 4297 4298 return S_OK; 4298 4299 } … … 4305 4306 pcyOut->s.Hi = 0; 4306 4307 pcyOut->s.Lo = (ULONG)usIn * (ULONG)10000; 4307 4308 4308 4309 return S_OK; 4309 4310 } … … 4317 4318 pcyOut->s.Hi = (LONG)(t / (double)4294967296.0); 4318 4319 pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0); 4319 4320 4320 4321 return S_OK; 4321 4322 } … … 4333 4334 4334 4335 TRACE("( 0x%x, 0x%x, 0x%p ), stub\n", wDosDate, wDosTime, pvtime ); 4335 4336 4336 4337 t.tm_sec = (wDosTime & 0x001f) * 2; 4337 4338 t.tm_min = (wDosTime & 0x07e0) >> 5; 4338 4339 t.tm_hour = (wDosTime & 0xf800) >> 11; 4339 4340 4340 4341 t.tm_mday = (wDosDate & 0x001f); 4341 4342 t.tm_mon = (wDosDate & 0x01e0) >> 5; … … 4363 4364 cDig = 0; 4364 4365 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 }4371 }4372 } 4373 pnumprs->cDig = cDig;4366 if ((strIn[i]>='0') && (strIn[i]<='9')) { 4367 if (pnumprs->cDig > cDig) { 4368 *(rgbDig++)=strIn[i]-'0'; 4369 cDig++; 4370 lastent = i; 4371 } 4372 } 4373 } 4374 pnumprs->cDig = cDig; 4374 4375 4375 4376 /* FIXME: Just patching some values in */ 4376 pnumprs->nPwr10 = 0;4377 pnumprs->nBaseShift = 0;4378 pnumprs->cchUsed = lastent;4379 pnumprs->dwOutFlags = NUMPRS_DECIMAL;4377 pnumprs->nPwr10 = 0; 4378 pnumprs->nBaseShift = 0; 4379 pnumprs->cchUsed = lastent; 4380 pnumprs->dwOutFlags = NUMPRS_DECIMAL; 4380 4381 return S_OK; 4381 4382 } … … 4394 4395 xint = 0; 4395 4396 for (i=0;i<pnumprs->cDig;i++) 4396 xint = xint*10 + rgbDig[i];4397 xint = xint*10 + rgbDig[i]; 4397 4398 4398 4399 VariantInit(pvar); 4399 4400 if (dwVtBits & VTBIT_I4) { 4400 V_VT(pvar) = VT_I4;4401 V_UNION(pvar,intVal) = xint;4402 return S_OK;4401 V_VT(pvar) = VT_I4; 4402 V_UNION(pvar,intVal) = xint; 4403 return S_OK; 4403 4404 } 4404 4405 if (dwVtBits & VTBIT_R8) { 4405 V_VT(pvar) = VT_R8;4406 V_UNION(pvar,dblVal) = xint;4407 return S_OK;4406 V_VT(pvar) = VT_R8; 4407 V_UNION(pvar,dblVal) = xint; 4408 return S_OK; 4408 4409 } else { 4409 FIXME("vtbitmask is unsupported %lx\n",dwVtBits);4410 return E_FAIL;4410 FIXME("vtbitmask is unsupported %lx\n",dwVtBits); 4411 return E_FAIL; 4411 4412 } 4412 4413 } … … 4659 4660 * VarBstrCmp [OLEAUT32.440] 4660 4661 * 4661 * flags can be: 4662 * flags can be: 4662 4663 * NORM_IGNORECASE, NORM_IGNORENONSPACE, NORM_IGNORESYMBOLS 4663 4664 * NORM_IGNORESTRINGWIDTH, NORM_IGNOREKANATYPE, NORM_IGNOREKASHIDA
Note:
See TracChangeset
for help on using the changeset viewer.
