⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 predlg.cpp

📁 一个实用的GIS系统的系统维护模块
💻 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 + -