X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/12335fa6aa8db0d0044ff4dbfa9ea056b57b0a66..3fdac2ab39c2a8509a1b8f4a0589f4a82b410156:/src/msw/ole/automtn.cpp diff --git a/src/msw/ole/automtn.cpp b/src/msw/ole/automtn.cpp index de72abc752..4b2b77b108 100644 --- a/src/msw/ole/automtn.cpp +++ b/src/msw/ole/automtn.cpp @@ -24,9 +24,11 @@ // Watcom C++ gives a linker error if this is compiled in. // With Borland C++, all samples crash if this is compiled in. -#if wxUSE_OLE &&!defined(__WATCOMC__) && !(defined(__BORLANDC__) && (__BORLANDC__ < 0x520)) && !defined(__CYGWIN10__) && !defined(__WXWINE__) +#if wxUSE_OLE &&!defined(__WATCOMC__) && !(defined(__BORLANDC__) && (__BORLANDC__ < 0x520)) && !defined(__CYGWIN10__) +#define _FORCENAMELESSUNION #include "wx/log.h" +#include "wx/msw/ole/oleutils.h" #include "wx/msw/ole/automtn.h" #include "wx/msw/private.h" @@ -40,39 +42,6 @@ #include #include -// wrapper around BSTR type (by Vadim Zeitlin) - -class WXDLLEXPORT BasicString -{ -public: - // ctors & dtor - BasicString(const char *sz); - ~BasicString(); - - // accessors - // just get the string - operator BSTR() const { return m_wzBuf; } - // retrieve a copy of our string - caller must SysFreeString() it later! - BSTR Get() const { return SysAllocString(m_wzBuf); } - -private: - // @@@ not implemented (but should be) - BasicString(const BasicString&); - BasicString& operator=(const BasicString&); - - OLECHAR *m_wzBuf; // actual string -}; - -// Convert variants -static bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) ; -static bool ConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) ; - -// Convert string to Unicode -static BSTR ConvertStringToOle(const wxString& str); - -// Convert string from BSTR to wxString -static wxString ConvertStringFromOle(BSTR bStr); - // Verifies will fail if the needed buffer size is too large #define MAX_TIME_BUFFER_SIZE 128 // matches that in timecore.cpp #define MIN_DATE (-657434L) // about year 100 @@ -85,7 +54,9 @@ static wxString ConvertStringFromOle(BSTR bStr); static int rgMonthDays[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; -#if wxUSE_TIMEDATE +#if wxUSE_DATETIME +#include "wx/datetime.h" + static BOOL OleDateFromTm(WORD wYear, WORD wMonth, WORD wDay, WORD wHour, WORD wMinute, WORD wSecond, DATE& dtDest); static BOOL TmFromOleDate(DATE dtSrc, struct tm& tmDest); @@ -153,7 +124,7 @@ bool wxAutomationObject::Invoke(const wxString& member, int action, int namedArgStringCount = namedArgCount + 1; BSTR* argNames = new BSTR[namedArgStringCount]; - argNames[0] = ConvertStringToOle(member); + argNames[0] = wxConvertStringToOle(member); // Note that arguments are specified in reverse order // (all totally logical; hey, we're dealing with OLE here.) @@ -163,7 +134,7 @@ bool wxAutomationObject::Invoke(const wxString& member, int action, { if (!INVOKEARG(i).GetName().IsNull()) { - argNames[(namedArgCount-j)] = ConvertStringToOle(INVOKEARG(i).GetName()); + argNames[(namedArgCount-j)] = wxConvertStringToOle(INVOKEARG(i).GetName()); j ++; } } @@ -202,7 +173,7 @@ bool wxAutomationObject::Invoke(const wxString& member, int action, for (i = 0; i < noArgs; i++) { // Again, reverse args - if (!ConvertVariantToOle(INVOKEARG((noArgs-1) - i), oleArgs[i])) + if (!wxConvertVariantToOle(INVOKEARG((noArgs-1) - i), oleArgs[i])) { delete[] argNames; delete[] dispIds; @@ -251,7 +222,7 @@ bool wxAutomationObject::Invoke(const wxString& member, int action, if (vReturnPtr) { // Convert result to wxVariant form - ConvertOleToVariant(vReturn, retValue); + wxConvertOleToVariant(vReturn, retValue); // Mustn't release the dispatch pointer if (vReturn.vt == VT_DISPATCH) { @@ -533,7 +504,7 @@ bool wxAutomationObject::GetInstance(const wxString& classId) const CLSID clsId; IUnknown * pUnk = NULL; - BasicString unicodeName(classId.mb_str()); + wxBasicString unicodeName(classId.mb_str()); if (FAILED(CLSIDFromProgID((BSTR) unicodeName, &clsId))) { @@ -565,7 +536,7 @@ bool wxAutomationObject::CreateInstance(const wxString& classId) const CLSID clsId; - BasicString unicodeName(classId.mb_str()); + wxBasicString unicodeName(classId.mb_str()); if (FAILED(CLSIDFromProgID((BSTR) unicodeName, &clsId))) { @@ -584,7 +555,7 @@ bool wxAutomationObject::CreateInstance(const wxString& classId) const } -bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) +bool wxConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) { ClearVariant(&oleVariant); if (variant.IsNull()) @@ -628,10 +599,11 @@ bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) { wxString str( variant.GetString() ); oleVariant.vt = VT_BSTR; - oleVariant.bstrVal = ConvertStringToOle(str); + oleVariant.bstrVal = wxConvertStringToOle(str); } // For some reason, Watcom C++ can't link variant.cpp with time/date classes compiled -#if wxUSE_TIMEDATE && !defined(__WATCOMC__) +// Now obsolete +#if 0 // wxUSE_TIMEDATE && !defined(__WATCOMC__) else if (type == wxT("date")) { wxDate date( variant.GetDate() ); @@ -650,6 +622,17 @@ bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) time.GetHour(), time.GetMinute(), time.GetSecond(), oleVariant.date)) return FALSE; } +#endif +#if wxUSE_DATETIME + else if (type == wxT("datetime")) + { + wxDateTime date( variant.GetDateTime() ); + oleVariant.vt = VT_DATE; + + if (!OleDateFromTm(date.GetYear(), date.GetMonth(), date.GetDay(), + date.GetHour(), date.GetMinute(), date.GetSecond(), oleVariant.date)) + return FALSE; + } #endif else if (type == wxT("void*")) { @@ -682,7 +665,7 @@ bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) { // copy each string in the list of strings wxVariant eachVariant(variant[i]); - if (!ConvertVariantToOle(eachVariant, * pvarg)) + if (!wxConvertVariantToOle(eachVariant, * pvarg)) { // memory failure: back out and free strings alloc'ed up to // now, and then the array itself. @@ -714,27 +697,26 @@ bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) #define VT_TYPEMASK 0xfff #endif -bool ConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) +bool wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) { switch (oleVariant.vt & VT_TYPEMASK) { case VT_BSTR: { - wxString str(ConvertStringFromOle(oleVariant.bstrVal)); + wxString str(wxConvertStringFromOle(oleVariant.bstrVal)); variant = str; break; } case VT_DATE: { -#if wxUSE_TIMEDATE +#if wxUSE_DATETIME 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); + wxDateTime date(tmTemp.tm_yday, (wxDateTime::Month) tmTemp.tm_mon, tmTemp.tm_year, tmTemp.tm_hour, tmTemp.tm_min, tmTemp.tm_sec); - variant = time; + variant = date; #endif break; @@ -793,7 +775,7 @@ bool ConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) { VARIANTARG& oleElement = pvdata[i]; wxVariant vElement; - if (!ConvertOleToVariant(oleElement, vElement)) + if (!wxConvertOleToVariant(oleElement, vElement)) return FALSE; variant.Append(vElement); @@ -824,7 +806,7 @@ bool ConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) return TRUE; } -static BSTR ConvertStringToOle(const wxString& str) +BSTR wxConvertStringToOle(const wxString& str) { /* unsigned int len = strlen((const char*) str); @@ -834,11 +816,11 @@ static BSTR ConvertStringToOle(const wxString& str) for (i=0; i < len; i++) s[i*2] = str[i]; */ - BasicString bstr(str.mb_str()); + wxBasicString bstr(str.mb_str()); return bstr.Get(); } -static wxString ConvertStringFromOle(BSTR bStr) +wxString wxConvertStringFromOle(BSTR bStr) { #if wxUSE_UNICODE wxString str(bStr); @@ -853,32 +835,50 @@ static wxString ConvertStringFromOle(BSTR bStr) } // ---------------------------------------------------------------------------- -// BasicString +// wxBasicString // ---------------------------------------------------------------------------- // ctor takes an ANSI string and transforms it to Unicode -BasicString::BasicString(const char *sz) +wxBasicString::wxBasicString(const char *sz) +{ + Init(sz); +} + +// ctor takes an ANSI or Unicode string and transforms it to Unicode +wxBasicString::wxBasicString(const wxString& str) { - // 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; - } +#if wxUSE_UNICODE + m_wzBuf = new OLECHAR[str.Length() + 1]; + memcpy(m_wzBuf, str.c_str(), str.Length()*2); + m_wzBuf[str.Length()] = L'\0'; +#else + Init(str.c_str()); +#endif +} + +// Takes an ANSI string and transforms it to Unicode +void wxBasicString::Init(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() +wxBasicString::~wxBasicString() { delete [] m_wzBuf; }