// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../public/fpdf_edit.h"
#include "../../public/fpdf_save.h"
#include "../include/fsdk_define.h"

#if _FX_OS_ == _FX_ANDROID_
#include "time.h"
#else
#include <ctime>
#endif

class CFX_IFileWrite final : public IFX_StreamWrite
{

public:
    CFX_IFileWrite();
    bool             Init( FPDF_FILEWRITE * pFileWriteStruct );
    virtual bool     WriteBlock(const void* pData, size_t size) override;
    virtual void        Release() override {}

protected:
    FPDF_FILEWRITE*     m_pFileWriteStruct;
};

CFX_IFileWrite::CFX_IFileWrite()
{
    m_pFileWriteStruct = NULL;
}

bool CFX_IFileWrite::Init( FPDF_FILEWRITE * pFileWriteStruct )
{
    if (!pFileWriteStruct)
        return false;

    m_pFileWriteStruct = pFileWriteStruct;
    return true;
}

bool CFX_IFileWrite::WriteBlock(const void* pData, size_t size)
{
    if (!m_pFileWriteStruct)
        return false;

    m_pFileWriteStruct->WriteBlock( m_pFileWriteStruct, pData, size );
    return true;
}

FPDF_BOOL _FPDF_Doc_Save(FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,FPDF_DWORD flags, FPDF_BOOL bSetVersion,
                         int fileVerion)
{
    CPDF_Document* pDoc = (CPDF_Document*)document;
    if (!pDoc)
        return 0;

    if ( flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY )
    {
        flags = 0;
    }

    CPDF_Creator FileMaker(pDoc);
    if(bSetVersion)
        FileMaker.SetFileVersion(fileVerion);
    if(flags == FPDF_REMOVE_SECURITY)
    {
        flags =  0;
        FileMaker.RemoveSecurity();
    }
    CFX_IFileWrite* pStreamWrite = NULL;
    bool bRet;
    pStreamWrite = new CFX_IFileWrite;
    pStreamWrite->Init( pFileWrite );
    bRet = FileMaker.Create(pStreamWrite, flags);
    delete pStreamWrite;
    return bRet;
}

DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy(    FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
                                                FPDF_DWORD flags )
{
    return _FPDF_Doc_Save(document, pFileWrite, flags, false , 0);
}


DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(   FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
    FPDF_DWORD flags, int fileVersion)
{
    return _FPDF_Doc_Save(document, pFileWrite, flags, true , fileVersion);
}
