// scan localpath, add or update child nodes, call recursively for folder nodes // localpath must be prefixed with Sync bool Sync::scan(string* localpath, FileAccess* fa) { if (localpath->size() < localdebris.size() || memcmp(localpath->data(), localdebris.data(), localdebris.size()) || (localpath->size() != localdebris.size() && memcmp(localpath->data() + localdebris.size(), client->fsaccess->localseparator.data(), client->fsaccess->localseparator.size()))) { DirAccess* da; string localname, name; bool success; da = client->fsaccess->newdiraccess(); // scan the dir, mark all items with a unique identifier if ((success = da->dopen(localpath, fa, false))) { size_t t = localpath->size(); while (da->dnext(&localname)) { name = localname; client->fsaccess->local2name(&name); // check if this record is to be ignored if (client->app->sync_syncable(name.c_str(), localpath, &localname)) { if (t) { localpath->append(client->fsaccess->localseparator); } localpath->append(localname); // skip the sync's debris folder if ((localpath->size() < localdebris.size()) || memcmp(localpath->data(), localdebris.data(), localdebris.size()) || ((localpath->size() != localdebris.size()) && memcmp(localpath->data() + localdebris.size(), client->fsaccess->localseparator.data(), client->fsaccess->localseparator.size()))) { // new or existing record: place scan result in notification queue dirnotify->notify(DirNotify::DIREVENTS, NULL, localpath->data(), localpath->size(), true); } localpath->resize(t); } } } delete da; return success; } else return false; }