• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_BASE_MULTIPART_H__
12 #define WEBRTC_BASE_MULTIPART_H__
13 
14 #include <string>
15 #include <vector>
16 
17 #include "webrtc/base/sigslot.h"
18 #include "webrtc/base/stream.h"
19 
20 namespace rtc {
21 
22 ///////////////////////////////////////////////////////////////////////////////
23 // MultipartStream - Implements an RFC2046 multipart stream by concatenating
24 // the supplied parts together, and adding the correct boundaries.
25 ///////////////////////////////////////////////////////////////////////////////
26 
27 class MultipartStream : public StreamInterface, public sigslot::has_slots<> {
28  public:
29   MultipartStream(const std::string& type, const std::string& boundary);
30   ~MultipartStream() override;
31 
32   void GetContentType(std::string* content_type);
33 
34   // Note: If content_disposition and/or content_type are the empty string,
35   // they will be omitted.
36   bool AddPart(StreamInterface* data_stream,
37                const std::string& content_disposition,
38                const std::string& content_type);
39   bool AddPart(const std::string& data,
40                const std::string& content_disposition,
41                const std::string& content_type);
42   void EndParts();
43 
44   // Calculates the size of a part before actually adding the part.
45   size_t GetPartSize(const std::string& data,
46                      const std::string& content_disposition,
47                      const std::string& content_type) const;
48   size_t GetEndPartSize() const;
49 
50   // StreamInterface
51   StreamState GetState() const override;
52   StreamResult Read(void* buffer,
53                     size_t buffer_len,
54                     size_t* read,
55                     int* error) override;
56   StreamResult Write(const void* data,
57                      size_t data_len,
58                      size_t* written,
59                      int* error) override;
60   void Close() override;
61   bool SetPosition(size_t position) override;
62   bool GetPosition(size_t* position) const override;
63   bool GetSize(size_t* size) const override;
64   bool GetAvailable(size_t* size) const override;
65 
66  private:
67   typedef std::vector<StreamInterface*> PartList;
68 
69   // StreamInterface Slots
70   void OnEvent(StreamInterface* stream, int events, int error);
71 
72   std::string type_, boundary_;
73   PartList parts_;
74   bool adding_;
75   size_t current_;  // The index into parts_ of the current read position.
76   size_t position_;  // The current read position in bytes.
77 
78   RTC_DISALLOW_COPY_AND_ASSIGN(MultipartStream);
79 };
80 
81 }  // namespace rtc
82 
83 #endif  // WEBRTC_BASE_MULTIPART_H__
84