ImagingTools Core SDK
CCollectionImportControllerComp.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// ACF includes
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>
11
12// ImtCore includes
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>
19
20
21namespace imtservergql
22{
23
24
25class CCollectionImportControllerComp:
26 public icomp::CComponentBase,
27 virtual public ICollectionImportController,
28 virtual public IFileUploadHandler
29{
30 Q_DECLARE_TR_FUNCTIONS(CCollectionImportControllerComp)
31public:
32 typedef CComponentBase BaseClass;
33
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");
44 I_END_COMPONENT;
45
46 CCollectionImportControllerComp();
47
48 // reimplemented (imtservergql::ICollectionImportController)
49 virtual bool BeginCollectionImportSession(const SessionInfo& sessionInfo, QString& errorMessage) override;
50 virtual bool CancelCollectionImportSession(const QByteArray& sessionId, QString& errorMessage) override;
51
52 // reimplemented (imtservergql::IFileUploadHandler)
53 virtual FilelUploadStatus ReceiveFileChunk(
54 const QByteArray& fileId,
55 const istd::CIntRange& range,
56 const QByteArray& data) override;
57
58protected:
59 // reimplemented (icomp::CComponentBase)
60 void OnComponentCreated() override;
61 void OnComponentDestroyed() override;
62
63private:
64 class ProgressLogger: public ibase::IProgressLogger
65 {
66 public:
67 void SetParent(CCollectionImportControllerComp& parent);
68
69 // reimplamanted (ibase::IProgressLogger)
70 virtual void OnProgress(double currentProgress) override;
71 virtual bool IsCanceled() const override;
72
73 public:
74 QByteArray sessionId;
75 QByteArray fileId;
76 std::unique_ptr<ibase::IProgressManager> progressManagerPtr;
77 std::unique_ptr<ibase::IProgressLogger> progressLoggerPtr;
78 double m_progress = 0;
79
80 CCollectionImportControllerComp* parentPtr = nullptr;
81 };
82 typedef std::shared_ptr<ProgressLogger> ProgressLoggerPtr;
83
84 struct WorkingFileInfo: public FileInfo
85 {
86 QByteArray tempFileId;
87 ProgressLoggerPtr uploadProgressLoggerPtr;
88 QList<istd::CIntRange> uploadedChunks;
89 };
90
91 struct WorkingSessionInfo: public SessionInfo
92 {
93 QMap<QByteArray, WorkingFileInfo> files;
94 QByteArray jobId;
95
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;
101 };
102
103 typedef std::shared_ptr<WorkingSessionInfo> SessionInfoPtr;
104
105private:
106 bool PrepareProgressManager(WorkingSessionInfo& session) const;
107 void UploadProgressChanged(QByteArray sessionId, QByteArray fileId);
108 bool StartImportJob(WorkingSessionInfo& session);
109 void OnJobQueueChanged(const istd::IChangeable::ChangeSet& changeset, const imthype::IJobQueueManager* modelPtr);
110 int FindCollectionIndex(const QByteArray& collectionId) const;
111
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);
117
118private:
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);
124 I_REF(imtbase::IProgressSessionsManager, m_progressSessionManagerCompPtr);
125 I_REF(imthype::IJobQueueManager, m_jobQueueManagerCompPtr);
126
127 QMap<QByteArray, SessionInfoPtr> m_sessions;
128
129 mutable QRecursiveMutex m_mutex;
130
132};
133
134
135} // namespace imtservergql
136
137
FilelUploadStatus
Status codes returned by ReceiveFileChunk().