Codeunit 4308 Agent Message Impl., source in 28
Source2526272829metadata in 28
src/System Application/App/Agent/Interaction/Internal/AgentMessageImpl.Codeunit.al276 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace System.Agents;
using System.IO;
using System.Utilities;
codeunit 4308 "Agent Message Impl."
{
Access = Internal;
InherentEntitlements = X;
InherentPermissions = X;
var
GlobalIgnoreAttachment: Boolean;
AttachmentsFilenameLbl: Label 'attachments_task%1_%2.zip', Comment = 'Filename format for downloading multiple attachments as a zip file. %1 = task ID, %2 = date/time stamp', Locked = true;
procedure GetText(TaskID: BigInteger; MessageID: Guid): Text
var
AgentTaskMessage: Record "Agent Task Message";
begin
AgentTaskMessage.Get(TaskID, MessageID);
exit(GetText(AgentTaskMessage));
end;
procedure GetText(var AgentTaskMessage: Record "Agent Task Message"): Text
var
AgentTaskImpl: Codeunit "Agent Task Impl.";
ContentInStream: InStream;
ContentText: Text;
begin
AgentTaskMessage.CalcFields(Content);
AgentTaskMessage.Content.CreateInStream(ContentInStream, AgentTaskImpl.GetDefaultEncoding());
ContentInStream.Read(ContentText);
exit(ContentText);
end;
procedure UpdateText(TaskID: BigInteger; MessageID: Guid; NewMessageText: Text)
var
AgentTaskMessage: Record "Agent Task Message";
begin
AgentTaskMessage."Task ID" := TaskID;
AgentTaskMessage.ID := MessageID;
UpdateText(AgentTaskMessage, NewMessageText);
end;
procedure UpdateText(var AgentTaskMessage: Record "Agent Task Message"; NewMessageText: Text)
var
AgentTaskMessageToModify: Record "Agent Task Message";
AgentTaskImpl: Codeunit "Agent Task Impl.";
ContentOutStream: OutStream;
begin
AgentTaskMessageToModify.Get(AgentTaskMessage."Task ID", AgentTaskMessage.ID);
AgentTaskMessageToModify.Content.CreateOutStream(ContentOutStream, AgentTaskImpl.GetDefaultEncoding());
ContentOutStream.Write(NewMessageText);
AgentTaskMessageToModify.Modify(true);
AgentTaskMessage.Content := AgentTaskMessageToModify.Content;
end;
procedure IsEditable(TaskID: BigInteger; MessageID: Guid): Boolean
var
AgentTaskMessage: Record "Agent Task Message";
begin
AgentTaskMessage.Get(TaskID, MessageID);
exit(IsEditable(AgentTaskMessage));
end;
procedure IsEditable(var AgentTaskMessage: Record "Agent Task Message"): Boolean
begin
if AgentTaskMessage.Type <> AgentTaskMessage.Type::Output then
exit(false);
exit((AgentTaskMessage.Status = AgentTaskMessage.Status::Draft) or (AgentTaskMessage.Status = AgentTaskMessage.Status::" "));
end;
procedure SetStatusToSent(TaskID: BigInteger; MessageID: Guid)
var
AgentTaskMessage: Record "Agent Task Message";
begin
AgentTaskMessage."Task ID" := TaskID;
AgentTaskMessage.ID := MessageID;
SetStatusToSent(AgentTaskMessage);
end;
procedure SetStatusToSent(var AgentTaskMessage: Record "Agent Task Message")
begin
UpdateStatus(AgentTaskMessage, AgentTaskMessage.Status::Sent);
end;
procedure SetIgnoreAttachment(IgnoreAttachment: Boolean)
begin
GlobalIgnoreAttachment := IgnoreAttachment;
end;
procedure AddAttachment(var AgentTaskMessage: Record "Agent Task Message"; var TempAgentTaskFile: Record "Agent Task File" temporary; IgnoredReason: Text[250])
var
AgentTaskImpl: Codeunit "Agent Task Impl.";
FileInstream: InStream;
begin
TempAgentTaskFile.CalcFields(Content);
if not TempAgentTaskFile.Content.HasValue() then
exit;
TempAgentTaskFile.Content.CreateInStream(FileInstream, AgentTaskImpl.GetDefaultEncoding());
AddAttachment(AgentTaskMessage, TempAgentTaskFile."File Name", TempAgentTaskFile."File MIME Type", FileInstream, IgnoredReason);
end;
procedure AddAttachment(var AgentTaskMessage: Record "Agent Task Message"; FileName: Text[250]; FileMIMEType: Text[100]; InStream: InStream)
begin
AddAttachment(AgentTaskMessage, FileName, FileMIMEType, InStream, '');
end;
procedure AddAttachment(var AgentTaskMessage: Record "Agent Task Message"; FileName: Text[250]; FileMIMEType: Text[100]; InStream: InStream; IgnoredReason: Text[250])
var
AgentTaskFile: Record "Agent Task File";
AgentTaskMessageAttachment: Record "Agent Task Message Attachment";
AgentTaskImpl: Codeunit "Agent Task Impl.";
OutStream: OutStream;
begin
// Add attachment to task file
AgentTaskFile."Task ID" := AgentTaskMessage."Task ID";
AgentTaskFile."File Name" := FileName;
AgentTaskFile."File MIME Type" := FileMIMEType;
AgentTaskFile.Content.CreateOutStream(OutStream, AgentTaskImpl.GetDefaultEncoding());
CopyStream(OutStream, InStream);
AgentTaskFile.Insert();
// Link task file to task message
AgentTaskMessageAttachment."Task ID" := AgentTaskMessage."Task ID";
AgentTaskMessageAttachment."Message ID" := AgentTaskMessage.ID;
AgentTaskMessageAttachment."File ID" := AgentTaskFile.ID;
AgentTaskMessageAttachment.Ignored := GlobalIgnoreAttachment;
AgentTaskMessageAttachment."Ignored Reason" := CopyStr(IgnoredReason, 1, MaxStrLen(AgentTaskMessageAttachment."Ignored Reason"));
AgentTaskMessageAttachment.Insert();
end;
procedure DownloadAttachments(var AgentTaskMessage: Record "Agent Task Message")
var
AgentTaskMessageAttachment: Record "Agent Task Message Attachment";
AgentTaskFile: Record "Agent Task File";
DataCompression: Codeunit "Data Compression";
TempBlob: Codeunit "Temp Blob";
AgentTaskImpl: Codeunit "Agent Task Impl.";
FileInStream: InStream;
ZipOutStream: OutStream;
ZipInStream: InStream;
FileName: Text;
AttachmentCount: Integer;
DownloadDialogTitleLbl: Label 'Download Email Attachment';
begin
AgentTaskMessageAttachment.SetRange("Task ID", AgentTaskMessage."Task ID");
AgentTaskMessageAttachment.SetRange("Message ID", AgentTaskMessage.ID);
if not AgentTaskMessageAttachment.FindSet() then
exit;
// Count attachments
AttachmentCount := AgentTaskMessageAttachment.Count();
// If single file, download directly
if AttachmentCount = 1 then begin
ShowOrDownloadAttachment(AgentTaskMessageAttachment."Task ID", AgentTaskMessageAttachment."File ID", true);
exit;
end;
// If multiple files, create a zip
DataCompression.CreateZipArchive();
repeat
if AgentTaskFile.Get(AgentTaskMessageAttachment."Task ID", AgentTaskMessageAttachment."File ID") then begin
AgentTaskFile.CalcFields(Content);
AgentTaskFile.Content.CreateInStream(FileInStream, AgentTaskImpl.GetDefaultEncoding());
DataCompression.AddEntry(FileInStream, AgentTaskFile."File Name");
end;
until AgentTaskMessageAttachment.Next() = 0;
TempBlob.CreateOutStream(ZipOutStream);
DataCompression.SaveZipArchive(ZipOutStream);
DataCompression.CloseZipArchive();
TempBlob.CreateInStream(ZipInStream);
FileName := StrSubstNo(AttachmentsFilenameLbl, Format(AgentTaskMessage."Task ID"), Format(AgentTaskMessage.SystemCreatedAt));
File.DownloadFromStream(ZipInStream, DownloadDialogTitleLbl, '', '', FileName);
end;
procedure ShowOrDownloadAttachment(TaskID: BigInteger; FileID: BigInteger; ForceDownloadAttachment: Boolean)
var
AgentTaskFile: Record "Agent Task File";
begin
if not AgentTaskFile.Get(TaskID, FileID) then
exit;
ShowOrDownloadAttachment(AgentTaskFile, ForceDownloadAttachment);
end;
procedure ShowOrDownloadAttachment(var AgentTaskFile: Record "Agent Task File"; ForceDownloadAttachment: Boolean)
var
AgentTaskImpl: Codeunit "Agent Task Impl.";
InStream: InStream;
FileName: Text;
DownloadDialogTitleLbl: Label 'Download Email Attachment';
begin
FileName := AgentTaskFile."File Name";
AgentTaskFile.CalcFields(Content);
AgentTaskFile.Content.CreateInStream(InStream, AgentTaskImpl.GetDefaultEncoding());
if not ForceDownloadAttachment then
if File.ViewFromStream(InStream, FileName, false) then
exit;
File.DownloadFromStream(InStream, DownloadDialogTitleLbl, '', '', FileName);
end;
procedure GetAttachments(TaskID: BigInteger; MessageID: Guid; var TempAgentTaskFile: Record "Agent Task File" temporary)
var
AgentTaskMessageAttachment: Record "Agent Task Message Attachment";
AgentTaskFile: Record "Agent Task File";
AgentTaskFileMustBeTemporaryErr: Label 'The Agent Task File used for this procedure must be temporary.';
begin
if not TempAgentTaskFile.IsTemporary() then
Error(AgentTaskFileMustBeTemporaryErr);
if TaskID = 0 then
exit;
if IsNullGuid(MessageID) then
exit;
TempAgentTaskFile.Reset();
TempAgentTaskFile.DeleteAll();
AgentTaskMessageAttachment.SetRange("Task ID", TaskID);
AgentTaskMessageAttachment.SetRange("Message ID", MessageID);
if not AgentTaskMessageAttachment.FindSet() then
exit;
AgentTaskFile.SetAutoCalcFields(Content);
repeat
if not TempAgentTaskFile.Get(AgentTaskMessageAttachment."Task ID", AgentTaskMessageAttachment."File ID") then
if AgentTaskFile.Get(AgentTaskMessageAttachment."Task ID", AgentTaskMessageAttachment."File ID") then begin
Clear(TempAgentTaskFile);
TempAgentTaskFile.TransferFields(AgentTaskFile, true);
TempAgentTaskFile.Content := AgentTaskFile.Content;
TempAgentTaskFile.Insert();
end;
until AgentTaskMessageAttachment.Next() = 0;
end;
local procedure UpdateStatus(var AgentTaskMessage: Record "Agent Task Message"; Status: Option)
var
AgentTaskMessageToModify: Record "Agent Task Message";
begin
AgentTaskMessageToModify.Get(AgentTaskMessage."Task ID", AgentTaskMessage.ID);
AgentTaskMessageToModify.Status := Status;
AgentTaskMessageToModify.Modify(true);
AgentTaskMessage.Status := AgentTaskMessageToModify.Status;
end;
procedure GetFileSizeDisplayText(SizeInBytes: Decimal): Text
var
FileSizeConverted: Decimal;
FileSizeUnit: Text;
FileSizeTxt: Label '%1 %2', Comment = '%1 = File Size, %2 = Unit of measurement', Locked = true;
begin
FileSizeConverted := SizeInBytes / 1024; // The smallest size we show is KB
if FileSizeConverted < 1024 then
FileSizeUnit := 'KB'
else begin
FileSizeConverted := FileSizeConverted / 1024; // The largest size we show is MB
FileSizeUnit := 'MB'
end;
exit(StrSubstNo(FileSizeTxt, Round(FileSizeConverted, 1, '>'), FileSizeUnit));
end;
}