File: dirscan.cpp

package info (click to toggle)
munipack 0.6.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 33,104 kB
  • sloc: cpp: 29,677; sh: 4,909; f90: 2,872; makefile: 278; python: 140; xml: 72; awk: 12
file content (93 lines) | stat: -rw-r--r-- 2,233 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*

  xmunipack - list threads

  Copyright © 2022 F.Hroch (hroch@physics.muni.cz)

  This file is part of Munipack.

  Munipack 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 3 of the License, or
  (at your option) any later version.

  Munipack 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 Munipack.  If not, see <http://www.gnu.org/licenses/>.

*/

#include "event.h"
#include "dirscan.h"
#include <wx/wx.h>
#include <wx/dir.h>
#include <wx/thread.h>
#include <wx/filename.h>
#include <wx/filesys.h>

#ifdef __WXDEBUG__
#include <wx/debug.h>
#endif


// -- List file Scanner

DirScan::DirScan(wxEvtHandler *h, const wxString& p,
		 const wxString& f, size_t i):
  wxThread(wxTHREAD_DETACHED),handler(h),
  path(p == ""? "." : p), filter(f),id(i)
{
  wxASSERT(handler && ! path.IsEmpty() );
  wxLogDebug("DirScan::DirScan(): `"+path+"' "+f);
}


wxThread::ExitCode DirScan::Entry()
{
  wxDir dir(path);
  if( dir.IsOpened() ) {

    wxStopWatch sw;
    sw.Start();
    wxArrayString files;
    wxString filename;
    bool cont = dir.GetFirst(&filename,filter, wxDIR_FILES);
    while ( cont ) {
      if( TestDestroy() ) break;

      wxFileName file(path,filename);
      if( file.IsFileReadable() )
	files.Add(wxFileSystem::FileNameToURL(file));
      else
	wxLogDebug("DirScan: `"+filename+"' is unreadable.");

      //      wxLogDebug("%d",int(sw.Time()));
      if( sw.Time() > 100 ) {
	DirScanEvent ev(EVT_DIR_SCAN);
	ev.finish = false;
	ev.id = id;
	ev.files = files;
	wxQueueEvent(handler,ev.Clone());
	sw.Start();
	files.Empty();
      }

      cont = dir.GetNext(&filename);
      //      Sleep(100);
    }

    DirScanEvent ev(EVT_DIR_SCAN);
    ev.finish = true;
    ev.id = id;
    ev.files = files;
    wxQueueEvent(handler,ev.Clone());
  }

  //  wxLogDebug("DirScan::Entry()  FINISH");

  return (wxThread::ExitCode) 0;
}