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