added incomplete Path.hpp and Path.cpp
This commit is contained in:
		@ -32,6 +32,7 @@
 | 
			
		||||
#include <qse/cmn/Mmged.hpp>
 | 
			
		||||
#include <qse/cmn/Bitset.hpp>
 | 
			
		||||
#include <qse/cmn/time.h>
 | 
			
		||||
#include <qse/si/os.h>
 | 
			
		||||
 | 
			
		||||
/////////////////////////////////
 | 
			
		||||
QSE_BEGIN_NAMESPACE(QSE)
 | 
			
		||||
@ -57,9 +58,21 @@ public:
 | 
			
		||||
	int chroot (const qse_mchar_t* mpath) QSE_CPP_NOEXCEPT;
 | 
			
		||||
	int chroot (const qse_wchar_t* wpath) QSE_CPP_NOEXCEPT;
 | 
			
		||||
 | 
			
		||||
	void sleep (const qse_ntime_t* duration) QSE_CPP_NOEXCEPT;
 | 
			
		||||
	void sleep (unsigned int seconds) QSE_CPP_NOEXCEPT;
 | 
			
		||||
	void msleep (qse_mtime_t duration) QSE_CPP_NOEXCEPT;
 | 
			
		||||
	void sleep (const qse_ntime_t& duration) QSE_CPP_NOEXCEPT 
 | 
			
		||||
	{ 
 | 
			
		||||
		qse_sleep (&duration); 
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void sleep (qse_long_t secs, qse_int32_t nsecs = 0) QSE_CPP_NOEXCEPT 
 | 
			
		||||
	{
 | 
			
		||||
		qse_ntime_t duration = { secs, nsecs };
 | 
			
		||||
		qse_sleep (&duration);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void msleep (qse_mtime_t duration) QSE_CPP_NOEXCEPT 
 | 
			
		||||
	{
 | 
			
		||||
		qse_msleep (duration); 
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
	int switchUser (qse_uid_t uid, qse_gid_t gid, bool permanently) QSE_CPP_NOEXCEPT;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										112
									
								
								qse/include/qse/si/Path.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								qse/include/qse/si/Path.hpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,112 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id$
 | 
			
		||||
 *
 | 
			
		||||
    Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
 | 
			
		||||
 | 
			
		||||
    Redistribution and use in source and binary forms, with or without
 | 
			
		||||
    modification, are permitted provided that the following conditions
 | 
			
		||||
    are met:
 | 
			
		||||
    1. Redistributions of source code must retain the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer.
 | 
			
		||||
    2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
       documentation and/or other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
    THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 | 
			
		||||
    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
			
		||||
    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
			
		||||
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
			
		||||
    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
			
		||||
    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _QSE_SI_PATH_CLASS_
 | 
			
		||||
#define _QSE_SI_PATH_CLASS_
 | 
			
		||||
 | 
			
		||||
#include <qse/types.h>
 | 
			
		||||
#include <qse/macros.h>
 | 
			
		||||
 | 
			
		||||
QSE_BEGIN_NAMESPACE(QSE)
 | 
			
		||||
class Path
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	enum
 | 
			
		||||
	{
 | 
			
		||||
		MAX_LEN = QSE_PATH_MAX
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	Path ();
 | 
			
		||||
	Path (const qse_char_t* n);
 | 
			
		||||
	Path (const Path& fn);
 | 
			
		||||
	Path& operator= (const Path& fn);
 | 
			
		||||
 | 
			
		||||
	const qse_char_t* name () const 
 | 
			
		||||
	{
 | 
			
		||||
		return full_path;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void setName (const qse_char_t* n) 
 | 
			
		||||
	{
 | 
			
		||||
		if (n == QSE_NULL || n[0] == QSE_CHAR('\0')) set_to_root();
 | 
			
		||||
		else {
 | 
			
		||||
			qse_strxcpy (full_path, qse_countof(full_path), n);
 | 
			
		||||
			this->set_base_name ();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const qse_char_t* baseName () const 
 | 
			
		||||
	{
 | 
			
		||||
		return base_name;
 | 
			
		||||
	}
 | 
			
		||||
	const qse_char_t* baseDir () const 
 | 
			
		||||
	{
 | 
			
		||||
		return base_dir;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool exists () 
 | 
			
		||||
	{
 | 
			
		||||
		return exists (full_path);
 | 
			
		||||
	}
 | 
			
		||||
	static bool exists (const qse_char_t* path);
 | 
			
		||||
 | 
			
		||||
	int  getSize        (qse_off_t* sz);
 | 
			
		||||
	bool isWritable     ();
 | 
			
		||||
	bool isReadable     ();
 | 
			
		||||
	bool isReadWritable ();
 | 
			
		||||
#ifndef _WIN32
 | 
			
		||||
	bool isExecutable   ();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	bool isDirectory () const { return this->isDirectory (full_path); }
 | 
			
		||||
	static bool isDirectory (const qse_char_t* path);
 | 
			
		||||
 | 
			
		||||
	bool isRegular () const { return this->isRegular (full_path); }
 | 
			
		||||
	static bool isRegular (const qse_char_t* path);
 | 
			
		||||
 | 
			
		||||
	int chmod (qse_mode_t mode);
 | 
			
		||||
	static int chmod (const qse_char_t* path, qse_mode_t mode);
 | 
			
		||||
 | 
			
		||||
	int unlink ();
 | 
			
		||||
	static int unlink (const qse_char_t* path);
 | 
			
		||||
 | 
			
		||||
	int mkdir (qse_mode_t mode);
 | 
			
		||||
	static int mkdir (const qse_char_t* path, qse_mode_t mode);
 | 
			
		||||
 | 
			
		||||
	int setToSelf (const qse_char_t* argv0 = QSE_NULL);
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	qse_char_t full_path[QSE_PATH_MAX + 1];
 | 
			
		||||
	qse_char_t base_name[QSE_PATH_MAX + 1];
 | 
			
		||||
	qse_char_t base_dir [QSE_PATH_MAX + 1];
 | 
			
		||||
 | 
			
		||||
	void set_base_name ();
 | 
			
		||||
	void set_to_root ();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QSE_END_NAMESPACE(QSE)
 | 
			
		||||
		
 | 
			
		||||
#endif
 | 
			
		||||
@ -89,14 +89,14 @@ public:
 | 
			
		||||
	int blockAllSignals () QSE_CPP_NOEXCEPT { return qse_thr_blockallsigs(&this->thr); }
 | 
			
		||||
	int unblockAllSignals () QSE_CPP_NOEXCEPT { return qse_thr_unblockallsigs(&this->thr); }
 | 
			
		||||
 | 
			
		||||
	void sleep (const qse_ntime_t* duration) QSE_CPP_NOEXCEPT
 | 
			
		||||
	void sleep (const qse_ntime_t& duration) QSE_CPP_NOEXCEPT
 | 
			
		||||
	{
 | 
			
		||||
		qse_sleep (duration);
 | 
			
		||||
		qse_sleep (&duration);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void sleep (unsigned int seconds) QSE_CPP_NOEXCEPT
 | 
			
		||||
	void sleep (qse_long_t secs, qse_int32_t nsecs = 0) QSE_CPP_NOEXCEPT
 | 
			
		||||
	{
 | 
			
		||||
		static qse_ntime_t duration = { seconds, 0 };
 | 
			
		||||
		static qse_ntime_t duration = { secs, nsecs };
 | 
			
		||||
		qse_sleep (&duration);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -196,22 +196,6 @@ int App::chroot (const qse_wchar_t* wpath) QSE_CPP_NOEXCEPT
 | 
			
		||||
	return n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void App::sleep (const qse_ntime_t* duration) QSE_CPP_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
	qse_sleep (duration);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void App::sleep (unsigned int seconds) QSE_CPP_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
	qse_ntime_t duration = { seconds, 0 };
 | 
			
		||||
	qse_sleep (&duration);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void App::msleep (const qse_mtime_t duration) QSE_CPP_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
	qse_msleep (duration);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
int App::switchPrivilege (int gid, int uid, bool permanently)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										215
									
								
								qse/lib/si/Path.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								qse/lib/si/Path.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,215 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id$
 | 
			
		||||
 *
 | 
			
		||||
    Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
 | 
			
		||||
 | 
			
		||||
    Redistribution and use in source and binary forms, with or without
 | 
			
		||||
    modification, are permitted provided that the following conditions
 | 
			
		||||
    are met:
 | 
			
		||||
    1. Redistributions of source code must retain the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer.
 | 
			
		||||
    2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
       documentation and/or other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
    THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 | 
			
		||||
    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
			
		||||
    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
			
		||||
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
			
		||||
    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
			
		||||
    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <qse/si/Path.hpp>
 | 
			
		||||
 | 
			
		||||
QSE_BEGIN_NAMESPACE(QSE)
 | 
			
		||||
 | 
			
		||||
Path::Path ()
 | 
			
		||||
{
 | 
			
		||||
	this->set_to_root ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Path::Path (const qse_char_t* n) 
 | 
			
		||||
{
 | 
			
		||||
	this->setName (n);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Path::Path (const Path& fn)
 | 
			
		||||
{
 | 
			
		||||
	qse_strxcpy (this->full_path, QSE_COUNTOF(this->full_path), fn.this->full_path);
 | 
			
		||||
	this->set_base_name ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Path& Path::operator= (const Path& fn) 
 | 
			
		||||
{
 | 
			
		||||
	qse_strxcpy (this->full_path, QSE_COUNTOF(this->full_path), fn.this->full_path);
 | 
			
		||||
	this->set_base_name ();
 | 
			
		||||
	return *this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Path::exists (const qse_char_t* path)
 | 
			
		||||
{
 | 
			
		||||
	return ::qse_access (path, QSE_ACCESS_EXIST) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Path::getSize (qse_off_t* sz)
 | 
			
		||||
{
 | 
			
		||||
	qse_stat_t buf;
 | 
			
		||||
	if (::qse_stat (this->full_path, &buf) == -1) return -1;
 | 
			
		||||
	*sz = buf.st_size;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Path::isWritable ()
 | 
			
		||||
{
 | 
			
		||||
	return ::qse_access (this->full_path, QSE_ACCESS_WRITE) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Path::isReadable ()
 | 
			
		||||
{
 | 
			
		||||
	return ::qse_access (this->full_path, QSE_ACCESS_READ) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Path::isReadWritable ()
 | 
			
		||||
{
 | 
			
		||||
	return ::qse_access (this->full_path, 
 | 
			
		||||
		QSE_ACCESS_READ | QSE_ACCESS_WRITE) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(_WIN32)
 | 
			
		||||
bool Path::isExecutable ()
 | 
			
		||||
{
 | 
			
		||||
	return ::qse_access (this->full_path, QSE_ACCESS_EXECUTE) == 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
bool Path::isDirectory (const qse_char_t* path)
 | 
			
		||||
{
 | 
			
		||||
	int n;
 | 
			
		||||
	qse_stat_t st;
 | 
			
		||||
 | 
			
		||||
	n = ::qse_stat (path, &st);
 | 
			
		||||
	if (n == -1) return 0;
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	return (st.st_mode & _S_IFDIR) != 0;
 | 
			
		||||
#else
 | 
			
		||||
	return S_ISDIR(st.st_mode);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Path::isRegular (const qse_char_t* path)
 | 
			
		||||
{
 | 
			
		||||
	int n;
 | 
			
		||||
	qse_stat_t st;
 | 
			
		||||
 | 
			
		||||
	n = ::qse_stat(path, &st);
 | 
			
		||||
	if (n == -1) return 0;
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	return (st.st_mode & _S_IFREG) != 0;
 | 
			
		||||
#else
 | 
			
		||||
	return S_ISREG(st.st_mode);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Path::chmod (qse_mode_t mode)
 | 
			
		||||
{
 | 
			
		||||
	return qse_chmod (this->full_path, mode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Path::chmod (const qse_char_t* path, qse_mode_t mode)
 | 
			
		||||
{
 | 
			
		||||
	return qse_chmod (path, mode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Path::unlink ()
 | 
			
		||||
{
 | 
			
		||||
	return ::qse_unlink (this->full_path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Path::mkdir (qse_mode_t mode)
 | 
			
		||||
{
 | 
			
		||||
	return ::qse_mkdir(this->full_path, mode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Path::mkdir (const qse_char_t* path, qse_mode_t mode)
 | 
			
		||||
{
 | 
			
		||||
	return ::qse_mkdir(path, mode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Path::set_base_name ()
 | 
			
		||||
{
 | 
			
		||||
	qse_size_t len = qse_strlen(this->full_path);
 | 
			
		||||
	QSE_ASSERT (len > 0);
 | 
			
		||||
 | 
			
		||||
	for (qse_size_t i = len; i > 0; i--) {
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
		if ((this->full_path[i - 1] == QSE_T('/') || this->full_path[i - 1] == QSE_T('\\')) && i != len) 
 | 
			
		||||
		{
 | 
			
		||||
#else
 | 
			
		||||
		
 | 
			
		||||
		if (this->full_path[i - 1] == QSE_T('/') && i != len) 
 | 
			
		||||
		{
 | 
			
		||||
#endif
 | 
			
		||||
			const qse_char_t* p = this->full_path;
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
			if (this->full_path[len - 1] == QSE_T('/') || this->full_path[len - 1] == QSE_T('\\')) 
 | 
			
		||||
#else
 | 
			
		||||
			if (this->full_path[len - 1] == QSE_T('/')) 
 | 
			
		||||
#endif
 | 
			
		||||
				qse_strxncpy (this->base_name, QSE_COUNTOF(this->base_name), &p[i], len - i - 1);
 | 
			
		||||
			else 
 | 
			
		||||
				qse_strxncpy (this->base_name, QSE_COUNTOF(this->base_name), &p[i], len - i);
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
			if (i == 1 && (this->full_path[i - 1] == QSE_T('/') || this->full_path[i - 1] == QSE_T('\\'))) 
 | 
			
		||||
#else
 | 
			
		||||
			if (i == 1 && this->full_path[i - 1] == QSE_T('/')) 
 | 
			
		||||
#endif
 | 
			
		||||
				qse_strxncpy (this->base_dir, QSE_COUNTOF(this->base_dir), p, i);
 | 
			
		||||
			else 
 | 
			
		||||
				qse_strxncpy (this->base_dir, QSE_COUNTOF(this->base_dir), p, i - 1);
 | 
			
		||||
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	if (this->full_path[len - 1] == QSE_T('/') || this->full_path[len - 1] == QSE_T('\\')) 
 | 
			
		||||
#else
 | 
			
		||||
	if (this->full_path[len - 1] == QSE_T('/')) 
 | 
			
		||||
#endif
 | 
			
		||||
		qse_strxncpy (this->base_name, QSE_COUNTOF(this->base_name), this->full_path, len - 1);
 | 
			
		||||
	else 
 | 
			
		||||
		qse_strxcpy (this->base_name, QSE_COUNTOF(this->base_name), this->full_path);
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	if (this->full_path[0] == QSE_T('/') || this->full_path[0] == QSE_T('\\'))
 | 
			
		||||
#else
 | 
			
		||||
	if (this->full_path[0] == QSE_T('/')) 
 | 
			
		||||
#endif
 | 
			
		||||
		qse_strcpy (this->base_dir, QSE_T("/"));
 | 
			
		||||
	else 
 | 
			
		||||
		qse_strcpy (this->base_dir, QSE_T(""));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Path::set_to_root ()
 | 
			
		||||
{
 | 
			
		||||
	qse_strcpy (this->full_path, QSE_T("/"));
 | 
			
		||||
	//this->set_base_name ();
 | 
			
		||||
	qse_strcpy (this->base_name, QSE_T(""));
 | 
			
		||||
	qse_strcpy (this->base_dir,  QSE_T("/"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Path::setToSelf (const qse_char_t* argv0)
 | 
			
		||||
{
 | 
			
		||||
	qse_char_t p[MAX_LEN + 1];
 | 
			
		||||
	if (qse_getpnm(argv0, p, QSE_COUNTOF(p)) == -1) return -1;
 | 
			
		||||
	this->setName (p);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QSE_END_NAMESPACE(QSE)
 | 
			
		||||
		Reference in New Issue
	
	Block a user