UNPKG

2.97 kBtext/x-cView Raw
1/**
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8#include "ImageResponseObserverCoordinator.h"
9
10#include <algorithm>
11
12namespace facebook {
13namespace react {
14
15ImageResponseObserverCoordinator::ImageResponseObserverCoordinator() {
16 status_ = ImageResponse::Status::Loading;
17}
18
19ImageResponseObserverCoordinator::~ImageResponseObserverCoordinator() {}
20
21void 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
42void 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
52void 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
64void 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
86void 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} // namespace react
103} // namespace facebook