| /* |
| * 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(); |
| } |
| } |
| } |