Add file: protocol handler.

This commit is contained in:
Adrien Destugues 2013-10-24 17:31:25 +02:00
parent f6782201f0
commit c52c444c27
4 changed files with 95 additions and 1 deletions

View File

@ -0,0 +1,29 @@
/*
* Copyright 2013 Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _B_FILE_REQUEST_H_
#define _B_FILE_REQUEST_H_
#include <deque>
#include <UrlRequest.h>
class BFileRequest : public BUrlRequest {
public:
BFileRequest(const BUrl& url,
BUrlProtocolListener* listener = NULL,
BUrlContext* context = NULL);
virtual ~BFileRequest();
void SetDisableListener(bool disable);
private:
status_t _ProtocolLoop();
};
#endif // _B_FILE_REQUEST_H_

View File

@ -0,0 +1,56 @@
/*
* Copyright 2013 Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Adrien Destugues, pulkomandy@pulkomandy.tk
*/
#include <new>
#include <stdlib.h>
#include <arpa/inet.h>
#include <File.h>
#include <FileRequest.h>
BFileRequest::BFileRequest(const BUrl& url, BUrlProtocolListener* listener,
BUrlContext* context)
:
BUrlRequest(url, listener, context, "BUrlProtocol.File", "file")
{
}
BFileRequest::~BFileRequest()
{
}
status_t
BFileRequest::_ProtocolLoop()
{
// FIXME error handling (file does not exists, etc.)
BFile file(fUrl.Path().String(), B_READ_ONLY);
if(file.InitCheck() != B_OK)
return B_PROT_CONNECTION_FAILED;
// Send all notifications to listener, if any
if (fListener != NULL) {
fListener->ConnectionOpened(this);
off_t size = 0;
file.GetSize(&size);
fListener->DownloadProgress(this, size, size);
size_t chunkSize;
char chunk[4096];
while((chunkSize = file.Read(chunk, sizeof(chunk))) > 0)
fListener->DataReceived(this, chunk, chunkSize);
}
return B_PROT_SUCCESS;
}

View File

@ -58,8 +58,12 @@ for architectureObject in [ MultiArchSubDirSetup ] {
HttpHeaders.cpp
HttpForm.cpp
HttpRequest.cpp
HttpResult.cpp
HttpTime.cpp
# TODO: another add-on for file:// (a much simpler one)
FileRequest.cpp
$(md5Sources)
Url.cpp
@ -69,7 +73,6 @@ for architectureObject in [ MultiArchSubDirSetup ] {
UrlProtocolListener.cpp
UrlProtocolRoster.cpp
UrlRequest.cpp
UrlResult.cpp
UrlSynchronousRequest.cpp
:

View File

@ -12,6 +12,7 @@
#include <new>
#include <UrlRequest.h>
#include <FileRequest.h>
#include <HttpRequest.h>
#include <Debug.h>
@ -27,7 +28,12 @@ BUrlProtocolRoster::MakeRequest(const BUrl& url,
} else if (url.Protocol() == "https") {
return new(std::nothrow) BHttpRequest(url, true, "HTTPS", listener,
context);
} else if (url.Protocol() == "file") {
puts("*** FILE URL");
return new(std::nothrow) BFileRequest(url, listener, context);
}
puts("*** UNKNOWN protocol");
return NULL;
}