[NEW] LocDeltaList + LocDeltaList => LocDeltaList
[ohcount] / test / expected_dir / pike2.pmod
1 pike    comment //
2 pike    comment // LPD.pmod: an implementation of the BSD lpd protocol (RFC 1179).
3 pike    comment // This is a module for pike.
4 pike    comment // 3 July 1998 <hww3@riverweb.com> Bill Welliver
5 pike    comment //
6 pike    comment // $Id: LPD.pmod,v 1.10 2008/01/13 17:02:43 nilsson Exp $
7 pike    comment //
8 pike    blank   
9 pike    code    #pike __REAL_VERSION__
10 pike    blank   
11 pike    comment //! A client for communicating with printers and print spoolers that
12 pike    comment //! support the BSD lpd protocol (RFC 1179).
13 pike    code    class client {
14 pike    code      string host;
15 pike    code      int port;
16 pike    code      private object conn;
17 pike    code      int jobnum;
18 pike    code      string jobtype;
19 pike    code      string jobname;
20 pike    blank   
21 pike    code      private int connect(string host, int port)
22 pike    code      {
23 pike    code        int a=random(10);
24 pike    comment     // try to open one of the "official" local socket ports.
25 pike    comment     // not having one doesn't seem to be a problem with most LPD 
26 pike    comment     // servers, but we should at least try. will probably fail
27 pike    comment     // if two try to open the same local port at once. ymmv.
28 pike    code        int res=conn->open_socket(721 + a);
29 pike    blank   
30 pike    code        return conn->connect(host, port);
31 pike    code      }
32 pike    blank   
33 pike    comment //! @decl int set_job_type(string type)
34 pike    comment //! Set the type of job to be sent to the printer to @i{type@}.
35 pike    comment //! Valid types are: text, postscript and raw.
36 pike    code      int set_job_type(string type)
37 pike    code      {
38 pike    code        type=lower_case(type);
39 pike    blank   
40 pike    code        switch (type) { 
41 pike    code         case "f":
42 pike    code         case "text":
43 pike    code          jobtype="f";
44 pike    code          break;
45 pike    blank   
46 pike    code         case "o":
47 pike    code         case "postscript":
48 pike    code         case "ps":
49 pike    code          jobtype="o";
50 pike    code          break;
51 pike    blank   
52 pike    code         default:
53 pike    code         case "l":
54 pike    code         case "raw":
55 pike    code          jobtype="l";
56 pike    code          break;
57 pike    code        }
58 pike    code        return 1;
59 pike    code      }
60 pike    blank   
61 pike    comment //! @decl int set_job_name(string name)
62 pike    comment //! Sets the name of the print job to @i{name@}.
63 pike    code      int set_job_name(string name)
64 pike    code      {
65 pike    code        jobname=name;
66 pike    code        return 1;
67 pike    code      }
68 pike    blank   
69 pike    comment //! @decl int start_queue(string queue)
70 pike    comment //! Start the queue @i{queue@} if not already printing.
71 pike    comment //! @returns
72 pike    comment //! Returns 0 if unable to connect, 1 otherwise. 
73 pike    code      int start_queue(string queue)
74 pike    code      {
75 pike    code        if(!queue) return 0;
76 pike    blank   
77 pike    code        if(!connect(host, port))
78 pike    code          return 0;
79 pike    blank   
80 pike    code        conn->write(sprintf("%c%s\n", 01, queue));
81 pike    code        string resp= conn->read();
82 pike    code        conn->close();
83 pike    code        return 1;
84 pike    code      }
85 pike    blank   
86 pike    comment //! @decl string|int send_job(string queue, string job)
87 pike    comment //! Send print job consisting of data @i{job@} to printer @i{queue@}.
88 pike    comment //! @returns
89 pike    comment //! Returns 1 if success, 0 otherwise.
90 pike    code      int send_job(string queue, string job)
91 pike    code      {
92 pike    code        string resp;
93 pike    blank   
94 pike    code        if(!queue) return 0;
95 pike    blank   
96 pike    code        if(!connect(host, port))
97 pike    code          return 0;
98 pike    comment     // werror("connected to " + host + "\n");
99 pike    blank   
100 pike    code        string control="";
101 pike    code        control+="H"+gethostname()+"\n";
102 pike    code    #if constant(getuid) && constant(getpwuid)
103 pike    code        control+="P"+(getpwuid(getuid())[0]||"nobody")+"\n";
104 pike    code    #else
105 pike    code        control+="P-1\n";
106 pike    code    #endif
107 pike    code        control+=(jobtype||"l")+"dfA"+ sprintf("%03d%s", jobnum, gethostname())+"\n";
108 pike    code        if(jobname)
109 pike    code        {
110 pike    code          control+="J" + jobname + "\n";
111 pike    code          control+="N" + jobname + "\n";
112 pike    code        }
113 pike    code        else
114 pike    code        { 
115 pike    code          control+="JPike LPD Client Job " + jobnum + "\n";
116 pike    code          control+="NPike LPD Client Job " + jobnum + "\n";
117 pike    code        }
118 pike    code        jobnum++;
119 pike    code    werror("job file:\n\n" + control  + "\n\n");
120 pike    blank   
121 pike    code        conn->write(sprintf("%c%s\n", 02, queue));
122 pike    code        resp=conn->read(1);
123 pike    code        if((int)resp !=0)
124 pike    code        {
125 pike    code          werror("receive job failed.\n");
126 pike    code          return 0;
127 pike    code        }
128 pike    blank   
129 pike    code        conn->write(sprintf("%c%s cfA%03d%s\n", 02, (string)sizeof(control),
130 pike    code                            jobnum,gethostname()));
131 pike    blank   
132 pike    code        resp=conn->read(1);
133 pike    code        if((int)resp !=0)
134 pike    code        {
135 pike    code          werror("request receive control failed.\n");
136 pike    code          return 0;
137 pike    code        }
138 pike    blank   
139 pike    code        conn->write(sprintf("%s%c", control, 0));
140 pike    blank   
141 pike    code        resp=conn->read(1);
142 pike    code        if((int)resp !=0)
143 pike    code        {
144 pike    code          werror("send receive control failed.\n");
145 pike    code          return 0;
146 pike    code        }
147 pike    blank   
148 pike    code        conn->write(sprintf("%c%s dfA%03d%s\n", 03, (string)sizeof(job), jobnum,
149 pike    code                            gethostname()));
150 pike    code        resp=conn->read(1);
151 pike    code        if((int)resp !=0)
152 pike    code        {
153 pike    code          werror("request receive job failed.\n");
154 pike    code          return 0;
155 pike    code        }
156 pike    blank   
157 pike    blank   
158 pike    code        conn->write(sprintf("%s%c", job, 0));
159 pike    blank   
160 pike    code        resp=conn->read(1);
161 pike    code        if((int)resp !=0)
162 pike    code        {
163 pike    code          werror("send receive job failed.\n");
164 pike    code          return 0;
165 pike    code        }
166 pike    blank   
167 pike    blank   
168 pike    blank   
169 pike    comment     // read the response. 
170 pike    blank   
171 pike    comment //    resp=conn->read();
172 pike    code        if((int)(resp)!=0) 
173 pike    code        { 
174 pike    code          conn->close();
175 pike    code          return 0;
176 pike    code        }
177 pike    code        conn->close();
178 pike    comment //    start_queue(queue);
179 pike    code        return 1;
180 pike    code      }
181 pike    blank   
182 pike    comment //! @decl int delete_job(string queue, int|void job)
183 pike    comment //! Delete job @i{job@} from printer @i{queue@}.
184 pike    comment //! @returns
185 pike    comment //! Returns 1 on success, 0 otherwise.
186 pike    code      int delete_job(string queue, int|void job)
187 pike    code      {
188 pike    code        if(!queue) return 0;
189 pike    blank   
190 pike    code        if(!connect(host, port))
191 pike    code          return 0;
192 pike    blank   
193 pike    code    #if constant(getpwuid) && constant(getuid)
194 pike    code        string agent=(getpwuid(getuid())[0]||"nobody");
195 pike    code    #else
196 pike    code        string agent="nobody";
197 pike    code    #endif
198 pike    blank   
199 pike    code        if(job)
200 pike    code          conn->write(sprintf("%c%s %s %d\n", 05, queue, agent, job));
201 pike    code        else
202 pike    code          conn->write(sprintf("%c%s %s\n", 05, queue, agent));
203 pike    code        string resp= conn->read();
204 pike    code        conn->close();
205 pike    code        return 1;
206 pike    code      }
207 pike    blank   
208 pike    blank   
209 pike    comment //! @decl string|int status(string queue)
210 pike    comment //! Check the status of queue @i{queue@}.
211 pike    comment //! @returns
212 pike    comment //! Returns 0 on failure, otherwise returns the status response from the printer.
213 pike    code      string|int status(string queue)
214 pike    code      {
215 pike    code        if(!queue) return 0;
216 pike    blank   
217 pike    code        if(!connect(host, port))
218 pike    code          return 0;
219 pike    blank   
220 pike    code        conn->write(sprintf("%c%s\n", 04, queue));
221 pike    code        string resp= conn->read();
222 pike    code        conn->close();
223 pike    code        return resp;
224 pike    code      }
225 pike    blank   
226 pike    comment //! Create a new LPD client connection.
227 pike    comment //! @param hostname
228 pike    comment //! Contains the hostname or ipaddress of the print host.
229 pike    comment //! if not provided, defaults to @i{localhost@}.
230 pike    comment //! @param portnum
231 pike    comment //! Contains the port the print host is listening on.
232 pike    comment //! if not provided, defaults to port @i{515@}, the RFC 1179 standard.
233 pike    code      void create(string|void hostname, int|void portnum)
234 pike    code      {
235 pike    code        host=hostname || "localhost";
236 pike    code        port=portnum || 515;
237 pike    code        conn=Stdio.File();
238 pike    code        jobnum=1;
239 pike    code      }
240 pike    code    }
241 pike    blank