11cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta/* 21cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Copyright (C) 2013 The Android Open Source Project 31cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * 41cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 51cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * you may not use this file except in compliance with the License. 61cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * You may obtain a copy of the License at 71cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * 81cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * http://www.apache.org/licenses/LICENSE-2.0 91cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * 101cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Unless required by applicable law or agreed to in writing, software 111cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * distributed under the License is distributed on an "AS IS" BASIS, 121cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * See the License for the specific language governing permissions and 141cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * limitations under the License. 151cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta */ 161cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta 171cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Guptapackage com.android.tools.layoutlib.java; 181cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta 191cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Guptaimport java.nio.charset.Charset; 201cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta 211cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta/** 221cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Defines the same class as the java.lang.UnsafeByteSequence which was added in 231cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Dalvik VM. This hack, provides a replacement for that class which can't be 241cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * loaded in the standard JVM since it's in the java package and standard JVM 251cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * doesn't have it. 261cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * <p/> 271cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Extracted from API level 18, file: 281cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * platform/libcore/luni/src/main/java/java/lang/UnsafeByteSequence.java 291cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta */ 301cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Guptapublic class UnsafeByteSequence { 311cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta private byte[] bytes; 321cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta private int count; 331cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta 341cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta public UnsafeByteSequence(int initialCapacity) { 351cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta this.bytes = new byte[initialCapacity]; 361cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta } 371cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta 381cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta public int size() { 391cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta return count; 401cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta } 411cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta 421cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta /** 431cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * Moves the write pointer back to the beginning of the sequence, 441cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta * but without resizing or reallocating the buffer. 451cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta */ 461cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta public void rewind() { 471cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta count = 0; 481cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta } 491cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta 501cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta public void write(byte[] buffer, int offset, int length) { 511cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta if (count + length >= bytes.length) { 521cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta byte[] newBytes = new byte[(count + length) * 2]; 531cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta System.arraycopy(bytes, 0, newBytes, 0, count); 541cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta bytes = newBytes; 551cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta } 561cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta System.arraycopy(buffer, offset, bytes, count, length); 571cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta count += length; 581cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta } 591cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta 601cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta public void write(int b) { 611cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta if (count == bytes.length) { 621cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta byte[] newBytes = new byte[count * 2]; 631cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta System.arraycopy(bytes, 0, newBytes, 0, count); 641cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta bytes = newBytes; 651cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta } 661cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta bytes[count++] = (byte) b; 671cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta } 681cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta 691cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta public byte[] toByteArray() { 701cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta if (count == bytes.length) { 711cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta return bytes; 721cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta } 731cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta byte[] result = new byte[count]; 741cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta System.arraycopy(bytes, 0, result, 0, count); 751cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta return result; 761cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta } 771cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta 781cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta public String toString(Charset cs) { 791cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta return new String(bytes, 0, count, cs); 801cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta } 811cf5df38f4bdafa1beb2674ca548ad6d9650766bDeepanshu Gupta} 82