Fix for windows
This commit is contained in:
parent
c1ed8ee1c7
commit
5d892ba19d
@ -27,6 +27,7 @@ if (WIN32)
|
|||||||
set(CMAKE_PREFIX_PATH "C:/Qt/6.9.0/msvc2022_64")
|
set(CMAKE_PREFIX_PATH "C:/Qt/6.9.0/msvc2022_64")
|
||||||
list(APPEND CMAKE_PREFIX_PATH "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows")
|
list(APPEND CMAKE_PREFIX_PATH "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows")
|
||||||
set(Tesseract_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows/share/tesseract")
|
set(Tesseract_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows/share/tesseract")
|
||||||
|
set(VCPKG_BIN_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows/bin")
|
||||||
elseif (VCPKG_TARGET_TRIPLET MATCHES "arm64"
|
elseif (VCPKG_TARGET_TRIPLET MATCHES "arm64"
|
||||||
OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64"
|
OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64"
|
||||||
OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64"
|
OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64"
|
||||||
@ -35,11 +36,13 @@ if (WIN32)
|
|||||||
set(CMAKE_PREFIX_PATH "C:/Qt/6.9.0/msvc2022_arm64")
|
set(CMAKE_PREFIX_PATH "C:/Qt/6.9.0/msvc2022_arm64")
|
||||||
list(APPEND CMAKE_PREFIX_PATH "C:/Users/User/.vcpkg-clion/vcpkg/installed/arm64-windows")
|
list(APPEND CMAKE_PREFIX_PATH "C:/Users/User/.vcpkg-clion/vcpkg/installed/arm64-windows")
|
||||||
set(Tesseract_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/arm64-windows/share/tesseract")
|
set(Tesseract_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/arm64-windows/share/tesseract")
|
||||||
|
set(VCPKG_BIN_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/arm64-windows/bin")
|
||||||
else ()
|
else ()
|
||||||
message(STATUS "Detected x64 target architecture (default)")
|
message(STATUS "Detected x64 target architecture (default)")
|
||||||
set(CMAKE_PREFIX_PATH "C:/Qt/6.9.0/msvc2022_64")
|
set(CMAKE_PREFIX_PATH "C:/Qt/6.9.0/msvc2022_64")
|
||||||
list(APPEND CMAKE_PREFIX_PATH "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows")
|
list(APPEND CMAKE_PREFIX_PATH "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows")
|
||||||
set(Tesseract_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows/share/tesseract")
|
set(Tesseract_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows/share/tesseract")
|
||||||
|
set(VCPKG_BIN_DIR "C:/Users/User/.vcpkg-clion/vcpkg/installed/x64-windows/bin")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
find_package(Tesseract CONFIG REQUIRED)
|
find_package(Tesseract CONFIG REQUIRED)
|
||||||
@ -164,6 +167,7 @@ if (WIN32)
|
|||||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/eng.traineddata" DESTINATION "${CMAKE_BINARY_DIR}")
|
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/eng.traineddata" DESTINATION "${CMAKE_BINARY_DIR}")
|
||||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/config.ini" DESTINATION "${CMAKE_BINARY_DIR}")
|
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/config.ini" DESTINATION "${CMAKE_BINARY_DIR}")
|
||||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/no_devices.png" DESTINATION "${CMAKE_BINARY_DIR}")
|
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/no_devices.png" DESTINATION "${CMAKE_BINARY_DIR}")
|
||||||
|
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/assets/ADBKeyboard.apk" DESTINATION "${CMAKE_BINARY_DIR}/assets")
|
||||||
# adb копируется в post-build чтобы не падать при configure если adb.exe занят
|
# adb копируется в post-build чтобы не падать при configure если adb.exe занят
|
||||||
file(GLOB _adb_files "${CMAKE_CURRENT_SOURCE_DIR}/tools/adb/windows/*")
|
file(GLOB _adb_files "${CMAKE_CURRENT_SOURCE_DIR}/tools/adb/windows/*")
|
||||||
foreach(_adb_file ${_adb_files})
|
foreach(_adb_file ${_adb_files})
|
||||||
@ -204,14 +208,40 @@ if (WIN32)
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Copy OpenSSL DLLs required for HTTPS (Qt SSL backend)
|
# Copy OpenSSL DLLs required for HTTPS (Qt SSL backend)
|
||||||
file(GLOB _openssl_dlls "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/libssl*.dll"
|
file(GLOB _openssl_dlls "${VCPKG_BIN_DIR}/libssl*.dll"
|
||||||
"${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/libcrypto*.dll")
|
"${VCPKG_BIN_DIR}/libcrypto*.dll")
|
||||||
foreach(_dll ${_openssl_dlls})
|
foreach(_dll ${_openssl_dlls})
|
||||||
add_custom_command(TARGET ARC POST_BUILD
|
add_custom_command(TARGET ARC POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_dll}" "$<TARGET_FILE_DIR:ARC>"
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_dll}" "$<TARGET_FILE_DIR:ARC>"
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
# Copy Tesseract, Leptonica, and their transitive dependency DLLs
|
||||||
|
file(GLOB _tesseract_dlls "${VCPKG_BIN_DIR}/tesseract*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/leptonica*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/libpng*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/jpeg*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/tiff*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/zlib*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/gif*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/libwebp*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/libsharpyuv*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/openjp2*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/archive*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/libcurl*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/lz4*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/zstd*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/liblzma*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/bz2*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/iconv*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/charset*.dll"
|
||||||
|
"${VCPKG_BIN_DIR}/libxml2*.dll")
|
||||||
|
foreach(_dll ${_tesseract_dlls})
|
||||||
|
add_custom_command(TARGET ARC POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_dll}" "$<TARGET_FILE_DIR:ARC>"
|
||||||
|
)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
target_link_libraries(ARC
|
target_link_libraries(ARC
|
||||||
Qt6::Widgets
|
Qt6::Widgets
|
||||||
@ -229,6 +259,7 @@ elseif (APPLE)
|
|||||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/eng.traineddata" DESTINATION "${CMAKE_BINARY_DIR}")
|
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/eng.traineddata" DESTINATION "${CMAKE_BINARY_DIR}")
|
||||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/config.ini" DESTINATION "${CMAKE_BINARY_DIR}")
|
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/config.ini" DESTINATION "${CMAKE_BINARY_DIR}")
|
||||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/no_devices.png" DESTINATION "${CMAKE_BINARY_DIR}")
|
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/no_devices.png" DESTINATION "${CMAKE_BINARY_DIR}")
|
||||||
|
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/assets/ADBKeyboard.apk" DESTINATION "${CMAKE_BINARY_DIR}/assets")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
target_include_directories(ARC PRIVATE
|
target_include_directories(ARC PRIVATE
|
||||||
|
|||||||
@ -322,6 +322,21 @@ bool AdbUtils::makeTap(const QString &deviceId, const int x, const int y) {
|
|||||||
|
|
||||||
bool AdbUtils::enableAdbIMEKeyboard(const QString &deviceId) {
|
bool AdbUtils::enableAdbIMEKeyboard(const QString &deviceId) {
|
||||||
const QString adb = adbPath();
|
const QString adb = adbPath();
|
||||||
|
|
||||||
|
// Проверяем, установлен ли ADB Keyboard
|
||||||
|
QString installedList;
|
||||||
|
startProcess(adb, {"-s", deviceId, "shell", "pm", "list", "packages", "com.android.adbkeyboard"}, &installedList);
|
||||||
|
if (!installedList.contains("com.android.adbkeyboard")) {
|
||||||
|
const QString apkPath = QCoreApplication::applicationDirPath() + "/assets/ADBKeyboard.apk";
|
||||||
|
qDebug() << "[AdbUtils] ADB Keyboard not installed, installing from:" << apkPath;
|
||||||
|
QString installErr;
|
||||||
|
if (!startProcess(adb, {"-s", deviceId, "install", apkPath}, nullptr, &installErr)) {
|
||||||
|
qWarning() << "[AdbUtils] Failed to install ADB Keyboard:" << installErr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
qDebug() << "[AdbUtils] ADB Keyboard installed successfully";
|
||||||
|
}
|
||||||
|
|
||||||
struct Step { QStringList args; };
|
struct Step { QStringList args; };
|
||||||
Step steps[] = {
|
Step steps[] = {
|
||||||
{{"-s", deviceId, "shell", "ime", "enable", "com.android.adbkeyboard/.AdbIME"}},
|
{{"-s", deviceId, "shell", "ime", "enable", "com.android.adbkeyboard/.AdbIME"}},
|
||||||
@ -373,18 +388,22 @@ bool AdbUtils::disableAdbIMEKeyboard(const QString &deviceId) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool AdbUtils::makeSwipe(const QString &deviceId, const int x1, const int y1, const int x2, const int y2) {
|
bool AdbUtils::makeSwipe(const QString &deviceId, const int x1, const int y1, const int x2, const int y2) {
|
||||||
|
return makeSwipe(deviceId, x1, y1, x2, y2, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AdbUtils::makeSwipe(const QString &deviceId, const int x1, const int y1, const int x2, const int y2, int durationMs) {
|
||||||
|
QStringList args = {
|
||||||
|
"-s", deviceId,
|
||||||
|
"shell", "input",
|
||||||
|
"swipe",
|
||||||
|
QString::number(x1), QString::number(y1),
|
||||||
|
QString::number(x2), QString::number(y2)
|
||||||
|
};
|
||||||
|
if (durationMs > 0) args << QString::number(durationMs);
|
||||||
|
|
||||||
QProcess process;
|
QProcess process;
|
||||||
process.setWorkingDirectory(adbDir());
|
process.setWorkingDirectory(adbDir());
|
||||||
process.start(
|
process.start(adbPath(), args);
|
||||||
adbPath(),
|
|
||||||
{
|
|
||||||
"-s", deviceId,
|
|
||||||
"shell", "input",
|
|
||||||
"swipe",
|
|
||||||
QString::number(x1), QString::number(y1),
|
|
||||||
QString::number(x2), QString::number(y2)
|
|
||||||
}
|
|
||||||
);
|
|
||||||
if (!process.waitForStarted(5000)) {
|
if (!process.waitForStarted(5000)) {
|
||||||
qWarning() << "[AdbUtils] Failed to start adb swipe:" << process.errorString();
|
qWarning() << "[AdbUtils] Failed to start adb swipe:" << process.errorString();
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@ -37,6 +37,7 @@ public:
|
|||||||
static bool disableAdbIMEKeyboard(const QString &deviceId);
|
static bool disableAdbIMEKeyboard(const QString &deviceId);
|
||||||
|
|
||||||
static bool makeSwipe(const QString &deviceId, int x1, int y1, int x2, int y2);
|
static bool makeSwipe(const QString &deviceId, int x1, int y1, int x2, int y2);
|
||||||
|
static bool makeSwipe(const QString &deviceId, int x1, int y1, int x2, int y2, int durationMs);
|
||||||
|
|
||||||
static bool inputText(const QString &deviceId, const QString &text);
|
static bool inputText(const QString &deviceId, const QString &text);
|
||||||
|
|
||||||
|
|||||||
@ -43,7 +43,7 @@ void GetCardInfoScript::doStart() {
|
|||||||
qDebug() << "[Black::GetCardInfo] Not on home screen, restarting app...";
|
qDebug() << "[Black::GetCardInfo] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + m_deviceId + " " + m_appCode;
|
m_error = "Cannot reach home screen: " + device.name + " (" + m_deviceId + ") " + m_appCode;
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
|
|||||||
@ -40,11 +40,9 @@ void GetLastTransactionsScript::doStart() {
|
|||||||
qDebug() << "[Black::GetLastTransactions] Not on home screen, restarting app...";
|
qDebug() << "[Black::GetLastTransactions] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + m_deviceId;
|
m_error = "Cannot reach home screen: " + device.name + " (" + m_deviceId + ")";
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AppLogger::log("black/GetLastTransactions", m_deviceId, m_error,
|
AppLogger::log("black/GetLastTransactions", m_deviceId, m_error, {}, "FETCH_TRANSACTIONS");
|
||||||
AdbUtils::captureScreenshotBytes(m_deviceId),
|
|
||||||
"FETCH_TRANSACTIONS");
|
|
||||||
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -42,7 +42,7 @@ void GetProfileInfoScript::doStart() {
|
|||||||
qDebug() << "[Black::GetProfileInfo] Not on home screen, restarting app...";
|
qDebug() << "[Black::GetProfileInfo] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + m_deviceId + " " + m_appCode;
|
m_error = "Cannot reach home screen: " + device.name + " (" + m_deviceId + ") " + m_appCode;
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
|
|||||||
@ -38,10 +38,9 @@ void LoginAndCheckAccountsScript::doStart() {
|
|||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cant open the home screen: " + m_deviceId + " " + m_appCode;
|
m_error = "Cant open the home screen: " + device.name + " (" + m_deviceId + ") " + m_appCode;
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AppLogger::log("black/LoginAndCheck", m_deviceId, m_error,
|
AppLogger::log("black/LoginAndCheck", m_deviceId, m_error, {}, "FETCH_PROFILE");
|
||||||
AdbUtils::captureScreenshotBytes(m_deviceId), "FETCH_PROFILE");
|
|
||||||
BankProfileDAO::updateComment(app.id,
|
BankProfileDAO::updateComment(app.id,
|
||||||
"Не прошла проверка " + QDateTime::currentDateTime().toString("dd.MM.yyyy HH:mm:ss"));
|
"Не прошла проверка " + QDateTime::currentDateTime().toString("dd.MM.yyyy HH:mm:ss"));
|
||||||
|
|
||||||
|
|||||||
@ -52,11 +52,9 @@ void PayByCardScript::makePayment(
|
|||||||
qDebug() << "[Black::PayByCard] Not on home screen, restarting app...";
|
qDebug() << "[Black::PayByCard] Not on home screen, restarting app...";
|
||||||
const BankProfileInfo app = BankProfileDAO::getApplication(m_account.deviceId, m_account.appCode);
|
const BankProfileInfo app = BankProfileDAO::getApplication(m_account.deviceId, m_account.appCode);
|
||||||
if (!runAppAndGoToHomeScreen(deviceId, app.package, pinCode, width, height)) {
|
if (!runAppAndGoToHomeScreen(deviceId, app.package, pinCode, width, height)) {
|
||||||
m_error = "Cannot reach home screen: " + deviceId;
|
m_error = "Cannot reach home screen: " + DeviceDAO::getDeviceById(m_account.deviceId).name + " (" + deviceId + ")";
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AppLogger::log("black/PayByCard", deviceId, m_error,
|
AppLogger::log("black/PayByCard", deviceId, m_error, {}, "CREATE_TRANSACTION");
|
||||||
AdbUtils::captureScreenshotBytes(deviceId),
|
|
||||||
"CREATE_TRANSACTION");
|
|
||||||
AdbUtils::tryToKillApplication(deviceId, app.package);
|
AdbUtils::tryToKillApplication(deviceId, app.package);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,7 +40,7 @@ void GetCardInfoScript::doStart() {
|
|||||||
qDebug() << "[Dushanbe::GetCardInfo] Not on home screen, restarting app...";
|
qDebug() << "[Dushanbe::GetCardInfo] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + m_deviceId + " " + m_appCode;
|
m_error = "Cannot reach home screen: " + device.name + " (" + m_deviceId + ") " + m_appCode;
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
|
|||||||
@ -258,11 +258,9 @@ void GetLastTransactionsScript::doStart() {
|
|||||||
qDebug() << "[Dushanbe::GetLastTransactions] Not on home screen, restarting app...";
|
qDebug() << "[Dushanbe::GetLastTransactions] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + m_deviceId;
|
m_error = "Cannot reach home screen: " + device.name + " (" + m_deviceId + ")";
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AppLogger::log("dushanbe/GetLastTransactions", m_deviceId, m_error,
|
AppLogger::log("dushanbe/GetLastTransactions", m_deviceId, m_error, {}, "FETCH_TRANSACTIONS");
|
||||||
AdbUtils::captureScreenshotBytes(m_deviceId),
|
|
||||||
"FETCH_TRANSACTIONS");
|
|
||||||
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -41,7 +41,7 @@ void GetProfileInfoScript::doStart() {
|
|||||||
qDebug() << "[Dushanbe::GetProfileInfo] Not on home screen, restarting app...";
|
qDebug() << "[Dushanbe::GetProfileInfo] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + m_deviceId + " " + m_appCode;
|
m_error = "Cannot reach home screen: " + device.name + " (" + m_deviceId + ") " + m_appCode;
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
|
|||||||
@ -37,10 +37,9 @@ void LoginAndCheckAccountsScript::doStart() {
|
|||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cant open the home screen: " + m_deviceId + " " + m_appCode;
|
m_error = "Cant open the home screen: " + device.name + " (" + m_deviceId + ") " + m_appCode;
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AppLogger::log("dushanbe/LoginAndCheck", m_deviceId, m_error,
|
AppLogger::log("dushanbe/LoginAndCheck", m_deviceId, m_error, {}, "FETCH_PROFILE");
|
||||||
AdbUtils::captureScreenshotBytes(m_deviceId), "FETCH_PROFILE");
|
|
||||||
BankProfileDAO::updateComment(app.id,
|
BankProfileDAO::updateComment(app.id,
|
||||||
"Не прошла проверка " + QDateTime::currentDateTime().toString("dd.MM.yyyy HH:mm:ss"));
|
"Не прошла проверка " + QDateTime::currentDateTime().toString("dd.MM.yyyy HH:mm:ss"));
|
||||||
|
|
||||||
|
|||||||
@ -127,11 +127,9 @@ void PayByCardScript::doStart() {
|
|||||||
qDebug() << "[Dushanbe::PayByCard] Not on home screen, restarting app...";
|
qDebug() << "[Dushanbe::PayByCard] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(device.adbSerial, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(device.adbSerial, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + device.id;
|
m_error = "Cannot reach home screen: " + device.name + " (" + device.id + ")";
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AppLogger::log("dushanbe/PayByCard", device.id, m_error,
|
AppLogger::log("dushanbe/PayByCard", device.id, m_error, {}, "CREATE_TRANSACTION");
|
||||||
AdbUtils::captureScreenshotBytes(device.adbSerial),
|
|
||||||
"CREATE_TRANSACTION");
|
|
||||||
AdbUtils::tryToKillApplication(device.adbSerial, app.package);
|
AdbUtils::tryToKillApplication(device.adbSerial, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -124,11 +124,9 @@ void PayByPhoneScript::doStart() {
|
|||||||
qDebug() << "[Dushanbe::PayByPhone] Not on home screen, restarting app...";
|
qDebug() << "[Dushanbe::PayByPhone] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(device.adbSerial, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(device.adbSerial, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + device.id;
|
m_error = "Cannot reach home screen: " + device.name + " (" + device.id + ")";
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AppLogger::log("dushanbe/PayByPhone", device.id, m_error,
|
AppLogger::log("dushanbe/PayByPhone", device.id, m_error, {}, "CREATE_TRANSACTION");
|
||||||
AdbUtils::captureScreenshotBytes(device.adbSerial),
|
|
||||||
"CREATE_TRANSACTION");
|
|
||||||
AdbUtils::tryToKillApplication(device.adbSerial, app.package);
|
AdbUtils::tryToKillApplication(device.adbSerial, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -110,7 +110,7 @@ bool CommonScript::runAppAndGoToHomeScreen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Проверяем на баннер Google Play "Доступно обновление"
|
// Проверяем на баннер Google Play "Доступно обновление"
|
||||||
if (Node gpNode = xmlScreenParser.tryToFindGooglePlayBanner(); !gpNode.isEmpty()) {
|
if (Node gpNode = xmlScreenParser.tryToFindGooglePlayBanner(width, height); !gpNode.isEmpty()) {
|
||||||
qDebug() << "[runAppAndGoToHomeScreen] Google Play update banner detected, closing...";
|
qDebug() << "[runAppAndGoToHomeScreen] Google Play update banner detected, closing...";
|
||||||
AdbUtils::makeTap(deviceId, gpNode.x(), gpNode.y());
|
AdbUtils::makeTap(deviceId, gpNode.x(), gpNode.y());
|
||||||
QThread::msleep(1500);
|
QThread::msleep(1500);
|
||||||
@ -359,6 +359,10 @@ void CommonScript::createBankProfileIfNeeded(const QString &deviceId, const QStr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CommonScript::isAppRunning(const QString &deviceId, const QString &packageName) {
|
||||||
|
return !AdbUtils::tryToGetRunningAppPid(deviceId, packageName).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
void CommonScript::stop() {
|
void CommonScript::stop() {
|
||||||
m_running = false;
|
m_running = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -60,15 +60,22 @@ protected:
|
|||||||
// Создаёт bank_profile на сервере если ещё не создан
|
// Создаёт bank_profile на сервере если ещё не создан
|
||||||
void createBankProfileIfNeeded(const QString &deviceId, const QString &appCode);
|
void createBankProfileIfNeeded(const QString &deviceId, const QString &appCode);
|
||||||
|
|
||||||
|
// Проверяет что приложение ещё запущено на устройстве
|
||||||
|
static bool isAppRunning(const QString &deviceId, const QString &packageName);
|
||||||
|
|
||||||
bool m_running = true;
|
bool m_running = true;
|
||||||
ScreenXmlParser xmlScreenParser;
|
ScreenXmlParser xmlScreenParser;
|
||||||
int m_counter = 0;
|
int m_counter = 0;
|
||||||
|
|
||||||
|
QByteArray m_resultScreenshot;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void finished();
|
void finished();
|
||||||
|
|
||||||
void finishedWithResult(const QString &result);
|
void finishedWithResult(const QString &result);
|
||||||
|
|
||||||
|
void screenshotReady(const QByteArray &screenshot);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
virtual void start() final;
|
virtual void start() final;
|
||||||
|
|
||||||
|
|||||||
@ -59,11 +59,8 @@ void GetCardInfoScript::doStart() {
|
|||||||
qDebug() << "[GetCardInfo] Not on home screen, restarting app...";
|
qDebug() << "[GetCardInfo] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + m_deviceId;
|
m_error = "Cannot reach home screen: " + device.name + " (" + m_deviceId + ")";
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AppLogger::log("ozon/GetCardInfo", m_deviceId, m_error,
|
|
||||||
AdbUtils::captureScreenshotBytes(m_deviceId),
|
|
||||||
"FETCH_PROFILE");
|
|
||||||
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
return;
|
return;
|
||||||
@ -115,11 +112,8 @@ void GetCardInfoScript::doStart() {
|
|||||||
qDebug() << "[GetCardInfo] Not on home screen before card search, restarting...";
|
qDebug() << "[GetCardInfo] Not on home screen before card search, restarting...";
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen before card search: " + m_deviceId;
|
m_error = "Cannot reach home screen before card search: " + device.name + " (" + m_deviceId + ")";
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AppLogger::log("ozon/GetCardInfo", m_deviceId, m_error,
|
|
||||||
AdbUtils::captureScreenshotBytes(m_deviceId),
|
|
||||||
"FETCH_PROFILE");
|
|
||||||
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -59,10 +59,11 @@ static QString extractTransactionId(const QString &ocrText) {
|
|||||||
// ID может быть на одной строке: "ID операции B606513042211200000120011700501"
|
// ID может быть на одной строке: "ID операции B606513042211200000120011700501"
|
||||||
// или с дефисами: "ID операции po-3140eb01-002c-5000-8000-033396b637e1"
|
// или с дефисами: "ID операции po-3140eb01-002c-5000-8000-033396b637e1"
|
||||||
// или разбит на 2 строки: "ID ... po-3140eb01-002c-5000-8000-033396b\n ... 637e1"
|
// или разбит на 2 строки: "ID ... po-3140eb01-002c-5000-8000-033396b\n ... 637e1"
|
||||||
QRegularExpression reId(R"(ID\s+операции\s*=?\s*([A-Za-zА-Яа-яЁё0-9\-]+(?:\s+[A-Za-zА-Яа-яЁё0-9\-]+)?))");
|
QRegularExpression reId(R"(ID\s+операции\s*=?\s*([A-Za-z0-9\-]+(?:[^\S\n]+[A-Za-z0-9\-]+)?))");
|
||||||
if (auto m = reId.match(ocrText); m.hasMatch()) {
|
if (auto m = reId.match(ocrText); m.hasMatch()) {
|
||||||
QString id = m.captured(1);
|
QString id = m.captured(1);
|
||||||
id.remove(QRegularExpression(R"(\s+)"));
|
id.remove(' ');
|
||||||
|
id.remove(QChar(0x00A0));
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,7 +120,7 @@ void GetLastTransactionsScript::doStart() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Выбор режима: поиск конкретной транзакции или сканирование последних
|
// Выбор режима: поиск конкретной транзакции или сканирование последних
|
||||||
if (m_searchAmount > 0) {
|
if (qAbs(m_searchAmount) > 0.01) {
|
||||||
searchTransaction(device, accountId);
|
searchTransaction(device, accountId);
|
||||||
} else {
|
} else {
|
||||||
scanRecentTransactions(device, accountId);
|
scanRecentTransactions(device, accountId);
|
||||||
@ -148,11 +149,11 @@ bool GetLastTransactionsScript::navigateToTransactionList(const DeviceInfo &devi
|
|||||||
if (!xmlScreenParser.isHomeScreen()) {
|
if (!xmlScreenParser.isHomeScreen()) {
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + m_deviceId;
|
m_error = "Cannot reach home screen: " + device.name + " (" + m_deviceId + ")";
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AppLogger::log("ozon/GetLastTransactions", m_deviceId, m_error,
|
m_resultScreenshot = AdbUtils::captureScreenshotBytes(m_deviceId);
|
||||||
AdbUtils::captureScreenshotBytes(m_deviceId),
|
if (!m_resultScreenshot.isEmpty()) emit screenshotReady(m_resultScreenshot);
|
||||||
"FETCH_TRANSACTIONS");
|
AppLogger::log("ozon/GetLastTransactions", m_deviceId, m_error, {}, "FETCH_TRANSACTIONS");
|
||||||
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -164,14 +165,14 @@ bool GetLastTransactionsScript::navigateToTransactionList(const DeviceInfo &devi
|
|||||||
QThread::msleep(500);
|
QThread::msleep(500);
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
|
||||||
// Скроллим до "Все" и тапаем
|
// Скроллим до "Все" и тапаем (быстрый fling чтобы пропустить баннеры)
|
||||||
const int navBarTop = device.screenHeight - (device.screenHeight / 10);
|
const int navBarTop = device.screenHeight - (device.screenHeight / 10);
|
||||||
Node allBtn;
|
Node allBtn;
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
if (QThread::currentThread()->isInterruptionRequested()) return false;
|
||||||
const int x = device.screenWidth / 2;
|
const int x = device.screenWidth / 2;
|
||||||
const int offset = device.screenHeight / 4;
|
AdbUtils::makeSwipe(m_deviceId, x, device.screenHeight - 200, x, 200, 100);
|
||||||
AdbUtils::makeSwipe(m_deviceId, x, device.screenHeight - offset, x, offset);
|
QThread::msleep(1500);
|
||||||
QThread::msleep(1000);
|
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
|
||||||
allBtn = xmlScreenParser.findButtonNode("Все", false);
|
allBtn = xmlScreenParser.findButtonNode("Все", false);
|
||||||
@ -190,6 +191,7 @@ bool GetLastTransactionsScript::navigateToTransactionList(const DeviceInfo &devi
|
|||||||
|
|
||||||
// Ждём экран "Операции"
|
// Ждём экран "Операции"
|
||||||
for (int attempt = 0; attempt < 10; ++attempt) {
|
for (int attempt = 0; attempt < 10; ++attempt) {
|
||||||
|
if (QThread::currentThread()->isInterruptionRequested()) return false;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
if (xmlScreenParser.isTransactionListScreen()) return true;
|
if (xmlScreenParser.isTransactionListScreen()) return true;
|
||||||
QThread::msleep(1500);
|
QThread::msleep(1500);
|
||||||
@ -202,33 +204,139 @@ bool GetLastTransactionsScript::navigateToTransactionList(const DeviceInfo &devi
|
|||||||
|
|
||||||
void GetLastTransactionsScript::searchTransaction(const DeviceInfo &device, int accountId) {
|
void GetLastTransactionsScript::searchTransaction(const DeviceInfo &device, int accountId) {
|
||||||
const QTimeZone msk("Europe/Moscow");
|
const QTimeZone msk("Europe/Moscow");
|
||||||
const int maxScrolls = 15;
|
const int maxScrolls = 30;
|
||||||
|
const int navBarTop = device.screenHeight - (device.screenHeight / 10);
|
||||||
|
|
||||||
|
// Целевая дата в МСК для поиска заголовка дня в списке
|
||||||
|
const QDateTime searchMsk = m_searchTime.toTimeZone(msk);
|
||||||
|
const QDate searchDate = searchMsk.date();
|
||||||
|
|
||||||
qDebug() << "[FetchTransactions] Searching: amount=" << m_searchAmount
|
qDebug() << "[FetchTransactions] Searching: amount=" << m_searchAmount
|
||||||
<< "time=" << m_searchTime.toString(Qt::ISODate);
|
<< "time=" << m_searchTime.toString(Qt::ISODate)
|
||||||
|
<< "date(MSK)=" << searchDate.toString("dd.MM.yyyy");
|
||||||
|
|
||||||
|
// ── Шаг 1: скроллим до нужной даты ──────────────────────────────
|
||||||
|
bool dateFound = false;
|
||||||
for (int scroll = 0; scroll < maxScrolls; ++scroll) {
|
for (int scroll = 0; scroll < maxScrolls; ++scroll) {
|
||||||
|
if (QThread::currentThread()->isInterruptionRequested()) {
|
||||||
|
m_error = "Interrupted";
|
||||||
|
return;
|
||||||
|
}
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
const QList<Node> txButtons = xmlScreenParser.findTransactionButtons(20);
|
|
||||||
|
|
||||||
for (const Node &btn : txButtons) {
|
// Ищем заголовки дат на экране (формат: "4 января, вс")
|
||||||
const TransactionInfo parsed = xmlScreenParser.parseTransactionButtonText(btn.text);
|
static const QMap<QString, int> monthMap = {
|
||||||
if (qAbs(qAbs(parsed.amount) - qAbs(m_searchAmount)) > 0.01) continue;
|
{"января", 1}, {"февраля", 2}, {"марта", 3}, {"апреля", 4},
|
||||||
|
{"мая", 5}, {"июня", 6}, {"июля", 7}, {"августа", 8},
|
||||||
|
{"сентября", 9}, {"октября", 10}, {"ноября", 11}, {"декабря", 12}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool hasOlderDate = false;
|
||||||
|
for (const Node &node : xmlScreenParser.getNodes()) {
|
||||||
|
if (node.className != "android.widget.TextView") continue;
|
||||||
|
const QString t = node.text.trimmed();
|
||||||
|
// Парсим "4 января, вс" → QDate
|
||||||
|
static const QRegularExpression dateRx(R"((\d{1,2})\s+(\S+),\s+\S+)");
|
||||||
|
const auto match = dateRx.match(t);
|
||||||
|
if (!match.hasMatch()) continue;
|
||||||
|
const int day = match.captured(1).toInt();
|
||||||
|
const int month = monthMap.value(match.captured(2), 0);
|
||||||
|
if (month == 0) continue;
|
||||||
|
const QDate headerDate(searchDate.year(), month, day);
|
||||||
|
if (!headerDate.isValid()) continue;
|
||||||
|
|
||||||
|
if (headerDate == searchDate) {
|
||||||
|
dateFound = true;
|
||||||
|
qDebug() << "[FetchTransactions] Found target date header:" << t;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (headerDate < searchDate) {
|
||||||
|
hasOlderDate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dateFound) break;
|
||||||
|
|
||||||
|
if (hasOlderDate) {
|
||||||
|
// Проскочили мимо нужной даты — её нет в списке
|
||||||
|
qDebug() << "[FetchTransactions] Passed target date, not found in list";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Скроллим вниз
|
||||||
|
AdbUtils::makeSwipe(m_deviceId, device.screenWidth / 2,
|
||||||
|
device.screenHeight - 300, device.screenWidth / 2, 300, 300);
|
||||||
|
QThread::msleep(1500);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dateFound) {
|
||||||
|
m_error = "Date not found in transaction list: " + searchDate.toString("dd.MM.yyyy");
|
||||||
|
qWarning() << "[FetchTransactions]" << m_error;
|
||||||
|
m_resultScreenshot = AdbUtils::captureScreenshotBytes(m_deviceId);
|
||||||
|
if (!m_resultScreenshot.isEmpty()) emit screenshotReady(m_resultScreenshot);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Шаг 2: на экране с нужной датой ищем транзакцию по сумме ────
|
||||||
|
for (int attempt = 0; attempt < 10; ++attempt) {
|
||||||
|
if (QThread::currentThread()->isInterruptionRequested()) {
|
||||||
|
m_error = "Interrupted";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
QList<Node> txButtons = xmlScreenParser.findTransactionButtons(20);
|
||||||
|
|
||||||
|
for (int bi = 0; bi < txButtons.size(); ++bi) {
|
||||||
|
if (QThread::currentThread()->isInterruptionRequested()) {
|
||||||
|
m_error = "Interrupted";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const TransactionInfo parsed = xmlScreenParser.parseTransactionButtonText(txButtons[bi].text);
|
||||||
|
if (qAbs(parsed.amount - m_searchAmount) > 0.01) continue;
|
||||||
|
|
||||||
|
// Если кнопка за экраном — скроллим до неё, рассчитывая дистанцию
|
||||||
|
if (txButtons[bi].y() <= 0 || txButtons[bi].y() >= navBarTop) {
|
||||||
|
bool scrolledIntoView = false;
|
||||||
|
for (int s = 0; s < 5; ++s) {
|
||||||
|
const int btnY = txButtons[bi].y();
|
||||||
|
const int x = device.screenWidth / 2;
|
||||||
|
const int visibleCenter = navBarTop / 2;
|
||||||
|
// Расстояние от кнопки до центра видимой области + небольшой запас
|
||||||
|
const int delta = btnY - visibleCenter;
|
||||||
|
const int fromY = qBound(100, visibleCenter + delta / 2, device.screenHeight - 100);
|
||||||
|
const int toY = qBound(100, visibleCenter - delta / 2, device.screenHeight - 100);
|
||||||
|
AdbUtils::makeSwipe(m_deviceId, x, fromY, x, toY, 300);
|
||||||
|
QThread::msleep(1000);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
txButtons = xmlScreenParser.findTransactionButtons(20);
|
||||||
|
if (bi < txButtons.size() && txButtons[bi].y() > 0 && txButtons[bi].y() < navBarTop) {
|
||||||
|
scrolledIntoView = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!scrolledIntoView) continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Node &visibleBtn = txButtons[bi];
|
||||||
qDebug() << "[FetchTransactions] Amount match:" << parsed.amount
|
qDebug() << "[FetchTransactions] Amount match:" << parsed.amount
|
||||||
<< "at" << btn.x() << btn.y();
|
<< "at" << visibleBtn.x() << visibleBtn.y();
|
||||||
|
|
||||||
AdbUtils::makeTap(m_deviceId, btn.x(), btn.y());
|
// Тапаем и ждём деталей
|
||||||
|
AdbUtils::makeTap(m_deviceId, visibleBtn.x(), visibleBtn.y());
|
||||||
QThread::msleep(2000);
|
QThread::msleep(2000);
|
||||||
|
|
||||||
// Ждём загрузки деталей
|
|
||||||
TransactionInfo detail;
|
TransactionInfo detail;
|
||||||
for (int attempt = 0; attempt < 10; ++attempt) {
|
for (int da = 0; da < 10; ++da) {
|
||||||
|
if (QThread::currentThread()->isInterruptionRequested()) {
|
||||||
|
m_error = "Interrupted";
|
||||||
|
return;
|
||||||
|
}
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
detail = xmlScreenParser.parseTransactionDetail();
|
detail = xmlScreenParser.parseTransactionDetail();
|
||||||
if (!detail.bankTime.isEmpty()) break;
|
if (!detail.bankTime.isEmpty()) break;
|
||||||
if (xmlScreenParser.isTransactionListScreen()) {
|
if (xmlScreenParser.isTransactionListScreen()) {
|
||||||
AdbUtils::makeTap(m_deviceId, btn.x(), btn.y());
|
AdbUtils::makeTap(m_deviceId, visibleBtn.x(), visibleBtn.y());
|
||||||
}
|
}
|
||||||
QThread::msleep(1500);
|
QThread::msleep(1500);
|
||||||
}
|
}
|
||||||
@ -240,27 +348,22 @@ void GetLastTransactionsScript::searchTransaction(const DeviceInfo &device, int
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Парсим время
|
// Парсим дату из деталей
|
||||||
QString dtStr = detail.bankTime;
|
QString dtStr = detail.bankTime;
|
||||||
for (int ci = 0; ci < dtStr.size(); ++ci) {
|
for (int ci = 0; ci < dtStr.size(); ++ci) {
|
||||||
const QChar ch = dtStr.at(ci);
|
const QChar ch = dtStr.at(ci);
|
||||||
if (ch != ' ' && ch.category() == QChar::Separator_Space) dtStr[ci] = ' ';
|
if (ch != ' ' && ch.category() == QChar::Separator_Space) dtStr[ci] = ' ';
|
||||||
}
|
}
|
||||||
|
|
||||||
QDateTime txTime = QDateTime::fromString(dtStr, "dd.MM.yyyy, HH:mm");
|
QDateTime txTime = QDateTime::fromString(dtStr, "dd.MM.yyyy, HH:mm");
|
||||||
if (!txTime.isValid()) txTime = QDateTime::fromString(dtStr, "dd.MM.yyyy,HH:mm");
|
if (!txTime.isValid()) txTime = QDateTime::fromString(dtStr, "dd.MM.yyyy,HH:mm");
|
||||||
if (txTime.isValid()) txTime.setTimeZone(msk);
|
if (txTime.isValid()) txTime.setTimeZone(msk);
|
||||||
|
|
||||||
// Проверяем ±1 час
|
// Проверяем что дата совпадает (тот же день)
|
||||||
if (m_searchTime.isValid() && txTime.isValid()) {
|
if (txTime.isValid() && txTime.date() != searchDate) {
|
||||||
const qint64 diffSecs = qAbs(txTime.toUTC().secsTo(m_searchTime.toUTC()));
|
qDebug() << "[FetchTransactions] Wrong date:" << dtStr << "expected" << searchDate;
|
||||||
if (diffSecs > 3600) {
|
AdbUtils::goBack(m_deviceId);
|
||||||
qDebug() << "[FetchTransactions] Time mismatch: tx=" << dtStr
|
QThread::msleep(1000);
|
||||||
<< "diff=" << diffSecs << "sec, skipping";
|
continue;
|
||||||
AdbUtils::goBack(m_deviceId);
|
|
||||||
QThread::msleep(1000);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Нашли!
|
// Нашли!
|
||||||
@ -268,9 +371,11 @@ void GetLastTransactionsScript::searchTransaction(const DeviceInfo &device, int
|
|||||||
<< "amount=" << parsed.amount << "time=" << dtStr
|
<< "amount=" << parsed.amount << "time=" << dtStr
|
||||||
<< "name=" << detail.name;
|
<< "name=" << detail.name;
|
||||||
|
|
||||||
|
m_resultScreenshot = AdbUtils::captureScreenshotBytes(m_deviceId);
|
||||||
|
|
||||||
// Пробуем получить ID через "Документы" → OCR
|
// Пробуем получить ID через "Документы" → OCR
|
||||||
QString externalId = detail.bankTrExternalId;
|
QString externalId = detail.bankTrExternalId;
|
||||||
if (externalId.isEmpty()) {
|
if (externalId.isEmpty() && !QThread::currentThread()->isInterruptionRequested()) {
|
||||||
Node docBtn = xmlScreenParser.findButtonNode("Документы", false);
|
Node docBtn = xmlScreenParser.findButtonNode("Документы", false);
|
||||||
if (!docBtn.isEmpty()) {
|
if (!docBtn.isEmpty()) {
|
||||||
qDebug() << "[FetchTransactions] Tapping 'Документы'...";
|
qDebug() << "[FetchTransactions] Tapping 'Документы'...";
|
||||||
@ -279,6 +384,7 @@ void GetLastTransactionsScript::searchTransaction(const DeviceInfo &device, int
|
|||||||
|
|
||||||
bool docLoaded = false;
|
bool docLoaded = false;
|
||||||
for (int da = 0; da < 15; ++da) {
|
for (int da = 0; da < 15; ++da) {
|
||||||
|
if (QThread::currentThread()->isInterruptionRequested()) break;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
if (!xmlScreenParser.findNodeByContentDesc("Поделиться").isEmpty()) {
|
if (!xmlScreenParser.findNodeByContentDesc("Поделиться").isEmpty()) {
|
||||||
docLoaded = true;
|
docLoaded = true;
|
||||||
@ -291,6 +397,7 @@ void GetLastTransactionsScript::searchTransaction(const DeviceInfo &device, int
|
|||||||
QThread::msleep(500);
|
QThread::msleep(500);
|
||||||
const QByteArray screenshot = AdbUtils::captureScreenshotBytes(m_deviceId);
|
const QByteArray screenshot = AdbUtils::captureScreenshotBytes(m_deviceId);
|
||||||
if (!screenshot.isEmpty()) {
|
if (!screenshot.isEmpty()) {
|
||||||
|
m_resultScreenshot = screenshot;
|
||||||
const QString ocrText = recognizeTextFromImage(screenshot);
|
const QString ocrText = recognizeTextFromImage(screenshot);
|
||||||
if (!ocrText.isEmpty()) {
|
if (!ocrText.isEmpty()) {
|
||||||
qDebug() << "[FetchTransactions] OCR result:" << ocrText;
|
qDebug() << "[FetchTransactions] OCR result:" << ocrText;
|
||||||
@ -330,21 +437,27 @@ void GetLastTransactionsScript::searchTransaction(const DeviceInfo &device, int
|
|||||||
TransactionDAO::insertTransactionIfNotExists(tx);
|
TransactionDAO::insertTransactionIfNotExists(tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!m_resultScreenshot.isEmpty())
|
||||||
|
emit screenshotReady(m_resultScreenshot);
|
||||||
|
|
||||||
AdbUtils::goBack(m_deviceId);
|
AdbUtils::goBack(m_deviceId);
|
||||||
QThread::msleep(1000);
|
QThread::msleep(1000);
|
||||||
return; // успех — m_error пустой
|
AdbUtils::goBack(m_deviceId);
|
||||||
|
QThread::msleep(1000);
|
||||||
|
return; // успех
|
||||||
}
|
}
|
||||||
|
|
||||||
// Скроллим вниз
|
// Скроллим чуть вниз чтобы увидеть больше транзакций за этот день
|
||||||
const int x = device.screenWidth / 2;
|
AdbUtils::makeSwipe(m_deviceId, device.screenWidth / 2,
|
||||||
const int offset = device.screenHeight / 4;
|
device.screenHeight - 300, device.screenWidth / 2, 300, 300);
|
||||||
AdbUtils::makeSwipe(m_deviceId, x, device.screenHeight - offset, x, offset);
|
|
||||||
QThread::msleep(1000);
|
QThread::msleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_error = "Transaction not found: amount=" + QString::number(m_searchAmount, 'f', 2)
|
m_error = "Transaction not found: amount=" + QString::number(m_searchAmount, 'f', 2)
|
||||||
+ " time=" + m_searchTime.toString(Qt::ISODate);
|
+ " date=" + searchDate.toString("dd.MM.yyyy");
|
||||||
qWarning() << "[FetchTransactions]" << m_error;
|
qWarning() << "[FetchTransactions]" << m_error;
|
||||||
|
m_resultScreenshot = AdbUtils::captureScreenshotBytes(m_deviceId);
|
||||||
|
if (!m_resultScreenshot.isEmpty()) emit screenshotReady(m_resultScreenshot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetLastTransactionsScript::scanRecentTransactions(const DeviceInfo &device, int accountId) {
|
void GetLastTransactionsScript::scanRecentTransactions(const DeviceInfo &device, int accountId) {
|
||||||
|
|||||||
@ -55,7 +55,7 @@ void GetProfileInfoScript::doStart() {
|
|||||||
qDebug() << "[GetProfileInfo] Not on home screen, restarting app...";
|
qDebug() << "[GetProfileInfo] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + m_deviceId + " " + m_appCode;
|
m_error = "Cannot reach home screen: " + device.name + " (" + m_deviceId + ") " + m_appCode;
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
AdbUtils::tryToKillApplication(m_deviceId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
@ -108,7 +108,8 @@ void GetProfileInfoScript::doStart() {
|
|||||||
// Извлекаем полное имя и телефон
|
// Извлекаем полное имя и телефон
|
||||||
const QString fullName = xmlScreenParser.parseProfileFullName();
|
const QString fullName = xmlScreenParser.parseProfileFullName();
|
||||||
QString phone = xmlScreenParser.parseProfilePhone();
|
QString phone = xmlScreenParser.parseProfilePhone();
|
||||||
phone.remove(QRegularExpression(R"(\s+)")); // убираем все виды пробелов (включая \u00A0)
|
phone.remove(' ');
|
||||||
|
phone.remove(QChar(0x00A0));
|
||||||
|
|
||||||
qDebug() << "[GetProfileInfo] fullName:" << fullName << "phone:" << phone;
|
qDebug() << "[GetProfileInfo] fullName:" << fullName << "phone:" << phone;
|
||||||
|
|
||||||
|
|||||||
@ -42,10 +42,10 @@ void LoginAndCheckAccountsScript::doStart() {
|
|||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
|
|
||||||
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {
|
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cant open the home screen: " + m_deviceId + " " + m_appCode;
|
m_error = "Cant open the home screen: " + device.name + " (" + m_deviceId + ") " + m_appCode;
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AppLogger::log("ozon/LoginAndCheck", m_deviceId, m_error,
|
m_resultScreenshot = AdbUtils::captureScreenshotBytes(m_deviceId);
|
||||||
AdbUtils::captureScreenshotBytes(m_deviceId), "FETCH_PROFILE");
|
if (!m_resultScreenshot.isEmpty()) emit screenshotReady(m_resultScreenshot);
|
||||||
BankProfileDAO::updateComment(app.id,
|
BankProfileDAO::updateComment(app.id,
|
||||||
"Не прошла проверка " + QDateTime::currentDateTime().toString("dd.MM.yyyy HH:mm:ss"));
|
"Не прошла проверка " + QDateTime::currentDateTime().toString("dd.MM.yyyy HH:mm:ss"));
|
||||||
|
|
||||||
@ -58,6 +58,11 @@ void LoginAndCheckAccountsScript::doStart() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Скриншот домашнего экрана
|
||||||
|
m_resultScreenshot = AdbUtils::captureScreenshotBytes(m_deviceId);
|
||||||
|
if (!m_resultScreenshot.isEmpty())
|
||||||
|
emit screenshotReady(m_resultScreenshot);
|
||||||
|
|
||||||
// Создаём bank profile если ещё не создан
|
// Создаём bank profile если ещё не создан
|
||||||
createBankProfileIfNeeded(device.id, m_appCode);
|
createBankProfileIfNeeded(device.id, m_appCode);
|
||||||
|
|
||||||
|
|||||||
@ -49,10 +49,11 @@ static QString extractTransactionId(const QString &ocrText) {
|
|||||||
// "ID операции B606513042211200000120011700501"
|
// "ID операции B606513042211200000120011700501"
|
||||||
// "ID операции po-3140eb01-002c-5000-8000-033396b637e1"
|
// "ID операции po-3140eb01-002c-5000-8000-033396b637e1"
|
||||||
// или разбит на 2 строки
|
// или разбит на 2 строки
|
||||||
QRegularExpression reId(R"(ID\s+операции\s*=?\s*([A-Za-zА-Яа-яЁё0-9\-]+(?:\s+[A-Za-zА-Яа-яЁё0-9\-]+)?))");
|
QRegularExpression reId(R"(ID\s+операции\s*=?\s*([A-Za-zА-Яа-яЁё0-9\-]+(?:[^\S\n]+[A-Za-zА-Яа-яЁё0-9\-]+)?))");
|
||||||
if (auto m = reId.match(ocrText); m.hasMatch()) {
|
if (auto m = reId.match(ocrText); m.hasMatch()) {
|
||||||
QString id = m.captured(1);
|
QString id = m.captured(1);
|
||||||
id.remove(QRegularExpression(R"(\s+)"));
|
id.remove(' ');
|
||||||
|
id.remove(QChar(0x00A0));
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,62 +89,73 @@ void PayByCardScript::doStart() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
const QString &adbId = device.adbSerial;
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
|
|
||||||
// Закрываем рекламный bottom sheet
|
// Закрываем рекламный bottom sheet
|
||||||
if (Node adNode = xmlScreenParser.tryToFindAdBanner(); !adNode.isEmpty()) {
|
if (Node adNode = xmlScreenParser.tryToFindAdBanner(); !adNode.isEmpty()) {
|
||||||
qDebug() << "[PayByCard] Ad banner detected, closing...";
|
qDebug() << "[PayByCard] Ad banner detected, closing...";
|
||||||
AdbUtils::makeTap(device.id, adNode.x(), adNode.y());
|
AdbUtils::makeTap(adbId, adNode.x(), adNode.y());
|
||||||
QThread::msleep(1000);
|
QThread::msleep(1000);
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Если не на домашнем экране — перезапускаем
|
// Если не на домашнем экране — перезапускаем
|
||||||
if (!xmlScreenParser.isHomeScreen()) {
|
if (!xmlScreenParser.isHomeScreen()) {
|
||||||
qDebug() << "[PayByCard] Not on home screen, restarting app...";
|
qDebug() << "[PayByCard] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(device.adbSerial, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(adbId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + device.id;
|
m_error = "Cannot reach home screen: " + device.name + " (" + device.id + ")";
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AdbUtils::tryToKillApplication(device.adbSerial, app.package);
|
AdbUtils::tryToKillApplication(adbId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Закрываем баннеры
|
// Закрываем баннеры
|
||||||
tryToCloseAllBannersOnHomePage(device.id, device.screenWidth, device.screenHeight);
|
tryToCloseAllBannersOnHomePage(adbId, device.screenWidth, device.screenHeight);
|
||||||
QThread::msleep(500);
|
QThread::msleep(500);
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
|
|
||||||
// Закрываем баннер Google Play "Доступно обновление"
|
// Закрываем баннер Google Play "Доступно обновление"
|
||||||
if (Node gpNode = xmlScreenParser.tryToFindGooglePlayBanner(); !gpNode.isEmpty()) {
|
if (Node gpNode = xmlScreenParser.tryToFindGooglePlayBanner(device.screenWidth, device.screenHeight); !gpNode.isEmpty()) {
|
||||||
qDebug() << "[PayByCard] Google Play update banner detected, closing...";
|
qDebug() << "[PayByCard] Google Play update banner detected, closing...";
|
||||||
AdbUtils::makeTap(device.id, gpNode.x(), gpNode.y());
|
AdbUtils::makeTap(adbId, gpNode.x(), gpNode.y());
|
||||||
QThread::msleep(1500);
|
QThread::msleep(1500);
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Закрываем баннер "Заказать карту" — тапаем сверху экрана
|
// Закрываем баннер "Заказать карту" — тапаем сверху экрана
|
||||||
if (Node orderCardNode = xmlScreenParser.findTextNode("Заказать карту"); !orderCardNode.isEmpty()) {
|
if (Node orderCardNode = xmlScreenParser.findTextNode("Заказать карту"); !orderCardNode.isEmpty()) {
|
||||||
qDebug() << "[PayByCard] 'Заказать карту' banner detected, closing...";
|
qDebug() << "[PayByCard] 'Заказать карту' banner detected, closing...";
|
||||||
AdbUtils::makeTap(device.id, device.screenWidth / 2, device.screenHeight / 20);
|
AdbUtils::makeTap(adbId, device.screenWidth / 2, device.screenHeight / 20);
|
||||||
QThread::msleep(1000);
|
QThread::msleep(1000);
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
}
|
}
|
||||||
|
|
||||||
makePayment(device.adbSerial, app.pinCode, device.screenWidth, device.screenHeight);
|
makePayment(device.adbSerial, app.package, app.pinCode, device.screenWidth, device.screenHeight);
|
||||||
|
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PayByCardScript::makePayment(
|
void PayByCardScript::makePayment(
|
||||||
const QString &deviceId,
|
const QString &deviceId,
|
||||||
|
const QString &packageName,
|
||||||
const QString &pinCode,
|
const QString &pinCode,
|
||||||
const int width,
|
const int width,
|
||||||
const int height
|
const int height
|
||||||
) {
|
) {
|
||||||
|
auto checkApp = [&]() -> bool {
|
||||||
|
if (!isAppRunning(deviceId, packageName)) {
|
||||||
|
m_error = "Приложение было закрыто";
|
||||||
|
qWarning() << "[PayByCard]" << m_error;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
// 1. Нажимаем "Перевести" на домашнем экране
|
// 1. Нажимаем "Перевести" на домашнем экране
|
||||||
Node transferBtn = xmlScreenParser.findButtonNode("Перевести", false);
|
Node transferBtn = xmlScreenParser.findButtonNode("Перевести", false);
|
||||||
if (transferBtn.isEmpty()) {
|
if (transferBtn.isEmpty()) {
|
||||||
@ -159,6 +171,7 @@ void PayByCardScript::makePayment(
|
|||||||
// 2. Ждём экран "Платежи и переводы"
|
// 2. Ждём экран "Платежи и переводы"
|
||||||
bool paymentsPageLoaded = false;
|
bool paymentsPageLoaded = false;
|
||||||
for (int attempt = 0; attempt < 10; ++attempt) {
|
for (int attempt = 0; attempt < 10; ++attempt) {
|
||||||
|
if (!checkApp()) return;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
Node title = xmlScreenParser.findTextNode("Платежи и переводы");
|
Node title = xmlScreenParser.findTextNode("Платежи и переводы");
|
||||||
if (!title.isEmpty()) {
|
if (!title.isEmpty()) {
|
||||||
@ -190,6 +203,7 @@ void PayByCardScript::makePayment(
|
|||||||
// 4. Ждём экран "Перевод по номеру карты"
|
// 4. Ждём экран "Перевод по номеру карты"
|
||||||
bool cardScreenLoaded = false;
|
bool cardScreenLoaded = false;
|
||||||
for (int attempt = 0; attempt < 10; ++attempt) {
|
for (int attempt = 0; attempt < 10; ++attempt) {
|
||||||
|
if (!checkApp()) return;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
Node title = xmlScreenParser.findTextNode("Перевод по номеру карты");
|
Node title = xmlScreenParser.findTextNode("Перевод по номеру карты");
|
||||||
if (!title.isEmpty()) {
|
if (!title.isEmpty()) {
|
||||||
@ -242,6 +256,7 @@ void PayByCardScript::makePayment(
|
|||||||
double fee = 0;
|
double fee = 0;
|
||||||
bool feeCalculated = false;
|
bool feeCalculated = false;
|
||||||
for (int attempt = 0; attempt < 15; ++attempt) {
|
for (int attempt = 0; attempt < 15; ++attempt) {
|
||||||
|
if (!checkApp()) return;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
|
||||||
bool foundKomissiya = false;
|
bool foundKomissiya = false;
|
||||||
@ -299,6 +314,7 @@ void PayByCardScript::makePayment(
|
|||||||
|
|
||||||
// 9. Ждём результат: "Успешно" или "Не удалось"
|
// 9. Ждём результат: "Успешно" или "Не удалось"
|
||||||
for (int attempt = 0; attempt < 15; ++attempt) {
|
for (int attempt = 0; attempt < 15; ++attempt) {
|
||||||
|
if (!checkApp()) return;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
|
||||||
// Если PIN-код появился позже — вводим
|
// Если PIN-код появился позже — вводим
|
||||||
@ -353,6 +369,8 @@ void PayByCardScript::makePayment(
|
|||||||
QThread::msleep(500);
|
QThread::msleep(500);
|
||||||
const QByteArray screenshot = AdbUtils::captureScreenshotBytes(deviceId);
|
const QByteArray screenshot = AdbUtils::captureScreenshotBytes(deviceId);
|
||||||
if (!screenshot.isEmpty()) {
|
if (!screenshot.isEmpty()) {
|
||||||
|
m_resultScreenshot = screenshot;
|
||||||
|
emit screenshotReady(m_resultScreenshot);
|
||||||
TransactionDAO::updateReceiptImage(txId, screenshot);
|
TransactionDAO::updateReceiptImage(txId, screenshot);
|
||||||
qDebug() << "[PayByCard] Receipt saved to DB, txId:" << txId;
|
qDebug() << "[PayByCard] Receipt saved to DB, txId:" << txId;
|
||||||
|
|
||||||
@ -366,11 +384,7 @@ void PayByCardScript::makePayment(
|
|||||||
} else {
|
} else {
|
||||||
qWarning() << "[PayByCard] Could not extract transaction ID from OCR text";
|
qWarning() << "[PayByCard] Could not extract transaction ID from OCR text";
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
qWarning() << "[PayByCard] OCR returned empty text";
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
qWarning() << "[PayByCard] Screenshot is empty";
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
qWarning() << "[PayByCard] 'Поделиться' not found, skipping receipt";
|
qWarning() << "[PayByCard] 'Поделиться' not found, skipping receipt";
|
||||||
@ -380,12 +394,20 @@ void PayByCardScript::makePayment(
|
|||||||
QThread::msleep(1000);
|
QThread::msleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AdbUtils::goBack(deviceId);
|
||||||
|
QThread::msleep(1000);
|
||||||
|
AdbUtils::goBack(deviceId);
|
||||||
|
QThread::msleep(1000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!xmlScreenParser.findTextNode("Не удалось").isEmpty()) {
|
if (!xmlScreenParser.findTextNode("Не удалось").isEmpty()) {
|
||||||
m_error = "Перевод не удался (экран 'Не удалось')";
|
m_error = "Перевод не удался (экран 'Не удалось')";
|
||||||
qWarning() << "[PayByCard]" << m_error;
|
qWarning() << "[PayByCard]" << m_error;
|
||||||
|
AdbUtils::goBack(deviceId);
|
||||||
|
QThread::msleep(1000);
|
||||||
|
AdbUtils::goBack(deviceId);
|
||||||
|
QThread::msleep(1000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -27,6 +27,7 @@ private:
|
|||||||
|
|
||||||
void makePayment(
|
void makePayment(
|
||||||
const QString &deviceId,
|
const QString &deviceId,
|
||||||
|
const QString &packageName,
|
||||||
const QString &pinCode,
|
const QString &pinCode,
|
||||||
int width,
|
int width,
|
||||||
int height
|
int height
|
||||||
|
|||||||
@ -49,10 +49,11 @@ static QString extractTransactionId(const QString &ocrText) {
|
|||||||
// "ID операции B606513042211200000120011700501"
|
// "ID операции B606513042211200000120011700501"
|
||||||
// "ID операции po-3140eb01-002c-5000-8000-033396b637e1"
|
// "ID операции po-3140eb01-002c-5000-8000-033396b637e1"
|
||||||
// или разбит на 2 строки
|
// или разбит на 2 строки
|
||||||
QRegularExpression reId(R"(ID\s+операции\s*=?\s*([A-Za-zА-Яа-яЁё0-9\-]+(?:\s+[A-Za-zА-Яа-яЁё0-9\-]+)?))");
|
QRegularExpression reId(R"(ID\s+операции\s*=?\s*([A-Za-zА-Яа-яЁё0-9\-]+(?:[^\S\n]+[A-Za-zА-Яа-яЁё0-9\-]+)?))");
|
||||||
if (auto m = reId.match(ocrText); m.hasMatch()) {
|
if (auto m = reId.match(ocrText); m.hasMatch()) {
|
||||||
QString id = m.captured(1);
|
QString id = m.captured(1);
|
||||||
id.remove(QRegularExpression(R"(\s+)"));
|
id.remove(' ');
|
||||||
|
id.remove(QChar(0x00A0));
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,62 +90,74 @@ void PayByPhoneScript::doStart() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
const QString &adbId = device.adbSerial;
|
||||||
|
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
|
|
||||||
// Закрываем рекламный bottom sheet
|
// Закрываем рекламный bottom sheet
|
||||||
if (Node adNode = xmlScreenParser.tryToFindAdBanner(); !adNode.isEmpty()) {
|
if (Node adNode = xmlScreenParser.tryToFindAdBanner(); !adNode.isEmpty()) {
|
||||||
qDebug() << "[PayByPhone] Ad banner detected, closing...";
|
qDebug() << "[PayByPhone] Ad banner detected, closing...";
|
||||||
AdbUtils::makeTap(device.id, adNode.x(), adNode.y());
|
AdbUtils::makeTap(adbId, adNode.x(), adNode.y());
|
||||||
QThread::msleep(1000);
|
QThread::msleep(1000);
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Если не на домашнем экране — перезапускаем
|
// Если не на домашнем экране — перезапускаем
|
||||||
if (!xmlScreenParser.isHomeScreen()) {
|
if (!xmlScreenParser.isHomeScreen()) {
|
||||||
qDebug() << "[PayByPhone] Not on home screen, restarting app...";
|
qDebug() << "[PayByPhone] Not on home screen, restarting app...";
|
||||||
if (!runAppAndGoToHomeScreen(device.adbSerial, app.package, app.pinCode,
|
if (!runAppAndGoToHomeScreen(adbId, app.package, app.pinCode,
|
||||||
device.screenWidth, device.screenHeight)) {
|
device.screenWidth, device.screenHeight)) {
|
||||||
m_error = "Cannot reach home screen: " + device.id;
|
m_error = "Cannot reach home screen: " + device.name + " (" + device.id + ")";
|
||||||
qWarning() << m_error;
|
qWarning() << m_error;
|
||||||
AdbUtils::tryToKillApplication(device.adbSerial, app.package);
|
AdbUtils::tryToKillApplication(adbId, app.package);
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Закрываем баннеры
|
// Закрываем баннеры
|
||||||
tryToCloseAllBannersOnHomePage(device.id, device.screenWidth, device.screenHeight);
|
tryToCloseAllBannersOnHomePage(adbId, device.screenWidth, device.screenHeight);
|
||||||
QThread::msleep(500);
|
QThread::msleep(500);
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
|
|
||||||
// Закрываем баннер Google Play "Доступно обновление"
|
// Закрываем баннер Google Play "Доступно обновление"
|
||||||
if (Node gpNode = xmlScreenParser.tryToFindGooglePlayBanner(); !gpNode.isEmpty()) {
|
if (Node gpNode = xmlScreenParser.tryToFindGooglePlayBanner(device.screenWidth, device.screenHeight); !gpNode.isEmpty()) {
|
||||||
qDebug() << "[PayByPhone] Google Play update banner detected, closing...";
|
qDebug() << "[PayByPhone] Google Play update banner detected, closing...";
|
||||||
AdbUtils::makeTap(device.id, gpNode.x(), gpNode.y());
|
AdbUtils::makeTap(adbId, gpNode.x(), gpNode.y());
|
||||||
QThread::msleep(1500);
|
QThread::msleep(1500);
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Закрываем баннер "Заказать карту" — тапаем сверху экрана
|
// Закрываем баннер "Заказать карту" — тапаем сверху экрана
|
||||||
if (Node orderCardNode = xmlScreenParser.findTextNode("Заказать карту"); !orderCardNode.isEmpty()) {
|
if (Node orderCardNode = xmlScreenParser.findTextNode("Заказать карту"); !orderCardNode.isEmpty()) {
|
||||||
qDebug() << "[PayByPhone] 'Заказать карту' banner detected, closing...";
|
qDebug() << "[PayByPhone] 'Заказать карту' banner detected, closing...";
|
||||||
AdbUtils::makeTap(device.id, device.screenWidth / 2, device.screenHeight / 20);
|
AdbUtils::makeTap(adbId, device.screenWidth / 2, device.screenHeight / 20);
|
||||||
QThread::msleep(1000);
|
QThread::msleep(1000);
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(device.id, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
|
||||||
}
|
}
|
||||||
|
|
||||||
makePayment(device.adbSerial, app.pinCode, device.screenWidth, device.screenHeight);
|
makePayment(device.adbSerial, app.package, app.pinCode, device.screenWidth, device.screenHeight);
|
||||||
|
|
||||||
emit finishedWithResult(m_error);
|
emit finishedWithResult(m_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PayByPhoneScript::makePayment(
|
void PayByPhoneScript::makePayment(
|
||||||
const QString &deviceId,
|
const QString &deviceId,
|
||||||
|
const QString &packageName,
|
||||||
const QString &pinCode,
|
const QString &pinCode,
|
||||||
const int width,
|
const int width,
|
||||||
const int height
|
const int height
|
||||||
) {
|
) {
|
||||||
|
// Макрос-проверка: приложение живо?
|
||||||
|
auto checkApp = [&]() -> bool {
|
||||||
|
if (!isAppRunning(deviceId, packageName)) {
|
||||||
|
m_error = "Приложение было закрыто";
|
||||||
|
qWarning() << "[PayByPhone]" << m_error;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
// 1. Нажимаем "Перевести" на домашнем экране
|
// 1. Нажимаем "Перевести" на домашнем экране
|
||||||
Node transferBtn = xmlScreenParser.findButtonNode("Перевести", false);
|
Node transferBtn = xmlScreenParser.findButtonNode("Перевести", false);
|
||||||
if (transferBtn.isEmpty()) {
|
if (transferBtn.isEmpty()) {
|
||||||
@ -160,6 +173,7 @@ void PayByPhoneScript::makePayment(
|
|||||||
// 2. Ждём экран "Платежи и переводы" с полем "Телефон получателя"
|
// 2. Ждём экран "Платежи и переводы" с полем "Телефон получателя"
|
||||||
bool paymentsPageLoaded = false;
|
bool paymentsPageLoaded = false;
|
||||||
for (int attempt = 0; attempt < 10; ++attempt) {
|
for (int attempt = 0; attempt < 10; ++attempt) {
|
||||||
|
if (!checkApp()) return;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
Node phoneField = xmlScreenParser.findFirstEditText();
|
Node phoneField = xmlScreenParser.findFirstEditText();
|
||||||
if (!phoneField.isEmpty()) {
|
if (!phoneField.isEmpty()) {
|
||||||
@ -185,7 +199,18 @@ void PayByPhoneScript::makePayment(
|
|||||||
// 4. Ждём экран "Кому перевести"
|
// 4. Ждём экран "Кому перевести"
|
||||||
bool phoneScreenLoaded = false;
|
bool phoneScreenLoaded = false;
|
||||||
for (int attempt = 0; attempt < 10; ++attempt) {
|
for (int attempt = 0; attempt < 10; ++attempt) {
|
||||||
|
if (!checkApp()) return;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
|
||||||
|
// Закрываем диалог "Разрешить доступ к контактам"
|
||||||
|
Node notNowBtn = xmlScreenParser.findButtonNode("Не сейчас", false);
|
||||||
|
if (!notNowBtn.isEmpty()) {
|
||||||
|
qDebug() << "[PayByPhone] Contacts permission dialog detected, tapping 'Не сейчас'...";
|
||||||
|
AdbUtils::makeTap(deviceId, notNowBtn.x(), notNowBtn.y());
|
||||||
|
QThread::msleep(1500);
|
||||||
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
}
|
||||||
|
|
||||||
Node title = xmlScreenParser.findTextNode("Кому перевести");
|
Node title = xmlScreenParser.findTextNode("Кому перевести");
|
||||||
if (!title.isEmpty()) {
|
if (!title.isEmpty()) {
|
||||||
phoneScreenLoaded = true;
|
phoneScreenLoaded = true;
|
||||||
@ -204,6 +229,7 @@ void PayByPhoneScript::makePayment(
|
|||||||
// 5. Тапаем на EditText и вводим номер телефона
|
// 5. Тапаем на EditText и вводим номер телефона
|
||||||
Node phoneInput;
|
Node phoneInput;
|
||||||
for (int attempt = 0; attempt < 10; ++attempt) {
|
for (int attempt = 0; attempt < 10; ++attempt) {
|
||||||
|
if (!checkApp()) return;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
phoneInput = xmlScreenParser.findFirstEditText();
|
phoneInput = xmlScreenParser.findFirstEditText();
|
||||||
if (!phoneInput.isEmpty()) break;
|
if (!phoneInput.isEmpty()) break;
|
||||||
@ -226,6 +252,7 @@ void PayByPhoneScript::makePayment(
|
|||||||
bool bankSelected = false;
|
bool bankSelected = false;
|
||||||
bool otherBankClicked = false;
|
bool otherBankClicked = false;
|
||||||
for (int attempt = 0; attempt < 20; ++attempt) {
|
for (int attempt = 0; attempt < 20; ++attempt) {
|
||||||
|
if (!checkApp()) return;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
|
||||||
// Проверяем: уже на экране суммы?
|
// Проверяем: уже на экране суммы?
|
||||||
@ -303,8 +330,9 @@ void PayByPhoneScript::makePayment(
|
|||||||
&& node.contentDesc != "base-go-back-button"
|
&& node.contentDesc != "base-go-back-button"
|
||||||
&& node.contentDesc != "native-toolbar-close-button"
|
&& node.contentDesc != "native-toolbar-close-button"
|
||||||
&& node.contentDesc != "clear-input-icon") {
|
&& node.contentDesc != "clear-input-icon") {
|
||||||
qDebug() << "[PayByPhone] Found bank in list, tapping:" << node.contentDesc << "bounds:" << node.x() << node.y();
|
const int tapX = node.x1() + node.width() / 4;
|
||||||
AdbUtils::makeTap(deviceId, node.x(), node.y());
|
qDebug() << "[PayByPhone] Found bank in list, tapping:" << node.contentDesc << "tapX:" << tapX << "y:" << node.y();
|
||||||
|
AdbUtils::makeTap(deviceId, tapX, node.y());
|
||||||
bankFound = true;
|
bankFound = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -365,6 +393,7 @@ void PayByPhoneScript::makePayment(
|
|||||||
// 7. Ждём экран "Подтвердите перевод" с кнопкой "Перевести ..."
|
// 7. Ждём экран "Подтвердите перевод" с кнопкой "Перевести ..."
|
||||||
bool confirmScreenLoaded = false;
|
bool confirmScreenLoaded = false;
|
||||||
for (int attempt = 0; attempt < 10; ++attempt) {
|
for (int attempt = 0; attempt < 10; ++attempt) {
|
||||||
|
if (!checkApp()) return;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
Node confirmTitle = xmlScreenParser.findTextNode("Подтвердите перевод");
|
Node confirmTitle = xmlScreenParser.findTextNode("Подтвердите перевод");
|
||||||
if (!confirmTitle.isEmpty()) {
|
if (!confirmTitle.isEmpty()) {
|
||||||
@ -404,6 +433,7 @@ void PayByPhoneScript::makePayment(
|
|||||||
|
|
||||||
// 9. Ждём результат: "Успешно" или "Не удалось"
|
// 9. Ждём результат: "Успешно" или "Не удалось"
|
||||||
for (int attempt = 0; attempt < 15; ++attempt) {
|
for (int attempt = 0; attempt < 15; ++attempt) {
|
||||||
|
if (!checkApp()) return;
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
||||||
|
|
||||||
// Если PIN-код появился позже — вводим
|
// Если PIN-код появился позже — вводим
|
||||||
@ -457,6 +487,8 @@ void PayByPhoneScript::makePayment(
|
|||||||
QThread::msleep(500);
|
QThread::msleep(500);
|
||||||
const QByteArray screenshot = AdbUtils::captureScreenshotBytes(deviceId);
|
const QByteArray screenshot = AdbUtils::captureScreenshotBytes(deviceId);
|
||||||
if (!screenshot.isEmpty()) {
|
if (!screenshot.isEmpty()) {
|
||||||
|
m_resultScreenshot = screenshot;
|
||||||
|
emit screenshotReady(m_resultScreenshot);
|
||||||
TransactionDAO::updateReceiptImage(txId, screenshot);
|
TransactionDAO::updateReceiptImage(txId, screenshot);
|
||||||
qDebug() << "[PayByPhone] Receipt saved to DB, txId:" << txId;
|
qDebug() << "[PayByPhone] Receipt saved to DB, txId:" << txId;
|
||||||
|
|
||||||
@ -470,11 +502,7 @@ void PayByPhoneScript::makePayment(
|
|||||||
} else {
|
} else {
|
||||||
qWarning() << "[PayByPhone] Could not extract transaction ID from OCR text";
|
qWarning() << "[PayByPhone] Could not extract transaction ID from OCR text";
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
qWarning() << "[PayByPhone] OCR returned empty text";
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
qWarning() << "[PayByPhone] Screenshot is empty";
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
qWarning() << "[PayByPhone] 'Поделиться' not found, skipping receipt";
|
qWarning() << "[PayByPhone] 'Поделиться' not found, skipping receipt";
|
||||||
@ -484,12 +512,20 @@ void PayByPhoneScript::makePayment(
|
|||||||
QThread::msleep(1000);
|
QThread::msleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AdbUtils::goBack(deviceId);
|
||||||
|
QThread::msleep(1000);
|
||||||
|
AdbUtils::goBack(deviceId);
|
||||||
|
QThread::msleep(1000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!xmlScreenParser.findTextNode("Не удалось").isEmpty()) {
|
if (!xmlScreenParser.findTextNode("Не удалось").isEmpty()) {
|
||||||
m_error = "Перевод не удался (экран 'Не удалось')";
|
m_error = "Перевод не удался (экран 'Не удалось')";
|
||||||
qWarning() << "[PayByPhone]" << m_error;
|
qWarning() << "[PayByPhone]" << m_error;
|
||||||
|
AdbUtils::goBack(deviceId);
|
||||||
|
QThread::msleep(1000);
|
||||||
|
AdbUtils::goBack(deviceId);
|
||||||
|
QThread::msleep(1000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -29,6 +29,7 @@ private:
|
|||||||
|
|
||||||
void makePayment(
|
void makePayment(
|
||||||
const QString &deviceId,
|
const QString &deviceId,
|
||||||
|
const QString &packageName,
|
||||||
const QString &pinCode,
|
const QString &pinCode,
|
||||||
int width,
|
int width,
|
||||||
int height
|
int height
|
||||||
|
|||||||
@ -40,6 +40,7 @@ static const QRegularExpression reNameAlt(R"(Перевод ([А-Яа-яЁё\s\*
|
|||||||
static const QRegularExpression reCardData(R"(цифрами\s+(\d\s\d\s\d\s\d).*?Сумма:\s([\d\s]+)\sруб)");
|
static const QRegularExpression reCardData(R"(цифрами\s+(\d\s\d\s\d\s\d).*?Сумма:\s([\d\s]+)\sруб)");
|
||||||
|
|
||||||
Node ScreenXmlParser::tryToFindBannerOrDialog(const int width, const int height) {
|
Node ScreenXmlParser::tryToFindBannerOrDialog(const int width, const int height) {
|
||||||
|
if (m_nodes.isEmpty()) return {};
|
||||||
// 1. Ищем push banner - он перекрывает весь экран
|
// 1. Ищем push banner - он перекрывает весь экран
|
||||||
Node first = m_nodes[0];
|
Node first = m_nodes[0];
|
||||||
for (const Node &node: m_nodes) {
|
for (const Node &node: m_nodes) {
|
||||||
@ -221,7 +222,7 @@ Node ScreenXmlParser::tryToFindAdBanner() {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Node ScreenXmlParser::tryToFindGooglePlayBanner() {
|
Node ScreenXmlParser::tryToFindGooglePlayBanner(const int screenWidth, const int screenHeight) {
|
||||||
// Баннер Google Play "Доступно обновление" — ищем кнопку закрытия по content-desc
|
// Баннер Google Play "Доступно обновление" — ищем кнопку закрытия по content-desc
|
||||||
for (const Node &node : m_nodes) {
|
for (const Node &node : m_nodes) {
|
||||||
if (node.contentDesc.contains("Закрыть диалоговое окно") && node.clickable) {
|
if (node.contentDesc.contains("Закрыть диалоговое окно") && node.clickable) {
|
||||||
@ -233,7 +234,9 @@ Node ScreenXmlParser::tryToFindGooglePlayBanner() {
|
|||||||
if (node.contentDesc.contains("Доступно обновление")) {
|
if (node.contentDesc.contains("Доступно обновление")) {
|
||||||
// Тапаем в верхнюю часть экрана (выше баннера), чтобы закрыть
|
// Тапаем в верхнюю часть экрана (выше баннера), чтобы закрыть
|
||||||
Node tapNode;
|
Node tapNode;
|
||||||
tapNode.setBounds(540, 100, 541, 101);
|
const int cx = screenWidth / 2;
|
||||||
|
const int cy = screenHeight / 20;
|
||||||
|
tapNode.setBounds(cx, cy, cx + 1, cy + 1);
|
||||||
return tapNode;
|
return tapNode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -413,7 +416,10 @@ QString ScreenXmlParser::parseProfilePhone() {
|
|||||||
for (const Node &node: m_nodes) {
|
for (const Node &node: m_nodes) {
|
||||||
if (node.text.contains("Номер телефона")) {
|
if (node.text.contains("Номер телефона")) {
|
||||||
const int idx = node.text.indexOf("Номер телефона");
|
const int idx = node.text.indexOf("Номер телефона");
|
||||||
return node.text.left(idx).trimmed();
|
QString phone = node.text.left(idx).trimmed();
|
||||||
|
phone.remove(' ');
|
||||||
|
phone.remove(QChar(0x00A0));
|
||||||
|
return phone;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
|
|||||||
@ -42,7 +42,7 @@ public:
|
|||||||
|
|
||||||
Node tryToFindAdBanner();
|
Node tryToFindAdBanner();
|
||||||
|
|
||||||
Node tryToFindGooglePlayBanner();
|
Node tryToFindGooglePlayBanner(int screenWidth, int screenHeight);
|
||||||
|
|
||||||
// Returns a Button node whose text is exactly 4 digits (card last numbers)
|
// Returns a Button node whose text is exactly 4 digits (card last numbers)
|
||||||
Node findCardButtonOnHomeScreen();
|
Node findCardButtonOnHomeScreen();
|
||||||
@ -94,6 +94,8 @@ public:
|
|||||||
|
|
||||||
void test();
|
void test();
|
||||||
|
|
||||||
|
[[nodiscard]] const QList<Node> &getNodes() const { return m_nodes; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<Node> m_nodes;
|
QList<Node> m_nodes;
|
||||||
QDomElement m_xml;
|
QDomElement m_xml;
|
||||||
|
|||||||
@ -174,9 +174,9 @@ if %errorlevel% neq 0 goto :VCEnd</Command>
|
|||||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.vcxproj">
|
<ProjectReference Include="C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARC.vcxproj">
|
||||||
<Project>{03783F02-4787-32E2-833D-3EA75403B734}</Project>
|
<Project>{0DFFB647-077E-3BCD-9EA4-BDCE49AC4298}</Project>
|
||||||
<Name>ARCDesktopProject</Name>
|
<Name>ARC</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
|||||||
@ -1,2 +0,0 @@
|
|||||||
PlatformToolSet=v143:VCToolArchitecture=NativeARM64:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:
|
|
||||||
Release|x64|C:\Users\User\CLionProjects\ARCDeskProject\build_x64\|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,63 +0,0 @@
|
|||||||
C:\Users\User\CLionProjects\ARCDeskProject\main.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\main.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\MainWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\MainWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\TutorialWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\TutorialWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\bank\AccountSettingsWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\AccountSettingsWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\bank\AccountWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\AccountWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\bank\BankListWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\BankListWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\bank\BankSettingsWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\BankSettingsWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\bank\TransactionWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\TransactionWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\device\DeviceWidget.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\DeviceWidget.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\event\EventWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\EventWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\log\LogWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\LogWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\widget\common\CollapsibleSection.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\CollapsibleSection.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\widget\common\FlowLayout.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\FlowLayout.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\widget\loader\ErrorWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\ErrorWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\widget\loader\LoaderDialog.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\LoaderDialog.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\widget\loader\LoaderWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\LoaderWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\views\widget\loader\RegistrationWindow.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\RegistrationWindow.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\services\AppLogger.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\AppLogger.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\services\DeviceScreener.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\DeviceScreener.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\services\EventHandler.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\EventHandler.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\services\net\NetworkService.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\NetworkService.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\database\DatabaseManager.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\DatabaseManager.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\database\dao\AccountDAO.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\AccountDAO.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\database\dao\AppLogDAO.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\AppLogDAO.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\database\dao\ApplicationDAO.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\ApplicationDAO.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\database\dao\BankDAO.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\BankDAO.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\database\dao\CommonDataDAO.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\CommonDataDAO.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\database\dao\DeviceDAO.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\DeviceDAO.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\database\dao\EventDAO.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\EventDAO.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\database\dao\SettingsDAO.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\SettingsDAO.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\database\dao\TransactionDAO.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\TransactionDAO.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\database\time\DateUtils.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\DateUtils.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\adb\AdbUtils.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\AdbUtils.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\birbank\CommonBirbankScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\CommonBirbankScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\birbank\GetLastDaysHistoryBirbankScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\GetLastDaysHistoryBirbankScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\birbank\LoginAndCheckAccountsBirbankScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\LoginAndCheckAccountsBirbankScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\birbank\PayByCardBirbankScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\PayByCardBirbankScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\birbank\ScreenXmlBirbankParser.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\ScreenXmlBirbankParser.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ozon\CommonScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\android\ozon\CommonScript.cpp.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ozon\GetCardInfoScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\GetCardInfoScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ozon\GetLastTransactionsScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\GetLastTransactionsScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ozon\GetProfileInfoScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\GetProfileInfoScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ozon\LoginAndCheckAccountsScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\android\ozon\LoginAndCheckAccountsScript.cpp.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ozon\PayByPhoneScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\android\ozon\PayByPhoneScript.cpp.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ozon\ScreenXmlParser.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\android\ozon\ScreenXmlParser.cpp.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\rshb\CommonScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\android\rshb\CommonScript.cpp.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\rshb\GetLastDaysHistoryScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\GetLastDaysHistoryScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\rshb\HomeScreenScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\HomeScreenScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\rshb\LoginAndCheckAccountsScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\android\rshb\LoginAndCheckAccountsScript.cpp.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\rshb\PayByPhoneScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\android\rshb\PayByPhoneScript.cpp.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\rshb\ScreenXmlParser.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\android\rshb\ScreenXmlParser.cpp.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\rshb\SyncAccountDataScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\SyncAccountDataScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\toss\CommonTossScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\CommonTossScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\toss\GetLastDaysHistoryTossScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\GetLastDaysHistoryTossScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\toss\LoginAndCheckAccountsTossScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\LoginAndCheckAccountsTossScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\toss\PayByCardTossScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\PayByCardTossScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\toss\ScreenXmlTossParser.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\ScreenXmlTossParser.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ziraat\CommonZiraatScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\CommonZiraatScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ziraat\GetLastDaysHistoryZiraatScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\GetLastDaysHistoryZiraatScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ziraat\LoginAndCheckAccountsZiraatScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\LoginAndCheckAccountsZiraatScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ziraat\PayByIbanScript.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\PayByIbanScript.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\android\ziraat\ScreenXmlZiraatParser.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\ScreenXmlZiraatParser.obj
|
|
||||||
C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject_autogen\mocs_compilation_Release.cpp;C:\Users\User\CLionProjects\ARCDeskProject\build_x64\ARCDesktopProject.dir\Release\mocs_compilation_Release.obj
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
^C:\USERS\USER\CLIONPROJECTS\ARCDESKPROJECT\CMAKELISTS.TXT
|
|
||||||
setlocal
|
|
||||||
"C:\Program Files\CMake\bin\cmake.exe" -SC:/Users/User/CLionProjects/ARCDeskProject -BC:/Users/User/CLionProjects/ARCDeskProject/build_x64 --check-stamp-file C:/Users/User/CLionProjects/ARCDeskProject/build_x64/CMakeFiles/generate.stamp
|
|
||||||
if %errorlevel% neq 0 goto :cmEnd
|
|
||||||
:cmEnd
|
|
||||||
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
|
|
||||||
:cmErrorLevel
|
|
||||||
exit /b %1
|
|
||||||
:cmDone
|
|
||||||
if %errorlevel% neq 0 goto :VCEnd
|
|
||||||
@ -1,358 +0,0 @@
|
|||||||
^C:\USERS\USER\CLIONPROJECTS\ARCDESKPROJECT\CMAKELISTS.TXT
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CMAKECXXINFORMATION.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CMAKECHECKCOMPILERFLAGCOMMONPATTERNS.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CMAKECOMMONLANGUAGEINCLUDE.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CMAKEFINDDEPENDENCYMACRO.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CMAKEGENERICSYSTEM.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CMAKEINITIALIZECONFIGS.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CMAKELANGUAGEINFORMATION.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CMAKERCINFORMATION.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CMAKESYSTEMSPECIFICINFORMATION.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CMAKESYSTEMSPECIFICINITIALIZE.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CHECKCXXCOMPILERFLAG.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CHECKCXXSOURCECOMPILES.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CHECKINCLUDEFILECXX.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\CHECKLIBRARYEXISTS.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\COMPILER\CMAKECOMMONCOMPILERMACROS.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\COMPILER\MSVC-CXX.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\COMPILER\MSVC.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\FINDCURL.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\FINDLIBARCHIVE.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\FINDPACKAGEHANDLESTANDARDARGS.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\FINDPACKAGEMESSAGE.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\FINDTHREADS.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\FINDVULKAN.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\FINDZLIB.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\GNUINSTALLDIRS.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\INTERNAL\CMAKECXXLINKERINFORMATION.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\INTERNAL\CMAKECOMMONLINKERINFORMATION.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\INTERNAL\CHECKCOMPILERFLAG.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\INTERNAL\CHECKFLAGCOMMONCONFIG.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\INTERNAL\CHECKSOURCECOMPILES.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\LINKER\MSVC-CXX.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\LINKER\MSVC.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\PLATFORM\LINKER\WINDOWS-MSVC-CXX.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\PLATFORM\LINKER\WINDOWS-MSVC.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\PLATFORM\WINDOWS-INITIALIZE.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\PLATFORM\WINDOWS-MSVC-CXX.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\PLATFORM\WINDOWS-MSVC.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\PLATFORM\WINDOWS.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\PLATFORM\WINDOWSPATHS.CMAKE
|
|
||||||
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-4.0\MODULES\SELECTLIBRARYCONFIGURATIONS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\FINDWRAPATOMIC.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\FINDWRAPVULKANHEADERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QT6CONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QT6CONFIGEXTRAS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QT6CONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QT6CONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QT6DEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QT6TARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QT6VERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTFEATURE.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTFEATURECOMMON.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTINSTALLPATHS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICANDROIDHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICAPPLEHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICCMAKEHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICCMAKEVERSIONHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICDEPENDENCYHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICEXTERNALPROJECTHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICFINALIZERHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICFINDPACKAGEHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICGITHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICPLUGINHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICPLUGINHELPERS_V2.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMATTRIBUTIONHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMCPEHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMDEPHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMFILEHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMGENERATIONHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMLICENSEHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMOPSHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMPURLHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMPYTHONHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMQTENTITYHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICSBOMSYSTEMDEPHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICTARGETHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICTESTHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICTOOLHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICWALKLIBSHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6\QTPUBLICWINDOWSHELPERS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORE\QT6COREADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORE\QT6CORECONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORE\QT6CORECONFIGEXTRAS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORE\QT6CORECONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORE\QT6CORECONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORE\QT6COREDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORE\QT6COREMACROS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORE\QT6CORETARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORE\QT6CORETARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORE\QT6CORETARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORE\QT6COREVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6COREPRIVATE\QT6COREPRIVATEADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6COREPRIVATE\QT6COREPRIVATECONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6COREPRIVATE\QT6COREPRIVATECONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6COREPRIVATE\QT6COREPRIVATECONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6COREPRIVATE\QT6COREPRIVATEDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6COREPRIVATE\QT6COREPRIVATETARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6COREPRIVATE\QT6COREPRIVATEVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORETOOLS\QT6CORETOOLSADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORETOOLS\QT6CORETOOLSCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORETOOLS\QT6CORETOOLSCONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORETOOLS\QT6CORETOOLSCONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORETOOLS\QT6CORETOOLSDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORETOOLS\QT6CORETOOLSTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORETOOLS\QT6CORETOOLSTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORETOOLS\QT6CORETOOLSTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6CORETOOLS\QT6CORETOOLSVERSIONLESSTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ENTRYPOINTPRIVATE\QT6ENTRYPOINTPRIVATEADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ENTRYPOINTPRIVATE\QT6ENTRYPOINTPRIVATECONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ENTRYPOINTPRIVATE\QT6ENTRYPOINTPRIVATECONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ENTRYPOINTPRIVATE\QT6ENTRYPOINTPRIVATECONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ENTRYPOINTPRIVATE\QT6ENTRYPOINTPRIVATETARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ENTRYPOINTPRIVATE\QT6ENTRYPOINTPRIVATETARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ENTRYPOINTPRIVATE\QT6ENTRYPOINTPRIVATETARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ENTRYPOINTPRIVATE\QT6ENTRYPOINTPRIVATEVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6GUIADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6GUICONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6GUICONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6GUICONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6GUIDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6GUIPLUGINS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6GUITARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6GUITARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6GUITARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6GUIVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QGIFPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QGIFPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QGIFPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QGIFPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QGIFPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QICOPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QICOPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QICOPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QICOPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QICOPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QJPEGPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QJPEGPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QJPEGPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QJPEGPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QJPEGPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QMINIMALINTEGRATIONPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QMINIMALINTEGRATIONPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QMINIMALINTEGRATIONPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QMINIMALINTEGRATIONPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QMINIMALINTEGRATIONPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QOFFSCREENINTEGRATIONPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QOFFSCREENINTEGRATIONPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QOFFSCREENINTEGRATIONPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QOFFSCREENINTEGRATIONPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QOFFSCREENINTEGRATIONPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QSVGICONPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QSVGICONPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QSVGICONPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QSVGICONPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QSVGICONPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QSVGPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QSVGPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QSVGPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QSVGPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QSVGPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QTUIOTOUCHPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QTUIOTOUCHPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QTUIOTOUCHPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QTUIOTOUCHPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QTUIOTOUCHPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QWINDOWSDIRECT2DINTEGRATIONPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QWINDOWSDIRECT2DINTEGRATIONPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QWINDOWSDIRECT2DINTEGRATIONPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QWINDOWSDIRECT2DINTEGRATIONPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QWINDOWSDIRECT2DINTEGRATIONPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QWINDOWSINTEGRATIONPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QWINDOWSINTEGRATIONPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QWINDOWSINTEGRATIONPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QWINDOWSINTEGRATIONPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUI\QT6QWINDOWSINTEGRATIONPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUIPRIVATE\QT6GUIPRIVATEADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUIPRIVATE\QT6GUIPRIVATECONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUIPRIVATE\QT6GUIPRIVATECONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUIPRIVATE\QT6GUIPRIVATECONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUIPRIVATE\QT6GUIPRIVATEDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUIPRIVATE\QT6GUIPRIVATETARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUIPRIVATE\QT6GUIPRIVATEVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUITOOLS\QT6GUITOOLSADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUITOOLS\QT6GUITOOLSCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUITOOLS\QT6GUITOOLSCONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUITOOLS\QT6GUITOOLSCONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUITOOLS\QT6GUITOOLSDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUITOOLS\QT6GUITOOLSTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUITOOLS\QT6GUITOOLSTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUITOOLS\QT6GUITOOLSTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6GUITOOLS\QT6GUITOOLSVERSIONLESSTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6NETWORKADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6NETWORKCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6NETWORKCONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6NETWORKCONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6NETWORKDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6NETWORKPLUGINS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6NETWORKTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6NETWORKTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6NETWORKTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6NETWORKVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QNLMNIPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QNLMNIPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QNLMNIPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QNLMNIPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QNLMNIPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QSCHANNELBACKENDPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QSCHANNELBACKENDPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QSCHANNELBACKENDPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QSCHANNELBACKENDPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QSCHANNELBACKENDPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QTLSBACKENDCERTONLYPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QTLSBACKENDCERTONLYPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QTLSBACKENDCERTONLYPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QTLSBACKENDCERTONLYPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QTLSBACKENDCERTONLYPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QTLSBACKENDOPENSSLPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QTLSBACKENDOPENSSLPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QTLSBACKENDOPENSSLPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QTLSBACKENDOPENSSLPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORK\QT6QTLSBACKENDOPENSSLPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORKPRIVATE\QT6NETWORKPRIVATEADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORKPRIVATE\QT6NETWORKPRIVATECONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORKPRIVATE\QT6NETWORKPRIVATECONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORKPRIVATE\QT6NETWORKPRIVATECONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORKPRIVATE\QT6NETWORKPRIVATEDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORKPRIVATE\QT6NETWORKPRIVATETARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6NETWORKPRIVATE\QT6NETWORKPRIVATEVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QIBASEDRIVERPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QIBASEDRIVERPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QIBASEDRIVERPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QIBASEDRIVERPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QIBASEDRIVERPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QMIMERSQLDRIVERPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QMIMERSQLDRIVERPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QMIMERSQLDRIVERPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QMIMERSQLDRIVERPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QMIMERSQLDRIVERPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QOCIDRIVERPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QOCIDRIVERPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QOCIDRIVERPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QOCIDRIVERPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QOCIDRIVERPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QODBCDRIVERPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QODBCDRIVERPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QODBCDRIVERPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QODBCDRIVERPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QODBCDRIVERPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QPSQLDRIVERPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QPSQLDRIVERPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QPSQLDRIVERPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QPSQLDRIVERPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QPSQLDRIVERPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QSQLITEDRIVERPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QSQLITEDRIVERPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QSQLITEDRIVERPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QSQLITEDRIVERPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6QSQLITEDRIVERPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6SQLADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6SQLCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6SQLCONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6SQLCONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6SQLDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6SQLPLUGINS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6SQLTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6SQLTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6SQLTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQL\QT6SQLVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQLPRIVATE\QT6SQLPRIVATEADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQLPRIVATE\QT6SQLPRIVATECONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQLPRIVATE\QT6SQLPRIVATECONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQLPRIVATE\QT6SQLPRIVATECONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQLPRIVATE\QT6SQLPRIVATEDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQLPRIVATE\QT6SQLPRIVATETARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6SQLPRIVATE\QT6SQLPRIVATEVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6QMODERNWINDOWSSTYLEPLUGINADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6QMODERNWINDOWSSTYLEPLUGINCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6QMODERNWINDOWSSTYLEPLUGINTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6QMODERNWINDOWSSTYLEPLUGINTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6QMODERNWINDOWSSTYLEPLUGINTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6WIDGETSADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6WIDGETSCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6WIDGETSCONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6WIDGETSCONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6WIDGETSDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6WIDGETSMACROS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6WIDGETSPLUGINS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6WIDGETSTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6WIDGETSTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6WIDGETSTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETS\QT6WIDGETSVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSPRIVATE\QT6WIDGETSPRIVATEADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSPRIVATE\QT6WIDGETSPRIVATECONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSPRIVATE\QT6WIDGETSPRIVATECONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSPRIVATE\QT6WIDGETSPRIVATECONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSPRIVATE\QT6WIDGETSPRIVATEDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSPRIVATE\QT6WIDGETSPRIVATETARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSPRIVATE\QT6WIDGETSPRIVATEVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSTOOLS\QT6WIDGETSTOOLSADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSTOOLS\QT6WIDGETSTOOLSCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSTOOLS\QT6WIDGETSTOOLSCONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSTOOLS\QT6WIDGETSTOOLSCONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSTOOLS\QT6WIDGETSTOOLSDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSTOOLS\QT6WIDGETSTOOLSTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSTOOLS\QT6WIDGETSTOOLSTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSTOOLS\QT6WIDGETSTOOLSTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6WIDGETSTOOLS\QT6WIDGETSTOOLSVERSIONLESSTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XML\QT6XMLADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XML\QT6XMLCONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XML\QT6XMLCONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XML\QT6XMLCONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XML\QT6XMLDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XML\QT6XMLTARGETS-DEBUG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XML\QT6XMLTARGETS-RELWITHDEBINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XML\QT6XMLTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XML\QT6XMLVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XMLPRIVATE\QT6XMLPRIVATEADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XMLPRIVATE\QT6XMLPRIVATECONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XMLPRIVATE\QT6XMLPRIVATECONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XMLPRIVATE\QT6XMLPRIVATECONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XMLPRIVATE\QT6XMLPRIVATEDEPENDENCIES.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XMLPRIVATE\QT6XMLPRIVATETARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6XMLPRIVATE\QT6XMLPRIVATEVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ZLIBPRIVATE\QT6ZLIBPRIVATEADDITIONALTARGETINFO.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ZLIBPRIVATE\QT6ZLIBPRIVATECONFIG.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ZLIBPRIVATE\QT6ZLIBPRIVATECONFIGVERSION.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ZLIBPRIVATE\QT6ZLIBPRIVATECONFIGVERSIONIMPL.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ZLIBPRIVATE\QT6ZLIBPRIVATETARGETS.CMAKE
|
|
||||||
C:\QT\6.9.0\MSVC2022_64\LIB\CMAKE\QT6ZLIBPRIVATE\QT6ZLIBPRIVATEVERSIONLESSALIASTARGETS.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\WEBP\WEBPCONFIG.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\WEBP\WEBPCONFIGVERSION.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\WEBP\WEBPTARGETS-DEBUG.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\WEBP\WEBPTARGETS-RELEASE.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\WEBP\WEBPTARGETS.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\CURL\CURLCONFIG.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\CURL\CURLCONFIGVERSION.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\CURL\CURLTARGETS-DEBUG.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\CURL\CURLTARGETS-RELEASE.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\CURL\CURLTARGETS.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\LEPTONICA\LEPTONICACONFIG-VERSION.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\LEPTONICA\LEPTONICACONFIG.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\LEPTONICA\LEPTONICATARGETS-DEBUG.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\LEPTONICA\LEPTONICATARGETS-RELEASE.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\LEPTONICA\LEPTONICATARGETS.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\OPENJPEG\OPENJPEGCONFIG.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\OPENJPEG\OPENJPEGCONFIGVERSION.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\OPENJPEG\OPENJPEGTARGETS-DEBUG.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\OPENJPEG\OPENJPEGTARGETS-RELEASE.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\OPENJPEG\OPENJPEGTARGETS.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\TESSERACT\TESSERACTCONFIG.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\TESSERACT\TESSERACTCONFIGVERSION.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\TESSERACT\TESSERACTTARGETS-DEBUG.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\TESSERACT\TESSERACTTARGETS-RELEASE.CMAKE
|
|
||||||
C:\USERS\USER\.VCPKG-CLION\VCPKG\INSTALLED\X64-WINDOWS\SHARE\TESSERACT\TESSERACTTARGETS.CMAKE
|
|
||||||
C:\USERS\USER\CLIONPROJECTS\ARCDESKPROJECT\BUILD_X64\CMAKEFILES\4.0.2\CMAKECXXCOMPILER.CMAKE
|
|
||||||
C:\USERS\USER\CLIONPROJECTS\ARCDESKPROJECT\BUILD_X64\CMAKEFILES\4.0.2\CMAKERCCOMPILER.CMAKE
|
|
||||||
C:\USERS\USER\CLIONPROJECTS\ARCDESKPROJECT\BUILD_X64\CMAKEFILES\4.0.2\CMAKESYSTEM.CMAKE
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
^C:\USERS\USER\CLIONPROJECTS\ARCDESKPROJECT\CMAKELISTS.TXT
|
|
||||||
C:\USERS\USER\CLIONPROJECTS\ARCDESKPROJECT\BUILD_X64\CMAKEFILES\GENERATE.STAMP
|
|
||||||
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@ -1,14 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project>
|
|
||||||
<ProjectOutputs>
|
|
||||||
<ProjectOutput>
|
|
||||||
<FullPath>C:\Users\User\CLionProjects\ARCDeskProject\build_x64\x64\Release\ZERO_CHECK</FullPath>
|
|
||||||
</ProjectOutput>
|
|
||||||
<ProjectOutput>
|
|
||||||
<FullPath>C:\Users\User\CLionProjects\ARCDeskProject\build_x64\Release\ARCDesktopProject.exe</FullPath>
|
|
||||||
</ProjectOutput>
|
|
||||||
</ProjectOutputs>
|
|
||||||
<ContentFiles />
|
|
||||||
<SatelliteDlls />
|
|
||||||
<NonRecipeFileRefs />
|
|
||||||
</Project>
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user