/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_idl.hxx"

#include <stdlib.h>
#include <stdio.h>
#include <database.hxx>
#include <globals.hxx>
#include <command.hxx>
#include <tools/fsys.hxx>
#include <tools/string.hxx>
#include <memory.h>

#define BR 0x8000
sal_Bool FileMove_Impl( const String & rFile1, const String & rFile2, sal_Bool bImmerVerschieben )
{
	//printf( "Move from %s to %s\n", rFile2.GetStr(), rFile1.GetStr() );
	sal_uLong nC1 = 0;
	sal_uLong nC2 = 1;
	if( !bImmerVerschieben )
	{
		SvFileStream aOutStm1( rFile1, STREAM_STD_READ );
		SvFileStream aOutStm2( rFile2, STREAM_STD_READ );
		if( aOutStm1.GetError() == SVSTREAM_OK )
		{
			sal_uInt8 * pBuf1 = new sal_uInt8[ BR ];
			sal_uInt8 * pBuf2 = new sal_uInt8[ BR ];
			nC1 = aOutStm1.Read( pBuf1, BR );
			nC2 = aOutStm2.Read( pBuf2, BR );
			while( nC1 == nC2 )
			{
				if( memcmp( pBuf1, pBuf2, nC1 ) )
				{
					nC1++;
					break;
				}
				else
				{
					if( 0x8000 != nC1 )
						break;
					nC1 = aOutStm1.Read( pBuf1, BR );
					nC2 = aOutStm2.Read( pBuf2, BR );
				}
			}
			delete[] pBuf1;
			delete[] pBuf2;
		}
	}
	DirEntry aF2( rFile2 );
	if( nC1 != nC2 )
	{// es hat sich etwas geaendert
		DirEntry aF1( rFile1 );
		aF1.Kill();
		// Datei verschieben
		if( aF2.MoveTo( aF1 ) )
		{
			// Beide Dateien loeschen
			aF1.Kill();
			aF2.Kill();
			return sal_False;
		}
/*
		else
		{
			printf( "%s to %s moved\n",
					 rFile2.GetStr(), rFile1.GetStr() );
		}
*/
		return sal_True;
	}
	return 0 == aF2.Kill();
}

/*************************************************************************
|*	  main()
|*
|*	  Beschreibung
*************************************************************************/
#if defined( UNX ) || (defined( PM2 ) && defined( CSET )) || defined (WTC) || defined (MTW) || defined (__MINGW32__) || defined( OS2 )
int main ( int argc, char ** argv)
{
#else
int cdecl main ( int argc, char ** argv)
{
#endif

/*
    pStr = ::ResponseFile( &aCmdLine, argv, argc );
	if( pStr )
	{
		printf( "Cannot open response file <%s>\n", pStr );
		return( 1 );
	};
*/

    String aTmpListFile;
    String aTmpSlotMapFile;
    String aTmpSfxItemFile;
    String aTmpDataBaseFile;
    String aTmpCallingFile;
    String aTmpSrcFile;
    String aTmpCxxFile;
    String aTmpHxxFile;
    String aTmpHelpIdFile;
    String aTmpCSVFile;
    String aTmpDocuFile;

	SvCommand aCommand( argc, argv );

    if( aCommand.nVerbosity != 0 )
        printf( "StarView Interface Definition Language (IDL) Compiler 3.0\n" );

	Init();
	SvIdlWorkingBase * pDataBase = new SvIdlWorkingBase(aCommand);

	int nExit = 0;
	if( aCommand.aExportFile.Len() )
	{
		DirEntry aDE( aCommand.aExportFile );
		pDataBase->SetExportFile( aDE.GetName() );
	}

	if( ReadIdl( pDataBase, aCommand ) )
	{
		if( nExit == 0 && aCommand.aDocuFile.Len() )
		{
			DirEntry aDE( aCommand.aDocuFile );
			aDE.ToAbs();
			aTmpDocuFile = aDE.GetPath().TempName().GetFull();
			SvFileStream aOutStm( aTmpDocuFile, STREAM_READWRITE | STREAM_TRUNC );
			if( !pDataBase->WriteDocumentation( aOutStm ) )
			{
				nExit = -1;
				ByteString aStr = "cannot write documentation file: ";
                aStr += ByteString( aCommand.aDocuFile, RTL_TEXTENCODING_UTF8 );
                fprintf( stderr, "%s\n", aStr.GetBuffer() );
			}
		}
		if( nExit == 0 && aCommand.aListFile.Len() )
		{
			DirEntry aDE( aCommand.aListFile );
			aDE.ToAbs();
			aTmpListFile = aDE.GetPath().TempName().GetFull();
			SvFileStream aOutStm( aTmpListFile, STREAM_READWRITE | STREAM_TRUNC );
			if( !pDataBase->WriteSvIdl( aOutStm ) )
			{
				nExit = -1;
				ByteString aStr = "cannot write list file: ";
                aStr += ByteString( aCommand.aListFile, RTL_TEXTENCODING_UTF8 );
                fprintf( stderr, "%s\n", aStr.GetBuffer() );
			}
		}
		if( nExit == 0 && aCommand.aSlotMapFile.Len() )
		{
			DirEntry aDE( aCommand.aSlotMapFile );
			aDE.ToAbs();
			aTmpSlotMapFile = aDE.GetPath().TempName().GetFull();
			SvFileStream aOutStm( aTmpSlotMapFile, STREAM_READWRITE | STREAM_TRUNC );
			if( !pDataBase->WriteSfx( aOutStm ) )
			{
				nExit = -1;
				ByteString aStr = "cannot write slotmap file: ";
                aStr += ByteString( aCommand.aSlotMapFile, RTL_TEXTENCODING_UTF8 );
                fprintf( stderr, "%s\n", aStr.GetBuffer() );
			}
		}
		if( nExit == 0 && aCommand.aHelpIdFile.Len() )
		{
			DirEntry aDE( aCommand.aHelpIdFile );
			aDE.ToAbs();
			aTmpHelpIdFile = aDE.GetPath().TempName().GetFull();
			SvFileStream aStm( aTmpHelpIdFile, STREAM_READWRITE | STREAM_TRUNC );
			if (!pDataBase->WriteHelpIds( aStm ) )
			{
				nExit = -1;
				ByteString aStr = "cannot write help ID file: ";
                aStr += ByteString( aCommand.aHelpIdFile, RTL_TEXTENCODING_UTF8 );
                fprintf( stderr, "%s\n", aStr.GetBuffer() );
			}
		}
		if( nExit == 0 && aCommand.aCSVFile.Len() )
		{
			DirEntry aDE( aCommand.aCSVFile );
			aDE.ToAbs();
			aTmpCSVFile = aDE.GetPath().TempName().GetFull();
			SvFileStream aStm( aTmpCSVFile, STREAM_READWRITE | STREAM_TRUNC );
			if (!pDataBase->WriteCSV( aStm ) )
			{
				nExit = -1;
				ByteString aStr = "cannot write CSV file: ";
                aStr += ByteString( aCommand.aCSVFile, RTL_TEXTENCODING_UTF8 );
                fprintf( stderr, "%s\n", aStr.GetBuffer() );
			}
		}
		if( nExit == 0 && aCommand.aSfxItemFile.Len() )
		{
			DirEntry aDE( aCommand.aSfxItemFile );
			aDE.ToAbs();
			aTmpSfxItemFile = aDE.GetPath().TempName().GetFull();
			SvFileStream aOutStm( aTmpSfxItemFile, STREAM_READWRITE | STREAM_TRUNC );
			if( !pDataBase->WriteSfxItem( aOutStm ) )
			{
				nExit = -1;
				ByteString aStr = "cannot write item file: ";
                aStr += ByteString( aCommand.aSfxItemFile, RTL_TEXTENCODING_UTF8 );
                fprintf( stderr, "%s\n", aStr.GetBuffer() );
			}
		}
		if( nExit == 0 && aCommand.aDataBaseFile.Len() )
		{
			DirEntry aDE( aCommand.aDataBaseFile );
			aDE.ToAbs();
			aTmpDataBaseFile = aDE.GetPath().TempName().GetFull();
			SvFileStream aOutStm( aTmpDataBaseFile, STREAM_READWRITE | STREAM_TRUNC );
			pDataBase->Save( aOutStm, aCommand.nFlags );
			if( aOutStm.GetError() != SVSTREAM_OK )
			{
				nExit = -1;
				ByteString aStr = "cannot write database file: ";
                aStr += ByteString( aCommand.aDataBaseFile, RTL_TEXTENCODING_UTF8 );
                fprintf( stderr, "%s\n", aStr.GetBuffer() );
			}
		}
/*
		if( nExit == 0 && aCommand.aCallingFile.Len() )
		{
			DirEntry aDE( aCommand.aCallingFile );
			aDE.ToAbs();
			aTmpCallingFile = aDE.GetPath().TempName().GetFull();
			SvFileStream aOutStm( aTmpCallingFile, STREAM_READWRITE | STREAM_TRUNC );
			pDataBase->WriteSbx( aOutStm );
			//pDataBase->Save( aOutStm, aCommand.nFlags | IDL_WRITE_CALLING );
			if( aOutStm.GetError() != SVSTREAM_OK )
			{
				nExit = -1;
				ByteString aStr = "cannot write calling file: ";
				aStr += aCommand.aCallingFile;
				fprintf( stderr, "%s\n", aStr.GetStr() );
			}
		}
		if( nExit == 0 && aCommand.aCxxFile.Len() )
		{
			DirEntry aDE( aCommand.aCxxFile );
			aDE.ToAbs();
			aTmpCxxFile = aDE.GetPath().TempName().GetFull();
			SvFileStream aOutStm( aTmpCxxFile, STREAM_READWRITE | STREAM_TRUNC );

			aOutStm << "#pragma hdrstop" << endl;
			aOutStm << "#include <";
			if( aCommand.aHxxFile.Len() )
                aOutStm << DirEntry(aCommand.aHxxFile).GetName().GetBuffer();
			else
			{
				DirEntry aDE( aCommand.aCxxFile );
				aDE.SetExtension( "hxx" );
                aOutStm << aDE.GetName().GetBuffer);
			}
			aOutStm << '>' << endl;
			if( !pDataBase->WriteCxx( aOutStm ) )
			{
				nExit = -1;
				ByteString aStr = "cannot write cxx file: ";
                aStr += ByteString( aCommand.aCxxFile, RTL_TEXTENCODING_UTF8 );
                fprintf( stderr, "%s\n", aStr.GetBuffer() );
			}
		}
		if( nExit == 0 && aCommand.aHxxFile.Len() )
		{
			DirEntry aDE( aCommand.aHxxFile );
			aDE.ToAbs();
			aTmpHxxFile = aDE.GetPath().TempName().GetFull();
			SvFileStream aOutStm( aTmpHxxFile, STREAM_READWRITE | STREAM_TRUNC );

			aOutStm << "#include <somisc.hxx>" << endl;
			if( !pDataBase->WriteHxx( aOutStm ) )
			{
				nExit = -1;
				ByteString aStr = "cannot write cxx file: ";
                aStr += ByteString( aCommand.aHxxFile, RTL_TEXTENCODING_UTF8 );
                fprintf( stderr, "%s\n", aStr.GetBuffer() );
			}
		}
 */
	}
	else
		nExit = -1;

	if( nExit == 0 )
	{
		sal_Bool bErr = sal_False;
		sal_Bool bDoMove = aCommand.aTargetFile.Len() == 0;
		String aErrFile, aErrFile2;
		if( !bErr && aCommand.aListFile.Len() )
		{
			bErr |= !FileMove_Impl( aCommand.aListFile, aTmpListFile, bDoMove );
			if( bErr ) {
				aErrFile = aCommand.aListFile;
				aErrFile2 = aTmpListFile;
			}
		}
		if( !bErr && aCommand.aSlotMapFile.Len() )
		{
			bErr |= !FileMove_Impl( aCommand.aSlotMapFile, aTmpSlotMapFile, bDoMove );
			if( bErr ) {
				aErrFile = aCommand.aSlotMapFile;
				aErrFile2 = aTmpSlotMapFile;
			}
		}
		if( !bErr && aCommand.aSfxItemFile.Len() )
		{
			bErr |= !FileMove_Impl( aCommand.aSfxItemFile, aTmpSfxItemFile, bDoMove );
			if( bErr ) {
				aErrFile = aCommand.aSfxItemFile;
				aErrFile2 = aTmpSfxItemFile;
			}
		}
		if( !bErr && aCommand.aDataBaseFile.Len() )
		{
			bErr |= !FileMove_Impl( aCommand.aDataBaseFile, aTmpDataBaseFile, bDoMove );
			if( bErr ) {
				aErrFile = aCommand.aDataBaseFile;
				aErrFile2 = aTmpDataBaseFile;
			}
		}
		if( !bErr && aCommand.aCallingFile.Len() )
		{
			bErr |= !FileMove_Impl( aCommand.aCallingFile, aTmpCallingFile, bDoMove );
			if( bErr ) {
				aErrFile = aCommand.aCallingFile;
				aErrFile2 = aTmpCallingFile;
			}
		}
		if( !bErr && aCommand.aCxxFile.Len() )
		{
			bErr |= !FileMove_Impl( aCommand.aCxxFile, aTmpCxxFile, bDoMove );
			if( bErr ) {
				aErrFile = aCommand.aCxxFile;
				aErrFile2 = aTmpCxxFile;
			}
		}
		if( !bErr && aCommand.aHxxFile.Len() )
		{
			bErr |= !FileMove_Impl( aCommand.aHxxFile, aTmpHxxFile, bDoMove );
			if( bErr ) {
				aErrFile = aCommand.aHxxFile;
				aErrFile2 = aTmpHxxFile;
			}
		}
		if( !bErr && aCommand.aHelpIdFile.Len() )
		{
			bErr |= !FileMove_Impl( aCommand.aHelpIdFile, aTmpHelpIdFile, bDoMove );
			if( bErr ) {
				aErrFile = aCommand.aHelpIdFile;
				aErrFile2 = aTmpHelpIdFile;
			}
		}
		if( !bErr && aCommand.aCSVFile.Len() )
		{
			bErr |= !FileMove_Impl( aCommand.aCSVFile, aTmpCSVFile, bDoMove );
			if( bErr ) {
				aErrFile = aCommand.aCSVFile;
				aErrFile2 = aTmpCSVFile;
			}
		}
		if( !bErr && aCommand.aDocuFile.Len() )
		{
			bErr |= !FileMove_Impl( aCommand.aDocuFile, aTmpDocuFile, bDoMove );
			if( bErr ) {
				aErrFile = aCommand.aDocuFile;
				aErrFile2 = aTmpDocuFile;
			}
		}

		if( bErr )
		{
			nExit = -1;
			ByteString aStr = "cannot move file from: ";
            aStr += ByteString( aErrFile2, RTL_TEXTENCODING_UTF8 );
            aStr += "\n              to file: ";
            aStr += ByteString( aErrFile, RTL_TEXTENCODING_UTF8 );
            fprintf( stderr, "%s\n", aStr.GetBuffer() );
		}
		else
		{
			if( aCommand.aTargetFile.Len() )
			{
#ifdef ICC
				DirEntry aT(aCommand.aTargetFile);
				aT.Kill();
#endif
				// Datei stempeln, da idl korrekt durchlaufen wurde
				SvFileStream aOutStm( aCommand.aTargetFile,
								STREAM_READWRITE | STREAM_TRUNC );
			}
		}
	}

	if( nExit != 0 )
	{
		if( aCommand.aListFile.Len() )
			DirEntry( aTmpListFile ).Kill();
		if( aCommand.aSlotMapFile.Len() )
			DirEntry( aTmpSlotMapFile ).Kill();
		if( aCommand.aSfxItemFile.Len() )
			DirEntry( aTmpSfxItemFile ).Kill();
		if( aCommand.aDataBaseFile.Len() )
			DirEntry( aTmpDataBaseFile ).Kill();
		if( aCommand.aCallingFile.Len() )
			DirEntry( aTmpCallingFile ).Kill();
		if( aCommand.aCxxFile.Len() )
			DirEntry( aTmpCxxFile ).Kill();
		if( aCommand.aHxxFile.Len() )
			DirEntry( aTmpHxxFile ).Kill();
	}

	delete pDataBase;
	DeInit();
	if( nExit != 0 )
		fprintf( stderr, "svidl terminated with errors\n" );
	return nExit;
}

