Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <time.h>
Toshihiro Shimizu 890ddd
#include <sys/timeb.h>
Toshihiro Shimizu 890ddd
#include <sys/types.h>
Toshihiro Shimizu 890ddd
#include <sys/stat.h>
Toshihiro Shimizu 890ddd
#include <errno.h>
Toshihiro Shimizu 890ddd
#include <set>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef PLATFORM
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
#define PLATFORM WIN32
Toshihiro Shimizu 890ddd
#include <process.h>
Toshihiro Shimizu 890ddd
#include <io.h>
Toshihiro Shimizu 890ddd
#include <stdlib.h>
Toshihiro Shimizu 890ddd
#include <direct.h>
Toshihiro Shimizu 890ddd
#include "winsock2.h"
Toshihiro Shimizu 890ddd
#include "lmcons.h"
Toshihiro Shimizu 890ddd
#include <sys/utime.h>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef LINUX
Toshihiro Shimizu 890ddd
#define PLATFORM LINUX
Toshihiro Shimizu 890ddd
#include <grp.h>
Toshihiro Shimizu 890ddd
#include <utime.h>
Toshihiro Shimizu 890ddd
#include <sys/param.h>
Toshihiro Shimizu 890ddd
#include <unistd.h>
Toshihiro Shimizu 890ddd
#include <sys/types.h>
Toshihiro Shimizu 890ddd
#include <stdio.h>
Toshihiro Shimizu 890ddd
#include <unistd.h>
Toshihiro Shimizu 890ddd
#include <dirent.h>
Toshihiro Shimizu 890ddd
#include <sys/dir.h>
Toshihiro Shimizu 890ddd
#include <sys/sysinfo.h>
Toshihiro Shimizu 890ddd
#include <sys/swap.h>
Toshihiro Shimizu 890ddd
#include <sys/statfs.h>
Toshihiro Shimizu 890ddd
#include <pwd.h>
Toshihiro Shimizu 890ddd
#include <mntent.h>
Toshihiro Shimizu 890ddd
#include <dlfcn.h>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
extern "C" {
Toshihiro Shimizu 890ddd
int gethostname(char *, size_t);
Toshihiro Shimizu 890ddd
//int L_cuserid;
Toshihiro Shimizu 890ddd
char *cuserid(char *);
Toshihiro Shimizu 890ddd
char *tempnam(const char *, const char *);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
#define PLATFORM SGI
Toshihiro Shimizu 890ddd
#include <sys/param.h>
Toshihiro Shimizu 890ddd
#include <unistd.h>
Toshihiro Shimizu 890ddd
#include <grp.h>
Toshihiro Shimizu 890ddd
#include <sys/dir.h> // dirent.h
Toshihiro Shimizu 890ddd
#include <sys/utime.h>
Toshihiro Shimizu 890ddd
#include <sys/swap.h>
Toshihiro Shimizu 890ddd
#include <sys/statfs.h>
Toshihiro Shimizu 890ddd
#include <pwd.h>
Toshihiro Shimizu 890ddd
#include <mntent.h>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <dlfcn.h>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef PLATFORM
Toshihiro Shimizu 890ddd
PLATFORM_NOT_SUPPORTED
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace std;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
const int TSystem::MaxPathLen = _MAX_PATH;
Toshihiro Shimizu 890ddd
const int TSystem::MaxFNameLen = _MAX_FNAME;
Toshihiro Shimizu 890ddd
const int TSystem::MaxHostNameLen = 64;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::UserReadable = _S_IREAD;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::UserWritable = _S_IWRITE;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::UserExecutable = _S_IEXEC;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OwnerReadWriteExec = TFileStatus::UserReadable | TFileStatus::UserWritable | TFileStatus::UserExecutable;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OwnerReadable = TFileStatus::UserReadable;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OwnerWritable = TFileStatus::UserWritable;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OwnerExecutable = TFileStatus::UserExecutable;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::GroupReadWriteExec = TFileStatus::OwnerReadWriteExec;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::GroupReadable = TFileStatus::UserReadable;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::GroupWritable = TFileStatus::UserWritable;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::GroupExecutable = TFileStatus::UserExecutable;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OtherReadWriteExec = TFileStatus::UserReadable | TFileStatus::UserWritable | TFileStatus::UserExecutable;
Toshihiro Shimizu 890ddd
;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OtherReadable = TFileStatus::UserReadable;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OtherWritable = TFileStatus::UserWritable;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OtherExecutable = TFileStatus::UserReadable;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::IfDir = _S_IFDIR;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#define MKDIR _mkdir
Toshihiro Shimizu 890ddd
#define RMDIR _rmdir
Toshihiro Shimizu 890ddd
#define TEMPNAM _tempnam
Toshihiro Shimizu 890ddd
#define ACCESS _access
Toshihiro Shimizu 890ddd
#define STAT _stat
Toshihiro Shimizu 890ddd
#define UTIME _utime
Toshihiro Shimizu 890ddd
#define FTIME _ftime
Toshihiro Shimizu 890ddd
using std::ifstream;
Toshihiro Shimizu 890ddd
using std::ofstream;
Toshihiro Shimizu 890ddd
using std::filebuf;
Toshihiro Shimizu 890ddd
#else //these are common for IRIX & LINUX
Toshihiro Shimizu 890ddd
const int TSystem::MaxPathLen = MAXPATHLEN;
Toshihiro Shimizu 890ddd
const int TSystem::MaxHostNameLen = MAXHOSTNAMELEN;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OwnerReadWriteExec = S_IRWXU;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OwnerReadable = S_IRUSR;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OwnerWritable = S_IWUSR;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OwnerExecutable = S_IXUSR;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::GroupReadWriteExec = S_IRWXG;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::GroupReadable = S_IRGRP;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::GroupWritable = S_IWGRP;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::GroupExecutable = S_IXGRP;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OtherReadWriteExec = S_IRWXO;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OtherReadable = S_IROTH;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OtherWritable = S_IWOTH;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::OtherExecutable = S_IXOTH;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#define MKDIR mkdir
Toshihiro Shimizu 890ddd
#define RMDIR rmdir
Toshihiro Shimizu 890ddd
#define TEMPNAM tempnam
Toshihiro Shimizu 890ddd
#define ACCESS access
Toshihiro Shimizu 890ddd
#define STAT stat
Toshihiro Shimizu 890ddd
#define UTIME utime
Toshihiro Shimizu 890ddd
#define FTIME ftime
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
const int TSystem::MaxFNameLen = MAXNAMELEN;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::UserReadable = S_IREAD;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::UserWritable = S_IWRITE;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::UserExecutable = S_IEXEC;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::IfDir = S_IFDIR;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
const int TSystem::MaxFNameLen = 1024;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::UserReadable = __S_IREAD;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::UserWritable = __S_IWRITE;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::UserExecutable = __S_IEXEC;
Toshihiro Shimizu 890ddd
const unsigned short TFileStatus::IfDir = __S_IFDIR;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ostream &operator<<(ostream &out, const TSystemException &e)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return out << "TSystem Exception : " << e.getMessage() << endl;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//conversion functions
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void makeTm(const TTime &t, tm *p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	::memset(p, 0, sizeof(tm));
Toshihiro Shimizu 890ddd
	p->tm_year = t.getYear() - 1900;
Toshihiro Shimizu 890ddd
	p->tm_mon = t.getMonth() - 1; //[0,11]
Toshihiro Shimizu 890ddd
	p->tm_mday = t.getDay();
Toshihiro Shimizu 890ddd
	p->tm_hour = t.getHour();
Toshihiro Shimizu 890ddd
	p->tm_min = t.getMinutes();
Toshihiro Shimizu 890ddd
	p->tm_sec = t.getSeconds();
Toshihiro Shimizu 890ddd
	p->tm_isdst = -1;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTime makeTTime(const tm &p, int msec = 0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TTime(p.tm_year + 1900, p.tm_mon + 1, p.tm_mday,
Toshihiro Shimizu 890ddd
				 p.tm_hour, p.tm_min, p.tm_sec, msec);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
time_t makeTimeT(const TTime &t)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	tm x;
Toshihiro Shimizu 890ddd
	makeTm(t, &x);
Toshihiro Shimizu 890ddd
	time_t tt = mktime(&x);
Toshihiro Shimizu 890ddd
	return tt;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} //namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TDeltaTime::TDeltaTime(long sec, long msec)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// assert((sec && msec>=0) ||(sec==0 ));
Toshihiro Shimizu 890ddd
	assert(!((sec < 0 && msec > 0) || (sec > 0 && msec < 0)));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  0   0   ok
Toshihiro Shimizu 890ddd
  0   1   ok
Toshihiro Shimizu 890ddd
  1   0   ok
Toshihiro Shimizu 890ddd
  1   1   ok
Toshihiro Shimizu 890ddd
  0  -1   ok
Toshihiro Shimizu 890ddd
 -1   0   ok
Toshihiro Shimizu 890ddd
 -1  -1   ok
Toshihiro Shimizu 890ddd
 -1   1   NO
Toshihiro Shimizu 890ddd
  1  -1   NO
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_dsec = sec + msec / 1000;
Toshihiro Shimizu 890ddd
	m_dmsec = msec % 1000;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TDeltaTime TDeltaTime::operator+(const TDeltaTime &tdt)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	long sumSec = m_dsec + tdt.m_dsec;
Toshihiro Shimizu 890ddd
	long sumMsec = m_dmsec + tdt.m_dmsec;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (sumSec > 0 && sumMsec < 0)
Toshihiro Shimizu 890ddd
		return TDeltaTime(sumSec - 1, sumMsec + 1000);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (sumSec < 0 && sumMsec > 0)
Toshihiro Shimizu 890ddd
		return TDeltaTime(sumSec + 1, sumMsec - 1000);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return TDeltaTime(sumSec, sumMsec);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TDeltaTime TDeltaTime::operator-(const TDeltaTime &tdt)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	long diffSec = m_dsec - tdt.m_dsec;
Toshihiro Shimizu 890ddd
	long diffMsec = m_dmsec - tdt.m_dmsec;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (diffSec < 0 && diffMsec > 0)
Toshihiro Shimizu 890ddd
		return TDeltaTime(diffSec + 1, diffMsec - 1000);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (diffSec > 0 && diffMsec < 0)
Toshihiro Shimizu 890ddd
		return TDeltaTime(diffSec - 1, diffMsec + 1000);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return TDeltaTime(diffSec, diffMsec);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ostream &operator<<(ostream &out, const TDeltaTime &dt)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return out << dt.getSeconds() << "." << dt.getMilliSeconds();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// correggere gli assert => invalid (esiste il metodo bool isValid()const; operazioni con
Toshihiro Shimizu 890ddd
// un TTIme invalid danno un risultato invalid
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
TTime::TTime(int yyyy, int mm, int dd, int hh,
Toshihiro Shimizu 890ddd
			 int min, int sec, int msec)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (yyyy < 10)
Toshihiro Shimizu 890ddd
		yyyy += 2000;
Toshihiro Shimizu 890ddd
	else if (yyyy < 99)
Toshihiro Shimizu 890ddd
		yyyy += 1900;
Toshihiro Shimizu 890ddd
	assert(1970 <= yyyy && yyyy <= 2038);
Toshihiro Shimizu 890ddd
	m_y = yyyy;
Toshihiro Shimizu 890ddd
	assert(1 <= mm && mm <= 12);
Toshihiro Shimizu 890ddd
	m_m = mm;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int table[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Toshihiro Shimizu 890ddd
	int ddlimit = mm == 2 ? (28 + (isLeap() ? 1 : 0)) : table[mm - 1];
Toshihiro Shimizu 890ddd
	assert(1 <= dd && dd <= ddlimit);
Toshihiro Shimizu 890ddd
	m_d = dd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(0 <= hh && hh <= 23);
Toshihiro Shimizu 890ddd
	m_h = hh;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(0 <= min && min <= 59);
Toshihiro Shimizu 890ddd
	m_min = min;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(0 <= sec && sec <= 59);
Toshihiro Shimizu 890ddd
	m_sec = sec;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(0 <= msec && msec <= 999);
Toshihiro Shimizu 890ddd
	m_msec = msec;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTime::TTime(const TTime &t) : m_y(t.m_y), m_m(t.m_m), m_d(t.m_d), m_h(t.m_h), m_min(t.m_min), m_sec(t.m_sec), m_msec(t.m_msec)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TTime::operator==(const TTime &time) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return (m_y == time.m_y) &&
Toshihiro Shimizu 890ddd
		   (m_m == time.m_m) &&
Toshihiro Shimizu 890ddd
		   (m_d == time.m_d) &&
Toshihiro Shimizu 890ddd
		   (m_h == time.m_h) &&
Toshihiro Shimizu 890ddd
		   (m_min == time.m_min) &&
Toshihiro Shimizu 890ddd
		   (m_sec == time.m_sec) &&
Toshihiro Shimizu 890ddd
		   (m_msec == time.m_msec);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TTime::operator>(const TTime &time) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return (m_y > time.m_y) ||
Toshihiro Shimizu 890ddd
		   (m_y == time.m_y && m_m > time.m_m) ||
Toshihiro Shimizu 890ddd
		   (m_y == time.m_y && m_m == time.m_m && m_d > time.m_d) ||
Toshihiro Shimizu 890ddd
		   (m_y == time.m_y && m_m == time.m_m && m_d == time.m_d && m_h > time.m_h) ||
Toshihiro Shimizu 890ddd
		   (m_y == time.m_y && m_m == time.m_m && m_d == time.m_d &&
Toshihiro Shimizu 890ddd
			m_h == time.m_h && m_min > time.m_min) ||
Toshihiro Shimizu 890ddd
		   (m_y == time.m_y && m_m == time.m_m && m_d == time.m_d &&
Toshihiro Shimizu 890ddd
			m_h == time.m_h && m_min == time.m_min && m_sec > time.m_sec) ||
Toshihiro Shimizu 890ddd
		   (m_y == time.m_y && m_m == time.m_m && m_d == time.m_d &&
Toshihiro Shimizu 890ddd
			m_h == time.m_h && m_min == time.m_min && m_sec == time.m_sec && m_msec > time.m_msec);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TDeltaTime TTime::operator-(const TTime &t) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	time_t t2 = makeTimeT(*this);
Toshihiro Shimizu 890ddd
	assert(t2 != -1);
Toshihiro Shimizu 890ddd
	time_t t1 = makeTimeT(t);
Toshihiro Shimizu 890ddd
	assert(t1 != -1);
Toshihiro Shimizu 890ddd
	double d = difftime(t2, t1);
Toshihiro Shimizu 890ddd
	if (m_msec >= t.m_msec) {
Toshihiro Shimizu 890ddd
		if (d <= -1)
Toshihiro Shimizu 890ddd
			return TDeltaTime((long)(d + 1), -(long)(1000 - (m_msec - t.m_msec)));
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			return TDeltaTime((long)d, (long)(m_msec - t.m_msec));
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		if (d <= 0)
Toshihiro Shimizu 890ddd
			return TDeltaTime((long)(d), (long)(m_msec - t.m_msec));
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			return TDeltaTime((long)(d - 1), (long)(1000 + m_msec - t.m_msec));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTime TTime::operator+(const TDeltaTime &tdt) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	tm x;
Toshihiro Shimizu 890ddd
	makeTm(*this, &x);
Toshihiro Shimizu 890ddd
	int ms = m_msec + tdt.getMilliSeconds();
Toshihiro Shimizu 890ddd
	if (ms < 0) {
Toshihiro Shimizu 890ddd
		ms += 1000;
Toshihiro Shimizu 890ddd
		x.tm_sec += tdt.getSeconds() - 1;
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		x.tm_sec += tdt.getSeconds() + ms / 1000;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	mktime(&x);
Toshihiro Shimizu 890ddd
	return makeTTime(x, ms % 1000);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTime TTime::operator-(const TDeltaTime &tdt) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	tm x;
Toshihiro Shimizu 890ddd
	makeTm(*this, &x);
Toshihiro Shimizu 890ddd
	int ms = m_msec - tdt.getMilliSeconds();
Toshihiro Shimizu 890ddd
	if (ms < 0) {
Toshihiro Shimizu 890ddd
		ms += 1000;
Toshihiro Shimizu 890ddd
		x.tm_sec -= tdt.getSeconds() + 1;
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		x.tm_sec -= tdt.getSeconds() + ms / 1000;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	mktime(&x);
Toshihiro Shimizu 890ddd
	return makeTTime(x, ms % 1000);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string TTime::getFormattedString(char *fmt) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	tm x;
Toshihiro Shimizu 890ddd
	makeTm(*this, &x);
Toshihiro Shimizu 890ddd
	char strDest[256];
Toshihiro Shimizu 890ddd
	if (!fmt)
Toshihiro Shimizu 890ddd
		//fmt="%b %d %Y %X";
Toshihiro Shimizu 890ddd
		return getDate() + " " + getTime();
Toshihiro Shimizu 890ddd
	strftime(strDest, 256, fmt, &x);
Toshihiro Shimizu 890ddd
	return string(strDest);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string TTime::getDate() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return getFormattedString("%b %d %Y");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string TTime::getTime() const
Toshihiro Shimizu 890ddd
{ // hh:mm:ss
Toshihiro Shimizu 890ddd
	char buffer[10];
kogaki 5bbc3c
	ostrstream buff_s(buffer, sizeof(buffer));
Toshihiro Shimizu 890ddd
	buff_s << "." << m_msec << '\0';
Toshihiro Shimizu 890ddd
	return getFormattedString("%X") + buffer;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTime TTime::floor() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TTime(m_y, m_m, m_d, m_h, m_min, m_sec, 0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTime TTime::ceil() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_msec == 0)
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return *this + TDeltaTime(0, 1000 - m_msec);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFileStatus::TFileStatus(const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int acc = ACCESS(path.getFullPath().c_str(), 00); // 00 == solo esistenza
Toshihiro Shimizu 890ddd
	m_exist = acc != -1;
Toshihiro Shimizu 890ddd
	//gestire eccezioni controllando il valore di ritorno di access
Toshihiro Shimizu 890ddd
	//controllare il valore di errno
Toshihiro Shimizu 890ddd
	//int ret=
Toshihiro Shimizu 890ddd
	STAT(path.getFullPath().c_str(), &m_fStatus); //returns 0 if the file-status information is obtained
Toshihiro Shimizu 890ddd
												  /* if(ret!=0) ::memset(&m_fStatus,0,sizeof(m_fStatus)):*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string TFileStatus::getGroup() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifndef WIN32
Toshihiro Shimizu 890ddd
	struct group *grp = getgrgid(m_fStatus.st_gid);
Toshihiro Shimizu 890ddd
	if (grp)
Toshihiro Shimizu 890ddd
		return string(grp->gr_name);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	char buffer[1024];
kogaki 5bbc3c
	ostrstream buff(buffer, sizeof(buffer));
Toshihiro Shimizu 890ddd
	buff << m_fStatus.st_gid;
Toshihiro Shimizu 890ddd
	return string(buffer, buff.pcount());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string TFileStatus::getUser() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifndef WIN32
Toshihiro Shimizu 890ddd
	struct passwd *pw = getpwuid(m_fStatus.st_uid);
Toshihiro Shimizu 890ddd
	if (pw)
Toshihiro Shimizu 890ddd
		return string(pw->pw_name);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	char buffer[1024];
kogaki 5bbc3c
	ostrstream buff(buffer, sizeof(buffer));
Toshihiro Shimizu 890ddd
	buff << m_fStatus.st_uid;
Toshihiro Shimizu 890ddd
	return string(buffer, buff.pcount());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
long TFileStatus::getSize() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return (long)m_fStatus.st_size;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTime TFileStatus::getLastAccessTime() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	struct tm *t = localtime(&(m_fStatus.st_atime));
Toshihiro Shimizu 890ddd
	return TTime(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour,
Toshihiro Shimizu 890ddd
				 t->tm_min, t->tm_sec);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTime TFileStatus::getLastModificationTime() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	struct tm *t = localtime(&(m_fStatus.st_mtime));
Toshihiro Shimizu 890ddd
	return TTime(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour,
Toshihiro Shimizu 890ddd
				 t->tm_min, t->tm_sec);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTime TFileStatus::getCreationTime() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	struct tm *t = localtime(&(m_fStatus.st_ctime));
Toshihiro Shimizu 890ddd
	return TTime(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour,
Toshihiro Shimizu 890ddd
				 t->tm_min, t->tm_sec);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
unsigned long TFileStatus::getPermissions() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_fStatus.st_mode;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TFileStatus::isDirectory() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return doesExist() && (getPermissions() & TFileStatus::IfDir) != 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string TSystem::getHostName()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	char hostName[MaxHostNameLen];
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	WSADATA wdata;
Toshihiro Shimizu 890ddd
	int err;
Toshihiro Shimizu 890ddd
	err = WSAStartup(MAKEWORD(1, 1), &wdata);
Toshihiro Shimizu 890ddd
	if (!err)
Toshihiro Shimizu 890ddd
		strcpy(hostName, "localhost"); // la rete non e' partita  ?!?
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	gethostname((char *)&hostName, MaxHostNameLen);
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	if (err)
Toshihiro Shimizu 890ddd
		WSACleanup();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return hostName;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string TSystem::getUserName()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
#ifndef UNLEN
Toshihiro Shimizu 890ddd
#define UNLEN (256)
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	const long bufSize = UNLEN;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	const long bufSize = L_cuserid;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	char userName[bufSize + 1];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	GetUserName((char *)&userName, (unsigned long *)(&bufSize));
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	cuserid(userName);
Toshihiro Shimizu 890ddd
	if (userName[0] == 0x00)
Toshihiro Shimizu 890ddd
		strcpy(userName, "User Unknown");
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	return string(userName);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string TSystem::getGroupName()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return string();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	struct group *currentGroup;
Toshihiro Shimizu 890ddd
	currentGroup = getgrgid(getgid());
Toshihiro Shimizu 890ddd
	if (currentGroup)
Toshihiro Shimizu 890ddd
		return string(currentGroup->gr_name);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return string();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TSystem::getProcessId()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return getpid();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath TSystem::getHomeDirectory()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifndef WIN32
Toshihiro Shimizu 890ddd
	struct passwd *pwd = getpwnam(getUserName().c_str());
Toshihiro Shimizu 890ddd
	if (!pwd) {
Toshihiro Shimizu 890ddd
		return TFilePath();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return TFilePath(pwd->pw_dir);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	char *s = getenv("USERPROFILE");
Toshihiro Shimizu 890ddd
	if (!s)
Toshihiro Shimizu 890ddd
		return TFilePath();
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return TFilePath(s);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath TSystem::getTempDir()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	//gestire eccezioni se dw==0
Toshihiro Shimizu 890ddd
	DWORD dw = GetTempPath(0, 0); //non include il terminatore
Toshihiro Shimizu 890ddd
	char *path = new char[dw + 1];
Toshihiro Shimizu 890ddd
	GetTempPath(dw, path);
Toshihiro Shimizu 890ddd
	TFilePath tempDir(path);
Toshihiro Shimizu 890ddd
	delete[] path;
Toshihiro Shimizu 890ddd
	return tempDir;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	return TFilePath(tmpnam(0)).getParentDir();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath TSystem::getTestDir()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	return TFilePath("\\\\sirio\\toonz5.0\\TNZCORE_TEST");
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	return TFilePath("/ULTRA/toonz5.0/TNZCORE_TEST");
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string TSystem::getSystemValue(const TFilePath &name)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string keyName = name.getParentDir().getFullPath();
Toshihiro Shimizu 890ddd
	string varName = name.getName();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	HKEY hkey;
Toshihiro Shimizu 890ddd
	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName.c_str(), 0, KEY_READ, &hkey) != ERROR_SUCCESS) {
Toshihiro Shimizu 890ddd
		/*key not defined*/
Toshihiro Shimizu 890ddd
		return "";
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	unsigned char buffer[1024];
Toshihiro Shimizu 890ddd
	unsigned long bufferSize = sizeof(buffer);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string value;
Toshihiro Shimizu 890ddd
	if (RegQueryValueEx(hkey, varName.c_str(), NULL, NULL, buffer, &bufferSize) == ERROR_SUCCESS)
Toshihiro Shimizu 890ddd
		value = string((char *)buffer);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	RegCloseKey(hkey);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	char *s = getenv(name.getFullPath().c_str());
Toshihiro Shimizu 890ddd
	return string(s ? s : "");
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath TSystem::getBinDir()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	char buf[MaxPathLen];
Toshihiro Shimizu 890ddd
	GetModuleFileName(0, buf, MaxPathLen);
Toshihiro Shimizu 890ddd
	return TFilePath(buf).getParentDir();
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	string binroot = TSystem::getSystemValue("BINROOT");
Toshihiro Shimizu 890ddd
	if (binroot == "") {
Toshihiro Shimizu 890ddd
		assert(!"BINROOT variable undefined");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return TFilePath(binroot) + "bin";
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath TSystem::getUniqueFile(string field)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	char *tempName = TEMPNAM(getTempDir().getFullPath().c_str(), field.c_str());
Toshihiro Shimizu 890ddd
	if (tempName == 0)
Toshihiro Shimizu 890ddd
		throw TSystemException(TFilePath(getTempDir().getFullPath() + field), 1);
Toshihiro Shimizu 890ddd
	TFilePath outPath(tempName);
Toshihiro Shimizu 890ddd
	free(tempName);
Toshihiro Shimizu 890ddd
	return outPath;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const TDeltaTime TDeltaTime::second = TDeltaTime(1, 0);
Toshihiro Shimizu 890ddd
const TDeltaTime TDeltaTime::minute = 60 * TDeltaTime::second;
Toshihiro Shimizu 890ddd
const TDeltaTime TDeltaTime::hour = 60 * TDeltaTime::minute;
Toshihiro Shimizu 890ddd
const TDeltaTime TDeltaTime::day = 24 * TDeltaTime::hour;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTime TSystem::getCurrentTime()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	struct _timeb curTime;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	struct timeb curTime;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	FTIME(&curTime);
Toshihiro Shimizu 890ddd
	struct tm *localTime = localtime(&(curTime.time));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return TTime(localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
Toshihiro Shimizu 890ddd
				 localTime->tm_hour, localTime->tm_min, localTime->tm_sec, curTime.millitm);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
//gestire exception
Toshihiro Shimizu 890ddd
void TSystem::mkDir(const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (path == "") {
Toshihiro Shimizu 890ddd
		throw TSystemException("mkdir: Empty argument");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (TFileStatus(path).doesExist() || path.isRoot())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	while (!TFileStatus(path.getParentDir()).doesExist() && !path.getParentDir().isRoot()) {
Toshihiro Shimizu 890ddd
		mkDir(path.getParentDir());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	int ret = MKDIR(path.getFullPath().c_str()); //ret e' EEXIST o ENOENT
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	umask(0);
Toshihiro Shimizu 890ddd
	mode_t attr = TFileStatus::UserReadable | TFileStatus::UserWritable |
Toshihiro Shimizu 890ddd
				  TFileStatus::UserExecutable | TFileStatus::OwnerReadWriteExec |
Toshihiro Shimizu 890ddd
				  TFileStatus::GroupReadWriteExec | TFileStatus::OtherReadWriteExec;
Toshihiro Shimizu 890ddd
	int ret = MKDIR(path.getFullPath().c_str(), attr); // ret e` EEXIST o ENOENT
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	if (ret == -1)
Toshihiro Shimizu 890ddd
		throw TSystemException(path, errno);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
//gestire exception
Toshihiro Shimizu 890ddd
void TSystem::rmDir(const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//  if (!TFileStatus(path).doesExist())
Toshihiro Shimizu 890ddd
	//	return;
Toshihiro Shimizu 890ddd
	int ret = RMDIR(path.getFullPath().c_str());
Toshihiro Shimizu 890ddd
	if (ret == -1) //ret e' ENOTEMPTY o ENOENT
Toshihiro Shimizu 890ddd
		throw TSystemException(path, errno);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::rmDirTree(const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePathSet pathSet = readDirectory(path);
Toshihiro Shimizu 890ddd
	for (TFilePathSet::iterator it = pathSet.begin(); it != pathSet.end(); it++) {
Toshihiro Shimizu 890ddd
		TFilePath path = *it;
Toshihiro Shimizu 890ddd
		if (TFileStatus(path).isDirectory())
Toshihiro Shimizu 890ddd
			rmDirTree(path);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			deleteFile(path);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	rmDir(path);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::copyDir(const TFilePath &dst, const TFilePath &src)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!TFileStatus(dst).doesExist())
Toshihiro Shimizu 890ddd
		mkDir(dst);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePathSet pathSet = readDirectory(src);
Toshihiro Shimizu 890ddd
	for (TFilePathSet::iterator it = pathSet.begin(); it != pathSet.end(); it++) {
Toshihiro Shimizu 890ddd
		TFilePath path = *it;
Toshihiro Shimizu 890ddd
		if (TFileStatus(path).isDirectory())
Toshihiro Shimizu 890ddd
			copyDir(path.withParentDir(dst), path);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			copyFile(path.withParentDir(dst), path);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::touchFile(const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	string filename = path.getFullPath();
Toshihiro Shimizu 890ddd
	if (TFileStatus(path).doesExist()) {
Toshihiro Shimizu 890ddd
		if (0 != UTIME(filename.c_str(), 0))
Toshihiro Shimizu 890ddd
			throw TSystemException(path, errno);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		ofstream file(filename.c_str());
Toshihiro Shimizu 890ddd
		if (!file) {
Toshihiro Shimizu 890ddd
			throw TSystemException(path, errno);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		file.close(); // altrimenti il compilatore da' un warning:
Toshihiro Shimizu 890ddd
					  // variabile non utilizzata
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string getFormattedMessage(DWORD lastError)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	LPVOID lpMsgBuf;
Toshihiro Shimizu 890ddd
	FormatMessage(
Toshihiro Shimizu 890ddd
		FORMAT_MESSAGE_ALLOCATE_BUFFER |
Toshihiro Shimizu 890ddd
			FORMAT_MESSAGE_FROM_SYSTEM |
Toshihiro Shimizu 890ddd
			FORMAT_MESSAGE_IGNORE_INSERTS,
Toshihiro Shimizu 890ddd
		NULL,
Toshihiro Shimizu 890ddd
		lastError,
Toshihiro Shimizu 890ddd
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
Toshihiro Shimizu 890ddd
		(LPTSTR)&lpMsgBuf,
Toshihiro Shimizu 890ddd
		0,
Toshihiro Shimizu 890ddd
		NULL);
Toshihiro Shimizu 890ddd
	return (char *)lpMsgBuf;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} //namespace
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::copyFile(const TFilePath &dst, const TFilePath &src)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(dst != src);
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	// o e' meglio usare CopyFileEx??
Toshihiro Shimizu 890ddd
	BOOL res = CopyFile(src.getFullPath().c_str(), // pointer to name of an existing file
Toshihiro Shimizu 890ddd
						dst.getFullPath().c_str(), // pointer to filename to copy to
Toshihiro Shimizu 890ddd
						TRUE);					   // flag for operation if file exists
Toshihiro Shimizu 890ddd
	if (res == 0) {
Toshihiro Shimizu 890ddd
		throw TSystemException(src, getFormattedMessage(GetLastError()));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	ifstream fpin(src.getFullPath().c_str(), ios::in);
Toshihiro Shimizu 890ddd
	ofstream fpout(dst.getFullPath().c_str(), ios::out);
Toshihiro Shimizu 890ddd
	if (!fpin || !fpout)
Toshihiro Shimizu 890ddd
		throw TSystemException(src, "unable to copy file");
Toshihiro Shimizu 890ddd
	int c = fpin.get();
Toshihiro Shimizu 890ddd
	while (!fpin.eof()) {
Toshihiro Shimizu 890ddd
		fpout.put(c);
Toshihiro Shimizu 890ddd
		c = fpin.get();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::renameFile(const TFilePath &dst, const TFilePath &src)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ret = rename(src.getFullPath().c_str(), dst.getFullPath().c_str());
Toshihiro Shimizu 890ddd
	if (ret != 0)
Toshihiro Shimizu 890ddd
		throw TSystemException(dst, errno);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//gestire gli errori con GetLastError?
Toshihiro Shimizu 890ddd
void TSystem::deleteFile(const TFilePath &dst)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	BOOL res = DeleteFile(dst.getFullPath().c_str()); // pointer to name of file to delete
Toshihiro Shimizu 890ddd
	//se fallisce perche' un file e' aperto chiudiamo prima il file?
Toshihiro Shimizu 890ddd
	//To close an open file, use the CloseHandle function.
Toshihiro Shimizu 890ddd
	if (res == 0)
Toshihiro Shimizu 890ddd
		throw TSystemException(dst, getFormattedMessage(GetLastError()));
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	int ret = remove(dst.getFullPath().c_str());
Toshihiro Shimizu 890ddd
	if (ret != 0)
Toshihiro Shimizu 890ddd
		throw TSystemException(dst, errno);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::moveFileToRecycleBin(const TFilePath &fp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	//
Toshihiro Shimizu 890ddd
	// from http://msdn.microsoft.com/msdnmag/issues/01/04/c/default.aspx
Toshihiro Shimizu 890ddd
	//
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Copy pathname to double-NULL-terminated string.
Toshihiro Shimizu 890ddd
	//
Toshihiro Shimizu 890ddd
	char buf[_MAX_PATH + 1];			   // allow one more character
Toshihiro Shimizu 890ddd
	strcpy(buf, fp.getFullPath().c_str()); // copy caller's path name
Toshihiro Shimizu 890ddd
	buf[strlen(buf) + 1] = 0;			   // need two NULLs at end
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	SHFILEOPSTRUCT data;
Toshihiro Shimizu 890ddd
	memset(&data, 0, sizeof(SHFILEOPSTRUCT));
Toshihiro Shimizu 890ddd
	data.fFlags |= FOF_SILENT;		   // don't report progress
Toshihiro Shimizu 890ddd
	data.fFlags |= FOF_NOERRORUI;	  // don't report errors
Toshihiro Shimizu 890ddd
	data.fFlags |= FOF_NOCONFIRMATION; // don't confirm delete
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	data.wFunc = FO_DELETE;		  // REQUIRED: delete operation
Toshihiro Shimizu 890ddd
	data.pFrom = buf;			  // REQUIRED: which file(s)
Toshihiro Shimizu 890ddd
	data.pTo = NULL;			  // MUST be NULL
Toshihiro Shimizu 890ddd
	data.fFlags |= FOF_ALLOWUNDO; // ..send to Recycle Bin
Toshihiro Shimizu 890ddd
	SHFileOperation(&data);		  // do it!
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	assert(!"Not implemented yet");
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::readDirectory(TFilePathSet &dst, const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!TFileStatus(path).isDirectory()) {
Toshihiro Shimizu 890ddd
		throw TSystemException(path, " is not a directory");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	WIN32_FIND_DATA findFileData;
Toshihiro Shimizu 890ddd
	string search = (path + "*").getFullPath();
Toshihiro Shimizu 890ddd
	HANDLE h = FindFirstFile(search.c_str(), &findFileData);
Toshihiro Shimizu 890ddd
	if (h == INVALID_HANDLE_VALUE)
Toshihiro Shimizu 890ddd
		throw TSystemException(path, getFormattedMessage(GetLastError()));
Toshihiro Shimizu 890ddd
	do {
Toshihiro Shimizu 890ddd
		string filename(findFileData.cFileName);
Toshihiro Shimizu 890ddd
		if (filename == "." || filename == "..")
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		TFilePath son = path + filename;
Toshihiro Shimizu 890ddd
		dst.push_back(son);
Toshihiro Shimizu 890ddd
	} while (FindNextFile(h, &findFileData));
Toshihiro Shimizu 890ddd
	FindClose(h);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	DIR *dirp;
Toshihiro Shimizu 890ddd
	struct direct *directp;
Toshihiro Shimizu 890ddd
	dirp = opendir(path.getFullPath().c_str());
Toshihiro Shimizu 890ddd
	if (dirp == 0)
Toshihiro Shimizu 890ddd
		throw TSystemException(path, errno);
Toshihiro Shimizu 890ddd
	while (directp = readdir(dirp)) {
Toshihiro Shimizu 890ddd
		string filename(directp->d_name);
Toshihiro Shimizu 890ddd
		if (filename == "." || filename == "..")
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		TFilePath son = path + filename;
Toshihiro Shimizu 890ddd
		dst.push_back(son);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	closedir(dirp);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::readDirectory(
Toshihiro Shimizu 890ddd
	TFilePathSet &dst,
Toshihiro Shimizu 890ddd
	const TFilePathSet &pathSet)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	for (TFilePathSet::const_iterator it = pathSet.begin(); it != pathSet.end(); it++)
Toshihiro Shimizu 890ddd
		readDirectory(dst, *it);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePathSet TSystem::readDirectory(const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePathSet filePathSet;
Toshihiro Shimizu 890ddd
	readDirectory(filePathSet, path);
Toshihiro Shimizu 890ddd
	return filePathSet;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePathSet TSystem::readDirectory(const TFilePathSet &pathSet)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePathSet dst;
Toshihiro Shimizu 890ddd
	readDirectory(dst, pathSet);
Toshihiro Shimizu 890ddd
	return dst;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::readDirectoryTree(
Toshihiro Shimizu 890ddd
	TFilePathSet &dst,
Toshihiro Shimizu 890ddd
	const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!TFileStatus(path).isDirectory()) {
Toshihiro Shimizu 890ddd
		throw TSystemException(path, " is not a directory");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	WIN32_FIND_DATA findFileData;
Toshihiro Shimizu 890ddd
	string search = (path + "*").getFullPath();
Toshihiro Shimizu 890ddd
	HANDLE h = FindFirstFile(search.c_str(), &findFileData);
Toshihiro Shimizu 890ddd
	if (h == INVALID_HANDLE_VALUE)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	do {
Toshihiro Shimizu 890ddd
		string filename(findFileData.cFileName);
Toshihiro Shimizu 890ddd
		if (filename == "." || filename == "..")
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		TFilePath son = path + findFileData.cFileName;
Toshihiro Shimizu 890ddd
		if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
Toshihiro Shimizu 890ddd
			readDirectoryTree(dst, son);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			dst.push_back(son);
Toshihiro Shimizu 890ddd
	} while (FindNextFile(h, &findFileData));
Toshihiro Shimizu 890ddd
	FindClose(h);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	DIR *dirp;
Toshihiro Shimizu 890ddd
	struct direct *directp;
Toshihiro Shimizu 890ddd
	dirp = opendir(path.getFullPath().c_str());
Toshihiro Shimizu 890ddd
	if (dirp == 0)
Toshihiro Shimizu 890ddd
		throw TSystemException(path, errno);
Toshihiro Shimizu 890ddd
	while (directp = readdir(dirp)) {
Toshihiro Shimizu 890ddd
		string filename(directp->d_name);
Toshihiro Shimizu 890ddd
		if (filename == "." || filename == "..")
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		TFilePath son = path + filename;
Toshihiro Shimizu 890ddd
		if (TFileStatus(son).isDirectory())
Toshihiro Shimizu 890ddd
			readDirectoryTree(dst, son);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			dst.push_back(son);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	closedir(dirp);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::readDirectoryTree(
Toshihiro Shimizu 890ddd
	TFilePathSet &dst,
Toshihiro Shimizu 890ddd
	const TFilePathSet &pathSet)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	for (TFilePathSet::const_iterator it = pathSet.begin(); it != pathSet.end(); it++)
Toshihiro Shimizu 890ddd
		readDirectoryTree(dst, *it);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePathSet TSystem::readDirectoryTree(const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePathSet dst;
Toshihiro Shimizu 890ddd
	readDirectoryTree(dst, path);
Toshihiro Shimizu 890ddd
	return dst;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePathSet TSystem::readDirectoryTree(const TFilePathSet &pathSet)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePathSet dst;
Toshihiro Shimizu 890ddd
	readDirectoryTree(dst, pathSet);
Toshihiro Shimizu 890ddd
	return dst;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePathSet TSystem::packLevelNames(const TFilePathSet &fps)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	std::set<TFilePath> tmpSet;
Toshihiro Shimizu 890ddd
	TFilePathSet::const_iterator cit;
Toshihiro Shimizu 890ddd
	for (cit = fps.begin(); cit != fps.end(); ++cit)
Toshihiro Shimizu 890ddd
		tmpSet.insert(cit->getParentDir() + cit->getLevelName());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePathSet fps2;
Toshihiro Shimizu 890ddd
	for (std::set<TFilePath>::const_iterator c_sit = tmpSet.begin(); c_sit != tmpSet.end(); ++c_sit) {
Toshihiro Shimizu 890ddd
		fps2.push_back(*c_sit);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return fps2;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePathSet TSystem::getDisks()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePathSet filePathSet;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	DWORD size = GetLogicalDriveStrings(0, NULL);
Toshihiro Shimizu 890ddd
	char *buffer = new char[size + 1];
Toshihiro Shimizu 890ddd
	char *ptr = buffer;
Toshihiro Shimizu 890ddd
	DWORD rc = GetLogicalDriveStrings(size, buffer);
Toshihiro Shimizu 890ddd
	if (rc == 0)
Toshihiro Shimizu 890ddd
		throw TSystemException("", getFormattedMessage(GetLastError()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while (*ptr) {
Toshihiro Shimizu 890ddd
		filePathSet.push_back(ptr);
Toshihiro Shimizu 890ddd
		while (*ptr)
Toshihiro Shimizu 890ddd
			ptr++;
Toshihiro Shimizu 890ddd
		ptr++;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	delete[] buffer;
Toshihiro Shimizu 890ddd
	return filePathSet;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	FILE *f = setmntent("/etc/fstab", "r");
Toshihiro Shimizu 890ddd
	if (f) {
Toshihiro Shimizu 890ddd
		while (struct mntent *m = getmntent(f)) {
Toshihiro Shimizu 890ddd
			//cout << "machine "<< m->mnt_fsname << " dir " <<m->mnt_dir << " type " <<  m->mnt_type << endl;
Toshihiro Shimizu 890ddd
			filePathSet.push_back(m->mnt_dir);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		endmntent(f);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return filePathSet;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ULONG TSystem::getDiskSize(const TFilePath &diskName)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	ULONG size = 0;
Toshihiro Shimizu 890ddd
	if (!diskName.isAbsolute()) {
Toshihiro Shimizu 890ddd
		assert(0);
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#ifndef WIN32
Toshihiro Shimizu 890ddd
	struct statfs buf;
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
	statfs(diskName.getFullPath().c_str(), &buf, sizeof(struct statfs), 0);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	statfs(diskName.getFullPath().c_str(), &buf);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	size = (ULONG)((buf.f_blocks * buf.f_bsize) >> 10);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	DWORD sectorsPerCluster;	// sectors per cluster
Toshihiro Shimizu 890ddd
	DWORD bytesPerSector;		// bytes per sector
Toshihiro Shimizu 890ddd
	DWORD numberOfFreeClusters; // free clusters
Toshihiro Shimizu 890ddd
	DWORD totalNumberOfClusters;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	BOOL rc = GetDiskFreeSpace(diskName.getFullPath().c_str(), // root path
Toshihiro Shimizu 890ddd
							   &sectorsPerCluster,			   // sectors per cluster
Toshihiro Shimizu 890ddd
							   &bytesPerSector,				   // bytes per sector
Toshihiro Shimizu 890ddd
							   &numberOfFreeClusters,		   // free clusters
Toshihiro Shimizu 890ddd
							   &totalNumberOfClusters		   // total clusters
Toshihiro Shimizu 890ddd
							   );
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!rc)
Toshihiro Shimizu 890ddd
		throw TSystemException(diskName, getFormattedMessage(GetLastError()));
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		size = (totalNumberOfClusters * sectorsPerCluster * bytesPerSector) >> 10;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	return size;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ULONG TSystem::getFreeDiskSize(const TFilePath &diskName)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	ULONG size = 0;
Toshihiro Shimizu 890ddd
	if (!diskName.isAbsolute()) {
Toshihiro Shimizu 890ddd
		assert(0);
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#ifndef WIN32
Toshihiro Shimizu 890ddd
	struct statfs buf;
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
	statfs(diskName.getFullPath().c_str(), &buf, sizeof(struct statfs), 0);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	statfs(diskName.getFullPath().c_str(), &buf);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	size = (ULONG)(buf.f_bfree * buf.f_bsize) >> 10;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	DWORD sectorsPerCluster;	// sectors per cluster
Toshihiro Shimizu 890ddd
	DWORD bytesPerSector;		// bytes per sector
Toshihiro Shimizu 890ddd
	DWORD numberOfFreeClusters; // free clusters
Toshihiro Shimizu 890ddd
	DWORD totalNumberOfClusters;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	BOOL rc = GetDiskFreeSpace(diskName.getFullPath().c_str(), // root path
Toshihiro Shimizu 890ddd
							   &sectorsPerCluster,			   // sectors per cluster
Toshihiro Shimizu 890ddd
							   &bytesPerSector,				   // bytes per sector
Toshihiro Shimizu 890ddd
							   &numberOfFreeClusters,		   // free clusters
Toshihiro Shimizu 890ddd
							   &totalNumberOfClusters		   // total clusters
Toshihiro Shimizu 890ddd
							   );
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!rc) //eccezione... getLastError etc...
Toshihiro Shimizu 890ddd
		throw TSystemException(diskName, getFormattedMessage(GetLastError()));
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		size = (numberOfFreeClusters * sectorsPerCluster * bytesPerSector) >> 10;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	return size;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ULONG TSystem::getFreeMemorySize()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ULONG totalFree = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	ULONG virtualFree = 0;
Toshihiro Shimizu 890ddd
	ULONG physicalFree = 0;
Toshihiro Shimizu 890ddd
	MEMORYSTATUS buff;
Toshihiro Shimizu 890ddd
	GlobalMemoryStatus(&buff);
Toshihiro Shimizu 890ddd
	physicalFree = buff.dwAvailPhys;
Toshihiro Shimizu 890ddd
	virtualFree = buff.dwAvailVirtual;
Toshihiro Shimizu 890ddd
	totalFree = (physicalFree + virtualFree) >> 10;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
	//check for virtual memory
Toshihiro Shimizu 890ddd
	int numberOfResources = swapctl(SC_GETNSWP, 0); /* get number of swapping resources configued */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (numberOfResources == 0)
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//avrei voluto fare: struct swaptable *table = new struct swaptable[...]
Toshihiro Shimizu 890ddd
	struct swaptable *table = (struct swaptable *)calloc(1, sizeof(struct swapent) * numberOfResources + sizeof(int));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	table->swt_n = numberOfResources;
Toshihiro Shimizu 890ddd
	swapctl(SC_LIST, table); /* list all the swapping resources */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ULONG virtualFree = 0;
Toshihiro Shimizu 890ddd
	ULONG physicalFree = 0;
Toshihiro Shimizu 890ddd
	for (int i = 0; i < table->swt_n; i++) {
Toshihiro Shimizu 890ddd
		virtualFree += table->swt_ent[i].ste_free;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	free(table);
Toshihiro Shimizu 890ddd
	totalFree = virtualFree << 4 + physicalFree;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#ifdef LINUX
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	struct sysinfo *sysInfo = (struct sysinfo *)calloc(1, sizeof(struct sysinfo));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!sysinfo(sysInfo)) {
Toshihiro Shimizu 890ddd
		totalFree = sysInfo->freeram + sysInfo->freeswap;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		assert(!"sysinfo function failed");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	free(sysInfo);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	@ @ @ERROR : PLATFORM NOT SUPPORTED
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
#endif //__sgi
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif //WIN32
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef WIN32
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return totalFree;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ostream &operator<<(ostream &out, const TTime &t)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return out << t.getDate() << " " << t.getTime();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
extern "C" long sginap(long ticks);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#ifdef LINUX
Toshihiro Shimizu 890ddd
extern "C" int usleep(unsigned int);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::sleep(const TDeltaTime &delay)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ms = delay.getSeconds() * 1000;
Toshihiro Shimizu 890ddd
	assert(ms >= delay.getSeconds());
Toshihiro Shimizu 890ddd
	ms += delay.getMilliSeconds();
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	Sleep(ms);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
	sginap(ms * CLK_TCK / 1000);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#ifdef LINUX
Toshihiro Shimizu 890ddd
	ms *= 1000;
Toshihiro Shimizu 890ddd
	usleep(ms);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TSystemException::TSystemException(const TFilePath &fname, int err)
Toshihiro Shimizu 890ddd
	: m_fname(fname.getFullPath()), m_err(err), m_msg("")
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TSystemException::TSystemException(const TFilePath &fname, const string &msg)
Toshihiro Shimizu 890ddd
	: m_fname(fname.getFullPath()), m_err(-1), m_msg(msg)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TSystemException::TSystemException(const string &msg)
Toshihiro Shimizu 890ddd
	: m_fname(""), m_err(-1), m_msg(msg)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string TSystemException::getMessage() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	string msg = m_fname;
Toshihiro Shimizu 890ddd
	switch (m_err) {
Toshihiro Shimizu 890ddd
	case -1:
Toshihiro Shimizu 890ddd
		// nothing
Toshihiro Shimizu 890ddd
		msg += ": ";
Toshihiro Shimizu 890ddd
		msg += m_msg;
Toshihiro Shimizu 890ddd
		CASE EEXIST : msg += ": Directory was not created because filename is the name of an existing file, directory, or device";
Toshihiro Shimizu 890ddd
		CASE ENOENT : msg += ": Path was not found, or the named file does not exist or is a null pathname.";
Toshihiro Shimizu 890ddd
		CASE ENOTEMPTY : msg += ": Given path is not a directory; directory is not empty; or directory is either current working directory or root directory";
Toshihiro Shimizu 890ddd
		CASE EACCES : msg += ": Search permission is denied by a component of the path prefix, or write permission on the file named by path is denied, or times is NULL, and write access is denied";
Toshihiro Shimizu 890ddd
		CASE EFAULT : msg += ": Times is not NULL and, or points outside the process's allocated address space.";
Toshihiro Shimizu 890ddd
		CASE EINTR : msg += ": A signal was caught during the utime system call.";
Toshihiro Shimizu 890ddd
		CASE ENAMETOOLONG : msg += ": The length of the path argument exceeds {PATH_MAX}, or the length of a path component exceeds {NAME_MAX} while _POSIX_NO_TRUNC is in effect.";
Toshihiro Shimizu 890ddd
		CASE ENOTDIR : msg += ": A component of the path prefix is not a directory.";
Toshihiro Shimizu 890ddd
		CASE EPERM : msg += ": The calling process does not have the super-user privilege, the effective user ID is not the owner of the file, and times is not NULL, or the file system containing the file is mounted read-only";
Toshihiro Shimizu 890ddd
		CASE EROFS : msg += ": The current file system level range does not envelop the level of the file named by path, and the calling process does not have the super-user privilege.";
Toshihiro Shimizu 890ddd
		CASE ENOSYS : msg += ": When the named file cannot have its time reset.  The file is on a file system that doesn't have this operation.";
Toshihiro Shimizu 890ddd
		CASE EMFILE : msg += ": The maximum number of file descriptors are currently open.";
Toshihiro Shimizu 890ddd
		CASE ENFILE : msg += ": The system file table is full.";
Toshihiro Shimizu 890ddd
		CASE EBADF : msg += ": The file descriptor determined by the DIR stream is no longer valid.  This result occurs if the DIR stream has been closed.";
Toshihiro Shimizu 890ddd
		CASE EINVAL : msg += ": 64-bit and non-64-bit calls were mixed in a sequence of calls.";
Toshihiro Shimizu 890ddd
	DEFAULT:
Toshihiro Shimizu 890ddd
		msg += ": Unknown error";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef WIN32
Toshihiro Shimizu 890ddd
		CASE ELOOP : msg += ": Too many symbolic links were encountered in translating path.";
Toshihiro Shimizu 890ddd
		CASE EMULTIHOP : msg += ": Components of path require hopping to multiple remote machines and the file system does not allow it.";
Toshihiro Shimizu 890ddd
		CASE ENOLINK : msg += ": Path points to a remote machine and the link to that machine is no longer active.";
Toshihiro Shimizu 890ddd
#ifndef LINUX
Toshihiro Shimizu 890ddd
		CASE EDIRCORRUPTED : msg += ": The directory is corrupted on disk.";
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		CASE EOVERFLOW : msg += ": One of the inode number values or offset values did not fit in 32 bits, and the 64-bit interfaces were not used.";
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return msg;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
static const char *TnzLibMainProcName = "TLibMain";
Toshihiro Shimizu 890ddd
static std::map<string, const TPluginInfo *> PluginTable;
Toshihiro Shimizu 890ddd
static std::set<TnzLibMainProcType *> PluginMainTable;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
static std::vector<HINSTANCE> PluginInstanceTable;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
static std::vector<void *> PluginInstanceTable;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
extern "C" void unloadPlugins()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	for (std::vector<HINSTANCE>::iterator it = PluginInstanceTable.begin(); it != PluginInstanceTable.end(); ++it)
Toshihiro Shimizu 890ddd
		FreeLibrary(*it);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	for (std::vector<void *>::iterator it = PluginInstanceTable.begin(); it != PluginInstanceTable.end(); ++it)
Toshihiro Shimizu 890ddd
		dlclose(*it);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	PluginInstanceTable.clear();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::unLoadPlugins()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	unloadPlugins();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::loadPlugins(const TFilePath &dir)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	static bool cbReg = false;
Toshihiro Shimizu 890ddd
	if (!cbReg) {
Toshihiro Shimizu 890ddd
		cbReg = true;
Toshihiro Shimizu 890ddd
		atexit(unloadPlugins);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	string extension = "dll";
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	string extension = "so";
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePathSet dirContent = TSystem::readDirectory(dir);
Toshihiro Shimizu 890ddd
	if (dirContent.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (TFilePathSet::iterator it = dirContent.begin();
Toshihiro Shimizu 890ddd
		 it != dirContent.end(); it++) {
Toshihiro Shimizu 890ddd
		TFilePath fp = *it;
Toshihiro Shimizu 890ddd
		if (fp.getType() != extension)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//cout << "Loading..." << fp << endl;
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
		HINSTANCE handle = LoadLibrary(fp.getFullPath().c_str());
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		void *handle = dlopen(fp.getFullPath().c_str(), RTLD_LAZY);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (!handle) {
Toshihiro Shimizu 890ddd
// non riesce a caricare la libreria;
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
			DWORD err = GetLastError();
Toshihiro Shimizu 890ddd
			string s;
Toshihiro Shimizu 890ddd
			s = "*Error* unable to load " + fp.getFullPath() + ": " + getFormattedMessage(err) + '\0';
Toshihiro Shimizu 890ddd
			TSystem::outputDebug(s);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
			cout << "*ERROR* couldn't load " << fp << ":";
Toshihiro Shimizu 890ddd
			cout << dlerror() << endl;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			PluginInstanceTable.push_back(handle);
Toshihiro Shimizu 890ddd
//cout << "loaded" << endl;
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
			TnzLibMainProcType *tnzLibMain =
Toshihiro Shimizu 890ddd
				(TnzLibMainProcType *)GetProcAddress(handle, TnzLibMainProcName);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
			TnzLibMainProcType *tnzLibMain =
Toshihiro Shimizu 890ddd
				(TnzLibMainProcType *)dlsym(handle, TnzLibMainProcName);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
			if (!tnzLibMain) {
Toshihiro Shimizu 890ddd
				// La libreria non esporta TLibMain;
Toshihiro Shimizu 890ddd
				// per ora niente messaggi di errore
Toshihiro Shimizu 890ddd
				// cout<< "Unable to load TLibMain" << endl;
Toshihiro Shimizu 890ddd
				/*
Toshihiro Shimizu 890ddd
        #ifdef WIN32
Toshihiro Shimizu 890ddd
        FreeLibrary(handle);
Toshihiro Shimizu 890ddd
	#else
Toshihiro Shimizu 890ddd
	dlclose(handle);
Toshihiro Shimizu 890ddd
	#endif
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
			} else {
Toshihiro Shimizu 890ddd
				std::set<TnzLibMainProcType *>::iterator it;
Toshihiro Shimizu 890ddd
				it = PluginMainTable.find(tnzLibMain);
Toshihiro Shimizu 890ddd
				if (it == PluginMainTable.end()) {
Toshihiro Shimizu 890ddd
					PluginMainTable.insert(tnzLibMain);
Toshihiro Shimizu 890ddd
					const TPluginInfo *info = tnzLibMain();
Toshihiro Shimizu 890ddd
					if (info) {
Toshihiro Shimizu 890ddd
						PluginTable[info->getName()] = info;
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			} // if(tnzLibMain)
Toshihiro Shimizu 890ddd
		}	 // if(handle)
Toshihiro Shimizu 890ddd
	}		  // for
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::loadStandardPlugins()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	static bool alreadyDone = false;
Toshihiro Shimizu 890ddd
	if (alreadyDone)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	alreadyDone = true;
Toshihiro Shimizu 890ddd
	TFilePath pluginsDir = TSystem::getBinDir() + "plugins";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// cout << "loading standard plugins ... " << pluginsDir << endl;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		TSystem::loadPlugins(pluginsDir + "io");
Toshihiro Shimizu 890ddd
	} catch (const TException &e) {
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
		MessageBox(0, e.getMessage().c_str(), "Error loading plugin", MB_OK);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		cout << e.getMessage() << endl;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		TSystem::loadPlugins(pluginsDir + "fx");
Toshihiro Shimizu 890ddd
	} catch (const TException &e) {
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
		MessageBox(0, e.getMessage().c_str(), "Error loading plugin", MB_OK);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		cout << e.getMessage() << endl;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// cout << "done ... " << endl;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const TPluginInfo *TSystem::getLoadedPluginInfo(string name)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	std::map<string, const TPluginInfo *>::iterator it;
Toshihiro Shimizu 890ddd
	it = PluginTable.find(name);
Toshihiro Shimizu 890ddd
	if (it == PluginTable.end())
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return it->second;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::showDocument(const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	int ret = (int)
Toshihiro Shimizu 890ddd
		ShellExecute(0, "open", path.getFullPath().c_str(),
Toshihiro Shimizu 890ddd
					 0, 0, SW_SHOWNORMAL);
Toshihiro Shimizu 890ddd
	if (ret <= 32) {
Toshihiro Shimizu 890ddd
		throw TException(path.getFullPath() + " : can't open");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	string cmd = "mediaplayer ";
Toshihiro Shimizu 890ddd
	cmd = cmd + path.getFullPath();
Toshihiro Shimizu 890ddd
	system(cmd.c_str());
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TSystem::getProcessorCount()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	SYSTEM_INFO sysInfo;
Toshihiro Shimizu 890ddd
	GetSystemInfo(&sysInfo);
Toshihiro Shimizu 890ddd
	return sysInfo.dwNumberOfProcessors;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
	return sysconf(_SC_NPROC_CONF);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	return sysconf(_SC_NPROCESSORS_CONF);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSystem::outputDebug(string s)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	OutputDebugString(s.c_str());
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	cerr << s << endl;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}