dlgnew.cxx
Upload User: caisha3
Upload Date: 2013-09-21
Package Size: 208739k
Code Size: 17k
Category:

Windows Develop

Development Platform:

Visual C++

  1. //+-------------------------------------------------------------------------
  2. //
  3. //  Microsoft Windows
  4. //  Copyright (C) Microsoft Corporation, 1992 - 1993.
  5. //
  6. //  File:       dlgnew.cxx
  7. //
  8. //  Contents:   "New Share" dialog
  9. //
  10. //  History:    21-Feb-95 BruceFo Created
  11. //
  12. //--------------------------------------------------------------------------
  13. #include "headers.hxx"
  14. #pragma hdrstop
  15. #include "resource.h"
  16. #include "helpids.h"
  17. #include "cache.hxx"
  18. #include "dlgnew.hxx"
  19. #include "acl.hxx"
  20. #include "util.hxx"
  21. #include "shrinfo.hxx"
  22. ////////////////////////////////////////////////////////////////////////////
  23. ////////////////////////////////////////////////////////////////////////////
  24. //+-------------------------------------------------------------------------
  25. //
  26. //  Member:     CDlgNewShare::SizeWndProc, public
  27. //
  28. //  Synopsis:   "allow" edit window subclass proc to disallow non-numeric
  29. //              characters.
  30. //
  31. //  History:    5-Apr-95 BruceFo  Created
  32. //
  33. //--------------------------------------------------------------------------
  34. LRESULT CALLBACK
  35. CDlgNewShare::SizeWndProc(
  36.     IN HWND hwnd,
  37.     IN UINT wMsg,
  38.     IN WPARAM wParam,
  39.     IN LPARAM lParam
  40.     )
  41. {
  42.     switch (wMsg)
  43.     {
  44.     case WM_CHAR:
  45.     {
  46.         WCHAR chCharCode = (WCHAR)wParam;
  47.         if (   (chCharCode == TEXT('t'))
  48.             || (chCharCode == TEXT('b'))
  49.             || (chCharCode == TEXT('n'))
  50.             )
  51.         {
  52.             break;
  53.         }
  54.         if (chCharCode < TEXT('0') || chCharCode > TEXT('9'))
  55.         {
  56.             // bad key: ignore it
  57.             MessageBeep(0xffffffff);    // let user know it's an illegal char
  58.             return FALSE;
  59.         }
  60.         break;
  61.     }
  62.     } // end of switch
  63.     CDlgNewShare* pThis = (CDlgNewShare*)GetWindowLong(GetParent(hwnd),GWL_USERDATA);
  64.     appAssert(NULL != pThis);
  65.     return CallWindowProc(pThis->_pfnAllowProc, hwnd, wMsg, wParam, lParam);
  66. }
  67. //+-------------------------------------------------------------------------
  68. //
  69. //  Method:     CDlgNewShare::CDlgNewShare, private
  70. //
  71. //  Synopsis:   constructor
  72. //
  73. //--------------------------------------------------------------------------
  74. CDlgNewShare::CDlgNewShare(
  75.     IN HWND hwndParent
  76.     )
  77.     :
  78.     CDialog(hwndParent, MAKEINTRESOURCE(IDD_NEW_SHARE)),
  79.     _bShareNameChanged(FALSE),
  80.     _bCommentChanged(FALSE),
  81.     _wMaxUsers(DEFAULT_MAX_USERS),
  82.     _fSecDescModified(FALSE),
  83.     _pStoredSecDesc(NULL),
  84.     _pfnAllowProc(NULL)
  85. {
  86.     INIT_SIG(CDlgNewShare);
  87. }
  88. //+-------------------------------------------------------------------------
  89. //
  90. //  Method:     CDlgNewShare::~CDlgNewShare, private
  91. //
  92. //  Synopsis:   destructor
  93. //
  94. //--------------------------------------------------------------------------
  95. CDlgNewShare::~CDlgNewShare()
  96. {
  97.     CHECK_SIG(CDlgNewShare);
  98. }
  99. //+-------------------------------------------------------------------------
  100. //
  101. //  Method:     CDlgNewShare::DlgProc, private
  102. //
  103. //  Synopsis:   Dialog Procedure for this object
  104. //
  105. //--------------------------------------------------------------------------
  106. BOOL
  107. CDlgNewShare::DlgProc(
  108.     IN HWND hwnd,
  109.     IN UINT msg,
  110.     IN WPARAM wParam,
  111.     IN LPARAM lParam
  112.     )
  113. {
  114.     CHECK_SIG(CDlgNewShare);
  115.     static DWORD aHelpIds[] =
  116.     {
  117.         IDOK,                       HC_OK,
  118.         IDCANCEL,                   HC_CANCEL,
  119.         IDC_SHARE_SHARENAME,        HC_SHARE_SHARENAME,
  120.         IDC_SHARE_SHARENAME_TEXT,   HC_SHARE_SHARENAME,
  121.         IDC_SHARE_COMMENT,          HC_SHARE_COMMENT,
  122.         IDC_SHARE_COMMENT_TEXT,     HC_SHARE_COMMENT,
  123.         IDC_SHARE_MAXIMUM,          HC_SHARE_MAXIMUM,
  124.         IDC_SHARE_ALLOW,            HC_SHARE_ALLOW,
  125.         IDC_SHARE_ALLOW_VALUE,      HC_SHARE_ALLOW_VALUE,
  126.         IDC_SHARE_USERS_TEXT,       HC_SHARE_ALLOW_VALUE,
  127.         IDC_SHARE_PERMISSIONS,      HC_SHARE_PERMISSIONS,
  128.         IDC_SHARE_LIMIT,            HC_SHARE_LIMIT,
  129.         0,0
  130.     };
  131.     switch (msg)
  132.     {
  133.     case WM_INITDIALOG:
  134.         return _OnInitDialog(hwnd);
  135.     case WM_COMMAND:
  136.         return _OnCommand(hwnd, HIWORD(wParam), LOWORD(wParam), (HWND)lParam);
  137.     case WM_VSCROLL:
  138.         // The up/down control changed the edit control: select it again
  139.         SendDlgItemMessage(hwnd, IDC_SHARE_ALLOW_VALUE, EM_SETSEL, 0, (LPARAM)-1);
  140.         return TRUE;
  141.     case WM_HELP:
  142.     {
  143.         LPHELPINFO lphi = (LPHELPINFO)lParam;
  144.         if (lphi->iContextType == HELPINFO_WINDOW)  // a control
  145.         {
  146.             WCHAR szHelp[50];
  147.             LoadString(g_hInstance, IDS_HELPFILENAME, szHelp, ARRAYLEN(szHelp));
  148.             WinHelp(
  149.                 (HWND)lphi->hItemHandle,
  150.                 szHelp,
  151.                 HELP_WM_HELP,
  152.                 (DWORD)(LPVOID)aHelpIds);
  153.         }
  154.         break;
  155.     }
  156.     case WM_CONTEXTMENU:
  157.     {
  158.         WCHAR szHelp[50];
  159.         LoadString(g_hInstance, IDS_HELPFILENAME, szHelp, ARRAYLEN(szHelp));
  160.         WinHelp(
  161.             (HWND)wParam,
  162.             szHelp,
  163.             HELP_CONTEXTMENU,
  164.             (DWORD)(LPVOID)aHelpIds);
  165.         break;
  166.     }
  167.     case WM_DESTROY:
  168.     {
  169.         // restore original subclass to window.
  170.         appAssert(NULL != GetDlgItem(hwnd,IDC_SHARE_ALLOW_VALUE));
  171.         SetWindowLong(GetDlgItem(hwnd,IDC_SHARE_ALLOW_VALUE), GWL_WNDPROC, (LONG)_pfnAllowProc);
  172.         return FALSE;
  173.     }
  174.     } // end of switch
  175.     return FALSE;
  176. }
  177. //+-------------------------------------------------------------------------
  178. //
  179. //  Method:     CDlgNewShare::_OnInitDialog, private
  180. //
  181. //  Synopsis:   WM_INITDIALOG handler
  182. //
  183. //--------------------------------------------------------------------------
  184. BOOL
  185. CDlgNewShare::_OnInitDialog(
  186.     IN HWND hwnd
  187.     )
  188. {
  189.     CHECK_SIG(CDlgNewShare);
  190.     // Subclass allow edit control to disallow non-positive numbers
  191.     _pfnAllowProc = (WNDPROC)SetWindowLong(
  192.                                     GetDlgItem(hwnd, IDC_SHARE_ALLOW_VALUE),
  193.                                     GWL_WNDPROC,
  194.                                     (LONG)&SizeWndProc);
  195.     // use LanMan API constants to set maximum share name & comment lengths
  196.     SendDlgItemMessage(hwnd, IDC_SHARE_SHARENAME, EM_LIMITTEXT, NNLEN, 0L);
  197.     SendDlgItemMessage(hwnd, IDC_SHARE_COMMENT,   EM_LIMITTEXT, MAXCOMMENTSZ, 0L);
  198.     CheckRadioButton(
  199.             hwnd,
  200.             IDC_SHARE_MAXIMUM,
  201.             IDC_SHARE_ALLOW,
  202.             IDC_SHARE_MAXIMUM);
  203.     SetDlgItemText(hwnd, IDC_SHARE_ALLOW_VALUE, L"");
  204.     // set the spin control range: 1 <--> large number
  205.     SendDlgItemMessage(
  206.             hwnd,
  207.             IDC_SHARE_ALLOW_SPIN,
  208.             UDM_SETRANGE,
  209.             0,
  210.             MAKELONG(g_uiMaxUsers, 1));
  211.     SetFocus(GetDlgItem(hwnd, IDC_SHARE_SHARENAME));
  212.     return FALSE;
  213. }
  214. //+-------------------------------------------------------------------------
  215. //
  216. //  Member:     CDlgNewShare::_OnCommand, private
  217. //
  218. //  Synopsis:   WM_COMMAND handler
  219. //
  220. //  History:    21-Apr-95 BruceFo  Created
  221. //
  222. //--------------------------------------------------------------------------
  223. BOOL
  224. CDlgNewShare::_OnCommand(
  225.     IN HWND hwnd,
  226.     IN WORD wNotifyCode,
  227.     IN WORD wID,
  228.     IN HWND hwndCtl
  229.     )
  230. {
  231.     CHECK_SIG(CDlgNewShare);
  232.     switch (wID)
  233.     {
  234. //
  235. // Notifications
  236. //
  237.     case IDC_SHARE_MAXIMUM:
  238.         if (BN_CLICKED == wNotifyCode)
  239.         {
  240.             // Take away WS_TABSTOP from the "allow users" edit control
  241.             HWND hwndEdit = GetDlgItem(hwnd, IDC_SHARE_ALLOW_VALUE);
  242.             SetWindowLong(hwndEdit, GWL_STYLE, GetWindowLong(hwndEdit, GWL_STYLE) & ~WS_TABSTOP);
  243.             _CacheMaxUses(hwnd);
  244.             SetDlgItemText(hwnd, IDC_SHARE_ALLOW_VALUE, L"");
  245.         }
  246.         return TRUE;
  247.     case IDC_SHARE_ALLOW:
  248.         if (BN_CLICKED == wNotifyCode)
  249.         {
  250.             // Give WS_TABSTOP to the "allow users" edit control
  251.             HWND hwndEdit = GetDlgItem(hwnd, IDC_SHARE_ALLOW_VALUE);
  252.             SetWindowLong(hwndEdit, GWL_STYLE, GetWindowLong(hwndEdit, GWL_STYLE) | WS_TABSTOP);
  253.             // let the spin control set the edit control
  254.             SendDlgItemMessage(hwnd, IDC_SHARE_ALLOW_SPIN, UDM_SETPOS, 0, MAKELONG(_wMaxUsers, 0));
  255.             SendDlgItemMessage(hwnd, IDC_SHARE_ALLOW_VALUE, EM_SETSEL, 0, (LPARAM)-1);
  256.         }
  257.         return TRUE;
  258.     case IDC_SHARE_ALLOW_VALUE:
  259.     {
  260.         if (EN_SETFOCUS == wNotifyCode)
  261.         {
  262.             if (1 != IsDlgButtonChecked(hwnd, IDC_SHARE_ALLOW))
  263.             {
  264.                 CheckRadioButton(
  265.                     hwnd,
  266.                     IDC_SHARE_MAXIMUM,
  267.                     IDC_SHARE_ALLOW,
  268.                     IDC_SHARE_ALLOW);
  269.             }
  270.             // let the spin control set the edit control
  271.             SendDlgItemMessage(hwnd, IDC_SHARE_ALLOW_SPIN, UDM_SETPOS, 0, MAKELONG(_wMaxUsers, 0));
  272.             SendDlgItemMessage(hwnd, IDC_SHARE_ALLOW_VALUE, EM_SETSEL, 0, (LPARAM)-1);
  273.         }
  274.         if (EN_KILLFOCUS == wNotifyCode)
  275.         {
  276.             _CacheMaxUses(hwnd);
  277.         }
  278.         return TRUE;
  279.     }
  280.     case IDC_SHARE_ALLOW_SPIN:
  281.         if (UDN_DELTAPOS == wNotifyCode)
  282.         {
  283.             if (1 != IsDlgButtonChecked(hwnd, IDC_SHARE_ALLOW))
  284.             {
  285.                 CheckRadioButton(
  286.                     hwnd,
  287.                     IDC_SHARE_MAXIMUM,
  288.                     IDC_SHARE_ALLOW,
  289.                     IDC_SHARE_ALLOW);
  290.             }
  291.         }
  292.         return TRUE;
  293.     case IDC_SHARE_SHARENAME:
  294.     {
  295.         if (wNotifyCode == EN_CHANGE)
  296.         {
  297.             _bShareNameChanged = TRUE;
  298.         }
  299.         return TRUE;
  300.     }
  301.     case IDC_SHARE_COMMENT:
  302.     {
  303.         if (wNotifyCode == EN_CHANGE)
  304.         {
  305.             _bCommentChanged = TRUE;
  306.         }
  307.         return TRUE;
  308.     }
  309. //
  310. // Commands
  311. //
  312.     case IDOK:
  313.         return _OnOK(hwnd);
  314.     case IDCANCEL:
  315.         EndDialog(hwnd, FALSE);
  316.         return TRUE;
  317.     case IDC_SHARE_PERMISSIONS:
  318.         return _OnPermissions(hwnd);
  319.     } // end of switch (wID)
  320.     return FALSE;
  321. }
  322. //+-------------------------------------------------------------------------
  323. //
  324. //  Method:     CDlgNewShare::_OnOK, private
  325. //
  326. //  Synopsis:
  327. //
  328. //--------------------------------------------------------------------------
  329. BOOL
  330. CDlgNewShare::_OnOK(
  331.     IN HWND hwnd
  332.     )
  333. {
  334.     CHECK_SIG(CDlgNewShare);
  335.     HRESULT hr;
  336.     // Validate the share
  337.     WCHAR szShareName[NNLEN + 1];
  338.     if (0 == GetDlgItemText(hwnd, IDC_SHARE_SHARENAME, szShareName, ARRAYLEN(szShareName)))
  339.     {
  340.         MyErrorDialog(hwnd, IERR_BlankShareName);
  341.         SetErrorFocus(hwnd, IDC_SHARE_SHARENAME);
  342.         return TRUE;
  343.     }
  344.     HRESULT uTemp;
  345.     if (!IsValidShareName(szShareName, &uTemp))
  346.     {
  347.         MyErrorDialog(hwnd, uTemp);
  348.         SetErrorFocus(hwnd, IDC_SHARE_SHARENAME);
  349.         return TRUE;
  350.     }
  351.     // Trying to create a reserved share?
  352.     if (0 == _wcsicmp(g_szIpcShare, szShareName))
  353.     {
  354.         MyErrorDialog(hwnd, IERR_SpecialShare);
  355.         SetErrorFocus(hwnd, IDC_SHARE_SHARENAME);
  356.         return TRUE;
  357.     }
  358.     if (0 == _wcsicmp(g_szAdminShare, szShareName))
  359.     {
  360.         // We will let the admin create the admin$ share if they create
  361.         // it in the directory specified by GetWindowsDirectory().
  362.         WCHAR szWindowsDir[MAX_PATH];
  363.         UINT err = GetWindowsDirectory(szWindowsDir, ARRAYLEN(szWindowsDir));
  364.         if (err == 0)
  365.         {
  366.             // oh well, give them this error
  367.             MyErrorDialog(hwnd, IERR_SpecialShare);
  368.             SetErrorFocus(hwnd, IDC_SHARE_SHARENAME);
  369.             return FALSE;
  370.         }
  371.         if (0 != _wcsicmp(m_pShareInfo->GetPath(), szWindowsDir))
  372.         {
  373.             MyErrorDialog(hwnd, IERR_SpecialShare);
  374.             SetErrorFocus(hwnd, IDC_SHARE_SHARENAME);
  375.             return FALSE;
  376.         }
  377.         // otherwise, it is the right directory. Let them create it.
  378.     }
  379.     // Check to see that the same share doesn't already exist. We don't allow
  380.     // the user to create a share with the same name as a marked-for-delete
  381.     // share, because it's easier!
  382.     for (CShareInfo* p = (CShareInfo*) m_pInfoList->Next();
  383.          p != m_pInfoList;
  384.          p = (CShareInfo*) p->Next())
  385.     {
  386.         if (0 == _wcsicmp(p->GetNetname(), szShareName))
  387.         {
  388.             MyErrorDialog(hwnd, IERR_AlreadyExists, szShareName);
  389.             SetErrorFocus(hwnd, IDC_SHARE_SHARENAME);
  390.             return TRUE;
  391.         }
  392.     }
  393.     // Check for downlevel accessibility
  394.     ULONG nType;
  395.     if (NERR_Success != NetpPathType(NULL, szShareName, &nType, INPT_FLAGS_OLDPATHS))
  396.     {
  397.         DWORD id = MyConfirmationDialog(
  398.                         hwnd,
  399.                         IERR_InaccessibleByDos,
  400.                         MB_YESNO | MB_ICONEXCLAMATION,
  401.                         szShareName);
  402.         if (id == IDNO)
  403.         {
  404.             SetErrorFocus(hwnd, IDC_SHARE_SHARENAME);
  405.             return TRUE;
  406.         }
  407.     }
  408.     WCHAR szOldPath[PATHLEN + 1];
  409.     if (g_ShareCache.IsExistingShare(szShareName, m_pShareInfo->GetPath(), szOldPath))
  410.     {
  411.         DWORD id = ConfirmReplaceShare(hwnd, szShareName, szOldPath, m_pShareInfo->GetPath());
  412.         if (id != IDYES)
  413.         {
  414.             SetErrorFocus(hwnd, IDC_SHARE_SHARENAME);
  415.             return TRUE;
  416.         }
  417.         // User said to replace the old share. We need to add
  418.         // a "delete" record for the old share.
  419.         CShareInfo* pNewInfo = new CShareInfo();
  420.         if (NULL == pNewInfo)
  421.         {
  422.             return FALSE;
  423.         }
  424.         hr = pNewInfo->InitInstance();
  425.         CHECK_HRESULT(hr);
  426.         if (FAILED(hr))
  427.         {
  428.             delete pNewInfo;
  429.             return FALSE;
  430.         }
  431.         hr = pNewInfo->SetNetname(szShareName);
  432.         CHECK_HRESULT(hr);
  433.         if (FAILED(hr))
  434.         {
  435.             delete pNewInfo;
  436.             return FALSE;
  437.         }
  438.         hr = pNewInfo->SetPath(szOldPath);
  439.         CHECK_HRESULT(hr);
  440.         if (FAILED(hr))
  441.         {
  442.             delete pNewInfo;
  443.             return FALSE;
  444.         }
  445.         pNewInfo->SetFlag(SHARE_FLAG_REMOVE);
  446.         pNewInfo->InsertBefore(m_pReplaceList); // add to end of replace list
  447.     }
  448.     // Everything OK, save away the data
  449.     if (_bShareNameChanged)
  450.     {
  451.         hr = m_pShareInfo->SetNetname(szShareName);
  452.         CHECK_HRESULT(hr);
  453.     }
  454.     if (_bCommentChanged)
  455.     {
  456.         WCHAR szComment[MAXCOMMENTSZ + 1];
  457.         GetDlgItemText(hwnd, IDC_SHARE_COMMENT, szComment, ARRAYLEN(szComment));
  458.         hr = m_pShareInfo->SetRemark(szComment);
  459.         CHECK_HRESULT(hr);
  460.     }
  461.     if (1 == IsDlgButtonChecked(hwnd, IDC_SHARE_MAXIMUM))
  462.     {
  463.         hr = m_pShareInfo->SetMaxUses(SHI_USES_UNLIMITED);
  464.         CHECK_HRESULT(hr);
  465.     }
  466.     else if (1 == IsDlgButtonChecked(hwnd, IDC_SHARE_ALLOW))
  467.     {
  468.         _CacheMaxUses(hwnd);
  469.         hr = m_pShareInfo->SetMaxUses(_wMaxUsers);
  470.         CHECK_HRESULT(hr);
  471.     }
  472.     EndDialog(hwnd, TRUE);
  473.     return TRUE;
  474. }
  475. //+-------------------------------------------------------------------------
  476. //
  477. //  Method:     CDlgNewShare::_OnPermissions, private
  478. //
  479. //  Synopsis:
  480. //
  481. //--------------------------------------------------------------------------
  482. BOOL
  483. CDlgNewShare::_OnPermissions(
  484.     IN HWND hwnd
  485.     )
  486. {
  487.     CHECK_SIG(CDlgNewShare);
  488.     WCHAR szShareName[NNLEN + 1];
  489.     GetDlgItemText(hwnd, IDC_SHARE_SHARENAME, szShareName, ARRAYLEN(szShareName));
  490.     PSECURITY_DESCRIPTOR pNewSecDesc = NULL;
  491.     PSECURITY_DESCRIPTOR pSecDesc = m_pShareInfo->GetSecurityDescriptor();
  492.     appAssert(NULL == pSecDesc || IsValidSecurityDescriptor(pSecDesc));
  493.     BOOL bSecDescChanged;
  494.     LONG err = EditShareAcl(
  495.                         hwnd,
  496.                         NULL,
  497.                         szShareName,
  498.                         pSecDesc,
  499.                         &bSecDescChanged,
  500.                         &pNewSecDesc);
  501.     if (bSecDescChanged)
  502.     {
  503.         _fSecDescModified = TRUE;
  504.         appAssert(IsValidSecurityDescriptor(pNewSecDesc));
  505.         m_pShareInfo->TransferSecurityDescriptor(pNewSecDesc);
  506.     }
  507.     return TRUE;
  508. }
  509. //+-------------------------------------------------------------------------
  510. //
  511. //  Method:     CDlgNewShare::_CacheMaxUses, private
  512. //
  513. //  Synopsis:
  514. //
  515. //--------------------------------------------------------------------------
  516. VOID
  517. CDlgNewShare::_CacheMaxUses(
  518.     IN HWND hwnd
  519.     )
  520. {
  521.     DWORD dwRet = SendDlgItemMessage(hwnd, IDC_SHARE_ALLOW_SPIN, UDM_GETPOS, 0, 0);
  522.     if (HIWORD(dwRet) != 0)
  523.     {
  524.         _wMaxUsers = DEFAULT_MAX_USERS;
  525.         // Reset the edit control to the new value
  526.         SendDlgItemMessage(hwnd, IDC_SHARE_ALLOW_SPIN, UDM_SETPOS, 0, MAKELONG(_wMaxUsers, 0));
  527.         SendDlgItemMessage(hwnd, IDC_SHARE_ALLOW_VALUE, EM_SETSEL, 0, (LPARAM)-1);
  528.     }
  529.     else
  530.     {
  531.         _wMaxUsers = LOWORD(dwRet);
  532.     }
  533. }