328 lines
4.7 KiB
C++
328 lines
4.7 KiB
C++
// FILE: tpath.h
|
|
// AUTHOR: BrianAu
|
|
// REMARKS:
|
|
|
|
#include "shtl.h"
|
|
#include "tpath.h"
|
|
#include <xutility>
|
|
|
|
using namespace std;
|
|
|
|
__DATL_INLINE tpath::tpath(
|
|
LPCTSTR pszRoot,
|
|
LPCTSTR pszDir,
|
|
LPCTSTR pszFile,
|
|
LPCTSTR pszExt
|
|
)
|
|
{
|
|
if (pszDir)
|
|
SetPath(pszDir);
|
|
if (pszRoot)
|
|
SetRoot(pszRoot);
|
|
if (pszFile)
|
|
SetFileSpec(pszFile);
|
|
if (pszExt)
|
|
SetExtension(pszExt);
|
|
}
|
|
|
|
|
|
__DATL_INLINE tpath::tpath(
|
|
const tpath& rhs
|
|
) : tstring(rhs)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
__DATL_INLINE tpath&
|
|
tpath::operator = (
|
|
const tpath& rhs
|
|
)
|
|
{
|
|
if (this != &rhs)
|
|
{
|
|
tstring::operator = (rhs);
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
|
|
__DATL_INLINE tpath&
|
|
tpath::operator = (
|
|
LPCTSTR rhs
|
|
)
|
|
{
|
|
tstring::operator = (rhs);
|
|
return *this;
|
|
}
|
|
|
|
|
|
__DATL_INLINE void
|
|
tpath::AddBackslash(
|
|
void
|
|
)
|
|
{
|
|
::PathAddBackslash(GetBuffer(max(MAX_PATH, length() + 2)));
|
|
ReleaseBuffer();
|
|
}
|
|
|
|
__DATL_INLINE void
|
|
tpath::RemoveBackslash(
|
|
void
|
|
)
|
|
{
|
|
::PathRemoveBackslash(GetBuffer());
|
|
ReleaseBuffer();
|
|
}
|
|
|
|
__DATL_INLINE bool
|
|
tpath::GetRoot(
|
|
tpath *pOut
|
|
) const
|
|
{
|
|
tpath temp(*this);
|
|
temp.StripToRoot();
|
|
*pOut = temp;
|
|
return 0 < pOut->length();
|
|
}
|
|
|
|
__DATL_INLINE bool
|
|
tpath::GetPath(
|
|
tpath *pOut
|
|
) const
|
|
{
|
|
tpath temp(*this);
|
|
temp.RemoveFileSpec();
|
|
*pOut = temp;
|
|
return 0 < pOut->length();
|
|
}
|
|
|
|
__DATL_INLINE bool
|
|
tpath::GetDirectory(
|
|
tpath *pOut
|
|
) const
|
|
{
|
|
if (GetPath(pOut))
|
|
pOut->RemoveRoot();
|
|
|
|
return 0 < pOut->length();
|
|
}
|
|
|
|
__DATL_INLINE bool
|
|
tpath::GetExtension(
|
|
tpath *pOut
|
|
) const
|
|
{
|
|
*pOut = ::PathFindExtension(*this);
|
|
return 0 < pOut->length();
|
|
}
|
|
|
|
|
|
__DATL_INLINE bool
|
|
tpath::GetFileSpec(
|
|
tpath *pOut
|
|
) const
|
|
{
|
|
*pOut = ::PathFindFileName(*this);
|
|
return 0 < pOut->length();
|
|
}
|
|
|
|
|
|
__DATL_INLINE bool
|
|
tpath::Append(
|
|
LPCTSTR psz
|
|
)
|
|
{
|
|
bool bResult = boolify(::PathAppend(GetBuffer(max(MAX_PATH, length() + lstrlen(psz) + 3)), psz));
|
|
ReleaseBuffer();
|
|
return bResult;
|
|
}
|
|
|
|
__DATL_INLINE bool
|
|
tpath::BuildRoot(
|
|
int iDrive
|
|
)
|
|
{
|
|
empty();
|
|
bool bResult = NULL != ::PathBuildRoot(GetBuffer(5), iDrive);
|
|
ReleaseBuffer();
|
|
return bResult;
|
|
}
|
|
|
|
|
|
__DATL_INLINE bool
|
|
tpath::Canonicalize(
|
|
void
|
|
)
|
|
{
|
|
tstring strTemp(*this);
|
|
bool bResult = boolify(::PathCanonicalize(GetBuffer(max(MAX_PATH, length())), strTemp));
|
|
ReleaseBuffer();
|
|
return bResult;
|
|
}
|
|
|
|
|
|
|
|
__DATL_INLINE bool
|
|
tpath::Compact(
|
|
HDC hdc,
|
|
int cxPixels
|
|
)
|
|
{
|
|
bool bResult = boolify(::PathCompactPath(hdc, GetBuffer(), cxPixels));
|
|
ReleaseBuffer();
|
|
return bResult;
|
|
}
|
|
|
|
|
|
__DATL_INLINE bool
|
|
tpath::CommonPrefix(
|
|
LPCTSTR pszPath1,
|
|
LPCTSTR pszPath2
|
|
)
|
|
{
|
|
empty();
|
|
::PathCommonPrefix(pszPath1,
|
|
pszPath2,
|
|
GetBuffer(max(MAX_PATH, (max(lstrlen(pszPath1), lstrlen(pszPath2)) + 1))));
|
|
ReleaseBuffer();
|
|
return 0 < length();
|
|
}
|
|
|
|
|
|
__DATL_INLINE void
|
|
tpath::QuoteSpaces(
|
|
void
|
|
)
|
|
{
|
|
::PathQuoteSpaces(GetBuffer(max(MAX_PATH, length() + 3)));
|
|
ReleaseBuffer();
|
|
}
|
|
|
|
__DATL_INLINE void
|
|
tpath::UnquoteSpaces(
|
|
void
|
|
)
|
|
{
|
|
::PathUnquoteSpaces(GetBuffer());
|
|
ReleaseBuffer();
|
|
}
|
|
|
|
__DATL_INLINE void
|
|
tpath::RemoveBlanks(
|
|
void
|
|
)
|
|
{
|
|
::PathRemoveBlanks(GetBuffer());
|
|
ReleaseBuffer();
|
|
}
|
|
|
|
__DATL_INLINE void
|
|
tpath::RemoveExtension(
|
|
void
|
|
)
|
|
{
|
|
PathRemoveExtension(GetBuffer());
|
|
ReleaseBuffer();
|
|
}
|
|
|
|
__DATL_INLINE void
|
|
tpath::RemoveFileSpec(
|
|
void
|
|
)
|
|
{
|
|
::PathRemoveFileSpec(GetBuffer());
|
|
ReleaseBuffer();
|
|
}
|
|
|
|
__DATL_INLINE void
|
|
tpath::RemoveRoot(
|
|
void
|
|
)
|
|
{
|
|
LPTSTR psz = ::PathSkipRoot(*this);
|
|
if (psz)
|
|
{
|
|
tpath temp(psz);
|
|
*this = temp;
|
|
}
|
|
}
|
|
|
|
__DATL_INLINE void
|
|
tpath::RemovePath(
|
|
void
|
|
)
|
|
{
|
|
tpath temp;
|
|
GetFileSpec(&temp);
|
|
*this = temp;
|
|
}
|
|
|
|
|
|
__DATL_INLINE void
|
|
tpath::StripToRoot(
|
|
void
|
|
)
|
|
{
|
|
::PathStripToRoot(GetBuffer());
|
|
ReleaseBuffer();
|
|
}
|
|
|
|
|
|
__DATL_INLINE void
|
|
tpath::SetRoot(
|
|
LPCTSTR pszRoot
|
|
)
|
|
{
|
|
tpath strTemp(*this);
|
|
strTemp.RemoveRoot();
|
|
*this = pszRoot;
|
|
Append(strTemp);
|
|
}
|
|
|
|
__DATL_INLINE void
|
|
tpath::SetPath(
|
|
LPCTSTR pszPath
|
|
)
|
|
{
|
|
tpath strTemp(*this);
|
|
*this = pszPath;
|
|
|
|
strTemp.RemovePath();
|
|
Append(strTemp);
|
|
}
|
|
|
|
__DATL_INLINE void
|
|
tpath::SetDirectory(
|
|
LPCTSTR pszDir
|
|
)
|
|
{
|
|
tpath path;
|
|
GetPath(&path);
|
|
path.StripToRoot();
|
|
path.AddBackslash();
|
|
path.Append(pszDir);
|
|
SetPath(path);
|
|
}
|
|
|
|
|
|
__DATL_INLINE void
|
|
tpath::SetFileSpec(
|
|
LPCTSTR pszFileSpec
|
|
)
|
|
{
|
|
RemoveFileSpec();
|
|
Append(pszFileSpec);
|
|
}
|
|
|
|
__DATL_INLINE void
|
|
tpath::SetExtension(
|
|
LPCTSTR pszExt
|
|
)
|
|
{
|
|
::PathRenameExtension(GetBuffer(max(MAX_PATH, length() + lstrlen(pszExt) + 2)), pszExt);
|
|
ReleaseBuffer();
|
|
}
|
|
|
|
|