Listing 4: Implementation of FileTime

#include "FileTime.h"
#include <iomanip>
#include <strstream>
#include <stdexcept>
#include <windows.h>

#if defined(__BORLANDC__)
 using namespace std;
#endif

/**
 * This is where most of the real work of the class is done.
 * NewTime() takes an argument of type FILETIME and then makes the
 * appropriate API calls to turn this into a useful set of data.
 * This data is then stored in the object's member variables. A
 * FILETIME object is returned from various file access functions,
 * but the data it contains is not generally useful, and must be
 * converted.
 **/
void FileTime::NewTime(const FILETIME *pFileTime)
     throw(runtime_error){

    ZeroMemberVars();
 
 FILETIME LocalFileTime;
 BOOL bResult=FileTimeToLocalFileTime(pFileTime,&LocalFileTime);
 if(!bResult) throw runtime_error(
        "Problem in FileTime::NewTime().Couldn't convert file time"
        " to local time");
 
 SYSTEMTIME SystemTime;
 bResult=FileTimeToSystemTime(&LocalFileTime,&SystemTime);
 if(!bResult) throw runtime_error(
        "Problem in FileTime::NewTime().Couldn't convert local time"
        " to system time");

 mYear        = SystemTime.wYear;
 mMonth       = SystemTime.wMonth;
 mDayOfWeek   = SystemTime.wDayOfWeek;
 mDay         = SystemTime.wDay;
 mHour        = SystemTime.wHour;
 mMinute      = SystemTime.wMinute;
 mSecond      = SystemTime.wSecond;
 mMillisecond = SystemTime.wMilliseconds;
}

void FileTime::ZeroMemberVars() throw() {
 mYear=0;
 mMonth=0;
 mDayOfWeek=0;
 mDay=0;
 mHour=0;
 mMinute=0;
 mSecond=0;
 mMillisecond=0;
 mDateSeparator='/';
 mTimeSeparator=':';
 mDateFillCharacter='0';
 mTimeFillCharacter='0';
}

const char* const FileTime::DateString() throw() {
 ostrstream osDate(mString,MaxLength);
 osDate << setfill(mDateFillCharacter)
        << setw(MonthLength) << mMonth << mDateSeparator
        << setw(DayLength)   << mDay   << mDateSeparator
        << setw(YearLength)  << mYear  << ends;
 return mString;
}

const char* const FileTime::TimeString() throw() {
 ostrstream osTime(mString,MaxLength);
 osTime << setfill(mTimeFillCharacter) 
        << setw(HourLength)        << mHour        << mTimeSeparator
        << setw(MinuteLength)      << mMinute      << mTimeSeparator
        << setw(SecondLength)      << mSecond      << mTimeSeparator
        << setw(MillisecondLength) << mMillisecond << ends;
 return mString;
}

const char* const FileTime::YearString() throw() {
 ostrstream os(mString,MaxLength);
 os << setfill(mDateFillCharacter) << setw(YearLength) << mYear
    << ends;
 return mString;
}

const char* const FileTime::MonthString() throw() {
 ostrstream os(mString,MaxLength);
 os << setfill(mDateFillCharacter) << setw(MonthLength) << mMonth
  << ends;
 return mString;
}

// portions omitted ...

const char* const FileTime::MillisecondString() throw() {
 ostrstream os(mString,MaxLength);
 os << setfill(mTimeFillCharacter) << setw(MillisecondLength)
    << mMillisecond                << ends;
 return mString;
}
//End of File