#ifndef SYNC_H
#define SYNC_H
#include <curl/curl.h>
#include <libidav/webdav.h>
#include <cx/list.h>
#include <cx/hash_map.h>
#include "scfg.h"
#include "config.h"
#include "sopt.h"
#include "system.h"
#include "version.h"
#ifdef _WIN32
#else
#include <pthread.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define STDIN_BUF_SIZE 2048
#define VERSION_PATH_PROPERTY "version-collection"
typedef struct SyncFile {
SyncDirectory *dir;
char *path;
} SyncFile;
typedef struct MetadataHashes {
char *tags;
char *tags_remote;
char *xattr;
DavBool update_tags;
DavBool update_tags_remote;
DavBool update_xattr;
} MetadataHashes;
typedef struct MovedFile {
DavResource *resource;
LocalResource *content;
DavBool copy;
} MovedFile;
enum RemoteChangeType {
REMOTE_NO_CHANGE =
0,
REMOTE_CHANGE_MODIFIED,
REMOTE_CHANGE_NEW,
REMOTE_CHANGE_DELETED,
REMOTE_CHANGE_CONFLICT_LOCAL_MODIFIED,
REMOTE_CHANGE_METADATA,
REMOTE_CHANGE_MKDIR,
REMOTE_CHANGE_LINK
};
typedef enum RemoteChangeType RemoteChangeType;
typedef struct RemoteChange {
DavResource *resource;
RemoteChangeType type;
} RemoteChange;
void print_usage(
char *cmd);
#ifndef _WIN32
pthread_t start_sighandler(
pthread_mutex_t *mutex) ;
void stop_sighandler(
pthread_mutex_t *mutex,
pthread_t tid);
#else
int start_sighandler(
int* mutex);
int stop_sighandler(
int* mutex,
int tid);
#endif
void res2map(DavResource *root, CxMap *map);
int cmd_pull(CmdArgs *args, DavBool incoming);
int cmd_push(CmdArgs *args, DavBool outgoing, DavBool archive);
int cmd_restore(CmdArgs *args);
void log_printf(
const char *fmt, ...);
void print_outgoing(
CmdArgs *args,
CxList *ls_new,
CxList *ls_modified,
CxList *ls_conflict,
CxList *ls_update,
CxList *ls_delete,
CxList *ls_move,
CxList *ls_copy,
CxList *ls_mkcol);
RemoteChangeType resource_get_remote_change(
CmdArgs *a,
DavResource *res,
SyncDirectory *dir,
SyncDatabase *db);
void sync_set_metadata_from_stat(LocalResource *local,
SYS_STAT *s);
int sync_move_resource(
CmdArgs *a,
SyncDirectory *dir,
DavResource *res,
LocalResource *content,
DavBool copy,
SyncDatabase *db,
int *counter);
int sync_get_resource(
CmdArgs *a,
SyncDirectory *dir,
const char *path,
DavResource *res,
SyncDatabase *db,
DavBool update_local,
int *counter);
int sync_get_collection(
CmdArgs *a,
SyncDirectory *dir,
DavResource *res,
SyncDatabase *db);
int sync_remove_local_resource(SyncDirectory *dir, LocalResource *res);
int sync_remove_local_directory(SyncDirectory *dir, LocalResource *res);
void rename_conflict_file(SyncDirectory *dir, SyncDatabase *db,
char *path, DavBool copy);
char* create_tmp_download_path(
char *path);
void move_to_trash(SyncDirectory *dir,
char *path);
CxList* local_scan(SyncDirectory *dir, SyncDatabase *db);
CxList* read_changes(SyncDirectory *dir, SyncDatabase *db);
LocalResource* local_resource_new(SyncDirectory *dir, SyncDatabase *db,
char *path);
char* local_resource_path(LocalResource *res);
int local_resource_is_changed(
SyncDirectory *dir,
SyncDatabase *db,
LocalResource *res,
CxMap *svrres,
DavBool restore_deleted,
DavBool restore_modified);
int remote_resource_is_changed(
DavSession *sn,
SyncDirectory *dir,
SyncDatabase *db,
DavResource *remote,
LocalResource *res,
DavBool *equal);
int local_resource_load_metadata(SyncDirectory *dir, LocalResource *res);
void local_resource_set_etag(LocalResource *local,
const char *etag);
char* resource_local_path(DavResource *res);
size_t resource_get_blocksize(SyncDirectory *dir, LocalResource *local, DavResource *res,
off_t filesize);
int resource_pathlen_cmp(LocalResource *res1, LocalResource *res2,
void *n);
int resource_path_cmp(LocalResource *res1, LocalResource *res2,
void *n);
DavResource *versioning_simple_find(DavResource *res,
const char *version);
DavResource *versioning_deltav_find(DavResource *res,
const char *version);
int sync_set_status(DavResource *res,
char *status);
int sync_remove_status(DavResource *res);
CxBuffer* sync_get_file_tag_data(SyncDirectory *dir, LocalResource *res);
CxList* sync_get_file_tags(SyncDirectory *dir, LocalResource *res, DavBool *changed,
char **newhash);
int sync_tags_equal(CxList *tags1, CxList *tags2);
int sync_store_metadata(SyncDirectory *dir,
const char *path, LocalResource *local, DavResource *res);
int sync_store_xattr(SyncDirectory *dir,
const char *path, XAttributes *xattr);
int sync_store_tags(SyncDirectory *dir,
const char *path, LocalResource *local, DavResource *res);
int sync_store_tags_local(SyncDirectory *dir, LocalResource *local,
const char *path, CxList *tags);
int sync_put_resource(
SyncDirectory *dir,
DavResource *res,
LocalResource *local,
int *counter);
int sync_mkdir(SyncDirectory *dir, DavResource *res, LocalResource *local);
int sync_move_remote_resource(
SyncDirectory *dir,
SyncDatabase *db,
DavResource *origin,
LocalResource *local,
DavBool copy,
int *counter);
int sync_delete_remote_resource(SyncDirectory *dir, DavSession *sn, LocalResource *res,
int *counter, CxList *cols);
MetadataHashes sync_set_metadata_properties(
SyncDirectory *dir,
DavSession *sn,
DavResource *res,
LocalResource *local,
DavBool force);
int sync_update_metadata(
SyncDirectory *dir,
DavSession *sn,
DavResource *res,
LocalResource *local);
void update_parts(LocalResource *local, CxList *updates,
uint64_t numparts);
void remove_deleted_conflicts(SyncDirectory *dir, SyncDatabase *db);
int cmd_list_conflicts(CmdArgs *args);
int cmd_resolve_conflicts(CmdArgs *args);
int cmd_delete_conflicts(CmdArgs *args);
int cmd_list_versions(CmdArgs *args);
int cmd_trash_info(CmdArgs *args);
int cmd_empty_trash(CmdArgs *args);
int cmd_add_tag(CmdArgs *args);
int cmd_remove_tag(CmdArgs *args);
int cmd_set_tags(CmdArgs *args);
int cmd_list_tags(CmdArgs *args);
int cmd_tagop(CmdArgs *args,
int cmd);
int sync_get_file(CmdArgs *args,
const char *path, SyncFile *f, DavBool dostat);
void sync_print_get_file_err(
const char *path,
int err);
int isfileindir(SyncDirectory *dir,
const char *path, SyncFile *f);
int cmd_add_directory(CmdArgs *args);
int cmd_list_dirs();
int cmd_check_repositories(CmdArgs *args);
char* create_locktoken_file(
const char *syncdirname,
const char *locktoken);
char* sync_get_content_hash(DavResource *res);
void sync_set_content_hash(DavResource *res,
const unsigned char *hashdata);
#ifdef __cplusplus
}
#endif
#endif