Merge branch 'ct' of git.pipapo.org:cinelerra-ct into ct
[cinelerra_cv/ct.git] / cinelerra / threadindexer.C
blobd9b90cc16554b7ee513de61b6dbc5d358eded1f4
1 #include "asset.h"
2 #include "assets.h"
3 #include "bcprogressbox.h"
4 #include "condition.h"
5 #include "bchash.h"
6 #include "filesystem.h"
7 #include "guicast.h"
8 #include "indexfile.h"
9 #include "language.h"
10 #include "loadfile.h"
11 #include "mwindowgui.h"
12 #include "mwindow.h"
13 #include "threadindexer.h"
15 #include <string.h>
21 ThreadIndexer::ThreadIndexer(MWindow *mwindow, Assets *assets)
22  : Thread()
24         this->mwindow = mwindow;
25         this->assets = assets;
26         set_synchronous(0);
27         indexfile = new IndexFile(mwindow);
28         interrupt_lock = new Condition(0, "ThreadIndexer::ThreadIndexer");
31 ThreadIndexer::~ThreadIndexer()
33         delete indexfile;
34         delete interrupt_lock;
37 int ThreadIndexer::start_build()
39         interrupt_flag = 0;
40         start();
43 // build all here to allow editing during build
44 void ThreadIndexer::run()
46 // check locations of each asset
47         FILE *test_file;
48         char new_filename[1024], old_filename[1024];
49         int result = 0;
50         BC_ProgressBox *progress = 0;
51         Assets_list::iterator current_asset;
53         for(current_asset = assets->begin();
54             current_asset != assets->end();
55             ++current_asset)
56         {
57                 if(!(test_file = fopen((*current_asset)->path, "rb")))
58                 {
59 // file doesn't exist
60                         strcpy(old_filename, (*current_asset)->path);
62                         result = 1;
63 // get location from user
64                         char directory[1024];
65                         sprintf(directory, "~");
66                         mwindow->defaults->get("DIRECTORY", directory);
68                         char string[1024], name[1024];
69                         FileSystem dir;
70                         dir.extract_name(name, old_filename);
71                         sprintf(string, _("Where is %s?"), name);
73                         LocateFileWindow window(mwindow, directory, string);
74                         window.create_objects();
75                         int result2 = window.run_window();
77                         mwindow->defaults->update("DIRECTORY", 
78                                 window.get_submitted_path());
80                         if(result2 == 1)
81                         {
82                                 strcpy(new_filename, SILENCE);
83                         }
84                         else
85                         {
86                                 strcpy(new_filename, 
87                                         window.get_submitted_path());
88                         }
90 // update assets containing old location
91                         assets->update_old_filename(old_filename, new_filename);
92                 }
93                 else
94                 {
95                         fclose(test_file);
96                 }
97         }
100 // test index of each asset
101         for(current_asset = assets->begin(); 
102                 current_asset != assets->end() && !interrupt_flag; 
103                 ++current_asset)
104         {
105 // test for an index file already built before creating progress bar
106                 if((*current_asset)->index_status == INDEX_NOTTESTED && 
107                         (*current_asset)->audio_data)
108                 {
109                         if(indexfile->open_index(mwindow, *current_asset))
110                         {
111 // doesn't exist
112 // try to create now
113                                 if(!progress)
114                                 {
115                                         progress = new BC_ProgressBox(mwindow->gui->get_abs_cursor_x(1),
116                                                 mwindow->gui->get_abs_cursor_y(1),
117                                                 _("Building Indexes..."), 
118                                                 1);
119                                         progress->start();
120                                 }
122 //                              indexfile->create_index(mwindow, current_asset, progress);
123                                 if(progress->is_cancelled()) interrupt_flag = 1;
124                         }
125                         else
126                         {
127                                 if((*current_asset)->index_status == 1) (*current_asset)->index_status = 0;   // index has been tested
128                                 indexfile->close_index();
129                         }
130                 }
131         }
133         if(progress)     // progress box is only createdd when an index is built
134         {       
135                 progress->stop_progress();
136                 delete progress;
137                 progress = 0;
138         }
140         interrupt_lock->unlock();
143 int ThreadIndexer::interrupt_build()
145         interrupt_flag = 1;
146         indexfile->interrupt_index();
147         interrupt_lock->lock(" ThreadIndexer::interrupt_build");
148         interrupt_lock->unlock();
152 //      Local Variables:
153 //      mode: C++
154 //      c-file-style: "linux"
155 //      End: