00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "fsCmdHistoryMgr.h"
00009 #include "misc.h"
00010
00011 #ifdef _DEBUG
00012 #undef THIS_FILE
00013 static char THIS_FILE[]=__FILE__;
00014 #define new DEBUG_NEW
00015 #endif
00016
00017 fsCmdHistoryMgr::fsCmdHistoryMgr()
00018 {
00019 m_cMaxDays = 15;
00020 m_cMaxRecords = 30;
00021 GetLocalTime (&m_curday);
00022 }
00023
00024 fsCmdHistoryMgr::~fsCmdHistoryMgr()
00025 {
00026
00027 }
00028
00029 BOOL fsCmdHistoryMgr::SaveToFile(HANDLE hFile)
00030 {
00031 fsHistFileHdr hdr;
00032 DWORD dw;
00033
00034 if (!WriteFile (hFile, &hdr, sizeof (hdr), &dw, NULL))
00035 return FALSE;
00036
00037 int cDays = m_vRecs.size ();
00038
00039 if (!WriteFile (hFile, &cDays, sizeof (cDays), &dw, NULL))
00040 return FALSE;
00041
00042 for (int i = 0; i < m_vRecs.size (); i++)
00043 {
00044 if (!WriteFile (hFile, &m_vRecs [i].day, sizeof (FILETIME), &dw, NULL))
00045 return FALSE;
00046
00047 int cRecs = m_vRecs [i].vRecs.size ();
00048
00049 if (!WriteFile (hFile, &cRecs, sizeof (cRecs), &dw, NULL))
00050 return FALSE;
00051
00052 for (int j = 0; j < cRecs; j++)
00053 {
00054 if (!fsSaveStrToFile (m_vRecs [i].vRecs [j], hFile))
00055 return FALSE;
00056 }
00057 }
00058
00059 return TRUE;
00060 }
00061
00062 BOOL fsCmdHistoryMgr::ReadFromFile(HANDLE hFile)
00063 {
00064 DWORD dw;
00065 fsHistFileHdr hdr;
00066 int cDays;
00067
00068 if (!ReadFile (hFile, &hdr, sizeof (hdr), &dw, NULL))
00069 return FALSE;
00070
00071 if (strnicmp (hdr.szSig, HISTFILE_SIG, strlen (HISTFILE_SIG)))
00072 return FALSE;
00073
00074 if (hdr.wVer != HISTFILE_CURRENT_VERSION)
00075 return FALSE;
00076
00077 if (!ReadFile (hFile, &cDays, sizeof (cDays), &dw, NULL))
00078 return FALSE;
00079
00080 for (int i = 0; i < cDays; i++)
00081 {
00082 fs1DayRecords rec;
00083
00084 if (!ReadFile (hFile, &rec.day, sizeof (rec.day), &dw, NULL))
00085 return FALSE;
00086
00087 int cRecs;
00088 if (!ReadFile (hFile, &cRecs, sizeof (cRecs), &dw, NULL))
00089 return FALSE;
00090
00091 while (cRecs--)
00092 {
00093 char *pszRec;
00094
00095 if (!fsReadStrFromFile (&pszRec, hFile))
00096 return FALSE;
00097
00098 rec.vRecs.add (pszRec);
00099 delete [] pszRec;
00100 }
00101
00102 m_vRecs.add (rec);
00103
00104 if (i == cDays-1)
00105 FileTimeToSystemTime (&rec.day, &m_curday);
00106 }
00107
00108 Set_MaxRecordCount (m_cMaxRecords);
00109 Set_MaxDaysCount (m_cMaxDays);
00110
00111 return TRUE;
00112 }
00113
00114 int fsCmdHistoryMgr::GetRecordCount()
00115 {
00116 int cRecords = 0;
00117 for (int i = 0; i < m_vRecs.size (); i++)
00118 cRecords += m_vRecs [i].vRecs.size ();
00119 return cRecords;
00120 }
00121
00122 void fsCmdHistoryMgr::AddRecord(LPCSTR pszRecord)
00123 {
00124 if (m_bNoHistory)
00125 return;
00126
00127 if (m_vRecs.size () == 0)
00128 {
00129 fs1DayRecords rec;
00130 GetLocalTime (&m_curday);
00131 SystemTimeToFileTime (&m_curday, &rec.day);
00132 rec.vRecs.add (pszRecord);
00133 m_vRecs.add (rec);
00134 return;
00135 }
00136
00137 SYSTEMTIME time;
00138 GetLocalTime (&time);
00139 if (time.wDay != m_curday.wDay)
00140 {
00141
00142 fs1DayRecords rec;
00143 m_curday = time;
00144 SystemTimeToFileTime (&m_curday, &rec.day);
00145 m_vRecs.add (rec);
00146 }
00147
00148 for (int i = 0; i < m_vRecs.size (); i++)
00149 {
00150 fs::list <CString>* recs = &m_vRecs [i].vRecs;
00151
00152 for (int j = 0; j < recs->size (); j++)
00153 {
00154 if (recs->at (j).CompareNoCase (pszRecord) == 0)
00155 {
00156 recs->del (j);
00157 break;
00158 }
00159 }
00160
00161
00162 if (j != recs->size ())
00163 break;
00164 }
00165
00166 fs::list <CString>* recs = &m_vRecs [m_vRecs.size () - 1].vRecs;
00167
00168 recs->insert (0, pszRecord);
00169
00170 if (m_vRecs.size () > m_cMaxDays)
00171 m_vRecs.del (0);
00172
00173 while (GetRecordCount () > m_cMaxRecords)
00174 {
00175 while (m_vRecs [0].vRecs.size () == 0)
00176 m_vRecs.del (0);
00177
00178 m_vRecs [0].vRecs.del (m_vRecs [0].vRecs.size ()-1);
00179
00180 if (m_vRecs [0].vRecs.size () == 0)
00181 m_vRecs.del (0);
00182 }
00183 }
00184
00185 LPCSTR fsCmdHistoryMgr::GetRecord(int iRec)
00186 {
00187
00188
00189 for (int i = m_vRecs.size () - 1; i >= 0, iRec >= 0; i--)
00190 {
00191 if (m_vRecs [i].vRecs.size () <= iRec)
00192 {
00193 iRec -= m_vRecs [i].vRecs.size ();
00194 continue;
00195 }
00196
00197
00198 return m_vRecs [i].vRecs [iRec];
00199 }
00200
00201 return NULL;
00202 }
00203
00204 void fsCmdHistoryMgr::Set_MaxRecordCount(int iMax)
00205 {
00206 m_cMaxRecords = iMax;
00207 int nExcess = GetRecordCount () - m_cMaxRecords;
00208 while (nExcess > 0)
00209 {
00210
00211 int sz = m_vRecs [0].vRecs.size ();
00212 if (sz <= nExcess)
00213 {
00214
00215 m_vRecs.del (0);
00216 nExcess -= sz;
00217 }
00218 else
00219 {
00220
00221 while (nExcess-- > 0)
00222 {
00223 m_vRecs [0].vRecs.del (--sz);
00224 }
00225 }
00226 }
00227 }
00228
00229 void fsCmdHistoryMgr::ClearHistory()
00230 {
00231 m_vRecs.clear ();
00232 }
00233
00234 void fsCmdHistoryMgr::Set_NoHistory(BOOL b)
00235 {
00236 m_bNoHistory = b;
00237 if (m_bNoHistory)
00238 ClearHistory ();
00239 }
00240
00241 void fsCmdHistoryMgr::Set_MaxDaysCount(int cMax)
00242 {
00243 m_cMaxDays = cMax;
00244 while (m_vRecs.size () > m_cMaxDays)
00245 m_vRecs.del (0);
00246 }