From 250cac32ca5ff4e7c282bd25abb4f1ae171476b8 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 15 Aug 2008 14:44:16 +0200 Subject: [PATCH] winhttp: Implement WinHttpTimeFromSystemTime and WinHttpTimeToSystemTime. --- dlls/winhttp/main.c | 22 --------- dlls/winhttp/session.c | 113 +++++++++++++++++++++++++++++++++++++++++++ dlls/winhttp/tests/winhttp.c | 12 ++--- 3 files changed, 119 insertions(+), 28 deletions(-) diff --git a/dlls/winhttp/main.c b/dlls/winhttp/main.c index 6aa59df4ee5..c503e230136 100644 --- a/dlls/winhttp/main.c +++ b/dlls/winhttp/main.c @@ -165,28 +165,6 @@ BOOL WINAPI WinHttpWriteData (HINTERNET hRequest, LPCVOID lpBuffer, } /*********************************************************************** - * WinHttpTimeFromSystemTime (winhttp.@) - */ -BOOL WINAPI WinHttpTimeFromSystemTime (CONST SYSTEMTIME* pst, LPWSTR pwszTime) -{ - FIXME("(%p, %p): stub\n", pst, pwszTime); - - SetLastError(ERROR_NOT_SUPPORTED); - return FALSE; -} - -/*********************************************************************** - * WinHttpTimeToSystemTime (winhttp.@) - */ -BOOL WINAPI WinHttpTimeToSystemTime (LPCWSTR pwszTime, SYSTEMTIME* pst) -{ - FIXME("(%s, %p): stub\n", debugstr_w(pwszTime), pst); - - SetLastError(ERROR_NOT_SUPPORTED); - return FALSE; -} - -/*********************************************************************** * WinHttpQueryHeaders (winhttp.@) */ BOOL WINAPI WinHttpQueryHeaders (HINTERNET hRequest, DWORD dwInfoLevel, LPCWSTR pwszName, diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index dd612ec6439..eb2c71fa9f4 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -391,3 +391,116 @@ WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback( HINTERNET handle, WINHT release_object( hdr ); return ret; } + +static const WCHAR wkday[7][4] = + {{'S','u','n', 0}, {'M','o','n', 0}, {'T','u','e', 0}, {'W','e','d', 0}, + {'T','h','u', 0}, {'F','r','i', 0}, {'S','a','t', 0}}; +static const WCHAR month[12][4] = + {{'J','a','n', 0}, {'F','e','b', 0}, {'M','a','r', 0}, {'A','p','r', 0}, + {'M','a','y', 0}, {'J','u','n', 0}, {'J','u','l', 0}, {'A','u','g', 0}, + {'S','e','p', 0}, {'O','c','t', 0}, {'N','o','v', 0}, {'D','e','c', 0}}; + +/*********************************************************************** + * WinHttpTimeFromSystemTime (WININET.@) + */ +BOOL WINAPI WinHttpTimeFromSystemTime( const SYSTEMTIME *time, LPWSTR string ) +{ + static const WCHAR format[] = + {'%','s',',',' ','%','0','2','d',' ','%','s',' ','%','4','d',' ','%','0', + '2','d',':','%','0','2','d',':','%','0','2','d',' ','G','M','T', 0}; + + TRACE("%p, %p\n", time, string); + + if (!time || !string) return FALSE; + + sprintfW( string, format, + wkday[time->wDayOfWeek], + time->wDay, + month[time->wMonth - 1], + time->wYear, + time->wHour, + time->wMinute, + time->wSecond ); + + return TRUE; +} + +/*********************************************************************** + * WinHttpTimeToSystemTime (WININET.@) + */ +BOOL WINAPI WinHttpTimeToSystemTime( LPCWSTR string, SYSTEMTIME *time ) +{ + unsigned int i; + const WCHAR *s = string; + WCHAR *end; + + TRACE("%s, %p\n", debugstr_w(string), time); + + if (!string || !time) return FALSE; + + /* Windows does this too */ + GetSystemTime( time ); + + /* Convert an RFC1123 time such as 'Fri, 07 Jan 2005 12:06:35 GMT' into + * a SYSTEMTIME structure. + */ + + while (*s && !isalphaW( *s )) s++; + if (s[0] == '\0' || s[1] == '\0' || s[2] == '\0') return TRUE; + time->wDayOfWeek = 7; + + for (i = 0; i < 7; i++) + { + if (toupperW( wkday[i][0] ) == toupperW( s[0] ) && + toupperW( wkday[i][1] ) == toupperW( s[1] ) && + toupperW( wkday[i][2] ) == toupperW( s[2] ) ) + { + time->wDayOfWeek = i; + break; + } + } + + if (time->wDayOfWeek > 6) return TRUE; + while (*s && !isdigitW( *s )) s++; + time->wDay = strtolW( s, &end, 10 ); + s = end; + + while (*s && !isalphaW( *s )) s++; + if (s[0] == '\0' || s[1] == '\0' || s[2] == '\0') return TRUE; + time->wMonth = 0; + + for (i = 0; i < 12; i++) + { + if (toupperW( month[i][0]) == toupperW( s[0] ) && + toupperW( month[i][1]) == toupperW( s[1] ) && + toupperW( month[i][2]) == toupperW( s[2] ) ) + { + time->wMonth = i + 1; + break; + } + } + if (time->wMonth == 0) return TRUE; + + while (*s && !isdigitW( *s )) s++; + if (*s == '\0') return TRUE; + time->wYear = strtolW( s, &end, 10 ); + s = end; + + while (*s && !isdigitW( *s )) s++; + if (*s == '\0') return TRUE; + time->wHour = strtolW( s, &end, 10 ); + s = end; + + while (*s && !isdigitW( *s )) s++; + if (*s == '\0') return TRUE; + time->wMinute = strtolW( s, &end, 10 ); + s = end; + + while (*s && !isdigitW( *s )) s++; + if (*s == '\0') return TRUE; + time->wSecond = strtolW( s, &end, 10 ); + s = end; + + time->wMilliseconds = 0; + return TRUE; +} diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index abfa713a052..395d66f3b14 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -151,8 +151,8 @@ static void test_WinHttpTimeFromSystemTime(void) WCHAR time_string[WINHTTP_TIME_FORMAT_BUFSIZE+1]; ret = WinHttpTimeFromSystemTime(&time, time_string); - todo_wine ok(ret == TRUE, "WinHttpTimeFromSystemTime failed: %u\n", GetLastError()); - todo_wine ok(memcmp(time_string, expected_string, sizeof(expected_string)) == 0, + ok(ret == TRUE, "WinHttpTimeFromSystemTime failed: %u\n", GetLastError()); + ok(memcmp(time_string, expected_string, sizeof(expected_string)) == 0, "Time string returned did not match expected time string.\n"); } @@ -169,13 +169,13 @@ static void test_WinHttpTimeToSystemTime(void) '1','0',' ','0','5',' ','5','2','\n',0}; ret = WinHttpTimeToSystemTime(time_string1, &time); - todo_wine ok(ret == TRUE, "WinHttpTimeToSystemTime failed: %u\n", GetLastError()); - todo_wine ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0, + ok(ret == TRUE, "WinHttpTimeToSystemTime failed: %u\n", GetLastError()); + ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0, "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n"); ret = WinHttpTimeToSystemTime(time_string2, &time); - todo_wine ok(ret == TRUE, "WinHttpTimeToSystemTime failed: %u\n", GetLastError()); - todo_wine ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0, + ok(ret == TRUE, "WinHttpTimeToSystemTime failed: %u\n", GetLastError()); + ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0, "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n"); } -- 2.11.4.GIT