Also das eigentliche Problem liegt darin, wie EMule versucht zu erkennen, ob sich eine Datei geändert hat.
Auf der Festplatte ist das Änderungsdatum der Datei unabhängig von Sommer-/Winterzeit gespeichert.
In der known.met ist die Uhrzeit der letzten Änderung ebenfalls gespeichert - und zwar
nach die Umrechnung in Sommer/Winterzeit !
Für den Vergleich, ob sich die Datei geändert hat, wird das auf der Festplatte gespeicherte Datum zuerst durch die Windows-Routine gejagt, die Sommer/Winterzeit draufaddiert, und dann mit dem Datum in dem Known.met verglichen. Das geht dann natürlich in die Hose, da der auf der Festplatte gespeicherte Wert
fest ist und da nicht mehr die Stunde für Sommer/Winterzeit draufaddiert werden darf !
Der Wert unterscheidet sich dann natürlich in dem Moment von dem gespeicherten Datum, wo die Windows-Routine anders draufaddiert - und schon ist die Datei "unterschiedlich" und muss neu gehasht werden.
Hier der zugehörige Codeschnipsel:
Datei: SharedFileList.cpp
Funktion: void CSharedFileList::AddFilesFromDirectory(char* directory);
Codezeilen:
CTime lwtime;
ff.GetLastWriteTime(lwtime);
uint32 fdate = mktime(lwtime.GetLocalTm());
CKnownFile* toadd = filelist->FindKnownFile(ff.GetFileName().GetBuffer(),fdate, (uint32)ff.GetLength());
=> Erst Änderungsdatum der Datei von der Platte holen, dann umwandeln, dann in FindKnownFile zum Vergleich reinstecken...
Datei: KnownFileList.cpp
Funktion: CKnownFile* CKnownFileList::FindKnownFile(char* filename,uint32 in_date,uint32 in_size);
Codezeilen:
if (ElementAt(i)->GetFileDate() == in_date && ...
... und dann mit dem gespeicherten Datum vergleichen.
Tja, schade aber auch
Richtig wäre es, nicht die umgerechneten Daten zu vergleichen, sondern ohne irgendwelche Umrechenroutinen zu arbeiten und das Roh-Datum zu speichern und zu vergleichen...