/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ #ifndef RCJOB_H #define RCJOB_H #include #include #include #include #include #include "RCCommon.h" #include "native/utilities/PlatformConfiguration.h" #include #include #include "native/assetprocessor.h" #include #include namespace AssetProcessor { struct AssetRecognizer; class RCJob; //! Params Base class struct Params { Params(AssetProcessor::RCJob* job = nullptr) : m_rcJob(job) {} virtual ~Params() = default; AssetProcessor::RCJob* m_rcJob; QString m_finalOutputDir; Params(const Params&) = default; virtual bool IsValidParams() const; }; //! RCParams contains info that is required by the rc struct RCParams : public Params { QString m_rootDir; QString m_rcExe; QString m_inputFile; QString m_platformIdentifier; QString m_params; RCParams(AssetProcessor::RCJob* job = nullptr) : Params(job) {} RCParams(const RCParams&) = default; bool IsValidParams() const override; }; //! BuilderParams contains info that is required by the builders struct BuilderParams : public Params { AssetBuilderSDK::ProcessJobRequest m_processJobRequest; AssetBuilderSDK::AssetBuilderDesc m_assetBuilderDesc; QString m_serverKey; BuilderParams(AssetProcessor::RCJob* job = nullptr) : Params(job) {} BuilderParams(const BuilderParams&) = default; AZStd::string GetTempJobDirectory() const; QString GetServerKey() const; }; //! JobOutputInfo is used to store job related messages. //! Messages can be an error or just some information. struct JobOutputInfo { QString m_windowName; // window name is used to specify whether it is an error or not QString m_message;// the actual message JobOutputInfo() = default; JobOutputInfo(QString window, QString message) : m_windowName(window) , m_message(message) { } }; /** * The RCJob class contains all the necessary information about a single RC job */ class RCJob : public QObject { Q_OBJECT public: enum JobState { pending, processing, completed, crashed, terminated, cancelled, failed, }; explicit RCJob(QObject* parent = 0); virtual ~RCJob(); void Init(JobDetails& details); QString Params() const; QString CommandLine() const; QDateTime GetTimeCreated() const; void SetTimeCreated(const QDateTime& timeCreated); QDateTime GetTimeLaunched() const; void SetTimeLaunched(const QDateTime& timeLaunched); QDateTime GetTimeCompleted() const; void SetTimeCompleted(const QDateTime& timeCompleted); void SetOriginalFingerprint(AZ::u32 originalFingerprint); AZ::u32 GetOriginalFingerprint() const; QString GetConsoleOutput() const; void SetConsoleOutput(QString rcOut); JobState GetState() const; void SetState(const JobState& state); const AZ::Uuid& GetInputFileUuid() const; QString GetDestination() const; //! the final output path is where the actual outputs are copied when processing succeeds //! this will be in the asset cache, in the gamename / platform / gamename folder. QString GetFinalOutputPath() const; const AssetProcessor::AssetRecognizer* GetRecognizer() const; void SetRecognizer(const AssetProcessor::AssetRecognizer* value); const AssetBuilderSDK::PlatformInfo& GetPlatformInfo() const; // intentionally non-const to move. AssetBuilderSDK::ProcessJobResponse& GetProcessJobResponse(); const JobEntry& GetJobEntry() const; void Start(); const QueueElementID& GetElementID() const { return m_queueElementID; } const int JobEscalation() { return m_JobEscalation; } void SetJobEscalation(int jobEscalation); void SetCheckExclusiveLock(bool value); Q_SIGNALS: //! This signal will be emitted when we make sure that no other application has a lock on the source file //! and also that the fingerprint of the source file is stable and not changing. //! This will basically indicate that we are starting to perform work on the current job void BeginWork(); void Finished(); void JobFinished(AssetBuilderSDK::ProcessJobResponse result); public: static QString GetStateDescription(const JobState& state); static void ExecuteBuilderCommand(BuilderParams builderParams); static void AutoFailJob(BuilderParams& builderParams); static bool CopyCompiledAssets(BuilderParams& params, AssetBuilderSDK::ProcessJobResponse& response); //! This method will save the processJobResponse and the job log to the temp directory as xml files. //! We will be modifying absolute paths in processJobResponse before saving it to the disk. static AZ::Outcome> BeforeStoringJobResult(const BuilderParams& builderParams, AssetBuilderSDK::ProcessJobResponse jobResponse); //! This method will retrieve the processJobResponse and the job log from the temp directory. //! This method is also responsible for emitting the server job logs to the local job log file. static bool AfterRetrievingJobResult(const BuilderParams& builderParams, AssetUtilities::JobLogTraceListener& jobLogTraceListener, AssetBuilderSDK::ProcessJobResponse& jobResponse); QString GetJobKey() const; AZ::Uuid GetBuilderGuid() const; bool IsCritical() const; bool IsAutoFail() const; int GetPriority() const; const AZStd::vector& GetJobDependencies(); protected: //! DoWork ensure that the job is ready for being processing and than makes the actual builder call virtual void DoWork(AssetBuilderSDK::ProcessJobResponse& result, BuilderParams& builderParams, AssetUtilities::QuitListener& listener); void PopulateProcessJobRequest(AssetBuilderSDK::ProcessJobRequest& processJobRequest); private: JobDetails m_jobDetails; JobState m_jobState; QueueElementID m_queueElementID; // cached to prevent lots of construction of this all over the place int m_JobEscalation = AssetProcessor::JobEscalation::Default; // Escalation indicates how important the job is and how soon it needs processing, the greater the number the greater the escalation QDateTime m_timeCreated; QDateTime m_timeLaunched; QDateTime m_timeCompleted; unsigned int m_exitCode = 0; AzToolsFramework::AssetDatabase::ProductDatabaseEntryContainer m_products; AssetBuilderSDK::ProcessJobResponse m_processJobResponse; AZ::u32 m_scanFolderID; }; } // namespace AssetProcessor Q_DECLARE_METATYPE(AssetProcessor::BuilderParams); Q_DECLARE_METATYPE(AssetProcessor::JobOutputInfo); Q_DECLARE_METATYPE(AssetProcessor::RCParams); #endif // RCJOB_H