mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
298 lines
6.6 KiB
298 lines
6.6 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1994.
|
|
//
|
|
// File: shri.cxx
|
|
//
|
|
// Contents: Class object encapsulating a generic "share", that may be
|
|
// realized via one or more file servers.
|
|
//
|
|
// History: 8-Mar-96 BruceFo Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "headers.hxx"
|
|
#pragma hdrstop
|
|
|
|
#include "shri.hxx"
|
|
#include "util.hxx"
|
|
|
|
CShare::CShare(
|
|
VOID
|
|
)
|
|
:
|
|
m_dwService(0),
|
|
m_pSmbInfo(NULL),
|
|
m_pSfmInfo(NULL),
|
|
m_pFpnwInfo(NULL)
|
|
{
|
|
INIT_SIG(CShare);
|
|
Close();
|
|
}
|
|
|
|
CShare::~CShare()
|
|
{
|
|
CHECK_SIG(CShare);
|
|
}
|
|
|
|
VOID
|
|
CShare::AddSmb(
|
|
IN SHARE_INFO_2* pInfo // may point to level 1 info???
|
|
)
|
|
{
|
|
CHECK_SIG(CShare);
|
|
appAssert(NULL != pInfo);
|
|
appAssert(NULL == m_pSmbInfo && "We already have an SMB share!");
|
|
m_dwService |= SHARE_SERVICE_SMB;
|
|
m_pSmbInfo = pInfo;
|
|
}
|
|
|
|
VOID
|
|
CShare::AddSfm(
|
|
IN AFP_VOLUME_INFO* pInfo
|
|
)
|
|
{
|
|
CHECK_SIG(CShare);
|
|
appAssert(NULL != pInfo);
|
|
appAssert(NULL == m_pSfmInfo && "We already have an SFM share!");
|
|
m_dwService |= SHARE_SERVICE_SFM;
|
|
m_pSfmInfo = pInfo;
|
|
}
|
|
|
|
VOID
|
|
CShare::AddFpnw(
|
|
IN FPNWVOLUMEINFO* pInfo
|
|
)
|
|
{
|
|
CHECK_SIG(CShare);
|
|
appAssert(NULL != pInfo);
|
|
appAssert(NULL == m_pFpnwInfo && "We already have an FPNW share!");
|
|
m_dwService |= SHARE_SERVICE_FPNW;
|
|
m_pFpnwInfo = pInfo;
|
|
}
|
|
|
|
|
|
PWSTR
|
|
CShare::GetName(
|
|
VOID
|
|
)
|
|
{
|
|
CHECK_SIG(CShare);
|
|
|
|
if (m_dwService & SHARE_SERVICE_SMB)
|
|
{
|
|
appAssert(NULL != m_pSmbInfo);
|
|
return m_pSmbInfo->shi2_netname;
|
|
}
|
|
if (m_dwService & SHARE_SERVICE_SFM)
|
|
{
|
|
appAssert(NULL != m_pSfmInfo);
|
|
return m_pSfmInfo->afpvol_name;
|
|
}
|
|
if (m_dwService & SHARE_SERVICE_FPNW)
|
|
{
|
|
appAssert(NULL != m_pFpnwInfo);
|
|
return m_pFpnwInfo->lpVolumeName;
|
|
}
|
|
|
|
appAssert(!"Trying to get the name of a share but there are no services!");
|
|
return NULL;
|
|
}
|
|
|
|
|
|
PWSTR
|
|
CShare::GetPath(
|
|
VOID
|
|
)
|
|
{
|
|
CHECK_SIG(CShare);
|
|
|
|
if (m_dwService & SHARE_SERVICE_SMB)
|
|
{
|
|
// BUGBUG: MUST BE LEVEL 2 DATA!
|
|
|
|
appAssert(NULL != m_pSmbInfo);
|
|
return m_pSmbInfo->shi2_path;
|
|
}
|
|
if (m_dwService & SHARE_SERVICE_SFM)
|
|
{
|
|
appAssert(NULL != m_pSfmInfo);
|
|
return m_pSfmInfo->afpvol_path;
|
|
}
|
|
if (m_dwService & SHARE_SERVICE_FPNW)
|
|
{
|
|
appAssert(NULL != m_pFpnwInfo);
|
|
return m_pFpnwInfo->lpPath;
|
|
}
|
|
|
|
appAssert(!"Trying to get the path of a share but there are no services!");
|
|
return NULL;
|
|
}
|
|
|
|
VOID
|
|
CShare::FillID(
|
|
OUT LPIDSHARE pids
|
|
)
|
|
{
|
|
appAssert(0 != m_dwService && "Trying to fill an id for a share that has no services!");
|
|
|
|
PWSTR pszName = NULL;
|
|
PWSTR pszComment = NULL;
|
|
PWSTR pszPath = NULL;
|
|
PWSTR pszFpnwName = NULL;
|
|
|
|
USHORT nameLength, commentLength, pathLength, fpnwNameLength;
|
|
USHORT nameOffset, commentOffset, pathOffset, fpnwNameOffset;
|
|
|
|
// initialize everything to defaults
|
|
|
|
pids->bFlags = SHID_SHARE;
|
|
pids->bService = (BYTE)m_dwService; // only using 3 bits of 8
|
|
|
|
pids->level = 0; // BUGBUG
|
|
pids->type = 0;
|
|
pids->maxUses = 0;
|
|
pids->oPath = 0xffff; // bogus
|
|
pids->oComment = 0xffff; // bogus
|
|
pids->sfmMaxUses = 0;
|
|
pids->fpnwType = 0;
|
|
pids->fpnwMaxUses = 0;
|
|
pids->oFpnwName = 0xffff; // bogus
|
|
|
|
if (m_dwService & SHARE_SERVICE_SMB)
|
|
{
|
|
// BUGBUG: MUST BE LEVEL 2 DATA!
|
|
|
|
appAssert(NULL != m_pSmbInfo);
|
|
pszName = m_pSmbInfo->shi2_netname;
|
|
pszComment = m_pSmbInfo->shi2_remark;
|
|
pszPath = m_pSmbInfo->shi2_path;
|
|
|
|
pids->level = 2; // BUGBUG
|
|
pids->type = m_pSmbInfo->shi2_type;
|
|
pids->maxUses = m_pSmbInfo->shi2_max_uses;
|
|
}
|
|
if (m_dwService & SHARE_SERVICE_SFM)
|
|
{
|
|
appAssert(NULL != m_pSfmInfo);
|
|
if (NULL == pszName)
|
|
{
|
|
pszName = m_pSfmInfo->afpvol_name;
|
|
}
|
|
pids->sfmMaxUses = m_pSfmInfo->afpvol_max_uses;
|
|
}
|
|
if (m_dwService & SHARE_SERVICE_FPNW)
|
|
{
|
|
appAssert(NULL != m_pFpnwInfo);
|
|
if (NULL == pszName)
|
|
{
|
|
pszName = m_pFpnwInfo->lpVolumeName;
|
|
}
|
|
pszFpnwName = m_pFpnwInfo->lpVolumeName;
|
|
pids->fpnwType = m_pFpnwInfo->dwType;
|
|
pids->fpnwMaxUses = m_pFpnwInfo->dwMaxUses;
|
|
}
|
|
|
|
appAssert(NULL != pszName && "The share has no name!!");
|
|
|
|
nameLength = lstrlen(pszName);
|
|
commentLength = (NULL == pszComment) ? 0 : lstrlen(pszComment);
|
|
pathLength = (NULL == pszPath) ? 0 : lstrlen(pszPath);
|
|
fpnwNameLength = (NULL == pszFpnwName) ? 0 : lstrlen(pszFpnwName);
|
|
|
|
nameOffset = 0;
|
|
commentOffset = nameOffset + nameLength + 1;
|
|
pathOffset = commentOffset + commentLength + 1;
|
|
fpnwNameOffset = pathOffset + pathLength + 1;
|
|
|
|
// we don't store nameOffset
|
|
pids->oComment = commentOffset;
|
|
pids->oPath = pathOffset;
|
|
pids->oFpnwName = fpnwNameOffset;
|
|
|
|
lstrcpy(&pids->cBuf[nameOffset], pszName);
|
|
|
|
if (NULL != pszComment)
|
|
{
|
|
lstrcpy(&pids->cBuf[commentOffset], pszComment);
|
|
}
|
|
else
|
|
{
|
|
pids->cBuf[commentOffset] = L'\0';
|
|
}
|
|
|
|
if (NULL != pszPath)
|
|
{
|
|
lstrcpy(&pids->cBuf[pathOffset], pszPath);
|
|
}
|
|
else
|
|
{
|
|
pids->cBuf[pathOffset] = L'\0';
|
|
}
|
|
|
|
if (NULL != pszFpnwName)
|
|
{
|
|
lstrcpy(&pids->cBuf[fpnwNameOffset], pszFpnwName);
|
|
}
|
|
else
|
|
{
|
|
pids->cBuf[fpnwNameOffset] = L'\0';
|
|
}
|
|
|
|
pids->cb = offsetof(IDSHARE, cBuf)
|
|
+ (nameLength + 1
|
|
+ commentLength + 1
|
|
+ pathLength + 1
|
|
+ fpnwNameLength + 1
|
|
) * sizeof(WCHAR);
|
|
|
|
//
|
|
// null terminate pidl
|
|
//
|
|
|
|
*(USHORT *)((LPBYTE)pids + pids->cb) = 0;
|
|
}
|
|
|
|
|
|
#if DBG == 1
|
|
|
|
VOID
|
|
CShare::Dump(
|
|
IN PWSTR pszCaption
|
|
)
|
|
{
|
|
CHECK_SIG(CShare);
|
|
|
|
appDebugOut((DEB_TRACE,
|
|
"CShare::Dump, %ws\n",
|
|
pszCaption));
|
|
|
|
WCHAR szServices[500];
|
|
szServices[0] = L'\0';
|
|
if (m_dwService & SHARE_SERVICE_SMB)
|
|
{
|
|
wcscat(szServices, L"SMB ");
|
|
}
|
|
if (m_dwService & SHARE_SERVICE_SFM)
|
|
{
|
|
wcscat(szServices, L"SFM ");
|
|
}
|
|
if (m_dwService & SHARE_SERVICE_FPNW)
|
|
{
|
|
wcscat(szServices, L"FPNW ");
|
|
}
|
|
|
|
appDebugOut((DEB_TRACE | DEB_NOCOMPNAME,
|
|
"\t This: 0x%08lx\n"
|
|
"\t Services: %ws\n"
|
|
"\t Share name: %ws\n"
|
|
,
|
|
this,
|
|
szServices,
|
|
GetName() ? L"none" : GetName()
|
|
));
|
|
|
|
}
|
|
|
|
#endif // DBG == 1
|