1*08c9600aSClemens Zeidler /* 2*08c9600aSClemens Zeidler * Copyright 2011, Haiku, Inc. All rights reserved. 3*08c9600aSClemens Zeidler * Distributed under the terms of the MIT License. 4*08c9600aSClemens Zeidler * 5*08c9600aSClemens Zeidler * Authors: 6*08c9600aSClemens Zeidler * Clemens Zeidler <haiku@clemens-zeidler.de> 7*08c9600aSClemens Zeidler */ 8*08c9600aSClemens Zeidler #ifndef FILE_MONITOR_H 9*08c9600aSClemens Zeidler #define FILE_MONITOR_H 10*08c9600aSClemens Zeidler 11*08c9600aSClemens Zeidler 12*08c9600aSClemens Zeidler #include <map> 13*08c9600aSClemens Zeidler #include <vector> 14*08c9600aSClemens Zeidler 15*08c9600aSClemens Zeidler #include <Entry.h> 16*08c9600aSClemens Zeidler #include <Node.h> 17*08c9600aSClemens Zeidler 18*08c9600aSClemens Zeidler #include "NodeMonitorHandler.h" 19*08c9600aSClemens Zeidler 20*08c9600aSClemens Zeidler 21*08c9600aSClemens Zeidler struct WatchedFile { 22*08c9600aSClemens Zeidler entry_ref entry; 23*08c9600aSClemens Zeidler node_ref node; 24*08c9600aSClemens Zeidler /*! Don't use it as the primary cookie storage. To be set in EntryCreated 25*08c9600aSClemens Zeidler in EntryViewInterface. */ 26*08c9600aSClemens Zeidler void* cookie; 27*08c9600aSClemens Zeidler }; 28*08c9600aSClemens Zeidler 29*08c9600aSClemens Zeidler 30*08c9600aSClemens Zeidler class NodeRefComp { 31*08c9600aSClemens Zeidler public: 32*08c9600aSClemens Zeidler bool 33*08c9600aSClemens Zeidler operator()(const node_ref& a, const node_ref& b) 34*08c9600aSClemens Zeidler { 35*08c9600aSClemens Zeidler return a.node < b.node; 36*08c9600aSClemens Zeidler } 37*08c9600aSClemens Zeidler }; 38*08c9600aSClemens Zeidler 39*08c9600aSClemens Zeidler 40*08c9600aSClemens Zeidler typedef std::map<node_ref, WatchedFile, NodeRefComp> WatchedFileList; 41*08c9600aSClemens Zeidler 42*08c9600aSClemens Zeidler 43*08c9600aSClemens Zeidler class EntryViewInterface { 44*08c9600aSClemens Zeidler public: 45*08c9600aSClemens Zeidler virtual ~EntryViewInterface() {}; 46*08c9600aSClemens Zeidler 47*08c9600aSClemens Zeidler virtual void EntryCreated(WatchedFile* file) {}; 48*08c9600aSClemens Zeidler virtual void EntryRemoved(WatchedFile* file) {}; 49*08c9600aSClemens Zeidler virtual void EntryMoved(WatchedFile* file) {}; 50*08c9600aSClemens Zeidler virtual void StatChanged(WatchedFile* file) {}; 51*08c9600aSClemens Zeidler virtual void AttrChanged(WatchedFile* file) {}; 52*08c9600aSClemens Zeidler 53*08c9600aSClemens Zeidler virtual void EntriesCleared() {}; 54*08c9600aSClemens Zeidler }; 55*08c9600aSClemens Zeidler 56*08c9600aSClemens Zeidler 57*08c9600aSClemens Zeidler const uint32 kMsgAddRefs = '&adr'; 58*08c9600aSClemens Zeidler const uint32 kMsgCleared = '&clr'; 59*08c9600aSClemens Zeidler 60*08c9600aSClemens Zeidler 61*08c9600aSClemens Zeidler typedef std::vector<entry_ref> RefList; 62*08c9600aSClemens Zeidler 63*08c9600aSClemens Zeidler 64*08c9600aSClemens Zeidler class ReadThread; 65*08c9600aSClemens Zeidler 66*08c9600aSClemens Zeidler 67*08c9600aSClemens Zeidler class FileMonitor : public NodeMonitorHandler { 68*08c9600aSClemens Zeidler public: 69*08c9600aSClemens Zeidler FileMonitor(EntryViewInterface* listener); 70*08c9600aSClemens Zeidler ~FileMonitor(); 71*08c9600aSClemens Zeidler 72*08c9600aSClemens Zeidler void SetReadThread(ReadThread* readThread); 73*08c9600aSClemens Zeidler 74*08c9600aSClemens Zeidler void Reset(); 75*08c9600aSClemens Zeidler 76*08c9600aSClemens Zeidler virtual void MessageReceived(BMessage* message); 77*08c9600aSClemens Zeidler 78*08c9600aSClemens Zeidler virtual void EntryCreated(const char *name, ino_t directory, 79*08c9600aSClemens Zeidler dev_t device, ino_t node); 80*08c9600aSClemens Zeidler virtual void EntryRemoved(const char *name, ino_t directory, 81*08c9600aSClemens Zeidler dev_t device, ino_t node); 82*08c9600aSClemens Zeidler virtual void EntryMoved(const char *name, 83*08c9600aSClemens Zeidler const char *fromName, ino_t fromDirectory, 84*08c9600aSClemens Zeidler ino_t toDirectory, dev_t device, 85*08c9600aSClemens Zeidler ino_t node, dev_t nodeDevice); 86*08c9600aSClemens Zeidler virtual void StatChanged(ino_t node, dev_t device, 87*08c9600aSClemens Zeidler int32 statFields); 88*08c9600aSClemens Zeidler virtual void AttrChanged(ino_t node, dev_t device); 89*08c9600aSClemens Zeidler 90*08c9600aSClemens Zeidler private: 91*08c9600aSClemens Zeidler WatchedFile* _FindFile(dev_t device, ino_t node); 92*08c9600aSClemens Zeidler 93*08c9600aSClemens Zeidler EntryViewInterface* fListener; 94*08c9600aSClemens Zeidler WatchedFileList fWatchedFileList; 95*08c9600aSClemens Zeidler 96*08c9600aSClemens Zeidler ReadThread* fReadThread; 97*08c9600aSClemens Zeidler RefList* fCurrentReadList; 98*08c9600aSClemens Zeidler uint32 fCurrentReadIndex; 99*08c9600aSClemens Zeidler }; 100*08c9600aSClemens Zeidler 101*08c9600aSClemens Zeidler 102*08c9600aSClemens Zeidler class ReadThread { 103*08c9600aSClemens Zeidler public: 104*08c9600aSClemens Zeidler ReadThread(FileMonitor* target); 105*08c9600aSClemens Zeidler virtual ~ReadThread() {} 106*08c9600aSClemens Zeidler 107*08c9600aSClemens Zeidler status_t Run(); 108*08c9600aSClemens Zeidler bool Running(); 109*08c9600aSClemens Zeidler status_t Wait(); 110*08c9600aSClemens Zeidler 111*08c9600aSClemens Zeidler void Stop(); 112*08c9600aSClemens Zeidler bool Stopped(); 113*08c9600aSClemens Zeidler 114*08c9600aSClemens Zeidler RefList* ReadRefList(); 115*08c9600aSClemens Zeidler void ReadDone(); 116*08c9600aSClemens Zeidler 117*08c9600aSClemens Zeidler protected: 118*08c9600aSClemens Zeidler virtual bool ReadNextEntry(entry_ref& entry) = 0; 119*08c9600aSClemens Zeidler 120*08c9600aSClemens Zeidler int32 Process(); 121*08c9600aSClemens Zeidler 122*08c9600aSClemens Zeidler friend int32 ReadThreadFunction(void *data); 123*08c9600aSClemens Zeidler 124*08c9600aSClemens Zeidler BHandler* fTarget; 125*08c9600aSClemens Zeidler 126*08c9600aSClemens Zeidler RefList fRefList1; 127*08c9600aSClemens Zeidler RefList fRefList2; 128*08c9600aSClemens Zeidler RefList* fWriteRefList; 129*08c9600aSClemens Zeidler RefList* fReadRefList; 130*08c9600aSClemens Zeidler bool fReading; 131*08c9600aSClemens Zeidler 132*08c9600aSClemens Zeidler private: 133*08c9600aSClemens Zeidler void _SwapLists(); 134*08c9600aSClemens Zeidler inline void _PublishEntrys(BMessenger& messenger); 135*08c9600aSClemens Zeidler 136*08c9600aSClemens Zeidler bool fStopped; 137*08c9600aSClemens Zeidler thread_id fThreadId; 138*08c9600aSClemens Zeidler 139*08c9600aSClemens Zeidler int16 fNReaded; 140*08c9600aSClemens Zeidler bool fRunning; 141*08c9600aSClemens Zeidler }; 142*08c9600aSClemens Zeidler 143*08c9600aSClemens Zeidler 144*08c9600aSClemens Zeidler #endif // FILE_MONITOR_H 145