File:  [parser3project] / parser3 / src / include / pa_charset.h
Revision 1.20.2.15: download - view: text, annotated - select for diffs - revision graph
Thu Mar 6 16:15:25 2003 UTC (23 years, 4 months ago) by paf
xnode.C compiled

/** @file
	Parser: Charset connection decl.

	Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
	Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
*/

#ifndef PA_CHARSET_H
#define PA_CHARSET_H

static const char* IDENT_CHARSET_H="$Date: 2003/03/06 16:15:25 $";

#include "pa_pool.h"
#include "pa_exception.h"
#include "pa_common.h"

// hiding into namespace so to avoid stupid conflict
namespace PCRE {
#include "pcre.h"
#	include "internal.h"
};

#ifdef XML
#include "libxml/encoding.h"
#endif

// defines

#define MAX_CHARSET_UNI_CODES 500

#	ifndef XMLCh 
		typedef unsigned int XMLCh;
#	endif
#	ifndef XMLByte
		typedef unsigned char XMLByte;
#	endif

// forwards

class GdomeDOMString_auto_ptr;

// helpers

struct Charset_TransRec {
	XMLCh intCh;
	XMLByte extCh;
};

/**	charset holds name & transcode tables 
	registers libxml transcoders
*/
class Charset: public PA_Object {
public:

	Charset(StringPtr aname, StringPtr afile_spec);
	override ~Charset();
	
	StringPtr name() const { return fname; }

	bool isUTF8() const { return fisUTF8; }

	static void transcode(Pool& pool, 
		const Charset& source_transcoder, const void* source_body, size_t source_content_length,
		const Charset& dest_transcoder, const void* & dest_body, size_t& dest_content_length
	);

#ifdef XML
	xmlCharEncodingHandler& transcoder(StringPtr source);
#endif

public:

	unsigned char pcre_tables[tables_length];

private:

	void load_definition(StringPtr afile_spec);
	void sort_ToTable();

	void transcodeToUTF8(Pool& pool,
									 const void* source_body, size_t source_content_length,
									 const void* & dest_body, size_t& dest_content_length) const;
	void transcodeFromUTF8(Pool& pool,
									   const void* source_body, size_t source_content_length,
									   const void* & dest_body, size_t& dest_content_length) const;

	void transcodeToCharset(Pool& pool,
										   const Charset& dest_transcoder,
										   const void* source_body, size_t source_content_length,
										   const void*& dest_body, size_t& dest_content_length) const;

public:

	struct Tables {
		XMLCh fromTable[0x100];
		Charset_TransRec toTable[MAX_CHARSET_UNI_CODES];
		uint toTableSize;
	};

private:

	StringPtr fname;
	CharPtr fname_cstr;
	bool fisUTF8;
	Tables tables;

#ifdef XML

private:
	void addEncoding(char* name_cstr);
	void initTranscoder(StringPtr source, const char* name_cstr);
	
public:
	/// converts GdomeDOMString string to char* 
	const char* transcode_cstr(GdomeDOMString* s);
	/// converts GdomeDOMString string to parser String
	StringPtr transcode(GdomeDOMString* s
#ifndef NO_STRING_ORIGIN
		, StringPtr origin
#endif
		);
	/// converts xmlChar* null-terminated string to char* 
	CharPtr transcode_cstr(xmlChar* s);
	/// converts xmlChar* null-terminated string to parser String
	StringPtr transcode(xmlChar* s
#ifndef NO_STRING_ORIGIN
		, StringPtr origin
#endif
		);
	/** converts sized char*  to xmlChar*
		@returns xmlChar*  WHICH CALLER SHOULD FREE
	*/
	xmlChar* transcode_buf2xchar(const char* buf, size_t buf_size);
	/// converts char*  to GdomeDOMString
	GdomeDOMString_auto_ptr transcode_buf2dom(const char* buf, size_t buf_size);
	/// converts parser String to GdomeDOMString
	GdomeDOMString_auto_ptr transcode(StringPtr s);

private:

	typedef smart_ptr<xmlCharEncodingHandler> xmlCharEncodingHandlerPtr;
	xmlCharEncodingHandlerPtr fcreated_handler;
	xmlCharEncodingHandler* ftranscoder;

#endif

};
DECLARE_OBJECT_PTR(Charset);

#ifdef XML
/// Auto-object used to track GdomeDOMString usage
class GdomeDOMString_auto_ptr {
	GdomeDOMString* fstring;
public:
	/// frees astring afterwards!!!
	explicit GdomeDOMString_auto_ptr(gchar* astring) : fstring(gdome_str_mkref_own(astring)) {}
	explicit GdomeDOMString_auto_ptr(GdomeDOMString* astring) : fstring(astring) {
		// not ref-ing, owning
	}
	~GdomeDOMString_auto_ptr() {
		gdome_str_unref(fstring);
	}
	GdomeDOMString* get() {
		return fstring;
	}
	GdomeDOMString* operator->() {
		return fstring;
	}
	GdomeDOMString& operator*() {
		return* fstring;
	}

	// copying
	GdomeDOMString_auto_ptr(const GdomeDOMString_auto_ptr& src) : fstring(src.fstring) {
		gdome_str_ref(fstring);
	}
	GdomeDOMString_auto_ptr& operator =(const GdomeDOMString_auto_ptr& src) {
		if(this == &src)
			return* this;

		gdome_str_unref(fstring);
		fstring=src.fstring;
		gdome_str_ref(fstring);

		return* this;
	}
};
#endif

#endif

E-mail: