15a1d355fSStephan Aßmus // ShareVolume.h 25a1d355fSStephan Aßmus 35a1d355fSStephan Aßmus #ifndef NET_FS_SHARE_VOLUME_H 45a1d355fSStephan Aßmus #define NET_FS_SHARE_VOLUME_H 55a1d355fSStephan Aßmus 65a1d355fSStephan Aßmus #include <fsproto.h> 75a1d355fSStephan Aßmus 85a1d355fSStephan Aßmus #include <util/DoublyLinkedList.h> 95a1d355fSStephan Aßmus 105a1d355fSStephan Aßmus #include "EntryInfo.h" 115a1d355fSStephan Aßmus #include "FSObject.h" 125a1d355fSStephan Aßmus #include "Locker.h" 135a1d355fSStephan Aßmus #include "RequestHandler.h" 145a1d355fSStephan Aßmus #include "RequestMemberArray.h" 155a1d355fSStephan Aßmus #include "ServerNodeID.h" 165a1d355fSStephan Aßmus #include "Volume.h" 175a1d355fSStephan Aßmus 185a1d355fSStephan Aßmus class AttrDirInfo; 195a1d355fSStephan Aßmus class ExtendedServerInfo; 205a1d355fSStephan Aßmus class ExtendedShareInfo; 215a1d355fSStephan Aßmus class Node; 225a1d355fSStephan Aßmus class ReadQueryReply; 235a1d355fSStephan Aßmus class RemoteShareDirIterator; 245a1d355fSStephan Aßmus class RequestConnection; 255a1d355fSStephan Aßmus class RootShareVolume; 265a1d355fSStephan Aßmus class ServerConnection; 275a1d355fSStephan Aßmus class ServerConnectionProvider; 285a1d355fSStephan Aßmus class ShareAttrDirIterator; 295a1d355fSStephan Aßmus class ShareDir; 305a1d355fSStephan Aßmus class ShareDirEntry; 315a1d355fSStephan Aßmus class ShareNode; 325a1d355fSStephan Aßmus class WalkReply; 335a1d355fSStephan Aßmus 345a1d355fSStephan Aßmus class ShareVolume : public Volume { 355a1d355fSStephan Aßmus public: 365a1d355fSStephan Aßmus ShareVolume(VolumeManager* volumeManager, 375a1d355fSStephan Aßmus ServerConnectionProvider* 385a1d355fSStephan Aßmus connectionProvider, 395a1d355fSStephan Aßmus ExtendedServerInfo* serverInfo, 405a1d355fSStephan Aßmus ExtendedShareInfo* shareInfo); 415a1d355fSStephan Aßmus ~ShareVolume(); 425a1d355fSStephan Aßmus 435a1d355fSStephan Aßmus int32 GetID() const; 445a1d355fSStephan Aßmus 455a1d355fSStephan Aßmus bool IsReadOnly() const; 465a1d355fSStephan Aßmus bool SupportsQueries() const; 475a1d355fSStephan Aßmus 485a1d355fSStephan Aßmus status_t Init(const char* name); 495a1d355fSStephan Aßmus void Uninit(); 505a1d355fSStephan Aßmus 515a1d355fSStephan Aßmus virtual Node* GetRootNode() const; 525a1d355fSStephan Aßmus 535a1d355fSStephan Aßmus virtual void PrepareToUnmount(); 545a1d355fSStephan Aßmus 555a1d355fSStephan Aßmus virtual void RemoveChildVolume(Volume* volume); 565a1d355fSStephan Aßmus 575a1d355fSStephan Aßmus // FS 585a1d355fSStephan Aßmus virtual status_t Unmount(); 595a1d355fSStephan Aßmus virtual status_t Sync(); 605a1d355fSStephan Aßmus 615a1d355fSStephan Aßmus // vnodes 625a1d355fSStephan Aßmus virtual status_t ReadVNode(vnode_id vnid, char reenter, 635a1d355fSStephan Aßmus Node** node); 645a1d355fSStephan Aßmus virtual status_t WriteVNode(Node* node, char reenter); 655a1d355fSStephan Aßmus virtual status_t RemoveVNode(Node* node, char reenter); 665a1d355fSStephan Aßmus 675a1d355fSStephan Aßmus // nodes 685a1d355fSStephan Aßmus virtual status_t FSync(Node* node); 695a1d355fSStephan Aßmus virtual status_t ReadStat(Node* node, struct stat* st); 705a1d355fSStephan Aßmus virtual status_t WriteStat(Node* node, struct stat *st, 715a1d355fSStephan Aßmus uint32 mask); 725a1d355fSStephan Aßmus virtual status_t Access(Node* node, int mode); 735a1d355fSStephan Aßmus 745a1d355fSStephan Aßmus // files 755a1d355fSStephan Aßmus virtual status_t Create(Node* dir, const char* name, 765a1d355fSStephan Aßmus int openMode, int mode, vnode_id* vnid, 775a1d355fSStephan Aßmus void** cookie); 785a1d355fSStephan Aßmus virtual status_t Open(Node* node, int openMode, 795a1d355fSStephan Aßmus void** cookie); 805a1d355fSStephan Aßmus virtual status_t Close(Node* node, void* cookie); 815a1d355fSStephan Aßmus virtual status_t FreeCookie(Node* node, void* cookie); 825a1d355fSStephan Aßmus virtual status_t Read(Node* node, void* cookie, off_t pos, 835a1d355fSStephan Aßmus void* buffer, size_t bufferSize, 845a1d355fSStephan Aßmus size_t* bytesRead); 855a1d355fSStephan Aßmus virtual status_t Write(Node* node, void* cookie, off_t pos, 865a1d355fSStephan Aßmus const void* buffer, size_t bufferSize, 875a1d355fSStephan Aßmus size_t* bytesWritten); 885a1d355fSStephan Aßmus 895a1d355fSStephan Aßmus // hard links / symlinks 905a1d355fSStephan Aßmus virtual status_t Link(Node* dir, const char* name, 915a1d355fSStephan Aßmus Node* node); 925a1d355fSStephan Aßmus virtual status_t Unlink(Node* dir, const char* name); 935a1d355fSStephan Aßmus virtual status_t Symlink(Node* dir, const char* name, 945a1d355fSStephan Aßmus const char* target); 955a1d355fSStephan Aßmus virtual status_t ReadLink(Node* node, char* buffer, 965a1d355fSStephan Aßmus size_t bufferSize, size_t* bytesRead); 975a1d355fSStephan Aßmus virtual status_t Rename(Node* oldDir, const char* oldName, 985a1d355fSStephan Aßmus Node* newDir, const char* newName); 995a1d355fSStephan Aßmus 1005a1d355fSStephan Aßmus // directories 1015a1d355fSStephan Aßmus virtual status_t MkDir(Node* dir, const char* name, 1025a1d355fSStephan Aßmus int mode); 1035a1d355fSStephan Aßmus virtual status_t RmDir(Node* dir, const char* name); 1045a1d355fSStephan Aßmus virtual status_t OpenDir(Node* node, void** cookie); 1055a1d355fSStephan Aßmus virtual status_t CloseDir(Node* node, void* cookie); 1065a1d355fSStephan Aßmus virtual status_t FreeDirCookie(Node* node, void* cookie); 1075a1d355fSStephan Aßmus virtual status_t ReadDir(Node* node, void* cookie, 1085a1d355fSStephan Aßmus struct dirent* buffer, size_t bufferSize, 1095a1d355fSStephan Aßmus int32 count, int32* countRead); 1105a1d355fSStephan Aßmus virtual status_t RewindDir(Node* node, void* cookie); 1115a1d355fSStephan Aßmus virtual status_t Walk(Node* dir, const char* entryName, 1125a1d355fSStephan Aßmus char** resolvedPath, vnode_id* vnid); 1135a1d355fSStephan Aßmus 1145a1d355fSStephan Aßmus // attributes 1155a1d355fSStephan Aßmus virtual status_t OpenAttrDir(Node* node, void** cookie); 1165a1d355fSStephan Aßmus virtual status_t CloseAttrDir(Node* node, void* cookie); 1175a1d355fSStephan Aßmus virtual status_t FreeAttrDirCookie(Node* node, 1185a1d355fSStephan Aßmus void* cookie); 1195a1d355fSStephan Aßmus virtual status_t ReadAttrDir(Node* node, void* cookie, 1205a1d355fSStephan Aßmus struct dirent* buffer, size_t bufferSize, 1215a1d355fSStephan Aßmus int32 count, int32* countRead); 1225a1d355fSStephan Aßmus virtual status_t RewindAttrDir(Node* node, void* cookie); 1235a1d355fSStephan Aßmus virtual status_t ReadAttr(Node* node, const char* name, 1245a1d355fSStephan Aßmus int type, off_t pos, void* buffer, 1255a1d355fSStephan Aßmus size_t bufferSize, size_t* bytesRead); 1265a1d355fSStephan Aßmus virtual status_t WriteAttr(Node* node, const char* name, 1275a1d355fSStephan Aßmus int type, off_t pos, const void* buffer, 1285a1d355fSStephan Aßmus size_t bufferSize, size_t* bytesWritten); 1295a1d355fSStephan Aßmus virtual status_t RemoveAttr(Node* node, const char* name); 1305a1d355fSStephan Aßmus virtual status_t RenameAttr(Node* node, 1315a1d355fSStephan Aßmus const char* oldName, const char* newName); 1325a1d355fSStephan Aßmus virtual status_t StatAttr(Node* node, const char* name, 1335a1d355fSStephan Aßmus struct attr_info* attrInfo); 1345a1d355fSStephan Aßmus 1355a1d355fSStephan Aßmus // queries 1365a1d355fSStephan Aßmus status_t GetQueryEntry(const EntryInfo& entryInfo, 1375a1d355fSStephan Aßmus const NodeInfo& dirInfo, 1385a1d355fSStephan Aßmus struct dirent* buffer, size_t bufferSize, 1395a1d355fSStephan Aßmus int32* countRead); 1405a1d355fSStephan Aßmus 1415a1d355fSStephan Aßmus 1425a1d355fSStephan Aßmus // service methods called from "outside" 1435a1d355fSStephan Aßmus void ProcessNodeMonitoringRequest( 1445a1d355fSStephan Aßmus NodeMonitoringRequest* request); 1455a1d355fSStephan Aßmus void ConnectionClosed(); 1465a1d355fSStephan Aßmus 1475a1d355fSStephan Aßmus private: 1485a1d355fSStephan Aßmus struct NodeMap; 1495a1d355fSStephan Aßmus struct EntryKey; 1505a1d355fSStephan Aßmus struct EntryMap; 1515a1d355fSStephan Aßmus struct LocalNodeIDMap; 1525a1d355fSStephan Aßmus struct RemoteNodeIDMap; 1535a1d355fSStephan Aßmus struct DirCookie; 1545a1d355fSStephan Aßmus struct AttrDirCookie; 1555a1d355fSStephan Aßmus struct AttrDirIteratorMap; 1565a1d355fSStephan Aßmus 1575a1d355fSStephan Aßmus private: 1585a1d355fSStephan Aßmus status_t _ReadRemoteDir(ShareDir* directory, 1595a1d355fSStephan Aßmus RemoteShareDirIterator* remoteIterator); 1605a1d355fSStephan Aßmus 1615a1d355fSStephan Aßmus void _HandleEntryCreatedRequest( 1625a1d355fSStephan Aßmus EntryCreatedRequest* request); 1635a1d355fSStephan Aßmus void _HandleEntryRemovedRequest( 1645a1d355fSStephan Aßmus EntryRemovedRequest* request); 1655a1d355fSStephan Aßmus void _HandleEntryMovedRequest( 1665a1d355fSStephan Aßmus EntryMovedRequest* request); 1675a1d355fSStephan Aßmus void _HandleStatChangedRequest( 1685a1d355fSStephan Aßmus StatChangedRequest* request); 1695a1d355fSStephan Aßmus void _HandleAttributeChangedRequest( 1705a1d355fSStephan Aßmus AttributeChangedRequest* request); 1715a1d355fSStephan Aßmus 1725a1d355fSStephan Aßmus status_t _GetLocalNodeID(NodeID remoteID, ino_t* localID, 1735a1d355fSStephan Aßmus bool enter); 1745a1d355fSStephan Aßmus status_t _GetRemoteNodeID(ino_t localID, 1755a1d355fSStephan Aßmus NodeID* remoteID); 1765a1d355fSStephan Aßmus void _RemoveLocalNodeID(ino_t localID); 1775a1d355fSStephan Aßmus 1785a1d355fSStephan Aßmus ShareNode* _GetNodeByLocalID(ino_t localID); 1795a1d355fSStephan Aßmus ShareNode* _GetNodeByRemoteID(NodeID remoteID); 1805a1d355fSStephan Aßmus status_t _LoadNode(const NodeInfo& nodeInfo, 1815a1d355fSStephan Aßmus ShareNode** node); 1825a1d355fSStephan Aßmus status_t _UpdateNode(const NodeInfo& nodeInfo); 1835a1d355fSStephan Aßmus 1845a1d355fSStephan Aßmus ShareDirEntry* _GetEntryByLocalID(ino_t localDirID, 1855a1d355fSStephan Aßmus const char* name); 1865a1d355fSStephan Aßmus ShareDirEntry* _GetEntryByRemoteID(NodeID remoteDirID, 1875a1d355fSStephan Aßmus const char* name); 1885a1d355fSStephan Aßmus status_t _LoadEntry(ShareDir* directory, 1895a1d355fSStephan Aßmus const EntryInfo& entryInfo, 1905a1d355fSStephan Aßmus ShareDirEntry** entry); 1915a1d355fSStephan Aßmus void _RemoveEntry(ShareDirEntry* entry); 1925a1d355fSStephan Aßmus bool _IsObsoleteEntryInfo( 1935a1d355fSStephan Aßmus const EntryInfo& entryInfo); 1945a1d355fSStephan Aßmus 1955a1d355fSStephan Aßmus status_t _AddAttrDirIterator(ShareNode* node, 1965a1d355fSStephan Aßmus ShareAttrDirIterator* iterator); 1975a1d355fSStephan Aßmus void _RemoveAttrDirIterator(ShareNode* node, 1985a1d355fSStephan Aßmus ShareAttrDirIterator* iterator); 1995a1d355fSStephan Aßmus status_t _LoadAttrDir(ShareNode* node, 2005a1d355fSStephan Aßmus const AttrDirInfo& attrDirInfo); 2015a1d355fSStephan Aßmus status_t _UpdateAttrDir(NodeID remoteID, 2025a1d355fSStephan Aßmus const AttrDirInfo& attrDirInfo); 2035a1d355fSStephan Aßmus 2045a1d355fSStephan Aßmus void _NodeRemoved(NodeID remoteID); 2055a1d355fSStephan Aßmus void _EntryCreated(NodeID remoteDirID, 2065a1d355fSStephan Aßmus const char* name, 2075a1d355fSStephan Aßmus const EntryInfo* entryInfo, int64 revision); 2085a1d355fSStephan Aßmus void _EntryRemoved(NodeID remoteDirID, 2095a1d355fSStephan Aßmus const char* name, int64 revision); 2105a1d355fSStephan Aßmus void _EntryMoved(NodeID remoteOldDirID, 2115a1d355fSStephan Aßmus const char* oldName, NodeID remoteNewDirID, 2125a1d355fSStephan Aßmus const char* name, 2135a1d355fSStephan Aßmus const EntryInfo* entryInfo, int64 revision); 2145a1d355fSStephan Aßmus 2155a1d355fSStephan Aßmus status_t _Walk(NodeID remoteDirID, const char* entryName, 2165a1d355fSStephan Aßmus bool resolveLink, WalkReply** reply); 2175a1d355fSStephan Aßmus status_t _MultiWalk( 2185a1d355fSStephan Aßmus RequestMemberArray<EntryInfo>& entryInfos, 2195a1d355fSStephan Aßmus MultiWalkReply** reply); 220*59ecfa6cSAugustin Cavalier status_t _Close(intptr_t cookie); 2215a1d355fSStephan Aßmus 2225a1d355fSStephan Aßmus uint32 _GetConnectionState(); 2235a1d355fSStephan Aßmus bool _IsConnected(); 2245a1d355fSStephan Aßmus bool _EnsureShareMounted(); 2255a1d355fSStephan Aßmus status_t _MountShare(); 2265a1d355fSStephan Aßmus 2275a1d355fSStephan Aßmus private: 2285a1d355fSStephan Aßmus int32 fID; 2295a1d355fSStephan Aßmus uint32 fFlags; 2305a1d355fSStephan Aßmus Locker fMountLock; 2315a1d355fSStephan Aßmus ShareDir* fRootNode; 2325a1d355fSStephan Aßmus NodeMap* fNodes; // local ID -> ShareNode 2335a1d355fSStephan Aßmus EntryMap* fEntries; // local ID, name -> ShareDirEntry 2345a1d355fSStephan Aßmus AttrDirIteratorMap* fAttrDirIterators; 2355a1d355fSStephan Aßmus // local ID -> DoublyLinkedList<> 2365a1d355fSStephan Aßmus LocalNodeIDMap* fLocalNodeIDs; // remote ID -> local ID 2375a1d355fSStephan Aßmus RemoteNodeIDMap* fRemoteNodeIDs; // local ID -> remote ID 2385a1d355fSStephan Aßmus ServerConnectionProvider* fServerConnectionProvider; 2395a1d355fSStephan Aßmus ExtendedServerInfo* fServerInfo; 2405a1d355fSStephan Aßmus ExtendedShareInfo* fShareInfo; 2415a1d355fSStephan Aßmus ServerConnection* fServerConnection; 2425a1d355fSStephan Aßmus RequestConnection* fConnection; 2435a1d355fSStephan Aßmus uint32 fSharePermissions; 2445a1d355fSStephan Aßmus uint32 fConnectionState; 2455a1d355fSStephan Aßmus }; 2465a1d355fSStephan Aßmus 2475a1d355fSStephan Aßmus #endif // NET_FS_SHARE_VOLUME_H 248