1e1c44949Sopenharmony_ci/*
2e1c44949Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3e1c44949Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e1c44949Sopenharmony_ci * you may not use this file except in compliance with the License.
5e1c44949Sopenharmony_ci * You may obtain a copy of the License at
6e1c44949Sopenharmony_ci *
7e1c44949Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e1c44949Sopenharmony_ci *
9e1c44949Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e1c44949Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e1c44949Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e1c44949Sopenharmony_ci * See the License for the specific language governing permissions and
13e1c44949Sopenharmony_ci * limitations under the License.
14e1c44949Sopenharmony_ci */
15e1c44949Sopenharmony_ci
16e1c44949Sopenharmony_ci#include "controlcamera_fuzzer.h"
17e1c44949Sopenharmony_ci
18e1c44949Sopenharmony_ci#include <cstddef>
19e1c44949Sopenharmony_ci#include <cstdint>
20e1c44949Sopenharmony_ci#define private public
21e1c44949Sopenharmony_ci#include "addcalltoken_fuzzer.h"
22e1c44949Sopenharmony_ci#include "surface_utils.h"
23e1c44949Sopenharmony_ci
24e1c44949Sopenharmony_ciusing namespace OHOS::Telephony;
25e1c44949Sopenharmony_cinamespace OHOS {
26e1c44949Sopenharmony_ci
27e1c44949Sopenharmony_ciint32_t ControlCamera(const uint8_t *data, size_t size)
28e1c44949Sopenharmony_ci{
29e1c44949Sopenharmony_ci    if (!IsServiceInited()) {
30e1c44949Sopenharmony_ci        return TELEPHONY_ERROR;
31e1c44949Sopenharmony_ci    }
32e1c44949Sopenharmony_ci    int32_t callId = static_cast<int32_t>(size);
33e1c44949Sopenharmony_ci    std::string cameraId(reinterpret_cast<const char *>(data), size);
34e1c44949Sopenharmony_ci    auto cameraIdU16 = Str8ToStr16(cameraId);
35e1c44949Sopenharmony_ci    MessageParcel dataParcel;
36e1c44949Sopenharmony_ci    dataParcel.WriteInt32(callId);
37e1c44949Sopenharmony_ci    dataParcel.WriteString16(cameraIdU16);
38e1c44949Sopenharmony_ci    dataParcel.RewindRead(0);
39e1c44949Sopenharmony_ci    MessageParcel reply;
40e1c44949Sopenharmony_ci    return DelayedSingleton<CallManagerService>::GetInstance()->OnControlCamera(dataParcel, reply);
41e1c44949Sopenharmony_ci}
42e1c44949Sopenharmony_ci
43e1c44949Sopenharmony_ciint32_t SetPreviewWindow(const uint8_t *data, size_t size)
44e1c44949Sopenharmony_ci{
45e1c44949Sopenharmony_ci    if (!IsServiceInited()) {
46e1c44949Sopenharmony_ci        return TELEPHONY_ERROR;
47e1c44949Sopenharmony_ci    }
48e1c44949Sopenharmony_ci    int32_t callId = static_cast<int32_t>(size);
49e1c44949Sopenharmony_ci    std::string surfaceId(reinterpret_cast<const char *>(data), size);
50e1c44949Sopenharmony_ci    MessageParcel dataParcel;
51e1c44949Sopenharmony_ci    dataParcel.WriteInt32(callId);
52e1c44949Sopenharmony_ci    int len = static_cast<int>(surfaceId.length());
53e1c44949Sopenharmony_ci    std::string subSurfaceId = surfaceId;
54e1c44949Sopenharmony_ci    if (len >= 1) {
55e1c44949Sopenharmony_ci        subSurfaceId = surfaceId.substr(0, 1);
56e1c44949Sopenharmony_ci    }
57e1c44949Sopenharmony_ci    if (subSurfaceId.empty() || subSurfaceId[0] < '0' || subSurfaceId[0] > '9') {
58e1c44949Sopenharmony_ci        subSurfaceId = "";
59e1c44949Sopenharmony_ci        dataParcel.WriteString(subSurfaceId);
60e1c44949Sopenharmony_ci    } else {
61e1c44949Sopenharmony_ci        dataParcel.WriteString(subSurfaceId);
62e1c44949Sopenharmony_ci        uint64_t tmpSurfaceId = std::stoull(subSurfaceId);
63e1c44949Sopenharmony_ci        auto surface = SurfaceUtils::GetInstance()->GetSurface(tmpSurfaceId);
64e1c44949Sopenharmony_ci        if (surface != nullptr) {
65e1c44949Sopenharmony_ci            sptr<IBufferProducer> producer = surface->GetProducer();
66e1c44949Sopenharmony_ci            if (producer != nullptr) {
67e1c44949Sopenharmony_ci                dataParcel.WriteRemoteObject(producer->AsObject());
68e1c44949Sopenharmony_ci            }
69e1c44949Sopenharmony_ci        }
70e1c44949Sopenharmony_ci    }
71e1c44949Sopenharmony_ci    MessageParcel reply;
72e1c44949Sopenharmony_ci    return DelayedSingleton<CallManagerService>::GetInstance()->OnSetPreviewWindow(dataParcel, reply);
73e1c44949Sopenharmony_ci}
74e1c44949Sopenharmony_ci
75e1c44949Sopenharmony_ciint32_t SetDisplayWindow(const uint8_t *data, size_t size)
76e1c44949Sopenharmony_ci{
77e1c44949Sopenharmony_ci    if (!IsServiceInited()) {
78e1c44949Sopenharmony_ci        return TELEPHONY_ERROR;
79e1c44949Sopenharmony_ci    }
80e1c44949Sopenharmony_ci    int32_t callId = static_cast<int32_t>(size);
81e1c44949Sopenharmony_ci    std::string surfaceId(reinterpret_cast<const char *>(data), size);
82e1c44949Sopenharmony_ci    MessageParcel dataParcel;
83e1c44949Sopenharmony_ci    dataParcel.WriteInt32(callId);
84e1c44949Sopenharmony_ci    int len = static_cast<int>(surfaceId.length());
85e1c44949Sopenharmony_ci    std::string subSurfaceId = surfaceId;
86e1c44949Sopenharmony_ci    if (len >= 1) {
87e1c44949Sopenharmony_ci        subSurfaceId = surfaceId.substr(0, 1);
88e1c44949Sopenharmony_ci    }
89e1c44949Sopenharmony_ci    if (subSurfaceId.empty() || subSurfaceId[0] < '0' || subSurfaceId[0] > '9') {
90e1c44949Sopenharmony_ci        subSurfaceId = "";
91e1c44949Sopenharmony_ci        dataParcel.WriteString(subSurfaceId);
92e1c44949Sopenharmony_ci    } else {
93e1c44949Sopenharmony_ci        dataParcel.WriteString(subSurfaceId);
94e1c44949Sopenharmony_ci        uint64_t tmpSurfaceId = std::stoull(subSurfaceId);
95e1c44949Sopenharmony_ci        auto surface = SurfaceUtils::GetInstance()->GetSurface(tmpSurfaceId);
96e1c44949Sopenharmony_ci        if (surface != nullptr) {
97e1c44949Sopenharmony_ci            sptr<IBufferProducer> producer = surface->GetProducer();
98e1c44949Sopenharmony_ci            if (producer != nullptr) {
99e1c44949Sopenharmony_ci                dataParcel.WriteRemoteObject(producer->AsObject());
100e1c44949Sopenharmony_ci            }
101e1c44949Sopenharmony_ci        }
102e1c44949Sopenharmony_ci    }
103e1c44949Sopenharmony_ci    MessageParcel reply;
104e1c44949Sopenharmony_ci    return DelayedSingleton<CallManagerService>::GetInstance()->OnSetDisplayWindow(dataParcel, reply);
105e1c44949Sopenharmony_ci}
106e1c44949Sopenharmony_ci
107e1c44949Sopenharmony_ciint32_t SetCameraZoom(const uint8_t *data, size_t size)
108e1c44949Sopenharmony_ci{
109e1c44949Sopenharmony_ci    if (!IsServiceInited()) {
110e1c44949Sopenharmony_ci        return TELEPHONY_ERROR;
111e1c44949Sopenharmony_ci    }
112e1c44949Sopenharmony_ci    float zoomRatio = static_cast<float>(size);
113e1c44949Sopenharmony_ci    MessageParcel dataParcel;
114e1c44949Sopenharmony_ci    dataParcel.WriteFloat(zoomRatio);
115e1c44949Sopenharmony_ci    dataParcel.WriteBuffer(data, size);
116e1c44949Sopenharmony_ci    dataParcel.RewindRead(0);
117e1c44949Sopenharmony_ci    MessageParcel reply;
118e1c44949Sopenharmony_ci    return DelayedSingleton<CallManagerService>::GetInstance()->OnSetCameraZoom(dataParcel, reply);
119e1c44949Sopenharmony_ci}
120e1c44949Sopenharmony_ci
121e1c44949Sopenharmony_ciint32_t SetPausePicture(const uint8_t *data, size_t size)
122e1c44949Sopenharmony_ci{
123e1c44949Sopenharmony_ci    if (!IsServiceInited()) {
124e1c44949Sopenharmony_ci        return TELEPHONY_ERROR;
125e1c44949Sopenharmony_ci    }
126e1c44949Sopenharmony_ci    int32_t callId = static_cast<int32_t>(size);
127e1c44949Sopenharmony_ci    std::string path(reinterpret_cast<const char *>(data), size);
128e1c44949Sopenharmony_ci    auto pathU16 = Str8ToStr16(path);
129e1c44949Sopenharmony_ci    MessageParcel dataParcel;
130e1c44949Sopenharmony_ci    dataParcel.WriteInt32(callId);
131e1c44949Sopenharmony_ci    dataParcel.WriteString16(pathU16);
132e1c44949Sopenharmony_ci    dataParcel.RewindRead(0);
133e1c44949Sopenharmony_ci    MessageParcel reply;
134e1c44949Sopenharmony_ci    return DelayedSingleton<CallManagerService>::GetInstance()->OnSetPausePicture(dataParcel, reply);
135e1c44949Sopenharmony_ci}
136e1c44949Sopenharmony_ci
137e1c44949Sopenharmony_ciint32_t SetDeviceDirection(const uint8_t *data, size_t size)
138e1c44949Sopenharmony_ci{
139e1c44949Sopenharmony_ci    if (!IsServiceInited()) {
140e1c44949Sopenharmony_ci        return TELEPHONY_ERROR;
141e1c44949Sopenharmony_ci    }
142e1c44949Sopenharmony_ci    int32_t callId = static_cast<int32_t>(size);
143e1c44949Sopenharmony_ci    int32_t rotation = static_cast<int32_t>(size);
144e1c44949Sopenharmony_ci    MessageParcel dataParcel;
145e1c44949Sopenharmony_ci    dataParcel.WriteInt32(callId);
146e1c44949Sopenharmony_ci    dataParcel.WriteInt32(rotation);
147e1c44949Sopenharmony_ci    MessageParcel reply;
148e1c44949Sopenharmony_ci    return DelayedSingleton<CallManagerService>::GetInstance()->OnSetDeviceDirection(dataParcel, reply);
149e1c44949Sopenharmony_ci}
150e1c44949Sopenharmony_ci
151e1c44949Sopenharmony_ciint32_t CancelCallUpgrade(const uint8_t *data, size_t size)
152e1c44949Sopenharmony_ci{
153e1c44949Sopenharmony_ci    if (!IsServiceInited()) {
154e1c44949Sopenharmony_ci        return TELEPHONY_ERROR;
155e1c44949Sopenharmony_ci    }
156e1c44949Sopenharmony_ci    int32_t callId = static_cast<int32_t>(size);
157e1c44949Sopenharmony_ci    MessageParcel dataParcel;
158e1c44949Sopenharmony_ci    dataParcel.WriteInt32(callId);
159e1c44949Sopenharmony_ci    MessageParcel reply;
160e1c44949Sopenharmony_ci    return DelayedSingleton<CallManagerService>::GetInstance()->OnCancelCallUpgrade(dataParcel, reply);
161e1c44949Sopenharmony_ci}
162e1c44949Sopenharmony_ci
163e1c44949Sopenharmony_ciint32_t RequestCameraCapabilities(const uint8_t *data, size_t size)
164e1c44949Sopenharmony_ci{
165e1c44949Sopenharmony_ci    if (!IsServiceInited()) {
166e1c44949Sopenharmony_ci        return TELEPHONY_ERROR;
167e1c44949Sopenharmony_ci    }
168e1c44949Sopenharmony_ci    int32_t callId = static_cast<int32_t>(size);
169e1c44949Sopenharmony_ci    MessageParcel dataParcel;
170e1c44949Sopenharmony_ci    dataParcel.WriteInt32(callId);
171e1c44949Sopenharmony_ci    MessageParcel reply;
172e1c44949Sopenharmony_ci    return DelayedSingleton<CallManagerService>::GetInstance()->OnRequestCameraCapabilities(dataParcel, reply);
173e1c44949Sopenharmony_ci}
174e1c44949Sopenharmony_ci
175e1c44949Sopenharmony_civoid DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
176e1c44949Sopenharmony_ci{
177e1c44949Sopenharmony_ci    if (data == nullptr || size == 0) {
178e1c44949Sopenharmony_ci        return;
179e1c44949Sopenharmony_ci    }
180e1c44949Sopenharmony_ci    ControlCamera(data, size);
181e1c44949Sopenharmony_ci    SetPreviewWindow(data, size);
182e1c44949Sopenharmony_ci    SetDisplayWindow(data, size);
183e1c44949Sopenharmony_ci    SetCameraZoom(data, size);
184e1c44949Sopenharmony_ci    SetPausePicture(data, size);
185e1c44949Sopenharmony_ci    SetDeviceDirection(data, size);
186e1c44949Sopenharmony_ci    CancelCallUpgrade(data, size);
187e1c44949Sopenharmony_ci    RequestCameraCapabilities(data, size);
188e1c44949Sopenharmony_ci}
189e1c44949Sopenharmony_ci} // namespace OHOS
190e1c44949Sopenharmony_ci
191e1c44949Sopenharmony_ci/* Fuzzer entry point */
192e1c44949Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
193e1c44949Sopenharmony_ci{
194e1c44949Sopenharmony_ci    OHOS::AddCallTokenFuzzer token;
195e1c44949Sopenharmony_ci    /* Run your code on data */
196e1c44949Sopenharmony_ci    OHOS::DoSomethingInterestingWithMyAPI(data, size);
197e1c44949Sopenharmony_ci    return 0;
198e1c44949Sopenharmony_ci}
199