C

Qt Quick Ultralite fileloading Example

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial
#include "ff.h"
#include "ff_gen_drv.h"

#include <platforminterface/allocator.h>
#include <platforminterface/filesystem.h>

class FatFsFile : public Qul::PlatformInterface::File
{
public:
    FatFsFile(FIL fileHandle)
        : m_fileHandle(fileHandle)
        , m_valid(true)
    {}

    ~FatFsFile() { close(); }

    uint64_t size() QUL_DECL_OVERRIDE
    {
        if (!m_valid)
            return 0;

        return f_size(&m_fileHandle);
    }

    int read(unsigned char *outputBuffer, uint64_t startOffset, unsigned int readSize) QUL_DECL_OVERRIDE
    {
        if (!m_valid)
            return -1;

        UINT bytesRead;

        if (f_lseek(&m_fileHandle, startOffset) != FR_OK)
            return -1;

        if (f_read(&m_fileHandle, outputBuffer, readSize, &bytesRead) != FR_OK)
            return -1;

        return bytesRead;
    }

    int close() QUL_DECL_OVERRIDE
    {
        if (!m_valid)
            return -1;

        m_valid = false;
        return f_close(&m_fileHandle);
    }

private:
    FIL m_fileHandle;
    bool m_valid;
};

class FatFsFilesystem : public Qul::PlatformInterface::Filesystem
{
public:
    Qul::PlatformInterface::File *open(const char *fileName, Qul::PlatformInterface::File::Mode) QUL_DECL_OVERRIDE
    {
        FRESULT fr;
        FIL fp;

        fr = f_open(&fp, fileName, FA_READ | FA_OPEN_ALWAYS);
        if (fr == FR_OK)
            return Qul::PlatformInterface::qul_new<FatFsFile>(fp);

        return NULL;
    }
};