|
|
@@ -63,7 +63,7 @@ impl TileLoader {
|
|
63
|
63
|
let arc_request_rx = Arc::clone(&arc_request_rx);
|
|
64
|
64
|
let result_tx = result_tx.clone();
|
|
65
|
65
|
let arc_notice_func = Arc::clone(&arc_notice_func);
|
|
66
|
|
- thread::spawn(move || Self::work_remote(id, remote_queue, arc_request_rx, result_tx, arc_notice_func));
|
|
|
66
|
+ thread::spawn(move || Self::work_remote(id, &remote_queue, &arc_request_rx, &result_tx, &arc_notice_func));
|
|
67
|
67
|
}
|
|
68
|
68
|
}
|
|
69
|
69
|
|
|
|
@@ -147,10 +147,10 @@ impl TileLoader {
|
|
147
|
147
|
|
|
148
|
148
|
fn work_remote<F>(
|
|
149
|
149
|
thread_id: u32,
|
|
150
|
|
- queue: Arc<Mutex<Vec<TileRequest>>>,
|
|
151
|
|
- request_rx: Arc<Mutex<mpsc::Receiver<RemoteLoaderMessage>>>,
|
|
152
|
|
- result_tx: mpsc::Sender<(Tile, Option<DynamicImage>)>,
|
|
153
|
|
- notice_func: Arc<F>,
|
|
|
150
|
+ queue: &Arc<Mutex<Vec<TileRequest>>>,
|
|
|
151
|
+ request_rx: &Arc<Mutex<mpsc::Receiver<RemoteLoaderMessage>>>,
|
|
|
152
|
+ result_tx: &mpsc::Sender<(Tile, Option<DynamicImage>)>,
|
|
|
153
|
+ notice_func: &Arc<F>,
|
|
154
|
154
|
)
|
|
155
|
155
|
where F: Fn(Tile) + Sync + Send + 'static,
|
|
156
|
156
|
{
|
|
|
@@ -159,8 +159,7 @@ impl TileLoader {
|
|
159
|
159
|
loop {
|
|
160
|
160
|
let message = request_rx.lock().ok().and_then(|r| r.recv().ok());
|
|
161
|
161
|
match message {
|
|
162
|
|
- None => break,
|
|
163
|
|
- Some(RemoteLoaderMessage::Terminate) => break,
|
|
|
162
|
+ None | Some(RemoteLoaderMessage::Terminate) => break,
|
|
164
|
163
|
Some(RemoteLoaderMessage::PopQueue) => {
|
|
165
|
164
|
let ele: Option<TileRequest> = queue.lock().ok().and_then(|mut q| q.pop());
|
|
166
|
165
|
|
|
|
@@ -172,22 +171,27 @@ impl TileLoader {
|
|
172
|
171
|
|
|
173
|
172
|
if let Some(Ok(mut response)) = client_opt.as_ref().map(|c| c.get(&request.url).send()) {
|
|
174
|
173
|
let mut buf: Vec<u8> = vec![];
|
|
175
|
|
- response.copy_to(&mut buf).unwrap();
|
|
176
|
|
- if let Ok(img) = image::load_from_memory(&buf) {
|
|
177
|
|
- if result_tx.send((request.tile, Some(img))).is_err() {
|
|
178
|
|
- break;
|
|
179
|
|
- }
|
|
|
174
|
+ if response.copy_to(&mut buf).is_ok() {
|
|
|
175
|
+ if let Ok(img) = image::load_from_memory(&buf) {
|
|
|
176
|
+ // successfully loaded tile
|
|
|
177
|
+
|
|
|
178
|
+ if result_tx.send((request.tile, Some(img))).is_err() {
|
|
|
179
|
+ break;
|
|
|
180
|
+ }
|
|
180
|
181
|
|
|
181
|
|
- notice_func(request.tile);
|
|
|
182
|
+ notice_func(request.tile);
|
|
182
|
183
|
|
|
183
|
|
- if request.write_to_file {
|
|
184
|
|
- //TODO do something on write errors
|
|
185
|
|
- let _ = Self::write_to_file(&request.path, &buf);
|
|
186
|
|
- }
|
|
|
184
|
+ if request.write_to_file {
|
|
|
185
|
+ //TODO do something on write errors
|
|
|
186
|
+ let _ = Self::write_to_file(&request.path, &buf);
|
|
|
187
|
+ }
|
|
187
|
188
|
|
|
188
|
|
- continue;
|
|
|
189
|
+ continue;
|
|
|
190
|
+ }
|
|
189
|
191
|
}
|
|
190
|
192
|
}
|
|
|
193
|
+
|
|
|
194
|
+ // failed not load tile
|
|
191
|
195
|
if result_tx.send((request.tile, None)).is_err() {
|
|
192
|
196
|
break;
|
|
193
|
197
|
}
|
|
|
@@ -205,15 +209,17 @@ impl TileLoader {
|
|
205
|
209
|
let tile = Tile::new(tile_coord, source.id());
|
|
206
|
210
|
|
|
207
|
211
|
if !self.pending.contains(&tile) {
|
|
208
|
|
- self.pending.insert(tile);
|
|
209
|
|
- self.request_tx.send(LoaderMessage::GetTile(
|
|
210
|
|
- TileRequest {
|
|
211
|
|
- tile: tile,
|
|
212
|
|
- url: source.remote_tile_url(tile_coord),
|
|
213
|
|
- path: source.local_tile_path(tile_coord),
|
|
214
|
|
- write_to_file: write_to_file,
|
|
215
|
|
- }
|
|
216
|
|
- )).unwrap();
|
|
|
212
|
+ if self.request_tx.send(LoaderMessage::GetTile(
|
|
|
213
|
+ TileRequest {
|
|
|
214
|
+ tile: tile,
|
|
|
215
|
+ url: source.remote_tile_url(tile_coord),
|
|
|
216
|
+ path: source.local_tile_path(tile_coord),
|
|
|
217
|
+ write_to_file: write_to_file,
|
|
|
218
|
+ }
|
|
|
219
|
+ )).is_ok()
|
|
|
220
|
+ {
|
|
|
221
|
+ self.pending.insert(tile);
|
|
|
222
|
+ }
|
|
217
|
223
|
}
|
|
218
|
224
|
}
|
|
219
|
225
|
|
|
|
@@ -245,28 +251,24 @@ impl TileLoader {
|
|
245
|
251
|
if let Some(ref client) = self.client {
|
|
246
|
252
|
if let Ok(mut response) = client.get(&source.remote_tile_url(tile)).send() {
|
|
247
|
253
|
let mut buf: Vec<u8> = vec![];
|
|
248
|
|
- response.copy_to(&mut buf).unwrap();
|
|
249
|
|
- if let Ok(img) = image::load_from_memory(&buf) {
|
|
250
|
|
- if write_to_file {
|
|
251
|
|
- let path = source.local_tile_path(tile);
|
|
252
|
|
- let _ = Self::write_to_file(path, &buf);
|
|
|
254
|
+ if response.copy_to(&mut buf).is_ok() {
|
|
|
255
|
+ if let Ok(img) = image::load_from_memory(&buf) {
|
|
|
256
|
+ if write_to_file {
|
|
|
257
|
+ let path = source.local_tile_path(tile);
|
|
|
258
|
+ let _ = Self::write_to_file(path, &buf);
|
|
|
259
|
+ }
|
|
|
260
|
+ return Some(img);
|
|
253
|
261
|
}
|
|
254
|
|
- Some(img)
|
|
255
|
|
- } else {
|
|
256
|
|
- None
|
|
257
|
262
|
}
|
|
258
|
|
- } else {
|
|
259
|
|
- None
|
|
260
|
263
|
}
|
|
261
|
|
- } else {
|
|
262
|
|
- None
|
|
263
|
264
|
}
|
|
|
265
|
+ None
|
|
264
|
266
|
},
|
|
265
|
267
|
}
|
|
266
|
268
|
}
|
|
267
|
269
|
|
|
268
|
270
|
pub fn set_view_location(&mut self, view: View) {
|
|
269
|
|
- self.request_tx.send(LoaderMessage::SetView(view)).unwrap();
|
|
|
271
|
+ let _ = self.request_tx.send(LoaderMessage::SetView(view));
|
|
270
|
272
|
}
|
|
271
|
273
|
|
|
272
|
274
|
fn write_to_file<P: AsRef<Path>>(path: P, img_data: &[u8]) -> ::std::io::Result<()> {
|