34#define U BLI_STATIC_ASSERT(false, "Global 'U' not allowed, only use arguments passed in!")
73 sizeof(library->
name));
101 return asset_lib_pref;
127 library->
dirpath,
sizeof(library->
dirpath), documents_path,
N_(
"Blender"),
N_(
"Assets"));
141 const size_t dst_len_max = dst_maxncpy - 1;
143 size_t i_src = 0, i_dst = 0;
144 while (src[i_src] && (i_dst < dst_len_max)) {
145 const char c = src[i_src++];
146 const bool is_alpha = (c >=
'a' && c <=
'z') || (c >=
'A' && c <=
'Z');
148 if (i_dst == 0 && !is_alpha) {
151 const bool is_num = (is_alpha ==
false) && ((c >=
'0' && c <=
'9') || c ==
'_');
152 if (!(is_alpha || is_num)) {
164 const char *custom_dirpath)
183 if (repo == repo_iter) {
203 userdef,
"extensions.blender.org",
"blender_org",
"");
215 userdef,
"User Default",
"user_default",
"");
239 name =
"User Repository";
273 if (module_len == 0) {
289 const int dirpath_maxncpy)
295 std::optional<std::string> path = std::nullopt;
323 const int dirpath_maxncpy)
328 return BLI_path_join(dirpath, dirpath_maxncpy, path.value().c_str(),
".user", repo->
module);
348 if (ch >= 32 && ch <= 44) {
352 if (ch >= 58 && ch <= 64) {
355 if (
ELEM(ch,
'/',
'\\')) {
362 const UserDef *userdef,
const char *remote_url_full,
const bool only_enabled)
364 const int path_full_len = strlen(remote_url_full);
376 if (repo->remote_url[0] ==
'\0') {
381 const char *path_repo = repo->remote_url;
382 const char *path_test = remote_url_full;
383 int path_test_len = path_full_len;
387 if (path_full_offset) {
389 if (path_repo_offset) {
390 path_repo += path_repo_offset;
391 path_test += path_full_offset;
392 path_test_len -= path_full_offset;
397 int path_repo_len = strlen(path_repo);
398 while (path_repo_len &&
ELEM(path_repo[path_repo_len - 1],
'/',
'\\')) {
402 if (path_test_len <= path_repo_len) {
405 if (memcmp(path_repo, path_test, path_repo_len) != 0) {
422 const char *scheme_check[] = {
427 for (
int i = 0; i <
ARRAY_SIZE(scheme_check); i++) {
428 const char *scheme = scheme_check[i];
429 int scheme_len = strlen(scheme);
430 if (strncmp(url, scheme, scheme_len) == 0) {
431 return scheme_len - 3;
441 const bool is_win32 =
true;
443 const bool is_win32 =
false;
445 const bool is_file =
STRPREFIX(remote_url,
"file://");
449 remote_url += (offset + 3);
455 if (remote_url[0] ==
'/' && isalpha(remote_url[1]) && (remote_url[2] ==
':')) {
461 if (
UNLIKELY(remote_url[0] ==
'\0')) {
465 const char *c = remote_url;
528 const char *shelf_idname)
532 STRNCPY(settings->shelf_idname, shelf_idname);
538 const char *shelf_idname)
549 const char *shelf_idname)
558 const char *shelf_idname,
559 const char *catalog_path)
570 const char *shelf_idname,
571 const char *catalog_path)
574 userdef, shelf_idname, catalog_path))
std::optional< std::string > BKE_appdir_folder_id_user_notest(int folder_id, const char *subfolder) ATTR_WARN_UNUSED_RESULT
bool BKE_appdir_folder_documents(char *dir) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
@ BLENDER_USER_EXTENSIONS
@ BLENDER_SYSTEM_EXTENSIONS
std::optional< std::string > BKE_appdir_folder_id(int folder_id, const char *subfolder) ATTR_WARN_UNUSED_RESULT
bool BKE_asset_catalog_path_list_has_path(const ListBase &catalog_path_list, const char *catalog_path)
void BKE_asset_catalog_path_list_add_path(ListBase &catalog_path_list, const char *catalog_path)
#define BKE_PREFS_ASSET_LIBRARY_DEFAULT_NAME
File and directory operations.
bool BLI_is_file(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
bool BLI_path_parent_dir(char *path) ATTR_NONNULL(1)
void void void const char * BLI_path_basename(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
void BLI_path_slash_native(char *path) ATTR_NONNULL(1)
int BLI_path_normalize(char *path) ATTR_NONNULL(1)
bool BLI_path_contains(const char *container_path, const char *containee_path) ATTR_NONNULL(1
#define BLI_path_join(...)
void BLI_path_slash_rstrip(char *path) ATTR_NONNULL(1)
#define STRNCPY(dst, src)
int char char int int int int size_t BLI_strnlen(const char *str, size_t maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
char char size_t BLI_strncpy_rlen(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
char * BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define STRNCPY_UTF8(dst, src)
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
void BLO_read_string(BlendDataReader *reader, char **ptr_p)
void BLO_write_string(BlendWriter *writer, const char *data_ptr)
#define DNA_struct_default_alloc(struct_name)
@ USER_EXTENSION_REPO_SOURCE_SYSTEM
@ USER_EXTENSION_REPO_SOURCE_USER
@ USER_EXTENSION_REPO_FLAG_DISABLED
@ USER_EXTENSION_REPO_FLAG_USE_CUSTOM_DIRECTORY
@ USER_EXTENSION_REPO_FLAG_SYNC_ON_STARTUP
@ USER_EXTENSION_REPO_FLAG_USE_REMOTE_URL
Read Guarded memory(de)allocation.
void BKE_preferences_extension_remote_to_name(const char *remote_url, char name[sizeof(bUserExtensionRepo::name)])
bUserExtensionRepo * BKE_preferences_extension_repo_find_by_remote_url_prefix(const UserDef *userdef, const char *remote_url_full, const bool only_enabled)
bool BKE_preferences_extension_repo_module_is_valid(const bUserExtensionRepo *repo)
bUserAssetLibrary * BKE_preferences_asset_library_find_by_name(const UserDef *userdef, const char *name)
bUserExtensionRepo * BKE_preferences_extension_repo_find_by_module(const UserDef *userdef, const char *module)
void BKE_preferences_asset_library_default_add(UserDef *userdef)
size_t BKE_preferences_extension_repo_user_dirpath_get(const bUserExtensionRepo *repo, char *dirpath, const int dirpath_maxncpy)
void BKE_preferences_extension_repo_write_data(BlendWriter *writer, const bUserExtensionRepo *repo)
void BKE_preferences_extension_repo_module_set(UserDef *userdef, bUserExtensionRepo *repo, const char *module)
static size_t strncpy_py_module(char *dst, const char *src, const size_t dst_maxncpy)
int BKE_preferences_extension_repo_remote_scheme_end(const char *url)
bool BKE_preferences_asset_shelf_settings_is_catalog_path_enabled(const UserDef *userdef, const char *shelf_idname, const char *catalog_path)
void BKE_preferences_asset_library_path_set(bUserAssetLibrary *library, const char *path)
bUserAssetLibrary * BKE_preferences_asset_library_find_index(const UserDef *userdef, int index)
bUserExtensionRepo * BKE_preferences_extension_repo_add(UserDef *userdef, const char *name, const char *module, const char *custom_dirpath)
bUserExtensionRepo * BKE_preferences_extension_repo_find_index(const UserDef *userdef, int index)
size_t BKE_preferences_extension_repo_dirpath_get(const bUserExtensionRepo *repo, char *dirpath, const int dirpath_maxncpy)
static bool url_char_is_delimiter(const char ch)
bUserAssetShelfSettings * BKE_preferences_asset_shelf_settings_get(const UserDef *userdef, const char *shelf_idname)
int BKE_preferences_extension_repo_get_index(const UserDef *userdef, const bUserExtensionRepo *repo)
void BKE_preferences_extension_repo_remove(UserDef *userdef, bUserExtensionRepo *repo)
int BKE_preferences_asset_library_get_index(const UserDef *userdef, const bUserAssetLibrary *library)
void BKE_preferences_extension_repo_add_defaults_all(UserDef *userdef)
bUserAssetLibrary * BKE_preferences_asset_library_containing_path(const UserDef *userdef, const char *path)
bUserExtensionRepo * BKE_preferences_extension_repo_add_default_user(UserDef *userdef)
bUserAssetLibrary * BKE_preferences_asset_library_add(UserDef *userdef, const char *name, const char *dirpath)
bUserExtensionRepo * BKE_preferences_extension_repo_add_default_system(UserDef *userdef)
void BKE_preferences_extension_repo_read_data(BlendDataReader *reader, bUserExtensionRepo *repo)
void BKE_preferences_asset_library_name_set(UserDef *userdef, bUserAssetLibrary *library, const char *name)
void BKE_preferences_extension_repo_name_set(UserDef *userdef, bUserExtensionRepo *repo, const char *name)
bUserExtensionRepo * BKE_preferences_extension_repo_add_default_remote(UserDef *userdef)
void BKE_preferences_asset_library_remove(UserDef *userdef, bUserAssetLibrary *library)
bool BKE_preferences_asset_shelf_settings_ensure_catalog_path_enabled(UserDef *userdef, const char *shelf_idname, const char *catalog_path)
static bUserAssetShelfSettings * asset_shelf_settings_ensure(UserDef *userdef, const char *shelf_idname)
static bUserAssetShelfSettings * asset_shelf_settings_new(UserDef *userdef, const char *shelf_idname)
void BKE_preferences_extension_repo_custom_dirpath_set(bUserExtensionRepo *repo, const char *path)
static struct PyModuleDef module
struct ListBase asset_shelves_settings
struct ListBase extension_repos
struct ListBase asset_libraries
char custom_dirpath[1024]