- switch (oleVariant.vt & VT_TYPEMASK)
- {
- case VT_BSTR:
- {
- wxString str(ConvertStringFromOle(oleVariant.bstrVal));
- variant = str;
- break;
- }
- case VT_DATE:
- {
-#if wxUSE_TIMEDATE
- struct tm tmTemp;
- if (!TmFromOleDate(oleVariant.date, tmTemp))
- return FALSE;
-
- wxDate date(tmTemp.tm_yday, tmTemp.tm_mon, tmTemp.tm_year);
- wxTime time(date, tmTemp.tm_hour, tmTemp.tm_min, tmTemp.tm_sec);
-
- variant = time;
-#endif
-
- break;
- }
- case VT_I4:
- {
- variant = (long) oleVariant.lVal;
- break;
- }
- case VT_I2:
- {
- variant = (long) oleVariant.iVal;
- break;
- }
-
- case VT_BOOL:
- {
-#if defined(__WATCOMC__) || (defined(_MSC_VER) && (_MSC_VER <= 1000) && !defined(__MWERKS__) ) //GC
-#ifndef HAVE_BOOL // Can't use bool operator if no native bool type
- variant = (long) (oleVariant.bool != 0);
-#else
- variant = (bool) (oleVariant.bool != 0);
-#endif
-#else
-#ifndef HAVE_BOOL // Can't use bool operator if no native bool type
- variant = (long) (oleVariant.boolVal != 0);
-#else
- variant = (bool) (oleVariant.boolVal != 0);
-#endif
-#endif
- break;
- }
- case VT_R8:
- {
- variant = oleVariant.dblVal;
- break;
- }
- case VT_ARRAY:
- {
- variant.ClearList();
-
- int cDims, cElements, i;
- VARIANTARG* pvdata;
-
- // Iterate the dimensions: number of elements is x*y*z
- for (cDims = 0, cElements = 1;
- cDims < oleVariant.parray->cDims; cDims ++)
- cElements *= oleVariant.parray->rgsabound[cDims].cElements;
-
- // Get a pointer to the data
- HRESULT hr = SafeArrayAccessData(oleVariant.parray, (void HUGEP* FAR*) & pvdata);
- if (hr != NOERROR)
- return FALSE;
- // Iterate the data.
- for (i = 0; i < cElements; i++)
- {
- VARIANTARG& oleElement = pvdata[i];
- wxVariant vElement;
- if (!ConvertOleToVariant(oleElement, vElement))
- return FALSE;
-
- variant.Append(vElement);
- }
- SafeArrayUnaccessData(oleVariant.parray);
- break;
- }
- case VT_DISPATCH:
- {
- variant = (void*) oleVariant.pdispVal;
- break;
- }
- case VT_NULL:
- {
- variant.MakeNull();
- break;
- }
- case VT_EMPTY:
- {
- break; // Ignore Empty Variant, used only during destruction of objects
- }
- default:
- {
- wxLogError(wxT("wxAutomationObject::ConvertOleToVariant: Unknown variant value type"));
- return FALSE;
- }
- }
- return TRUE;
-}
-
-static BSTR ConvertStringToOle(const wxString& str)
-{
-/*
- unsigned int len = strlen((const char*) str);
- unsigned short* s = new unsigned short[len*2+2];
- unsigned int i;
- memset(s, 0, len*2+2);
- for (i=0; i < len; i++)
- s[i*2] = str[i];
-*/
- BasicString bstr(str.mb_str());
- return bstr.Get();
-}
-
-static wxString ConvertStringFromOle(BSTR bStr)
-{
-#if wxUSE_UNICODE
- wxString str(bStr);
-#else
- int len = SysStringLen(bStr) + 1;
- char *buf = new char[len];
- (void)wcstombs( buf, bStr, len);
- wxString str(buf);
- delete[] buf;
-#endif
- return str;
-}
-
-// ----------------------------------------------------------------------------
-// BasicString
-// ----------------------------------------------------------------------------
-
-// ctor takes an ANSI string and transforms it to Unicode
-BasicString::BasicString(const char *sz)
-{
- // get the size of required buffer
- UINT lenAnsi = strlen(sz);
- #ifdef __MWERKS__
- UINT lenWide = lenAnsi * 2 ;
- #else
- UINT lenWide = mbstowcs(NULL, sz, lenAnsi);
- #endif
-
- if ( lenWide > 0 ) {
- m_wzBuf = new OLECHAR[lenWide + 1];
- mbstowcs(m_wzBuf, sz, lenAnsi);
- m_wzBuf[lenWide] = L'\0';
- }
- else {
- m_wzBuf = NULL;
- }
-}
-
-// dtor frees memory
-BasicString::~BasicString()
-{
- delete [] m_wzBuf;
-}
-
-/////////////////////////////////////////////////////////////////////////////
-// COleDateTime class HELPERS - implementation
-
-BOOL OleDateFromTm(WORD wYear, WORD wMonth, WORD wDay,
- WORD wHour, WORD wMinute, WORD wSecond, DATE& dtDest)
-{
- // Validate year and month (ignore day of week and milliseconds)
- if (wYear > 9999 || wMonth < 1 || wMonth > 12)
- return FALSE;
-
- // Check for leap year and set the number of days in the month
- BOOL bLeapYear = ((wYear & 3) == 0) &&
- ((wYear % 100) != 0 || (wYear % 400) == 0);
-
- int nDaysInMonth =
- rgMonthDays[wMonth] - rgMonthDays[wMonth-1] +
- ((bLeapYear && wDay == 29 && wMonth == 2) ? 1 : 0);
-
- // Finish validating the date
- if (wDay < 1 || wDay > nDaysInMonth ||
- wHour > 23 || wMinute > 59 ||
- wSecond > 59)
- {
- return FALSE;
- }
-
- // Cache the date in days and time in fractional days
- long nDate;
- double dblTime;
-
- //It is a valid date; make Jan 1, 1AD be 1
- nDate = wYear*365L + wYear/4 - wYear/100 + wYear/400 +
- rgMonthDays[wMonth-1] + wDay;
-
- // If leap year and it's before March, subtract 1:
- if (wMonth <= 2 && bLeapYear)
- --nDate;
-
- // Offset so that 12/30/1899 is 0
- nDate -= 693959L;