readviewmenuext.cpp

来自「WIndows mobile 5.0 pocket pc sdk sample 」· C++ 代码 · 共 612 行 · 第 1/2 页

CPP
612
字号
    const TCHAR cszSMSService[] = TEXT("SMS");
    const TCHAR cszASyncService[] = TEXT("ActiveSync");
    
    IMAPIProp *pProp = NULL;    
    LPSPropValue pval = NULL;

    hr = GetIMAPIPropForMsg(&pProp);
    CHR(hr);    

    hr = HrGetOneProp (pProp, PR_SERVICE_NAME, &pval);
    CHR(hr);

    if ( (wcscmp(pval->Value.lpszW, cszSMSService) != 0) &&
         (wcscmp(pval->Value.lpszW, cszASyncService) != 0) )
    {
        fIsEnabled = TRUE;
    }

Error:
    return fIsEnabled;
}


///////////////////////////////////////////////////////////////////////////////
// ReplyUsing
//
//  Composes a reply to the current message using the "Outlook E-mail" account
//
HRESULT MenuExtension::ReplyUsing(void)
{
    HRESULT hr = S_OK;

    IMAPIProp *pProp = NULL;    
    
    ULONG rgTags[] = {4, PR_MESSAGE_CLASS, PR_SENDER_EMAIL_ADDRESS, PR_SUBJECT, PR_BODY};
    ULONG cProps = 0;
    LPSPropValue rgProps = NULL;

    MAILCOMPOSEFIELDS mcfReply = {0};
    LPTSTR pszReplySubject = NULL;
    LPTSTR pszReplyBody = NULL;
    LPTSTR pszOriginalBody = NULL;

    hr = GetIMAPIPropForMsg(&pProp);
    CHR(hr);
                        
    // Get the properties we are interested in from the original message
    hr = pProp->GetProps((LPSPropTagArray) rgTags, MAPI_UNICODE, &cProps, &rgProps);
    CHR(hr);


    if (PR_MESSAGE_CLASS == rgProps[0].ulPropTag)
    {
        mcfReply.pszMsgClass = rgProps[0].Value.lpszW;
    }

    if (PR_SENDER_EMAIL_ADDRESS == rgProps[1].ulPropTag)
    {
        mcfReply.pszTo = rgProps[1].Value.lpszW;
    }

    if (PR_SUBJECT == rgProps[2].ulPropTag)
    {
        hr = GetSubjectForReply(rgProps[2].Value.lpszW, &pszReplySubject);
        if (SUCCEEDED(hr))
        {
            mcfReply.pszSubject = pszReplySubject;
        }
    }

    if (PR_BODY == rgProps[3].ulPropTag)
    {            
        pszOriginalBody = rgProps[4].Value.lpszW;
    }
    else 
    {
        // Note: In this sample, we are simply extracting the PR_BODY property of the message.
        // For MIME messages, you would need to open the PR_CE_MIME_TEXT property and then parse
        // the MIME headers and content to extract the original body text to include in the reply.            
        // That is beyond the scope of what we are demonstrating here, so GetBodyForReply will simply
        // return a default string if the PR_BODY value we pass in is empty.
    }
    hr = GetBodyForReply(pszOriginalBody, &pszReplyBody);
    if (SUCCEEDED(hr))
    {
        mcfReply.pszBody= pszReplyBody;
    }
    
    // This sample replies using ActiveSync account
    mcfReply.dwFlags = MCF_ACCOUNT_IS_NAME;
    mcfReply.pszAccount = TEXT("ActiveSync");

    mcfReply.cbSize = sizeof(mcfReply);

    hr = MailComposeMessage(&mcfReply);

Error:
    MAPIFreeBuffer(rgProps);
    delete[] pszReplySubject;
    delete[] pszReplyBody;
    
    return hr;
}


///////////////////////////////////////////////////////////////////////////////
// GetSubjectForReply
//
//  This allocates a new string containing the reply subject.  
//  Caller responsible for memory cleanup.
//
HRESULT MenuExtension::GetSubjectForReply(LPCTSTR pszOriginal, LPTSTR* ppszReplySubject)
{    
    HRESULT hr = S_OK;
    const TCHAR cszReplySubjectPrefix[] = TEXT("RE: ");
    UINT cchReplySubject;

    CPR(pszOriginal);

    cchReplySubject = lstrlen(pszOriginal) + ARRAYSIZE(cszReplySubjectPrefix);

    *ppszReplySubject = new TCHAR[cchReplySubject];
    CPR(*ppszReplySubject);

    hr = StringCchCopy(*ppszReplySubject, cchReplySubject, cszReplySubjectPrefix);
    CHR(hr);

    hr = StringCchCat(*ppszReplySubject, cchReplySubject, pszOriginal);
    CHR(hr);
    
Error:
    return hr;
}


///////////////////////////////////////////////////////////////////////////////
// GetBodyForReply
//
//  This allocates a new string containing the reply body.  
//  Caller responsible for memory cleanup.
//
HRESULT MenuExtension::GetBodyForReply(LPTSTR pszOriginal, LPTSTR* ppszReplyBody)
{
    HRESULT hr = S_OK;
    const TCHAR cszReplyBodyPrefix[] = TEXT("\n\n-- original message --\n");
    const TCHAR cszNoBodyInReply[] = TEXT("\n\n[original message not included in reply]");    
    UINT cchReplyBody;

    if (pszOriginal)
    {        
        cchReplyBody = lstrlen(pszOriginal) + ARRAYSIZE(cszReplyBodyPrefix);

        *ppszReplyBody = new TCHAR[cchReplyBody];
        CPR(*ppszReplyBody);

        hr = StringCchCopy(*ppszReplyBody, cchReplyBody, cszReplyBodyPrefix);
        CHR(hr);

        hr = StringCchCat(*ppszReplyBody, cchReplyBody, pszOriginal);
        CHR(hr);
    }
    else
    {
        cchReplyBody = ARRAYSIZE(cszNoBodyInReply);
        
        *ppszReplyBody = new TCHAR[cchReplyBody];
        CPR(*ppszReplyBody);
        
        hr = StringCchCopy(*ppszReplyBody, cchReplyBody, cszNoBodyInReply);
        CHR(hr);
    }

Error:    
    return hr;
}


///////////////////////////////////////////////////////////////////////////////
// IsMessage
//
//  Determines if the ItemRef is a Message
// 
BOOL MenuExtension::IsMessage(ItemRef *pir)
{
    return IsEqualGUID(*(pir->pType), ITI_MessageItemRef);
}


///////////////////////////////////////////////////////////////////////////////
// IsMessageFormEx
//
//  Returns TRUE if the ItemRef is a MessageForm, FALSE otherwise.
// 
BOOL MenuExtension::IsMessageFormEx(ItemRef *pir)
{
    return IsEqualGUID(*(pir->pType), ITI_MessageFormExItemRef);
}    


///////////////////////////////////////////////////////////////////////////////
// GetItemRefArray
//
//  Retrieve the ItemRefArray from the application site
// 
HRESULT MenuExtension::GetItemRefArray(ItemRefArray **ppItemArray)
{
    HRESULT hr = E_FAIL;
    
    IDataObject* pDataObj = NULL;
    
    FORMATETC fmt;
    ZeroMemory(&fmt, sizeof(fmt));
    fmt.cfFormat = ::RegisterClipboardFormat(CFNAME_ITEMREFARRAY);
    fmt.dwAspect = DVASPECT_CONTENT;
    fmt.lindex = -1;
    fmt.ptd = NULL;
    fmt.tymed = TYMED_HGLOBAL;

    STGMEDIUM stg;
    ZeroMemory(&stg, sizeof(stg));

    // Be sure that there is a site.  Remember the "site" is a pointer to the 
    //  object in the UI that the menu extension will be acting on.
    if(m_pSite)
    {
        // Get the IDataObject interface for the site 
        hr = m_pSite->QueryInterface(IID_IDataObject, (void**)&pDataObj);
        CHR(hr);

        if (pDataObj)
        {
            // Get the FORMATETC and the STGMEDIUM from the IDataObject
            hr = pDataObj->GetData(&fmt, &stg);
            CHR(hr);

            if ( NULL != stg.hGlobal)
            {
                // Pull the ItemRefArray out of the STGMEDIUM stucture.
                *ppItemArray = (ItemRefArray *)stg.hGlobal;
            }
            else
            {
                CHR(E_FAIL);
            }
        }
        else 
        {
            CHR(E_FAIL);
        }            
    }

Error:
    RELEASE_OBJ(pDataObj);
    return hr;
}


///////////////////////////////////////////////////////////////////////////////
// GetIMAPIPropForMsg
//
//  Retrieves an IMAPIProp interface to the current message
// 
HRESULT MenuExtension::GetIMAPIPropForMsg(IMAPIProp** ppProp)
{
    HRESULT hr = S_OK;
    
    ItemRefArray *pItemArray = NULL;
    ItemRef *pRefMsg = NULL;
    IMessage *pMsg = NULL;

    hr = GetItemRefArray(&pItemArray);
    CHR(hr);

    if (pItemArray)
    {          
        ULONG cbEntry = 0;
        ENTRYID *pEntryID = NULL;

        // Get the 1st item and verify that it is a Message item
        pRefMsg = &pItemArray->rgRefs[0];
        CBR(IsMessage(pRefMsg));

        // Get the Entry Size - cbEntryID from the ItemRef
        cbEntry = ((SBinary *)pRefMsg->pRef)->cb;
        CBR(cbEntry);
        
        // Get the pointer to the EntryID from the ItemRef
        pEntryID = (ENTRYID *) ((SBinary *)pRefMsg->pRef)->lpb;
        CPR(pEntryID);
        
        // Open the Message
        // Note if you have a Message's Entry ID you can go straight to it
        //   no need to open the folder first
        hr = m_pSession->OpenEntry(cbEntry, pEntryID, NULL, 0, NULL, (LPUNKNOWN *)&pMsg);
        CHR(hr);
        CPR(pMsg);
             
        // Get an IMAPIProp Interface
        hr = pMsg->QueryInterface(IID_IMAPIProp, (LPVOID *) ppProp);
    }

Error:
    RELEASE_OBJ(pMsg);  
    return hr;      
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?