/*
 * $Id: BLO_readfile.h,v 1.6 2003/07/21 19:41:04 ton Exp $
 *
 * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version. The Blender
 * Foundation also sells licenses for use in proprietary software under
 * the Blender License.  See http://www.blender.org/BL/ for information
 * about this.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
 * All rights reserved.
 *
 * The Original Code is: all of this file.
 *
 * Contributor(s): none yet.
 *
 * ***** END GPL/BL DUAL LICENSE BLOCK *****
 * external readfile function prototypes
 */
#ifndef BLO_READFILE_H
#define BLO_READFILE_H

#ifdef __cplusplus
extern "C" {
#endif

struct SpaceFile;
struct LinkNode;
struct Main;
struct UserDef;
struct bScreen;
struct Scene;

typedef struct BlendHandle	BlendHandle;

typedef enum BlenFileType {
	BLENFILETYPE_BLEND= 1, 
	BLENFILETYPE_PUB= 2, 
	BLENFILETYPE_RUNTIME= 3
} BlenFileType;

typedef enum {
	BRE_NONE, 
	
	BRE_UNABLE_TO_OPEN, 
	BRE_UNABLE_TO_READ, 

	BRE_OUT_OF_MEMORY, 
	BRE_INTERNAL_ERROR, 

	BRE_NOT_A_BLEND, 
	BRE_NOT_A_PUBFILE,
	BRE_INCOMPLETE, 
	BRE_CORRUPT, 
	
	BRE_TOO_NEW, 
	BRE_NOT_ALLOWED, 
	
	BRE_NO_SCREEN, 
	BRE_NO_SCENE, 
	
	BRE_INVALID
} BlendReadError;

typedef struct BlendFileData {
	struct Main*	main;
	struct UserDef*	user;

	int winpos;
	int fileflags;
	int displaymode;
	int globalf;

	struct bScreen*	curscreen;
	struct Scene*	curscene;
	
	BlenFileType	type;
} BlendFileData;

	/**
	 * Open a blender file from a pathname. The function
	 * returns NULL and sets the @a error_r argument if
	 * it cannot open the file.
	 * 
	 * @param file The path of the file to open.
	 * @param error_r If the return value is NULL, an error
	 * code indicating the cause of the failure.
	 * @return The data of the file.
	 */
BlendFileData*	BLO_read_from_file		(char *file, BlendReadError *error_r);

	/**
	 * Open a blender file from memory. The function
	 * returns NULL and sets the @a error_r argument if
	 * it cannot open the file.
	 * 
	 * @param mem The file data.
	 * @param memsize The length of @a mem.
	 * @param error_r If the return value is NULL, an error
	 * code indicating the cause of the failure.
	 * @return The data of the file.
	 */
BlendFileData*	BLO_read_from_memory	(void *mem, int memsize, BlendReadError *error_r);


/**
 * Convert a BlendReadError to a human readable string.
 * The string is static and does not need to be free'd.
 * 
 * @param error The error to return a string for.
 * @return A static human readable string representation
 * of @a error.
 */
	char*
BLO_bre_as_string(
	BlendReadError error);

/**
 * Free's a BlendFileData structure and _all_ the
 * data associated with it (the userdef data, and
 * the main libblock data).
 * 
 * @param bfd The structure to free.
 */
	void
BLO_blendfiledata_free(
	BlendFileData *bfd);

/**
 * Convert an idcode into a name.
 * 
 * @param code The code to convert.
 * @return A static string representing the name of
 * the code.
 */
	char*
BLO_idcode_to_name(
	int code);

/**
 * Convert a name into an idcode (ie. ID_SCE)
 * 
 * @param name The name to convert.
 * @return The code for the name, or 0 if invalid.
 */
	int
BLO_idcode_from_name(
	char *name);
	
/**
 * Open a blendhandle from a file path.
 * 
 * @param file The file path to open.
 * @return A handle on success, or NULL on failure.
 */
	BlendHandle*
BLO_blendhandle_from_file(
	char *file);

/**
 * Gets the names of all the datablocks in a file
 * of a certain type (ie. All the scene names in
 * a file).
 * 
 * @param bh The blendhandle to access.
 * @param ofblocktype The type of names to get.
 * @return A BLI_linklist of strings. The string links
 * should be freed with malloc.
 */
	struct LinkNode*
BLO_blendhandle_get_datablock_names(
	BlendHandle *bh, 
	int ofblocktype);

/**
 * Gets the names of all the datablock groups in a
 * file. (ie. file contains Scene, Mesh, and Lamp
 * datablocks).
 * 
 * @param bh The blendhandle to access.
 * @return A BLI_linklist of strings. The string links
 * should be freed with malloc.
 */
	struct LinkNode*
BLO_blendhandle_get_linkable_groups(
	BlendHandle *bh);

/**
 * Close and free a blendhandle. The handle
 * becomes invalid after this call.
 *
 * @param bh The handle to close.
 */
	void
BLO_blendhandle_close(
	BlendHandle *bh);
	
	/***/

char *BLO_gethome(void);
int BLO_has_bfile_extension(char *str);

void BLO_library_append(struct SpaceFile *sfile, char *dir, int idcode);


/* Ick ick ick, why are internal loader functions
 * being exported out of the loader? IMHO readstreamglue
 * should not need to know anything about the loader, 
 * but this is a point of contention. - zr
 */
	void*
blo_readstreamfile_begin(
	void *endControl);

	int
blo_readstreamfile_process(
	void *filedataVoidPtr, 
	unsigned char *data, 
	unsigned int dataIn);
	
	int
blo_readstreamfile_end(
	void *filedataVoidPtr);
				
#ifdef __cplusplus
} 
#endif

#endif

