File indexing completed on 2024-04-14 04:52:21

0001 /*
0002  * SPDX-FileCopyrightText: 2022 Kai Uwe Broulik <kde@broulik.de>
0003  * SPDX-License-Identifier: GPL-2.0-or-later
0004  */
0005 
0006 #include "afcspringboard.h"
0007 #include "afcutils.h"
0008 
0009 #include "afc_debug.h"
0010 
0011 #include <QScopeGuard>
0012 
0013 #include <libimobiledevice/sbservices.h>
0014 
0015 using namespace KIO;
0016 
0017 static const char s_lockdownLabel[] = "kio_afc";
0018 
0019 AfcSpringBoard::AfcSpringBoard(idevice_t device, lockdownd_client_t lockdowndClient)
0020 {
0021     auto lockdownRet = lockdownd_start_service(lockdowndClient, SBSERVICES_SERVICE_NAME, &m_springBoardService);
0022     if (lockdownRet != LOCKDOWN_E_SUCCESS) {
0023         qCWarning(KIO_AFC_LOG) << "Failed to start sbservices for getting app icons" << lockdownRet;
0024         m_result = AfcUtils::Result::from(lockdownRet);
0025         return;
0026     }
0027 
0028     auto springBoardRet = sbservices_client_new(device, m_springBoardService, &m_springBoardClient);
0029     if (springBoardRet != SBSERVICES_E_SUCCESS) {
0030         qCWarning(KIO_AFC_LOG) << "Failed to create sbservices instance for getting app icons" << springBoardRet;
0031         m_result = AfcUtils::Result::from(springBoardRet);
0032         return;
0033     }
0034 
0035     m_result = WorkerResult::pass();
0036 }
0037 
0038 AfcSpringBoard::~AfcSpringBoard()
0039 {
0040     if (m_springBoardClient) {
0041         sbservices_client_free(m_springBoardClient);
0042     }
0043     if (m_springBoardService) {
0044         lockdownd_service_descriptor_free(m_springBoardService);
0045     }
0046 }
0047 
0048 WorkerResult AfcSpringBoard::result() const
0049 {
0050     return m_result;
0051 }
0052 
0053 WorkerResult AfcSpringBoard::fetchAppIconData(const QString &bundleId, QByteArray &data)
0054 {
0055     Q_ASSERT(m_springBoardClient);
0056 
0057     char *rawData = nullptr;
0058     uint64_t len = 0;
0059 
0060     auto dataCleanup = qScopeGuard([rawData] {
0061         free(rawData);
0062     });
0063 
0064     auto ret = sbservices_get_icon_pngdata(m_springBoardClient, bundleId.toUtf8().constData(), &rawData, &len);
0065     if (ret != SBSERVICES_E_SUCCESS || !rawData || len == 0) {
0066         qCWarning(KIO_AFC_LOG) << "Failed to get pngdata from" << bundleId << ret;
0067         return AfcUtils::Result::from(ret);
0068     }
0069 
0070     data = QByteArray::fromRawData(rawData, len);
0071     return WorkerResult::pass();
0072 }