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