blob: 9b8ee642e3c5c59867e7820b821d1b2ab5a01ace [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* 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.intellij.openapi.editor.richcopy.model;
import com.intellij.util.io.CompactDataInput;
import com.intellij.util.io.CompactDataOutput;
import org.iq80.snappy.SnappyInputStream;
import org.iq80.snappy.SnappyOutputStream;
import java.io.IOException;
/**
* Not synchronized, stream implementations must be used from one thread at a time only
*/
public class OutputInfoSerializer {
private static final int TEXT_ID = 0;
private static final int STYLE_ID = 1;
private static final int FOREGROUND_ID = 2;
private static final int BACKGROUND_ID = 3;
private static final int FONT_ID = 4;
public static class OutputStream implements MarkupHandler {
private final CompactDataOutput myOutputStream;
private final java.io.OutputStream myUnderlyingOutputStream;
private int myCurrentOffset;
public OutputStream(java.io.OutputStream stream) throws IOException {
myUnderlyingOutputStream = new SnappyOutputStream(stream);
myOutputStream = new CompactDataOutput(myUnderlyingOutputStream);
}
public void close() throws IOException {
myUnderlyingOutputStream.close();
}
@Override
public void handleText(int startOffset, int endOffset) throws IOException {
myOutputStream.write(TEXT_ID);
myOutputStream.writeInt(startOffset - myCurrentOffset);
myOutputStream.writeInt(endOffset - startOffset);
myCurrentOffset = endOffset;
}
@Override
public void handleForeground(int foregroundId) throws IOException {
myOutputStream.write(FOREGROUND_ID);
myOutputStream.writeInt(foregroundId);
}
@Override
public void handleBackground(int backgroundId) throws IOException {
myOutputStream.write(BACKGROUND_ID);
myOutputStream.writeInt(backgroundId);
}
@Override
public void handleFont(int fontNameId) throws IOException {
myOutputStream.write(FONT_ID);
myOutputStream.writeInt(fontNameId);
}
@Override
public void handleStyle(int style) throws IOException {
myOutputStream.write(STYLE_ID);
myOutputStream.writeInt(style);
}
@Override
public boolean canHandleMore() {
return true;
}
}
public static class InputStream {
private final CompactDataInput myInputStream;
private final java.io.InputStream myUnderlyingInputStream;
private int myCurrentOffset;
public InputStream(java.io.InputStream stream) throws IOException {
myUnderlyingInputStream = new SnappyInputStream(stream);
myInputStream = new CompactDataInput(myUnderlyingInputStream);
}
public void read(MarkupHandler handler) throws Exception {
int id = myInputStream.readByte();
switch (id) {
case TEXT_ID:
int startOffset = myCurrentOffset + myInputStream.readInt();
myCurrentOffset = startOffset;
int endOffset = myCurrentOffset + myInputStream.readInt();
myCurrentOffset = endOffset;
handler.handleText(startOffset, endOffset);
break;
case STYLE_ID:
handler.handleStyle(myInputStream.readInt());
break;
case FOREGROUND_ID:
handler.handleForeground(myInputStream.readInt());
break;
case BACKGROUND_ID:
handler.handleBackground(myInputStream.readInt());
break;
case FONT_ID:
handler.handleFont(myInputStream.readInt());
break;
default:
throw new IllegalStateException("Unknown tag id: " + id);
}
}
public void close() throws IOException {
myUnderlyingInputStream.close();
}
}
}