int DlgCompareDir::Refresh(String rel_path, int parent) { FindFile ff; VectorMap<String, FileInfo> afile, bfile; VectorMap<String, String> adir, bdir; String arel = AppendFileName(pa, rel_path); String brel = AppendFileName(pb, rel_path); int done = 0; if(!FetchDir(arel, afile, adir)) done |= 2; if(!FetchDir(brel, bfile, bdir)) done |= 1; Index<String> dir_index; dir_index <<= adir.GetIndex(); FindAppend(dir_index, bdir.GetKeys()); Vector<String> dirs(dir_index.PickKeys()); Sort(dirs, GetLanguageInfo()); for(int i = 0; i < dirs.GetCount(); i++) { int fa = adir.Find(dirs[i]), fb = bdir.Find(dirs[i]); String dn = (fb >= 0 ? bdir[fb] : adir[fa]); int dirpar = tree.Add(parent, CtrlImg::Dir(), dn); int dirdone = Refresh(AppendFileName(rel_path, dirs[i]), dirpar); done |= dirdone; switch(dirdone) { case 0: tree.Remove(dirpar); break; case 1: tree.SetNode(dirpar, TreeCtrl::Node().SetImage(CompDirImg::a_dir()).Set(dn)); break; case 2: tree.SetNode(dirpar, TreeCtrl::Node().SetImage(CompDirImg::b_dir()).Set(dn)); break; case 3: tree.SetNode(dirpar, TreeCtrl::Node().SetImage(CompDirImg::ab_dir()).Set(dn)); break; } } Index<String> name_index; name_index <<= afile.GetIndex(); FindAppend(name_index, bfile.GetKeys()); Vector<String> names(name_index.PickKeys()); Sort(names, GetLanguageInfo()); for(int i = 0; i < names.GetCount(); i++) { int fa = afile.Find(names[i]), fb = bfile.Find(names[i]); if(fa < 0) { tree.Add(parent, CompDirImg::b_file(), NFormat("%s: B (%`, %0n)", bfile[fb].name, bfile[fb].time, bfile[fb].size)); done |= 2; } else if(fb < 0) { tree.Add(parent, CompDirImg::a_file(), NFormat("%s: A (%`, %0n)", afile[fa].name, afile[fa].time, afile[fa].size)); done |= 1; } else if(afile[fa].size != bfile[fb].size || LoadFile(AppendFileName(arel, names[i])) != LoadFile(AppendFileName(brel, names[i]))) { tree.Add(parent, CompDirImg::ab_file(), NFormat("%s: A (%`, %0n), B (%`, %0n)", bfile[fb].name, afile[fa].time, afile[fa].size, bfile[fb].time, bfile[fb].size)); done |= 3; } } return done; }
afs_int32 Readdir(char **argp) { struct afsFetchStatus OutDirStatus; struct afsVolSync tsync; struct afsFid fid; struct afsToken Token; char *name; struct rx_call *tcall; int vnode, unique, offset, length, NextOffset; int code; sscanf(&(*argp)[0], "%d", &vnode); ++argp; sscanf(&(*argp)[0], "%d", &unique); ++argp; sscanf(&(*argp)[0], "%d", &offset); ++argp; sscanf(&(*argp)[0], "%d", &length); ++argp; memset(&fid, 0, sizeof(struct afsFid)); fid.Volume.low = 10; /* XXX */ fid.Vnode = vnode; fid.Unique = unique; tcall = rx_NewCall(cstruct->conns[0]); code = StartAFS_Readdir(tcall, &fid, offset, length, &hyp0, 0); if (!code) { code = FetchDir(tcall); } if (!code) { code = EndAFS_FetchData(tcall, &NextOffset, &OutDirStatus, &Token, &tsync); } code = rx_EndCall(tcall, code); return (code); }