Hans Leidekker : winhttp: Implement WinHttpTimeFromSystemTime and WinHttpTimeToSystemTime.

Alexandre Julliard julliard at winehq.org
Tue Aug 19 08:46:59 CDT 2008


Module: wine
Branch: master
Commit: 250cac32ca5ff4e7c282bd25abb4f1ae171476b8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=250cac32ca5ff4e7c282bd25abb4f1ae171476b8

Author: Hans Leidekker <hans at meelstraat.net>
Date:   Fri Aug 15 14:44:16 2008 +0200

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 6aa59df..c503e23 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 dd612ec..eb2c71f 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 abfa713..395d66f 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");
 }
 




More information about the wine-cvs mailing list