Hans Leidekker : inetcomm: Support both forms of the UIDL and LIST commands .

Alexandre Julliard julliard at winehq.org
Mon Nov 10 07:43:50 CST 2008


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Nov  7 15:06:51 2008 +0100

inetcomm: Support both forms of the UIDL and LIST commands.

---

 dlls/inetcomm/pop3transport.c |   54 ++++++++++++++++++++++++++++++++++++----
 1 files changed, 48 insertions(+), 6 deletions(-)

diff --git a/dlls/inetcomm/pop3transport.c b/dlls/inetcomm/pop3transport.c
index c11d00d..1208ff8 100644
--- a/dlls/inetcomm/pop3transport.c
+++ b/dlls/inetcomm/pop3transport.c
@@ -544,6 +544,14 @@ static void POP3Transport_CallbackProcessLISTResp(IInternetTransport *iface, cha
     }
 
     IPOP3Callback_OnResponse((IPOP3Callback *)This->InetTransport.pCallback, &response);
+
+    if (!response.fDone)
+    {
+        InternetTransport_ReadLine(&This->InetTransport, POP3Transport_CallbackProcessLISTResp);
+        return;
+    }
+
+    IPOP3Callback_OnResponse((IPOP3Callback *)This->InetTransport.pCallback, &response);
 }
 
 static void POP3Transport_CallbackRecvLISTResp(IInternetTransport *iface, char *pBuffer, int cbBuffer)
@@ -570,6 +578,14 @@ static void POP3Transport_CallbackProcessUIDLResp(IInternetTransport *iface, cha
     }
 
     IPOP3Callback_OnResponse((IPOP3Callback *)This->InetTransport.pCallback, &response);
+
+    if (!response.fDone)
+    {
+        InternetTransport_ReadLine(&This->InetTransport, POP3Transport_CallbackProcessUIDLResp);
+        return;
+    }
+
+    IPOP3Callback_OnResponse((IPOP3Callback *)This->InetTransport.pCallback, &response);
 }
 
 static void POP3Transport_CallbackRecvUIDLResp(IInternetTransport *iface, char *pBuffer, int cbBuffer)
@@ -884,7 +900,7 @@ static HRESULT WINAPI POP3Transport_CommandUSER(IPOP3Transport *iface, LPSTR use
     TRACE("(%s)\n", username);
 
     len = sizeof(user) + strlen(username) + 2; /* "\r\n" */
-    command = HeapAlloc(GetProcessHeap(), 0, len);
+    if (!(command = HeapAlloc(GetProcessHeap(), 0, len))) return S_FALSE;
 
     strcpy(command, user);
     strcat(command, username);
@@ -907,7 +923,7 @@ static HRESULT WINAPI POP3Transport_CommandPASS(IPOP3Transport *iface, LPSTR pas
     TRACE("(%p)\n", password);
 
     len = sizeof(pass) + strlen(password) + 2; /* "\r\n" */
-    command = HeapAlloc(GetProcessHeap(), 0, len);
+    if (!(command = HeapAlloc(GetProcessHeap(), 0, len))) return S_FALSE;
 
     strcpy(command, pass);
     strcat(command, password);
@@ -923,13 +939,26 @@ static HRESULT WINAPI POP3Transport_CommandPASS(IPOP3Transport *iface, LPSTR pas
 static HRESULT WINAPI POP3Transport_CommandLIST(
     IPOP3Transport *iface, POP3CMDTYPE cmdtype, DWORD dwPopId)
 {
-    static char list[] = "LIST\r\n";
+    static char list[] = "LIST %u\r\n";
+    static char list_all[] = "LIST\r\n";
     POP3Transport *This = (POP3Transport *)iface;
+    char *command;
+    int len;
 
     TRACE("(%u, %u)\n", cmdtype, dwPopId);
 
+    if (dwPopId)
+    {
+        len = sizeof(list) + 10 + 2; /* "4294967296" + "\r\n" */
+        if (!(command = HeapAlloc(GetProcessHeap(), 0, len))) return S_FALSE;
+        sprintf(command, list, dwPopId);
+    }
+    else command = list_all;
+
     init_parser(This, POP3_LIST, cmdtype);
-    InternetTransport_DoCommand(&This->InetTransport, list, POP3Transport_CallbackRecvLISTResp);
+    InternetTransport_DoCommand(&This->InetTransport, command, POP3Transport_CallbackRecvLISTResp);
+
+    if (dwPopId) HeapFree(GetProcessHeap(), 0, command);
     return S_OK;
 }
 
@@ -1005,13 +1034,26 @@ static HRESULT WINAPI POP3Transport_CommandRSET(IPOP3Transport *iface)
 static HRESULT WINAPI POP3Transport_CommandUIDL(
     IPOP3Transport *iface, POP3CMDTYPE cmdtype, DWORD dwPopId)
 {
-    static char uidl[] = "UIDL\r\n";
+    static char uidl[] = "UIDL %u\r\n";
+    static char uidl_all[] = "UIDL\r\n";
     POP3Transport *This = (POP3Transport *)iface;
+    char *command;
+    int len;
 
     TRACE("(%u, %u)\n", cmdtype, dwPopId);
 
+    if (dwPopId)
+    {
+        len = sizeof(uidl) + 10 + 2; /* "4294967296" + "\r\n" */
+        if (!(command = HeapAlloc(GetProcessHeap(), 0, len))) return S_FALSE;
+        sprintf(command, uidl, dwPopId);
+    }
+    else command = uidl_all;
+
     init_parser(This, POP3_UIDL, cmdtype);
-    InternetTransport_DoCommand(&This->InetTransport, uidl, POP3Transport_CallbackRecvUIDLResp);
+    InternetTransport_DoCommand(&This->InetTransport, command, POP3Transport_CallbackRecvUIDLResp);
+
+    if (dwPopId) HeapFree(GetProcessHeap(), 0, command);
     return S_OK;
 }
 




More information about the wine-cvs mailing list