summaryrefslogblamecommitdiffstats
path: root/private/windows/gina/policy/poledit/infmgr.c
blob: 53d3f13f6e31bab964d982f8d0050c81c14b1f8e (plain) (tree)















































































































































































































































































                                                                                                               
//*********************************************************************
//*                  Microsoft Windows                               **
//*            Copyright(c) Microsoft Corp., 1993                    **
//*********************************************************************

#include "admincfg.h"

BOOL fInfLoaded = FALSE;

BOOL OpenTemplateDlg(HWND hWnd,TCHAR * szFilename,UINT cbFileName);

BOOL GetATemplateFile(HWND hWnd)
{
	TCHAR szTmpFilename[MAX_PATH+1];

	// user cancelled or didn't select a file
	if (!OpenTemplateDlg(hWnd,szTmpFilename,ARRAYSIZE(szTmpFilename)))
		return FALSE;

	SendDlgItemMessage(hWnd,IDD_TEMPLATELIST,LB_ADDSTRING,0,(LPARAM) szTmpFilename);

	return TRUE;
}

UINT LoadTemplatesFromDlg(HWND hWnd)
{
	UINT uRet;
	TCHAR szFilename[MAX_PATH+1];
	UINT i=0;
    DWORD dwUsed, dwSize;

	UnloadTemplates();	// unload previous files, if any
	PrepareToLoadTemplates();

    while (LB_ERR != SendDlgItemMessage(hWnd,IDD_TEMPLATELIST,LB_GETTEXT,
	         i,(LPARAM) szFilename))
	{

		uRet = LoadTemplateFile(hWnd,szFilename);

		if (uRet != ERROR_SUCCESS) {
			if (uRet != ERROR_ALREADY_DISPLAYED) {
				DisplayStandardError(hWnd,szFilename,IDS_ErrOPENTEMPLATE,uRet);
			}

			return uRet;
		}

		i++;
    }


    // Fill up the template file buffer.
    i=0;
    dwUsed = 0;
    while (LB_ERR != SendDlgItemMessage(hWnd,IDD_TEMPLATELIST,LB_GETTEXT,
	         i,(LPARAM) szFilename))
    {
        dwSize = lstrlen(szFilename)+1;
		if (!(pbufTemplates=ResizeBuffer(pbufTemplates,hBufTemplates,dwUsed+dwSize+4,&dwBufTemplates)))
				return ERROR_NOT_ENOUGH_MEMORY;

		lstrcpy(pbufTemplates+dwUsed,szFilename);
		dwUsed += dwSize;
		i++;
	}

	// doubly null-terminate the buffer... safe to do this because we
	// tacked on the extra "+4" in the ResizeBuffer calls above
	*(pbufTemplates+dwUsed) = TEXT('\0');

	return ERROR_SUCCESS;
}

UINT LoadTemplates(HWND hWnd)
{
	UINT uRet;
    TCHAR *szFilename;
	UINT i=0;

	if (!(*pbufTemplates))
	   return ERROR_FILE_NOT_FOUND;  //Nothing to load.
	
	UnloadTemplates();	// unload previous file, if any
	PrepareToLoadTemplates();

    szFilename = pbufTemplates;
	while (*szFilename)
	{
		uRet = LoadTemplateFile(hWnd,szFilename);

		if (uRet != ERROR_SUCCESS) {
			if (uRet != ERROR_ALREADY_DISPLAYED) {
				DisplayStandardError(hWnd,szFilename,IDS_ErrOPENTEMPLATE,uRet);
			}

			return uRet;
		}
		szFilename += lstrlen(szFilename)+1;
	}

	return ERROR_SUCCESS;
}




BOOL OpenTemplateDlg(HWND hWnd,TCHAR * szFilename,UINT cbFilename)
{
	OPENFILENAME ofn;
	TCHAR szFilter[SMALLBUF];
	TCHAR szOpenInfTitle[SMALLBUF];
	
	lstrcpy(szFilename,szNull);
	LoadSz(IDS_InfOPENTITLE,szOpenInfTitle,ARRAYSIZE(szOpenInfTitle));

	// have to load the openfile filter in 2 stages, because the string
	// contains a terminating character and LoadString won't load the
	// whole thing in one go
	memset(szFilter,0,(ARRAYSIZE(szFilter) * sizeof(TCHAR)));
	LoadSz(IDS_InfOPENFILTER1,szFilter,ARRAYSIZE(szFilter));
	LoadSz(IDS_InfOPENFILTER2,szFilter+lstrlen(szFilter)+1,ARRAYSIZE(szFilter)-
		(lstrlen(szFilter)-1));
	
	memset(&ofn,0,sizeof(ofn));
	ofn.lStructSize = sizeof(ofn);
	ofn.hwndOwner = hWnd;
	ofn.hInstance = ghInst;
	ofn.lpstrFilter = szFilter;
	ofn.lpstrFile =	szFilename;
	ofn.nMaxFile = cbFilename;
	ofn.lpstrTitle = szOpenInfTitle;
	ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST
		| OFN_SHAREAWARE | OFN_HIDEREADONLY;

	return GetOpenFileName(&ofn);
}


UINT PrepareToLoadTemplates()
{
	gClassList.nUserDataItems = 0;
	gClassList.nMachineDataItems = 0;

	if (!InitializeRootTables()) 
		return ERROR_NOT_ENOUGH_MEMORY;

        return ERROR_SUCCESS;
}

UINT LoadTemplateFile(HWND hWnd,TCHAR * szFilename)
{
	HANDLE hFile;
	UINT uRet;
	TCHAR szStatusTextOld[255];
	TCHAR szStatusText[SMALLBUF+MAX_PATH+1];

	// open the specified file
	if ((hFile = CreateFile(szFilename,GENERIC_READ,FILE_SHARE_READ,
		NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)) == INVALID_HANDLE_VALUE) {
#ifdef DEBUG
		wsprintf(szDebugOut,TEXT("LoadTemplateFile: CreateFile returned %lu\r\n"),
			GetLastError());
		OutputDebugString(szDebugOut);
#endif
		return (UINT) GetLastError();
	}

	// save old status bar text
	GetStatusText(szStatusTextOld,ARRAYSIZE(szStatusTextOld));

	// set status bar text a la "loading template file <name>..."
	wsprintf(szStatusText,LoadSz(IDS_LOADINGTEMPLATE,szSmallBuf,
		ARRAYSIZE(szSmallBuf)),szFilename);
	SetStatusText(szStatusText);

	uRet=ParseTemplateFile(hWnd,hFile,szFilename);
	
	SetStatusText(szStatusTextOld);
	CloseHandle(hFile);

	if (uRet != ERROR_SUCCESS)
		FreeRootTables();
	else {
		fInfLoaded = TRUE;
		dwAppState |= AS_CANHAVEDOCUMENT;
	}
	return uRet;
}

VOID UnloadTemplates(VOID)
{
	if (fInfLoaded) {
		FreeRootTables();
		fInfLoaded = FALSE;
		dwAppState &= ~AS_CANHAVEDOCUMENT;
	}
}	


VOID EnableMainMenuItems(HWND hwndApp,BOOL fEnable)
{
	HMENU hMenu = GetMenu(hwndApp);
	UINT uFlags = MF_BYCOMMAND | (fEnable ? MF_ENABLED : MF_DISABLED);

	EnableMenuItem(GetMenu(hwndMain),IDM_NEW,uFlags);
	EnableMenuItem(GetMenu(hwndMain),IDM_OPEN,uFlags);

}

/*******************************************************************

	NAME:		GetDefaultTemplateFilename

	SYNOPSIS:	Builds a default .adm path and filename to look for

	NOTES:		Fills szFilename with "<windows dir>\INF\ADMINCFG.ADF".
				Text is loaded from resources since file and directory
				names are localizable.

********************************************************************/
DWORD GetDefaultTemplateFilename(HWND hWnd,TCHAR * pszFilename,UINT cbFileName)
{
        TCHAR szFileName[MAX_PATH];
        UINT cchFileName;
        LPTSTR lpEnd;


        //
        // Load the common adm file
        //

        GetWindowsDirectory(szFileName,MAX_PATH);
        lstrcat(szFileName,szSlash);
        lstrcat(szFileName,LoadSz(IDS_INFDIR,szSmallBuf,ARRAYSIZE(szSmallBuf)));
        lstrcat(szFileName,szSlash);
        lstrcat(szFileName,LoadSz(IDS_DEF_COMMONNAME,szSmallBuf,ARRAYSIZE(szSmallBuf)));

        cchFileName = lstrlen (szFileName) + 1;

        if (cchFileName <= cbFileName) {
            lstrcpy (pszFilename, szFileName);
            lpEnd = pszFilename + lstrlen (pszFilename) + 1;
        } else {
            *pszFilename = TEXT('\0');
            return 0;
        }


        //
        // Add on the base adm filename
        //

        GetWindowsDirectory(szFileName,MAX_PATH);
        lstrcat(szFileName,szSlash);
        lstrcat(szFileName,LoadSz(IDS_INFDIR,szSmallBuf,ARRAYSIZE(szSmallBuf)));
        lstrcat(szFileName,szSlash);

        if (g_bWinnt) {
            lstrcat(szFileName,LoadSz(IDS_DEF_NT_INFNAME,szSmallBuf,ARRAYSIZE(szSmallBuf)));
        } else {
            lstrcat(szFileName,LoadSz(IDS_DEF_INFNAME,szSmallBuf,ARRAYSIZE(szSmallBuf)));
        }

        cchFileName += lstrlen (szFileName) + 1;

        if (cchFileName < cbFileName) {
            lstrcat (lpEnd, szFileName);
        }

        return (cchFileName);
}