/* * CINELERRA * Copyright (C) 2008 Adam Williams * * 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 "asset.h" #include "assets.h" #include "awindowgui.inc" #include "batch.h" #include "cache.h" #include "bchash.h" #include "edl.h" #include "file.h" #include "filexml.h" #include "filesystem.h" #include "indexfile.h" #include "mainsession.h" #include "threadindexer.h" #include Assets::Assets(EDL *edl) : List() { this->edl = edl; } Assets::~Assets() { delete_all(); } int Assets::load(FileXML *file, uint32_t load_flags) { int result = 0; while(!result) { result = file->read_tag(); if(!result) { if(file->tag.title_is("/ASSETS")) { result = 1; } else if(file->tag.title_is("ASSET")) { const char *path = file->tag.get_property("SRC"); if(path && path[0] != 0) { Asset *new_asset = new Asset(path); new_asset->read(file); update(new_asset); new_asset->Garbage::remove_user(); } } } } return 0; } int Assets::save(FileXML *file, char *path) { file->tag.set_title("ASSETS"); file->append_tag(); file->append_newline(); for(Asset* current = first; current; current = NEXT) { current->write(file, 0, path); } file->tag.set_title("/ASSETS"); file->append_tag(); file->append_newline(); file->append_newline(); return 0; } void Assets::copy_from(Assets *assets) { delete_all(); for(Asset *current = assets->first; current; current = NEXT) { Asset *new_asset; append(new_asset = new Asset); new_asset->copy_from(current, 1); } } void Assets::update_index(Asset *asset) { if(!asset) return; for(Asset* current = first; current; current = NEXT) { if(current->test_path(asset->path)) { current->update_index(asset); } } } Asset* Assets::update(Asset *asset) { if(!asset) return 0; for(Asset* current = first; current; current = NEXT) { // Asset already exists. if(current->test_path(asset->path)) { return current; } } // Asset doesn't exist. Asset *asset_copy = new Asset(*asset); append(asset_copy); return asset_copy; } int Assets::delete_all() { while(first) { remove_asset(first); } return 0; } Asset* Assets::update(const char *path) { Asset* current = first; while(current) { if(current->test_path(path)) { return current; } current = NEXT; } return append(new Asset(path)); } Asset* Assets::get_asset(const char *filename) { Asset* current = first; Asset* result = 0; while(current) { //printf("Assets::get_asset %p %s\n", filename, filename); if(current->test_path(filename)) { result = current; break; } current = current->next; } return result; } void Assets::remove_asset(Asset *asset) { remove_pointer(asset); asset->Garbage::remove_user(); } int Assets::number_of(Asset *asset) { int i; Asset *current; for(i = 0, current = first; current && current != asset; i++, current = NEXT) ; return i; } Asset* Assets::asset_number(int number) { int i; Asset *current; for(i = 0, current = first; i < number && current; i++, current = NEXT) ; return current; } int Assets::update_old_filename(char *old_filename, char *new_filename) { for(Asset* current = first; current; current = NEXT) { if(!strcmp(current->path, old_filename)) { current->update_path(new_filename); } } return 0; } int Assets::dump(FILE *fp) { for(Asset *current = first; current; current = NEXT) { current->dump(fp); } return 0; }