303 lines
7 KiB
C++
303 lines
7 KiB
C++
//============================================================================
|
|
// Copyright (C) Microsoft Corporation, 1997 - 1999
|
|
//
|
|
// File: rtrcfg.h
|
|
//
|
|
// Router configuration property pages
|
|
//
|
|
//============================================================================
|
|
|
|
#ifndef _ATLKENV_H
|
|
#define _ATLKENV_H
|
|
|
|
#ifndef _LIST_
|
|
#include <list>
|
|
using namespace std;
|
|
#endif
|
|
|
|
#ifndef __WINCRYPT_H__
|
|
#include "wincrypt.h"
|
|
#endif
|
|
|
|
#ifndef __SCLOGON_H__
|
|
#include "sclogon.h"
|
|
#endif
|
|
|
|
#ifndef _NDISPNP_
|
|
#include "ndispnp.h"
|
|
#endif
|
|
|
|
#ifndef _CSERVICE_H_
|
|
#include "cservice.h"
|
|
#endif
|
|
|
|
#ifndef _CSERVICE_H_
|
|
#include "cservice.h"
|
|
#endif
|
|
|
|
//TODO; remove these two typdefs in favor of private\inc\???.h include (check w/ shirish)
|
|
typedef enum
|
|
{
|
|
AT_PNP_SWITCH_ROUTING = 0,
|
|
AT_PNP_SWITCH_DEFAULT_ADAPTER,
|
|
AT_PNP_RECONFIGURE_PARMS
|
|
} ATALK_PNP_MSGTYPE;
|
|
|
|
typedef struct _ATALK_PNP_EVENT
|
|
{
|
|
ATALK_PNP_MSGTYPE PnpMessage;
|
|
} ATALK_PNP_EVENT, *PATALK_PNP_EVENT;
|
|
|
|
|
|
// Appletalk constants/boundary values
|
|
const DWORD MAX_RANGE_ALLOWED= 65279;
|
|
const DWORD MIN_RANGE_ALLOWED= 1;
|
|
const DWORD MAX_ZONES= 255;
|
|
const DWORD ZONELISTSIZE= 2048;
|
|
const DWORD MAX_ZONE_NAME_LEN=32;
|
|
const DWORD ZONEBUFFER_LEN=32*255;
|
|
const DWORD PARM_BUF_LEN=512;
|
|
|
|
// this definition is copied from c
|
|
#define MEDIATYPE_ETHERNET 1
|
|
#define MEDIATYPE_TOKENRING 2
|
|
#define MEDIATYPE_FDDI 3
|
|
#define MEDIATYPE_WAN 4
|
|
#define MEDIATYPE_LOCALTALK 5
|
|
|
|
// Define a structure for reading/writing all information necessary about an adapter
|
|
typedef struct
|
|
{
|
|
DWORD m_dwRangeLower;
|
|
DWORD m_dwRangeUpper;
|
|
DWORD m_dwSeedingNetwork;
|
|
DWORD m_dwMediaType;
|
|
CString m_szDefaultZone;
|
|
CString m_szAdapter;
|
|
CString m_szDevAdapter;
|
|
CString m_szPortName;
|
|
CStringList m_listZones;
|
|
bool m_fDefAdapter;
|
|
} ATLK_REG_ADAPTER;
|
|
|
|
typedef struct
|
|
{
|
|
DWORD m_dwRangeLower;
|
|
DWORD m_dwRangeUpper;
|
|
CString m_szDefaultZone;
|
|
CStringList m_listZones;
|
|
} ATLK_DYN_ADAPTER;
|
|
|
|
struct CStop_StartAppleTalkPrint
|
|
{
|
|
CStop_StartAppleTalkPrint()
|
|
{
|
|
bStopedByMe = FALSE;
|
|
|
|
if (SUCCEEDED( csm.HrOpen(SC_MANAGER_CONNECT, NULL, NULL)))
|
|
{
|
|
|
|
if (SUCCEEDED(csm.HrOpenService(&svr, c_szMacPrint)))
|
|
{
|
|
if (SUCCEEDED(svr.HrControl(SERVICE_CONTROL_STOP)))
|
|
{
|
|
bStopedByMe = TRUE;
|
|
}
|
|
}
|
|
}
|
|
/* change to use exisiting functions
|
|
DWORD dwErr = 0;
|
|
hScManager = NULL;
|
|
hService = NULL;
|
|
bStopedByMe = FALSE;
|
|
bUsedToBePaused = FALSE;
|
|
|
|
hScManager = OpenSCManager( NULL, NULL, SC_MANAGER_CONNECT );
|
|
|
|
if(hScManager != NULL)
|
|
hService = OpenService(hScManager, L"MacPrint", SERVICE_ALL_ACCESS);
|
|
else
|
|
dwErr = GetLastError();
|
|
|
|
if(hService != NULL)
|
|
{
|
|
SERVICE_STATUS ss;
|
|
if(QueryServiceStatus(hService, &ss) != 0) // SUCC
|
|
{
|
|
if(ss.dwCurrentState == SERVICE_RUNNING || ss.dwCurrentState == SERVICE_PAUSED)
|
|
{
|
|
SERVICE_STATUS ss1;
|
|
if(ControlService(hService, SERVICE_CONTROL_STOP, &ss1) == 0) // FAILED
|
|
dwErr = GetLastError();
|
|
else
|
|
{
|
|
bStopedByMe = TRUE;
|
|
|
|
if( ss.dwCurrentState == SERVICE_PAUSED )
|
|
bUsedToBePaused = TRUE;
|
|
}
|
|
}
|
|
|
|
// not doing anything if not running
|
|
}
|
|
else
|
|
dwErr = GetLastError();
|
|
}
|
|
else
|
|
{
|
|
dwErr = GetLastError();
|
|
if(dwErr == ERROR_SERVICE_DOES_NOT_EXIST)
|
|
dwErr = 0;
|
|
}
|
|
|
|
if(dwErr != 0) // something was wrong
|
|
DisplayErrorMessage(NULL, HRESULT_FROM_WIN32(dwErr));
|
|
*/
|
|
};
|
|
|
|
~CStop_StartAppleTalkPrint()
|
|
{
|
|
if(bStopedByMe) // start it
|
|
{
|
|
svr.HrStart ();
|
|
|
|
/* change to use existing function
|
|
ASSERT(hService != NULL);
|
|
if(0 == StartService(hService, 0, NULL)) // FAILED
|
|
{
|
|
DisplayErrorMessage(NULL, HRESULT_FROM_WIN32(GetLastError()));
|
|
}
|
|
else
|
|
{
|
|
if(bUsedToBePaused == TRUE)
|
|
{
|
|
// if it was paused
|
|
SERVICE_STATUS ss;
|
|
|
|
if(ControlService(hService, SERVICE_CONTROL_PAUSE, &ss) == 0) // FAILED
|
|
DisplayErrorMessage(NULL, HRESULT_FROM_WIN32(GetLastError()));
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// close the handles
|
|
if(hService != NULL)
|
|
CloseServiceHandle(hService);
|
|
if(hScManager != NULL)
|
|
CloseServiceHandle(hScManager);
|
|
hService = NULL;
|
|
hScManager = NULL;
|
|
*/
|
|
}
|
|
}
|
|
protected:
|
|
/* change to use existing functions
|
|
SC_HANDLE hScManager;
|
|
SC_HANDLE hService;
|
|
BOOL bUsedToBePaused;
|
|
*/
|
|
CServiceManager csm;
|
|
CService svr;
|
|
BOOL bStopedByMe;
|
|
};
|
|
|
|
// Define a structure for reading/writing AppleTalk\Parameters values
|
|
typedef struct
|
|
{
|
|
DWORD dwEnableRouter;
|
|
TCHAR* szDefaultPort;
|
|
TCHAR* szDesiredZone;
|
|
} ATLK_PARAMS;
|
|
|
|
class CAdapterInfo
|
|
{
|
|
public:
|
|
CAdapterInfo() {m_fAlreadyShown = false;};
|
|
~CAdapterInfo() {};
|
|
|
|
// m_AdapterInfo is the collection of values found under
|
|
// AppleTalk\Parameters\Adapters\<adapter>
|
|
ATLK_REG_ADAPTER m_regInfo;
|
|
|
|
// fetched via sockets
|
|
ATLK_DYN_ADAPTER m_dynInfo;
|
|
|
|
bool m_fNotifyPnP; //need to notify PnP?
|
|
bool m_fModified; //been modified?
|
|
bool m_fReloadReg; //reload registry?
|
|
bool m_fReloadDyn; //reload network values?
|
|
|
|
bool m_fAlreadyShown; // is this adapter already in the UI?
|
|
|
|
friend class CATLKEnv;
|
|
};
|
|
|
|
|
|
//*****************************************************************
|
|
//
|
|
//*****************************************************************
|
|
class CATLKEnv
|
|
{
|
|
public:
|
|
|
|
CATLKEnv() : m_dwF(0) {};
|
|
~CATLKEnv();
|
|
|
|
enum {ATLK_ONLY_DEFADAPTER=0x1, ATLK_ONLY_ONADAPTER=0x2};
|
|
|
|
list<CAdapterInfo* > m_adapterinfolist;
|
|
typedef list<CAdapterInfo* > AL;
|
|
typedef list<CAdapterInfo* >::iterator AI;
|
|
|
|
void SetServerName(CString& szServerName)
|
|
{ m_szServerName = szServerName; }
|
|
|
|
//this reloads registry (optional) and network values
|
|
HRESULT GetAdapterInfo(bool fReloadReg=true);
|
|
|
|
//for each adapter, loads values to registry
|
|
HRESULT SetAdapterInfo();
|
|
|
|
//this method is called for non-adapter (global) appletalk changes
|
|
static HRESULT HrAtlkPnPSwithRouting();
|
|
|
|
//this method is called for adapter specific PnP notifications
|
|
HRESULT HrAtlkPnPReconfigParams(BOOL bForcePnP = FALSE);
|
|
|
|
//find a specific adapter info
|
|
CAdapterInfo* FindAdapter(CString& szAdapter);
|
|
|
|
static HRESULT IsAdapterBoundToAtlk(LPWSTR szAdapter, BOOL* bBound);
|
|
|
|
// registry value "MediaType" is added, so this function is not necessary.
|
|
// HRESULT IsLocalTalkAdaptor(CAdapterInfo* pAdapterInfo, BOOL* pbIsLocalTalk);
|
|
// S_OK: LOCALTALK
|
|
// S_FALSE: Not
|
|
// ERRORs
|
|
|
|
//reloads reg and dynamic info for an adapterinfo
|
|
HRESULT ReloadAdapter(CAdapterInfo* pAdapterInfo, bool fOnlyDyn =false);
|
|
|
|
//set specific flags for loading (not multithread safe!)
|
|
void SetFlags(DWORD dwF) {m_dwF=dwF;}
|
|
|
|
//load adapter info
|
|
HRESULT FetchRegInit();
|
|
|
|
protected:
|
|
|
|
CString m_szServerName;
|
|
bool m_fATrunning;
|
|
DWORD m_dwDefaultAdaptersMediaType;
|
|
ATLK_PARAMS m_Params;
|
|
DWORD m_dwF;
|
|
|
|
HRESULT _HrGetAndSetNetworkInformation(SOCKET socket, CAdapterInfo* pAdapInfo);
|
|
void _AddZones(CHAR * szZoneList, ULONG NumZones, CAdapterInfo* pAdapterinfo);
|
|
};
|
|
|
|
|
|
#endif _ATLKENV_H
|