xref: /haiku/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp (revision 1acb1f504ddcefa7134a12c6c3873d88bc58a274)
1617b62c9SDario Casalinuovo /*
2617b62c9SDario Casalinuovo  * Copyright 2016, Dario Casalinuovo
3617b62c9SDario Casalinuovo  * Distributed under the terms of the MIT License.
4617b62c9SDario Casalinuovo  */
5617b62c9SDario Casalinuovo 
6617b62c9SDario Casalinuovo 
7617b62c9SDario Casalinuovo #include "HTTPMediaIO.h"
8617b62c9SDario Casalinuovo 
9fbabc74dSDario Casalinuovo #include <Handler.h>
10fbabc74dSDario Casalinuovo #include <UrlProtocolRoster.h>
11fbabc74dSDario Casalinuovo 
12fbabc74dSDario Casalinuovo #include <stdio.h>
13fbabc74dSDario Casalinuovo 
14fbabc74dSDario Casalinuovo 
15*1acb1f50SDario Casalinuovo class FileListener : public BUrlProtocolAsynchronousListener {
16fbabc74dSDario Casalinuovo public:
17fbabc74dSDario Casalinuovo 		FileListener(BAdapterIO* owner)
18fbabc74dSDario Casalinuovo 			:
19fbabc74dSDario Casalinuovo 			BUrlProtocolAsynchronousListener(true),
20fbabc74dSDario Casalinuovo 			fRequest(NULL),
21f1c771f8SDario Casalinuovo 			fAdapterIO(owner),
22f1c771f8SDario Casalinuovo 			fTotalSize(0)
23fbabc74dSDario Casalinuovo 		{
24fbabc74dSDario Casalinuovo 			fInputAdapter = fAdapterIO->BuildInputAdapter();
25fbabc74dSDario Casalinuovo 		}
26fbabc74dSDario Casalinuovo 
27fbabc74dSDario Casalinuovo 		virtual ~FileListener() {};
28fbabc74dSDario Casalinuovo 
29fbabc74dSDario Casalinuovo 		bool ConnectionSuccessful() const
30fbabc74dSDario Casalinuovo 		{
31fbabc74dSDario Casalinuovo 			return fRequest != NULL;
32fbabc74dSDario Casalinuovo 		}
33fbabc74dSDario Casalinuovo 
34fbabc74dSDario Casalinuovo 		void ConnectionOpened(BUrlRequest* request)
35fbabc74dSDario Casalinuovo 		{
36fbabc74dSDario Casalinuovo 			if (fRequest != NULL)
37fbabc74dSDario Casalinuovo 				fRequest->Stop();
38fbabc74dSDario Casalinuovo 
39fbabc74dSDario Casalinuovo 			fRequest = request;
40f1c771f8SDario Casalinuovo 			fTotalSize = request->Result().Length();
41fbabc74dSDario Casalinuovo 		}
42fbabc74dSDario Casalinuovo 
43fbabc74dSDario Casalinuovo 		void DataReceived(BUrlRequest* request, const char* data,
44fbabc74dSDario Casalinuovo 			off_t position, ssize_t size)
45fbabc74dSDario Casalinuovo 		{
46fbabc74dSDario Casalinuovo 			if (request != fRequest)
47fbabc74dSDario Casalinuovo 				delete request;
48fbabc74dSDario Casalinuovo 
49fbabc74dSDario Casalinuovo 			fInputAdapter->Write(data, size);
50fbabc74dSDario Casalinuovo 		}
51fbabc74dSDario Casalinuovo 
52fbabc74dSDario Casalinuovo 		void RequestCompleted(BUrlRequest* request, bool success)
53fbabc74dSDario Casalinuovo 		{
54fbabc74dSDario Casalinuovo 			if (request != fRequest)
55fbabc74dSDario Casalinuovo 				return;
56fbabc74dSDario Casalinuovo 
57fbabc74dSDario Casalinuovo 			fRequest = NULL;
58fbabc74dSDario Casalinuovo 			delete request;
59fbabc74dSDario Casalinuovo 		}
60fbabc74dSDario Casalinuovo 
61f1c771f8SDario Casalinuovo 		off_t TotalSize() const
62f1c771f8SDario Casalinuovo 		{
63f1c771f8SDario Casalinuovo 			return fTotalSize;
64f1c771f8SDario Casalinuovo 		}
65f1c771f8SDario Casalinuovo 
66fbabc74dSDario Casalinuovo private:
67fbabc74dSDario Casalinuovo 		BUrlRequest*	fRequest;
68fbabc74dSDario Casalinuovo 		BAdapterIO*		fAdapterIO;
69fbabc74dSDario Casalinuovo 		BInputAdapter*	fInputAdapter;
70f1c771f8SDario Casalinuovo 		off_t			fTotalSize;
71fbabc74dSDario Casalinuovo };
72fbabc74dSDario Casalinuovo 
73617b62c9SDario Casalinuovo 
740ba82236SDario Casalinuovo HTTPMediaIO::HTTPMediaIO(BUrl url)
75617b62c9SDario Casalinuovo 	:
7693a1f9d2SDario Casalinuovo 	BAdapterIO(B_MEDIA_STREAMING | B_MEDIA_SEEK_BACKWARD, B_INFINITE_TIMEOUT),
7793a1f9d2SDario Casalinuovo 	fContext(NULL),
7893a1f9d2SDario Casalinuovo 	fReq(NULL),
7993a1f9d2SDario Casalinuovo 	fListener(NULL),
8093a1f9d2SDario Casalinuovo 	fUrl(url)
81617b62c9SDario Casalinuovo {
82617b62c9SDario Casalinuovo }
83617b62c9SDario Casalinuovo 
84617b62c9SDario Casalinuovo 
85617b62c9SDario Casalinuovo HTTPMediaIO::~HTTPMediaIO()
86617b62c9SDario Casalinuovo {
87617b62c9SDario Casalinuovo }
88617b62c9SDario Casalinuovo 
89617b62c9SDario Casalinuovo 
90617b62c9SDario Casalinuovo ssize_t
91617b62c9SDario Casalinuovo HTTPMediaIO::WriteAt(off_t position, const void* buffer, size_t size)
92617b62c9SDario Casalinuovo {
93617b62c9SDario Casalinuovo 	return B_NOT_SUPPORTED;
94617b62c9SDario Casalinuovo }
95f1c771f8SDario Casalinuovo 
96f1c771f8SDario Casalinuovo 
97f1c771f8SDario Casalinuovo status_t
98f1c771f8SDario Casalinuovo HTTPMediaIO::SetSize(off_t size)
99f1c771f8SDario Casalinuovo {
100f1c771f8SDario Casalinuovo 	return B_NOT_SUPPORTED;
101f1c771f8SDario Casalinuovo }
102f1c771f8SDario Casalinuovo 
103f1c771f8SDario Casalinuovo 
104f1c771f8SDario Casalinuovo status_t
105f1c771f8SDario Casalinuovo HTTPMediaIO::GetSize(off_t* size) const
106f1c771f8SDario Casalinuovo {
107f1c771f8SDario Casalinuovo 	*size = fListener->TotalSize();
108f1c771f8SDario Casalinuovo 	return B_OK;
109f1c771f8SDario Casalinuovo }
11093a1f9d2SDario Casalinuovo 
11193a1f9d2SDario Casalinuovo 
11293a1f9d2SDario Casalinuovo status_t
11393a1f9d2SDario Casalinuovo HTTPMediaIO::Open()
11493a1f9d2SDario Casalinuovo {
11593a1f9d2SDario Casalinuovo 	fContext = new BUrlContext();
11693a1f9d2SDario Casalinuovo 	fContext->AcquireReference();
11793a1f9d2SDario Casalinuovo 
11893a1f9d2SDario Casalinuovo 	fListener = new FileListener(this);
11993a1f9d2SDario Casalinuovo 
12093a1f9d2SDario Casalinuovo 	fReq = BUrlProtocolRoster::MakeRequest(fUrl,
12193a1f9d2SDario Casalinuovo 		fListener, fContext);
12293a1f9d2SDario Casalinuovo 
12393a1f9d2SDario Casalinuovo 	if (fReq == NULL)
12493a1f9d2SDario Casalinuovo 		return B_ERROR;
12593a1f9d2SDario Casalinuovo 
12693a1f9d2SDario Casalinuovo 	if (fReq->Run() < 0)
12793a1f9d2SDario Casalinuovo 		return B_ERROR;
12893a1f9d2SDario Casalinuovo 
12993a1f9d2SDario Casalinuovo 	return BAdapterIO::Open();
13093a1f9d2SDario Casalinuovo }
13193a1f9d2SDario Casalinuovo 
13293a1f9d2SDario Casalinuovo 
13393a1f9d2SDario Casalinuovo void
13493a1f9d2SDario Casalinuovo HTTPMediaIO::Close()
13593a1f9d2SDario Casalinuovo {
13693a1f9d2SDario Casalinuovo 	delete fReq;
13793a1f9d2SDario Casalinuovo 	delete fListener;
13893a1f9d2SDario Casalinuovo 
13993a1f9d2SDario Casalinuovo 	fContext->ReleaseReference();
14093a1f9d2SDario Casalinuovo 	delete fContext;
14193a1f9d2SDario Casalinuovo 
14293a1f9d2SDario Casalinuovo 	BAdapterIO::Close();
14393a1f9d2SDario Casalinuovo }
14493a1f9d2SDario Casalinuovo 
14593a1f9d2SDario Casalinuovo 
14693a1f9d2SDario Casalinuovo status_t
14793a1f9d2SDario Casalinuovo HTTPMediaIO::SeekRequested(off_t position)
14893a1f9d2SDario Casalinuovo {
14993a1f9d2SDario Casalinuovo 	return BAdapterIO::SeekRequested(position);
15093a1f9d2SDario Casalinuovo }
151