/// 약속 (modular_sync F2): 받는 쪽에 이미 있는 파일을 원본과 "같은 파일" 로 치는지 (다시 보내지 않음) 와 받는 쪽이 더 새것인지. /// 앱이 직접 맞추는 길 (로컬 · 원격) 과 실행 전 미리 보기가 모두 이 하나를 부른다 - 예전에는 미리 보기와 실제 원격 맞추기의 판단이 달라 /// 원격 받는 쪽이 더 새 파일이 미리 보기에는 "바뀜" 으로 보이고 실제로는 건너뛰었다. /// - 입력: 원본 · 받는 쪽의 크기와 바뀐 때. 출력: 같은지 · 받는 쪽이 더 새것인지. 오류 없음 (순수). /// - 바뀐 때는 [window] (2초) 안이면 같은 때로 본다 (FAT · 원격의 초 단위 시각). /// - [uploadTime]: 받는 쪽 시각이 "올린 때" 인 곳 (원격이 낀 앱 맞추기, 이동 아님) - 크기가 같고 받는 쪽이 더 새것이어도 같다. /// 이동 (원본을 지움) 은 거의 같은 때일 때만 같다고 본다 (내용이 다른데 원본을 지우지 않게, 214). library; class SameFile { const SameFile({this.uploadTime = false}); /// 앱이 직접 맞출 때의 판단: 원격이 끼고 이동이 아니면 [uploadTime] factory SameFile.forAppSync({required bool remote, required bool move}) => SameFile(uploadTime: remote && !move); static const window = Duration(seconds: 2); final bool uploadTime; bool same({required int size, required DateTime modified, required int targetSize, required DateTime targetModified}) { if (size != targetSize) return false; if (targetModified.difference(modified).abs() <= window) return true; return uploadTime && !targetModified.isBefore(modified.subtract(window)); } /// 받는 쪽이 [window] 넘게 더 새것인지 (-u 건너뛰기 · 미리 보기 "더 새 것" 표시) static bool targetNewer(DateTime targetModified, DateTime modified) => targetModified.isAfter(modified.add(window)); }