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

📄 access.c

📁 UNIX 界面程序
💻 C
字号:
#include "menu.h"
#include "tool.h"
#include "mytools.h"


#define ITEMS MAX_MENU_ITEMS	/* 操作员最多使用项数, 即最大选择项数 */

extern int Access;
extern int G_start_menu_no;

char power_bak[ITEMS];

void ChgOperAccess();

int	OperAccess(pPower)
char	*pPower;
{
	struct S_menu_a SMenuActiveStatusBak[MAXSCR];
	struct S_item_info_struc item_info_bak[MAXITEM];
	char sFileName[128];
	int i;

	sprintf(sFileName, "/tmp/.access.%d.oper", getpid());
	scr_dump(sFileName);

	/*
	 * 将参数传来的权限组设置为菜单运行权限组
	 */
	i = 0;
	while (1) {
		if (i >= iMenuItemCount || SMenuItem[i].iChildMenu == 99 || !strcmp(SMenuItem[i].sItemId, "I_END"))
			break;
		power_bak[i] = (char)SMenuItem[i].iPower;
		if (pPower[0] != -1)
			SMenuItem[i].iPower = (int)pPower[i];
		i++;
	}
	for (i = 0; i < MAXSCR; i++)
		memcpy(SMenuActiveStatusBak + i, SMenuActiveStatus + i,
		    sizeof(struct S_menu_a));

	for (i = 0; i < MAXITEM; i++)
		memcpy(item_info_bak + i, SItemInfo + i,
		    sizeof(struct S_item_info_struc));

	ChgOperAccess();

	/*
	 * 修改权限模板后恢复原权限值,以便继续运行
	 */
	i = 0;
	while (1) {
		if (i >= iMenuItemCount
		    || SMenuItem[i].iChildMenu == 99
		    || !strcmp(SMenuItem[i].sItemId, "I_END"))
			break;
		pPower[i] = (char)SMenuItem[i].iPower;
		SMenuItem[i].iPower = (int)power_bak[i];
		i++;
	}
	for (i = 0; i < MAXSCR; i++)
		memcpy(SMenuActiveStatus + i, SMenuActiveStatusBak + i, sizeof(struct S_menu_a));

	for (i = 0; i < MAXITEM; i++)
		memcpy(SItemInfo + i, item_info_bak + i,
		    sizeof(struct S_item_info_struc));

	/*
	 * 改变角色权限后另外显示主菜单以便画面不乱
	DispMainMenu(stdscr, SMenuActiveStatus[0].iItem);
	 */

	scr_restore(sFileName);
	unlink(sFileName);

	return(0);
}

/*
 * 修改角色操作权限
 */
void	ChgOperAccess()
{
	FILE *pMyMenuFd;
	char sFileName[128];
	int i, iOldMenu, iNewMenu, iMenuItemQue, iLocateItem, iRet;
	char	*pWorkDir;
	WINDOW	*wWin;

	wWin = stdscr;

	pWorkDir = (char *)getenv("WORKDIR");
	if (pWorkDir == NULL) {
		mvprintw(LINES-1, 0, "WORKDIR not set.");
		return;
	}
	sprintf(sFileName, "%s%s", pWorkDir, MENU_f);
	pMyMenuFd = fopen(sFileName, "r");
	if (pMyMenuFd == NULL) {
		mvprintw(LINES-1, 0, "FIle %s open error.", sFileName);
		return;
	}

	for (i = 4; i < 20; i++) {
		move(i, 0);
		clrtoeol();
	}
	move(21, 0);
	clrtoeol();
	h_prompt(21, 1, "                 SPACEBAR : 切换选择    ESCAPE : 退出权限设置                 ", 0, 0);
	DispBelow("权限设置");

	if (!strcmp(G_oper_no, "00")) {
		/*
		 * 若是00操作员,则放开所有菜单选择项,以便赋给
		 * 其他操作员
		 */
		for (i = 0; i < iMenuItemCount; i++)
			SMenuItem[i].iPower = 1;
	}
	/*
	 * 置权限设置标志
	 */
	Access = 1;
	for (i = 0; i < iMenuCount; i++) {
		iRet = 0;
		while (1) {
			iLocateItem = SMenu[i].iMenuItemSet[iRet];
			if (iLocateItem == -1) {
				iRet = -1;
				break;
			}
			if (power_bak[iLocateItem])
				break;
			iRet++;
		}
		SMenuActiveStatus[i].iItem = iRet;
	}
	iOldMenu = G_start_menu_no;
	SMenuActiveStatus[iOldMenu].iFatherMenu = -1;
	iLocateItem = SMenuActiveStatus[iOldMenu].iItem;

	while (1) {
		iRet = DispMenu(wWin, iOldMenu, &iLocateItem, pMyMenuFd);
		if (iRet == ERR_MENU)
			break;
		if (iRet == CLOSE) {
			i = 0;
			while (1) {
				iLocateItem = SMenu[iOldMenu].iMenuItemSet[i];
				if (iLocateItem == -1) {
					i = -1;
					break;
				}
				if (power_bak[iLocateItem]) break;
				i++;
			}
			SMenuActiveStatus[iOldMenu].iItem = i;
			iOldMenu = SMenuActiveStatus[iOldMenu].iFatherMenu;
			iLocateItem = SMenuActiveStatus[iOldMenu].iItem;
			continue;
		}
		if (iRet == OPEN_RIGHT) {
			SMenuActiveStatus[iOldMenu].iItem = iLocateItem;
			iOldMenu = SMenuActiveStatus[iOldMenu].iFatherMenu;
			iLocateItem = SMenuActiveStatus[iOldMenu].iItem;
			while (1) {
				iLocateItem++;
				if (SMenu[iOldMenu].iMenuItemSet[iLocateItem] == -1)
					iLocateItem = 0;
				i = SMenu[iOldMenu].iMenuItemSet[iLocateItem];
				if (power_bak[i]) break;
			}
			DispMenuItem0(wWin, iOldMenu, iLocateItem);
		} else if (iRet == OPEN_LEFT) {
			SMenuActiveStatus[iOldMenu].iItem = iLocateItem;
			iOldMenu = SMenuActiveStatus[iOldMenu].iFatherMenu;
			iLocateItem = SMenuActiveStatus[iOldMenu].iItem;
			while (1) {
				if (iLocateItem == 0)
					while (SMenu[iOldMenu].iMenuItemSet[iLocateItem + 1] != -1)
						iLocateItem++;
				else
					iLocateItem--;
				i = SMenu[iOldMenu].iMenuItemSet[iLocateItem];
				if (power_bak[i]) break;
			}
			DispMenuItem0(wWin, iOldMenu, iLocateItem);
		}
		iMenuItemQue = SMenu[iOldMenu].iMenuItemSet[iLocateItem];
		switch ( SMenuItem[iMenuItemQue].cProcType ) {
		    case 'E':  /* 返回上级菜单 */
			i = 0;
			while (1) {
			    iLocateItem = SMenu[iOldMenu].iMenuItemSet[i];
			    if (iLocateItem == -1) {
				i = -1;
				break;
			    }
			    if (power_bak[iLocateItem]) break;
			    i++;
			}
			SMenuActiveStatus[iOldMenu].iItem = i;
			iOldMenu = SMenuActiveStatus[iOldMenu].iFatherMenu;
			iLocateItem = SMenuActiveStatus[iOldMenu].iItem ;
			touchwin(wWin);
			wrefresh(wWin);
			break;
		    case 'F':   /* 无下级菜单 */
			break;
		    case 'M':   /* 下级菜单 */
			SMenuActiveStatus[iOldMenu].iItem = iLocateItem;
			iNewMenu = SMenuItem[iMenuItemQue].iChildMenu;
			SMenuActiveStatus[iNewMenu].iFatherMenu = iOldMenu;
			iLocateItem = SMenuActiveStatus[iNewMenu].iItem;
			iOldMenu = iNewMenu;       /* iNewMenu 为新的菜单号 */
			break;
		    default:  /*  */
			break;
		}
	}

	Access = 0;

	fclose(pMyMenuFd);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -