fileServer.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #ifndef FILESERVER_H
  9. #define FILESERVER_H
  10. #if !defined(Q_MOC_RUN)
  11. #include <QByteArray>
  12. #include <QDir>
  13. #include <QString>
  14. #include <QHash>
  15. #include <memory>
  16. // currently these headers are there to provide OS 'HANDLE' of the lock-files
  17. #include <AzCore/PlatformIncl.h>
  18. #endif
  19. namespace AZ
  20. {
  21. namespace IO
  22. {
  23. class FileIOBase;
  24. typedef uint32_t HandleType;
  25. }
  26. }
  27. class Connection;
  28. class FileServer
  29. : public QObject
  30. {
  31. Q_OBJECT
  32. Q_PROPERTY(QString rootFolder MEMBER m_displayRoot NOTIFY RootFolderChanged)
  33. Q_PROPERTY(bool realtimeMetrics MEMBER m_realtimeMetrics NOTIFY RealtimeMetricsChanged)
  34. //metrics
  35. Q_PROPERTY(qint64 numOpenRequests MEMBER m_numOpenRequests NOTIFY NumOpenRequestsChanged)
  36. Q_PROPERTY(qint64 numCloseRequests MEMBER m_numCloseRequests NOTIFY NumCloseRequestsChanged)
  37. Q_PROPERTY(qint64 numOpened MEMBER m_numOpened NOTIFY NumOpenedChanged)
  38. Q_PROPERTY(qint64 numClosed MEMBER m_numClosed NOTIFY NumClosedChanged)
  39. Q_PROPERTY(qint64 numReadRequests MEMBER m_numReadRequests NOTIFY NumReadRequestsChanged)
  40. Q_PROPERTY(qint64 numWriteRequests MEMBER m_numWriteRequests NOTIFY NumWriteRequestsChanged)
  41. Q_PROPERTY(qint64 numSeekRequests MEMBER m_numSeekRequests NOTIFY NumSeekRequestsChanged)
  42. Q_PROPERTY(qint64 numTellRequests MEMBER m_numTellRequests NOTIFY NumTellRequestsChanged)
  43. Q_PROPERTY(qint64 numIsReadOnlyRequests MEMBER m_numIsReadOnlyRequests NOTIFY NumIsReadOnlyRequestsChanged)
  44. Q_PROPERTY(qint64 numIsDirectoryRequests MEMBER m_numIsDirectoryRequests NOTIFY NumIsDirectoryRequestsChanged)
  45. Q_PROPERTY(qint64 numSizeRequests MEMBER m_numSizeRequests NOTIFY NumSizeRequestsChanged)
  46. Q_PROPERTY(qint64 numModificationTimeRequests MEMBER m_numModificationTimeRequests NOTIFY NumModificationTimeRequestsChanged)
  47. Q_PROPERTY(qint64 numExistsRequests MEMBER m_numExistsRequests NOTIFY NumExistsRequestsChanged)
  48. Q_PROPERTY(qint64 numFlushRequests MEMBER m_numFlushRequests NOTIFY NumFlushRequestsChanged)
  49. Q_PROPERTY(qint64 numCreatePathRequests MEMBER m_numCreatePathRequests NOTIFY NumCreatePathRequestsChanged)
  50. Q_PROPERTY(qint64 numDestroyPathRequests MEMBER m_numDestroyPathRequests NOTIFY NumDestroyPathRequestsChanged)
  51. Q_PROPERTY(qint64 numRemoveRequests MEMBER m_numRemoveRequests NOTIFY NumRemoveRequestsChanged)
  52. Q_PROPERTY(qint64 numCopyRequests MEMBER m_numCopyRequests NOTIFY NumCopyRequestsChanged)
  53. Q_PROPERTY(qint64 numRenameRequests MEMBER m_numRenameRequests NOTIFY NumRenameRequestsChanged)
  54. Q_PROPERTY(qint64 numFindFileNamesRequests MEMBER m_numFindFileNamesRequests NOTIFY NumFindFileNamesRequestsChanged)
  55. Q_PROPERTY(qint64 bytesRead MEMBER m_bytesRead NOTIFY BytesReadChanged)
  56. Q_PROPERTY(qint64 bytesWritten MEMBER m_bytesWritten NOTIFY BytesWrittenChanged)
  57. Q_PROPERTY(qint64 bytesSent MEMBER m_bytesSent NOTIFY BytesSentChanged)
  58. Q_PROPERTY(qint64 bytesReceived MEMBER m_bytesReceived NOTIFY BytesReceivedChanged)
  59. Q_PROPERTY(qint64 numOpenFiles MEMBER m_numOpenFiles NOTIFY NumOpenFilesChanged)
  60. Q_SIGNALS:
  61. void RootFolderChanged();
  62. void RealtimeMetricsChanged();
  63. //metrics
  64. void NumOpenRequestsChanged();
  65. void NumCloseRequestsChanged();
  66. void NumOpenedChanged();
  67. void NumClosedChanged();
  68. void NumReadRequestsChanged();
  69. void NumWriteRequestsChanged();
  70. void NumSeekRequestsChanged();
  71. void NumTellRequestsChanged();
  72. void NumIsReadOnlyRequestsChanged();
  73. void NumIsDirectoryRequestsChanged();
  74. void NumSizeRequestsChanged();
  75. void NumModificationTimeRequestsChanged();
  76. void NumExistsRequestsChanged();
  77. void NumFlushRequestsChanged();
  78. void NumCreatePathRequestsChanged();
  79. void NumDestroyPathRequestsChanged();
  80. void NumRemoveRequestsChanged();
  81. void NumCopyRequestsChanged();
  82. void NumRenameRequestsChanged();
  83. void NumFindFileNamesRequestsChanged();
  84. void BytesReadChanged();
  85. void BytesWrittenChanged();
  86. void BytesSentChanged();
  87. void BytesReceivedChanged();
  88. void NumOpenFilesChanged();
  89. //per connection metrics
  90. void AddBytesReceived(unsigned int connId, qint64 add, bool update);
  91. void AddBytesSent(unsigned int connId, qint64 add, bool update);
  92. void AddBytesRead(unsigned int connId, qint64 add, bool update);
  93. void AddBytesWritten(unsigned int connId, qint64 add, bool update);
  94. void AddOpenRequest(unsigned int connId, bool update);
  95. void AddCloseRequest(unsigned int connId, bool update);
  96. void AddOpened(unsigned int connId, bool update);
  97. void AddClosed(unsigned int connId, bool update);
  98. void AddReadRequest(unsigned int connId, bool update);
  99. void AddWriteRequest(unsigned int connId, bool update);
  100. void AddTellRequest(unsigned int connId, bool update);
  101. void AddSeekRequest(unsigned int connId, bool update);
  102. void AddIsReadOnlyRequest(unsigned int connId, bool update);
  103. void AddIsDirectoryRequest(unsigned int connId, bool update);
  104. void AddSizeRequest(unsigned int connId, bool update);
  105. void AddModificationTimeRequest(unsigned int connId, bool update);
  106. void AddExistsRequest(unsigned int connId, bool update);
  107. void AddFlushRequest(unsigned int connId, bool update);
  108. void AddCreatePathRequest(unsigned int connId, bool update);
  109. void AddDestroyPathRequest(unsigned int connId, bool update);
  110. void AddRemoveRequest(unsigned int connId, bool update);
  111. void AddCopyRequest(unsigned int connId, bool update);
  112. void AddRenameRequest(unsigned int connId, bool update);
  113. void AddFindFileNamesRequest(unsigned int connId, bool update);
  114. void UpdateBytesReceived(unsigned int connId);
  115. void UpdateBytesSent(unsigned int connId);
  116. void UpdateBytesRead(unsigned int connId);
  117. void UpdateBytesWritten(unsigned int connId);
  118. void UpdateOpenRequest(unsigned int connId);
  119. void UpdateCloseRequest(unsigned int connId);
  120. void UpdateOpened(unsigned int connId);
  121. void UpdateClosed(unsigned int connId);
  122. void UpdateReadRequest(unsigned int connId);
  123. void UpdateWriteRequest(unsigned int connId);
  124. void UpdateTellRequest(unsigned int connId);
  125. void UpdateSeekRequest(unsigned int connId);
  126. void UpdateIsReadOnlyRequest(unsigned int connId);
  127. void UpdateIsDirectoryRequest(unsigned int connId);
  128. void UpdateSizeRequest(unsigned int connId);
  129. void UpdateModificationTimeRequest(unsigned int connId);
  130. void UpdateExistsRequest(unsigned int connId);
  131. void UpdateFlushRequest(unsigned int connId);
  132. void UpdateCreatePathRequest(unsigned int connId);
  133. void UpdateDestroyPathRequest(unsigned int connId);
  134. void UpdateRemoveRequest(unsigned int connId);
  135. void UpdateCopyRequest(unsigned int connId);
  136. void UpdateRenameRequest(unsigned int connId);
  137. void UpdateFindFileNamesRequest(unsigned int connId);
  138. void UpdateConnectionMetrics();
  139. public:
  140. explicit FileServer(QObject* parent = 0);
  141. virtual ~FileServer();
  142. void SetSystemRoot(const QDir& systemRoot);
  143. Q_INVOKABLE void setRealTimeMetrics(bool enable);
  144. public Q_SLOTS:
  145. void ProcessOpenRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  146. void ProcessCloseRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  147. void ProcessReadRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  148. void ProcessWriteRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  149. void ProcessTellRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  150. void ProcessSeekRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  151. void ProcessIsReadOnlyRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  152. void ProcessIsDirectoryRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  153. void ProcessSizeRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  154. void ProcessModificationTimeRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  155. void ProcessExistsRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  156. void ProcessFlushRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  157. void ProcessCreatePathRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  158. void ProcessDestroyPathRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  159. void ProcessRemoveRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  160. void ProcessCopyRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  161. void ProcessRenameRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  162. void ProcessFindFileNamesRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  163. void ProcessFileTreeRequest(unsigned int connId, unsigned int type, unsigned int serial, QByteArray payload);
  164. void UpdateMetrics();
  165. void ConnectionAdded(unsigned int connId, Connection* connection);
  166. void ConnectionRemoved(unsigned int connId);
  167. protected:
  168. template <class R>
  169. void Send(unsigned int connId, unsigned int serial, const R& response);
  170. template <class R>
  171. bool Recv(unsigned int connId, QByteArray payload, R& request);
  172. void RecordFileOp(AZ::IO::FileIOBase* fileIO, const char* op, const AZ::IO::HandleType& fileHandle, const char* moreInfo);
  173. void RecordFileOp(AZ::IO::FileIOBase* fileIO, const char* op, const char* filePath, const char* moreInfo);
  174. void RecordFileOp(AZ::IO::FileIOBase* fileIO, const char* op, const char* sourceFile, const char* destFile, const char* moreInfo);
  175. //! This makes sure that the cache folder exists but is conservative, it only should do this if the game actually makes file requests
  176. //! So we only create a cache folder for VFS-based runs.
  177. void EnsureCacheFolderExists(int connId);
  178. private:
  179. //metrics
  180. qint64 m_numOpenRequests;
  181. qint64 m_numCloseRequests;
  182. qint64 m_numOpened;
  183. qint64 m_numClosed;
  184. qint64 m_numReadRequests;
  185. qint64 m_numWriteRequests;
  186. qint64 m_numTellRequests;
  187. qint64 m_numSeekRequests;
  188. qint64 m_numIsReadOnlyRequests;
  189. qint64 m_numIsDirectoryRequests;
  190. qint64 m_numSizeRequests;
  191. qint64 m_numModificationTimeRequests;
  192. qint64 m_numExistsRequests;
  193. qint64 m_numFlushRequests;
  194. qint64 m_numCreatePathRequests;
  195. qint64 m_numDestroyPathRequests;
  196. qint64 m_numRemoveRequests;
  197. qint64 m_numCopyRequests;
  198. qint64 m_numRenameRequests;
  199. qint64 m_numFindFileNamesRequests;
  200. qint64 m_bytesRead;
  201. qint64 m_bytesWritten;
  202. qint64 m_bytesSent;
  203. qint64 m_bytesReceived;
  204. qint64 m_numOpenFiles;
  205. //root
  206. QString m_displayRoot;
  207. QDir m_systemRoot;
  208. bool m_realtimeMetrics;
  209. // maps connection ID -> LocalFileIO
  210. QHash<unsigned int, std::shared_ptr<AZ::IO::FileIOBase> > m_fileIOs;
  211. #if defined(AZ_PLATFORM_WINDOWS)
  212. QHash<unsigned int, HANDLE> m_locks;
  213. #endif // lockFiles. do NOT use QLockFile, it won't work if other platforms are locking it, it only works for other users of QLockFile
  214. };
  215. #endif // FILESERVER_H