17301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver/*
27301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * Copyright 2012, Google Inc.
37301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * All rights reserved.
47301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver *
57301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * Redistribution and use in source and binary forms, with or without
67301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * modification, are permitted provided that the following conditions are
77301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * met:
87301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver *
97301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver *     * Redistributions of source code must retain the above copyright
107301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * notice, this list of conditions and the following disclaimer.
117301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver *     * Redistributions in binary form must reproduce the above
127301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * copyright notice, this list of conditions and the following disclaimer
137301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * in the documentation and/or other materials provided with the
147301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * distribution.
157301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver *     * Neither the name of Google Inc. nor the names of its
167301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * contributors may be used to endorse or promote products derived from
177301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * this software without specific prior written permission.
187301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver *
197301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
207301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
217301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
227301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
237301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
247301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
257301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
267301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
277301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
287301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
297301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
307301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver */
317301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
327301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruverpackage org.jf.dexlib2.dexbacked;
337301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
347301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruverimport org.jf.util.ExceptionWithContext;
357301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
367301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruverimport javax.annotation.Nonnull;
377301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
387301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruverpublic class BaseDexBuffer {
397301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    @Nonnull /* package private */ final byte[] buf;
407301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
417301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    public BaseDexBuffer(@Nonnull byte[] buf) {
427301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        this.buf = buf;
437301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    }
447301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
457301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    public int readSmallUint(int offset) {
467301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        byte[] buf = this.buf;
477301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        int result = (buf[offset] & 0xff) |
487301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+1] & 0xff) << 8) |
497301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+2] & 0xff) << 16) |
507301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+3]) << 24);
517301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        if (result < 0) {
527301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver            throw new ExceptionWithContext("Encountered small uint that is out of range at offset 0x%x", offset);
537301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        }
547301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        return result;
557301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    }
567301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
577301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    public int readOptionalUint(int offset) {
587301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        byte[] buf = this.buf;
597301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        int result = (buf[offset] & 0xff) |
607301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+1] & 0xff) << 8) |
617301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+2] & 0xff) << 16) |
627301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+3]) << 24);
637301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        if (result < -1) {
647301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver            throw new ExceptionWithContext("Encountered optional uint that is out of range at offset 0x%x", offset);
657301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        }
667301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        return result;
677301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    }
687301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
697301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    public int readUshort(int offset) {
707301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        byte[] buf = this.buf;
717301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        return (buf[offset] & 0xff) |
727301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+1] & 0xff) << 8);
737301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    }
747301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
757301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    public int readUbyte(int offset) {
767301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        return buf[offset] & 0xff;
777301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    }
787301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
797301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    public long readLong(int offset) {
807301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        byte[] buf = this.buf;
817301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        return (buf[offset] & 0xff) |
827301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+1] & 0xff) << 8) |
837301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+2] & 0xff) << 16) |
847301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+3] & 0xffL) << 24) |
857301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+4] & 0xffL) << 32) |
867301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+5] & 0xffL) << 40) |
877301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+6] & 0xffL) << 48) |
887301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                (((long)buf[offset+7]) << 56);
897301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    }
907301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
917301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    public int readInt(int offset) {
927301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        byte[] buf = this.buf;
937301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        return (buf[offset] & 0xff) |
947301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+1] & 0xff) << 8) |
957301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                ((buf[offset+2] & 0xff) << 16) |
967301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                (buf[offset+3] << 24);
977301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    }
987301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
997301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    public int readShort(int offset) {
1007301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        byte[] buf = this.buf;
1017301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        return (buf[offset] & 0xff) |
1027301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver                (buf[offset+1] << 8);
1037301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    }
1047301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
1057301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    public int readByte(int offset) {
1067301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        return buf[offset];
1077301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    }
1087301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver
1097301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    @Nonnull
1107301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    public BaseDexReader readerAt(int offset) {
1117301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver        return new BaseDexReader<BaseDexBuffer>(this, offset);
1127301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver    }
113cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver
114cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver    @Nonnull
115cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver    protected byte[] getBuf() {
116cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver        return buf;
117cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver    }
1187301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver}
119