4#ifndef QOHOSPLUGINCORE_H
5#define QOHOSPLUGINCORE_H
7#include <QtCore/private/qcore_ohos_p.h>
8#include <QtCore/private/qnapi_p.h>
9#include <QtCore/private/qohoscommon_p.h>
10#include <QtCore/qobject.h>
19#ifndef QT_NO_EXCEPTIONS
35template<
typename A,
typename B,
typename =
void>
38template<
typename A,
typename B>
42template<
typename A,
typename B>
60 std::is_copy_constructible<T>::value &&
std::is_copy_assignable<T>::value,
61 "Only copyable types are supported");
66 template<
typename U, std::enable_if_t<std::is_same_v<U, T>,
int> = 0>
74 template<
typename U, std::enable_if_t<std::is_same_v<U, T>,
int> = 0>
87 template<
typename... Args>
91 template<
typename Func>
97 template<
typename Func>
102 const T &storedValueRef()
const;
103 template<
typename... InitArgs>
104 void initializeStoredValue(InitArgs &&...initArgs);
106 std::aligned_storage_t<
sizeof(T),
alignof(T)> m_rawStoredValue;
107 bool m_hasValue =
false;
110template<
typename T,
typename U>
114template<
typename T,
typename U>
118template<
typename T,
typename U>
122template<
typename T,
typename U>
126template<
typename T,
typename U>
130template<
typename T,
typename U>
169 virtual void setQWindow(Napi::Env env, QObjectThreadSafeRef qwindow) = 0;
203 QNapi::Object baseQAbility, QObjectThreadSafeRef qwindow,
204 QNapi::Object optStartOptions,
208 QNapi::Object baseQAbility,
const std::string &processId, QNapi::Object want,
209 QNapi::Object optStartOptions) = 0;
212 QNapi::Object baseQAbility,
const std::string &processId, QNapi::Object want,
213 QNapi::Object optStartOptions,
std::function<
void(
JsState &)> continueFunc) = 0;
247 std::shared_ptr<
QAbilityPeer> baseQAbilityPeer, QObjectThreadSafeRef qwindow,
248 QNapi::Object optStartOptions,
252 const std::string &processId, QNapi::Object requestWant,
253 QNapi::Object optStartOptions = {}) = 0;
256 const std::string &processId, QNapi::Object requestWant,
257 QNapi::Object optStartOptions,
std::function<
void(
JsState &)> continueFunc) = 0;
259 virtual void addNewWantConsumer(QOhosConsumer<JsState &, QNapi::Object, QNapi::Object> wantConsumer) = 0;
276 const std::type_info &objectTypeInfo, QOhosSupplier<std::shared_ptr<
void>> objectFactory) = 0;
301 std::function<
void(
JsState &, QNapi::Object, QOhosConsumer<JsState &, QOhosAbilityOnContinueResult>)> requestsHandler) = 0;
307 static const nullptr_t typeIdObject;
343 std::function<
void(
JsState &,
std::function<
void()>)> &&task);
350template<
typename Func>
374 std::function<
void(
std::function<
void()>)> &&task,
375 std::chrono::nanoseconds timeout);
380 auto *objectPtr =
reinterpret_cast<T *>(
381 getAttachedObjectWithLazyCreate(
typeid(T), &
std::make_shared<T>));
388 return getJsSymbolForType(
typeid(T));
391template<
typename Func>
394 return QOhosJsThreadGateway::eval(
395 [&func](QOhosJsState &jsState) {
396 return func(
static_cast<JsState &>(jsState));
403 return QOhosJsThreadGateway::evalWithConsumer<T>(
404 [evalFunc = std::move(evalFunc)](QOhosJsState &jsState, std::function<
void(T)> consumer) {
405 evalFunc(
static_cast<JsState &>(jsState), std::move(consumer));
412 static constexpr const char *
fullTypeName =
"@ohos.app.ability.AbilityConstant.OnContinueResult";
425 initializeStoredValue(value);
436 if (other.m_hasValue)
437 initializeStoredValue(other.storedValueRef());
444 if (other.has_value())
445 initializeStoredValue(*other);
454 if (other.m_hasValue) {
456 storedValueRef() = other.storedValueRef();
458 initializeStoredValue(other.storedValueRef());
484 if (other.has_value()) {
486 storedValueRef() = *other;
488 initializeStoredValue(*other);
506 storedValueRef().~T();
513 return *
reinterpret_cast<T *>(&m_rawStoredValue);
519 return *
reinterpret_cast<
const T *>(&m_rawStoredValue);
523template<
typename... InitArgs>
524void QOhosOptional<T>::initializeStoredValue(InitArgs &&...initArgs)
526 new (&m_rawStoredValue) T(std::forward<InitArgs...>(initArgs...));
539 return hasValue() ? storedValueRef() : fallback;
546#ifndef QT_NO_EXCEPTIONS
547 throw std::runtime_error(
"Can't access value inside empty QOhosOptional<>");
549 qFatal(
"Can't access value inside empty QOhosOptional<>");
554 return storedValueRef();
561#ifndef QT_NO_EXCEPTIONS
562 throw std::runtime_error(
"Can't access value inside empty QOhosOptional<>");
564 qFatal(
"Can't access value inside empty QOhosOptional<>");
569 return storedValueRef();
573template<
typename... Args>
577 initializeStoredValue(
std::forward<Args...>(args)...);
578 return storedValueRef();
581template<
typename T,
typename U>
585 return (lhs.hasValue() && rhs.hasValue())
586 ? lhs.value() == rhs.value()
587 : (!lhs.hasValue() && !rhs.hasValue());
590template<
typename T,
typename U>
594 return !(lhs == rhs);
597template<
typename T,
typename U>
601 return lhs.hasValue() && lhs.value() == rhs;
604template<
typename T,
typename U>
608 return !(lhs == rhs);
611template<
typename T,
typename U>
615 return rhs.hasValue() && lhs == rhs.value();
618template<
typename T,
typename U>
622 return !(lhs == rhs);
626template<
typename Func>
628 qohosplugincore_h_detail::isQOhosOptional<QOhosInvokeResult<Func, T>>,
629 QOhosInvokeResult<Func, T>>
630QOhosOptional<T>::andThen(Func &&func)
const
632 return hasValue() ? func(value()) : QOhosInvokeResult<Func, T>();
636template<
typename Func>
639 using TransformedT = QOhosInvokeResult<Func, T>;
641 ? QOhosOptional<TransformedT>(func(value()))
642 : QOhosOptional<TransformedT>();
JsWindowRef(JsWindowRef &&)=delete
JsWindowRef(const JsWindowRef &)=delete
JsWindowRef & operator=(JsWindowRef &&)=delete
JsWindowRef(JsWindowId windowId, QNapi::Object jsWindow)
Result call(const std::string &methodName, const std::vector< QNapi::ValueWrapper > &args={}) const
bool isWindowShown() const
JsWindowRef & operator=(const JsWindowRef &)=delete
QOhosOptional(const std::optional< U > &other)
T valueOr(const T &fallback) const
QOhosOptional< T > & operator=(const std::optional< U > &other)
QOhosOptional(const QOhosOptional< void > &empty)
QOhosOptional< T > & operator=(const T &value)
std::enable_if_t< qohosplugincore_h_detail::isQOhosOptional< QOhosInvokeResult< Func, T > >, QOhosInvokeResult< Func, T > > andThen(Func &&func) const
QOhosOptional< T > & operator=(const QOhosOptional< void > &empty)
QOhosOptional(const T &value)
T & emplace(Args &&...args)
QOhosOptional< T > & operator=(const QOhosOptional< T > &other)
QOhosOptional< QOhosInvokeResult< Func, T > > transform(Func &&func) const
QOhosOptional(const QOhosOptional< T > &other)
virtual void startQAbilityInstance(QNapi::Object baseQAbility, QObjectThreadSafeRef qwindow, QNapi::Object optStartOptions, std::function< void(JsState &, std::shared_ptr< QAbilityPeer >)> startupNotifyFunc)=0
virtual void tagWidgetOrWindowAsFloatWindow(QObject *widgetOrWindow, bool floatWindowEnabled)=0
virtual void startAppProcess(QNapi::Object baseQAbility, const std::string &processId, QNapi::Object want, QNapi::Object optStartOptions)=0
virtual void startAppProcess(QNapi::Object baseQAbility, const std::string &processId, QNapi::Object want, QNapi::Object optStartOptions, std::function< void(JsState &)> continueFunc)=0
virtual void startNoUiChildProcess(JsState &jsState, const std::string &libraryName, const std::vector< std::string > &args)=0
JsState & jsState() const
JsState & operator=(const JsState &)=delete
virtual void addNewWantConsumer(QOhosConsumer< JsState &, QNapi::Object, QNapi::Object > wantConsumer)=0
virtual QtRunMode qtRunMode()=0
JsState(const JsState &)=delete
virtual std::shared_ptr< QAbilityPeer > tryGetQAbilityPeerByInstanceId(const std::string &instanceId)=0
virtual void * getAttachedObjectWithLazyCreate(const std::type_info &objectTypeInfo, QOhosSupplier< std::shared_ptr< void > > objectFactory)=0
virtual void startAppProcess(const std::string &processId, QNapi::Object requestWant, QNapi::Object optStartOptions, std::function< void(JsState &)> continueFunc)=0
virtual void startNoUiChildProcess(const std::string &libraryName, const std::vector< std::string > &args)=0
virtual std::shared_ptr< QAbilityPeer > tryGetQAbilityPeerByQWindow(QObjectThreadSafeRef qwindow)=0
virtual void visitEachQAbilityPeer(const std::function< void(std::shared_ptr< QAbilityPeer >)> &visitor)=0
QNapi::Symbol getJsSymbolForType()
virtual std::shared_ptr< QAbilityPeer > defaultQAbilityPeer()=0
virtual std::shared_ptr< QAbilityPeer > tryGetQAbilityPeerByInstance(QNapi::Object qAbility)=0
virtual QOhosOptional< QNapi::Object > optAppLaunchParam()=0
virtual QNapi::Object appLaunchWant()=0
std::enable_if_t< std::is_default_constructible< T >::value, T > & getAttachedObjectWithLazyCreate()
virtual QNapi::Symbol getJsSymbolForType(const std::type_info &typeInfo)=0
virtual void startNewQAbilityInstance(std::shared_ptr< QAbilityPeer > baseQAbilityPeer, QObjectThreadSafeRef qwindow, QNapi::Object optStartOptions, std::function< void(JsState &, std::shared_ptr< QAbilityPeer >)> startupNotifyFunc)=0
virtual void startAppProcess(const std::string &processId, QNapi::Object requestWant, QNapi::Object optStartOptions={})=0
JsWindowsTracker()=delete
static void tagWindowAsClosing(QNapi::Object jsWindow, const char *logContext)
static bool isWindowClosing(QNapi::Object jsWindow)
virtual QAbilityInfo readAbilityInfo(const QNapi::Object &ability) const =0
virtual ~QAbilityEngine()
virtual QOhosOptional< QNapi::Promise > qWindowDestroyPromise()=0
virtual std::string instanceId()=0
virtual QObjectThreadSafeRef qWindowRef()=0
virtual QNapi::Object launchWant()=0
virtual bool isTerminating()=0
virtual void setQWindow(Napi::Env env, QObjectThreadSafeRef qwindow)=0
virtual void * tryCastWithTypeIdObject(const void *matchTypeIdObject)=0
virtual std::shared_ptr< std::atomic_bool > destroyAllowedFlag()=0
virtual QNapi::Object qAbility()=0
virtual QNapi::Object uiContext()=0
virtual void setOnContinueRequestsHandler(std::function< void(JsState &, QNapi::Object, QOhosConsumer< JsState &, QOhosAbilityOnContinueResult >)> requestsHandler)=0
virtual QNapi::Object launchParam()=0
virtual QNapi::Object windowStage()=0
void * tryCastWithTypeIdObject(const void *matchTypeIdObject) final
static std::shared_ptr< QUiAbilityPeer > tryCastFromQAbilityPeerOrNull(std::shared_ptr< QAbilityPeer > qAbilityPeer)
~QUiAbilityPeer() override
virtual QNapi::Object window()=0
QOhosOptional< WindowProperties > tryGetWindowProperties(JsWindowId jsWindowId)
Combined button and popup list for selecting options.
void invokeInJsThread(std::function< void(JsState &)> task)
void dispatchNewWant(QNapi::Object want, QNapi::Object launchParam)
void removeMatchingJsQAbilityPeer(QNapi::Object qAbility)
T evalInJsThreadWithConsumer(std::function< void(QtOhos::JsState &, std::function< void(T)>)> evalFunc)
void initJsThreadState(napi_env env, std::map< std::string, QNapi::Reference< QNapi::Function > > &&jsModulesFactories, std::shared_ptr< AppFunctions > appFunctions, QtRunMode qtRunMode)
Q_REQUIRED_RESULT bool tryInvokeInQtThreadAndTryWaitForContinue(std::function< void(std::function< void()>)> &&task, std::chrono::nanoseconds timeout)
auto evalInJsThread(Func &&func) -> decltype(func(std::declval< JsState & >()))
QOhosAbilityOnContinueResult
void runInJsThreadAndWait(const std::function< void(JsState &)> &task)
void invokeInJsThreadAndWaitForContinue(std::function< void(JsState &, std::function< void()>)> &&task)
void addJsQAbilityPeer(std::shared_ptr< QAbilityPeer > qAbilityPeer)
constexpr bool isQOhosOptional
constexpr bool hasEqualityComparator
Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QOhosDisplayInfo::DisplaySourceMode))
Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QOhosDisplayInfo::JsDisplayOrientation))
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator!=(const QOhosOptional< T > &lhs, const U &rhs)
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator==(const QOhosOptional< T > &lhs, const QOhosOptional< U > &rhs)
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator!=(const T &lhs, const QOhosOptional< U > &rhs)
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator==(const T &lhs, const QOhosOptional< U > &rhs)
QOhosOptional< void > makeEmptyQOhosOptional()
QOhosOptional< T > makeQOhosOptional(const T &value)
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator!=(const QOhosOptional< T > &lhs, const QOhosOptional< U > &rhs)
std::enable_if_t< qohosplugincore_h_detail::hasEqualityComparator< T, U >, bool > operator==(const QOhosOptional< T > &lhs, const U &rhs)
QOhosOptional< QOhosDisplayInfo::JsDisplayId > displayId
QSizeF physicalSize() const
QOhosOptional< QPoint > topLeftOffsetPixels
QRect displayGeometryPixels() const
static QOhosDisplayInfo makeFromOhosDisplayObject(QtOhos::JsState &jsState, QNapi::Object displayObject)
QOhosOptional< JsDisplayOrientation > orientation
QOhosOptional< DisplaySourceMode > sourceMode