xref: /haiku/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp (revision f1c771f8d17053fff0aa2d64e52b58cd8c1f6fd6)
1 /*
2  * Copyright 2016, Dario Casalinuovo
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "HTTPMediaIO.h"
8 
9 #include <Handler.h>
10 #include <UrlProtocolRoster.h>
11 
12 #include <stdio.h>
13 
14 
15 class FileListener : public BUrlProtocolAsynchronousListener
16 {
17 public:
18 					FileListener(BAdapterIO* owner)
19 						:
20 						BUrlProtocolAsynchronousListener(true),
21 						fRequest(NULL),
22 						fAdapterIO(owner),
23 						fTotalSize(0)
24 		{
25 			fInputAdapter = fAdapterIO->BuildInputAdapter();
26 		}
27 
28 		virtual		~FileListener() {};
29 
30 		bool		ConnectionSuccessful() const
31 		{
32 			printf("ConnectionSuccessful\n");
33 			return fRequest != NULL;
34 		}
35 
36 		void		ConnectionOpened(BUrlRequest* request)
37 		{
38 			printf("Connection opened\n");
39 			if (fRequest != NULL)
40 				fRequest->Stop();
41 
42 			fRequest = request;
43 			fTotalSize = request->Result().Length();
44 		}
45 
46 		void		DataReceived(BUrlRequest* request, const char* data,
47 						off_t position, ssize_t size)
48 		{
49 			printf("Data received\n");
50 			if (request != fRequest)
51 				delete request;
52 
53 			fInputAdapter->Write(data, size);
54 		}
55 
56 		void		RequestCompleted(BUrlRequest* request, bool success)
57 		{
58 			printf("Request completed\n");
59 			printf("Success: %s\n", success ? "true" : "false");
60 			if (request != fRequest)
61 				return;
62 
63 			fRequest = NULL;
64 			delete request;
65 		}
66 
67 		off_t		TotalSize() const
68 		{
69 			return fTotalSize;
70 		}
71 
72 private:
73 		BUrlRequest*	fRequest;
74 		BAdapterIO*		fAdapterIO;
75 		BInputAdapter*	fInputAdapter;
76 		off_t			fTotalSize;
77 };
78 
79 
80 HTTPMediaIO::HTTPMediaIO(BUrl* url)
81 	:
82 	BAdapterIO(
83 		B_MEDIA_STREAMING | B_MEDIA_SEEK_BACKWARD,
84 		B_INFINITE_TIMEOUT),
85 	fInitErr(B_OK)
86 {
87 	fContext = new BUrlContext();
88 	fContext->AcquireReference();
89 
90 	fListener = new FileListener(this);
91 
92 	fReq = BUrlProtocolRoster::MakeRequest(*url,
93 		fListener, fContext);
94 
95 	fReq->Run();
96 }
97 
98 
99 HTTPMediaIO::~HTTPMediaIO()
100 {
101 	delete fReq;
102 	delete fListener;
103 
104 	fContext->ReleaseReference();
105 	delete fContext;
106 }
107 
108 
109 status_t
110 HTTPMediaIO::InitCheck() const
111 {
112 	return fInitErr;
113 }
114 
115 
116 ssize_t
117 HTTPMediaIO::WriteAt(off_t position, const void* buffer, size_t size)
118 {
119 	return B_NOT_SUPPORTED;
120 }
121 
122 
123 status_t
124 HTTPMediaIO::SetSize(off_t size)
125 {
126 	return B_NOT_SUPPORTED;
127 }
128 
129 
130 status_t
131 HTTPMediaIO::GetSize(off_t* size) const
132 {
133 	*size = fListener->TotalSize();
134 	return B_OK;
135 }
136