17d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/*
27d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Copyright (C) 2011 The Android Open Source Project
37d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn *
47d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
57d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * you may not use this file except in compliance with the License.
67d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * You may obtain a copy of the License at
77d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn *
87d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
97d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn *
107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Unless required by applicable law or agreed to in writing, software
117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * See the License for the specific language governing permissions and
147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * limitations under the License.
157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */
167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornpackage com.android.internal.util;
187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport java.io.FileInputStream;
207d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
217d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.os.StrictMode;
227d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
237d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornpublic class MemInfoReader {
247d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    byte[] mBuffer = new byte[1024];
257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private long mTotalSize;
277d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private long mFreeSize;
287d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private long mCachedSize;
297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private boolean matchText(byte[] buffer, int index, String text) {
317d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        int N = text.length();
327d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        if ((index+N) >= buffer.length) {
337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            return false;
347d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
357d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        for (int i=0; i<N; i++) {
367d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            if (buffer[index+i] != text.charAt(i)) {
377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                return false;
387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            }
397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
407d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        return true;
417d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
437d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private long extractMemValue(byte[] buffer, int index) {
447d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        while (index < buffer.length && buffer[index] != '\n') {
457d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            if (buffer[index] >= '0' && buffer[index] <= '9') {
467d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                int start = index;
477d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                index++;
487d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                while (index < buffer.length && buffer[index] >= '0'
497d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    && buffer[index] <= '9') {
507d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    index++;
517d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                }
527d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                String str = new String(buffer, 0, start, index-start);
537d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                return ((long)Integer.parseInt(str)) * 1024;
547d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            }
557d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            index++;
567d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
577d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        return 0;
587d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
597d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
607d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    public void readMemInfo() {
617d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // Permit disk reads here, as /proc/meminfo isn't really "on
627d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // disk" and should be fast.  TODO: make BlockGuard ignore
637d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // /proc/ and /sys/ files perhaps?
647d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
657d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        try {
667d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            mTotalSize = 0;
677d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            mFreeSize = 0;
687d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            mCachedSize = 0;
697d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            FileInputStream is = new FileInputStream("/proc/meminfo");
707d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            int len = is.read(mBuffer);
717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            is.close();
727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            final int BUFLEN = mBuffer.length;
737d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            int count = 0;
747d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            for (int i=0; i<len && count < 3; i++) {
757d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                if (matchText(mBuffer, i, "MemTotal")) {
767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    i += 8;
777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    mTotalSize = extractMemValue(mBuffer, i);
787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    count++;
797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                } else if (matchText(mBuffer, i, "MemFree")) {
807d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    i += 7;
817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    mFreeSize = extractMemValue(mBuffer, i);
827d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    count++;
837d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                } else if (matchText(mBuffer, i, "Cached")) {
847d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    i += 6;
857d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    mCachedSize = extractMemValue(mBuffer, i);
867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    count++;
877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                }
887d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                while (i < BUFLEN && mBuffer[i] != '\n') {
897d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                    i++;
907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                }
917d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            }
927d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        } catch (java.io.FileNotFoundException e) {
937d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        } catch (java.io.IOException e) {
947d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        } finally {
957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            StrictMode.setThreadPolicy(savedPolicy);
967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    public long getTotalSize() {
1007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        return mTotalSize;
1017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
1027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    public long getFreeSize() {
1047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        return mFreeSize;
1057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
1067d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    public long getCachedSize() {
1087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        return mCachedSize;
1097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
1107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn}
111