Files
react-native/ReactCommon/react/renderer/imagemanager/ImageResponseObserverCoordinator.cpp
T
Joshua Gross b3930f935f Convert most Fabric Cxx code to use react_native_assert instead of assert
Summary:
See react_native_assert.{h,cpp}. Because of the BUCK+Android issue where NDEBUG is always defined, we use react_native_assert instead of assert to enable xplat asserts in debug/dev mode.

This migrates most of the codebase, but probably not 100%. The goal is to increase assertion coverage on Android, not to get to 100% (yet).

Changelog: [Internal]

Reviewed By: RSNara

Differential Revision: D26562866

fbshipit-source-id: a7bf2055b973e1d3650ed8d68a6d02d556604af9
2021-02-19 20:52:52 -08:00

93 lines
2.5 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "ImageResponseObserverCoordinator.h"
#include <algorithm>
#include <react/debug/react_native_assert.h>
namespace facebook {
namespace react {
void ImageResponseObserverCoordinator::addObserver(
ImageResponseObserver const &observer) const {
mutex_.lock();
switch (status_) {
case ImageResponse::Status::Loading: {
observers_.push_back(&observer);
mutex_.unlock();
break;
}
case ImageResponse::Status::Completed: {
auto imageData = imageData_;
auto imageMetadata = imageMetadata_;
mutex_.unlock();
observer.didReceiveImage(ImageResponse{imageData, imageMetadata});
break;
}
case ImageResponse::Status::Failed: {
mutex_.unlock();
observer.didReceiveFailure();
break;
}
}
}
void ImageResponseObserverCoordinator::removeObserver(
ImageResponseObserver const &observer) const {
std::lock_guard<std::mutex> lock(mutex_);
// We remove only one element to maintain a balance between add/remove calls.
auto position = std::find(observers_.begin(), observers_.end(), &observer);
if (position != observers_.end()) {
observers_.erase(position, observers_.end());
}
}
void ImageResponseObserverCoordinator::nativeImageResponseProgress(
float progress) const {
mutex_.lock();
auto observers = observers_;
react_native_assert(status_ == ImageResponse::Status::Loading);
mutex_.unlock();
for (auto observer : observers) {
observer->didReceiveProgress(progress);
}
}
void ImageResponseObserverCoordinator::nativeImageResponseComplete(
ImageResponse const &imageResponse) const {
mutex_.lock();
imageData_ = imageResponse.getImage();
imageMetadata_ = imageResponse.getMetadata();
react_native_assert(status_ == ImageResponse::Status::Loading);
status_ = ImageResponse::Status::Completed;
auto observers = observers_;
mutex_.unlock();
for (auto observer : observers_) {
observer->didReceiveImage(imageResponse);
}
}
void ImageResponseObserverCoordinator::nativeImageResponseFailed() const {
mutex_.lock();
react_native_assert(status_ == ImageResponse::Status::Loading);
status_ = ImageResponse::Status::Failed;
auto observers = observers_;
mutex_.unlock();
for (auto observer : observers) {
observer->didReceiveFailure();
}
}
} // namespace react
} // namespace facebook