HPJetDirectTransport.cpp revision b7d73f97ee6feab9ba05dcd54aa3c8be938eec42
1/*
2 * Copyright 2001-2010 Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Philippe Houdoin,
7 */
8
9
10#include "HPJetDirectTransport.h"
11
12#include <stdio.h>
13
14#include <Alert.h>
15#include <Message.h>
16#include <Directory.h>
17#include <SupportKit.h>
18#include <String.h>
19#include <NetEndpoint.h>
20
21#include "SetupWindow.h"
22
23
24HPJetDirectPort::HPJetDirectPort(BDirectory* printer, BMessage *msg)
25	: fHost(""),
26	fPort(9100),
27	fEndpoint(NULL),
28	fReady(B_ERROR)
29{
30	BString address;
31
32	if (printer->ReadAttrString("transport_address", &address) < 0) {
33		SetupWindow *setup = new SetupWindow(printer);
34		if (setup->Go() == B_ERROR)
35			return;
36	}
37
38	if (printer->ReadAttrString("transport_address", &address) < 0)
39		return;
40
41	printf("address = %s\n", address.String());
42
43	int32 index = address.FindLast(':');
44	if (index >= 0) {
45		fPort = atoi(address.String() + index);
46		address.MoveInto(fHost, 0, index);
47	} else
48		fHost = address;
49
50	printf("fHost = %s\n", fHost.String());
51	printf("fPort = %d\n", fPort);
52
53
54	fEndpoint = new BNetEndpoint(SOCK_STREAM);
55	if ((fReady = fEndpoint->InitCheck()) != B_OK) {
56		BAlert *alert = new BAlert("", "Fail to create the NetEndpoint!", "OK");
57		alert->Go();
58		return;
59	}
60
61	if (fEndpoint->Connect(fHost, fPort) == B_OK) {
62		printf("Connected to HP JetDirect printer port at %s:%d\n",
63			fHost.String(), fPort);
64		fReady = B_OK;
65	} else {
66		BAlert *alert = new BAlert("",
67			"Can't connect to HP JetDirect printer port!", "OK");
68		alert->Go();
69		fReady = B_ERROR;
70	}
71}
72
73
74HPJetDirectPort::~HPJetDirectPort()
75{
76	if (fEndpoint) {
77		shutdown(fEndpoint->Socket(), SHUT_WR);
78		fEndpoint->Close();
79	}
80	delete fEndpoint;
81}
82
83
84ssize_t
85HPJetDirectPort::Read(void* buffer, size_t size)
86{
87	// printf("HPJetDirectPort::Read(%ld bytes)\n", size);
88	if (fEndpoint)
89		return (ssize_t) fEndpoint->Receive(buffer, size);
90	return 0;
91}
92
93
94ssize_t
95HPJetDirectPort::Write(const void* buffer, size_t size)
96{
97	// printf("HPJetDirectPort::Write(%ld bytes)\n", size);
98	if (fEndpoint)
99		return (ssize_t) fEndpoint->Send(buffer, size);
100	return 0;
101}
102
103