http_streamer: Refine init, set static timeout

* When in Open() the plugin wait for the first buffer
or return an error if timeout expires.
* Make size retrieve more reliable.
This commit is contained in:
Dario Casalinuovo
2016-07-02 21:19:27 +02:00
parent 3ad928de3f
commit d3630cbaec
2 changed files with 28 additions and 9 deletions
@@ -9,7 +9,9 @@
#include <Handler.h> #include <Handler.h>
#include <UrlProtocolRoster.h> #include <UrlProtocolRoster.h>
#include <stdio.h>
// 10 seconds timeout
#define HTTP_TIMEOUT 10000000
class FileListener : public BUrlProtocolAsynchronousListener { class FileListener : public BUrlProtocolAsynchronousListener {
@@ -19,9 +21,10 @@ public:
BUrlProtocolAsynchronousListener(true), BUrlProtocolAsynchronousListener(true),
fRequest(NULL), fRequest(NULL),
fAdapterIO(owner), fAdapterIO(owner),
fTotalSize(0) fInitSem(-1)
{ {
fInputAdapter = fAdapterIO->BuildInputAdapter(); fInputAdapter = fAdapterIO->BuildInputAdapter();
fInitSem = create_sem(0, "http_streamer init sem");
} }
virtual ~FileListener() {}; virtual ~FileListener() {};
@@ -37,12 +40,17 @@ public:
fRequest->Stop(); fRequest->Stop();
fRequest = request; fRequest = request;
fTotalSize = request->Result().Length();
} }
void DataReceived(BUrlRequest* request, const char* data, void DataReceived(BUrlRequest* request, const char* data,
off_t position, ssize_t size) off_t position, ssize_t size)
{ {
if (fInitSem != -1) {
release_sem(fInitSem);
delete_sem(fInitSem);
fInitSem = -1;
}
if (request != fRequest) if (request != fRequest)
delete request; delete request;
@@ -58,26 +66,27 @@ public:
delete request; delete request;
} }
off_t TotalSize() const status_t LockOnInit(bigtime_t timeout)
{ {
return fTotalSize; return acquire_sem_etc(fInitSem, 1, B_RELATIVE_TIMEOUT, timeout);
} }
private: private:
BUrlRequest* fRequest; BUrlRequest* fRequest;
BAdapterIO* fAdapterIO; BAdapterIO* fAdapterIO;
BInputAdapter* fInputAdapter; BInputAdapter* fInputAdapter;
off_t fTotalSize; sem_id fInitSem;
}; };
HTTPMediaIO::HTTPMediaIO(BUrl url) HTTPMediaIO::HTTPMediaIO(BUrl url)
: :
BAdapterIO(B_MEDIA_STREAMING | B_MEDIA_SEEK_BACKWARD, B_INFINITE_TIMEOUT), BAdapterIO(B_MEDIA_STREAMING | B_MEDIA_SEEK_BACKWARD, HTTP_TIMEOUT),
fContext(NULL), fContext(NULL),
fReq(NULL), fReq(NULL),
fListener(NULL), fListener(NULL),
fUrl(url) fUrl(url),
fTotalSize(0)
{ {
} }
@@ -104,7 +113,10 @@ HTTPMediaIO::SetSize(off_t size)
status_t status_t
HTTPMediaIO::GetSize(off_t* size) const HTTPMediaIO::GetSize(off_t* size) const
{ {
*size = fListener->TotalSize(); if (fReq == NULL)
return B_ERROR;
*size = fTotalSize;
return B_OK; return B_OK;
} }
@@ -126,6 +138,12 @@ HTTPMediaIO::Open()
if (fReq->Run() < 0) if (fReq->Run() < 0)
return B_ERROR; return B_ERROR;
status_t ret = fListener->LockOnInit(HTTP_TIMEOUT);
if (ret != B_OK)
return ret;
fTotalSize = fReq->Result().Length();
return BAdapterIO::Open(); return BAdapterIO::Open();
} }
@@ -38,6 +38,7 @@ private:
FileListener* fListener; FileListener* fListener;
BUrl fUrl; BUrl fUrl;
off_t fTotalSize;
}; };
#endif #endif