1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#include "circle_stream_buffer.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_cinamespace OHOS { 19c29fa5a6Sopenharmony_cinamespace MMI { 20c29fa5a6Sopenharmony_civoid CircleStreamBuffer::CopyDataToBegin() 21c29fa5a6Sopenharmony_ci{ 22c29fa5a6Sopenharmony_ci int32_t unreadSize = UnreadSize(); 23c29fa5a6Sopenharmony_ci if (unreadSize > 0 && rPos_ > 0) { 24c29fa5a6Sopenharmony_ci int32_t pos = 0; 25c29fa5a6Sopenharmony_ci for (int32_t i = rPos_; i <= wPos_;) { 26c29fa5a6Sopenharmony_ci szBuff_[pos++] = szBuff_[i++]; 27c29fa5a6Sopenharmony_ci } 28c29fa5a6Sopenharmony_ci } 29c29fa5a6Sopenharmony_ci MMI_HILOGD("unreadSize:%{public}d rPos:%{public}d wPos:%{public}d", unreadSize, rPos_, wPos_); 30c29fa5a6Sopenharmony_ci rPos_ = 0; 31c29fa5a6Sopenharmony_ci wPos_ = unreadSize; 32c29fa5a6Sopenharmony_ci} 33c29fa5a6Sopenharmony_ci 34c29fa5a6Sopenharmony_cibool CircleStreamBuffer::CheckWrite(size_t size) 35c29fa5a6Sopenharmony_ci{ 36c29fa5a6Sopenharmony_ci int32_t bufferSize = static_cast<int32_t>(size); 37c29fa5a6Sopenharmony_ci int32_t availSize = GetAvailableBufSize(); 38c29fa5a6Sopenharmony_ci if (bufferSize > availSize && rPos_ > 0) { 39c29fa5a6Sopenharmony_ci CopyDataToBegin(); 40c29fa5a6Sopenharmony_ci availSize = GetAvailableBufSize(); 41c29fa5a6Sopenharmony_ci } 42c29fa5a6Sopenharmony_ci return (availSize >= bufferSize); 43c29fa5a6Sopenharmony_ci} 44c29fa5a6Sopenharmony_ci 45c29fa5a6Sopenharmony_cibool CircleStreamBuffer::Write(const char *buf, size_t size) 46c29fa5a6Sopenharmony_ci{ 47c29fa5a6Sopenharmony_ci if (!CheckWrite(size)) { 48c29fa5a6Sopenharmony_ci MMI_HILOGE("Out of buffer memory, availableSize:%{public}d, size:%{public}zu," 49c29fa5a6Sopenharmony_ci "unreadSize:%{public}d, rPos:%{public}d, wPos:%{public}d", 50c29fa5a6Sopenharmony_ci GetAvailableBufSize(), size, UnreadSize(), rPos_, wPos_); 51c29fa5a6Sopenharmony_ci return false; 52c29fa5a6Sopenharmony_ci } 53c29fa5a6Sopenharmony_ci return StreamBuffer::Write(buf, size); 54c29fa5a6Sopenharmony_ci} 55c29fa5a6Sopenharmony_ci} // namespace MMI 56c29fa5a6Sopenharmony_ci} // namespace OHOS