xref: /haiku/src/add-ons/print/transports/ipp/IppSetupDlg.cpp (revision 52a380120846174213ccce9c4aab0dda17c72083)
1*52a38012Sejakowatz // Sun, 18 Jun 2000
2*52a38012Sejakowatz // Y.Takagi
3*52a38012Sejakowatz 
4*52a38012Sejakowatz #include <Button.h>
5*52a38012Sejakowatz #include <Rect.h>
6*52a38012Sejakowatz #include <TextControl.h>
7*52a38012Sejakowatz #include <View.h>
8*52a38012Sejakowatz #include <Directory.h>
9*52a38012Sejakowatz #include <Alert.h>
10*52a38012Sejakowatz 
11*52a38012Sejakowatz #include "URL.h"
12*52a38012Sejakowatz #include "IppContent.h"
13*52a38012Sejakowatz #include "IppURLConnection.h"
14*52a38012Sejakowatz #include "IppSetupDlg.h"
15*52a38012Sejakowatz #include "IppDefs.h"
16*52a38012Sejakowatz #include "DbgMsg.h"
17*52a38012Sejakowatz 
18*52a38012Sejakowatz #define	DLG_WIDTH		350
19*52a38012Sejakowatz #define DLG_HEIGHT		80
20*52a38012Sejakowatz 
21*52a38012Sejakowatz #define BUTTON_WIDTH	70
22*52a38012Sejakowatz #define BUTTON_HEIGHT	20
23*52a38012Sejakowatz 
24*52a38012Sejakowatz #define URL_H			10
25*52a38012Sejakowatz #define URL_V			10
26*52a38012Sejakowatz #define URL_WIDTH		(DLG_WIDTH - URL_H - URL_H)
27*52a38012Sejakowatz #define URL_HEIGHT		20
28*52a38012Sejakowatz #define URL_TEXT		"URL"
29*52a38012Sejakowatz 
30*52a38012Sejakowatz #define OK_H			(DLG_WIDTH  - BUTTON_WIDTH  - 11)
31*52a38012Sejakowatz #define OK_V			(DLG_HEIGHT - BUTTON_HEIGHT - 11)
32*52a38012Sejakowatz #define OK_TEXT			"OK"
33*52a38012Sejakowatz 
34*52a38012Sejakowatz #define CANCEL_H		(OK_H - BUTTON_WIDTH - 12)
35*52a38012Sejakowatz #define CANCEL_V		OK_V
36*52a38012Sejakowatz #define CANCEL_TEXT		"Cancel"
37*52a38012Sejakowatz 
38*52a38012Sejakowatz 
39*52a38012Sejakowatz const BRect URL_RECT(
40*52a38012Sejakowatz 	URL_H,
41*52a38012Sejakowatz 	URL_V,
42*52a38012Sejakowatz 	URL_H + URL_WIDTH,
43*52a38012Sejakowatz 	URL_V + URL_HEIGHT);
44*52a38012Sejakowatz 
45*52a38012Sejakowatz const BRect OK_RECT(
46*52a38012Sejakowatz 	OK_H,
47*52a38012Sejakowatz 	OK_V,
48*52a38012Sejakowatz 	OK_H + BUTTON_WIDTH,
49*52a38012Sejakowatz 	OK_V + BUTTON_HEIGHT);
50*52a38012Sejakowatz 
51*52a38012Sejakowatz const BRect CANCEL_RECT(
52*52a38012Sejakowatz 	CANCEL_H,
53*52a38012Sejakowatz 	CANCEL_V,
54*52a38012Sejakowatz 	CANCEL_H + BUTTON_WIDTH,
55*52a38012Sejakowatz 	CANCEL_V + BUTTON_HEIGHT);
56*52a38012Sejakowatz 
57*52a38012Sejakowatz enum MSGS {
58*52a38012Sejakowatz 	M_CANCEL = 1,
59*52a38012Sejakowatz 	M_OK
60*52a38012Sejakowatz };
61*52a38012Sejakowatz 
62*52a38012Sejakowatz 
63*52a38012Sejakowatz class IppSetupView : public BView {
64*52a38012Sejakowatz public:
65*52a38012Sejakowatz 	IppSetupView(BRect, BDirectory *);
66*52a38012Sejakowatz 	~IppSetupView() {}
67*52a38012Sejakowatz 	virtual void AttachedToWindow();
68*52a38012Sejakowatz 	bool UpdateViewData();
69*52a38012Sejakowatz 
70*52a38012Sejakowatz private:
71*52a38012Sejakowatz 	BTextControl *url;
72*52a38012Sejakowatz 	BDirectory *dir;
73*52a38012Sejakowatz };
74*52a38012Sejakowatz 
75*52a38012Sejakowatz IppSetupView::IppSetupView(BRect frame, BDirectory *d)
76*52a38012Sejakowatz 	: BView(frame, "", B_FOLLOW_ALL, B_WILL_DRAW), dir(d)
77*52a38012Sejakowatz {
78*52a38012Sejakowatz 	SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
79*52a38012Sejakowatz }
80*52a38012Sejakowatz 
81*52a38012Sejakowatz void IppSetupView::AttachedToWindow()
82*52a38012Sejakowatz {
83*52a38012Sejakowatz 	/* url box */
84*52a38012Sejakowatz 
85*52a38012Sejakowatz 	url = new BTextControl(URL_RECT, "", URL_TEXT, "", NULL);
86*52a38012Sejakowatz 	AddChild(url);
87*52a38012Sejakowatz 	url->SetDivider(StringWidth(URL_TEXT) + 10);
88*52a38012Sejakowatz 
89*52a38012Sejakowatz 	/* cancel */
90*52a38012Sejakowatz 
91*52a38012Sejakowatz 	BButton *button = new BButton(CANCEL_RECT, "", CANCEL_TEXT, new BMessage(M_CANCEL));
92*52a38012Sejakowatz 	AddChild(button);
93*52a38012Sejakowatz 
94*52a38012Sejakowatz 	/* ok */
95*52a38012Sejakowatz 
96*52a38012Sejakowatz 	button = new BButton(OK_RECT, "", OK_TEXT, new BMessage(M_OK));
97*52a38012Sejakowatz 	AddChild(button);
98*52a38012Sejakowatz 	button->MakeDefault(true);
99*52a38012Sejakowatz }
100*52a38012Sejakowatz 
101*52a38012Sejakowatz bool IppSetupView::UpdateViewData()
102*52a38012Sejakowatz {
103*52a38012Sejakowatz 	string error_msg;
104*52a38012Sejakowatz 
105*52a38012Sejakowatz 	if (*url->Text()) {
106*52a38012Sejakowatz 		IppContent *request = new IppContent;
107*52a38012Sejakowatz 		request->setOperationId(IPP_GET_PRINTER_ATTRIBUTES);
108*52a38012Sejakowatz 		request->setDelimiter(IPP_OPERATION_ATTRIBUTES_TAG);
109*52a38012Sejakowatz 		request->setCharset("attributes-charset", "utf-8");
110*52a38012Sejakowatz 		request->setNaturalLanguage("attributes-natural-language", "en-us");
111*52a38012Sejakowatz 		request->setURI("printer-uri", url->Text());
112*52a38012Sejakowatz 		request->setDelimiter(IPP_END_OF_ATTRIBUTES_TAG);
113*52a38012Sejakowatz 
114*52a38012Sejakowatz 		IppURLConnection conn(URL(url->Text()));
115*52a38012Sejakowatz 		conn.setIppRequest(request);
116*52a38012Sejakowatz 		conn.setRequestProperty("Connection", "close");
117*52a38012Sejakowatz 
118*52a38012Sejakowatz 		HTTP_RESPONSECODE response_code = conn.getResponseCode();
119*52a38012Sejakowatz 		if (response_code == HTTP_OK) {
120*52a38012Sejakowatz 			const char *content_type = conn.getContentType();
121*52a38012Sejakowatz 			if (content_type && !strncasecmp(content_type, "application/ipp", 15)) {
122*52a38012Sejakowatz 				const IppContent *ipp_response = conn.getIppResponse();
123*52a38012Sejakowatz 				if (ipp_response->good()) {
124*52a38012Sejakowatz 					dir->WriteAttr(IPP_URL, B_STRING_TYPE, 0, url->Text(), strlen(url->Text()) + 1);
125*52a38012Sejakowatz 					return true;
126*52a38012Sejakowatz 				} else {
127*52a38012Sejakowatz 					error_msg = ipp_response->getStatusMessage();
128*52a38012Sejakowatz 				}
129*52a38012Sejakowatz 			} else {
130*52a38012Sejakowatz 				error_msg = "cannot get a IPP response.";
131*52a38012Sejakowatz 			}
132*52a38012Sejakowatz 		} else if (response_code != HTTP_UNKNOWN) {
133*52a38012Sejakowatz 			error_msg = conn.getResponseMessage();
134*52a38012Sejakowatz 		} else {
135*52a38012Sejakowatz 			error_msg = "cannot connect to the IPP server.";
136*52a38012Sejakowatz 		}
137*52a38012Sejakowatz 	} else {
138*52a38012Sejakowatz 		error_msg = "please input the printer URL.";
139*52a38012Sejakowatz 	}
140*52a38012Sejakowatz 
141*52a38012Sejakowatz 	BAlert *alert = new BAlert("", error_msg.c_str(), "OK");
142*52a38012Sejakowatz 	alert->Go();
143*52a38012Sejakowatz 	return false;
144*52a38012Sejakowatz }
145*52a38012Sejakowatz 
146*52a38012Sejakowatz IppSetupDlg::IppSetupDlg(BDirectory *dir)
147*52a38012Sejakowatz 	: BWindow(BRect(100, 100, 100 + DLG_WIDTH, 100 + DLG_HEIGHT),
148*52a38012Sejakowatz 		"IPP Setup", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL,
149*52a38012Sejakowatz 		B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE)
150*52a38012Sejakowatz {
151*52a38012Sejakowatz 	result = 0;
152*52a38012Sejakowatz 
153*52a38012Sejakowatz 	Lock();
154*52a38012Sejakowatz 	IppSetupView *view = new IppSetupView(Bounds(), dir);
155*52a38012Sejakowatz 	AddChild(view);
156*52a38012Sejakowatz 	Unlock();
157*52a38012Sejakowatz 
158*52a38012Sejakowatz 	semaphore = create_sem(0, "IppSetupSem");
159*52a38012Sejakowatz }
160*52a38012Sejakowatz 
161*52a38012Sejakowatz bool IppSetupDlg::QuitRequested()
162*52a38012Sejakowatz {
163*52a38012Sejakowatz 	result = B_ERROR;
164*52a38012Sejakowatz 	release_sem(semaphore);
165*52a38012Sejakowatz 	return true;
166*52a38012Sejakowatz }
167*52a38012Sejakowatz 
168*52a38012Sejakowatz void IppSetupDlg::MessageReceived(BMessage *msg)
169*52a38012Sejakowatz {
170*52a38012Sejakowatz 	bool success;
171*52a38012Sejakowatz 
172*52a38012Sejakowatz 	switch (msg->what) {
173*52a38012Sejakowatz 	case M_OK:
174*52a38012Sejakowatz 		Lock();
175*52a38012Sejakowatz 		success = ((IppSetupView *)ChildAt(0))->UpdateViewData();
176*52a38012Sejakowatz 		Unlock();
177*52a38012Sejakowatz 		if (success) {
178*52a38012Sejakowatz 			result = B_NO_ERROR;
179*52a38012Sejakowatz 			release_sem(semaphore);
180*52a38012Sejakowatz 		}
181*52a38012Sejakowatz 		break;
182*52a38012Sejakowatz 
183*52a38012Sejakowatz 	case M_CANCEL:
184*52a38012Sejakowatz 		result = B_ERROR;
185*52a38012Sejakowatz 		release_sem(semaphore);
186*52a38012Sejakowatz 		break;
187*52a38012Sejakowatz 
188*52a38012Sejakowatz 	default:
189*52a38012Sejakowatz 		BWindow::MessageReceived(msg);
190*52a38012Sejakowatz 		break;
191*52a38012Sejakowatz 	}
192*52a38012Sejakowatz }
193*52a38012Sejakowatz 
194*52a38012Sejakowatz int IppSetupDlg::Go()
195*52a38012Sejakowatz {
196*52a38012Sejakowatz 	Show();
197*52a38012Sejakowatz 	acquire_sem(semaphore);
198*52a38012Sejakowatz 	delete_sem(semaphore);
199*52a38012Sejakowatz 	int value = result;
200*52a38012Sejakowatz 	Lock();
201*52a38012Sejakowatz 	Quit();
202*52a38012Sejakowatz 	return value;
203*52a38012Sejakowatz }
204