1ca0551cfSopenharmony_ci/* 2ca0551cfSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License. 5ca0551cfSopenharmony_ci * You may obtain a copy of the License at 6ca0551cfSopenharmony_ci * 7ca0551cfSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8ca0551cfSopenharmony_ci * 9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and 13ca0551cfSopenharmony_ci * limitations under the License. 14ca0551cfSopenharmony_ci */ 15ca0551cfSopenharmony_ci 16ca0551cfSopenharmony_ci#include "util/file.h" 17ca0551cfSopenharmony_ci 18ca0551cfSopenharmony_ci#include <cstdlib> 19ca0551cfSopenharmony_ci#include <cstdint> 20ca0551cfSopenharmony_ci#include <cstring> 21ca0551cfSopenharmony_ci#include <climits> 22ca0551cfSopenharmony_ci#include "securec.h" 23ca0551cfSopenharmony_ci 24ca0551cfSopenharmony_cinamespace OHOS { 25ca0551cfSopenharmony_cinamespace Idl { 26ca0551cfSopenharmony_ci#ifdef __MINGW32__ 27ca0551cfSopenharmony_ciconstexpr unsigned int File::READ; 28ca0551cfSopenharmony_ciconstexpr unsigned int File::WRITE; 29ca0551cfSopenharmony_ciconstexpr unsigned int File::APPEND; 30ca0551cfSopenharmony_ci#endif 31ca0551cfSopenharmony_ci 32ca0551cfSopenharmony_ciFile::File(const String& path, int mode) 33ca0551cfSopenharmony_ci : mode_(mode) 34ca0551cfSopenharmony_ci{ 35ca0551cfSopenharmony_ci if (path.IsEmpty()) { 36ca0551cfSopenharmony_ci return; 37ca0551cfSopenharmony_ci } 38ca0551cfSopenharmony_ci 39ca0551cfSopenharmony_ci String pathTmp = ""; 40ca0551cfSopenharmony_ci#ifndef __MINGW32__ 41ca0551cfSopenharmony_ci char* absolutePath = realpath(path.string(), nullptr); 42ca0551cfSopenharmony_ci if (absolutePath != nullptr) { 43ca0551cfSopenharmony_ci pathTmp = absolutePath; 44ca0551cfSopenharmony_ci free(absolutePath); 45ca0551cfSopenharmony_ci } else { 46ca0551cfSopenharmony_ci pathTmp = path; 47ca0551cfSopenharmony_ci } 48ca0551cfSopenharmony_ci#else 49ca0551cfSopenharmony_ci char absolutePath[_MAX_PATH]; 50ca0551cfSopenharmony_ci if (_fullpath(absolutePath, path.string(), _MAX_PATH) == nullptr) { 51ca0551cfSopenharmony_ci pathTmp = absolutePath; 52ca0551cfSopenharmony_ci } else { 53ca0551cfSopenharmony_ci pathTmp = path; 54ca0551cfSopenharmony_ci } 55ca0551cfSopenharmony_ci#endif 56ca0551cfSopenharmony_ci 57ca0551cfSopenharmony_ci if (mode_ & READ) { 58ca0551cfSopenharmony_ci if (!pathTmp.IsEmpty()) { 59ca0551cfSopenharmony_ci fd_ = fopen(pathTmp.string(), "r"); 60ca0551cfSopenharmony_ci } 61ca0551cfSopenharmony_ci } else if (mode_ & WRITE) { 62ca0551cfSopenharmony_ci fd_ = fopen(path.string(), "w+"); 63ca0551cfSopenharmony_ci } else if (mode_ & APPEND) { 64ca0551cfSopenharmony_ci fd_ = fopen(path.string(), "a+"); 65ca0551cfSopenharmony_ci } 66ca0551cfSopenharmony_ci 67ca0551cfSopenharmony_ci if (fd_ != nullptr) { 68ca0551cfSopenharmony_ci#ifndef __MINGW32__ 69ca0551cfSopenharmony_ci char* absolutePath = realpath(path.string(), nullptr); 70ca0551cfSopenharmony_ci if (absolutePath != nullptr) { 71ca0551cfSopenharmony_ci path_ = absolutePath; 72ca0551cfSopenharmony_ci free(absolutePath); 73ca0551cfSopenharmony_ci } else { 74ca0551cfSopenharmony_ci path_ = path; 75ca0551cfSopenharmony_ci } 76ca0551cfSopenharmony_ci#else 77ca0551cfSopenharmony_ci char absolutePath[_MAX_PATH]; 78ca0551cfSopenharmony_ci _fullpath(absolutePath, path.string(), _MAX_PATH); 79ca0551cfSopenharmony_ci path_ = absolutePath; 80ca0551cfSopenharmony_ci#endif 81ca0551cfSopenharmony_ci } 82ca0551cfSopenharmony_ci} 83ca0551cfSopenharmony_ci 84ca0551cfSopenharmony_ciFile::~File() 85ca0551cfSopenharmony_ci{ 86ca0551cfSopenharmony_ci Close(); 87ca0551cfSopenharmony_ci} 88ca0551cfSopenharmony_ci 89ca0551cfSopenharmony_cichar File::GetChar() 90ca0551cfSopenharmony_ci{ 91ca0551cfSopenharmony_ci char c = PeekChar(); 92ca0551cfSopenharmony_ci 93ca0551cfSopenharmony_ci if (position_ + 1 <= size_) { 94ca0551cfSopenharmony_ci position_++; 95ca0551cfSopenharmony_ci 96ca0551cfSopenharmony_ci if (c != '\n') { 97ca0551cfSopenharmony_ci columnNo_++; 98ca0551cfSopenharmony_ci } else { 99ca0551cfSopenharmony_ci columnNo_ = 0; 100ca0551cfSopenharmony_ci lineNo_++; 101ca0551cfSopenharmony_ci } 102ca0551cfSopenharmony_ci } 103ca0551cfSopenharmony_ci return c; 104ca0551cfSopenharmony_ci} 105ca0551cfSopenharmony_ci 106ca0551cfSopenharmony_cichar File::PeekChar() 107ca0551cfSopenharmony_ci{ 108ca0551cfSopenharmony_ci if (position_ + 1 > size_) { 109ca0551cfSopenharmony_ci int ret = Read(); 110ca0551cfSopenharmony_ci if (ret == -1) { 111ca0551cfSopenharmony_ci isEof_ = true; 112ca0551cfSopenharmony_ci } 113ca0551cfSopenharmony_ci } 114ca0551cfSopenharmony_ci 115ca0551cfSopenharmony_ci return buffer_[position_]; 116ca0551cfSopenharmony_ci} 117ca0551cfSopenharmony_ci 118ca0551cfSopenharmony_cibool File::IsEof() const 119ca0551cfSopenharmony_ci{ 120ca0551cfSopenharmony_ci return isEof_ || buffer_[position_] == static_cast<char>(-1); 121ca0551cfSopenharmony_ci} 122ca0551cfSopenharmony_ci 123ca0551cfSopenharmony_ciint File::Read() 124ca0551cfSopenharmony_ci{ 125ca0551cfSopenharmony_ci if (isEof_ || isError_) { 126ca0551cfSopenharmony_ci return -1; 127ca0551cfSopenharmony_ci } 128ca0551cfSopenharmony_ci 129ca0551cfSopenharmony_ci (void)memset_s(buffer_, BUFFER_SIZE, 0, BUFFER_SIZE); 130ca0551cfSopenharmony_ci size_t count = fread(buffer_, 1, BUFFER_SIZE - 1, fd_); 131ca0551cfSopenharmony_ci if (count < BUFFER_SIZE - 1) { 132ca0551cfSopenharmony_ci isError_ = ferror(fd_) != 0; 133ca0551cfSopenharmony_ci buffer_[count] = -1; 134ca0551cfSopenharmony_ci } 135ca0551cfSopenharmony_ci size_ = count; 136ca0551cfSopenharmony_ci position_ = 0; 137ca0551cfSopenharmony_ci if (count <= 0 || count >= BUFFER_SIZE) { 138ca0551cfSopenharmony_ci return -1; 139ca0551cfSopenharmony_ci } 140ca0551cfSopenharmony_ci return count; 141ca0551cfSopenharmony_ci} 142ca0551cfSopenharmony_ci 143ca0551cfSopenharmony_cibool File::ReadData(void* data, size_t size) 144ca0551cfSopenharmony_ci{ 145ca0551cfSopenharmony_ci if (data == nullptr || size == 0 || size > SIZE_MAX) { 146ca0551cfSopenharmony_ci return true; 147ca0551cfSopenharmony_ci } 148ca0551cfSopenharmony_ci 149ca0551cfSopenharmony_ci if (fd_ == nullptr) { 150ca0551cfSopenharmony_ci return false; 151ca0551cfSopenharmony_ci } 152ca0551cfSopenharmony_ci 153ca0551cfSopenharmony_ci size_t count = fread(data, size, 1, fd_); 154ca0551cfSopenharmony_ci return count == 1; 155ca0551cfSopenharmony_ci} 156ca0551cfSopenharmony_ci 157ca0551cfSopenharmony_cibool File::WriteData(const void* data, size_t size) 158ca0551cfSopenharmony_ci{ 159ca0551cfSopenharmony_ci if (data == nullptr || size == 0) { 160ca0551cfSopenharmony_ci return true; 161ca0551cfSopenharmony_ci } 162ca0551cfSopenharmony_ci 163ca0551cfSopenharmony_ci if (fd_ == nullptr || !(mode_ & (WRITE | APPEND))) { 164ca0551cfSopenharmony_ci return false; 165ca0551cfSopenharmony_ci } 166ca0551cfSopenharmony_ci 167ca0551cfSopenharmony_ci size_t count = fwrite(data, size, 1, fd_); 168ca0551cfSopenharmony_ci return count == 1; 169ca0551cfSopenharmony_ci} 170ca0551cfSopenharmony_ci 171ca0551cfSopenharmony_civoid File::Flush() 172ca0551cfSopenharmony_ci{ 173ca0551cfSopenharmony_ci if ((mode_ & (WRITE | APPEND)) && fd_ != nullptr) { 174ca0551cfSopenharmony_ci fflush(fd_); 175ca0551cfSopenharmony_ci } 176ca0551cfSopenharmony_ci} 177ca0551cfSopenharmony_ci 178ca0551cfSopenharmony_cibool File::Reset() 179ca0551cfSopenharmony_ci{ 180ca0551cfSopenharmony_ci if (fd_ == nullptr) { 181ca0551cfSopenharmony_ci return false; 182ca0551cfSopenharmony_ci } 183ca0551cfSopenharmony_ci 184ca0551cfSopenharmony_ci return fseek(fd_, 0, SEEK_SET) == 0; 185ca0551cfSopenharmony_ci} 186ca0551cfSopenharmony_ci 187ca0551cfSopenharmony_cibool File::Skip(long size) 188ca0551cfSopenharmony_ci{ 189ca0551cfSopenharmony_ci if (fd_ == nullptr) { 190ca0551cfSopenharmony_ci return false; 191ca0551cfSopenharmony_ci } 192ca0551cfSopenharmony_ci 193ca0551cfSopenharmony_ci return fseek(fd_, size, SEEK_CUR) == 0; 194ca0551cfSopenharmony_ci} 195ca0551cfSopenharmony_ci 196ca0551cfSopenharmony_civoid File::Close() 197ca0551cfSopenharmony_ci{ 198ca0551cfSopenharmony_ci if (fd_ != nullptr) { 199ca0551cfSopenharmony_ci fclose(fd_); 200ca0551cfSopenharmony_ci fd_ = nullptr; 201ca0551cfSopenharmony_ci } 202ca0551cfSopenharmony_ci} 203ca0551cfSopenharmony_ci} 204ca0551cfSopenharmony_ci} 205