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