home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 July / PCWorld_1999-07_cd.bin / 602 / WBPERSON / data1.cab / SDK_Files / wbwizard / sources / WBMFCSSA.CPP < prev    next >
C/C++ Source or Header  |  1999-06-09  |  10KB  |  340 lines

  1. // wbmfcssa.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "resource.h"
  6. #include "wbmfc.h"
  7. #include "wbmfcssa.h"
  8.  
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14.  
  15. BOOL WBSelSrvrAppl(const char *UserName, const char *Password, const char *Appl)
  16. {
  17.     CSelSrvrApplDlg Dlg(UserName, Password, Appl);
  18.     Dlg.DoModal();
  19.     return(TRUE);
  20. }
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CSelSrvrApplDlg dialog
  23.  
  24.  
  25. CSelSrvrApplDlg::CSelSrvrApplDlg(const char *UserName, const char *Password, const char *Appl, CWnd* pParent /*=NULL*/)
  26.     : CDialog(CSelSrvrApplDlg::IDD, pParent)
  27. {
  28.     //{{AFX_DATA_INIT(CSelSrvrApplDlg)
  29.         // NOTE: the ClassWizard will add member initialization here
  30.     //}}AFX_DATA_INIT
  31.     m_SelServer = NULL;
  32.     m_UserName  = UserName;
  33.     m_Password  = Password;
  34.     m_Appl      = Appl;
  35.     m_NoAppl    = UserName == WBAPPI_NOLOGIN || Appl != NULL;
  36. }
  37.  
  38.  
  39. BEGIN_MESSAGE_MAP(CSelSrvrApplDlg, CDialog)
  40.     //{{AFX_MSG_MAP(CSelSrvrApplDlg)
  41.     ON_NOTIFY(TVN_SELCHANGED, IDC_SRVRTREE, OnSelchanged)
  42.     ON_NOTIFY(NM_SETFOCUS, IDC_SRVRTREE, OnSelchanged)
  43.     ON_NOTIFY(TVN_ITEMEXPANDING, IDC_SRVRTREE, OnItemexpanding)
  44.     ON_NOTIFY(NM_DBLCLK, IDC_SRVRTREE, OnDblclk)
  45.     ON_EN_CHANGE(IDC_APPLEDIT, OnChangeEdit)
  46.     ON_EN_CHANGE(IDC_SRVREDIT, OnChangeEdit)
  47.     ON_WM_DESTROY()
  48.     //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50.  
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CSelSrvrApplDlg message handlers
  53.  
  54. BOOL CSelSrvrApplDlg::OnInitDialog() 
  55. {
  56.     CDialog::OnInitDialog();
  57.     
  58.     // TODO: Add extra initialization here
  59.     m_SrvrTree  = (CTreeCtrl *)GetDlgItem(IDC_SRVRTREE);
  60.     GetDlgItem(IDOK)->EnableWindow(FALSE);
  61.     if (!m_SrvrTree)
  62.         return FALSE;
  63.     FillSrvrTree();    
  64.     if (m_NoAppl)
  65.     {
  66.         CWnd *hEdit = GetDlgItem(IDC_APPLEDIT);
  67.         hEdit->EnableWindow(FALSE);
  68.         hEdit->ShowWindow(SW_HIDE);
  69.         GetDlgItem(IDC_APPLSTATIC)->ShowWindow(FALSE);
  70.         CRect Rect;
  71.         GetDlgItem(IDC_SRVREDIT)->GetWindowRect(&Rect);
  72.         int NewyExt = Rect.bottom + 20;
  73.         GetWindowRect(&Rect);
  74.         Rect.bottom = NewyExt;
  75.         MoveWindow(&Rect, FALSE);
  76.         SetWindowLong(*m_SrvrTree, GWL_STYLE, GetWindowLong(*m_SrvrTree, GWL_STYLE) & ~TVS_HASBUTTONS);
  77.     }
  78.     return TRUE;  // return TRUE unless you set the focus to a control
  79.                   // EXCEPTION: OCX Property Pages should return FALSE
  80. }
  81.  
  82. #define IND_APPL     0
  83. #define IND_SRVLOCAL 1
  84. #define IND_SRVREMNR 2
  85. #define IND_SRVRAS   3 
  86.  
  87. BOOL CSelSrvrApplDlg::FillSrvrTree()
  88.     HKEY hKey, hSubKey;    
  89.     char Path[MAX_PATH];
  90.     int  ind = 0;
  91.     tobjname Server;  
  92.  
  93.     LONG Err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Software602\\WinBase602\\Database", 0, KEY_READ, &hKey);
  94.     if (Err != ERROR_SUCCESS) 
  95.         return(FALSE);
  96.  
  97.     CBitmap bm;
  98.     bm.LoadBitmap(IDR_SRVRAPPL);
  99.     CImageList *il = new CImageList;
  100.     il->Create(16, 16, ILC_COLOR | ILC_MASK, 4, 0);
  101.     il->Add(&bm, RGB(0, 128, 128)); 
  102.     m_SrvrTree->SetImageList(il, TVSIL_NORMAL);
  103.     bm.DeleteObject();
  104.  
  105.     do
  106.     { 
  107.         DWORD KeyLen = sizeof(Server);
  108.         if (RegEnumKey(hKey, ind++, Server, KeyLen) != ERROR_SUCCESS)
  109.             break;
  110.         // get server info from the registry:
  111.         BOOL local = FALSE, verok = FALSE, ras = FALSE;
  112.         if (RegOpenKeyEx(hKey, Server, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
  113.         { 
  114.             KeyLen = MAX_PATH;  
  115.             *Path  = 0;
  116.             RegQueryValueEx(hSubKey, "Path",  NULL, NULL, (BYTE *)Path, &KeyLen);
  117.             local  = *Path != 0;
  118.             KeyLen = MAX_PATH;  
  119.             *Path  = 0;
  120.             RegQueryValueEx(hSubKey, "Version", NULL, NULL, (BYTE *)Path, &KeyLen);
  121.             verok  = !lstrcmp(Path, "5");
  122.             KeyLen = MAX_PATH;  
  123.             *Path  = 0;
  124.             RegQueryValueEx(hSubKey, "ConnectionName", NULL, NULL, (BYTE *)Path, &KeyLen);
  125.             if (*Path) 
  126.                 ras = TRUE;
  127.             KeyLen = MAX_PATH;  
  128.             *(BOOL *)Path = FALSE;
  129.             RegQueryValueEx(hSubKey, "Through Firewall", NULL, NULL, (BYTE *)Path, &KeyLen);
  130.             if (*(BOOL *)Path) 
  131.                 ras = TRUE;
  132.             RegCloseKey(hSubKey);
  133.         }
  134.         if (!verok) 
  135.             continue;
  136.         // select the proper image:
  137.         int iImage;
  138.         if (local)
  139.             iImage  = IND_SRVLOCAL;
  140.         else
  141.               iImage  = ras ? IND_SRVRAS : IND_SRVREMNR;
  142.         HTREEITEM it = m_SrvrTree->InsertItem
  143.                        (
  144.                            TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM,
  145.                            Server,
  146.                            iImage,
  147.                            iImage,
  148.                            0, 0, 
  149.                            0,
  150.                            TVI_ROOT,
  151.                            TVI_LAST
  152.                        );
  153.         m_SrvrTree->InsertItem
  154.         (
  155.             TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM,
  156.             NULL,
  157.             IND_APPL,
  158.             IND_APPL,
  159.             0, 0, 
  160.             1,
  161.             it,
  162.             TVI_LAST
  163.         );
  164. // fictive branch, used to expand the item:
  165.               //is.hParent= anItem;
  166.             //TreeView_InsertItem(hTree, &is);
  167.     } 
  168.     while (TRUE);
  169.     RegCloseKey(hKey);
  170.     return(TRUE);
  171. }
  172.  
  173. void CSelSrvrApplDlg::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
  174. {
  175.     // TODO: Add your control notification handler code here
  176.     *pResult = 0;
  177.     HTREEITEM hItem = m_SrvrTree->GetSelectedItem();
  178.     if (!hItem)
  179.         return;
  180.  
  181.     if (IsAppl(hItem))
  182.     {
  183.         SetDlgItemText(IDC_APPLEDIT, m_SrvrTree->GetItemText(hItem));
  184.     }
  185.     else
  186.     {
  187.         TV_ITEM ti;
  188.         ti.mask       = TVIF_TEXT;
  189.         ti.hItem      = hItem;
  190.         ti.pszText    = m_SelServerName;
  191.         ti.cchTextMax = sizeof(m_SelServerName);
  192.         m_SrvrTree->GetItem(&ti);
  193.         SetDlgItemText(IDC_SRVREDIT, m_SelServerName);
  194.     }
  195. }
  196.  
  197. void CSelSrvrApplDlg::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) 
  198. {
  199.     NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  200.     // TODO: Add your control notification handler code here
  201.     *pResult = 0;
  202.     if (m_NoAppl)
  203.     {
  204.         *pResult = 1;
  205.         return;
  206.     }
  207.     if (pNMTreeView->action == TVE_EXPAND)
  208.     {
  209.         //m_SrvrTree->SetRedraw(FALSE);
  210.         CWBApp *WBApp   = (CWBApp *)AfxGetApp();
  211.         if (m_SelServer)
  212.         {
  213.             WBApp->Logout();
  214.             m_SrvrTree->Expand(m_SelServer, TVE_COLLAPSE);
  215.             m_SelServer = NULL;
  216.         }
  217.         HTREEITEM hItem = pNMTreeView->itemNew.hItem;
  218.         m_SrvrTree->SelectItem(hItem);
  219.         CString Server  = m_SrvrTree->GetItemText(hItem);
  220.         if (!WBApp->WBAppInit(NULL, m_UserName, m_Password, Server))
  221.         {
  222.                *pResult = TRUE;
  223.             return;
  224.         }
  225.         HTREEITEM delItem;
  226.         while ((delItem = m_SrvrTree->GetChildItem(hItem)))
  227.             m_SrvrTree->DeleteItem(delItem);
  228.         m_SelServer = hItem;
  229.         cdp_t cdp = WBApp->GetCdp();
  230.         tcursnum Curs;
  231.         if (cd_Open_cursor_direct(cdp, "SELECT OBJ_NAME FROM OBJTAB WHERE CATEGORY=Chr(7)", &Curs))
  232.         {
  233.             Signalize();
  234.             return;
  235.         }
  236.         tobjname Appl;
  237.         trecnum  Pos = 0;
  238.         while (!cd_Read_ind(cdp, Curs, Pos++, 1, NOINDEX, Appl))
  239.         {
  240.             small_string(Appl, TRUE);
  241.             m_SrvrTree->InsertItem
  242.             (
  243.                 TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM,
  244.                 Appl,
  245.                 IND_APPL,
  246.                 IND_APPL,
  247.                 0, 0, 
  248.                 1,
  249.                 hItem,
  250.                 TVI_LAST
  251.             );
  252.         }
  253.         if (cd_Sz_error(cdp) != OUT_OF_TABLE)
  254.             Signalize();
  255.         Close_cursor(Curs);
  256. //redraw:
  257.         //m_SrvrTree->SetRedraw(TRUE);
  258.     }
  259.     else if (pNMTreeView->action == TVE_COLLAPSE)
  260.     {
  261.         ((CWBApp *)AfxGetApp())->Logout();
  262.         m_SelServer = NULL;
  263.     }
  264. }
  265.  
  266. void CSelSrvrApplDlg::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
  267. {
  268.     // TODO: Add your control notification handler code here
  269.     *pResult = 0;
  270.     if (m_NoAppl || IsAppl())
  271.         OnOK();
  272. }
  273.  
  274. void CSelSrvrApplDlg::OnChangeEdit() 
  275. {
  276.     // TODO: Add your control notification handler code here
  277.     tobjname ServerName;
  278.     CWnd *Edit = GetDlgItem(IDC_SRVREDIT);
  279.     int sz = Edit->GetWindowText(ServerName, sizeof(ServerName));
  280.     if (lstrcmp(ServerName, m_SelServerName))
  281.     {
  282.         if (m_SelServer)
  283.         {
  284.             m_SrvrTree->Expand(m_SelServer, TVE_COLLAPSE);
  285.             m_SelServer = NULL;
  286.         }
  287.         ((CWBApp *)AfxGetApp())->Logout();
  288.     }
  289.     Edit = GetDlgItem(IDC_APPLEDIT);
  290.     GetDlgItem(IDOK)->EnableWindow(sz && (m_NoAppl || Edit->GetWindowTextLength()));
  291. }
  292.  
  293. void CSelSrvrApplDlg::OnOK() 
  294. {
  295.     // TODO: Add extra validation here
  296.     tobjname SrvrAppl;
  297.     CWBApp *WBApp = (CWBApp *)AfxGetApp();
  298.     if (!WBApp->Linked())
  299.     {
  300.         if (!GetDlgItemText(IDC_SRVREDIT, SrvrAppl, sizeof(SrvrAppl)))
  301.             return;
  302.         if (!WBApp->WBAppInit(NULL, m_UserName, m_Password, SrvrAppl))
  303.             return;
  304.     }
  305.     if (!m_NoAppl)
  306.     {    
  307.         if (!m_Appl)
  308.         {
  309.             if (!GetDlgItemText(IDC_APPLEDIT, SrvrAppl, sizeof(SrvrAppl)))
  310.                 return;
  311.             m_Appl = SrvrAppl;
  312.         }
  313.         if (!WBApp->SetApplication(m_Appl))
  314.             return;
  315.     }
  316.     CDialog::OnOK();
  317. }
  318.  
  319. BOOL CSelSrvrApplDlg::IsAppl(HTREEITEM hItem)
  320. {
  321.     TV_ITEM   ti;
  322.     ti.mask  = TVIF_PARAM;
  323.     ti.hItem = hItem;
  324.     if (!hItem)
  325.         ti.hItem = m_SrvrTree->GetSelectedItem();
  326.     m_SrvrTree->GetItem(&ti);
  327.     return ti.lParam;
  328. }
  329.  
  330. void CSelSrvrApplDlg::OnDestroy() 
  331. {
  332.     CDialog::OnDestroy();
  333.     
  334.     // TODO: Add your message handler code here
  335.     CImageList *il = m_SrvrTree->GetImageList(TVSIL_NORMAL);
  336.     delete il;
  337. }
  338.  
  339.