/* Woodstox Lite ("wool") XML processor
*
* Copyright (c) 2006- Tatu Saloranta, tatu.saloranta@iki.fi
*
* Licensed under the License specified in the file LICENSE which is
* included with the source code.
* You may not use this file except in compliance with the License.
*
* 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.
*/
package com.fasterxml.aalto.out;
import java.io.*;
import javax.xml.stream.*;
/**
* This is the generic implementation of {@link XmlWriter}, used if
* the destination is byte-based {@link java.io.OutputStream}, and
* encoding is ISO-8859-1 (aka Latin1)
*/
public final class
Latin1XmlWriter
extends
SingleByteXmlWriter
{
/**
* Decode tables will have enough entries for the full 8-bit range
*/
final static int
LAST_VALID_CHAR = 0xFF;
/*
/**********************************************************************
/* Life-cycle
/**********************************************************************
*/
public
Latin1XmlWriter(
WriterConfig cfg,
OutputStream out)
{
super(
cfg,
out,
OutputCharTypes.
getLatin1CharTypes());
}
@
Override
public int
getHighestEncodable() {
return 0xFF;
}
@
Override
public void
writeRaw(char[]
cbuf, int
offset, int
len)
throws
IOException,
XMLStreamException
{
if (
_out == null ||
len == 0) {
return;
}
if (
_surrogate != 0) {
outputSurrogates(
_surrogate,
cbuf[
offset]);
++
offset;
--
len;
}
len +=
offset; // now marks the end
// !!! TODO: combine input+output length checks into just one
while (
offset <
len) {
char
ch =
cbuf[
offset++];
if (
ch >
LAST_VALID_CHAR) {
reportFailedEscaping("raw content",
ch);
}
if (
_outputPtr >=
_outputBufferLen) {
flushBuffer();
}
_outputBuffer[
_outputPtr++] = (byte)
ch;
}
}
/* Note: identical to that of Ascii writer implementation
*/
@
Override
protected
WName doConstructName(
String localName)
throws
XMLStreamException
{
return new
ByteWName(
localName,
getAscii(
localName));
}
@
Override
protected
WName doConstructName(
String prefix,
String localName)
throws
XMLStreamException
{
int
plen =
prefix.
length();
byte[]
pname = new byte[
plen + 1 +
localName.
length()];
getAscii(
prefix,
pname, 0);
pname[
plen] =
BYTE_COLON;
getAscii(
localName,
pname,
plen+1);
return new
ByteWName(
prefix,
localName,
pname);
}
}