1 #ifdef BUILDING_ECERE_COM
6 public import static "ecere"
12 public class FileSystemIterator : InterfaceFileSystemIterator
15 property char * extensions { set { delete extensions; if(value) extensions = CopyString(value); } get { return extensions; } }
17 public bool Iterate(char * startPath, bool followLinks)
21 Array<FileSystemIteratorStackFrame> stack { };
22 FileSystemIteratorStackFrame frame;
26 char name[MAX_LOCATION] = "";
29 FileGetStats(startPath, stats);
31 FileGetStatsLink(startPath, stats);
32 GetLastDirectory(startPath, name);
33 listDirEntries = OnObject(owner, name, startPath, stats, true);
36 OnEnteringDirectory(owner, startPath);
37 // FileListing should have a sorted = true/false property
38 stack.Add((frame = { { startPath, extensions = extensions } }));
46 if(frame.listing.Find())
48 FileStats stats = followLinks ? frame.listing.stats : frame.listing.lstats;
49 listDirEntries = OnObject(owner, frame.listing.name, frame.listing.path, stats, !iterateStartPath && stack.count == 1);
50 if(stats.attribs.isDirectory)
54 OnEnteringDirectory(owner, frame.listing.path);
55 stack.Add((frame = { { frame.listing.path, extensions = frame.listing.extensions } }));
63 if(stack.count > (iterateStartPath ? 0 : 1))
64 OnLeavingDirectory(owner, frame.listing.directory);
66 stack.lastIterator.Remove();
67 frame = stack.count == 0 ? null : stack.lastIterator.data;
87 public class FileSystemIteratorStackFrame : struct
95 public class InterfaceFileSystemIterator
98 Window owner; // any_object owner; <-- this makes it so that uses of owner are not compiling...
99 // the idea here is to provide iterators with the ability to use arbitrary data when used by instanciation only not defivation.
100 void * data; // any_object data; <-- this... probably the same
101 bool iterateStartPath;
103 virtual bool Iterate(char * startPath, bool followLinks);
104 virtual bool any_object::OnObject(/*any_object data, */char * name, char * path, FileStats stats, bool isRootObject);
105 virtual void any_object::OnEnteringDirectory(/*any_object data, */char * path);
106 virtual void any_object::OnLeavingDirectory(/*any_object data, */char * path);
111 // TODO: implement threaded iteration somehow....
112 static class IteratorThread : Thread
116 //listing = FileListing { dir, extensions = filter.extensions }; // there should be a sorted = true/false