1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef HILOG_DATA_H
17#define HILOG_DATA_H
18
19#include <cstring>
20#include <iostream>
21#include <securec.h>
22
23#include <hilog/log.h>
24#include <hilog_common.h>
25
26namespace OHOS {
27namespace HiviewDFX {
28struct HilogData {
29    uint16_t len; /* tag length plus fmt length include '\0' */
30    uint16_t version : 3;
31    uint16_t type : 3;  /* APP,CORE,INIT,SEC etc */
32    uint16_t level : 4;
33    uint16_t tagLen : 6; /* include '\0' */
34    uint32_t tv_sec;
35    uint32_t tv_nsec;
36    uint32_t mono_sec;
37    uint32_t pid;
38    uint32_t tid;
39    uint32_t domain;
40    char* tag;
41    char* content;
42
43    void Init(const char *mtag, uint16_t mtagLen, const char *mfmt, size_t mfmtLen)
44    {
45        if (unlikely(mtagLen > MAX_TAG_LEN || mtagLen == 0 || mfmtLen > MAX_LOG_LEN || mfmtLen <= 0)) {
46            return;
47        }
48
49        len = mtagLen + mfmtLen;
50        char* tmp = new (std::nothrow) char[len];
51        if (unlikely(tmp == nullptr)) {
52            return;
53        }
54        tag = tmp;
55        content = tmp + mtagLen;
56        if (strncpy_s(tag, mtagLen + 1, mtag, mtagLen - 1)) {
57            return;
58        }
59        if (strncpy_s(content, mfmtLen + 1, mfmt, mfmtLen - 1)) {
60            return;
61        }
62    }
63
64    HilogData() : len(0), tag(nullptr), content(nullptr) {}
65    explicit HilogData(const HilogMsg& msg)
66        : len(0), version(msg.version), type(msg.type), level(msg.level), tagLen(msg.tagLen),
67        tv_sec(msg.tv_sec), tv_nsec(msg.tv_nsec), mono_sec(msg.mono_sec), pid(msg.pid), tid(msg.tid),
68        domain(msg.domain), tag(nullptr), content(nullptr)
69    {
70        Init(msg.tag, msg.tagLen, CONTENT_PTR((&msg)), CONTENT_LEN((&msg)));
71    }
72
73    HilogData(const HilogData& copy)
74    {
75        if (unlikely(memcpy_s(this, sizeof(HilogData), &copy, sizeof(HilogData)) != 0)) {
76            std::cerr << "HilogData copy error." << std::endl;
77        }
78        tag = new (std::nothrow) char[len];
79        if (unlikely(tag == nullptr)) {
80            return;
81        }
82        if (unlikely(memcpy_s(tag, len, copy.tag, len) != 0)) {
83            return;
84        }
85        content = tag + tagLen;
86    }
87
88    HilogData& operator=(const HilogData&) = delete;
89
90    HilogData(HilogData&&) = delete;
91
92    ~HilogData()
93    {
94        delete []tag;
95        tag = nullptr;
96        content = nullptr;
97    }
98};
99} // namespace HiviewDFX
100} // namespace OHOS
101#endif /* HILOG_DATA_H */
102