00001 #include "asset.h"
00002 #include "assets.h"
00003 #include "awindowgui.inc"
00004 #include "batch.h"
00005 #include "cache.h"
00006 #include "bchash.h"
00007 #include "edl.h"
00008 #include "file.h"
00009 #include "filexml.h"
00010 #include "filesystem.h"
00011 #include "indexfile.h"
00012 #include "quicktime.h"
00013 #include "mainsession.h"
00014 #include "threadindexer.h"
00015 #include <string.h>
00016
00017 Assets::Assets(EDL *edl) : List<Asset>()
00018 {
00019 this->edl = edl;
00020 }
00021
00022 Assets::~Assets()
00023 {
00024 delete_all();
00025 }
00026
00027 int Assets::load(ArrayList<PluginServer*> *plugindb,
00028 FileXML *file,
00029 uint32_t load_flags)
00030 {
00031 int result = 0;
00032
00033
00034 while(!result)
00035 {
00036 result = file->read_tag();
00037 if(!result)
00038 {
00039 if(file->tag.title_is("/ASSETS"))
00040 {
00041 result = 1;
00042 }
00043 else
00044 if(file->tag.title_is("ASSET"))
00045 {
00046
00047 char *path = file->tag.get_property("SRC");
00048
00049 Asset *new_asset = new Asset(path ? path : SILENCE);
00050
00051 new_asset->read(file);
00052
00053 update(new_asset);
00054 Garbage::delete_object(new_asset);
00055
00056 }
00057 }
00058 }
00059
00060 return 0;
00061 }
00062
00063 int Assets::save(ArrayList<PluginServer*> *plugindb, FileXML *file, char *path)
00064 {
00065 file->tag.set_title("ASSETS");
00066 file->append_tag();
00067 file->append_newline();
00068
00069 for(Asset* current = first; current; current = NEXT)
00070 {
00071 current->write(file,
00072 0,
00073 path);
00074 }
00075
00076 file->tag.set_title("/ASSETS");
00077 file->append_tag();
00078 file->append_newline();
00079 file->append_newline();
00080 return 0;
00081 }
00082
00083 void Assets::copy_from(Assets *assets)
00084 {
00085 delete_all();
00086
00087 for(Asset *current = assets->first; current; current = NEXT)
00088 {
00089 Asset *new_asset;
00090 append(new_asset = new Asset);
00091 new_asset->copy_from(current, 1);
00092 }
00093 }
00094
00095 Assets& Assets::operator=(Assets &assets)
00096 {
00097 printf("Assets::operator= 1\n");
00098 copy_from(&assets);
00099 return *this;
00100 }
00101
00102
00103 void Assets::update_index(Asset *asset)
00104 {
00105 for(Asset* current = first; current; current = NEXT)
00106 {
00107 if(current->test_path(asset->path))
00108 {
00109 current->update_index(asset);
00110 }
00111 }
00112 }
00113
00114 Asset* Assets::update(Asset *asset)
00115 {
00116 if(!asset) return 0;
00117
00118 for(Asset* current = first; current; current = NEXT)
00119 {
00120
00121 if(current->test_path(asset->path))
00122 {
00123 return current;
00124 }
00125 }
00126
00127
00128 Asset *asset_copy = new Asset(*asset);
00129 append(asset_copy);
00130 return asset_copy;
00131 }
00132
00133 int Assets::delete_all()
00134 {
00135 while(first)
00136 {
00137 remove_asset(first);
00138 }
00139 return 0;
00140 }
00141
00142 Asset* Assets::update(const char *path)
00143 {
00144 Asset* current = first;
00145
00146 while(current)
00147 {
00148 if(current->test_path(path))
00149 {
00150 return current;
00151 }
00152 current = NEXT;
00153 }
00154
00155 return append(new Asset(path));
00156 }
00157
00158 Asset* Assets::get_asset(const char *filename)
00159 {
00160 Asset* current = first;
00161 Asset* result = 0;
00162
00163 while(current)
00164 {
00165
00166 if(current->test_path(filename))
00167 {
00168 result = current;
00169 break;
00170 }
00171 current = current->next;
00172 }
00173
00174 return result;
00175 }
00176
00177 Asset* Assets::remove_asset(Asset *asset)
00178 {
00179 remove_pointer(asset);
00180 Garbage::delete_object(asset);
00181 }
00182
00183
00184 int Assets::number_of(Asset *asset)
00185 {
00186 int i;
00187 Asset *current;
00188
00189 for(i = 0, current = first; current && current != asset; i++, current = NEXT)
00190 ;
00191
00192 return i;
00193 }
00194
00195 Asset* Assets::asset_number(int number)
00196 {
00197 int i;
00198 Asset *current;
00199
00200 for(i = 0, current = first; i < number && current; i++, current = NEXT)
00201 ;
00202
00203 return current;
00204 }
00205
00206 int Assets::update_old_filename(char *old_filename, char *new_filename)
00207 {
00208 for(Asset* current = first; current; current = NEXT)
00209 {
00210 if(!strcmp(current->path, old_filename))
00211 {
00212 current->update_path(new_filename);
00213 }
00214 }
00215 return 0;
00216 }
00217
00218
00219 int Assets::dump()
00220 {
00221 for(Asset *current = first; current; current = NEXT)
00222 {
00223 current->dump();
00224 }
00225 return 0;
00226 }
00227
00228