1 // Copyright (C) 2024 Huawei Device Co., Ltd.
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 //     http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
14 use std::error::Error;
15 use std::ffi::{c_char, CString};
16 use std::fmt;
17 
18 /// IPC specific Result, error is i32 type
19 pub type IpcResult<T> = std::result::Result<T, IpcStatusCode>;
20 
21 /// usage:
22 /// status_result::<()>(result, ())
23 /// or
24 /// status_result::<MsgParcel>(result, reply)
status_result<T>(code: i32, val: T) -> IpcResult<T>25 pub fn status_result<T>(code: i32, val: T) -> IpcResult<T> {
26     debug!("rust status code: {}", code);
27     match parse_status_code(code) {
28         IpcStatusCode::Ok => Ok(val),
29         e => Err(e),
30     }
31 }
32 
33 /// Parse status code
parse_status_code(code: i32) -> IpcStatusCode34 pub fn parse_status_code(code: i32) -> IpcStatusCode {
35     match code {
36         e if e == IpcStatusCode::Ok as i32 => IpcStatusCode::Ok,
37         e if e == IpcStatusCode::Failed as i32 => IpcStatusCode::Failed,
38         e if e == IpcStatusCode::Einval as i32 => IpcStatusCode::Einval,
39         e if e == IpcStatusCode::ErrNullObject as i32 => IpcStatusCode::ErrNullObject,
40         e if e == IpcStatusCode::ErrDeadObject as i32 => IpcStatusCode::ErrDeadObject,
41         e if e == IpcStatusCode::InvalidValue as i32 => IpcStatusCode::InvalidValue,
42         _ => IpcStatusCode::Unknow,
43     }
44 }
45 
46 /// IPC unified status code
47 #[derive(Hash, Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug)]
48 #[non_exhaustive]
49 pub enum IpcStatusCode {
50     /// success
51     Ok = 1,
52     /// failed
53     Failed = -1,
54     /// RemoteObj Err Code
55     /// Invalide Params
56     Einval = 22,
57     /// Object is null
58     ErrNullObject = 7,
59     /// The object has died
60     ErrDeadObject = -32,
61     /// invail value
62     InvalidValue = 0,
63     /// unknow value
64     Unknow = 99999,
65 }
66 
67 impl Error for IpcStatusCode {}
68 
69 /// # Safety
70 ///
71 /// IpcStatusCode is an enumeration type that can exist in multiple threads.
72 unsafe impl Send for IpcStatusCode {}
73 
74 impl fmt::Display for IpcStatusCode {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result75     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
76         match *self {
77             IpcStatusCode::Ok => write!(f, "Call Ok"),
78             IpcStatusCode::Failed => write!(f, "Call Failed"),
79             IpcStatusCode::Einval => write!(f, "Invalid Params"),
80             IpcStatusCode::ErrNullObject => write!(f, "Null Obj"),
81             IpcStatusCode::ErrDeadObject => write!(f, "Dead Obj"),
82             IpcStatusCode::InvalidValue => write!(f, "Invalid Value"),
83             _ => write!(f, "Unknow Error"),
84         }
85     }
86 }
87