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