ReadWriteUtils.cpp revision 27ed8ad2db653f6ac07dcf8bcc05e2409c8bb024
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
1727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <ReadWriteUtils.h>
1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/mman.h>
1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/stat.h>
2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/types.h>
2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <fcntl.h>
2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <stdio.h>
2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <stdlib.h>
2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <unistd.h>
2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/FileMap.h>
2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/String8.h>
2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android;
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define FAILURE -1
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 ReadWriteUtils::readBytes(const String8& filePath) {
3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    FILE* file = NULL;
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    file = fopen(filePath.string(), "r");
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    String8 string("");
3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != file) {
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int fd = fileno(file);
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        struct stat sb;
4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (fstat(fd, &sb) == 0 && sb.st_size > 0) {
4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            FileMap* fileMap = new FileMap();
4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (fileMap->create(filePath.string(), fd, 0, sb.st_size, true)) {
4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                char* addr = (char*)fileMap->getDataPtr();
4527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                string.append(addr, sb.st_size);
4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                fileMap->release();
4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
4927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        fclose(file);
5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return string;
5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
5327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid ReadWriteUtils::writeToFile(const String8& filePath, const String8& data) {
5527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    FILE* file = NULL;
5627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    file = fopen(filePath.string(), "w+");
5727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != file) {
5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int fd = fileno(file);
6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int size = data.size();
6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (FAILURE != ftruncate(fd, size)) {
6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            FileMap* fileMap = NULL;
6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            fileMap = new FileMap();
6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (fileMap->create(filePath.string(), fd, 0, size, false)) {
6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                char* addr = (char*)fileMap->getDataPtr();
6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                memcpy(addr, data.string(), size);
6827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                fileMap->release();
6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        fclose(file);
7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid ReadWriteUtils::appendToFile(const String8& filePath, const String8& data) {
7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    FILE* file = NULL;
7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    file = fopen(filePath.string(), "a+");
7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != file) {
8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int fd = fileno(file);
8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int offset = lseek(fd, 0, SEEK_END);
8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (FAILURE != offset) {
8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int newEntrySize = data.size();
8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int fileSize = offset + newEntrySize;
8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (FAILURE != ftruncate(fd, fileSize)) {
8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                FileMap* fileMap = NULL;
8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                fileMap = new FileMap();
9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (fileMap->create(filePath.string(), fd, offset, fileSize, false)) {
9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    char* addr = (char*)fileMap->getDataPtr();
9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    memcpy(addr, data.string(), data.size());
9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    fileMap->release();
9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        fclose(file);
9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101