/*
 * Copyright 2001-2010 Haiku Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Philippe Houdoin,
 */
 
 
#include "HPJetDirectTransport.h"
 
#include <stdio.h>
 
#include <Alert.h>
#include <Message.h>
#include <Directory.h>
#include <SupportKit.h>
#include <String.h>
#include <NetEndpoint.h>
 
#include "SetupWindow.h"
 
 
HPJetDirectPort::HPJetDirectPort(BDirectory* printer, BMessage *msg)
	: fHost(""),
	fPort(9100),
	fEndpoint(NULL),
	fReady(B_ERROR)
{
	BString address;
 
	if (printer->ReadAttrString("transport_address", &address) < 0
		|| address.Length() == 0) {
		SetupWindow *setup = new SetupWindow(printer);
		if (setup->Go() == B_ERROR)
			return;
	}
 
	if (printer->ReadAttrString("transport_address", &address) < 0)
		return;
 
	printf("address = %s\n", address.String());
 
	int32 index = address.FindLast(':');
	if (index >= 0) {
		fPort = atoi(address.String() + index + 1);
		address.MoveInto(fHost, 0, index);
	} else
		fHost = address;
 
	printf("fHost = %s\n", fHost.String());
	printf("fPort = %d\n", fPort);
 
 
	fEndpoint = new(std::nothrow) BNetEndpoint(SOCK_STREAM);
	if (fEndpoint == NULL || (fReady = fEndpoint->InitCheck()) != B_OK) {
		BAlert *alert = new BAlert("", "Fail to create the NetEndpoint!", "OK");
		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
		alert->Go();
		delete fEndpoint;
		fEndpoint = NULL;
		return;
	}
 
	if (fEndpoint->Connect(fHost, fPort) == B_OK) {
		printf("Connected to HP JetDirect printer port at %s:%d\n",
			fHost.String(), fPort);
		fReady = B_OK;
	} else {
		BAlert *alert = new BAlert("",
			"Can't connect to HP JetDirect printer port!", "OK");
		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
		alert->Go();
		fReady = B_ERROR;
	}
}
 
 
HPJetDirectPort::~HPJetDirectPort()
{
	if (fEndpoint) {
		shutdown(fEndpoint->Socket(), SHUT_WR);
		fEndpoint->Close();
	}
	delete fEndpoint;
}
 
 
ssize_t
HPJetDirectPort::Read(void* buffer, size_t size)
{
	// printf("HPJetDirectPort::Read(%ld bytes)\n", size);
	if (fEndpoint)
		return (ssize_t) fEndpoint->Receive(buffer, size);
	return 0;
}
 
 
ssize_t
HPJetDirectPort::Write(const void* buffer, size_t size)
{
	// printf("HPJetDirectPort::Write(%ld bytes)\n", size);
	if (fEndpoint)
		return (ssize_t) fEndpoint->Send(buffer, size);
	return 0;
}
 

V773 Visibility scope of the 'alert' pointer was exited without releasing the memory. A memory leak is possible.

V773 The function was exited without releasing the 'setup' pointer. A memory leak is possible.

V773 The function was exited without releasing the 'alert' pointer. A memory leak is possible.