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 #include "obex_session.h"
17 #include <memory>
18 #include "log.h"
19 #include "obex_utils.h"
20 #include "obex_socket_transport.h"
21
22 namespace OHOS {
23 namespace bluetooth {
ObexServerSession(ObexTransport & transport,bool isSupportSrm,utility::Dispatcher & dispatcher,std::function<int (ObexServerSession &)> removeFun,std::function<void (ObexServerSession &,bool)> setBusyFun)24 ObexServerSession::ObexServerSession(ObexTransport &transport, bool isSupportSrm, utility::Dispatcher &dispatcher,
25 std::function<int(ObexServerSession &)> removeFun, std::function<void(ObexServerSession &, bool)> setBusyFun)
26 : ObexSession(transport.GetRemoteAddress()),
27 transport_(transport),
28 isSupportSrm_(isSupportSrm),
29 dispatcher_(dispatcher),
30 removeFun_(std::move(removeFun)),
31 setBusyFun_(std::move(setBusyFun))
32 {}
33
Disconnect()34 int ObexServerSession::Disconnect()
35 {
36 if (invalid_) {
37 return -1;
38 }
39 return removeFun_(*this);
40 }
41
SendSimpleResponse(ObexRspCode rspCode) const42 int ObexServerSession::SendSimpleResponse(ObexRspCode rspCode) const
43 {
44 if (invalid_) {
45 return -1;
46 }
47 return SendResponse(*ObexHeader::CreateResponse(rspCode));
48 }
49
SendResponse(ObexHeader & resp) const50 int ObexServerSession::SendResponse(ObexHeader &resp) const
51 {
52 OBEX_LOG_DEBUG("Call %{public}s", __PRETTY_FUNCTION__);
53 if (invalid_) {
54 return -1;
55 }
56 // Reset connect response's mtu
57 if (resp.GetFieldMaxPacketLength() != nullptr) {
58 resp.SetFieldMaxPacketLength(maxPacketLength_);
59 }
60 if (resp.GetFieldPacketLength() > maxPacketLength_) {
61 OBEX_LOG_ERROR("Error: Response packet length[%{public}d]>mtu[%{public}d].",
62 int(resp.GetFieldPacketLength()), int(maxPacketLength_));
63 return -1;
64 }
65 bool ret = transport_.Write(resp.Build()->GetPacket());
66 if (ret) {
67 return 0;
68 }
69 OBEX_LOG_ERROR("SendResponse error: Write ret = %{public}d", ret);
70 return -1;
71 }
72
SendGetResponse(const ObexHeader & req,ObexHeader & resp,std::shared_ptr<ObexBodyObject> reader)73 int ObexServerSession::SendGetResponse(const ObexHeader &req, ObexHeader &resp, std::shared_ptr<ObexBodyObject> reader)
74 {
75 OBEX_LOG_DEBUG("Call %{public}s", __PRETTY_FUNCTION__);
76 if (invalid_) {
77 return -1;
78 }
79 if (resp.HasHeader(ObexHeader::BODY) || resp.HasHeader(ObexHeader::END_OF_BODY)) {
80 OBEX_LOG_ERROR("Error: Can't include body/end-of-body header in this method.");
81 return -1;
82 }
83 if (resp.GetFieldCode() != static_cast<uint8_t>(ObexRspCode::SUCCESS) &&
84 resp.GetFieldCode() != static_cast<uint8_t>(ObexRspCode::CONTINUE)) {
85 return SendResponse(resp);
86 }
87 if (!reader) {
88 if (isSupportSrm_ && req.GetItemSrm()) {
89 resp.AppendItemSrm(true);
90 }
91 return SendResponse(resp);
92 }
93 sendObject_ = std::make_unique<ObexServerSendObject>(req, resp, reader, maxPacketLength_, isSupportSrm_);
94
95 sendObject_->SetStartBodyResp(req.GetFieldCode() == static_cast<uint8_t>(ObexOpeId::GET_FINAL));
96 auto resp2 = sendObject_->GetNextRespHeader();
97 if (resp2 == nullptr) {
98 OBEX_LOG_ERROR("SendGetResponse: resp is null!");
99 sendObject_ = nullptr;
100 return -1;
101 }
102 int ret = SendResponse(*resp2);
103 if (ret != 0) {
104 sendObject_ = nullptr;
105 return ret;
106 }
107 if (resp2->GetFieldCode() != static_cast<uint8_t>(ObexRspCode::CONTINUE)) {
108 OBEX_LOG_DEBUG("Send done with first packet, reset sendObject_ to null");
109 sendObject_ = nullptr;
110 return ret;
111 }
112 dispatcher_.PostTask(std::bind(setBusyFun_, std::ref(*this), true));
113 if (sendObject_->IsSupportSrmMode() && sendObject_->IsSrmEnable() && !sendObject_->IsSrmWait()) {
114 ret = SendSrmResponse();
115 }
116 return ret;
117 }
118
ProcessSendSrmResponse()119 int ObexServerSession::ProcessSendSrmResponse()
120 {
121 OBEX_LOG_DEBUG("Call %{public}s", __PRETTY_FUNCTION__);
122 if (invalid_) {
123 return -1;
124 }
125 if (!sendObject_) {
126 return -1;
127 }
128 sendObject_->SetSrmSending();
129 if (sendObject_->IsBusy()) {
130 OBEX_LOG_DEBUG("ProcessSendSrmResponse: Transport is busy, waiting...");
131 return 0;
132 }
133 auto nextReqHdr = sendObject_->GetNextRespHeader();
134 if (nextReqHdr == nullptr) {
135 OBEX_LOG_ERROR("ProcessSendSrmResponse: nextReqHdr is null!");
136 if (!sendObject_->IsDone()) {
137 sendObject_ = nullptr;
138 }
139 nextReqHdr = ObexHeader::CreateResponse(ObexRspCode::INTERNAL_SERVER_ERROR);
140 }
141 int ret = SendResponse(*nextReqHdr);
142 if (ret != 0) {
143 sendObject_ = nullptr;
144 return ret;
145 }
146 if (nextReqHdr->GetFieldCode() == static_cast<uint8_t>(ObexRspCode::CONTINUE)) {
147 OBEX_LOG_DEBUG("ProcessSendSrmResponse: CONTINUE");
148 dispatcher_.PostTask(std::bind(&ObexServerSession::ProcessSendSrmResponse, this));
149 } else if (nextReqHdr->GetFieldCode() == static_cast<uint8_t>(ObexRspCode::SUCCESS)) {
150 sendObject_ = nullptr;
151 OBEX_LOG_DEBUG("ProcessSendSrmResponse: Server send with SRM MODE END");
152 setBusyFun_(*this, false);
153 } else {
154 sendObject_ = nullptr;
155 OBEX_LOG_ERROR("ProcessSendSrmResponse: SRM MODE END WITH RESPCODE 0x%02X", nextReqHdr->GetFieldCode());
156 setBusyFun_(*this, false);
157 }
158 return ret;
159 }
160
SendSrmResponse()161 int ObexServerSession::SendSrmResponse()
162 {
163 OBEX_LOG_DEBUG("Call %{public}s", __PRETTY_FUNCTION__);
164 if (invalid_) {
165 return -1;
166 }
167 if (!isSupportSrm_) {
168 return -1;
169 }
170 if (!sendObject_) {
171 return -1;
172 }
173 if (!sendObject_->IsSrmEnable() || sendObject_->IsSrmWait()) {
174 return -1;
175 }
176 OBEX_LOG_DEBUG("SendSrmResponse: Server Start send with SRM MODE START");
177 return ProcessSendSrmResponse();
178 }
179
Invalid()180 void ObexServerSession::Invalid()
181 {
182 invalid_ = true;
183 receivedObject_ = nullptr;
184 sendObject_ = nullptr;
185 }
186
ObexSetPathObject(const std::vector<std::u16string> & paths)187 ObexSetPathObject::ObexSetPathObject(const std::vector<std::u16string> &paths)
188 : paths_(paths), pos_(0)
189 {}
190
GetNextPath()191 std::u16string ObexSetPathObject::GetNextPath()
192 {
193 if (pos_ >= paths_.size()) {
194 return nullptr;
195 }
196 return paths_.at(pos_++);
197 }
198
IsDone() const199 bool ObexSetPathObject::IsDone() const
200 {
201 return pos_ >= paths_.size();
202 }
203
204 // ObexClientSendObject
ObexClientSendObject(const ObexHeader & firstReq,std::shared_ptr<ObexBodyObject> bodyReader,uint16_t mtu)205 ObexClientSendObject::ObexClientSendObject(
206 const ObexHeader &firstReq, std::shared_ptr<ObexBodyObject> bodyReader, uint16_t mtu)
207 : reqIndex_(0), srmEnable_(false), isDone_(false), mtu_(mtu),
208 firstReq_(std::make_unique<ObexHeader>(firstReq)),
209 bodyReader_(bodyReader)
210 {}
211
SetBodyToHeader(ObexHeader & header,const uint16_t & remainLength)212 bool ObexClientSendObject::SetBodyToHeader(ObexHeader &header, const uint16_t &remainLength)
213 {
214 auto buf = std::make_unique<uint8_t[]>(remainLength);
215 int cnt = bodyReader_->Read(buf.get(), remainLength);
216 if (cnt < 0) {
217 return false;
218 }
219 if (cnt < remainLength) {
220 isDone_ = true;
221 }
222 if (isDone_) {
223 OBEX_LOG_DEBUG("GetNextReqHeader Add End-Body count %{public}d", cnt);
224 header.SetFinalBit(true);
225 header.AppendItemEndBody(buf.get(), cnt);
226 } else {
227 OBEX_LOG_DEBUG("GetNextReqHeader Add Body count %{public}d", cnt);
228 header.SetFinalBit(false);
229 header.AppendItemBody(buf.get(), cnt);
230 }
231 return true;
232 }
233
GetNextReqHeader(bool useSrm)234 std::unique_ptr<ObexHeader> ObexClientSendObject::GetNextReqHeader(bool useSrm)
235 {
236 OBEX_LOG_DEBUG("Call %{public}s", __PRETTY_FUNCTION__);
237 if (isDone_) {
238 return nullptr;
239 }
240 std::unique_ptr<ObexHeader> header = nullptr;
241 if (reqIndex_ == 0) {
242 header = std::make_unique<ObexHeader>(*firstReq_);
243 } else {
244 header = std::make_unique<ObexHeader>(*firstReq_, true);
245 auto connectId = firstReq_->GetItemConnectionId();
246 if (connectId != nullptr) {
247 header->AppendItemConnectionId(connectId->GetWord());
248 }
249 }
250 if (useSrm) {
251 if (!header->HasHeader(ObexHeader::SRM)) {
252 header->AppendItemSrm(useSrm);
253 }
254 }
255 uint16_t pktLen = header->GetFieldPacketLength();
256 if (reqIndex_ == 0 && pktLen == mtu_ - ObexHeader::MIN_PACKET_LENGTH) {
257 reqIndex_++;
258 return header;
259 }
260 if (pktLen > mtu_) {
261 OBEX_LOG_ERROR("ObexClientSendObject:pktLen[%{public}d] can't large then mtu_[%{public}d]", pktLen, mtu_);
262 return nullptr;
263 }
264
265 if ((reqIndex_ != 0) && (pktLen >= mtu_ - ObexHeader::MIN_PACKET_LENGTH)) {
266 OBEX_LOG_ERROR("ObexClientSendObject:can't send next packet, reqIndex_[%{public}d]!=0 && pktLen[%{public}d]>=mtu_[%{public}d] - 3",
267 reqIndex_,
268 int(pktLen),
269 int(mtu_));
270 return nullptr;
271 }
272 uint16_t remainLength = mtu_ - pktLen - ObexHeader::HDR_BYTES_PREFIX_LENGTH; // 3: body header+len
273 if (!SetBodyToHeader(*header, remainLength)) {
274 return nullptr;
275 }
276 reqIndex_++;
277 return header;
278 }
279
IsDone() const280 bool ObexClientSendObject::IsDone() const
281 {
282 return isDone_;
283 }
284
SetSrmEnable(bool srmEnable)285 void ObexClientSendObject::SetSrmEnable(bool srmEnable)
286 {
287 srmEnable_ = srmEnable;
288 }
289
IsSrmEnable() const290 bool ObexClientSendObject::IsSrmEnable() const
291 {
292 return srmEnable_;
293 }
294
SetSrmWait(bool wait)295 void ObexClientSendObject::SetSrmWait(bool wait)
296 {
297 srmWait_ = wait;
298 }
299
IsSrmWait() const300 bool ObexClientSendObject::IsSrmWait() const
301 {
302 return srmWait_;
303 }
304
SetSrmSending()305 void ObexClientSendObject::SetSrmSending()
306 {
307 isSrmSending_ = true;
308 }
309
IsSrmSending() const310 bool ObexClientSendObject::IsSrmSending() const
311 {
312 return isDone_ ? false : isSrmSending_;
313 }
314
SetBusy(bool isBusy)315 void ObexClientSendObject::SetBusy(bool isBusy)
316 {
317 isBusy_ = isBusy;
318 }
319
IsBusy() const320 bool ObexClientSendObject::IsBusy() const
321 {
322 return isBusy_;
323 }
324
325 // ObexClientReceivedObject
ObexClientReceivedObject(const ObexHeader & firstReq,std::shared_ptr<ObexBodyObject> writer,bool supportSrm,int srmpCount)326 ObexClientReceivedObject::ObexClientReceivedObject(
327 const ObexHeader &firstReq, std::shared_ptr<ObexBodyObject> writer, bool supportSrm, int srmpCount)
328 : firstReq_(std::make_unique<ObexHeader>(firstReq)), bodyWriter_(writer)
329 {
330 supportSrmMode_ = supportSrm;
331 srmpCount_ = srmpCount;
332 srmEnable_ = false;
333 isDone_ = false;
334 if (supportSrmMode_) {
335 if (!firstReq_->HasHeader(ObexHeader::SRM)) {
336 firstReq_->AppendItemSrm(supportSrmMode_);
337 }
338 if (srmpCount_ < 1) {
339 firstReq_->RemoveItem(ObexHeader::SRMP);
340 } else {
341 firstReq_->AppendItemSrmp();
342 srmpCount_--;
343 srmpSended_ = true;
344 }
345 } else {
346 firstReq_->RemoveItem(ObexHeader::SRM);
347 firstReq_->RemoveItem(ObexHeader::SRMP);
348 }
349 }
350
GetFirstReqHeader() const351 ObexHeader &ObexClientReceivedObject::GetFirstReqHeader() const
352 {
353 OBEX_LOG_DEBUG("Call %{public}s", __PRETTY_FUNCTION__);
354 return *firstReq_;
355 }
356
GetFirstRespHeader() const357 const ObexHeader *ObexClientReceivedObject::GetFirstRespHeader() const
358 {
359 if (firstResp_) {
360 return firstResp_.get();
361 }
362 return nullptr;
363 }
364
CacheResp(const ObexHeader & resp)365 void ObexClientReceivedObject::CacheResp(const ObexHeader &resp)
366 {
367 if (!firstResp_) {
368 firstResp_ = std::make_unique<ObexHeader>(resp);
369 firstResp_->RemoveItem(ObexHeader::SRM);
370 firstResp_->RemoveItem(ObexHeader::SRMP);
371 firstResp_->RemoveItem(ObexHeader::BODY);
372 firstResp_->SetExtendBodyObject(nullptr);
373 }
374 }
375
GetContinueReqHeader()376 std::unique_ptr<ObexHeader> ObexClientReceivedObject::GetContinueReqHeader()
377 {
378 OBEX_LOG_DEBUG("Call %{public}s", __PRETTY_FUNCTION__);
379 auto header = std::make_unique<ObexHeader>(*firstReq_, true);
380 auto connectId = firstReq_->GetItemConnectionId();
381 if (connectId != nullptr) {
382 header->AppendItemConnectionId(connectId->GetWord());
383 }
384 if (srmpCount_ > 0) {
385 header->AppendItemSrmp();
386 srmpCount_--;
387 srmpSended_ = true;
388 } else {
389 srmpSended_ = false;
390 }
391 header->SetFinalBit(true);
392 return header;
393 }
394
GetBodyWriter()395 std::shared_ptr<ObexBodyObject> &ObexClientReceivedObject::GetBodyWriter()
396 {
397 return bodyWriter_;
398 }
399
AppendBody(const uint8_t * body,const uint16_t bodyLen)400 void ObexClientReceivedObject::AppendBody(const uint8_t *body, const uint16_t bodyLen)
401 {
402 bodyWriter_->Write(body, bodyLen);
403 receivedSize_ += bodyLen;
404 OBEX_LOG_DEBUG("ObexClientReceivedObject:ReceivedSize + %{public}d = %zu", bodyLen, receivedSize_);
405 }
406
IsDone() const407 bool ObexClientReceivedObject::IsDone() const
408 {
409 return isDone_;
410 }
411
SetDone(bool done)412 void ObexClientReceivedObject::SetDone(bool done)
413 {
414 isDone_ = done;
415 }
416
SetSrmEnable(bool srmEnable)417 void ObexClientReceivedObject::SetSrmEnable(bool srmEnable)
418 {
419 srmEnable_ = srmEnable;
420 }
421
IsSrmEnable() const422 bool ObexClientReceivedObject::IsSrmEnable() const
423 {
424 return srmEnable_;
425 }
426
SetSrmWait(bool wait)427 void ObexClientReceivedObject::SetSrmWait(bool wait)
428 {
429 srmWait_ = wait;
430 }
431
IsSrmWait() const432 bool ObexClientReceivedObject::IsSrmWait() const
433 {
434 return srmWait_;
435 }
436
IsSupportSrmMode() const437 bool ObexClientReceivedObject::IsSupportSrmMode() const
438 {
439 return supportSrmMode_;
440 }
441
IsSendNextReq() const442 bool ObexClientReceivedObject::IsSendNextReq() const
443 {
444 if (IsSrmEnable() && !IsSrmWait() && !srmpSended_) {
445 return false;
446 }
447 return true;
448 }
449
450 // ObexServerReceivedObject
ObexServerReceivedObject(const ObexHeader & firstReq,std::shared_ptr<ObexBodyObject> writer)451 ObexServerReceivedObject::ObexServerReceivedObject(const ObexHeader &firstReq, std::shared_ptr<ObexBodyObject> writer)
452 : baseReq_(std::make_unique<ObexHeader>(firstReq))
453 {
454 baseReq_->RemoveItem(ObexHeader::SRM);
455 baseReq_->RemoveItem(ObexHeader::SRMP);
456 baseReq_->RemoveItem(ObexHeader::BODY);
457 baseReq_->SetExtendBodyObject(nullptr);
458 baseReq_->SetFinalBit(true);
459 writer_ = writer;
460 }
461
AppendBody(const uint8_t * body,const uint16_t bodyLen)462 void ObexServerReceivedObject::AppendBody(const uint8_t *body, const uint16_t bodyLen)
463 {
464 writer_->Write(body, bodyLen);
465 receivedSize_ += bodyLen;
466 OBEX_LOG_DEBUG("ObexServerReceivedObject:ReceivedSize + %{public}d = %zu", bodyLen, receivedSize_);
467 }
468
GetWriter()469 std::shared_ptr<ObexBodyObject> &ObexServerReceivedObject::GetWriter()
470 {
471 return writer_;
472 }
473
CreateReceivedHeader()474 std::unique_ptr<ObexHeader> ObexServerReceivedObject::CreateReceivedHeader()
475 {
476 auto header = std::make_unique<ObexHeader>(*baseReq_);
477 header->SetExtendBodyObject(writer_);
478 return header;
479 }
480
SetSrmEnable(bool srmEnable)481 void ObexServerReceivedObject::SetSrmEnable(bool srmEnable)
482 {
483 srmEnable_ = srmEnable;
484 }
485
IsSrmEnable() const486 bool ObexServerReceivedObject::IsSrmEnable() const
487 {
488 return srmEnable_;
489 }
490
SetSrmWait(bool wait)491 void ObexServerReceivedObject::SetSrmWait(bool wait)
492 {
493 srmWait_ = wait;
494 }
495
IsSrmWait() const496 bool ObexServerReceivedObject::IsSrmWait() const
497 {
498 return srmWait_;
499 }
500
SetSrmReceiving()501 void ObexServerReceivedObject::SetSrmReceiving()
502 {
503 isSrmReceiving_ = true;
504 }
505
IsSrmReceiving() const506 bool ObexServerReceivedObject::IsSrmReceiving() const
507 {
508 return isSrmReceiving_;
509 }
510
ObexServerSendObject(const ObexHeader & firstReq,const ObexHeader & firstResp,std::shared_ptr<ObexBodyObject> bodyReader,uint16_t mtu,bool supportSrm)511 ObexServerSendObject::ObexServerSendObject(const ObexHeader &firstReq, const ObexHeader &firstResp,
512 std::shared_ptr<ObexBodyObject> bodyReader, uint16_t mtu, bool supportSrm)
513 : firstReq_(std::make_unique<ObexHeader>(firstReq)), firstResp_(std::make_unique<ObexHeader>(firstResp))
514 {
515 firstResp_->RemoveItem(ObexHeader::SRM);
516 firstResp_->RemoveItem(ObexHeader::SRMP);
517 bodyReader_ = bodyReader;
518 mtu_ = mtu;
519 reqIndex_ = 0;
520 srmEnable_ = false;
521 isDone_ = false;
522 supportSrmMode_ = supportSrm;
523 }
524
SetSrmParam(ObexHeader & header)525 void ObexServerSendObject::SetSrmParam(ObexHeader &header)
526 {
527 if (supportSrmMode_) {
528 if (reqIndex_ == 0 && firstReq_->HasHeader(ObexHeader::SRM)) {
529 OBEX_LOG_DEBUG("ObexServerSendObject send response with SRM set to true");
530 SetSrmEnable(firstReq_->GetItemSrm());
531 if (IsSrmEnable()) {
532 header.AppendItemSrm(true);
533 }
534 }
535 if (reqIndex_ == 0 && firstReq_->HasHeader(ObexHeader::SRMP)) {
536 OBEX_LOG_DEBUG("ObexServerSendObject srmp_wait Set to true");
537 SetSrmWait(firstReq_->GetItemSrmp());
538 }
539 }
540 }
541
SetBodyToHeader(ObexHeader & header,const uint16_t & remainLength)542 bool ObexServerSendObject::SetBodyToHeader(ObexHeader &header, const uint16_t &remainLength)
543 {
544 auto buf = std::make_unique<uint8_t[]>(remainLength);
545 int cnt = bodyReader_->Read(buf.get(), remainLength);
546 if (cnt < 0) {
547 return false;
548 }
549 if (cnt < remainLength) {
550 isDone_ = true;
551 }
552 if (isDone_) {
553 OBEX_LOG_DEBUG("GetNextRespHeader Add End-Body count %{public}d", cnt);
554 header.SetRespCode(static_cast<uint8_t>(ObexRspCode::SUCCESS));
555 header.AppendItemEndBody(buf.get(), cnt);
556 } else {
557 OBEX_LOG_DEBUG("GetNextRespHeader Add Body count %{public}d", cnt);
558 header.SetRespCode(static_cast<uint8_t>(ObexRspCode::CONTINUE));
559 header.AppendItemBody(buf.get(), cnt);
560 }
561 return true;
562 }
563
GetNextRespHeader()564 std::unique_ptr<ObexHeader> ObexServerSendObject::GetNextRespHeader()
565 {
566 if (isDone_) {
567 return nullptr;
568 }
569 std::unique_ptr<ObexHeader> header = nullptr;
570 if (reqIndex_ == 0) {
571 header = std::make_unique<ObexHeader>(*firstResp_);
572 } else {
573 header = std::make_unique<ObexHeader>(*firstResp_, true);
574 }
575 // Set SRM
576 SetSrmParam(*header);
577
578 uint16_t pktLen = header->GetFieldPacketLength();
579 if (reqIndex_ == 0 && pktLen == mtu_ - ObexHeader::MIN_PACKET_LENGTH) {
580 reqIndex_++;
581 return header;
582 }
583 if (pktLen > mtu_) {
584 OBEX_LOG_ERROR("ObexServerSendObject:pktLen[%{public}d] can't large then mtu[%{public}d]", pktLen, mtu_);
585 return nullptr;
586 }
587
588 if (reqIndex_ != 0 && pktLen >= mtu_ - ObexHeader::MIN_PACKET_LENGTH) {
589 OBEX_LOG_ERROR("ObexServerSendObject:can't send next packet, reqIndex[%{public}d] != 0 && pktLen[%{public}d] >= mtu[%{public}d] - 3",
590 reqIndex_,
591 pktLen,
592 mtu_);
593 return nullptr;
594 }
595 if (!startBodyResp_) {
596 header->SetRespCode(static_cast<uint8_t>(ObexRspCode::CONTINUE));
597 } else {
598 uint16_t remainLength = mtu_ - pktLen - ObexHeader::HDR_BYTES_PREFIX_LENGTH; // 3: body header+len
599 if (!SetBodyToHeader(*header, remainLength)) {
600 return nullptr;
601 }
602 }
603 reqIndex_++;
604 return header;
605 }
606
IsDone() const607 bool ObexServerSendObject::IsDone() const
608 {
609 return isDone_;
610 }
611
SetSrmEnable(bool srmEnable)612 void ObexServerSendObject::SetSrmEnable(bool srmEnable)
613 {
614 srmEnable_ = srmEnable;
615 }
616
IsSrmEnable() const617 bool ObexServerSendObject::IsSrmEnable() const
618 {
619 return srmEnable_;
620 }
621
SetSrmWait(bool wait)622 void ObexServerSendObject::SetSrmWait(bool wait)
623 {
624 srmWait_ = wait;
625 }
626
IsSrmWait() const627 bool ObexServerSendObject::IsSrmWait() const
628 {
629 return srmWait_;
630 }
631
SetStartBodyResp(bool start)632 void ObexServerSendObject::SetStartBodyResp(bool start)
633 {
634 startBodyResp_ = start;
635 }
636
SetSrmSending()637 void ObexServerSendObject::SetSrmSending()
638 {
639 isSrmSending_ = true;
640 }
641
IsSrmSending() const642 bool ObexServerSendObject::IsSrmSending() const
643 {
644 return isDone_ ? false : isSrmSending_;
645 }
646
SetBusy(bool isBusy)647 void ObexServerSendObject::SetBusy(bool isBusy)
648 {
649 isBusy_ = isBusy;
650 }
651
IsBusy() const652 bool ObexServerSendObject::IsBusy() const
653 {
654 return isBusy_;
655 }
656
IsSupportSrmMode() const657 bool ObexServerSendObject::IsSupportSrmMode() const
658 {
659 return supportSrmMode_;
660 }
661
ObexSession(const RawAddress & remoteAddr)662 ObexSession::ObexSession(const RawAddress &remoteAddr) : remoteAddr_(remoteAddr)
663 {}
664
ObexClientSession(const RawAddress & remoteAddr)665 ObexClientSession::ObexClientSession(const RawAddress &remoteAddr) : ObexSession(remoteAddr)
666 {}
667 } // namespace bluetooth
668 } // namespace OHOS