chsrc/src/framework/struct.h
2025-08-09 20:31:38 +08:00

212 lines
7.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/** ------------------------------------------------------------
* SPDX-License-Identifier: GPL-3.0-or-later
* -------------------------------------------------------------
* File Name : struct.h
* File Authors : Aoran Zeng <ccmywish@qq.com>
* | Heng Guo <2085471348@qq.com>
* Contributors : Shengwei Chen <414685209@qq.com>
* |
* Created On : <2023-08-29>
* Last Modified : <2025-08-09>
*
* chsrc struct
* ------------------------------------------------------------*/
typedef struct ProviderSpeedMeasureInfo_t
{
bool skip; /* 是否默认跳过 */
char *skip_reason_CN; /* 跳过的原因(中文)*/
char *skip_reason_EN; /* 跳过的原因(英文)*/
char *url; /* 测速链接 */
bool accurate; /* 是否为精准测速,上游源和专用镜像站为 ACCURATE通用镜像站为 ROUGH */
}
ProviderSpeedMeasureInfo_t;
#define SKIP true
#define NotSkip false
#define ToFill NULL
#define NA NULL
#define ACCURATE true
#define ROUGH false
typedef enum ProviderType_t
{
IS_GeneralMirrorSite, /* 通用镜像站 */
IS_DedicatedMirrorSite, /* 专用镜像站 */
IS_UpstreamProvider, /* 上游默认源 */
IS_UserDefinedProvider, /* 用户提供 */
}
ProviderType_t;
typedef struct SourceProvider_t
{
const ProviderType_t type; /* 类型 */
const char *code; /* 用于用户指定某一 Provider */
const char *abbr; /* 需要使用 Provider 的英文名时,用这个代替,因为大部分 Provider 没有提供正式的英文名 */
const char *name; /* Provider 中文名 */
const char *site; /* Provider 首页 */
ProviderSpeedMeasureInfo_t psmi;
}
SourceProvider_t;
typedef SourceProvider_t MirrorSite_t;
SourceProvider_t UpstreamProvider =
{
IS_UpstreamProvider,
/* 引入新的上游默认源时,请使下面第一行的前三个字段保持不变,只添加第四个字段,可使用 def_upstream 宏 */
"upstream", "Upstream", "上游默认源", NULL,
/* 引入新的上游默认源时,请完全修改下面这个结构体,可使用 def_need_measure_info 宏 */
{SKIP, "URL未知邀您参与贡献!", "URL unknown, welcome to contribute!", NULL, ACCURATE}
};
#define def_upstream IS_UpstreamProvider, "upstream", "Upstream", "上游默认源"
#define def_need_measure_info {SKIP, "缺乏较大的测速对象,邀您参与贡献!", "Lack of large object URL, welcome to contribute!", NULL, ACCURATE}
SourceProvider_t UserDefinedProvider =
{
IS_UserDefinedProvider,
"user", "用户自定义", "用户自定义", NULL,
{SKIP, "用户自定义源不测速", "SKIP for user-defined source", NULL, ACCURATE}
};
typedef struct Source_t
{
union {
SourceProvider_t *provider;
MirrorSite_t *mirror;
};
/* 用于换源的 URL */
char *url;
/* 对该 source 的专用测速链接,这就是精准测速 */
char *speed_measure_url;
}
Source_t;
/* 不用给专用测速链接,因为 Upstream 的整体测速链接已是精准测速 */
#define DelegateToUpstream NULL
/* 不用给专用测速链接,因为该镜像站是专用镜像站,其整体测速链接已是精准测速 */
#define DelegateToMirror NULL
/* 看到该注释的贡献者,你可以帮忙寻找专用测速链接 */
#define NeedContribute NULL
/* 由 _sources_prepare 填充 */
#define FeedBySourcesPrepare NULL
/* 由 prelude() 修改 */
#define ChangedByPrelude NULL
#define def_sources_n(t) const size_t t##_sources_n = xy_arylen(t##_sources)
typedef enum Capability_t
{
CanNot,
FullyCan,
PartiallyCan
}
Capability_t;
/* Target Feature */
typedef struct Feature_t
{
bool can_get;
bool can_reset; /* 有的reset不是暂时没有实现而是现在的实现根本就无法重置 */
bool can_english;
bool can_user_define;
Capability_t cap_locally;
char *cap_locally_explain;
char *note;
}
Feature_t;
typedef struct Contributor_t
{
char *name;
char *email;
}
Contributor_t;
typedef struct Target_t
{
void (*getfn) (char *option);
void (*setfn) (char *option);
void (*resetfn) (char *option);
Feature_t (*featfn) (char *option);
Source_t *sources;
size_t sources_n;
bool can_english; /* 是否支持英文输出 */
bool can_user_define; /* 是否支持用户自定义URL来换源 */
Capability_t cap_local; /* 是否支持 local mode */
char *cap_local_explain; /* local mode 的说明 */
char *note; /* 备注 */
Contributor_t *recipe_authors;
size_t recipe_authors_n;
Contributor_t *contributors;
size_t contributors_n;
Contributor_t *current_chef; // 只有一个主维护者
Contributor_t *current_sous_chefs; // 可以有多个副维护者
size_t current_sous_chefs_n;
char *recipe_created_on;
char *recipe_last_updated;
char *sources_last_updated;
}
Target_t;
typedef struct TargetRegisterInfo_t
{
Target_t *target; /* target 本身 */
void (*prelude) (void); /* 填充 target 信息等预置操作 */
char *aliases; /* 以空格分隔的 alias 字符串 */
}
TargetRegisterInfo_t;
#define def_target_inner_s(t) NULL, t##_setsrc, NULL, NULL
#define def_target_inner_sr(t) NULL, t##_setsrc, t##_resetsrc, NULL
#define def_target_inner_sf(t) NULL, t##_setsrc, NULL, t##_feat
#define def_target_inner_srf(t) NULL, t##_setsrc, t##_resetsrc, t##_feat
#define def_target_inner_gs(t) t##_getsrc, t##_setsrc, NULL, NULL
#define def_target_inner_gsr(t) t##_getsrc, t##_setsrc, t##_resetsrc, NULL
#define def_target_inner_gsf(t) t##_getsrc, t##_setsrc, NULL, t##_feat
#define def_target_inner_gsrf(t) t##_getsrc, t##_setsrc, t##_resetsrc, t##_feat
#define def_target_sourcesn(t) t##_sources, t##_sources_n
/* 大部分target还不支持reset所以暂时先默认设置为NULL来过渡 */
#define def_target(t) Target_t t##_target = {def_target_inner_gs(t),def_target_sourcesn(t)}
#define def_target_s(t) Target_t t##_target = {def_target_inner_s(t),def_target_sourcesn(t)}
#define def_target_sr(t) Target_t t##_target = {def_target_inner_sr(t),def_target_sourcesn(t)}
#define def_target_sf(t) Target_t t##_target = {def_target_inner_sf(t),def_target_sourcesn(t)}
#define def_target_srf(t) Target_t t##_target = {def_target_inner_srf(t),def_target_sourcesn(t)}
#define def_target_gs(t) Target_t t##_target = {def_target_inner_gs(t),def_target_sourcesn(t)}
#define def_target_gsr(t) Target_t t##_target = {def_target_inner_gsr(t),def_target_sourcesn(t)}
#define def_target_gsf(t) Target_t t##_target = {def_target_inner_gsf(t),def_target_sourcesn(t)}
#define def_target_gsrf(t) Target_t t##_target = {def_target_inner_gsrf(t),def_target_sourcesn(t)}
#define define_target(t) void t##_getsrc(char *option);void t##_setsrc(char *option);void t##_resetsrc(char *option); Target_t t##_target={0};
/* 以下宏仅能放在 prelude() 中使用 */
#define use_this(t) Target_t *this = &t##_target;
#define def_sources_begin() Source_t sources[] = {
#define def_sources_end() }; this->sources = sources; this->sources_n = xy_arylen(sources);
#define def_upstream_provider(url) SourceProvider_t upstream = UpstreamProvider; upstream.site = url;