/*
---------------------------------------------------------------------------
Open Asset Import Library (assimp)
---------------------------------------------------------------------------

Copyright (c) 2006-2017, assimp team


All rights reserved.

Redistribution and use of this software in source and binary forms,
with or without modification, are permitted provided that the following
conditions are met:

* Redistributions of source code must retain the above
  copyright notice, this list of conditions and the
  following disclaimer.

* Redistributions in binary form must reproduce the above
  copyright notice, this list of conditions and the
  following disclaimer in the documentation and/or other
  materials provided with the distribution.

* Neither the name of the assimp team, nor the names of its
  contributors may be used to endorse or promote products
  derived from this software without specific prior
  written permission of the assimp team.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------
*/

/** @file AssimpCExport.cpp
Assimp C export interface. See Exporter.cpp for some notes.
*/

#ifndef ASSIMP_BUILD_NO_EXPORT

#include "CInterfaceIOWrapper.h"
#include <assimp/SceneCombiner.h>
#include "ScenePrivate.h"
#include <assimp/Exporter.hpp>

using namespace Assimp;

// ------------------------------------------------------------------------------------------------
ASSIMP_API size_t aiGetExportFormatCount(void)
{
    return Exporter().GetExportFormatCount();
}


// ------------------------------------------------------------------------------------------------
ASSIMP_API const aiExportFormatDesc* aiGetExportFormatDescription( size_t index)
{
    // Note: this is valid as the index always pertains to a built-in exporter,
    // for which the returned structure is guaranteed to be of static storage duration.
    Exporter exporter;
    const aiExportFormatDesc* orig( exporter.GetExportFormatDescription( index ) );
    if (NULL == orig) {
        return NULL;
    }

    aiExportFormatDesc *desc = new aiExportFormatDesc;
    desc->description = new char[ strlen( orig->description ) + 1 ]();
    ::strncpy( (char*) desc->description, orig->description, strlen( orig->description ) );
    desc->fileExtension = new char[ strlen( orig->fileExtension ) + 1 ]();
    ::strncpy( ( char* ) desc->fileExtension, orig->fileExtension, strlen( orig->fileExtension ) );
    desc->id = new char[ strlen( orig->id ) + 1 ]();
    ::strncpy( ( char* ) desc->id, orig->id, strlen( orig->id ) );

    return desc;
}

// ------------------------------------------------------------------------------------------------
ASSIMP_API void aiReleaseExportFormatDescription( const aiExportFormatDesc *desc ) {
    if (NULL == desc) {
        return;
    }

    delete [] desc->description;
    delete [] desc->fileExtension;
    delete [] desc->id;
    delete desc;
}

// ------------------------------------------------------------------------------------------------
ASSIMP_API void aiCopyScene(const aiScene* pIn, aiScene** pOut)
{
    if (!pOut || !pIn) {
        return;
    }

    SceneCombiner::CopyScene(pOut,pIn,true);
    ScenePriv(*pOut)->mIsCopy = true;
}


// ------------------------------------------------------------------------------------------------
ASSIMP_API void aiFreeScene(const C_STRUCT aiScene* pIn)
{
    // note: aiReleaseImport() is also able to delete scene copies, but in addition
    // it also handles scenes with import metadata.
    delete pIn;
}


// ------------------------------------------------------------------------------------------------
ASSIMP_API aiReturn aiExportScene( const aiScene* pScene, const char* pFormatId, const char* pFileName, unsigned int pPreprocessing )
{
    return ::aiExportSceneEx(pScene,pFormatId,pFileName,NULL,pPreprocessing);
}


// ------------------------------------------------------------------------------------------------
ASSIMP_API aiReturn aiExportSceneEx( const aiScene* pScene, const char* pFormatId, const char* pFileName, aiFileIO* pIO, unsigned int pPreprocessing )
{
    Exporter exp;

    if (pIO) {
        exp.SetIOHandler(new CIOSystemWrapper(pIO));
    }
    return exp.Export(pScene,pFormatId,pFileName,pPreprocessing);
}


// ------------------------------------------------------------------------------------------------
ASSIMP_API const C_STRUCT aiExportDataBlob* aiExportSceneToBlob( const aiScene* pScene, const char* pFormatId, unsigned int pPreprocessing  )
{
    Exporter exp;
    if (!exp.ExportToBlob(pScene,pFormatId,pPreprocessing)) {
        return NULL;
    }
    const aiExportDataBlob* blob = exp.GetOrphanedBlob();
    ai_assert(blob);

    return blob;
}

// ------------------------------------------------------------------------------------------------
ASSIMP_API C_STRUCT void aiReleaseExportBlob( const aiExportDataBlob* pData )
{
    delete pData;
}

#endif // !ASSIMP_BUILD_NO_EXPORT
