127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/*
227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2010 The Android Open Source Project
327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License");
527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License.
627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at
727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *      http://www.apache.org/licenses/LICENSE-2.0
927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software
1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS,
1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and
1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License.
1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */
1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi//#define LOG_NDEBUG 0
182272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi#define LOG_TAG "ReadWriteUtils"
192272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi#include <utils/Log.h>
202272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <ReadWriteUtils.h>
2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/mman.h>
2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/stat.h>
2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/types.h>
2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <fcntl.h>
2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <stdio.h>
2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <stdlib.h>
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <unistd.h>
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/String8.h>
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android;
3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define FAILURE -1
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 ReadWriteUtils::readBytes(const String8& filePath) {
3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    FILE* file = NULL;
3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    file = fopen(filePath.string(), "r");
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    String8 string("");
4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != file) {
4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int fd = fileno(file);
4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        struct stat sb;
4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (fstat(fd, &sb) == 0 && sb.st_size > 0) {
45a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            off64_t length = sb.st_size;
462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            char* bytes = new char[length];
472272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            if (length == read(fd, (void*) bytes, length)) {
482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi                string.append(bytes, length);
4927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            delete bytes;
5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        fclose(file);
5327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
5427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return string;
5527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
5627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimiint ReadWriteUtils::readBytes(const String8& filePath, char** buffer) {
582272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    FILE* file = NULL;
592272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    file = fopen(filePath.string(), "r");
60a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    off64_t length = 0;
612272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
622272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    if (NULL != file) {
632272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        int fd = fileno(file);
642272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        struct stat sb;
652272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        if (fstat(fd, &sb) == 0 && sb.st_size > 0) {
672272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            length = sb.st_size;
682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            *buffer = new char[length];
692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            if (length != read(fd, (void*) *buffer, length)) {
702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi                length = FAILURE;
712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            }
722272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        }
732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        fclose(file);
742272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
752272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return length;
762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid ReadWriteUtils::writeToFile(const String8& filePath, const String8& data) {
7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    FILE* file = NULL;
8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    file = fopen(filePath.string(), "w+");
8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != file) {
8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int fd = fileno(file);
8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int size = data.size();
8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (FAILURE != ftruncate(fd, size)) {
872272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            if (size != write(fd, data.string(), size)) {
8829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("Failed to write the data to: %s", filePath.string());
8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        fclose(file);
9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid ReadWriteUtils::appendToFile(const String8& filePath, const String8& data) {
9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    FILE* file = NULL;
9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    file = fopen(filePath.string(), "a+");
9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != file) {
10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int fd = fileno(file);
10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1022272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        int size = data.size();
1032272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        if (size != write(fd, data.string(), size)) {
10429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("Failed to write the data to: %s", filePath.string());
10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        fclose(file);
10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110