File center move files
This commit is contained in:
parent
a981864237
commit
69a3fdcdba
@ -13,6 +13,8 @@ struct files {
|
|||||||
char *name;
|
char *name;
|
||||||
char *description;
|
char *description;
|
||||||
int approved;
|
int approved;
|
||||||
|
int dlcount;
|
||||||
|
time_t uploadtime;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct file_directory **file_directories;
|
struct file_directory **file_directories;
|
||||||
@ -323,6 +325,66 @@ static int approveFile(EObjectType cdktype, void *object, void *clientData, chty
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int approveAll(EObjectType cdktype, void *object, void *clientData, chtype input) {
|
||||||
|
CDKSCROLL *s = (CDKSCROLL *)object;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0;i<fcount;i++) {
|
||||||
|
if (f[i]->approved == 0) {
|
||||||
|
doApprove(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setCDKScrollItems(s, filenames, fcount, FALSE);
|
||||||
|
refreshCDKScreen(cdkscreen);
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static int disapproveAll(EObjectType cdktype, void *object, void *clientData, chtype input) {
|
||||||
|
CDKSCROLL *s = (CDKSCROLL *)object;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0;i<fcount;i++) {
|
||||||
|
if (f[i]->approved == 1) {
|
||||||
|
doDisapprove(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setCDKScrollItems(s, filenames, fcount, FALSE);
|
||||||
|
refreshCDKScreen(cdkscreen);
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int copy_file(char *src, char *dest) {
|
||||||
|
FILE *src_file;
|
||||||
|
FILE *dest_file;
|
||||||
|
|
||||||
|
char c;
|
||||||
|
|
||||||
|
src_file = fopen(src, "rb");
|
||||||
|
if (!src_file) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
dest_file = fopen(dest, "wb");
|
||||||
|
if (!dest_file) {
|
||||||
|
fclose(src_file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
c = fgetc(src_file);
|
||||||
|
if (!feof(src_file)) {
|
||||||
|
fputc(c, dest_file);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(src_file);
|
||||||
|
fclose(dest_file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int recursive_delete(const char *dir) {
|
int recursive_delete(const char *dir) {
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
FTS *ftsp = NULL;
|
FTS *ftsp = NULL;
|
||||||
@ -371,6 +433,189 @@ finish:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int moveFile(EObjectType cdktype, void *object, void *clientData, chtype input) {
|
||||||
|
CDKSCROLL *s = (CDKSCROLL *)object;
|
||||||
|
CDKSCROLL *dirScrollList;
|
||||||
|
CDKSCROLL *subScrollList;
|
||||||
|
|
||||||
|
int dir_sel;
|
||||||
|
int sub_sel;
|
||||||
|
|
||||||
|
char **filedirs;
|
||||||
|
char **filesubs;
|
||||||
|
|
||||||
|
char dest_file[PATH_MAX];
|
||||||
|
|
||||||
|
int index = getCDKScrollCurrent(s);
|
||||||
|
|
||||||
|
char title[42];
|
||||||
|
sqlite3 *db;
|
||||||
|
sqlite3_stmt *res;
|
||||||
|
int rc;
|
||||||
|
struct stat st;
|
||||||
|
char database[PATH_MAX];
|
||||||
|
int i;
|
||||||
|
char create_sql[] = "CREATE TABLE IF NOT EXISTS files ("
|
||||||
|
"Id INTEGER PRIMARY KEY,"
|
||||||
|
"filename TEXT,"
|
||||||
|
"description TEXT,"
|
||||||
|
"size INTEGER,"
|
||||||
|
"dlcount INTEGER,"
|
||||||
|
"uploaddate INTEGER,"
|
||||||
|
"approved INTEGER);";
|
||||||
|
|
||||||
|
char sql_delete[] = "DELETE FROM files WHERE filename LIKE ?";
|
||||||
|
char sql_insert[] = "INSERT INTO files (filename, description, size, dlcount, uploaddate, approved) VALUES(?, ?, ?, ?, ?, ?)";
|
||||||
|
|
||||||
|
char *err_msg = 0;
|
||||||
|
|
||||||
|
if (index >= fcount) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
dirScrollList = newCDKScroll(cdkscreen, 9, 6, 1, 36, 36, "</48>File Directories<!48>", NULL, 0, FALSE, A_REVERSE, TRUE, TRUE);
|
||||||
|
|
||||||
|
filedirs = (char **)malloc(sizeof(char *) * file_directory_count);
|
||||||
|
|
||||||
|
for (i=0;i<file_directory_count;i++) {
|
||||||
|
filedirs[i] = strdup(file_directories[i]->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
setCDKScrollItems(dirScrollList, filedirs, file_directory_count, FALSE);
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
dir_sel = activateCDKScroll(dirScrollList, 0);
|
||||||
|
if (dirScrollList->exitType == vESCAPE_HIT) {
|
||||||
|
break;
|
||||||
|
} else if (dirScrollList->exitType == vNORMAL) {
|
||||||
|
snprintf(title, 42, "</48>%s<!48>", file_directories[dir_sel]->name);
|
||||||
|
|
||||||
|
subScrollList = newCDKScroll(cdkscreen, 12, 8, 1, 36, 36, title, NULL, 0, FALSE, A_REVERSE, TRUE, TRUE);
|
||||||
|
|
||||||
|
filesubs = (char **)malloc(sizeof(char *) * file_directory_count);
|
||||||
|
|
||||||
|
for (i=0;i<file_directories[dir_sel]->file_sub_count;i++) {
|
||||||
|
filesubs[i] = strdup(file_directories[dir_sel]->file_subs[i]->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
setCDKScrollItems(subScrollList, filesubs, file_directories[dir_sel]->file_sub_count, FALSE);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
sub_sel = activateCDKScroll(subScrollList, 0);
|
||||||
|
if (subScrollList->exitType == vESCAPE_HIT) {
|
||||||
|
for (i=0;i<file_directories[dir_sel]->file_sub_count;i++) {
|
||||||
|
free(filesubs[i]);
|
||||||
|
}
|
||||||
|
free(filesubs);
|
||||||
|
destroyCDKScroll(subScrollList);
|
||||||
|
break;
|
||||||
|
} else if (subScrollList->exitType == vNORMAL) {
|
||||||
|
snprintf(dest_file, PATH_MAX, "%s/%s", file_directories[dir_sel]->file_subs[sub_sel]->upload_path, basename(f[index]->name));
|
||||||
|
|
||||||
|
if (stat(dest_file, &st) != 0) {
|
||||||
|
// move file
|
||||||
|
if (copy_file(f[index]->name, dest_file) == 0) {
|
||||||
|
// success
|
||||||
|
unlink(f[index]->name);
|
||||||
|
// remove from database
|
||||||
|
snprintf(database, PATH_MAX, "%s/%s.sq3", bbspath, file_directories[current_dir]->file_subs[current_sub]->database);
|
||||||
|
rc = sqlite3_open(database, &db);
|
||||||
|
|
||||||
|
if (rc != SQLITE_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sqlite3_busy_timeout(db, 5000);
|
||||||
|
|
||||||
|
rc = sqlite3_prepare_v2(db, sql_delete, -1, &res, 0);
|
||||||
|
if (rc != SQLITE_OK) {
|
||||||
|
sqlite3_close(db);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sqlite3_bind_text(res, 1, f[index]->name, -1, 0);
|
||||||
|
|
||||||
|
sqlite3_step(res);
|
||||||
|
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
|
||||||
|
// add to dest database
|
||||||
|
snprintf(database, PATH_MAX, "%s/%s.sq3", bbspath, file_directories[dir_sel]->file_subs[sub_sel]->database);
|
||||||
|
rc = sqlite3_open(database, &db);
|
||||||
|
|
||||||
|
if (rc != SQLITE_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sqlite3_busy_timeout(db, 5000);
|
||||||
|
|
||||||
|
rc = sqlite3_exec(db, create_sql, 0, 0, &err_msg);
|
||||||
|
if (rc != SQLITE_OK ) {
|
||||||
|
sqlite3_free(err_msg);
|
||||||
|
sqlite3_close(db);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = sqlite3_prepare_v2(db, sql_insert, -1, &res, 0);
|
||||||
|
if (rc != SQLITE_OK) {
|
||||||
|
sqlite3_close(db);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
stat(dest_file, &st);
|
||||||
|
sqlite3_bind_text(res, 1, dest_file, -1, 0);
|
||||||
|
sqlite3_bind_text(res, 2, f[index]->description, -1, 0);
|
||||||
|
sqlite3_bind_int(res, 3, st.st_size);
|
||||||
|
sqlite3_bind_int(res, 4, f[index]->dlcount);
|
||||||
|
sqlite3_bind_int(res, 5, f[index]->uploadtime);
|
||||||
|
sqlite3_bind_int(res, 6, f[index]->approved);
|
||||||
|
sqlite3_step(res);
|
||||||
|
|
||||||
|
sqlite3_finalize(res);
|
||||||
|
sqlite3_close(db);
|
||||||
|
// remove from current memory
|
||||||
|
|
||||||
|
free(filenames[index]);
|
||||||
|
free(f[index]->name);
|
||||||
|
free(f[index]->description);
|
||||||
|
free(f[index]);
|
||||||
|
|
||||||
|
for (i=index;i<fcount-1;i++) {
|
||||||
|
f[i] = f[i+1];
|
||||||
|
filenames[i] = filenames[i+1];
|
||||||
|
}
|
||||||
|
|
||||||
|
fcount--;
|
||||||
|
|
||||||
|
f = (struct files **)realloc(f, sizeof(struct files *) * fcount);
|
||||||
|
filenames = (char **)realloc(filenames, sizeof(char *) * fcount);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (i=0;i<file_directories[dir_sel]->file_sub_count;i++) {
|
||||||
|
free(filesubs[i]);
|
||||||
|
}
|
||||||
|
free(filesubs);
|
||||||
|
eraseCDKScroll(subScrollList);
|
||||||
|
destroyCDKScroll(subScrollList);
|
||||||
|
}
|
||||||
|
for (i=0;i<file_directory_count;i++) {
|
||||||
|
free(filedirs[i]);
|
||||||
|
}
|
||||||
|
free(filedirs);
|
||||||
|
eraseCDKScroll(dirScrollList);
|
||||||
|
destroyCDKScroll(dirScrollList);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setCDKScrollItems(s, filenames, fcount, FALSE);
|
||||||
|
eraseCDKScroll(s);
|
||||||
|
drawCDKScroll(s, TRUE);
|
||||||
|
refreshCDKScreen(cdkscreen);
|
||||||
|
}
|
||||||
|
|
||||||
static int scanFiles(EObjectType cdktype, void *object, void *clientData, chtype input) {
|
static int scanFiles(EObjectType cdktype, void *object, void *clientData, chtype input) {
|
||||||
DIR *ind = opendir(file_directories[current_dir]->file_subs[current_sub]->upload_path);
|
DIR *ind = opendir(file_directories[current_dir]->file_subs[current_sub]->upload_path);
|
||||||
FILE *fptr;
|
FILE *fptr;
|
||||||
@ -590,7 +835,7 @@ void list_files(int dir, int sub) {
|
|||||||
sqlite3_stmt *res;
|
sqlite3_stmt *res;
|
||||||
int rc;
|
int rc;
|
||||||
struct stat s;
|
struct stat s;
|
||||||
char sql_read[] = "SELECT filename, description, approved FROM files";
|
char sql_read[] = "SELECT filename, description, approved, dlcount, uploaddate FROM files";
|
||||||
char create_sql[] = "CREATE TABLE IF NOT EXISTS files ("
|
char create_sql[] = "CREATE TABLE IF NOT EXISTS files ("
|
||||||
"Id INTEGER PRIMARY KEY,"
|
"Id INTEGER PRIMARY KEY,"
|
||||||
"filename TEXT,"
|
"filename TEXT,"
|
||||||
@ -642,7 +887,8 @@ void list_files(int dir, int sub) {
|
|||||||
f[fcount]->name = strdup((char *)sqlite3_column_text(res, 0));
|
f[fcount]->name = strdup((char *)sqlite3_column_text(res, 0));
|
||||||
f[fcount]->description = strdup((char *)sqlite3_column_text(res, 1));
|
f[fcount]->description = strdup((char *)sqlite3_column_text(res, 1));
|
||||||
f[fcount]->approved = sqlite3_column_int(res, 2);
|
f[fcount]->approved = sqlite3_column_int(res, 2);
|
||||||
|
f[fcount]->dlcount = sqlite3_column_int(res, 3);
|
||||||
|
f[fcount]->uploadtime = sqlite3_column_int(res, 4);
|
||||||
filenames[fcount] = (char *)malloc(strlen(basename(f[fcount]->name)) + 30);
|
filenames[fcount] = (char *)malloc(strlen(basename(f[fcount]->name)) + 30);
|
||||||
if (stat(f[fcount]->name, &s) != 0) {
|
if (stat(f[fcount]->name, &s) != 0) {
|
||||||
sprintf(filenames[fcount], "</16>%s (missing)<!16>", basename(f[fcount]->name));
|
sprintf(filenames[fcount], "</16>%s (missing)<!16>", basename(f[fcount]->name));
|
||||||
@ -661,7 +907,7 @@ void list_files(int dir, int sub) {
|
|||||||
sqlite3_finalize(res);
|
sqlite3_finalize(res);
|
||||||
sqlite3_close(db);
|
sqlite3_close(db);
|
||||||
|
|
||||||
scrollList = newCDKScroll(cdkscreen, 6, 4, 1, 36, 32, title, NULL, 0, FALSE, A_REVERSE, TRUE, TRUE);
|
scrollList = newCDKScroll(cdkscreen, 6, 4, 1, 36, 36, title, NULL, 0, FALSE, A_REVERSE, TRUE, TRUE);
|
||||||
if (!scrollList) {
|
if (!scrollList) {
|
||||||
for (i=0;i<fcount;i++) {
|
for (i=0;i<fcount;i++) {
|
||||||
free(f[i]->name);
|
free(f[i]->name);
|
||||||
@ -678,7 +924,10 @@ void list_files(int dir, int sub) {
|
|||||||
|
|
||||||
setCDKScrollItems(scrollList, filenames, fcount, FALSE);
|
setCDKScrollItems(scrollList, filenames, fcount, FALSE);
|
||||||
|
|
||||||
bindCDKObject (vSCROLL, scrollList, 'a', approveFile, NULL);
|
bindCDKObject (vSCROLL, scrollList, 'm', moveFile, NULL);
|
||||||
|
bindCDKObject (vSCROLL, scrollList, 'u', disapproveAll, NULL);
|
||||||
|
bindCDKObject (vSCROLL, scrollList, 'a', approveAll, NULL);
|
||||||
|
bindCDKObject (vSCROLL, scrollList, 't', approveFile, NULL);
|
||||||
bindCDKObject (vSCROLL, scrollList, 'd', deleteFile, NULL);
|
bindCDKObject (vSCROLL, scrollList, 'd', deleteFile, NULL);
|
||||||
bindCDKObject (vSCROLL, scrollList, 's', scanFiles, NULL);
|
bindCDKObject (vSCROLL, scrollList, 's', scanFiles, NULL);
|
||||||
|
|
||||||
@ -716,7 +965,7 @@ void list_subdirs(int selected) {
|
|||||||
filesubs[i] = strdup(file_directories[selected]->file_subs[i]->name);
|
filesubs[i] = strdup(file_directories[selected]->file_subs[i]->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
scrollList = newCDKScroll(cdkscreen, 4, 3, 1, 36, 34, title, NULL, 0, FALSE, A_REVERSE, TRUE, TRUE);
|
scrollList = newCDKScroll(cdkscreen, 4, 3, 1, 36, 36, title, NULL, 0, FALSE, A_REVERSE, TRUE, TRUE);
|
||||||
if (!scrollList) {
|
if (!scrollList) {
|
||||||
fprintf(stderr, "Unable to make scrolllist!");
|
fprintf(stderr, "Unable to make scrolllist!");
|
||||||
destroyCDKScreen(cdkscreen);
|
destroyCDKScreen(cdkscreen);
|
||||||
|
Reference in New Issue
Block a user