bool LocationIndex::VisitLocationAddressEntries(FileScanner& scanner, const AdminRegion& region, const Location& location, AddressVisitor& visitor, bool& stopped) const { uint32_t addressCount; if (!scanner.SetPos(location.addressesOffset)) { return false; } if (!scanner.ReadNumber(addressCount)) { return false; } ObjectFileRefStreamReader objectFileRefReader(scanner); for (size_t i=0; i<addressCount; i++) { Address address; if (!scanner.GetPos(address.addressOffset)) { return false; } address.locationOffset=location.locationOffset; address.regionOffset=location.regionOffset; if (!scanner.Read(address.name)) { return false; } if (!objectFileRefReader.Read(address.object)) { return false; } if (!visitor.Visit(region, location, address)) { stopped=true; break; } } return !scanner.HasError(); }
bool Intersection::Read(FileScanner& scanner) { try { scanner.ReadNumber(nodeId); uint32_t objectCount; scanner.ReadNumber(objectCount); objects.resize(objectCount); ObjectFileRefStreamReader objectFileRefReader(scanner); for (size_t i=0; i<objectCount; i++) { objectFileRefReader.Read(objects[i]); } } catch (IOException& e) { log.Error() << e.GetDescription(); return false; } return true; }
bool LocationIndex::LoadRegionDataEntry(FileScanner& scanner, const AdminRegion& adminRegion, LocationVisitor& visitor, bool& stopped) const { uint32_t poiCount; uint32_t locationCount; if (!scanner.ReadNumber(poiCount)) { return false; } ObjectFileRefStreamReader objectFileRefReader(scanner); for (size_t i=0; i<poiCount; i++) { POI poi; poi.regionOffset=adminRegion.regionOffset; if (!scanner.Read(poi.name)) { return false; } if (!objectFileRefReader.Read(poi.object)) { return false; } if (!visitor.Visit(adminRegion, poi)) { stopped=true; return true; } } if (!scanner.ReadNumber(locationCount)) { return false; } for (size_t i=0; i<locationCount; i++) { Location location; uint32_t objectCount; if (!scanner.GetPos(location.locationOffset)) { return false; } if (!scanner.Read(location.name)) { return false; } location.regionOffset=adminRegion.regionOffset; if (!scanner.ReadNumber(objectCount)) { return false; } location.objects.reserve(objectCount); bool hasAddresses; if (!scanner.Read(hasAddresses)) { return false; } if (hasAddresses) { if (!scanner.ReadFileOffset(location.addressesOffset)) { return false; } } else { location.addressesOffset=0; } objectFileRefReader.Reset(); for (size_t j=0; j<objectCount; j++) { ObjectFileRef ref; if (!objectFileRefReader.Read(ref)) { return false; } location.objects.push_back(ref); } if (!visitor.Visit(adminRegion, location)) { stopped=true; return true; } } return !scanner.HasError(); }