syncmltransport.cpp
来自「funambol windows mobile plugin source co」· C++ 代码 · 共 1,886 行 · 第 1/4 页
CPP
1,886 行
/*
if(_tcscmp(pszName,kszCapHTMLMail ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapAmountToFetch ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapAttachAmount ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapAgeFilter ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapSaveSent ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapSMSUnicode ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapSMTPAuthenticate ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapIncludeOriginal ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapIndentBody ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapAddLeading ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapLeadChar ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapSyncMsgClasses ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapSyncMsgClassDef ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapPropDialog ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapSyncHierarchy ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapDeleteAction ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapMoveToTrash ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapReturnAddress ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapCreateSpecialFldrs ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapFolders ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapFolderNotifications ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapClearAll ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapEmptyDeleteItem ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapEditProperties ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapFolderOptions ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapMgmtFolder ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapSync ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapSyncOnDockEvent ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapConnect ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapRequireRadio ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapMarkAttachments ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapReplyAll ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapAlwaysIncludeOriginal ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapCompose ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapOfflineStatus ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapCallSender ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapLanguage ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapAttachments ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapFolderManagementAllowCreate ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapFolderManagementAllowRename ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
if(_tcscmp(pszName,kszCapFolderManagementAllowDelete ) == 0) {LOG.debug("Property name: %S. Value: %ul", pszName,pval->Value.ul); }
*/
// Test pszName against the specific capability strings that the
// transport supports, and return the requested value when a match
// is found. If no match is found, return MAPI_E_NOT_FOUND.
// [ Omitted ]
//MessageBox(0, pszName, L"GetCapability", MB_OK);
/*
* This property allows to show the UI to modify the parameters
* if the value is 0 the default appears, if the value is 1 the custom appears.
* The custom must be implmented into DoProperties method
* HRESULT CTransportSyncHandler::DoProperties(HWND hwndParent)
*/
if(_tcscmp(pszName, kszCapPropDialog) == 0) {
pval->Value.ul = 0;
return S_OK;
}
//
// Disable the sync on dock event. Default is TRUE. We set to FALSE
//
if(_tcscmp(pszName, kszCapSyncOnDockEvent) == 0) {
pval->Value.ul = 0;
return S_OK;
}
//
// Allows to create new mail. Default is TRUE. Maybe changing the kszCapSyncOnDockEvent
// we must reset it too
//
if(_tcscmp(pszName, kszCapCompose) == 0) {
pval->Value.ul = 1;
return S_OK;
}
//
// Allows to reply all: default is TRUE. Maybe changing the kszCapSyncOnDockEvent
// we must reset it too
//
if(_tcscmp(pszName, kszCapReplyAll) == 0) {
pval->Value.ul = 1;
return S_OK;
}
#if _WIN32_WCE > 0x501
if(_tcscmp(pszName, kszCapConnectHomeNetwork) == 0) {
pval->Value.ul = 1;
return S_OK;
}
#endif
//
// It disables the capability to manage folders...
//
/*
if(_tcscmp(pszName, kszCapMgmtFolder) == 0) {
pval->Value.ul = 0;
return S_OK;
}
if(_tcscmp(pszName, kszCapAmountToFetch) == 0) {
LOG.debug("kszCapAmountToFetch %ul", pval->Value.ul);
return S_OK;
}
if(_tcscmp(pszName, kszCapAttachAmount) == 0) {
LOG.debug("kszCapAttachAmount %ul", pval->Value.ul);
return S_OK;
}
if(_tcscmp(pszName, kszCapAttachAmount) == 0) {
LOG.debug("kszCapAttachAmount %ul", pval->Value.ul);
return S_OK;
}
*/
return hr;
}
/////////////////////////////////////////////////////////////////////////////
//
// CTransportSyncHandler::SetCapability()
//
// Description:
// This DLL entry point is used by the Inbox to set various settings
// and limits in the transport. This is called when the user makes an
// alteration(e.g. via the wizard) to a service that uses this transport.
//
// See GetCapability() for a list of capabilities.
//
// Parameters:
// pszName IN String identifying the capability being queried
// pval IN Value of the capability being queried
//
// Returns: HRESULT
//
/////////////////////////////////////////////////////////////////////////////
HRESULT CTransportSyncHandler::SetCapability(
LPCWSTR pszName,
LPSPropValue pval
)
{
ULONG * pnVal = NULL;
HRESULT hr = S_OK;
if ((pszName == NULL) ||(pval == NULL))
{
hr = E_INVALIDARG;
}
//MessageBox(0, pszName, L"SetCapability", MB_OK);
// Test pszName against the specific capability strings that the
// transport supports, and set the requested value when a match
// is found. If no match is found, return MAPI_E_NOT_FOUND.
// [ Omitted ]
return hr;
}
/////////////////////////////////////////////////////////////////////////////
//
// CTransportSyncHandler::DecodeEvent()
//
// Description:
// This DLL entry point is used by the Inbox to map a transport event
// to an descriptive string.
//
// Parameters:
// pevt IN Event to map
// ppszEvent OUT String describing the event
//
// Returns: HRESULT
//
/////////////////////////////////////////////////////////////////////////////
HRESULT CTransportSyncHandler::DecodeEvent(
TRANSPORTEVENT * pevt,
LPWSTR * ppszEvent
)
{
UINT nStringId = 0;
LPCTSTR pszFormat;
HRESULT hr;
//MessageBox(NULL, L"DecodeEvent", L"TransportDemo", MB_OK);
ASSERT(pevt != NULL);
// We use cbData to determine whether the error is Send or Receive related.
BOOL fReceiving =(pevt->cbData != 0);
switch (pevt->hr)
{
// Map HRESULTs to error string resource IDs here:
// General errors...
case E_OUTOFMEMORY:
//nStringId = IDS_ERROR_OUTOFMEMORY;
break;
// Socket errors.
case HrFromWSAError(WSAETIMEDOUT):
//nStringId = IDS_ERROR_TIMEDOUT;
break;
case HrFromWSAError(WSAHOST_NOT_FOUND):
case HrFromWSAError(WSAENOTCONN):
case HrFromWSAError(WSATRY_AGAIN): //Non-Authoritative Host not found
case HrFromWSAError(WSANOTINITIALISED): // Can be returned by GetHostByName / Successful WSASTARTUP not yet performed
//nStringId =(fReceiving ? IDS_ERROR_SERVERNOTFOUND_INCOMING :
// IDS_ERROR_SERVERNOTFOUND_OUTGOING);
break;
case HrFromWSAError(WSAECONNREFUSED): // Happens if user supplied wrong port number.
//nStringId =(fReceiving ? IDS_ERROR_SERVERNOTREADY_INCOMING :
// IDS_ERROR_SERVERNOTREADY_OUTGOING);
break;
case CEMAPI_E_PROTOCOL_ERROR:
//nStringId = IDS_ERROR_LOGIN_INCOMING;
break;
case CEMAPI_E_PLAINTEXT_NOTSUPPORTED:
//nStringId = IDS_IMAP_NO_PLAINTEXT;
break;
case CEMAPI_E_NO_ACCOUNT_INFO:
//nStringId = IDS_ERROR_LOGIN_INCOMING;
break;
case E_FAIL:
//nStringId = IDS_ERROR_NO_NETWORK;
break;
// Logon error...
case ERROR_LOGON_FAILURE:
//nStringId =(fReceiving ? IDS_ERROR_LOGIN_INCOMING :
// IDS_ERROR_LOGIN_OUTGOING);
break;
// POP uses this report that the server didn't like initial connection.
case ERROR_NOT_READY:
//nStringId = IDS_ERROR_SERVERNOTREADY_INCOMING;
break;
// Handle errors specific to this transport
/*
case TRANSPORTDEMO_???:
nStringId = IDS_ERROR_SERVEROVERLOADED;
break;
*/
default: // General failure message.
//nStringId =(fReceiving ? IDS_ERROR_UNKNOWN_INCOMING :
// IDS_ERROR_UNKNOWN_OUTGOING);
break;
}
pszFormat =(LPCTSTR)LoadString(g_hInst, nStringId, 0, 0);
if(NULL == pszFormat)
{
hr = E_FAIL;
goto Exit;
}
hr = m_pCallback->AllocateMem((lstrlen(pszFormat) + 1) * sizeof(WCHAR),(LPBYTE*) ppszEvent);
if(FAILED(hr))
{
goto Exit;
}
// Everything worked ok.
wcscpy(*ppszEvent, pszFormat);
Exit:
return hr;
}
/////////////////////////////////////////////////////////////////////////////
//
// CTransportSyncHandler::GetFolderHierarchy()
//
// Description:
// This DLL entry point is used by the Inbox to retrieve the complete
// folder hierarchy for the current service(m_pszProfile).
//
// Parameters:
// ppRootNode OUT Folder hierarchy
//
// Returns: HRESULT
//
/////////////////////////////////////////////////////////////////////////////
HRESULT CTransportSyncHandler::GetFolderHierarchy(
FOLDERNODE ** ppRootNode
)
{
HRESULT hr = S_OK;
// MessageBox(NULL, L"GetFolderHierarchy", L"TransportDemo", MB_OK);
ASSERT(ppRootNode);
// Allocate the FOLDERNODE
hr = m_pCallback->AllocateMem(sizeof(FOLDERNODE),(LPBYTE *) ppRootNode);
if(FAILED(hr))
{
hr = E_FAIL;
goto Exit;
}
ZeroMemory(*ppRootNode, sizeof(FOLDERNODE));
// Traverse the folder hierarchy and populate the ppRootNode tree.
// This data can come from CEMAPI(GetHierarchyTable()), or some other
// data store if the CEMAPI folder hierarchy doesn't accurately represent
// the server's hierarchy(eg, you only create synced folders in CEMAPI).
// [ Omitted ]
Exit:
return hr;
}
/////////////////////////////////////////////////////////////////////////////
//
// CTransportSyncHandler::SetFolderOptions()
//
// Description:
// This DLL entry point is used by Inbox to perform various configuration
// options on folders, if the transport supports folder synchronization.
//
// Parameters:
// pfldr IN Folder being modified
// pnode IN Folder structure for folder being modified
// opts IN Requested operation
// pval OUT Value requested(depends on opts)
//
// Returns: HRESULT
//
/////////////////////////////////////////////////////////////////////////////
HRESULT CTransportSyncHandler::SetFolderOptions(
LPMAPIFOLDER pfldr,
FOLDERNODE* pnode,
FOLDEROPTIONS opts,
LPSPropValue pval
)
{
HRESULT hr = MAPI_E_INVALID_PARAMETER;
// MessageBox(NULL, L"DoProperties", L"TransportDemo", MB_OK);
if (!pfldr)
{
return hr;
}
switch (opts)
{
case IMailSyncHandler::koptDownload:
if(pval != NULL && pval->ulPropTag == PT_BOOLEAN)
{
hr = OnFolderOptions_Download(pfldr, pval);
}
break;
case IMailSyncHandler::koptQueryDownload:
if(pval != NULL)
{
hr = OnFolderOptions_QueryDownload(pfldr, pval);
}
break;
case IMailSyncHandler::koptCreate:
hr = OnFolderOptions_Create(&pfldr);
break;
case IMailSyncHandler::koptQueryCreate:
if(pval != NULL)
{
hr = OnFolderOptions_QueryCreate(pfldr, pval);
}
break;
case IMailSyncHandler::koptSetAge:
case IMailSyncHandler::koptSetBodyFetchSize:
case IMailSyncHandler::koptSetAttachFetchSize:
if(pval != NULL)
{
hr = OnFolderOptions_SetFetchOption(opts, pfldr, pval);
}
break;
case IMailSyncHandler::koptGetAge:
case IMailSyncHandler::koptGetBodyFetchSize:
case IMailSyncHandler::koptGetAttachFetchSize:
if(pval != NULL)
{
hr = OnFolderOptions_GetFetchOption(opts, pfldr, pval);
}
break;
default:
break;
}
return hr;
}
/////////////////////////////////////////////////////////////////////////////
//
// CTransportSyncHandler::SetStatusText()
//
// Description:
// Uses a callback to set the status bar text in Inbox.
//
// Parameters:
// nId IN Resource ID for string to display
//
// Returns: void
//
/////////////////////////////////////////////////////////////////////////////
void CTransportSyncHandler::SetStatusText(
UINT nId
)
{
SYNCPROGRESSITEM item = { 0 };
item.cbSize = sizeof(item);
item.mask = SYNCPROGRESSITEM_STATUSTEXT;
item.pwszStatusText =(LPCTSTR) LoadString(getLocalizationUtils()->getLocaleResource(), nId, 0, 0);
//item.pwszStatusText =(LPCTSTR) LoadString(g_hInst, nId, 0, 0);
ASSERT(item.pwszStatusText != NULL);
if(m_pCallback != NULL)
{
m_pCallback->Progress(m_pszProfile, &item);
}
}
/////////////////////////////////////////////////////////////////////////////
//
// CTransportSyncHandler::SendProgressMessage()
//
// Description:
// Uses a callback to set the sync progress in Inbox. Currently
// only appropriate for SYNCPROGRESSITEM_DISCONNECTED.
//
// Parameters:
// dwMask IN SYNCPROGRESSITEM_xxx from cemapi.h
//
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?