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