📄 predlg.cpp
字号:
// PreDlg.cpp : implementation file
//
#include "stdafx.h"
#include "yhgl.h"
#include "PreDlg.h"
#include ".\GrantPrivilegesForSDEUser.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define Max 999
extern CYhglApp theApp;
CString AllData[Max],PartData[Max],QX[Max];
int RID[Max];
int CheckState[Max][2];
/////////////////////////////////////////////////////////////////////////////
// CPreDlg dialog
CPreDlg::CPreDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPreDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPreDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
ai=0;
pi=0;
}
void CPreDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPreDlg)
DDX_Control(pDX, IDOK, m_exit);
DDX_Control(pDX, IDCANCEL, m_cancel);
DDX_Control(pDX, IDC_LIST1, m_List);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPreDlg, CDialog)
//{{AFX_MSG_MAP(CPreDlg)
ON_NOTIFY(NM_CLICK, IDC_LIST1, OnClickList1)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnColumnclickList1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPreDlg message handlers
BOOL CPreDlg::Create()
{
return CDialog::Create(CPreDlg::IDD);
}
// DestroyWindow();
//void CPreDlg::OnCancel()
// DestroyWindow();
void CPreDlg::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}
BOOL CPreDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_exit.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_exit.SetBkColor(RGB(234,216,187));
m_exit.SetTooltipText(_T("更新记录并退回到先前目录"));
m_exit.SetRounded(TRUE);
m_cancel.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_cancel.SetBkColor(RGB(234,216,187));
m_cancel.SetTooltipText(_T("退出"));
m_cancel.SetRounded(TRUE);
#if 0 // -----------------------------------------------------------
DWORD dwStyle = LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS |
WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP;
CRect rect, rectbutton;
GetClientRect(&rect);
GetDlgItem(IDC_BUTTON1)->GetClientRect(&rectbutton);
rect.DeflateRect(5, 5);
rect.top = rectbutton.bottom + 15;
TRACE(" calling CreateEx\n");
// you may also use Create(), but I prefer WS_EX_CLIENTEDGE style
VERIFY(m_List.CreateEx(WS_EX_CLIENTEDGE, _T("SysListView32"), _T(""),
dwStyle, rect, this, IDC_LIST1, NULL));
CFont *pFont = GetFont();
if (pFont)
m_List.SetFont(pFont);
#endif // -----------------------------------------------------------
// XListCtrl must have LVS_EX_FULLROWSELECT if combo boxes are used
m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_TRACKSELECT | LVS_EX_GRIDLINES);//
m_List.flag = 3;
// call EnableToolTips to enable tooltip display
m_List.EnableToolTips(TRUE);
if(rname!="")
{
InitListCtrl(m_List);
FillListCtrl(m_List);
CString str,title;
GetWindowText (str);
title.Format("%s-%s",str,rname);
SetWindowText(title);
}
else
{
MessageBox("必须创建完用户组点击应用后才能进行权限设置!");
CDialog::OnCancel();
}
return TRUE;
// return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CPreDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMIA = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
int nItem = -1;
int nSubItem = -1;
if (pNMIA)
{
nItem = pNMIA->iItem;
nSubItem = pNMIA->iSubItem;
}
TRACE(_T("in CXListCtrlTestDlg::OnClick: %d, %d\n"), nItem, nSubItem);
*pResult = 0;
}
void CPreDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
int nItem = -1;
int nSubItem = -1;
if (pNMLV)
{
nItem = pNMLV->iItem;
nSubItem = pNMLV->iSubItem;
}
TRACE(_T("in CXListCtrlTestDlg::OnColumnClick: %d, %d\n"), nItem, nSubItem);
*pResult = 0;
}
void CPreDlg::InitListCtrl(CXListCtrl &list)
{
// set column width according to window rect
CRect rect;
list.GetWindowRect(&rect);
int w = rect.Width() - 2;
int colwidths[3] = { 20,15,20};
TCHAR * lpszHeaders[] = { _T(" 数据集 "),
_T(" 只 读 "),_T(" 可 读 写"),};
int i;
int total_cx = 0;
LV_COLUMN lvcolumn;
memset(&lvcolumn, 0, sizeof(lvcolumn));
// add columns
for (i = 0; ; i++)
{
if (lpszHeaders[i] == NULL)
break;
lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
lvcolumn.fmt = (i == 0 || i ==1) ? LVCFMT_LEFT : LVCFMT_CENTER;
lvcolumn.pszText = lpszHeaders[i];
lvcolumn.iSubItem = i;
lvcolumn.cx = (lpszHeaders[i+1] == NULL) ? w - total_cx - 2 : (w * colwidths[i]) / 64;
total_cx += lvcolumn.cx;
list.InsertColumn(i, &lvcolumn);
}
list.m_HeaderCtrl.SetImageList(&list.m_cImageList);
// iterate through header items and attach the image list
HDITEM hditem;
for (i = 0; i < list.m_HeaderCtrl.GetItemCount(); i++)
{
hditem.mask = HDI_IMAGE | HDI_FORMAT;
list.m_HeaderCtrl.GetItem(i, &hditem);
hditem.fmt |= HDF_IMAGE;
if (i == 0 || i == 1)
hditem.iImage = XHEADERCTRL_UNCHECKED_IMAGE;
else
hditem.iImage = XHEADERCTRL_NO_IMAGE;
list.m_HeaderCtrl.SetItem(i, &hditem);
}
memset(&lvcolumn, 0, sizeof(lvcolumn));
// set the format again - must do this twice or first column does not get set
for (i = 0; ; i++)
{
if (lpszHeaders[i] == NULL)
break;
lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM;
lvcolumn.fmt = (i == 1 || i == 2) ? LVCFMT_LEFT : LVCFMT_CENTER;
lvcolumn.iSubItem = i;
list.SetColumn(i, &lvcolumn);
}
}
void CPreDlg::FillListCtrl(CXListCtrl &list)
{
CString sql,str;
list.LockWindowUpdate(); // ***** lock window updates while filling list *****
//清除控件列表
list.DeleteAllItems();
//清除权限数组
rgPrivArray.removeAll();
//权限组ID
rgPrivArray.qid = rid;
RoleGroupPrivilege *pPrivItem = NULL;
//m_pRecordset1->get_RecordCount(&recNum);
//从数据集表中取所有数据集代码
_RecordsetPtr m_pRecordset2;
m_pRecordset2.CreateInstance("ADODB.Recordset");
try
{
m_pRecordset2->Open("SELECT DSCODE,DSSHORTNAME FROM SDE.TB_DSMETADATA",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error e)///捕捉异常
{
MessageBox("读取数据集元数据表失败!");
OnCancel();
return;
}
long dsNum;
m_pRecordset2->get_RecordCount(&dsNum);
if (dsNum > 0)
{
m_pRecordset2->MoveFirst();
while(!m_pRecordset2->adoEOF)
{
pPrivItem = new RoleGroupPrivilege;
vDscode = m_pRecordset2->GetCollect("DSCODE");
if (vDscode.vt != VT_NULL) pPrivItem->dscode = (LPCTSTR)(_bstr_t)vDscode;
vDsName = m_pRecordset2->GetCollect("DSSHORTNAME");
if (vDsName.vt != VT_NULL) pPrivItem->dsShortName = (LPCTSTR)(_bstr_t)vDsName;
rgPrivArray.Add(pPrivItem);
m_pRecordset2->MoveNext();
}
}
m_pRecordset2->Close();
//fillListWithPriviledgeArray(list,rgPrivArray);
//从TB_RoleGroupPrivilege取已知权限设置
_RecordsetPtr m_pRecordset1;
try
{
m_pRecordset1.CreateInstance("ADODB.Recordset");
sql.Format("SELECT dscode,Privilege,Description FROM SDE.TB_RoleGroupPrivilege r where r.RoleGroupID=%d",rid);
m_pRecordset1->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error e)///捕捉异常
{
MessageBox("读取TB_RoleGroupPrivilege表失败!");
OnCancel();
return;
}
long recNum;
if (m_pRecordset1 == NULL) return;
m_pRecordset1->get_RecordCount(&recNum);
if (recNum > 0)
{
m_pRecordset1->MoveFirst();
while(!m_pRecordset1->adoEOF)
{
//pPrivItem = new RoleGroupPrivilege;
CString tmpdscode;
vDscode = m_pRecordset1->GetCollect(0L);//"DSCODE"
//取dscode
if(vDscode.vt == VT_NULL)
{
m_pRecordset1->MoveNext();
continue;
}
tmpdscode = (LPCTSTR)(_bstr_t)vDscode;
pPrivItem = rgPrivArray.getItemViaDscode(tmpdscode);
if (pPrivItem == NULL)
{
m_pRecordset1->MoveNext();
continue;
}
//pPrivItem->dscode = (LPCTSTR)(_bstr_t)vDscode;
vPre = m_pRecordset1->GetCollect(1L); //"Privilege"
if(vPre.vt != VT_NULL)
{
str = (LPCTSTR)(_bstr_t)vPre;
pPrivItem->privilege = str[0];
}
//vQid=m_pRecordset2->GetCollect("RoleGroupID");
/* vDsName = m_pRecordset1->GetCollect(2L); //ds short name
if(vDsName.vt != VT_NULL)
{
str = (LPCTSTR)(_bstr_t)vPre;
pPrivItem->dsShortName = str;
}
//rgPrivArray.Add(pPrivItem);*/
m_pRecordset1->MoveNext();
}
}
m_pRecordset1->Close();
fillListWithPriviledgeArray(list,rgPrivArray);
}
//将内存中的权限数组填充到listctrl中
void CPreDlg::fillListWithPriviledgeArray(CXListCtrl &list,RGPrivArray &rgPrivArray)
{
int nItem;
CString str;
int n = rgPrivArray.GetSize();
RoleGroupPrivilege **ppPriv = rgPrivArray.GetData();
for (nItem=0; nItem<n; nItem++,ppPriv++)
{
RoleGroupPrivilege *pPriv = *ppPriv;
list.InsertItem(nItem, str);
list.SetItemText(nItem, 0, pPriv->dscode);
if (pPriv->privilege == '1') //只读
{
list.SetCheckbox(nItem, 1, 1);
list.SetCheckbox(nItem, 2, 0);
}
else if (pPriv->privilege == '2') //读写
{
list.SetCheckbox(nItem, 1, 1);
list.SetCheckbox(nItem, 2, 1);
}
else //无操作权限
{
list.SetCheckbox(nItem, 1, 0);
list.SetCheckbox(nItem, 2, 0);
}
list.SetItemToolTipText(nItem, 0, pPriv->dsShortName);
}
list.UnlockWindowUpdate(); // ***** unlock window updates *****
}
void CPreDlg::OnOK()
{
CString sTargetUser, sDataset, sPriv, sOwner,str,sDscode;
sOwner=DBSDE::user;
BOOL ret;
int n = 0;
BeginWaitCursor();
//从SDE数据库中取Workspace
// IWorkspacePtr pSDEWorkspace;
// if (!DBSDE::IsSDEConnected()) pSDEWorkspace = DBSDE::ConnectSDE();
// else pSDEWorkspace = DBSDE::g_pSDEWorkspace;
// if (pSDEWorkspace == NULL) return;
//由视图获取各个数据集的操作权限
int dsNum = rgPrivArray.GetSize();
if (dsNum <=0) return;
if (dsNum != m_List.GetItemCount()) return;
RoleGroupPrivilege **ppPriv = rgPrivArray.GetData();
RoleGroupPrivilege *pPriv;
for(int i=0; i<dsNum; i++,ppPriv++)
{
//获取DSCODE作为关联
sDscode = m_List.GetItemText(i,0);
TCHAR privTag = '0'; //权限标记
pPriv = rgPrivArray.getItemViaDscode(sDscode);
if (pPriv == NULL) continue;
if (m_List.GetCheckbox(i,2) == 1) //读写
privTag = '2';
else if (m_List.GetCheckbox(i,1) == 1) //只读
privTag = '1';
else privTag = '0';
//记录是否变化
pPriv->bModified = !(privTag == pPriv->privilege);
//更新权限标记
pPriv->privilege = privTag;
}
//删除TB_RoleGroupPrivilege中用户组ID=lGroupID的所有控制权限设置
CString sql,qx;
_variant_t RecordsAffected,val;
sql.Format(_T("Delete From SDE.TB_RoleGroupPrivilege where RoleGroupID = %d"),rid);
try
{
theApp.m_pConnection->Execute((_bstr_t)sql,&RecordsAffected,adExecuteNoRecords);
}
catch(_com_error e)///捕捉异常
{
str.Format("删除用户组%s权限表所有控制权限设置出错!",rname);
MessageBox(str,"提示:"); return;
}
//添加新设置的信息
_RecordsetPtr tmpRecordset;
tmpRecordset.CreateInstance("ADODB.Recordset");
sql.Format("SELECT RoleGroupID,dscode,Privilege FROM SDE.TB_RoleGroupPrivilege");
try
{
tmpRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error e)///捕捉异常
{
str.Format("打开权限表TB_RoleGroupPrivilege出错!");
MessageBox(str,"提示:"); return;
}
ppPriv = rgPrivArray.GetData();
for(i=0; i<dsNum; i++,ppPriv++)
{
pPriv = *ppPriv;
if (pPriv == NULL) continue;
//数据集代码作为赋予权限的数据集单元
sDataset = pPriv->dscode;
//如果管理员已经修改权限,有必要更新数据库的权限
if (pPriv->bModified)
{
ret = TRUE;
if (pPriv->privilege == '1') //"只读";
qx = _T("1");
else if (pPriv->privilege == '2') //可读写
qx = _T("2");
else qx = _T("0");
/*ret = GrantPrivileges(rname, sDataset, qx, sOwner, pSDEWorkspace);
if (!ret)
{
str.Format("不能为用户%s设置数据集%s的读写权限\n可能是用户设置不正确.",rname,sDataset);
MessageBox (str,"提示:",MB_OK|MB_ICONINFORMATION);
tmpRecordset->Close();
return;
}*/
}
if (pPriv->privilege == '0') continue;//无操作权限无需记录
tmpRecordset->AddNew();
val.vt = VT_I4; val.lVal = (long)rid;
tmpRecordset->PutCollect("ROLEGROUPID",val);
CComVariant vdscode(pPriv->dscode);
//val.vt = VT_BSTR; val.bstrVal = pPriv->dscode.AllocSysString();
tmpRecordset->PutCollect("DSCODE",vdscode);
str.Format("%c",pPriv->privilege);
CComVariant vpriv(str);
tmpRecordset->PutCollect("PRIVILEGE",vpriv);
tmpRecordset->Update();
}
tmpRecordset->Close();
EndWaitCursor();
str.Format("完成为用户%s配置数据集权限!",rname);
MessageBox(str,"提示:",MB_OK|MB_ICONINFORMATION);
//DestroyWindow();
CDialog::OnCancel();
}
void CPreDlg::OnCancel()
{
DestroyWindow();
//CDialog::OnCancel();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -