/[rdesktop]/jpeg/rdesktop/trunk/printer.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /jpeg/rdesktop/trunk/printer.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 435 by astrand, Wed Jul 9 09:18:20 2003 UTC revision 580 by astrand, Fri Jan 23 08:35:52 2004 UTC
# Line 1  Line 1 
1    #define MAX_PRINTERS    5
2    
3  #include "rdesktop.h"  #include "rdesktop.h"
4    
5  FILE *printer_fp;  extern RDPDR_DEVICE g_rdpdr_device[];
6    
7    PRINTER *
8    get_printer_data(HANDLE handle)
9    {
10            int index;
11    
12            for (index = 0; index < RDPDR_MAX_DEVICES; index++)
13            {
14                    if (handle == g_rdpdr_device[index].handle)
15                            return (PRINTER *) g_rdpdr_device[index].pdevice_data;
16            }
17            return NULL;
18    }
19    
20    int
21    printer_enum_devices(int *id, char *optarg)
22    {
23            PRINTER *pprinter_data;
24    
25            char *pos = optarg;
26            char *pos2;
27            int count = 0;
28            int already = 0;
29    
30            // we need to know how many printers we've already set up
31            // supplied from other -r flags than this one.
32            while (count < *id)
33            {
34                    if (g_rdpdr_device[count].device_type == DEVICE_TYPE_PRINTER)
35                            already++;
36                    count++;
37            }
38    
39            count = 0;
40    
41            if (*optarg == ':')
42                    optarg++;
43    
44            while ((pos = next_arg(optarg, ',')) && *id < RDPDR_MAX_DEVICES)
45            {
46                    pprinter_data = (PRINTER *) xmalloc(sizeof(PRINTER));
47    
48                    strcpy(g_rdpdr_device[*id].name, "PRN");
49                    strcat(g_rdpdr_device[*id].name, ltoa(already + count + 1, 10));
50    
51                    /* first printer is set as default printer */
52                    if ((already + count) == 0)
53                            pprinter_data->default_printer = True;
54                    else
55                            pprinter_data->default_printer = False;
56    
57                    pos2 = next_arg(optarg, ':');
58                    if (*optarg == (char) 0x00)
59                            pprinter_data->printer = "mydeskjet";   /* set default */
60                    else
61                    {
62                            pprinter_data->printer = xmalloc(strlen(optarg) + 1);
63                            strcpy(pprinter_data->printer, optarg);
64                    }
65    
66                    if (!pos2 || (*pos2 == (char) 0x00))
67                            pprinter_data->driver = "HP LaserJet IIIP";     /* no printer driver supplied set default */
68                    else
69                    {
70                            pprinter_data->driver = xmalloc(strlen(pos2) + 1);
71                            strcpy(pprinter_data->driver, pos2);
72                    }
73    
74                    printf("PRINTER %s to %s driver %s\n", g_rdpdr_device[*id].name,
75                           pprinter_data->printer, pprinter_data->driver);
76                    g_rdpdr_device[*id].device_type = DEVICE_TYPE_PRINTER;
77                    g_rdpdr_device[*id].pdevice_data = (void *) pprinter_data;
78                    count++;
79                    (*id)++;
80    
81                    optarg = pos;
82            }
83            return count;
84    }
85    
86  static NTSTATUS  static NTSTATUS
87  printer_create(HANDLE * handle)  printer_create(uint32 device_id, uint32 access, uint32 share_mode, uint32 disposition, uint32 flags,
88                   char *filename, HANDLE * handle)
89  {  {
90          printer_fp = popen("lpr", "w");          char cmd[256];
91          *handle = 0;          PRINTER *pprinter_data;
92    
93            pprinter_data = (PRINTER *) g_rdpdr_device[device_id].pdevice_data;
94    
95            /* default printer name use default printer queue as well in unix */
96            if (pprinter_data->printer == "mydeskjet")
97            {
98                    pprinter_data->printer_fp = popen("lpr", "w");
99            }
100            else
101            {
102                    sprintf(cmd, "lpr -P %s", pprinter_data->printer);
103                    pprinter_data->printer_fp = popen(cmd, "w");
104            }
105    
106            g_rdpdr_device[device_id].handle = fileno(pprinter_data->printer_fp);
107            *handle = g_rdpdr_device[device_id].handle;
108          return STATUS_SUCCESS;          return STATUS_SUCCESS;
109  }  }
110    
111  static NTSTATUS  static NTSTATUS
112  printer_close(HANDLE handle)  printer_close(HANDLE handle)
113  {  {
114          pclose(printer_fp);          PRINTER *pprinter_data;
115    
116            pprinter_data = get_printer_data(handle);
117    
118            g_rdpdr_device[get_device_index(handle)].handle = 0;
119    
120            pclose(pprinter_data->printer_fp);
121    
122          return STATUS_SUCCESS;          return STATUS_SUCCESS;
123  }  }
124    
125  static NTSTATUS  static NTSTATUS
126  printer_write(HANDLE handle, uint8 * data, uint32 length, uint32 * result)  printer_write(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
127  {  {
128          *result = fwrite(data, 1, length, printer_fp);          PRINTER *pprinter_data;
129    
130            pprinter_data = get_printer_data(handle);
131            *result = length * fwrite(data, length, 1, pprinter_data->printer_fp);
132    
133            if (ferror(pprinter_data->printer_fp))
134            {
135                    *result = 0;
136                    return STATUS_INVALID_HANDLE;
137            }
138          return STATUS_SUCCESS;          return STATUS_SUCCESS;
139  }  }
140    

Legend:
Removed from v.435  
changed lines
  Added in v.580

  ViewVC Help
Powered by ViewVC 1.1.26