/[rdesktop]/sourceforge.net/trunk/rdesktop/printercache.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 /sourceforge.net/trunk/rdesktop/printercache.c

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

revision 608 by astrand, Sun Feb 15 21:19:28 2004 UTC revision 611 by n-ki, Mon Feb 23 08:13:52 2004 UTC
# Line 41  printercache_mkdir(char *base, char *pri Line 41  printercache_mkdir(char *base, char *pri
41  {  {
42          char *path;          char *path;
43    
44          path = (char *) xmalloc(strlen(base) + sizeof("/.rdesktop/rdpdr/") + strlen(printer));          path = (char *) xmalloc(strlen(base) + sizeof("/.rdesktop/rdpdr/") + strlen(printer) + 1);
45    
46          sprintf(path, "%s/.rdesktop", base);          sprintf(path, "%s/.rdesktop", base);
47          if ((mkdir(path, 0700) == -1) && errno != EEXIST)          if ((mkdir(path, 0700) == -1) && errno != EEXIST)
48          {          {
49                  perror(path);                  perror(path);
50                    xfree(path);
51                  return False;                  return False;
52          }          }
53    
# Line 54  printercache_mkdir(char *base, char *pri Line 55  printercache_mkdir(char *base, char *pri
55          if ((mkdir(path, 0700) == -1) && errno != EEXIST)          if ((mkdir(path, 0700) == -1) && errno != EEXIST)
56          {          {
57                  perror(path);                  perror(path);
58                    xfree(path);
59                  return False;                  return False;
60          }          }
61    
# Line 62  printercache_mkdir(char *base, char *pri Line 64  printercache_mkdir(char *base, char *pri
64          if ((mkdir(path, 0700) == -1) && errno != EEXIST)          if ((mkdir(path, 0700) == -1) && errno != EEXIST)
65          {          {
66                  perror(path);                  perror(path);
67                    xfree(path);
68                  return False;                  return False;
69          }          }
70    
# Line 69  printercache_mkdir(char *base, char *pri Line 72  printercache_mkdir(char *base, char *pri
72          return True;          return True;
73  }  }
74    
75    BOOL
76    printercache_unlink_blob(char *printer)
77    {
78            char *path;
79            char *home;
80    
81            if (printer == NULL)
82                    return False;
83    
84            home = getenv("HOME");
85            if (home == NULL)
86                    return False;
87    
88            path = (char *) xmalloc(strlen(home) + sizeof("/.rdesktop/rdpdr/") + strlen(printer) +
89                                    sizeof("/AutoPrinterCacheData") + 1);
90    
91            sprintf(path, "%s/.rdesktop/rdpdr/%s/AutoPrinterCacheData", home, printer);
92    
93            if (unlink(path) < 0)
94            {
95                    xfree(path);
96                    return False;
97            }
98    
99            sprintf(path, "%s/.rdesktop/rdpdr/%s", home, printer);
100    
101            if (rmdir(path) < 0)
102            {
103                    xfree(path);
104                    return False;
105            }
106    
107            xfree(path);
108            return True;
109    }
110    
111    
112    BOOL
113    printercache_rename_blob(char *printer, char *new_printer)
114    {
115            char *printer_path;
116            char *new_printer_path;
117            int printer_maxlen;
118    
119            char *home;
120    
121            if (printer == NULL)
122                    return False;
123    
124            home = getenv("HOME");
125            if (home == NULL)
126                    return False;
127    
128            printer_maxlen =
129                    (strlen(printer) >
130                     strlen(new_printer) ? strlen(printer) : strlen(new_printer)) + strlen(home) +
131                    sizeof("/.rdesktop/rdpdr/") + 1;
132    
133            printer_path = (char *) xmalloc(printer_maxlen);
134            new_printer_path = (char *) xmalloc(printer_maxlen);
135    
136            sprintf(printer_path, "%s/.rdesktop/rdpdr/%s", home, printer);
137            sprintf(new_printer_path, "%s/.rdesktop/rdpdr/%s", home, new_printer);
138    
139            printf("%s,%s\n", printer_path, new_printer_path);
140            if (rename(printer_path, new_printer_path) < 0)
141            {
142                    xfree(printer_path);
143                    xfree(new_printer_path);
144                    return False;
145            }
146    
147            xfree(printer_path);
148            xfree(new_printer_path);
149            return True;
150    }
151    
152    
153  int  int
154  printercache_load_blob(char *printer_name, uint8 ** data)  printercache_load_blob(char *printer_name, uint8 ** data)
155  {  {
# Line 86  printercache_load_blob(char *printer_nam Line 167  printercache_load_blob(char *printer_nam
167                  return 0;                  return 0;
168    
169          path = (char *) xmalloc(strlen(home) + sizeof("/.rdesktop/rdpdr/") + strlen(printer_name) +          path = (char *) xmalloc(strlen(home) + sizeof("/.rdesktop/rdpdr/") + strlen(printer_name) +
170                                  sizeof("/AutoPrinterCacheData"));                                  sizeof("/AutoPrinterCacheData") + 1);
171          sprintf(path, "%s/.rdesktop/rdpdr/%s/AutoPrinterCacheData", home, printer_name);          sprintf(path, "%s/.rdesktop/rdpdr/%s/AutoPrinterCacheData", home, printer_name);
172    
173          fd = open(path, O_RDONLY);          fd = open(path, O_RDONLY);
174          if (fd == -1)          if (fd == -1)
175            {
176                    xfree(path);
177                  return 0;                  return 0;
178            }
179    
180          if (fstat(fd, &st))          if (fstat(fd, &st))
181            {
182                    xfree(path);
183                  return 0;                  return 0;
184            }
185    
186          *data = (uint8 *) xmalloc(st.st_size);          *data = (uint8 *) xmalloc(st.st_size);
187          length = read(fd, *data, st.st_size);          length = read(fd, *data, st.st_size);
# Line 120  printercache_save_blob(char *printer_nam Line 207  printercache_save_blob(char *printer_nam
207                  return;                  return;
208    
209          path = (char *) xmalloc(strlen(home) + sizeof("/.rdesktop/rdpdr/") + strlen(printer_name) +          path = (char *) xmalloc(strlen(home) + sizeof("/.rdesktop/rdpdr/") + strlen(printer_name) +
210                                  sizeof("/AutoPrinterCacheData"));                                  sizeof("/AutoPrinterCacheData") + 1);
211          sprintf(path, "%s/.rdesktop/rdpdr/%s/AutoPrinterCacheData", home, printer_name);          sprintf(path, "%s/.rdesktop/rdpdr/%s/AutoPrinterCacheData", home, printer_name);
212    
213          fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);          fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
214          if (fd == -1)          if (fd == -1)
215          {          {
216                  perror(path);                  perror(path);
217                    xfree(path);
218                  return;                  return;
219          }          }
220    
# Line 149  printercache_process(STREAM s) Line 237  printercache_process(STREAM s)
237          in_uint32_le(s, type);          in_uint32_le(s, type);
238          switch (type)          switch (type)
239          {          {
240                          /*case 4: renaming of item old name and then new name */                  case 4: /* rename item */
241                          /*case 3: delete item name */                          in_uint8(s, printer_length);
242                  case 2:                          in_uint8s(s, 0x3);      // padding
243                            in_uint8(s, driver_length);
244                            in_uint8s(s, 0x3);      // padding
245    
246                            /* NOTE - 'driver' doesn't contain driver, it contains the new printer name */
247    
248                            rdp_in_unistr(s, printer, printer_length);
249                            rdp_in_unistr(s, driver, driver_length);
250    
251                            printercache_rename_blob(printer, driver);
252                            break;
253    
254                    case 3: /* delete item */
255                            in_uint8(s, printer_unicode_length);
256                            in_uint8s(s, 0x3);      // padding
257                            printer_length = rdp_in_unistr(s, printer, printer_unicode_length);
258                            printercache_unlink_blob(printer);
259                            break;
260    
261                    case 2: /* save printer data */
262                          in_uint32_le(s, printer_unicode_length);                          in_uint32_le(s, printer_unicode_length);
263                          in_uint32_le(s, blob_length);                          in_uint32_le(s, blob_length);
264    
# Line 162  printercache_process(STREAM s) Line 269  printercache_process(STREAM s)
269                          }                          }
270                          break;                          break;
271    
272                          /*case 1: */                  case 1: /* save device data */
273                          // TODO: I think this one just tells us what printer is on LPT? but why?                          in_uint8a(s, device_name, 5);   // get LPTx/COMx name
274    
275                            // need to fetch this data so that we can get the length of the packet to store.
276                            in_uint8s(s, 0x2);      // ???
277                            in_uint8s(s, 0x2)       // pad??
278                                    in_uint32_be(s, driver_length);
279                            in_uint32_be(s, printer_length);
280                            in_uint8s(s, 0x7)       // pad??
281                                    // next is driver in unicode
282                                    // next is printer in unicode
283                                    /* TODO: figure out how to use this information when reconnecting */
284                                    /* actually - all we need to store is the driver and printer */
285                                    /* and figure out what the first word is. */
286                                    /* rewind stream so that we can save this blob   */
287                                    /* length is driver_length + printer_length + 19 */
288                                    // rewind stream
289                                    s->p = s->p - 19;
290    
291                          //                          printercache_save_blob(device_name, s->p,
292                          // your name and the "users choice" of printer driver                                                 driver_length + printer_length + 19);
293                          // my guess is that you can store it and automagically reconnect                          break;
                         // the printer with correct driver next time.  
294                  default:                  default:
295    
296                          unimpl("RDPDR Printer Cache Packet Type: %d\n", type);                          unimpl("RDPDR Printer Cache Packet Type: %d\n", type);

Legend:
Removed from v.608  
changed lines
  Added in v.611

  ViewVC Help
Powered by ViewVC 1.1.26