view src/platif/hoofbaby.cpp @ 0:3425707ddbf6

Initial import (hopefully this mercurial stuff works...)
author fraserofthenight
date Mon, 06 Jul 2009 08:06:28 -0700
parents
children
line wrap: on
line source

/**
 * Hoofbaby -- http://www.dsource.org/projects/hoofbaby
 * Copyright (C) 2009 Robert Fraser
 * 
 * This program is free software; you can redistribute it andor
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include "platif.h"
#include "PltUPnP.h"
#include "PltMediaConnect.h"
#include "PltHttpServer.h"
#include "NptStreams.h"
#include <stdlib.h>
#include <stdio.h>

static Hoofbaby hoofbaby;

class HB_InputStream : public NPT_InputStream
{
private:
	void* ctx;

public:
	HB_InputStream(void* _ctx) : ctx(_ctx) {}
	NPT_Result Read(void* buffer, NPT_Size bytes_to_read, NPT_Size* bytes_read = 0) { return hoofbaby.Stream_Read(ctx, buffer, bytes_to_read, bytes_read); }
	NPT_Result Seek(NPT_Position offset) { return hoofbaby.Stream_Seek(ctx, offset); }
	NPT_Result Tell(NPT_Position& offset) { return hoofbaby.Stream_Tell(ctx, &offset); }
	NPT_Result GetSize(NPT_LargeSize& size) { return hoofbaby.Stream_GetSize(ctx, &size); }
	NPT_Result GetAvailable(NPT_LargeSize& available) { return hoofbaby.Stream_GetAvailable(ctx, &available); }
};

class HB_Server : public PLT_MediaConnect
{
	public:
		HB_Server(const char* _path, const char* _friendly_name) : PLT_MediaConnect(_path, _friendly_name) {}
		NPT_Result ServeFile(NPT_HttpRequest& request, const NPT_HttpRequestContext& context, 
			NPT_HttpResponse& response, const NPT_String& file_path)
		{
			NPT_COMPILER_UNUSED(context);

			printf("**********************************\n");
			printf("ServeFile(%s)\n", file_path.GetChars());
			printf("**********************************\n");
			fflush(stdout);

			NPT_Position start, end;
			PLT_HttpHelper::GetRange(request, start, end);

			return PLT_FileServer::ServeFile(response,
				file_path, 
				start, 
				end, 
				!request.GetMethod().Compare("HEAD"));
		}
};

void initHoofbaby(Hoofbaby* interf)
{
	hoofbaby = *interf;
}

int startServer(const char* path)
{
	PLT_DeviceHostReference device(new HB_Server("D:\\Media\\Videos", "Platinum: Hoofbaby: "));

    PLT_UPnP upnp;
    upnp.AddDevice(device);

    if (NPT_FAILED(upnp.Start()))
        return 1;

    char buf[256];
    while (gets(buf))
    {
        if (*buf == 'q')
        {
            break;
        }
    }

    upnp.Stop();
    return 0;
}