//////////////////////////////////////////////////////////////////////////////// // This source file is part of the ZipArchive library source distribution and // is Copyrighted 2000 - 2011 by Artpol Software - Tadeusz Dracz // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // For the licensing details refer to the License.txt file. // // Web Site: http://www.artpol-software.com //////////////////////////////////////////////////////////////////////////////// /** * \file ZipPathComponent.h * Includes the CZipPathComponent class. * */ #if !defined(ZIPARCHIVE_ZIPPATHCOMPONENT_DOT_H) #define ZIPARCHIVE_ZIPPATHCOMPONENT_DOT_H #if _MSC_VER > 1000 #pragma once #if defined ZIP_HAS_DLL #pragma warning (push) #pragma warning( disable : 4251 ) // needs to have dll-interface to be used by clients of class #endif #endif #include "ZipString.h" #include "ZipExport.h" /** Splits a file path into components. */ class ZIP_API CZipPathComponent { public: #ifdef _ZIP_SYSTEM_WIN static const CZipString PathPrefix; /** The type of the prefix in path. */ enum PrefixType { ptNone = 0, ///< There is no prefix present. ptUnc = 2, ///< UNC path. ptUnicode = 4, ///< Unicode path. ptUncWin = 8 ///< Windows UNC path. }; /** Returns the length of the path prefix detected. \param path The path to examine. \return The length of the path prefix or \c 0, if no prefix was detected. */ static int IsPrefixed(const CZipString& path); /** Adds an UNC prefix to the paths. \param path The path to add a prefix to. \param isFolder \c true if the \a path points to a folder; \c false otherwise. \return The prefixed path. */ static CZipString AddPrefix(LPCTSTR path, bool isFolder = true); /** Adds an UNC prefix to the paths. \param path The path to add a prefix to. \param isFolder \c true if the \a path points to a folder; \c false otherwise. */ static void AddPrefix(CZipString& path, bool isFolder = true); #endif CZipPathComponent(){} /** Initializes a new instance of the CZipPathComponent class. \param lpszFullPath The full path to the file. \see SetFullPath */ CZipPathComponent(LPCTSTR lpszFullPath) { SetFullPath(lpszFullPath); } virtual ~CZipPathComponent(); static const TCHAR m_cSeparator; ///< A system specific default path separator. /** Appends a path separator to \a szPath, if it is not already appended. \param szPath The path to have a separator appended. */ static void AppendSeparator(CZipString& szPath) { RemoveSeparators(szPath); szPath += m_cSeparator; } /** Combines a path information with a file name information. \param szPath Provides the path information and retrieves the result. \param lpszName The filename to be appended to the path. */ static void Combine(CZipString& szPath, LPCTSTR lpszName) { AppendSeparator(szPath); if (lpszName != NULL) szPath += lpszName; } /** Removes path separators from the end of \a szPath \param szPath The path to have path separators removed. */ static void RemoveSeparators(CZipString& szPath) { szPath.TrimRight(_T("\\/")); } /** Removes path separators from the beginning of \a szPath. \param szPath The path to have path separators removed. */ static void RemoveSeparatorsLeft(CZipString& szPath) { szPath.TrimLeft(_T("\\/")); } /** Returns the value indicating whether the given character is a path separator. \param c The character to test. \return \c true, if \a c is a path separator; \c false otherwise. */ static bool IsSeparator(TCHAR c) { return c == _T('\\') || c == _T('/'); } /** Checks if \a szPath has a path separator appended. \param szPath The path to be tested. \return \c true, if \a szPath has a path separator at the end; \c false otherwise. */ static bool HasEndingSeparator(const CZipString& szPath) { int iLen = szPath.GetLength(); if (iLen) return IsSeparator(szPath[iLen - 1]); else return false; } /** Sets the full path to the file. \param lpszFullPath The full path to the file including a filename. The last element in the path is assumed to be the filename. */ void SetFullPath(LPCTSTR lpszFullPath); /** Returns the name of the file without the extension (and without the path). \return The title of the file. */ CZipString GetFileTitle() const { return m_szFileTitle;} /** Sets the file title (the name without the extension and without the path). \param lpszFileTitle The title to set. */ void SetFileTitle(LPCTSTR lpszFileTitle) { m_szFileTitle = lpszFileTitle;} /** Sets the extension. \param lpszExt The extension to set. May contain the dot character at the beginning, but doesn't have to. */ void SetExtension(LPCTSTR lpszExt) { m_szFileExt = lpszExt; m_szFileExt.TrimLeft(_T('.')); } /** Returns the extension of the file. \return The extension without the dot character. */ CZipString GetFileExt() const { return m_szFileExt;} /** Returns the drive of the file. \return The drive without a path separator at the end. */ CZipString GetFileDrive() const { return m_szDrive;} /** Returns the full path to the file without the drive. \return The path without the drive and without a path separator at the beginning. */ CZipString GetNoDrive() const ; /** Returns the filename. \return The filename including the extension and without the path. */ CZipString GetFileName() const { CZipString szFullFileName = m_szFileTitle; if (!m_szFileExt.IsEmpty()) { szFullFileName += _T("."); szFullFileName += m_szFileExt; } return szFullFileName; } /** Returns the full path to the file. \return The full path information including the filename. */ CZipString GetFullPath() const { CZipString szFullPath = GetFilePath(); CZipString szFileName = GetFileName(); if (!szFileName.IsEmpty()) { if (szFullPath.IsEmpty()) szFullPath += _T('.'); szFullPath += m_cSeparator; szFullPath += szFileName; } return szFullPath; } /** Returns the path part only. \return The file path without the filename and without a path separator at the end. */ CZipString GetFilePath() const { CZipString szDrive = m_szDrive; CZipString szDir = m_szDirectory; if (!szDrive.IsEmpty() && !szDir.IsEmpty()) szDrive += m_cSeparator; return m_szPrefix + szDrive + szDir; } protected: /** \name Path parts. */ //@{ CZipString m_szDirectory, ///< The path without the filename and without path separators at the end and the beginning. m_szFileTitle, ///< The filename without the extension. m_szFileExt, ///< The file extension without the dot character. m_szDrive, ///< The drive (if the system path standard uses it). It does not include a path separator at the end. m_szPrefix; ///< The prefix (e.g. for the UNC path or Unicode path under Windows). //@} }; #if (_MSC_VER > 1000) && (defined ZIP_HAS_DLL) #pragma warning (pop) #endif #endif // !defined(ZIPARCHIVE_ZIPPATHCOMPONENT_DOT_H)