6#include <icomp/CComponentBase.h>
7#include <imod/TModelWrap.h>
8#include <ifile/ITempFileManager.h>
9#include <iprm/IParamsSet.h>
10#include <imod/TSingleModelObserverBase.h>
13#include <imtbase/IProgressSessionsManager.h>
14#include <imtservergql/ICollectionImportController.h>
15#include <imtservergql/IFileUploadHandler.h>
16#include <imtservergql/ICollectionImportJobParamsFiller.h>
17#include <imthype/IJobQueueManager.h>
18#include <imtbase/TModelUpdateBinder.h>
25class CCollectionImportControllerComp:
26 public icomp::CComponentBase,
27 virtual public ICollectionImportController,
28 virtual public IFileUploadHandler
30 Q_DECLARE_TR_FUNCTIONS(CCollectionImportControllerComp)
32 typedef CComponentBase BaseClass;
34 I_BEGIN_COMPONENT(CCollectionImportControllerComp);
35 I_REGISTER_INTERFACE(ICollectionImportController)
36 I_REGISTER_INTERFACE(IFileUploadHandler)
37 I_ASSIGN_MULTI_0(m_collectionIdAttrPtr,
"CollectionId",
"Collection ID associated with import job type ID",
false);
38 I_ASSIGN_MULTI_0(m_jobTypeIdAttrPtr,
"ImportJobTypeId",
"Import job type ID associated with collection ID",
false);
39 I_ASSIGN_MULTI_0(m_paramsFillerCompPtr,
"CollectionImportJobParamsFiller",
"Collection import job params filler associated with collection ID",
false);
40 I_ASSIGN_MULTI_0(m_jobParamsFactPtr,
"JobParamsFactory",
"Job params factory associated with collection ID",
false);
41 I_ASSIGN(m_fileManagerCompPtr,
"TempFileManager",
"Temporary file manager for uploaded files",
true,
"TempFileManager");
42 I_ASSIGN(m_progressSessionManagerCompPtr,
"ProgressSessionManager",
"ProgressSessionManager",
true,
"ProgressSessionManager");
43 I_ASSIGN(m_jobQueueManagerCompPtr,
"JobQueueManager",
"Job queue manager",
true,
"JobQueueManager");
46 CCollectionImportControllerComp();
49 virtual bool BeginCollectionImportSession(
const SessionInfo& sessionInfo, QString& errorMessage)
override;
50 virtual bool CancelCollectionImportSession(
const QByteArray& sessionId, QString& errorMessage)
override;
54 const QByteArray& fileId,
55 const istd::CIntRange& range,
56 const QByteArray& data)
override;
60 void OnComponentCreated()
override;
61 void OnComponentDestroyed()
override;
64 class ProgressLogger:
public ibase::IProgressLogger
67 void SetParent(CCollectionImportControllerComp& parent);
70 virtual void OnProgress(
double currentProgress)
override;
71 virtual bool IsCanceled()
const override;
76 std::unique_ptr<ibase::IProgressManager> progressManagerPtr;
77 std::unique_ptr<ibase::IProgressLogger> progressLoggerPtr;
78 double m_progress = 0;
80 CCollectionImportControllerComp* parentPtr =
nullptr;
82 typedef std::shared_ptr<ProgressLogger> ProgressLoggerPtr;
84 struct WorkingFileInfo:
public FileInfo
86 QByteArray tempFileId;
87 ProgressLoggerPtr uploadProgressLoggerPtr;
88 QList<istd::CIntRange> uploadedChunks;
91 struct WorkingSessionInfo:
public SessionInfo
93 QMap<QByteArray, WorkingFileInfo> files;
96 QByteArray tempFileSessionId;
97 ibase::IProgressManager* mainProgressManagerPtr =
nullptr;
98 std::unique_ptr<ibase::IProgressManager> uploadProgressManagerPtr;
99 std::unique_ptr<ibase::IProgressManager> fileProcessingProgressManagerPtr;
100 std::unique_ptr<ibase::IProgressLogger> fileProcessingProgressLoggerPtr;
103 typedef std::shared_ptr<WorkingSessionInfo> SessionInfoPtr;
106 bool PrepareProgressManager(WorkingSessionInfo& session)
const;
107 void UploadProgressChanged(QByteArray sessionId, QByteArray fileId);
108 bool StartImportJob(WorkingSessionInfo& session);
110 int FindCollectionIndex(
const QByteArray& collectionId)
const;
112 QByteArray FindSession(
const QByteArray& fileId)
const;
113 WorkingFileInfo* FindFileInfo(
const QByteArray& fileId);
114 FilelUploadStatus AddFileChunk(
const QByteArray& fileId,
const istd::CIntRange& range);
115 double GetFileProgress(
const QByteArray& fileId);
116 void UpdateUploadProgress(
const QByteArray& fileId);
119 I_MULTIATTR(QByteArray, m_collectionIdAttrPtr);
120 I_MULTIATTR(QByteArray, m_jobTypeIdAttrPtr);
121 I_MULTIREF(imtservergql::ICollectionImportJobParamsFiller, m_paramsFillerCompPtr);
122 I_MULTIFACT(iprm::IParamsSet, m_jobParamsFactPtr);
123 I_REF(ifile::ITempFileManager, m_fileManagerCompPtr);
127 QMap<QByteArray, SessionInfoPtr> m_sessions;
129 mutable QRecursiveMutex m_mutex;
FilelUploadStatus
Status codes returned by ReceiveFileChunk().