xref: /foundation/ability/idl_tool/util/file.cpp (revision ca0551cf)
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