1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | #include "ImageResponseObserverCoordinator.h"
|
9 |
|
10 | #include <algorithm>
|
11 |
|
12 | namespace facebook {
|
13 | namespace react {
|
14 |
|
15 | ImageResponseObserverCoordinator::ImageResponseObserverCoordinator() {
|
16 | status_ = ImageResponse::Status::Loading;
|
17 | }
|
18 |
|
19 | ImageResponseObserverCoordinator::~ImageResponseObserverCoordinator() {}
|
20 |
|
21 | void ImageResponseObserverCoordinator::addObserver(
|
22 | ImageResponseObserver *observer) const {
|
23 | ImageResponse::Status status = [this] {
|
24 | std::shared_lock<folly::SharedMutex> read(mutex_);
|
25 | return status_;
|
26 | }();
|
27 |
|
28 | if (status == ImageResponse::Status::Loading) {
|
29 | std::unique_lock<folly::SharedMutex> write(mutex_);
|
30 | observers_.push_back(observer);
|
31 | } else if (status == ImageResponse::Status::Completed) {
|
32 | ImageResponse imageResponseCopy = [this] {
|
33 | std::unique_lock<folly::SharedMutex> read(mutex_);
|
34 | return ImageResponse(imageData_);
|
35 | }();
|
36 | observer->didReceiveImage(imageResponseCopy);
|
37 | } else {
|
38 | observer->didReceiveFailure();
|
39 | }
|
40 | }
|
41 |
|
42 | void ImageResponseObserverCoordinator::removeObserver(
|
43 | ImageResponseObserver *observer) const {
|
44 | std::unique_lock<folly::SharedMutex> write(mutex_);
|
45 |
|
46 | auto position = std::find(observers_.begin(), observers_.end(), observer);
|
47 | if (position != observers_.end()) {
|
48 | observers_.erase(position, observers_.end());
|
49 | }
|
50 | }
|
51 |
|
52 | void ImageResponseObserverCoordinator::nativeImageResponseProgress(
|
53 | float progress) const {
|
54 | std::vector<ImageResponseObserver *> observersCopy = [this] {
|
55 | std::shared_lock<folly::SharedMutex> read(mutex_);
|
56 | return observers_;
|
57 | }();
|
58 |
|
59 | for (auto observer : observersCopy) {
|
60 | observer->didReceiveProgress(progress);
|
61 | }
|
62 | }
|
63 |
|
64 | void ImageResponseObserverCoordinator::nativeImageResponseComplete(
|
65 | const ImageResponse &imageResponse) const {
|
66 | {
|
67 | std::unique_lock<folly::SharedMutex> write(mutex_);
|
68 | imageData_ = imageResponse.getImage();
|
69 | status_ = ImageResponse::Status::Completed;
|
70 | }
|
71 |
|
72 | std::vector<ImageResponseObserver *> observersCopy = [this] {
|
73 | std::shared_lock<folly::SharedMutex> read(mutex_);
|
74 | return observers_;
|
75 | }();
|
76 |
|
77 | for (auto observer : observersCopy) {
|
78 | ImageResponse imageResponseCopy = [this] {
|
79 | std::unique_lock<folly::SharedMutex> read(mutex_);
|
80 | return ImageResponse(imageData_);
|
81 | }();
|
82 | observer->didReceiveImage(imageResponseCopy);
|
83 | }
|
84 | }
|
85 |
|
86 | void ImageResponseObserverCoordinator::nativeImageResponseFailed() const {
|
87 | {
|
88 | std::unique_lock<folly::SharedMutex> write(mutex_);
|
89 | status_ = ImageResponse::Status::Failed;
|
90 | }
|
91 |
|
92 | std::vector<ImageResponseObserver *> observersCopy = [this] {
|
93 | std::shared_lock<folly::SharedMutex> read(mutex_);
|
94 | return observers_;
|
95 | }();
|
96 |
|
97 | for (auto observer : observersCopy) {
|
98 | observer->didReceiveFailure();
|
99 | }
|
100 | }
|
101 |
|
102 | }
|
103 | }
|