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