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 + -
显示快捷键?