/* common/KMFile.h
 *
 * Copyright (C) 2023 OpenKylin, Inc
 */

#ifndef __KMFILE_H__
#define __KMFILE_H__

#include <gio/gio.h>

#include <memory>
#include <string>
#include <vector>

#include "KMFileEnumerator.h"
#include "KMFileInfo.h"
#include "KMVariantDict.h"

/**
 * @brief : 对GFile的简单封装
 * @note  : g_file_开头的函数都可以迁移进来
 */
class KMFile
{
public:
    KMFile();
    KMFile(const std::string &filename);
    KMFile(const KMFile &other);
    KMFile(KMFile &&other);
    KMFile(GFile *file);
    ~KMFile();

    KMFile &operator=(const KMFile &other);
    KMFile &operator=(KMFile &&other);
    KMFile &operator=(GFile *file);

    operator bool() const { return d.operator bool(); }

    GFile *get();

    bool queryExists();

    // 将文件的内容加载到内存中。数据总是以零结尾，但这不包括在结果长度中。注：适用于文本文件。
    bool loadContents(std::string &contents);
    // 将文件的内容加载到内存中。数据总是以零结尾，但这不包括在结果长度中。
    bool loadContents(KMVariant &contents, const std::string &formatOfType = "s");

    // 查询文件信息
    KMFileInfo queryInfo(const std::string &attributes, GFileQueryInfoFlags flags = G_FILE_QUERY_INFO_NONE);

    // 获取所请求的有关目录中文件的信息。结果是一个KMFileEnumerator对象，它将为目录中的所有文件提供KMFileInfo对象。
    KMFileEnumerator children(const char *attributes, GFileQueryInfoFlags flags);

    // 获取basename等于name的文件的子级。
    KMFile getChild(const std::string &name);

    std::string getPath();

    // 获取最后一次错误信息
    std::string errorMessage() const;
    int errorCode() const;

private:
    class Private;
    std::shared_ptr<Private> d = nullptr;
};

#endif // !__KMFILE_H__
