xref: /haiku/src/add-ons/print/transports/ipp/IppSetupDlg.cpp (revision 445f9c6c923d408ec6c14e56a80d86bedb23e17e)
152a38012Sejakowatz // Sun, 18 Jun 2000
252a38012Sejakowatz // Y.Takagi
352a38012Sejakowatz 
4fb3e35fcSMichael Lotz #include <string.h>
53aeed660SJérôme Duval #include <strings.h>
6fb3e35fcSMichael Lotz 
733984e7bSAdrien Destugues #include <Alert.h>
852a38012Sejakowatz #include <Button.h>
933984e7bSAdrien Destugues #include <Directory.h>
1052a38012Sejakowatz #include <Rect.h>
1152a38012Sejakowatz #include <TextControl.h>
1252a38012Sejakowatz #include <View.h>
1333984e7bSAdrien Destugues #include <Url.h>
1452a38012Sejakowatz 
1552a38012Sejakowatz #include "IppContent.h"
1652a38012Sejakowatz #include "IppURLConnection.h"
1752a38012Sejakowatz #include "IppSetupDlg.h"
1852a38012Sejakowatz #include "IppDefs.h"
1952a38012Sejakowatz #include "DbgMsg.h"
2052a38012Sejakowatz 
2152a38012Sejakowatz #define	DLG_WIDTH		350
2252a38012Sejakowatz #define DLG_HEIGHT		80
2352a38012Sejakowatz 
2452a38012Sejakowatz #define BUTTON_WIDTH	70
2552a38012Sejakowatz #define BUTTON_HEIGHT	20
2652a38012Sejakowatz 
2752a38012Sejakowatz #define URL_H			10
2852a38012Sejakowatz #define URL_V			10
2952a38012Sejakowatz #define URL_WIDTH		(DLG_WIDTH - URL_H - URL_H)
3052a38012Sejakowatz #define URL_HEIGHT		20
3152a38012Sejakowatz #define URL_TEXT		"URL"
3252a38012Sejakowatz 
3352a38012Sejakowatz #define OK_H			(DLG_WIDTH  - BUTTON_WIDTH  - 11)
3452a38012Sejakowatz #define OK_V			(DLG_HEIGHT - BUTTON_HEIGHT - 11)
3552a38012Sejakowatz #define OK_TEXT			"OK"
3652a38012Sejakowatz 
3752a38012Sejakowatz #define CANCEL_H		(OK_H - BUTTON_WIDTH - 12)
3852a38012Sejakowatz #define CANCEL_V		OK_V
3952a38012Sejakowatz #define CANCEL_TEXT		"Cancel"
4052a38012Sejakowatz 
4152a38012Sejakowatz 
4252a38012Sejakowatz const BRect URL_RECT(
4352a38012Sejakowatz 	URL_H,
4452a38012Sejakowatz 	URL_V,
4552a38012Sejakowatz 	URL_H + URL_WIDTH,
4652a38012Sejakowatz 	URL_V + URL_HEIGHT);
4752a38012Sejakowatz 
4852a38012Sejakowatz const BRect OK_RECT(
4952a38012Sejakowatz 	OK_H,
5052a38012Sejakowatz 	OK_V,
5152a38012Sejakowatz 	OK_H + BUTTON_WIDTH,
5252a38012Sejakowatz 	OK_V + BUTTON_HEIGHT);
5352a38012Sejakowatz 
5452a38012Sejakowatz const BRect CANCEL_RECT(
5552a38012Sejakowatz 	CANCEL_H,
5652a38012Sejakowatz 	CANCEL_V,
5752a38012Sejakowatz 	CANCEL_H + BUTTON_WIDTH,
5852a38012Sejakowatz 	CANCEL_V + BUTTON_HEIGHT);
5952a38012Sejakowatz 
6052a38012Sejakowatz enum MSGS {
6152a38012Sejakowatz 	M_CANCEL = 1,
6252a38012Sejakowatz 	M_OK
6352a38012Sejakowatz };
6452a38012Sejakowatz 
6552a38012Sejakowatz 
6652a38012Sejakowatz class IppSetupView : public BView {
6752a38012Sejakowatz public:
6852a38012Sejakowatz 	IppSetupView(BRect, BDirectory *);
~IppSetupView()6952a38012Sejakowatz 	~IppSetupView() {}
7052a38012Sejakowatz 	virtual void AttachedToWindow();
7152a38012Sejakowatz 	bool UpdateViewData();
7252a38012Sejakowatz 
7352a38012Sejakowatz private:
7452a38012Sejakowatz 	BTextControl *url;
7552a38012Sejakowatz 	BDirectory *dir;
7652a38012Sejakowatz };
7752a38012Sejakowatz 
IppSetupView(BRect frame,BDirectory * d)7852a38012Sejakowatz IppSetupView::IppSetupView(BRect frame, BDirectory *d)
7952a38012Sejakowatz 	: BView(frame, "", B_FOLLOW_ALL, B_WILL_DRAW), dir(d)
8052a38012Sejakowatz {
81fa19dd44Slooncraz 	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
8252a38012Sejakowatz }
8352a38012Sejakowatz 
AttachedToWindow()8452a38012Sejakowatz void IppSetupView::AttachedToWindow()
8552a38012Sejakowatz {
8652a38012Sejakowatz 	/* url box */
8752a38012Sejakowatz 
8852a38012Sejakowatz 	url = new BTextControl(URL_RECT, "", URL_TEXT, "", NULL);
8952a38012Sejakowatz 	AddChild(url);
9052a38012Sejakowatz 	url->SetDivider(StringWidth(URL_TEXT) + 10);
9152a38012Sejakowatz 
9252a38012Sejakowatz 	/* cancel */
9352a38012Sejakowatz 
9452a38012Sejakowatz 	BButton *button = new BButton(CANCEL_RECT, "", CANCEL_TEXT, new BMessage(M_CANCEL));
9552a38012Sejakowatz 	AddChild(button);
9652a38012Sejakowatz 
9752a38012Sejakowatz 	/* ok */
9852a38012Sejakowatz 
9952a38012Sejakowatz 	button = new BButton(OK_RECT, "", OK_TEXT, new BMessage(M_OK));
10052a38012Sejakowatz 	AddChild(button);
10152a38012Sejakowatz 	button->MakeDefault(true);
10252a38012Sejakowatz }
10352a38012Sejakowatz 
UpdateViewData()10452a38012Sejakowatz bool IppSetupView::UpdateViewData()
10552a38012Sejakowatz {
10652a38012Sejakowatz 	string error_msg;
10752a38012Sejakowatz 
10852a38012Sejakowatz 	if (*url->Text()) {
10952a38012Sejakowatz 		IppContent *request = new IppContent;
11052a38012Sejakowatz 		request->setOperationId(IPP_GET_PRINTER_ATTRIBUTES);
11152a38012Sejakowatz 		request->setDelimiter(IPP_OPERATION_ATTRIBUTES_TAG);
11252a38012Sejakowatz 		request->setCharset("attributes-charset", "utf-8");
11352a38012Sejakowatz 		request->setNaturalLanguage("attributes-natural-language", "en-us");
11452a38012Sejakowatz 		request->setURI("printer-uri", url->Text());
11552a38012Sejakowatz 		request->setDelimiter(IPP_END_OF_ATTRIBUTES_TAG);
11652a38012Sejakowatz 
11733984e7bSAdrien Destugues 		IppURLConnection conn(BUrl(url->Text()));
11852a38012Sejakowatz 		conn.setIppRequest(request);
11952a38012Sejakowatz 		conn.setRequestProperty("Connection", "close");
12052a38012Sejakowatz 
12152a38012Sejakowatz 		HTTP_RESPONSECODE response_code = conn.getResponseCode();
12252a38012Sejakowatz 		if (response_code == HTTP_OK) {
12352a38012Sejakowatz 			const char *content_type = conn.getContentType();
124*445f9c6cSAdrien Destugues 			if (content_type == NULL
125*445f9c6cSAdrien Destugues 				|| strncasecmp(content_type, "application/ipp", 15) == 0) {
12652a38012Sejakowatz 				const IppContent *ipp_response = conn.getIppResponse();
12752a38012Sejakowatz 				if (ipp_response->good()) {
128*445f9c6cSAdrien Destugues 					dir->WriteAttr(IPP_URL, B_STRING_TYPE, 0, url->Text(),
129*445f9c6cSAdrien Destugues 						strlen(url->Text()) + 1);
13052a38012Sejakowatz 					return true;
13152a38012Sejakowatz 				} else {
13252a38012Sejakowatz 					error_msg = ipp_response->getStatusMessage();
13352a38012Sejakowatz 				}
13452a38012Sejakowatz 			} else {
13552a38012Sejakowatz 				error_msg = "cannot get a IPP response.";
13652a38012Sejakowatz 			}
13752a38012Sejakowatz 		} else if (response_code != HTTP_UNKNOWN) {
13852a38012Sejakowatz 			error_msg = conn.getResponseMessage();
13952a38012Sejakowatz 		} else {
14052a38012Sejakowatz 			error_msg = "cannot connect to the IPP server.";
14152a38012Sejakowatz 		}
14252a38012Sejakowatz 	} else {
14352a38012Sejakowatz 		error_msg = "please input the printer URL.";
14452a38012Sejakowatz 	}
14552a38012Sejakowatz 
14652a38012Sejakowatz 	BAlert *alert = new BAlert("", error_msg.c_str(), "OK");
147aed35104SHumdinger 	alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
14852a38012Sejakowatz 	alert->Go();
14952a38012Sejakowatz 	return false;
15052a38012Sejakowatz }
15152a38012Sejakowatz 
IppSetupDlg(BDirectory * dir)15252a38012Sejakowatz IppSetupDlg::IppSetupDlg(BDirectory *dir)
15352a38012Sejakowatz 	: BWindow(BRect(100, 100, 100 + DLG_WIDTH, 100 + DLG_HEIGHT),
15452a38012Sejakowatz 		"IPP Setup", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL,
1550e216008SMichael Pfeiffer 		B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE
1560e216008SMichael Pfeiffer 			| B_CLOSE_ON_ESCAPE)
15752a38012Sejakowatz {
15852a38012Sejakowatz 	result = 0;
15952a38012Sejakowatz 
16052a38012Sejakowatz 	Lock();
16152a38012Sejakowatz 	IppSetupView *view = new IppSetupView(Bounds(), dir);
16252a38012Sejakowatz 	AddChild(view);
16352a38012Sejakowatz 	Unlock();
16452a38012Sejakowatz 
16552a38012Sejakowatz 	semaphore = create_sem(0, "IppSetupSem");
16652a38012Sejakowatz }
16752a38012Sejakowatz 
QuitRequested()16852a38012Sejakowatz bool IppSetupDlg::QuitRequested()
16952a38012Sejakowatz {
17052a38012Sejakowatz 	result = B_ERROR;
17152a38012Sejakowatz 	release_sem(semaphore);
17252a38012Sejakowatz 	return true;
17352a38012Sejakowatz }
17452a38012Sejakowatz 
MessageReceived(BMessage * msg)17552a38012Sejakowatz void IppSetupDlg::MessageReceived(BMessage *msg)
17652a38012Sejakowatz {
17752a38012Sejakowatz 	bool success;
17852a38012Sejakowatz 
17952a38012Sejakowatz 	switch (msg->what) {
18052a38012Sejakowatz 	case M_OK:
18152a38012Sejakowatz 		Lock();
18252a38012Sejakowatz 		success = ((IppSetupView *)ChildAt(0))->UpdateViewData();
18352a38012Sejakowatz 		Unlock();
18452a38012Sejakowatz 		if (success) {
18552a38012Sejakowatz 			result = B_NO_ERROR;
18652a38012Sejakowatz 			release_sem(semaphore);
18752a38012Sejakowatz 		}
18852a38012Sejakowatz 		break;
18952a38012Sejakowatz 
19052a38012Sejakowatz 	case M_CANCEL:
19152a38012Sejakowatz 		result = B_ERROR;
19252a38012Sejakowatz 		release_sem(semaphore);
19352a38012Sejakowatz 		break;
19452a38012Sejakowatz 
19552a38012Sejakowatz 	default:
19652a38012Sejakowatz 		BWindow::MessageReceived(msg);
19752a38012Sejakowatz 		break;
19852a38012Sejakowatz 	}
19952a38012Sejakowatz }
20052a38012Sejakowatz 
Go()20152a38012Sejakowatz int IppSetupDlg::Go()
20252a38012Sejakowatz {
20352a38012Sejakowatz 	Show();
20452a38012Sejakowatz 	acquire_sem(semaphore);
20552a38012Sejakowatz 	delete_sem(semaphore);
20652a38012Sejakowatz 	int value = result;
20752a38012Sejakowatz 	Lock();
20852a38012Sejakowatz 	Quit();
20952a38012Sejakowatz 	return value;
21052a38012Sejakowatz }
211