/*************************************************************************
 *
 *  $RCSfile: basmgr.hxx,v $
 *
 *  $Revision: 1.6 $
 *
 *  last change: $Author: ab $ $Date: 2002/01/09 16:40:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (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.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
//
#ifndef _BASMGR_HXX
#define _BASMGR_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _SFXBRDCST_HXX //autogen
#include <svtools/brdcst.hxx>
#endif

#ifndef _SB_SBSTAR_HXX //autogen
#include <basic/sbstar.hxx>
#endif

#ifndef _COM_SUN_STAR_SCRIPT_XLIBRARYCONTAINER_HPP_
#include <com/sun/star/script/XLibraryContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_SCRIPT_XSTARBASICACCESS_HPP_
#include <com/sun/star/script/XStarBasicAccess.hpp>
#endif

// Basic XML Import/Export
com::sun::star::uno::Reference< com::sun::star::script::XStarBasicAccess > 
	getStarBasicAccess( BasicManager* pMgr );

class SotStorage;

#define BASERR_ID_STDLIBOPEN			ERRCODE_BASMGR_STDLIBOPEN
#define BASERR_ID_STDLIBSAVE            ERRCODE_BASMGR_STDLIBSAVE
#define BASERR_ID_LIBLOAD				ERRCODE_BASMGR_LIBLOAD
#define BASERR_ID_LIBCREATE				ERRCODE_BASMGR_LIBCREATE
#define BASERR_ID_LIBSAVE               ERRCODE_BASMGR_LIBSAVE
#define BASERR_ID_LIBDEL				ERRCODE_BASMGR_LIBDEL
#define BASERR_ID_MGROPEN               ERRCODE_BASMGR_MGROPEN
#define BASERR_ID_MGRSAVE				ERRCODE_BASMGR_MGRSAVE
#define BASERR_ID_REMOVELIB				ERRCODE_BASMGR_REMOVELIB
#define BASERR_ID_UNLOADLIB				ERRCODE_BASMGR_UNLOADLIB

#define BASERR_REASON_OPENSTORAGE       0x0001
#define BASERR_REASON_OPENLIBSTORAGE    0x0002
#define BASERR_REASON_OPENMGRSTREAM     0x0004
#define BASERR_REASON_OPENLIBSTREAM     0x0008
#define BASERR_REASON_LIBNOTFOUND		0x0010
#define BASERR_REASON_STORAGENOTFOUND	0x0020
#define BASERR_REASON_BASICLOADERROR	0x0040
#define BASERR_REASON_NOSTORAGENAME		0x0080

#define BASERR_REASON_STDLIB			0x0100

class BasicError
{
private:
	ULONG	nErrorId;
	USHORT	nReason;
	String	aErrStr;

public:
			BasicError();
			BasicError( const BasicError& rErr );
			BasicError( ULONG nId, USHORT nR, const String& rErrStr );

	ULONG 	GetErrorId() const					{ return nErrorId; }
	USHORT	GetReason() const					{ return nReason; }
	String	GetErrorStr()						{ return aErrStr; }

	void	SetErrorId( ULONG n )				{ nErrorId = n; }
	void	SetReason( USHORT n )				{ nReason = n; }
	void	SetErrorStr( const String& rStr)	{ aErrStr = rStr; }
};

//

class BasicLibs;
class ErrorManager;
class BasicLibInfo;
class BasicErrorManager;

class SfxScriptLibraryContainer;

// Library password handling for 5.0 documents
class OldBasicPassword
{
public:
    virtual void setLibraryPassword( const String& rLibraryName, const String& rPassword ) = 0;
    virtual String getLibraryPassword( const String& rLibraryName ) = 0;
    virtual void clearLibraryPassword( const String& rLibraryName ) = 0;
    virtual sal_Bool hasLibraryPassword( const String& rLibraryName ) = 0;
};

struct LibraryContainerInfo
{
    com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer > mxScriptCont;
	com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer > mxDialogCont;
    OldBasicPassword* mpOldBasicPassword;

	LibraryContainerInfo
    (
        com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer > xScriptCont,
	    com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer > xDialogCont,
        OldBasicPassword* pOldBasicPassword
    )
        : mxScriptCont( xScriptCont )
        , mxDialogCont( xDialogCont )
        , mpOldBasicPassword( pOldBasicPassword )
	{}
};

struct BasicManagerImpl;

#define LIB_NOTFOUND	0xFFFF

class BasicManager : public SfxBroadcaster
{
    friend class LibraryContainer_Impl;
    friend class BasMgrContainerListenerImpl;

private:
	BasicLibs*			pLibs;
	BasicErrorManager*	pErrorMgr;

	String				aName;
	String				aStorageName;
	BOOL				bBasMgrModified;

	BasicManagerImpl*	mpImpl;

	void				Init();

protected:
	BOOL			ImpStoreLibary( StarBASIC* pLib, SotStorage& rStorage ) const;
	BOOL			ImpLoadLibary( BasicLibInfo* pLibInfo ) const;
	BOOL			ImpLoadLibary( BasicLibInfo* pLibInfo, SotStorage* pCurStorage, BOOL bInfosOnly = FALSE ) const;
	void			ImpCreateStdLib( StarBASIC* pParentFromStdLib );
	void			ImpMgrNotLoaded(  const String& rStorageName  );
	BasicLibInfo*	CreateLibInfo();
	void			LoadBasicManager( SotStorage& rStorage, BOOL bLoadBasics = TRUE );
	void			LoadOldBasicManager( SotStorage& rStorage );
	BOOL 			ImplLoadBasic( SvStream& rStrm, StarBASICRef& rOldBasic ) const;
	void			ImplGetPassword( USHORT nLib ) const;
	BOOL			ImplEncryptStream( SvStream& rStream ) const;
	BasicLibInfo*	FindLibInfo( StarBASIC* pBasic ) const;
	void			CheckModules( StarBASIC* pBasic, BOOL bReference ) const;
	void			SetFlagToAllLibs( short nFlag, BOOL bSet ) const;
					BasicManager();	// Nur zum anpassen von Pfaden bei 'Speichern unter'.

public:
					TYPEINFO();
					BasicManager( SotStorage& rStorage, StarBASIC* pParentFromStdLib = NULL, String* pLibPath = NULL );
					BasicManager( StarBASIC* pStdLib, String* pLibPath = NULL );
                    ~BasicManager();

	void			SetStorageName( const String& rName )	{ aStorageName = rName; }
	String			GetStorageName() const 					{ return aStorageName; }
	void			SetName( const String& rName ) 			{ aName = rName; }
	String			GetName() const							{ return aName; }

	static BOOL     HasBasicManager( const SotStorage& rStorage );
	static BOOL     HasBasicWithModules( const SotStorage& rStorage );
	static BOOL     CopyBasicData( SotStorage* pFrom, const String& rSourceURL, SotStorage* pTo);

	void        	Merge(  SotStorage& rFromStorage );

	USHORT		    GetLibCount() const;
	StarBASIC*  	GetStdLib() const;
	StarBASIC*	    GetLib( USHORT nLib ) const;
	StarBASIC*	    GetLib( const String& rName ) const;
	USHORT		    GetLibId( const String& rName ) const;
	USHORT		    GetLibId( StarBASIC* pLib ) const;
	BOOL	    	HasLib( const String& rName ) const;

	void    		Store( SotStorage& rStorage );
	void	    	Store( SotStorage& rStorage, BOOL bStoreLibs );

	BOOL		    SetLibName( USHORT nLib, const String& rName );
	String		    GetLibName( USHORT nLib );

	void			SetLibraryContainerInfo( LibraryContainerInfo* pInfo );

	BOOL		    SetLibStorageName( USHORT nLib, const String& rName );
	String		    GetLibStorageName( USHORT nLib );
	String		    GetRelLibStorageName( USHORT nLib );

	BOOL		    IsLibLoaded( USHORT nLib ) const;
	BOOL		    LoadLib( USHORT nLib );
	BOOL		    UnloadLib( USHORT nLib );
	BOOL		    StoreLib( USHORT nLib ) const;
	BOOL		    RemoveLib( USHORT nLib );
	BOOL		    RemoveLib( USHORT nLib, BOOL bDelBasicFromStorage );

	BOOL		    IsReference( USHORT nLib );
	BOOL		    IsExtern( USHORT nLib );

	StarBASIC*      CreateLib( const String& rLibName );
	// For XML import/export:
	StarBASIC*      CreateLib( const String& rLibName, const String& Password, 
							   const String& ExternalSourceURL, const String& LinkTargetURL );
	StarBASIC*	    CreateLibForLibContainer( const String& rLibName,
                        const com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer >& 
                            xScriptCont );
	StarBASIC*      AddLib( SotStorage& rStorage, const String& rLibName, BOOL bReference );
	void		    AddLib( StarBASIC* pLib );
	BOOL		    MoveLib( USHORT nLib, USHORT nNewPos );

	BOOL		    HasPassword( USHORT nLib ) const;
	String		    GetPassword( USHORT nLib ) const;
	void		    SetPassword( USHORT nLib, const String& rNewPassword );

	// Der BasicManager gibt die Basics auch raus, wenn das Passwort nicht
	// geprueft wurde, da man auch ohne Passwort mit der Lib arbeiten kann.
	// Es ist Sache der App, was Sie dem Anwender ohne Passwort nicht gestattet,
	// also z.B. das Betrachten der Source oder das Anzeigen/Loeschen von Modulen.
	BOOL		    IsPasswordVerified( USHORT nLib ) const;
	void		    SetPasswordVerified( USHORT nLib );

	// Modify-Flag wird nur beim Speichern zurueckgesetzt.
	BOOL		    IsModified() const;
	BOOL		    IsBasicModified() const;
	BOOL			IsManagerModified() const { return bBasMgrModified; }

	BOOL		    HasErrors();
	void		    ClearErrors();
	BasicError*     GetFirstError();
	BasicError*     GetNextError();
};

#endif	//_BASMGR_HXX
