SMHWIZ.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:11k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  *  S M H W I Z . C
  3.  *
  4.  *  Sample mail handling hook configuration wizard
  5.  *  Copyright 1992-95 Microsoft Corporation.  All Rights Reserved.
  6.  */
  7. #include "_pch.h"
  8. extern SPropTagArray sptConfigProps;
  9. /*
  10.  *  Wizard global and external variables
  11.  */
  12. static LPMAPIPROP lpmpWiz = NULL;
  13. static LPSPropValue lpvalWiz = NULL;
  14. static UINT ipgCur = (UINT)(-1);
  15. /*
  16.  *  MAPI Initialization structure.
  17.  *
  18.  *  By initializing MAPI, the wizard can allocate and/or free memory
  19.  *  using MAPIAllocateBuffer(), MAPIAllocateMore(), and MAPIFreeBuffer()
  20.  */
  21. static const MAPIINIT mapiinit = { MAPI_INIT_VERSION, 0 };
  22. /* Wizard page enumeration */
  23. enum {ipgSentMail, ipgDeleted, ipgInbound, ipgUnread, cpgMax};
  24. /*
  25.  *  TogglePage()
  26.  *
  27.  *  Purpose:
  28.  *
  29.  *      Toggles the state of the current page to be either enabled and
  30.  *      visible or disabled and hidden.
  31.  *
  32.  *      IMPORTANT: This function relies on the dialog control IDs as
  33.  *      defined in _SMH.RH.  Each page exists in a certain range and all
  34.  *      controls in each page must have contiguous IDs starting at the
  35.  *      page ID value.
  36.  *
  37.  *  Arguments:
  38.  *
  39.  *      hdlg            the dialog
  40.  *      ipg             the page index (0 - cpgMax)
  41.  *      fEnable         boolean used to either enable for disable the page
  42.  */
  43. VOID
  44. TogglePage (HWND hdlg, UINT ipg, BOOL fEnable)
  45. {
  46.     UINT ictl = 0;
  47.     HANDLE hctl;
  48.     if (ipg >= cpgMax)
  49.         return;
  50.     while (hctl = GetDlgItem (hdlg, (WIZ_BASE + (ipg * PAGE_INC) + ictl++)))
  51.     {
  52.         EnableWindow (hctl, fEnable);
  53.         ShowWindow (hctl, (fEnable ? SW_SHOW : SW_HIDE));
  54.     }
  55. }
  56. /*
  57.  *  EnablePage()
  58.  *
  59.  *  Purpose:
  60.  *
  61.  *      Toggles the state of the current page controls to be either
  62.  *      enabled or disabled.
  63.  *
  64.  *      IMPORTANT: This function relies on the dialog control IDs as
  65.  *      defined in _SMH.RH.  Each page exists in a certain range and all
  66.  *      controls in each page must have contiguous IDs starting at the
  67.  *      page ID value.
  68.  *
  69.  *  Arguments:
  70.  *
  71.  *      hdlg            the dialog
  72.  *      ipg             the page index (0 - cpgMax)
  73.  *      fEnable         boolean used to either enable for disable the page
  74.  */
  75. VOID
  76. EnablePage (HWND hdlg, UINT ipg, BOOL fEnable)
  77. {
  78.     UINT ictl = 0;
  79.     HANDLE hctl;
  80.     if (ipg >= cpgMax)
  81.         return;
  82.     while (hctl = GetDlgItem (hdlg, (WIZ_BASE + (ipg * PAGE_INC) + ictl++)))
  83.         EnableWindow (hctl, fEnable);
  84. }
  85. /*
  86.  *  ShowPage()
  87.  *
  88.  *  Purpose:
  89.  *
  90.  *      Toggles the state of the current page controls to be either
  91.  *      visible or hidden.
  92.  *
  93.  *      IMPORTANT: This function relies on the dialog control IDs as
  94.  *      defined in _SMH.RH.  Each page exists in a certain range and all
  95.  *      controls in each page must have contiguous IDs starting at the
  96.  *      page ID value.
  97.  *
  98.  *  Arguments:
  99.  *
  100.  *      hdlg            the dialog
  101.  *      ipg             the page index (0 - cpgMax)
  102.  *      fEnable         boolean used to either show or hide the page
  103.  */
  104. VOID
  105. ShowPage (HWND hdlg, UINT ipg, BOOL fEnable)
  106. {
  107.     UINT ictl = 0;
  108.     HANDLE hctl;
  109.     if (ipg >= cpgMax)
  110.         return;
  111.     while (hctl = GetDlgItem (hdlg, (WIZ_BASE + (ipg * PAGE_INC) + ictl++)))
  112.         ShowWindow (hctl, (fEnable ? SW_SHOW : SW_HIDE));
  113. }
  114. /*
  115.  *  WizardPage_INITDIALOG()
  116.  *
  117.  *  Purpose:
  118.  *
  119.  *      Responds to the WM_INITDIALOG message.
  120.  *
  121.  *  Returns:
  122.  *
  123.  *      TRUE iff the initialization was successful
  124.  */
  125. BOOL
  126. WizardPage_INITDIALOG (HWND hdlg, HWND hwndFocus, LPARAM lParam)
  127. {
  128.     ULONG cval;
  129.     ULONG ulFlags;
  130.     if (!FAILED (MAPIInitialize ((LPMAPIINIT)&mapiinit)) &&
  131.         !HR_FAILED (lpmpWiz->lpVtbl->GetProps (lpmpWiz,
  132.                                         (LPSPropTagArray)&sptConfigProps,
  133.                                         0,
  134.                                         &cval,
  135.                                         &lpvalWiz)))
  136.     {
  137.         ulFlags = (lpvalWiz[ipFlags].ulPropTag == PR_SMH_FLAGS)
  138.             ? lpvalWiz[ipFlags].Value.l
  139.             : 0;
  140.         CheckDlgButton (hdlg, ID_SentMail, !!(ulFlags & SMH_FILTER_SENTMAIL));
  141.         CheckDlgButton (hdlg, ID_SentMailYr, !!(ulFlags & SMH_FILTER_SENTMAIL_YR));
  142.         CheckDlgButton (hdlg, ID_Deleted, !!(ulFlags & SMH_FILTER_DELETED));
  143.         CheckDlgButton (hdlg, ID_DeletedYr, !!(ulFlags & SMH_FILTER_DELETED_YR));
  144.         CheckDlgButton (hdlg, ID_Inbound, !!(ulFlags & SMH_FILTER_INBOUND));
  145.         CheckDlgButton (hdlg, ID_Unread, !!(ulFlags & SMH_UNREAD_VIEWER));
  146.         lpvalWiz[ipFlags].ulPropTag = PR_SMH_FLAGS;
  147.         lpvalWiz[ipFlags].Value.l = ulFlags;
  148.         DebugTrace ("SMH: wizard initializedn");
  149.         return TRUE;
  150.     }
  151.     else
  152.     {
  153.         DebugTrace ("SMH: wizard initializion failedn");
  154.         return FALSE;
  155.     }
  156. }
  157. /*
  158.  *  WizardPage_COMMAND()
  159.  *
  160.  *  Purpose:
  161.  *
  162.  *      Responds to the WM_COMMAND message.
  163.  *
  164.  *      IMPORTANT: This function relies on the dialog control IDs as
  165.  *      defined in _SMH.RH.  Each page exists in a certain range and all
  166.  *      controls in each page must have contiguous IDs starting at the
  167.  *      page ID value.
  168.  *
  169.  *  Returns:
  170.  *
  171.  *      TRUE iff the command was processed by the wizard page
  172.  */
  173. BOOL
  174. WizardPage_COMMAND (HWND hdlg, UINT id, HWND hwndCtl, UINT codeNotify)
  175. {
  176.     UINT cpgJmp = 1;
  177.     switch (id)
  178.     {
  179.       case ID_SentMail:
  180.       case ID_Deleted:
  181.         /* Check/uncheck the companion checkbox */
  182.         EnableWindow (GetDlgItem (hdlg, id + 1), !!IsDlgButtonChecked (hdlg, id));
  183.         break;
  184.       case WIZ_PREV:
  185.         cpgJmp = (UINT)(-((INT)cpgJmp));
  186.         /* Fall through! */
  187.       case WIZ_NEXT:
  188.         DebugTrace ("SMH: PREV/NEXT'd from pg %d to pg %dn", ipgCur, ipgCur + cpgJmp);
  189.         /* Disable/hide the current page and enable target page */
  190.         TogglePage (hdlg, ipgCur, FALSE);
  191.         EnablePage (hdlg, ipgCur += cpgJmp, TRUE);
  192.         switch (ipgCur)
  193.         {
  194.           case ipgSentMail:
  195.             EnableWindow (GetDlgItem (hdlg, ID_SentMailYr),
  196.                 !!IsDlgButtonChecked (hdlg, ID_SentMail));
  197.             break;
  198.           case ipgDeleted:
  199.             EnableWindow (GetDlgItem (hdlg, ID_DeletedYr),
  200.                 !!IsDlgButtonChecked (hdlg, ID_Deleted));
  201.             break;
  202.           case ipgInbound:
  203.           case ipgUnread:
  204.             break;
  205.           case cpgMax:
  206.             if (IsDlgButtonChecked (hdlg, ID_SentMail))
  207.             {
  208.                 lpvalWiz[ipFlags].Value.l |= SMH_FILTER_SENTMAIL;
  209.                 if (IsDlgButtonChecked (hdlg, ID_SentMailYr))
  210.                     lpvalWiz[ipFlags].Value.l |= SMH_FILTER_SENTMAIL_YR;
  211.                 else
  212.                     lpvalWiz[ipFlags].Value.l &= ~SMH_FILTER_SENTMAIL_YR;
  213.             }
  214.             else
  215.                 lpvalWiz[ipFlags].Value.l &= ~(SMH_FILTER_SENTMAIL | SMH_FILTER_SENTMAIL_YR);
  216.             if (IsDlgButtonChecked (hdlg, ID_Deleted))
  217.             {
  218.                 lpvalWiz[ipFlags].Value.l |= SMH_FILTER_DELETED;
  219.                 if (IsDlgButtonChecked (hdlg, ID_DeletedYr))
  220.                     lpvalWiz[ipFlags].Value.l |= SMH_FILTER_DELETED_YR;
  221.                 else
  222.                     lpvalWiz[ipFlags].Value.l &= ~SMH_FILTER_DELETED_YR;
  223.             }
  224.             else
  225.                 lpvalWiz[ipFlags].Value.l &= ~(SMH_FILTER_DELETED | SMH_FILTER_DELETED_YR);
  226.             if (IsDlgButtonChecked (hdlg, ID_Inbound))
  227.                 lpvalWiz[ipFlags].Value.l |= SMH_FILTER_INBOUND;
  228.             else
  229.                 lpvalWiz[ipFlags].Value.l &= ~SMH_FILTER_INBOUND;
  230.             if (IsDlgButtonChecked (hdlg, ID_Unread))
  231.                 lpvalWiz[ipFlags].Value.l |= SMH_UNREAD_VIEWER;
  232.             else
  233.                 lpvalWiz[ipFlags].Value.l &= ~SMH_UNREAD_VIEWER;
  234.             lpmpWiz->lpVtbl->SetProps (lpmpWiz, cpMax, lpvalWiz, NULL);
  235.             lpmpWiz->lpVtbl->SaveChanges (lpmpWiz, KEEP_OPEN_READWRITE);
  236.             break;
  237.         }
  238.         /* Unhide the target page */
  239.         ShowPage (hdlg, ipgCur, TRUE);
  240.         return (BOOL)cpgJmp;
  241.       default:
  242.         return FALSE;
  243.     }
  244.     return TRUE;
  245. }
  246. /*
  247.  *  SMH_WizProc()
  248.  *
  249.  *  Purpose:
  250.  *
  251.  *      The wizard page dialog proceedure.
  252.  *
  253.  *  Arguments:
  254.  *
  255.  *      hdlg        the dialog
  256.  *      wMsgID      the message
  257.  *      wParam
  258.  *      lParam
  259.  */
  260. BOOL STDAPICALLTYPE
  261. SMH_WizProc (HWND hdlg,
  262.     UINT wMsgID,
  263.     WPARAM wParam,
  264.     LPARAM lParam)
  265. {
  266.     //static UINT ipgCur = (UINT)(-1);
  267.     static LPSPropValue lpval = NULL;
  268.     switch (wMsgID)
  269.     {
  270.       case WM_INITDIALOG:
  271.         return (BOOL)FHandleWm (WizardPage, hdlg, INITDIALOG, wParam, lParam);
  272.       case WIZ_QUERYNUMPAGES:
  273.         DebugTrace ("SMH: wizard page count %dn", cpgMax);
  274.         return (BOOL)cpgMax;
  275.       case WM_CLOSE:
  276.         DebugTrace ("SMH: wizard closedn");
  277.         ipgCur = (UINT)(-1);
  278.         MAPIFreeBuffer (lpvalWiz);
  279.         MAPIUninitialize ();
  280.         lpvalWiz = NULL;
  281.         UlRelease (lpmpWiz);
  282.         lpmpWiz = NULL;
  283.         break;
  284.       case WM_COMMAND:
  285.         return (BOOL)FHandleWm (WizardPage, hdlg, COMMAND, wParam, lParam);
  286.       default:
  287.         return FALSE;
  288.     }
  289.     return TRUE;
  290. }
  291. /*
  292.  *  WizardEntry()
  293.  *
  294.  *  Purpose:
  295.  *
  296.  *      This is the initial entrypoint for the MAPI 1.0 configuration
  297.  *      wizard.  This function tells the wizard DLL how many pages the
  298.  *      configuration for this service requires as well as the dialog
  299.  *      procedure to call for each individual event.
  300.  *
  301.  *  Arguments:
  302.  *
  303.  *      hInstance       the instance of my dll, this can be used to
  304.  *                      retrieve resources out of my DLL, etc.
  305.  *
  306.  *      lpszRsrcName    [OUT]   on return, this buffer is filled with
  307.  *                              the full name of the dialog resource ID.
  308.  *                              Note that this requires the name to be a
  309.  *                              text value and not something generated
  310.  *                              with the MAKEINTRESOURCE() macro
  311.  *
  312.  *      lpfnDlgProc     [OUT]   on return, holds a function pointer to
  313.  *                              the dialog proc to call for each event
  314.  *
  315.  *      lpMapiProp      the pointer to a IMAPIProp object that is my
  316.  *                      interface to the profile.
  317.  *
  318.  *  Returns:
  319.  *
  320.  *      (SCODE)         S_OK
  321.  */
  322. ULONG STDAPICALLTYPE
  323. SMH_WizEntry (HINSTANCE hInstance,
  324.     LPTSTR FAR * lppszRsrcName,
  325.     DLGPROC FAR * lpfnDlgProc,
  326.     LPMAPIPROP lpMapiProp,
  327.     LPVOID lpsup)
  328. {
  329.     Unreferenced (lpsup);
  330.     
  331.     /*  Stash the MAPIPROP object in global for use in the
  332.      *  configuration wizard
  333.      */
  334.     lpmpWiz = lpMapiProp;
  335.     UlAddRef (lpmpWiz);
  336.     /*  tell the configuration wizard the dialog template name
  337.      *  and the window proceedure to use
  338.      */
  339.     *lppszRsrcName = (LPTSTR)szWizardDialog;
  340.     *lpfnDlgProc = (DLGPROC)SMH_WizProc;
  341.     return S_OK;
  342. }