seafile/daemon/http-tx-mgr.h
feiniks 8e0e9ce76b
Checkout file directly (#2781)
* Checkout file directly

Add download progress

Return error when cancel task

Check if usr is NULL when get notif server

Adjust code struct

Checkout file from offset

Don't use http task

Adjust function parameters

* Support set file_id attr to tmp file

* user error_id to check failed

---------

Co-authored-by: yangheran <heran.yang@seafile.com>
2024-07-03 16:46:58 +08:00

369 lines
11 KiB
C

#ifndef HTTP_TX_MGR_H
#define HTTP_TX_MGR_H
#include <pthread.h>
enum {
HTTP_TASK_TYPE_DOWNLOAD = 0,
HTTP_TASK_TYPE_UPLOAD,
};
/**
* The state that can be set by user.
*
* A task in NORMAL state can be canceled;
* A task in RT_STATE_FINISHED can be removed.
*/
enum HttpTaskState {
HTTP_TASK_STATE_NORMAL = 0,
HTTP_TASK_STATE_CANCELED,
HTTP_TASK_STATE_FINISHED,
HTTP_TASK_STATE_ERROR,
N_HTTP_TASK_STATE,
};
enum HttpTaskRuntimeState {
HTTP_TASK_RT_STATE_INIT = 0,
HTTP_TASK_RT_STATE_CHECK,
HTTP_TASK_RT_STATE_COMMIT,
HTTP_TASK_RT_STATE_FS,
HTTP_TASK_RT_STATE_BLOCK, /* Only used in upload. */
HTTP_TASK_RT_STATE_UPDATE_BRANCH, /* Only used in upload. */
HTTP_TASK_RT_STATE_FINISHED,
N_HTTP_TASK_RT_STATE,
};
struct _SeafileSession;
struct _HttpTxPriv;
struct _HttpTxManager {
struct _SeafileSession *seaf;
struct _HttpTxPriv *priv;
};
typedef struct _HttpTxManager HttpTxManager;
struct _HttpTxTask {
HttpTxManager *manager;
char repo_id[37];
int repo_version;
char *repo_name;
char *token;
int protocol_version;
int type;
char *host;
gboolean is_clone;
char *email;
char *username;
gboolean use_fileserver_port;
char head[41];
char *passwd;
char *worktree;
int state;
int runtime_state;
int error;
/* Used to signify stop transfer for all threads. */
gboolean all_stop;
/* When downloading with multi-thread, a block may be shared by
* multiple files. We can't remove a block before all *fetched* files with
* this block have been checked out.
* block_id -> ref_count.
*/
GHashTable *blk_ref_cnts;
pthread_mutex_t ref_cnt_lock;
/* For clone fs object progress */
int n_fs_objs;
int done_fs_objs;
/* For upload progress */
int n_blocks;
int done_blocks;
/* For download progress */
gint64 total_download;
gint64 done_download;
gint tx_bytes; /* bytes transferred in this second. */
gint last_tx_bytes; /* bytes transferred in the last second. */
};
typedef struct _HttpTxTask HttpTxTask;
HttpTxTask *
http_tx_task_new (HttpTxManager *mgr,
const char *repo_id,
int repo_version,
int type,
gboolean is_clone,
const char *host,
const char *token,
const char *passwd,
const char *worktree);
void
http_tx_task_free (HttpTxTask *task);
HttpTxManager *
http_tx_manager_new (struct _SeafileSession *seaf);
int
http_tx_manager_start (HttpTxManager *mgr);
int
http_tx_manager_add_download (HttpTxManager *manager,
const char *repo_id,
int repo_version,
const char *host,
const char *token,
const char *server_head_id,
gboolean is_clone,
const char *passwd,
const char *worktree,
int protocol_version,
const char *email,
const char *username,
gboolean use_fileserver_port,
const char *repo_name,
GError **error);
int
http_tx_manager_add_upload (HttpTxManager *manager,
const char *repo_id,
int repo_version,
const char *host,
const char *token,
int protocol_version,
gboolean use_fileserver_port,
GError **error);
struct _HttpProtocolVersion {
gboolean check_success; /* TRUE if we get response from the server. */
gboolean not_supported;
int version;
int error_code;
};
typedef struct _HttpProtocolVersion HttpProtocolVersion;
typedef void (*HttpProtocolVersionCallback) (HttpProtocolVersion *result,
void *user_data);
/* Asynchronous interface for getting protocol version from a server.
* Also used to determine if the server support http sync.
*/
int
http_tx_manager_check_protocol_version (HttpTxManager *manager,
const char *host,
gboolean use_fileserver_port,
HttpProtocolVersionCallback callback,
void *user_data);
typedef void (*HttpNotifServerCallback) (gboolean is_alive,
void *user_data);
int
http_tx_manager_check_notif_server (HttpTxManager *manager,
const char *host,
gboolean use_fileserver_port,
HttpNotifServerCallback callback,
void *user_data);
struct _HttpHeadCommit {
gboolean check_success;
gboolean is_corrupt;
gboolean is_deleted;
char head_commit[41];
int error_code;
};
typedef struct _HttpHeadCommit HttpHeadCommit;
typedef void (*HttpHeadCommitCallback) (HttpHeadCommit *result,
void *user_data);
/* Asynchronous interface for getting head commit info from a server. */
int
http_tx_manager_check_head_commit (HttpTxManager *manager,
const char *repo_id,
int repo_version,
const char *host,
const char *token,
gboolean use_fileserver_port,
HttpHeadCommitCallback callback,
void *user_data);
typedef struct _HttpFolderPermReq {
char repo_id[37];
char *token;
gint64 timestamp;
} HttpFolderPermReq;
typedef struct _HttpFolderPermRes {
char repo_id[37];
gint64 timestamp;
GList *user_perms;
GList *group_perms;
} HttpFolderPermRes;
void
http_folder_perm_req_free (HttpFolderPermReq *req);
void
http_folder_perm_res_free (HttpFolderPermRes *res);
struct _HttpFolderPerms {
gboolean success;
GList *results; /* List of HttpFolderPermRes */
};
typedef struct _HttpFolderPerms HttpFolderPerms;
typedef void (*HttpGetFolderPermsCallback) (HttpFolderPerms *result,
void *user_data);
/* Asynchronous interface for getting folder permissions for a repo. */
int
http_tx_manager_get_folder_perms (HttpTxManager *manager,
const char *host,
gboolean use_fileserver_port,
GList *folder_perm_requests, /* HttpFolderPermReq */
HttpGetFolderPermsCallback callback,
void *user_data);
typedef struct _HttpLockedFilesReq {
char repo_id[37];
char *token;
gint64 timestamp;
} HttpLockedFilesReq;
typedef struct _HttpLockedFilesRes {
char repo_id[37];
gint64 timestamp;
GHashTable *locked_files; /* path -> by_me */
} HttpLockedFilesRes;
void
http_locked_files_req_free (HttpLockedFilesReq *req);
void
http_locked_files_res_free (HttpLockedFilesRes *res);
struct _HttpLockedFiles {
gboolean success;
GList *results; /* List of HttpLockedFilesRes */
};
typedef struct _HttpLockedFiles HttpLockedFiles;
typedef void (*HttpGetLockedFilesCallback) (HttpLockedFiles *result,
void *user_data);
/* Asynchronous interface for getting locked files for a repo. */
int
http_tx_manager_get_locked_files (HttpTxManager *manager,
const char *host,
gboolean use_fileserver_port,
GList *locked_files_requests,
HttpGetLockedFilesCallback callback,
void *user_data);
/* Synchronous interface for locking/unlocking a file on the server. */
int
http_tx_manager_lock_file (HttpTxManager *manager,
const char *host,
gboolean use_fileserver_port,
const char *token,
const char *repo_id,
const char *path);
int
http_tx_manager_unlock_file (HttpTxManager *manager,
const char *host,
gboolean use_fileserver_port,
const char *token,
const char *repo_id,
const char *path);
struct _HttpAPIGetResult {
gboolean success;
char *rsp_content;
int rsp_size;
int error_code;
int http_status;
};
typedef struct _HttpAPIGetResult HttpAPIGetResult;
typedef void (*HttpAPIGetCallback) (HttpAPIGetResult *result,
void *user_data);
int
http_tx_manager_fileserver_api_get (HttpTxManager *manager,
const char *host,
const char *url,
const char *token,
HttpAPIGetCallback callback,
void *user_data);
GHashTable *
http_tx_manager_get_head_commit_ids (HttpTxManager *manager,
const char *host,
gboolean use_fileserver_port,
GList *repo_id_list,
int *ret_status);
/*
int
http_tx_task_download_file_blocks (HttpTxTask *task, const char *file_id);
*/
typedef size_t (*HttpRecvCallback) (void *, size_t, size_t, void *);
int
http_tx_manager_get_block (HttpTxManager *manager,
const char *repo_id,
const char *block_id,
const char *host,
const char *token,
gboolean use_fileserver_port,
int *error_id,
HttpRecvCallback get_blk_cb,
void *user_data);
int
http_tx_manager_get_file_block_map (HttpTxManager *manager,
const char *repo_id,
const char *file_id,
const char *host,
const char *token,
gboolean use_fileserver_port,
gint64 **pblock_map,
int *n_blocks);
GList*
http_tx_manager_get_upload_tasks (HttpTxManager *manager);
GList*
http_tx_manager_get_download_tasks (HttpTxManager *manager);
HttpTxTask *
http_tx_manager_find_task (HttpTxManager *manager, const char *repo_id);
void
http_tx_manager_cancel_task (HttpTxManager *manager,
const char *repo_id,
int task_type);
int
http_tx_task_get_rate (HttpTxTask *task);
const char *
http_task_state_to_str (int state);
const char *
http_task_rt_state_to_str (int rt_state);
#endif