blob: f53c60c9b94d9443b156e9d6a951c3272922b220 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* 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.android.mail.photomanager;
import android.os.StrictMode;
import java.io.FileInputStream;
public class MemInfoReader {
byte[] mBuffer = new byte[1024];
private long mTotalSize;
private long mFreeSize;
private long mCachedSize;
private static boolean matchText(byte[] buffer, int index, String text) {
int N = text.length();
if ((index + N) >= buffer.length) {
return false;
}
for (int i = 0; i < N; i++) {
if (buffer[index + i] != text.charAt(i)) {
return false;
}
}
return true;
}
private static long extractMemValue(byte[] buffer, int index) {
while (index < buffer.length && buffer[index] != '\n') {
if (buffer[index] >= '0' && buffer[index] <= '9') {
int start = index;
index++;
while (index < buffer.length && buffer[index] >= '0' && buffer[index] <= '9') {
index++;
}
String str = new String(buffer, 0, start, index - start);
return ((long) Integer.parseInt(str)) * 1024;
}
index++;
}
return 0;
}
public void readMemInfo() {
// Permit disk reads here, as /proc/meminfo isn't really "on
// disk" and should be fast. TODO: make BlockGuard ignore
// /proc/ and /sys/ files perhaps?
StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
try {
mTotalSize = 0;
mFreeSize = 0;
mCachedSize = 0;
FileInputStream is = new FileInputStream("/proc/meminfo");
int len = is.read(mBuffer);
is.close();
final int BUFLEN = mBuffer.length;
int count = 0;
for (int i = 0; i < len && count < 3; i++) {
if (matchText(mBuffer, i, "MemTotal")) {
i += 8;
mTotalSize = extractMemValue(mBuffer, i);
count++;
} else if (matchText(mBuffer, i, "MemFree")) {
i += 7;
mFreeSize = extractMemValue(mBuffer, i);
count++;
} else if (matchText(mBuffer, i, "Cached")) {
i += 6;
mCachedSize = extractMemValue(mBuffer, i);
count++;
}
while (i < BUFLEN && mBuffer[i] != '\n') {
i++;
}
}
} catch (java.io.FileNotFoundException e) {
} catch (java.io.IOException e) {
} finally {
StrictMode.setThreadPolicy(savedPolicy);
}
}
public long getTotalSize() {
return mTotalSize;
}
public long getFreeSize() {
return mFreeSize;
}
public long getCachedSize() {
return mCachedSize;
}
}