From 16f738ecee689c6feb2acb7e4ef4d9bb4144ae7d Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 8 Jun 2008 11:04:43 +0200 Subject: Initial commit --- common/treepath_vfs.c | 232 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 common/treepath_vfs.c (limited to 'common/treepath_vfs.c') diff --git a/common/treepath_vfs.c b/common/treepath_vfs.c new file mode 100644 index 0000000..6e6a0a1 --- /dev/null +++ b/common/treepath_vfs.c @@ -0,0 +1,232 @@ +/* Tux Commander VFS: basic tree_path routines + * Copyright (C) 2007 Tomas Bzatek + * Check for updates on tuxcmd.sourceforge.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include + +#include "vfs_types.h" +#include "strutils.h" +#include "vfsutils.h" +#include "treepathutils.h" +#include "treepath_vfs.h" + + + + + + +struct VfsFilelistData* vfs_filelist_new(struct PathTree *files) +{ + struct VfsFilelistData *data= (struct VfsFilelistData*)malloc(sizeof(struct VfsFilelistData)); + memset(data, 0, sizeof(struct VfsFilelistData)); + + log("vfs_filelist_new()\n"); + data->files = files; + + return data; +} + + +void vfs_filelist_free(struct VfsFilelistData *data) +{ + if (! data) { + fprintf(stderr, "vfs_filelist_free: data == NULL !\n"); + return; + } + if (data) + { + free(data); + } +} + +void vfs_filelist_set_files(struct VfsFilelistData *data, struct PathTree *files) +{ + if (data) data->files = files; +} + + + + + +u_int64_t internal_get_dir_size(struct VfsFilelistData *data, struct PathTree *tree) +{ + if (data->break_get_dir_size) return 0; + u_int64_t Size = 0; + if (tree) { + struct PathTree *n = NULL; + unsigned long idx = 0; + while ((n = filelist_tree_get_item_by_index(tree, idx))) { + if (data->break_get_dir_size) break; + if (n->data) { +// printf("internal_get_dir_size: found item '%s', size = %lu \n", n->node, n->data->iSize); + Size += n->data->iSize; + if ((n->items) && (n->items->len > 0)) + Size += internal_get_dir_size(data, n); + } + idx++; + } + } + return Size; +} + +u_int64_t vfs_filelist_get_dir_size(struct VfsFilelistData *data, char *APath) +{ + if (! data) return 0; + data->break_get_dir_size = FALSE; + + struct PathTree* node = filelist_tree_find_node_by_path(data->files, APath); + if (node) { + return internal_get_dir_size(data, node); + } else { + printf("(EE) VFSGetDirSize: path '%s' not found\n", APath); + return 0; + } +} + +void vfs_filelist_get_dir_size_break(struct VfsFilelistData *data) +{ + if (data) data->break_get_dir_size = TRUE; +} + + + + + + +long vfs_filelist_file_exists(struct VfsFilelistData *data, const char *FileName, const long Use_lstat) +{ + if ((data) && (data->files)) { + struct PathTree* node = filelist_tree_find_node_by_path(data->files, FileName); + return node != NULL; + } else { + printf ("(EE) VFSFileExists: Invalid pointers to data objects.\n"); + return FALSE; + } +} + + +TVFSResult vfs_filelist_file_info(struct VfsFilelistData *data, char *AFileName, struct TVFSItem *Item) +{ + if ((data) && (data->files)) { + struct PathTree* node = filelist_tree_find_node_by_path(data->files, AFileName); + if (node) { + if (node->data) { + copy_vfs_item(node->data, Item); + Item->sFileName = strdup(AFileName); + printf("(II) VFSFileInfo: found file: '%s'\n", Item->sFileName); + return cVFS_OK; + } else { + printf("(EE) VFSFileInfo: node->data == NULL! \n"); + return cVFS_Failed; + } + } else { + printf("(EE) VFSFileInfo: file specified not found\n"); + return cVFS_No_More_Files; + } + } else { + printf ("(EE) VFSFileInfo: Invalid pointers to data objects.\n"); + return cVFS_Failed; + } +} + + + + + + +TVFSResult vfs_filelist_list_first(struct VfsFilelistData *data, char *sDir, struct TVFSItem *Item) +{ + data->list_dir_index = -1; + data->list_dir_node = NULL; + + if (sDir == NULL) { + printf("(EE) VFSListFirst: sDir is NULL!\n"); + return cVFS_Failed; + } + + data->list_dir_index = 0; + data->list_dir_node = filelist_tree_find_node_by_path(data->files, sDir); + + // Find the directory in the filelist + if (data->list_dir_node) { + struct PathTree* node = filelist_tree_get_item_by_index(data->list_dir_node, data->list_dir_index); + if (node) { + copy_vfs_item(node->data, Item); + printf("(II) VFSListFirst: found file: %s\n", Item->sFileName); + return cVFS_OK; + } else { + printf("(II) VFSListFirst: no more files\n"); + return cVFS_No_More_Files; + } + } else { + printf ("(EE) VFSListFirst: Directory '%s' not found.\n", sDir); + return cVFS_Failed; + } +} + +TVFSResult vfs_filelist_list_next(struct VfsFilelistData *data, char *sDir, struct TVFSItem *Item) +{ + if (! data->list_dir_node) { + printf("(EE) VFSListNext: data->list_dir_node is NULL!\n"); + return cVFS_Failed; + } + data->list_dir_index++; + + struct PathTree* node = filelist_tree_get_item_by_index(data->list_dir_node, data->list_dir_index); + if (node) { + copy_vfs_item(node->data, Item); + printf("(II) VFSListNext: found file: %s\n", Item->sFileName); + return cVFS_OK; + } else { + printf("(II) VFSListNext: no more files\n"); + return cVFS_No_More_Files; + } +} + +TVFSResult vfs_filelist_list_close(struct VfsFilelistData *data) +{ + data->list_dir_index = -1; + data->list_dir_node = NULL; + return cVFS_OK; +} + + +char* vfs_filelist_change_dir(struct VfsFilelistData *data, char *NewPath) +{ + if (NewPath == NULL) { + printf("(EE) VFSChangeDir: NewPath is NULL!\n"); + return NULL; + } + + // Make up the target path + printf ("(--) VFSChangeDir: Going to change dir from '%s'\n", NewPath); + char *ANewPath = exclude_trailing_path_sep(NewPath); + if (strlen(ANewPath) <= 0) ANewPath = strdup("/"); + printf ("(--) VFSChangeDir: Going to change dir to '%s'\n", ANewPath); + + // Find the directory in the filelist + if (filelist_tree_find_node_by_path(data->files, ANewPath)) { + return ANewPath; + } else { + printf ("(EE) VFSChangeDir: Directory '%s' not found.\n", ANewPath); + free(ANewPath); + return NULL; + } +} -- cgit v1.2.3