/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#include "cmCTestUploadHandler.h"

#include "cmGeneratedFileStream.h"
#include "cmVersion.h"
#include "cmXMLWriter.h"

#include <ostream>
#include <string>

cmCTestUploadHandler::cmCTestUploadHandler() { this->Initialize(); }

void
cmCTestUploadHandler::Initialize()
{
    this->Superclass::Initialize();
    this->Files.clear();
}

void
cmCTestUploadHandler::SetFiles(const cmCTest::SetOfStrings& files)
{
    this->Files = files;
}

int
cmCTestUploadHandler::ProcessHandler()
{
    cmGeneratedFileStream ofs;
    if(!this->CTest->OpenOutputFile(this->CTest->GetCurrentTag(), "Upload.xml",
                                    ofs))
    {
        cmCTestLog(this->CTest, ERROR_MESSAGE,
                   "Cannot open Upload.xml file" << std::endl);
        return -1;
    }
    std::string buildname = cmCTest::SafeBuildIdField(
        this->CTest->GetCTestConfiguration("BuildName"));

    cmXMLWriter xml(ofs);
    xml.StartDocument();
    xml.ProcessingInstruction("xml-stylesheet",
                              "type=\"text/xsl\" "
                              "href=\"Dart/Source/Server/XSL/Build.xsl "
                              "<file:///Dart/Source/Server/XSL/Build.xsl> \"");
    xml.StartElement("Site");
    xml.Attribute("BuildName", buildname);
    xml.Attribute("BuildStamp", this->CTest->GetCurrentTag() + "-" +
                                    this->CTest->GetTestModelString());
    xml.Attribute("Name", this->CTest->GetCTestConfiguration("Site"));
    xml.Attribute("Generator",
                  std::string("ctest") + cmVersion::GetCMakeVersion());
    this->CTest->AddSiteProperties(xml);
    xml.StartElement("Upload");

    for(std::string const& file : this->Files)
    {
        cmCTestOptionalLog(this->CTest, OUTPUT,
                           "\tUpload file: " << file << std::endl, this->Quiet);
        xml.StartElement("File");
        xml.Attribute("filename", file);
        xml.StartElement("Content");
        xml.Attribute("encoding", "base64");
        xml.Content(this->CTest->Base64EncodeFile(file));
        xml.EndElement();  // Content
        xml.EndElement();  // File
    }
    xml.EndElement();  // Upload
    xml.EndElement();  // Site
    xml.EndDocument();
    return 0;
}
