File:  [parser3project] / parser3 / src / main / pa_pool.C
Revision 1.24: download - view: text, annotated - select for diffs - revision graph
Fri Sep 21 07:30:25 2001 UTC (24 years, 9 months ago) by parser
Branches: MAIN
CVS tags: HEAD
checked whether transcoder were created right
"unsupported encoding" message.
not @ set time, but @ use time, so until xml output functions .string, .file, .save used - no encoding name check occur

reduced transcode buffer size to 60
fixed pool cleanup - no registration needed, pools are officially destructured

/** @file
	Parser: pool class.

	Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)

	Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
*/
static const char *RCSId="$Id: pa_pool.C,v 1.24 2001/09/21 07:30:25 parser Exp $"; 

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

#include <PlatformSupport/DOMStringHelper.hpp>
#include <util/PlatformUtils.hpp>

Pool::Pool(void *astorage) : 
	fstorage(astorage), fcontext(0), ftag(0), fexception(0),
	scharset(0), charset("UTF-8"), transcoder(0) {
}

Pool::~Pool() {
	delete transcoder;
}

void Pool::fail_alloc(size_t size) const {
	fexception->_throw(0, 0,
		0,
		"failed to allocate %u bytes", size);
}

void Pool::fail_register_cleanup() const {
	fexception->_throw(0, 0,
		0,
		"failed to register cleanup");
}

void Pool::set_charset(const String &new_scharset) {
	if(new_scharset!=charset) {
		delete transcoder;  transcoder=0; // flag "we need new transcoder"
		scharset=&new_scharset; // for this charset
		charset=new_scharset.cstr();
	}
}

void Pool::update_transcoder() {
	if(transcoder)
		return;

	XMLTransService::Codes resValue;
	transcoder=XMLPlatformUtils::fgTransService->makeNewTranscoderFor(charset, resValue, 60);
	if(!transcoder)
		THROW(0, 0,
			scharset,
			"unsupported encoding");
}


const char *Pool::transcode(const XalanDOMString& s) { 
	update_transcoder();

	const unsigned int len=s.size()*2;
	XMLByte* dest=(XMLByte *)malloc((len+1)*sizeof(XMLByte));
	bool error=true;
	try {
		if(transcoder) {
			unsigned int charsEaten;
			unsigned int size=transcoder->transcodeTo(
				s.c_str(), s.length(),
				dest, len,
				charsEaten,
				XMLTranscoder::UnRep_RepChar //UnRep_Throw
			);
			dest[size]=0;
			error=false;
		}
	} catch(...) {
	}
	if(error) {
		memset(dest, '?', s.size());
		((char *)dest)[s.size()]=0;
	}
	return (const char *)dest;
}

void Pool::_throw(const String *source, const XSLException& e) {
	if(e.getURI().empty())
		THROW(0, 0,
			source,
			"%s (%s)",
				transcode(e.getMessage()),  // message for exception
				transcode(e.getType()) // type of exception
		);
	else
		THROW(0, 0,
			source,
			"%s (%s) %s(%d:%d)'", 
				transcode(e.getMessage()),  // message for exception
				transcode(e.getType()), // type of exception
				
				transcode(e.getURI()),  // URI for the associated document, if any
				e.getLineNumber(),  // line number, or -1 if unknown
				e.getColumnNumber() // column number, or -1 if unknown
		);
}

E-mail: