1 // Sun, 18 Jun 2000
2 // Y.Takagi
3
4 #include <Alert.h>
5 #include <DataIO.h>
6 #include <Message.h>
7 #include <Directory.h>
8
9 #include <netdb.h>
10 #include <pwd.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <unistd.h>
14 #include <iomanip>
15 #include <sstream>
16
17 #include "LpsClient.h"
18 #include "LprSetupDlg.h"
19 #include "LprTransport.h"
20 #include "LprDefs.h"
21 #include "DbgMsg.h"
22
23
24 using namespace std;
25
26
LprTransport(BMessage * msg)27 LprTransport::LprTransport(BMessage *msg)
28 :
29 BDataIO()
30 {
31 fServer[0] = '\0';
32 fQueue[0] = '\0';
33 fFile[0] = '\0';
34 fUser[0] = '\0';
35 fJobId = 0;
36 fError = false;
37
38 struct passwd *pwd = getpwuid(geteuid());
39 if (pwd != NULL && pwd->pw_name != NULL && pwd->pw_name[0])
40 strcpy(fUser, pwd->pw_name);
41 else
42 strcpy(fUser, "baron");
43
44 DUMP_BMESSAGE(msg);
45
46 const char *spool_path = msg->FindString(SPOOL_PATH);
47 if (spool_path && *spool_path) {
48 BDirectory dir(spool_path);
49 DUMP_BDIRECTORY(&dir);
50
51 dir.ReadAttr(LPR_SERVER_NAME, B_STRING_TYPE, 0, fServer, sizeof(fServer));
52 if (fServer[0] == '\0') {
53 LprSetupDlg *dlg = new LprSetupDlg(&dir);
54 if (dlg->Go() == B_ERROR) {
55 fError = true;
56 return;
57 }
58 }
59
60 dir.ReadAttr(LPR_SERVER_NAME, B_STRING_TYPE, 0, fServer, sizeof(fServer));
61 dir.ReadAttr(LPR_QUEUE_NAME, B_STRING_TYPE, 0, fQueue, sizeof(fQueue));
62 dir.ReadAttr(LPR_JOB_ID, B_INT32_TYPE, 0, &fJobId, sizeof(fJobId));
63 fJobId++;
64 if (fJobId > 255) {
65 fJobId = 1;
66 }
67 dir.WriteAttr(LPR_JOB_ID, B_INT32_TYPE, 0, &fJobId, sizeof(fJobId));
68
69 sprintf(fFile, "%s/%s@ipp.%" B_PRId32, spool_path, fUser, fJobId);
70
71 fStream.open(fFile, ios::in | ios::out | ios::binary | ios::trunc);
72 if (fStream.good()) {
73 DBGMSG(("spool_file: %s\n", fFile));
74 return;
75 }
76 }
77 fError = true;
78 }
79
80
~LprTransport()81 LprTransport::~LprTransport()
82 {
83 if (!fError)
84 _SendFile();
85
86 if (fFile[0] != '\0')
87 unlink(fFile);
88 }
89
90
91 void
_SendFile()92 LprTransport::_SendFile()
93 {
94 char hostname[128];
95 if (gethostname(hostname, sizeof(hostname)) != B_OK)
96 strcpy(hostname, "localhost");
97
98 ostringstream cfname;
99 cfname << "cfA" << setw(3) << setfill('0') << fJobId << hostname;
100
101 ostringstream dfname;
102 dfname << "dfA" << setw(3) << setfill('0') << fJobId << hostname;
103
104 ostringstream cf;
105 cf << 'H' << hostname << '\n';
106 cf << 'P' << fUser << '\n';
107 cf << 'l' << dfname.str() << '\n';
108 cf << 'U' << dfname.str() << '\n';
109
110 long cfsize = cf.str().length();
111 long dfsize = fStream.tellg();
112 fStream.seekg(0, ios::beg);
113
114 try {
115 LpsClient lpr(fServer);
116
117 lpr.connect();
118 lpr.receiveJob(fQueue);
119
120 lpr.receiveControlFile(cfsize, cfname.str().c_str());
121 lpr.transferData(cf.str().c_str(), cfsize);
122 lpr.endTransfer();
123
124 lpr.receiveDataFile(dfsize, dfname.str().c_str());
125 lpr.transferData(fStream, dfsize);
126 lpr.endTransfer();
127 }
128
129 catch (LPSException &err) {
130 DBGMSG(("error: %s\n", err.what()));
131 BAlert *alert = new BAlert("", err.what(), "OK");
132 alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
133 alert->Go();
134 }
135 }
136
137
138 ssize_t
Read(void *,size_t)139 LprTransport::Read(void *, size_t)
140 {
141 return 0;
142 }
143
144
145 ssize_t
Write(const void * buffer,size_t size)146 LprTransport::Write(const void *buffer, size_t size)
147 {
148 if (!fStream.write((char *)buffer, size)) {
149 fError = true;
150 return 0;
151 }
152 return size;
153 }
154