• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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