Alexandru Balut : oleaut32: Implement VarWeekdayName + tests.
Alexandre Julliard
julliard at winehq.org
Wed Dec 5 06:56:55 CST 2007
Module: wine
Branch: master
Commit: 90d8741d23c9cc19f7f9d285efea2c7f8467af1a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=90d8741d23c9cc19f7f9d285efea2c7f8467af1a
Author: Alexandru Balut <alexandru.balut at gmail.com>
Date: Sun Dec 2 17:17:27 2007 +0100
oleaut32: Implement VarWeekdayName + tests.
---
dlls/oleaut32/oleaut32.spec | 2 +-
dlls/oleaut32/tests/varformat.c | 103 +++++++++++++++++++++++++++++++++++++++
dlls/oleaut32/varformat.c | 70 ++++++++++++++++++++++++++
3 files changed, 174 insertions(+), 1 deletions(-)
diff --git a/dlls/oleaut32/oleaut32.spec b/dlls/oleaut32/oleaut32.spec
index abffbd2..7b764ef 100644
--- a/dlls/oleaut32/oleaut32.spec
+++ b/dlls/oleaut32/oleaut32.spec
@@ -124,7 +124,7 @@
125 stdcall VarBoolFromStr(wstr long long ptr)
126 stdcall VarBoolFromDisp(ptr long ptr)
127 stdcall VarFormatCurrency(ptr long long long long long ptr)
-128 stub VarWeekdayName # stdcall (long long long long ptr)
+128 stdcall VarWeekdayName(long long long long ptr)
129 stdcall VarMonthName(long long long ptr)
130 stdcall VarUI1FromI2(long ptr)
131 stdcall VarUI1FromI4(long ptr)
diff --git a/dlls/oleaut32/tests/varformat.c b/dlls/oleaut32/tests/varformat.c
index f7c7c28..5a13e67 100644
--- a/dlls/oleaut32/tests/varformat.c
+++ b/dlls/oleaut32/tests/varformat.c
@@ -42,6 +42,7 @@ static HMODULE hOleaut32;
static HRESULT (WINAPI *pVarFormatNumber)(LPVARIANT,int,int,int,int,ULONG,BSTR*);
static HRESULT (WINAPI *pVarFormat)(LPVARIANT,LPOLESTR,int,int,ULONG,BSTR*);
+static HRESULT (WINAPI *pVarWeekdayName)(int,int,int,ULONG,BSTR*);
/* Have I8/UI8 data type? */
#define HAVE_OLEAUT32_I8 HAVE_FUNC(VarI8FromI1)
@@ -392,10 +393,112 @@ static void test_VarFormat(void)
VARFMT(VT_BOOL,V_BOOL,VARIANT_TRUE,"",E_INVALIDARG,"");
}
+static const char *szVarWdnFail = \
+ "VarWeekdayName (%d, %d, %d, %d, %x): returned %8x, expected %8x\n";
+#define VARWDN(iWeekday, fAbbrev, iFirstDay, dwFlags, ret, buff, out, freeOut) \
+do { \
+ hres = pVarWeekdayName(iWeekday, fAbbrev, iFirstDay, dwFlags, &out); \
+ if (SUCCEEDED(hres)) { \
+ WideCharToMultiByte(CP_ACP, 0, out, -1, buff, sizeof(buff), 0, 0); \
+ if (freeOut) SysFreeString(out); \
+ } else { \
+ buff[0] = '\0'; \
+ } \
+ ok(hres == ret, \
+ szVarWdnFail, \
+ iWeekday, fAbbrev, iFirstDay, dwFlags, &out, hres, ret \
+ ); \
+} while(0)
+
+#define VARWDN_F(iWeekday, fAbbrev, iFirstDay, dwFlags, ret) \
+ VARWDN(iWeekday, fAbbrev, iFirstDay, dwFlags, ret, buff, out, 1)
+
+#define VARWDN_O(iWeekday, fAbbrev, iFirstDay, dwFlags) \
+ VARWDN(iWeekday, fAbbrev, iFirstDay, dwFlags, S_OK, buff, out, 0)
+
+static void test_VarWeekdayName(void)
+{
+ char buff[256];
+ BSTR out = NULL;
+ HRESULT hres;
+ int iWeekday, fAbbrev, iFirstDay;
+ BSTR dayNames[7][2]; /* Monday-Sunday, full/abbr */
+ DWORD defaultFirstDay;
+ int firstDay;
+ int day;
+ int size;
+ DWORD localeValue;
+
+ CHECKPTR(VarWeekdayName);
+
+ /* Initialize days' names */
+ for (day = 0; day <= 6; ++day)
+ {
+ for (fAbbrev = 0; fAbbrev <= 1; ++fAbbrev)
+ {
+ localeValue = fAbbrev ? LOCALE_SABBREVDAYNAME1 : LOCALE_SDAYNAME1;
+ localeValue += day;
+ size = GetLocaleInfoW(LOCALE_USER_DEFAULT, localeValue, NULL, 0);
+ dayNames[day][fAbbrev] = SysAllocStringLen(NULL, size - 1);
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, localeValue,
+ dayNames[day][fAbbrev], size);
+ }
+ }
+
+ /* Get the user's first day of week. 0=Monday, .. */
+ GetLocaleInfoW(
+ LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK | LOCALE_RETURN_NUMBER,
+ (LPWSTR)&defaultFirstDay, sizeof(defaultFirstDay) / sizeof(WCHAR));
+
+ /* Check invalid arguments */
+ VARWDN_F(0, 0, 4, 0, E_INVALIDARG);
+ VARWDN_F(8, 0, 4, 0, E_INVALIDARG);
+ VARWDN_F(4, 0, -1, 0, E_INVALIDARG);
+ VARWDN_F(4, 0, 8, 0, E_INVALIDARG);
+
+ hres = pVarWeekdayName(1, 0, 0, 0, NULL);
+ ok(E_INVALIDARG == hres,
+ "Null pointer: expected E_INVALIDARG, got 0x%08x\n", hres);
+
+ /* Check all combinations */
+ for (iWeekday = 1; iWeekday <= 7; ++iWeekday)
+ {
+ for (fAbbrev = 0; fAbbrev <= 1; ++fAbbrev)
+ {
+ /* 0 = Default, 1 = Sunday, 2 = Monday, .. */
+ for (iFirstDay = 0; iFirstDay <= 7; ++iFirstDay)
+ {
+ VARWDN_O(iWeekday, fAbbrev, iFirstDay, 0);
+ if (iFirstDay == 0)
+ firstDay = defaultFirstDay;
+ else
+ /* Translate from 0=Sunday to 0=Monday in the modulo 7 space */
+ firstDay = iFirstDay - 2;
+ day = (7 + iWeekday - 1 + firstDay) % 7;
+ ok(VARCMP_EQ == VarBstrCmp(out, dayNames[day][fAbbrev],
+ LOCALE_USER_DEFAULT, 0),
+ "VarWeekdayName(%d,%d,%d): got wrong dayname: '%s'\n",
+ iWeekday, fAbbrev, iFirstDay, buff);
+ SysFreeString(out);
+ }
+ }
+ }
+
+ /* Cleanup */
+ for (day = 0; day <= 6; ++day)
+ {
+ for (fAbbrev = 0; fAbbrev <= 1; ++fAbbrev)
+ {
+ SysFreeString(dayNames[day][fAbbrev]);
+ }
+ }
+}
+
START_TEST(varformat)
{
hOleaut32 = GetModuleHandleA("oleaut32.dll");
test_VarFormatNumber();
test_VarFormat();
+ test_VarWeekdayName();
}
diff --git a/dlls/oleaut32/varformat.c b/dlls/oleaut32/varformat.c
index 5faecd2..23b7e57 100644
--- a/dlls/oleaut32/varformat.c
+++ b/dlls/oleaut32/varformat.c
@@ -2498,3 +2498,73 @@ HRESULT WINAPI VarMonthName(INT iMonth, INT fAbbrev, ULONG dwFlags, BSTR *pbstrO
}
return S_OK;
}
+
+/**********************************************************************
+ * VarWeekdayName [OLEAUT32.129]
+ *
+ * Print the specified weekday as localized name.
+ *
+ * PARAMS
+ * iWeekday [I] day of week, 1..7, 1="the first day of the week"
+ * fAbbrev [I] 0 - full name, !0 - abbreviated name
+ * iFirstDay [I] first day of week,
+ * 0=system default, 1=Sunday, 2=Monday, .. (contrary to MSDN)
+ * dwFlags [I] flag stuff. only VAR_CALENDAR_HIJRI possible.
+ * pbstrOut [O] Destination for weekday name.
+ *
+ * RETURNS
+ * Success: S_OK, pbstrOut contains the name.
+ * Failure: E_INVALIDARG, if any parameter is invalid.
+ * E_OUTOFMEMORY, if enough memory cannot be allocated.
+ */
+HRESULT WINAPI VarWeekdayName(INT iWeekday, INT fAbbrev, INT iFirstDay,
+ ULONG dwFlags, BSTR *pbstrOut)
+{
+ DWORD localeValue;
+ INT size;
+
+ /* Windows XP oleaut32.dll doesn't allow iWekday==0, contrary to MSDN */
+ if (iWeekday < 1 || iWeekday > 7)
+ return E_INVALIDARG;
+ if (iFirstDay < 0 || iFirstDay > 7)
+ return E_INVALIDARG;
+ if (!pbstrOut)
+ return E_INVALIDARG;
+
+ if (dwFlags)
+ FIXME("Does not support dwFlags 0x%x, ignoring.\n", dwFlags);
+
+ /* If we have to use the default firstDay, find which one it is */
+ if (iFirstDay == 0) {
+ DWORD firstDay;
+ localeValue = LOCALE_RETURN_NUMBER | LOCALE_IFIRSTDAYOFWEEK;
+ size = GetLocaleInfoW(LOCALE_USER_DEFAULT, localeValue,
+ (LPWSTR)&firstDay, sizeof(firstDay) / sizeof(WCHAR));
+ if (!size) {
+ ERR("GetLocaleInfo 0x%x failed.\n", localeValue);
+ return HRESULT_FROM_WIN32(GetLastError());
+ }
+ iFirstDay = firstDay + 2;
+ }
+
+ /* Determine what we need to return */
+ localeValue = fAbbrev ? LOCALE_SABBREVDAYNAME1 : LOCALE_SDAYNAME1;
+ localeValue += (7 + iWeekday - 1 + iFirstDay - 2) % 7;
+
+ /* Determine the size of the data, allocate memory and retrieve the data */
+ size = GetLocaleInfoW(LOCALE_USER_DEFAULT, localeValue, NULL, 0);
+ if (!size) {
+ ERR("GetLocaleInfo 0x%x failed.\n", localeValue);
+ return HRESULT_FROM_WIN32(GetLastError());
+ }
+ *pbstrOut = SysAllocStringLen(NULL, size - 1);
+ if (!*pbstrOut)
+ return E_OUTOFMEMORY;
+ size = GetLocaleInfoW(LOCALE_USER_DEFAULT, localeValue, *pbstrOut, size);
+ if (!size) {
+ ERR("GetLocaleInfo 0x%x failed in 2nd stage?!\n", localeValue);
+ SysFreeString(*pbstrOut);
+ return HRESULT_FROM_WIN32(GetLastError());
+ }
+ return S_OK;
+}
More information about the wine-cvs
mailing list