1 /* 2 * Copyright (c) 2023 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 #include "session_info.h" 17 18 #include "ability_base_log_wrapper.h" 19 #include "ability_start_setting.h" 20 21 namespace OHOS { 22 namespace AAFwk { Marshalling(Parcel & parcel) const23bool SessionInfo::Marshalling(Parcel& parcel) const 24 { 25 if (!DoMarshallingOne(parcel)) { 26 return false; 27 } 28 29 if (!DoMarshallingTwo(parcel)) { 30 return false; 31 } 32 33 return DoMarshallingThree(parcel); 34 } 35 DoMarshallingOne(Parcel & parcel) const36bool SessionInfo::DoMarshallingOne(Parcel& parcel) const 37 { 38 if (sessionToken) { 39 if (!parcel.WriteBool(true) || 40 !(static_cast<MessageParcel*>(&parcel))->WriteRemoteObject(sessionToken)) { 41 ABILITYBASE_LOGE("Write session token failed."); 42 return false; 43 } 44 } else { 45 if (!parcel.WriteBool(false)) { 46 return false; 47 } 48 } 49 50 if (callerSession) { 51 if (!parcel.WriteBool(true) || 52 !(static_cast<MessageParcel*>(&parcel))->WriteRemoteObject(callerSession)) { 53 ABILITYBASE_LOGE("Write caller session failed."); 54 return false; 55 } 56 } else { 57 if (!parcel.WriteBool(false)) { 58 return false; 59 } 60 } 61 62 if (callerToken) { 63 if (!parcel.WriteBool(true) || 64 !(static_cast<MessageParcel*>(&parcel))->WriteRemoteObject(callerToken)) { 65 ABILITYBASE_LOGE("Write caller token failed."); 66 return false; 67 } 68 } else { 69 if (!parcel.WriteBool(false)) { 70 return false; 71 } 72 } 73 74 if (parentToken) { 75 if (!parcel.WriteBool(true) || 76 !(static_cast<MessageParcel*>(&parcel))->WriteRemoteObject(parentToken)) { 77 ABILITYBASE_LOGE("Write parent token failed."); 78 return false; 79 } 80 } else { 81 if (!parcel.WriteBool(false)) { 82 return false; 83 } 84 } 85 return true; 86 } 87 DoMarshallingTwo(Parcel & parcel) const88bool SessionInfo::DoMarshallingTwo(Parcel& parcel) const 89 { 90 if (!parcel.WriteInt32(persistentId)) { 91 ABILITYBASE_LOGE("Write persistent id failed."); 92 return false; 93 } 94 95 if (!parcel.WriteUint32(hostWindowId)) { 96 ABILITYBASE_LOGE("Write host window id failed."); 97 return false; 98 } 99 100 if (!parcel.WriteUint32(static_cast<uint32_t>(state))) { 101 ABILITYBASE_LOGE("Write state failed."); 102 return false; 103 } 104 105 if (!parcel.WriteInt32(resultCode)) { 106 ABILITYBASE_LOGE("Write resultCode failed."); 107 return false; 108 } 109 110 if (!parcel.WriteInt32(requestCode)) { 111 ABILITYBASE_LOGE("Write requestCode failed."); 112 return false; 113 } 114 115 if (!parcel.WriteString(errorReason)) { 116 ABILITYBASE_LOGE("Write errorReason failed."); 117 return false; 118 } 119 120 if (!parcel.WriteInt32(errorCode)) { 121 ABILITYBASE_LOGE("Write errorCode failed."); 122 return false; 123 } 124 125 if (!parcel.WriteInt64(uiAbilityId)) { 126 ABILITYBASE_LOGE("Write uiAbilityId failed."); 127 return false; 128 } 129 130 if (!parcel.WriteParcelable(startSetting.get())) { 131 ABILITYBASE_LOGE("Write startSetting failed."); 132 return false; 133 } 134 return true; 135 } 136 DoMarshallingThree(Parcel & parcel) const137bool SessionInfo::DoMarshallingThree(Parcel& parcel) const 138 { 139 if (!parcel.WriteBool(isNewWant)) { 140 ABILITYBASE_LOGE("Write isNewWant failed."); 141 return false; 142 } 143 144 if (!parcel.WriteBool(isClearSession)) { 145 ABILITYBASE_LOGE("Write isClearSession failed."); 146 return false; 147 } 148 149 if (!parcel.WriteUint32(callingTokenId)) { 150 ABILITYBASE_LOGE("Write callingTokenId failed."); 151 return false; 152 } 153 154 if (!parcel.WriteBool(reuse)) { 155 ABILITYBASE_LOGE("Write reuse failed."); 156 return false; 157 } 158 159 if (!parcel.WriteInt32(collaboratorType)) { 160 ABILITYBASE_LOGE("Write collaboratorType failed."); 161 return false; 162 } 163 164 if (!parcel.WriteString(sessionName)) { 165 ABILITYBASE_LOGE("Write sessionName failed."); 166 return false; 167 } 168 169 if (!parcel.WriteUint64(uiExtensionComponentId)) { 170 ABILITYBASE_LOGE("Write uiExtensionComponentId failed."); 171 return false; 172 } 173 174 if (!parcel.WriteBool(isAsyncModalBinding)) { 175 ABILITYBASE_LOGE("Write isAsyncModalBinding failed."); 176 return false; 177 } 178 179 if (!parcel.WriteParcelable(&want)) { 180 ABILITYBASE_LOGE("Write want failed."); 181 return false; 182 } 183 return true; 184 } 185 Unmarshalling(Parcel & parcel)186SessionInfo* SessionInfo::Unmarshalling(Parcel& parcel) 187 { 188 SessionInfo* info = new SessionInfo(); 189 if (parcel.ReadBool()) { 190 info->sessionToken = (static_cast<MessageParcel*>(&parcel))->ReadRemoteObject(); 191 } 192 193 if (parcel.ReadBool()) { 194 info->callerSession = (static_cast<MessageParcel*>(&parcel))->ReadRemoteObject(); 195 } 196 197 if (parcel.ReadBool()) { 198 info->callerToken = (static_cast<MessageParcel*>(&parcel))->ReadRemoteObject(); 199 } 200 201 if (parcel.ReadBool()) { 202 info->parentToken = (static_cast<MessageParcel*>(&parcel))->ReadRemoteObject(); 203 } 204 205 info->persistentId = parcel.ReadInt32(); 206 info->hostWindowId = parcel.ReadUint32(); 207 info->state = static_cast<CallToState>(parcel.ReadUint32()); 208 info->resultCode = parcel.ReadInt32(); 209 info->requestCode = parcel.ReadInt32(); 210 info->errorReason = parcel.ReadString(); 211 info->errorCode = parcel.ReadInt32(); 212 info->uiAbilityId = parcel.ReadInt64(); 213 info->startSetting.reset(parcel.ReadParcelable<AbilityStartSetting>()); 214 info->isNewWant = parcel.ReadBool(); 215 info->isClearSession = parcel.ReadBool(); 216 info->callingTokenId = parcel.ReadUint32(); 217 info->reuse = parcel.ReadBool(); 218 info->collaboratorType = parcel.ReadInt32(); 219 info->sessionName = parcel.ReadString(); 220 info->uiExtensionComponentId = parcel.ReadUint64(); 221 info->isAsyncModalBinding = parcel.ReadBool(); 222 223 std::unique_ptr<Want> want(parcel.ReadParcelable<Want>()); 224 if (want != nullptr) { 225 info->want = *want; 226 } 227 return info; 228 } 229 } // namespace AAFwk 230 } // namespace OHOS 231