| /* | |
| * IMAP Transport | |
| * | |
| * Copyright 2008 Hans Leidekker for CodeWeavers | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #define COBJMACROS | |
| #include <stdarg.h> | |
| #include <stdio.h> | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "winnt.h" | |
| #include "winuser.h" | |
| #include "objbase.h" | |
| #include "mimeole.h" | |
| #include "wine/debug.h" | |
| #include "inetcomm_private.h" | |
| WINE_DEFAULT_DEBUG_CHANNEL(inetcomm); | |
| typedef struct | |
| { | |
| InternetTransport InetTransport; | |
| ULONG refs; | |
| } IMAPTransport; | |
| static HRESULT WINAPI IMAPTransport_QueryInterface(IIMAPTransport *iface, REFIID riid, void **ppv) | |
| { | |
| TRACE("(%s, %p)\n", debugstr_guid(riid), ppv); | |
| if (IsEqualIID(riid, &IID_IUnknown) || | |
| IsEqualIID(riid, &IID_IInternetTransport) || | |
| IsEqualIID(riid, &IID_IIMAPTransport)) | |
| { | |
| *ppv = iface; | |
| IUnknown_AddRef(iface); | |
| return S_OK; | |
| } | |
| *ppv = NULL; | |
| FIXME("no interface for %s\n", debugstr_guid(riid)); | |
| return E_NOINTERFACE; | |
| } | |
| static ULONG WINAPI IMAPTransport_AddRef(IIMAPTransport *iface) | |
| { | |
| IMAPTransport *This = (IMAPTransport *)iface; | |
| return InterlockedIncrement((LONG *)&This->refs); | |
| } | |
| static ULONG WINAPI IMAPTransport_Release(IIMAPTransport *iface) | |
| { | |
| IMAPTransport *This = (IMAPTransport *)iface; | |
| ULONG refs = InterlockedDecrement((LONG *)&This->refs); | |
| if (!refs) | |
| { | |
| TRACE("destroying %p\n", This); | |
| if (This->InetTransport.Status != IXP_DISCONNECTED) | |
| InternetTransport_DropConnection(&This->InetTransport); | |
| if (This->InetTransport.pCallback) ITransportCallback_Release(This->InetTransport.pCallback); | |
| HeapFree(GetProcessHeap(), 0, This); | |
| } | |
| return refs; | |
| } | |
| static HRESULT WINAPI IMAPTransport_GetServerInfo(IIMAPTransport *iface, | |
| LPINETSERVER pInetServer) | |
| { | |
| IMAPTransport *This = (IMAPTransport *)iface; | |
| TRACE("(%p)\n", pInetServer); | |
| return InternetTransport_GetServerInfo(&This->InetTransport, pInetServer); | |
| } | |
| static IXPTYPE WINAPI IMAPTransport_GetIXPType(IIMAPTransport *iface) | |
| { | |
| TRACE("()\n"); | |
| return IXP_IMAP; | |
| } | |
| static HRESULT WINAPI IMAPTransport_IsState(IIMAPTransport *iface, | |
| IXPISSTATE isstate) | |
| { | |
| FIXME("(%d): stub\n", isstate); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_InetServerFromAccount( | |
| IIMAPTransport *iface, IImnAccount *pAccount, LPINETSERVER pInetServer) | |
| { | |
| IMAPTransport *This = (IMAPTransport *)iface; | |
| TRACE("(%p, %p)\n", pAccount, pInetServer); | |
| return InternetTransport_InetServerFromAccount(&This->InetTransport, pAccount, pInetServer); | |
| } | |
| static HRESULT WINAPI IMAPTransport_Connect(IIMAPTransport *iface, | |
| LPINETSERVER pInetServer, boolean fAuthenticate, boolean fCommandLogging) | |
| { | |
| IMAPTransport *This = (IMAPTransport *)iface; | |
| HRESULT hr; | |
| TRACE("(%p, %s, %s)\n", pInetServer, fAuthenticate ? "TRUE" : "FALSE", fCommandLogging ? "TRUE" : "FALSE"); | |
| hr = InternetTransport_Connect(&This->InetTransport, pInetServer, fAuthenticate, fCommandLogging); | |
| return hr; | |
| } | |
| static HRESULT WINAPI IMAPTransport_HandsOffCallback(IIMAPTransport *iface) | |
| { | |
| IMAPTransport *This = (IMAPTransport *)iface; | |
| TRACE("()\n"); | |
| return InternetTransport_HandsOffCallback(&This->InetTransport); | |
| } | |
| static HRESULT WINAPI IMAPTransport_Disconnect(IIMAPTransport *iface) | |
| { | |
| FIXME("(): stub\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_DropConnection(IIMAPTransport *iface) | |
| { | |
| IMAPTransport *This = (IMAPTransport *)iface; | |
| TRACE("()\n"); | |
| return InternetTransport_DropConnection(&This->InetTransport); | |
| } | |
| static HRESULT WINAPI IMAPTransport_GetStatus(IIMAPTransport *iface, | |
| IXPSTATUS *pCurrentStatus) | |
| { | |
| IMAPTransport *This = (IMAPTransport *)iface; | |
| TRACE("()\n"); | |
| return InternetTransport_GetStatus(&This->InetTransport, pCurrentStatus); | |
| } | |
| static HRESULT WINAPI IMAPTransport_InitNew(IIMAPTransport *iface, | |
| LPSTR pszLogFilePath, IIMAPCallback *pCallback) | |
| { | |
| IMAPTransport *This = (IMAPTransport *)iface; | |
| TRACE("(%s, %p)\n", debugstr_a(pszLogFilePath), pCallback); | |
| if (!pCallback) | |
| return E_INVALIDARG; | |
| if (pszLogFilePath) | |
| FIXME("not using log file of %s, use Wine debug logging instead\n", | |
| debugstr_a(pszLogFilePath)); | |
| IIMAPCallback_AddRef(pCallback); | |
| This->InetTransport.pCallback = (ITransportCallback *)pCallback; | |
| This->InetTransport.fInitialised = TRUE; | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI IMAPTransport_NewIRangeList(IIMAPTransport *iface, | |
| IRangeList **pprlNewRangeList) | |
| { | |
| FIXME("(%p): stub\n", pprlNewRangeList); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Capability(IIMAPTransport *iface, | |
| DWORD *pdwCapabilityFlags) | |
| { | |
| FIXME("(%p): stub\n", pdwCapabilityFlags); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Select(IIMAPTransport *iface, | |
| WPARAM wParam, LPARAM lParam, IIMAPCallback *pCBHandler, LPSTR lpszMailboxName) | |
| { | |
| FIXME("(%ld, %ld, %p, %s): stub\n", wParam, lParam, pCBHandler, debugstr_a(lpszMailboxName)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Examine(IIMAPTransport *iface, | |
| WPARAM wParam, LPARAM lParam, IIMAPCallback *pCBHandler, LPSTR lpszMailboxName) | |
| { | |
| FIXME("(%ld, %ld, %p, %s): stub\n", wParam, lParam, pCBHandler, debugstr_a(lpszMailboxName)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Create(IIMAPTransport *iface, | |
| WPARAM wParam, LPARAM lParam, IIMAPCallback *pCBHandler, LPSTR lpszMailboxName) | |
| { | |
| FIXME("(%ld, %ld, %p, %s): stub\n", wParam, lParam, pCBHandler, debugstr_a(lpszMailboxName)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Delete(IIMAPTransport *iface, | |
| WPARAM wParam, LPARAM lParam, IIMAPCallback *pCBHandler, LPSTR lpszMailboxName) | |
| { | |
| FIXME("(%ld, %ld, %p, %s): stub\n", wParam, lParam, pCBHandler, debugstr_a(lpszMailboxName)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Rename(IIMAPTransport *iface, WPARAM wParam, LPARAM lParam, | |
| IIMAPCallback *pCBHandler, LPSTR lpszMailboxName, LPSTR lpszNewMailboxName) | |
| { | |
| FIXME("(%ld, %ld, %p, %s, %s): stub\n", wParam, lParam, pCBHandler, | |
| debugstr_a(lpszMailboxName), debugstr_a(lpszNewMailboxName)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Subscribe(IIMAPTransport *iface, | |
| WPARAM wParam, LPARAM lParam, IIMAPCallback *pCBHandler, LPSTR lpszMailboxName) | |
| { | |
| FIXME("(%ld, %ld, %p, %s): stub\n", wParam, lParam, pCBHandler, debugstr_a(lpszMailboxName)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Unsubscribe(IIMAPTransport *iface, | |
| WPARAM wParam, LPARAM lParam, IIMAPCallback *pCBHandler, LPSTR lpszMailboxName) | |
| { | |
| FIXME("(%ld, %ld, %p, %s): stub\n", wParam, lParam, pCBHandler, debugstr_a(lpszMailboxName)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_List(IIMAPTransport *iface, WPARAM wParam, LPARAM lParam, | |
| IIMAPCallback *pCBHandler, LPSTR lpszMailboxNameReference, LPSTR lpszMailboxNamePattern) | |
| { | |
| FIXME("(%ld, %ld, %p, %s, %s): stub\n", wParam, lParam, pCBHandler, | |
| debugstr_a(lpszMailboxNameReference), debugstr_a(lpszMailboxNamePattern)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Lsub(IIMAPTransport *iface, WPARAM wParam, LPARAM lParam, | |
| IIMAPCallback *pCBHandler, LPSTR lpszMailboxNameReference, LPSTR lpszMailboxNamePattern) | |
| { | |
| FIXME("(%ld, %ld, %p, %s, %s): stub\n", wParam, lParam, pCBHandler, | |
| debugstr_a(lpszMailboxNameReference), debugstr_a(lpszMailboxNamePattern)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Append(IIMAPTransport *iface, | |
| WPARAM wParam, LPARAM lParam, IIMAPCallback *pCBHandler, LPSTR lpszMailboxName, | |
| LPSTR lpszMessageFlags, FILETIME ftMessageDateTime, LPSTREAM lpstmMessageToSave) | |
| { | |
| FIXME("(%ld, %ld, %p, %s, %s, %p): stub\n", wParam, lParam, pCBHandler, | |
| debugstr_a(lpszMailboxName), debugstr_a(lpszMessageFlags), lpstmMessageToSave); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Close(IIMAPTransport *iface, | |
| WPARAM wParam, LPARAM lParam, IIMAPCallback *pCBHandler) | |
| { | |
| FIXME("(%ld, %ld, %p): stub\n", wParam, lParam, pCBHandler); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Expunge(IIMAPTransport *iface, | |
| WPARAM wParam, LPARAM lParam, IIMAPCallback *pCBHandler) | |
| { | |
| FIXME("(%ld, %ld, %p): stub\n", wParam, lParam, pCBHandler); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Search(IIMAPTransport *iface, | |
| WPARAM wParam, LPARAM lParam, IIMAPCallback *pCBHandler, LPSTR lpszSearchCriteria, | |
| boolean bReturnUIDs, IRangeList *pMsgRange, boolean bUIDRangeList) | |
| { | |
| FIXME("(%ld, %ld, %p, %s, %d, %p, %d): stub\n", wParam, lParam, pCBHandler, | |
| debugstr_a(lpszSearchCriteria), bReturnUIDs, pMsgRange, bUIDRangeList); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Fetch(IIMAPTransport *iface, WPARAM wParam, LPARAM lParam, | |
| IIMAPCallback *pCBHandler, IRangeList *pMsgRange, boolean bUIDMsgRange, LPSTR lpszFetchArgs) | |
| { | |
| FIXME("(%ld, %ld, %p, %p, %d, %s): stub\n", wParam, lParam, pCBHandler, pMsgRange, | |
| bUIDMsgRange, debugstr_a(lpszFetchArgs)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Store(IIMAPTransport *iface, WPARAM wParam, LPARAM lParam, | |
| IIMAPCallback *pCBHandler, IRangeList *pMsgRange, boolean bUIDRangeList, LPSTR lpszStoreArgs) | |
| { | |
| FIXME("(%ld, %ld, %p, %p, %d, %s): stub\n", wParam, lParam, pCBHandler, pMsgRange, | |
| bUIDRangeList, debugstr_a(lpszStoreArgs)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Copy(IIMAPTransport *iface, WPARAM wParam, LPARAM lParam, | |
| IIMAPCallback *pCBHandler, IRangeList *pMsgRange, boolean bUIDRangeList, LPSTR lpszMailboxName) | |
| { | |
| FIXME("(%ld, %ld, %p, %p, %d, %s): stub\n", wParam, lParam, pCBHandler, pMsgRange, | |
| bUIDRangeList, debugstr_a(lpszMailboxName)); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Noop(IIMAPTransport *iface, | |
| WPARAM wParam, LPARAM lParam, IIMAPCallback *pCBHandler) | |
| { | |
| FIXME("(%ld, %ld, %p): stub\n", wParam, lParam, pCBHandler); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_ResizeMsgSeqNumTable(IIMAPTransport *iface, DWORD dwSizeOfMbox) | |
| { | |
| FIXME("(%u): stub\n", dwSizeOfMbox); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_UpdateSeqNumToUID(IIMAPTransport *iface, | |
| DWORD dwMsgSeqNum, DWORD dwUID) | |
| { | |
| FIXME("(%u, %u): stub\n", dwMsgSeqNum, dwUID); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_RemoveSequenceNum(IIMAPTransport *iface, DWORD dwDeletedMsgSeqNum) | |
| { | |
| FIXME("(%u): stub\n", dwDeletedMsgSeqNum); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_MsgSeqNumToUID(IIMAPTransport *iface, DWORD dwMsgSeqNum, | |
| DWORD *pdwUID) | |
| { | |
| FIXME("(%u, %p): stub\n", dwMsgSeqNum, pdwUID); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_GetMsgSeqNumToUIDArray(IIMAPTransport *iface, | |
| DWORD **ppdwMsgSeqNumToUIDArray, DWORD *pdwNumberOfElements) | |
| { | |
| FIXME("(%p, %p): stub\n", ppdwMsgSeqNumToUIDArray, pdwNumberOfElements); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_GetHighestMsgSeqNum(IIMAPTransport *iface, DWORD *pdwHighestMSN) | |
| { | |
| FIXME("(%p): stub\n", pdwHighestMSN); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_ResetMsgSeqNumToUID(IIMAPTransport *iface) | |
| { | |
| FIXME("(): stub\n"); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_SetDefaultCBHandler(IIMAPTransport *iface, IIMAPCallback *pCBHandler) | |
| { | |
| FIXME("(%p): stub\n", pCBHandler); | |
| return E_NOTIMPL; | |
| } | |
| static HRESULT WINAPI IMAPTransport_Status(IIMAPTransport *iface, WPARAM wParam, LPARAM lParam, | |
| IIMAPCallback *pCBHandler, LPSTR pszMailboxName, LPSTR pszStatusCmdArgs) | |
| { | |
| FIXME("(%ld, %ld, %p, %s, %s): stub\n", wParam, lParam, pCBHandler, | |
| debugstr_a(pszMailboxName), debugstr_a(pszStatusCmdArgs)); | |
| return E_NOTIMPL; | |
| } | |
| static const IIMAPTransportVtbl IMAPTransportVtbl = | |
| { | |
| IMAPTransport_QueryInterface, | |
| IMAPTransport_AddRef, | |
| IMAPTransport_Release, | |
| IMAPTransport_GetServerInfo, | |
| IMAPTransport_GetIXPType, | |
| IMAPTransport_IsState, | |
| IMAPTransport_InetServerFromAccount, | |
| IMAPTransport_Connect, | |
| IMAPTransport_HandsOffCallback, | |
| IMAPTransport_Disconnect, | |
| IMAPTransport_DropConnection, | |
| IMAPTransport_GetStatus, | |
| IMAPTransport_InitNew, | |
| IMAPTransport_NewIRangeList, | |
| IMAPTransport_Capability, | |
| IMAPTransport_Select, | |
| IMAPTransport_Examine, | |
| IMAPTransport_Create, | |
| IMAPTransport_Delete, | |
| IMAPTransport_Rename, | |
| IMAPTransport_Subscribe, | |
| IMAPTransport_Unsubscribe, | |
| IMAPTransport_List, | |
| IMAPTransport_Lsub, | |
| IMAPTransport_Append, | |
| IMAPTransport_Close, | |
| IMAPTransport_Expunge, | |
| IMAPTransport_Search, | |
| IMAPTransport_Fetch, | |
| IMAPTransport_Store, | |
| IMAPTransport_Copy, | |
| IMAPTransport_Noop, | |
| IMAPTransport_ResizeMsgSeqNumTable, | |
| IMAPTransport_UpdateSeqNumToUID, | |
| IMAPTransport_RemoveSequenceNum, | |
| IMAPTransport_MsgSeqNumToUID, | |
| IMAPTransport_GetMsgSeqNumToUIDArray, | |
| IMAPTransport_GetHighestMsgSeqNum, | |
| IMAPTransport_ResetMsgSeqNumToUID, | |
| IMAPTransport_SetDefaultCBHandler, | |
| IMAPTransport_Status | |
| }; | |
| HRESULT WINAPI CreateIMAPTransport(IIMAPTransport **ppTransport) | |
| { | |
| HRESULT hr; | |
| IMAPTransport *This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This)); | |
| if (!This) | |
| return E_OUTOFMEMORY; | |
| This->InetTransport.u.vtblIMAP = &IMAPTransportVtbl; | |
| This->refs = 0; | |
| hr = InternetTransport_Init(&This->InetTransport); | |
| if (FAILED(hr)) | |
| { | |
| HeapFree(GetProcessHeap(), 0, This); | |
| return hr; | |
| } | |
| *ppTransport = (IIMAPTransport *)&This->InetTransport.u.vtblIMAP; | |
| IIMAPTransport_AddRef(*ppTransport); | |
| return S_OK; | |
| } | |
| static HRESULT WINAPI IMAPTransportCF_QueryInterface(LPCLASSFACTORY iface, | |
| REFIID riid, LPVOID *ppv) | |
| { | |
| *ppv = NULL; | |
| if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory)) | |
| { | |
| *ppv = iface; | |
| IUnknown_AddRef(iface); | |
| return S_OK; | |
| } | |
| return E_NOINTERFACE; | |
| } | |
| static ULONG WINAPI IMAPTransportCF_AddRef(LPCLASSFACTORY iface) | |
| { | |
| return 2; /* non-heap based object */ | |
| } | |
| static ULONG WINAPI IMAPTransportCF_Release(LPCLASSFACTORY iface) | |
| { | |
| return 1; /* non-heap based object */ | |
| } | |
| static HRESULT WINAPI IMAPTransportCF_CreateInstance(LPCLASSFACTORY iface, | |
| LPUNKNOWN pUnk, REFIID riid, LPVOID *ppv) | |
| { | |
| HRESULT hr; | |
| IIMAPTransport *pImapTransport; | |
| TRACE("(%p, %s, %p)\n", pUnk, debugstr_guid(riid), ppv); | |
| *ppv = NULL; | |
| if (pUnk) | |
| return CLASS_E_NOAGGREGATION; | |
| hr = CreateIMAPTransport(&pImapTransport); | |
| if (FAILED(hr)) | |
| return hr; | |
| hr = IIMAPTransport_QueryInterface(pImapTransport, riid, ppv); | |
| IIMAPTransport_Release(pImapTransport); | |
| return hr; | |
| } | |
| static HRESULT WINAPI IMAPTransportCF_LockServer(LPCLASSFACTORY iface, BOOL fLock) | |
| { | |
| FIXME("(%d), stub!\n",fLock); | |
| return S_OK; | |
| } | |
| static const IClassFactoryVtbl IMAPTransportCFVtbl = | |
| { | |
| IMAPTransportCF_QueryInterface, | |
| IMAPTransportCF_AddRef, | |
| IMAPTransportCF_Release, | |
| IMAPTransportCF_CreateInstance, | |
| IMAPTransportCF_LockServer | |
| }; | |
| static const IClassFactoryVtbl *IMAPTransportCF = &IMAPTransportCFVtbl; | |
| HRESULT IMAPTransportCF_Create(REFIID riid, LPVOID *ppv) | |
| { | |
| return IClassFactory_QueryInterface((IClassFactory *)&IMAPTransportCF, riid, ppv); | |
| } |