source: branches/smbpdr-1.0/smb.c@ 758

Last change on this file since 758 was 758, checked in by Alex Taylor, 13 years ago

Auto-port numbers now generated in base 10 instead of base 4.
Implemented SplPdQuery/SplPdSet entrypoints, which are required for programs to create/configure ports.
Added sample program which demonstrates this (smbport.c). Added BLDLEVEL signature (uses MAKEDESC.CMD).

File size: 30.7 KB
Line 
1#define LINT_ARGS /* argument checking enabled */
2
3#define INCL_DOS
4#define INCL_GPI
5#undef INCL_GPI
6#define INCL_DEV
7#define INCL_DOSMEMMGR /* Include standard OS/2 support */
8#define INCL_DOSMODULEMGR /* For DosLoadModule */
9#define INCL_DOSPROCESS
10#define INCL_GPILCIDS
11#define INCL_WINCOMMON /* Include Window Management support */
12#define INCL_WINDOWMGR
13#define INCL_WINSWITCHLIST
14#define INCL_WINPROGRAMLIST
15#define INCL_WINMENUS
16#define INCL_WINWINDOWMGR
17#define INCL_WINMESSAGEMGR
18#define INCL_WINDIALOGS
19#define INCL_WINSTATICS
20#define INCL_WINLISTBOXES
21#define INCL_WINMENUS
22#define INCL_WINSYS
23#define INCL_WINFRAMEMGR
24#define INCL_INCLWINACCELERATORS
25#define INCL_WINPOINTERS
26#define INCL_WINERRORS
27#define INCL_WINSHELLDATA
28
29#define INCL_WINTYPES
30#define INCL_WINACCELERATORS
31#define INCL_WINBUTTONS
32#define INCL_WINENTRYFIELDS
33#define INCL_WINRECTANGLES
34#define INCL_WINTIMER
35#define INCL_WINSCROLLBARS
36#define INCL_WINHEAP
37#define INCL_SHLERRORS
38#define INCL_WININPUT
39#define INCL_WINHELP
40#define INCL_WINSTDSPIN
41
42#define INCL_SPL
43#define INCL_SPLP
44#define INCL_SPLERRORS
45#define INCL_SHLERRORS
46#define INCL_DOSERRORS
47#define INCL_WINHOOKS
48
49int acrtused=1; /* Define variable to say this is a DLL */
50
51#include <os2.h>
52
53#include <stdlib.h>
54#include <string.h>
55#include <ctype.h>
56#include <stdarg.h>
57#include <stdio.h>
58#include <stdlib.h>
59#include <process.h>
60#include "SMB.h"
61
62#define BIDI_SET_PORTDRV 0x00000019
63#define BIDI_Q_PORTDRV 0x00008019
64
65
66/* Password encryption/decryption routines from ndpsmb.c */
67
68static unsigned char fromhex (char c)
69{
70 if ('0' <= c && c <= '9')
71 {
72 return c - '0';
73 }
74
75 if ('A' <= c && c <= 'F')
76 {
77 return c - 'A' + 0xA;
78 }
79
80 if ('a' <= c && c <= 'f')
81 {
82 return c - 'a' + 0xA;
83 }
84
85 return 0;
86}
87
88static char tohex (unsigned char b)
89{
90 b &= 0xF;
91
92 if (b <= 9)
93 {
94 return b + '0';
95 }
96
97 return 'A' + (b - 0xA);
98}
99
100static void decryptPassword (const char *pszCrypt, char *pszPlain)
101{
102 /* A simple "decryption", character from the hex value. */
103 const char *s = pszCrypt;
104 char *d = pszPlain;
105
106 while (*s)
107 {
108 *d++ = (char)((fromhex (*s++) << 4) + fromhex (*s++));
109 }
110
111 *d++ = 0;
112}
113
114static void encryptPassword (const char *pszPlain, char *pszCrypt)
115{
116 /* A simple "encryption" encode each character as hex value. */
117 const char *s = pszPlain;
118 char *d = pszCrypt;
119
120 while (*s)
121 {
122 *d++ = tohex ((*s) >> 4);
123 *d++ = tohex (*s);
124 s++;
125 }
126
127 *d++ = 0;
128}
129
130//
131// If port driver is not defined in INI file yet
132// assume it exists in the boot drive's \OS2\DLL directory
133//
134
135CHAR szDefaultPortDrvPath[] = { PATH_SMB_PDR };
136
137
138//
139// Below definition of PORTNAMES structure should be defined in
140// common header file pmspl.h.
141//
142
143typedef struct _PORTNAMES
144{
145 PSZ pszPortName; /* -> name of port(ie "LPT1) */
146 PSZ pszPortDesc; /* -> description of port(ie "Parallel Port 1") */
147} PORTNAMES, *PPORTNAMES;
148
149/* Alex Taylor's new version of lprtok() that can handle missing fields */
150char * lprtok (char *string,char *control)
151{
152 char *c;
153 static char *next;
154
155 if ( control == NULL ) return string;
156 if ( string == NULL ) string = next;
157 if ( string == NULL ) return NULL;
158
159 if (( c = strpbrk( string, control )) == NULL ) {
160 next = NULL;
161 }
162 else {
163 next = c+1;
164 *c = '\0';
165 }
166
167 return ( string );
168}
169MRESULT EXPENTRY CommDlg( HWND hDlg, USHORT msg, MPARAM mp1, MPARAM mp2 )
170{
171 PLPRDATA pLprData;
172 ULONG ulTimeOut = 0 ;
173 CHAR szDesc[ STR_LEN_PORTDESC ];
174 CHAR szShareName[ STR_LEN_PORTDESC ];
175 CHAR szTitle[ STR_LEN_TITLE + 1];
176 CHAR szTemp[ STR_LEN_PORTDESC ];
177 CHAR pwBuffer[256];
178 USHORT i;
179 ULONG rc = 0;
180 PUCHAR token;
181
182 switch (msg)
183 {
184 case WM_INITDLG:
185 WinSendDlgItemMsg(hDlg,ID_BINARY,BM_SETCHECK,MPFROM2SHORT(1,0),NULL);
186 pLprData = (PLPRDATA)mp2;
187 WinSetWindowULong (hDlg, QWL_USER, (ULONG)pLprData);
188 if (PrfQueryProfileString (HINI_SYSTEMPROFILE,
189 pLprData->pszAppName,
190 KEY_DESCRIPTION,
191 NULL,
192 (PSZ)szDesc,
193 STR_LEN_PORTDESC))
194 {
195 WinSetWindowText (WinWindowFromID (hDlg, (USHORT)IDD_SMB),szDesc);
196 rc = WinLoadString(pLprData->hAB,
197 pLprData->hModule,
198 PDR_ID_PROPERTIES,
199 STR_LEN_PORTDESC, szTemp);
200 if (rc) {
201 strcpy ( szTitle, pLprData->pszPortName );
202 strcat ( szTitle, " - " );
203 strcat ( szTitle, szTemp );
204 WinSetWindowText (hDlg, szTitle);
205 }
206 }
207 if (PrfQueryProfileString (HINI_SYSTEMPROFILE,
208 pLprData->pszAppName,
209 KEY_INITIALIZATION,
210 NULL,
211 szTemp,
212 sizeof(szTemp)))
213 {
214 i = 0;
215 token = lprtok(szTemp,"#");
216 while (token != NULL)
217 {
218 switch(i)
219 {
220 case 0:
221 WinSetDlgItemText(hDlg,ID_IP,token);
222 case 1:
223 if (token[ strlen(token) - 1 ] == ';')
224 token[ strlen(token)-1 ] = '\0';
225 WinSetDlgItemText(hDlg,ID_SMBQUEUE,token);
226 break;
227 case 2:
228 if (token[ strlen(token) - 1 ] == ';')
229 token[ strlen(token)-1 ] = '\0';
230 WinSetDlgItemText(hDlg,ID_WORKGROUP,token);
231 break;
232 case 3:
233 if (token[ strlen(token) - 1 ] == ';')
234 token[ strlen(token)-1 ] = '\0';
235 WinSetDlgItemText(hDlg,ID_USER,token);
236 break;
237 case 4:
238 if (token[ strlen(token) - 1 ] == ';')
239 token[ strlen(token)-1 ] = '\0';
240 WinSetDlgItemText(hDlg,ID_COPIES,token);
241 break;
242
243 case 5:
244 if (token[ strlen(token) - 1 ] == ';')
245 token[ strlen(token)-1 ] = '\0';
246 strcpy(pwBuffer,token);
247 decryptPassword(pwBuffer,token);
248 WinSetDlgItemText(hDlg,ID_PASSWORD,token);
249 break;
250 }
251 i++;
252 token = lprtok(NULL,"#");
253 }
254 }
255 break;
256
257 case WM_COMMAND:
258 pLprData = (PLPRDATA)WinQueryWindowULong (hDlg, QWL_USER);
259 switch (SHORT1FROMMP(mp1))
260 {
261 case DID_OK:
262 sprintf(szDesc,"\\");
263 /* Servername | IP */
264 WinQueryDlgItemText (hDlg, ID_IP, sizeof(szTemp), szTemp );
265 sprintf(pLprData->szSaveLprSetting,"%s",szTemp);
266 strncpy(szShareName, szTemp, STR_LEN_PORTDESC - 1);
267 /* Printername | Queue */
268 WinQueryDlgItemText (hDlg, ID_SMBQUEUE, sizeof(szTemp), szTemp );
269 strcat(pLprData->szSaveLprSetting,"#");
270 strcat(pLprData->szSaveLprSetting,szTemp);
271 if (strlen(szTemp) > 0) {
272 strncat(szShareName, "\\", STR_LEN_PORTDESC - 1);
273 strncat(szShareName, szTemp, STR_LEN_PORTDESC - 1);
274 }
275 /* Workgroup */
276 WinQueryDlgItemText (hDlg, ID_WORKGROUP, sizeof(szTemp), szTemp );
277 strcat(pLprData->szSaveLprSetting,"#");
278 strcat(pLprData->szSaveLprSetting,szTemp);
279 if (strlen(szTemp) > 0) {
280 strncat(szDesc, "\\", STR_LEN_PORTDESC - 1);
281 strncat(szDesc, szTemp, STR_LEN_PORTDESC - 1);
282 }
283 strncat(szDesc, "\\", STR_LEN_PORTDESC - 1);
284 strncat(szDesc, szShareName, STR_LEN_PORTDESC - 1);
285 /* Username */
286 WinQueryDlgItemText (hDlg, ID_USER, sizeof(szTemp), szTemp );
287 strcat(pLprData->szSaveLprSetting,"#");
288 strcat(pLprData->szSaveLprSetting,szTemp);
289 /* Number of copies */
290 WinQueryDlgItemText (hDlg, ID_COPIES, sizeof(szTemp), szTemp );
291 strcat(pLprData->szSaveLprSetting,"#");
292 strcat(pLprData->szSaveLprSetting,szTemp);
293 /* Password - must be the last item! */
294 WinQueryDlgItemText (hDlg, ID_PASSWORD, sizeof(szTemp), szTemp );
295 strcat(pLprData->szSaveLprSetting,"#");
296 strcpy(pwBuffer,szTemp);
297 encryptPassword(pwBuffer,szTemp);
298 strcat(pLprData->szSaveLprSetting,szTemp);
299
300 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
301 pLprData->pszAppName,
302 KEY_INITIALIZATION,
303 pLprData->szSaveLprSetting))
304 WinDismissDlg(hDlg, MBID_CANCEL);
305
306 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
307 APPNAME_PM_SPOOLER_PORT,
308 pLprData->pszPortName,
309 pLprData->szSaveLprSetting))
310 WinDismissDlg(hDlg, MBID_CANCEL);
311
312 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
313 pLprData->pszAppName,
314 KEY_DESCRIPTION,
315 szDesc ))
316 WinDismissDlg(hDlg, MBID_CANCEL);
317
318 WinDismissDlg(hDlg, TRUE);
319 break;
320 case DID_CANCEL:
321 WinDismissDlg(hDlg, MBID_CANCEL);
322 break;
323 }
324 break;
325 default:
326 return WinDefDlgProc(hDlg, msg, mp1, mp2) ;
327 break;
328 }
329return FALSE;
330}
331ULONG CalcStructLength ( HAB hab,
332 HMODULE hModule,
333 USHORT usID )
334{
335 ULONG cbRequired;
336 CHAR chString[STR_LEN_PORTDESC];
337
338 cbRequired = 0;
339
340 WinLoadString(hab, hModule, usID, STR_LEN_PORTDESC, chString);
341 cbRequired += strlen (chString) + 1;
342 WinLoadString(hab, hModule, (USHORT)(usID + 1), STR_LEN_PORTDESC, chString);
343 cbRequired += strlen (chString) + 1;
344 cbRequired += sizeof (PORTNAMES);
345 return(cbRequired);
346}
347
348ULONG CalcBufLength ( HAB hab,
349 HMODULE hModule )
350{
351 ULONG cbRequired;
352 USHORT usID;
353
354 cbRequired = 0;
355
356 /*
357 ** calculate length required to fit all the port info.
358 */
359 for (usID = PORT_ID_FIRST; usID <= PORT_ID_LAST; usID += 2)
360 {
361 cbRequired += CalcStructLength (hab, hModule, usID);
362 }
363
364 return(cbRequired);
365}
366
367ULONG NumPortsCanFit ( HAB hab,
368 HMODULE hModule,
369 ULONG cbBuf )
370{
371 ULONG cbRequired;
372 USHORT usID;
373 ULONG ulNumPort;
374
375 cbRequired = 0;
376 ulNumPort = 0;
377
378 /*
379 ** calculate how many ports we can fit in buf.
380 */
381 for (usID = PORT_ID_FIRST; usID <= PORT_ID_LAST; usID += 2)
382 {
383 cbRequired += CalcStructLength (hab, hModule, usID);
384 if (cbRequired > cbBuf)
385 {
386 return(ulNumPort);
387 }
388 ulNumPort++;
389 }
390
391 return(ulNumPort);
392}
393VOID CopyStruct ( HAB hab,
394 HMODULE hModule,
395 USHORT usID,
396 PCH pBuf,
397 PULONG pulBeginStruct,
398 PULONG pulBeginText )
399{
400 PPORTNAMES pPortNames;
401
402 pPortNames = (PPORTNAMES)(pBuf + *pulBeginStruct);
403 *pulBeginStruct += sizeof (PORTNAMES);
404
405 /*
406 ** copy port name in the structure
407 */
408 pPortNames->pszPortName = pBuf + *pulBeginText;
409 WinLoadString(hab, hModule, usID, STR_LEN_PORTDESC, pPortNames->pszPortName);
410 *pulBeginText += strlen (pPortNames->pszPortName) + 1;
411
412 /*
413 ** copy port description to the structure
414 */
415 pPortNames->pszPortDesc = pBuf + *pulBeginText;
416 WinLoadString(hab, hModule, usID, STR_LEN_PORTDESC, pPortNames->pszPortDesc);
417 *pulBeginText += strlen (pPortNames->pszPortDesc) + 1;
418}
419VOID CopyNPorts ( HAB hab,
420 HMODULE hModule,
421 PCH pBuf,
422 ULONG ulReturned )
423{
424 USHORT usID;
425 ULONG ulBeginText;
426 ULONG ulBeginStruct;
427
428 ulBeginText = ulReturned * sizeof (PORTNAMES);
429 ulBeginStruct = 0;
430
431 for (usID = PORT_ID_FIRST;
432 usID <= PORT_ID_LAST && ulReturned;
433 usID += 2, --ulReturned)
434 {
435 CopyStruct (hab, hModule, usID, pBuf, &ulBeginStruct, &ulBeginText);
436 }
437}
438
439ULONG OpenLprPortDlg ( HAB hab,
440 HMODULE hModule,
441 PSZ pszPortName,
442 PSZ pszAppName )
443{
444 LPRDATA LprData;
445
446 memset (&LprData, 0, sizeof (LPRDATA));
447 LprData.hAB = hab;
448 LprData.hModule = hModule;
449 LprData.pszPortName = pszPortName;
450 LprData.pszAppName = pszAppName;
451
452 WinDlgBox (HWND_DESKTOP,
453 HWND_DESKTOP,
454 (PFNWP)CommDlg,
455 (HMODULE)hModule,
456 IDD_SMB,
457 &LprData);
458
459 return LprData.lfModified;
460}
461BOOL GetPortDescription ( HAB hab,
462 HMODULE hModule,
463 PSZ pszPortName,
464 PSZ pszPortDesc )
465{
466 USHORT usID;
467 CHAR chBuf[STR_LEN_PORTDESC] = {0};
468
469 for (usID = PORT_ID_FIRST; usID <= PORT_ID_LAST; usID += 2)
470 {
471 WinLoadString(hab, hModule, usID, STR_LEN_PORTNAME, chBuf);
472 if (!strcmp (pszPortName, chBuf))
473 {
474 if ( WinLoadString(hab, hModule, usID+1, STR_LEN_PORTDESC, chBuf) ) {
475 strcpy (pszPortDesc, chBuf);
476 return(TRUE);
477 }
478 break;
479 }
480 }
481 return(FALSE);
482}
483BOOL GenerateUniquePortName( PSZ pszPortName )
484{
485 BOOL fPortExists;
486 PSZ pszEndPortName;
487 USHORT i;
488 CHAR chPortData[STR_LEN_PORTNAME];
489
490 /*
491 ** Generate a unique port name by adding numbers to the
492 ** end of pszPortName
493 */
494 pszEndPortName = pszPortName + strlen( pszPortName );
495 i = 1;
496 fPortExists = TRUE;
497 while ( (i < MAX_PORTS) && fPortExists )
498 {
499 _itoa( i, pszEndPortName, 10);
500 fPortExists = PrfQueryProfileString (HINI_SYSTEMPROFILE,
501 APPNAME_PM_SPOOLER_PORT,
502 pszPortName,
503 NULL,
504 chPortData,
505 sizeof(chPortData) - 1);
506 i++;
507 }
508 return(!fPortExists);
509}
510APIRET APIENTRY SplPdEnumPort ( HAB hab,
511 PVOID pBuf,
512 ULONG cbBuf,
513 PULONG pulReturned,
514 PULONG pulTotal,
515 PULONG pcbRequired )
516
517{
518 HMODULE hModule;
519 ULONG ulBootDrive;
520 ULONG rcLoadMod;
521 CHAR szPathName[260];
522
523 if (!pulReturned ||
524 !pulTotal ||
525 !pcbRequired)
526 {
527 return(ERROR_INVALID_PARAMETER);
528 }
529
530 if (!pBuf && cbBuf)
531 {
532 return(ERROR_INVALID_PARAMETER);
533 }
534
535 DosQuerySysInfo (QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive,
536 sizeof (ULONG));
537 szDefaultPortDrvPath[0] = (CHAR)(ulBootDrive + 'A' - 1);
538
539 PrfQueryProfileString (HINI_SYSTEMPROFILE,
540 "PM_PORT_DRIVER",
541 "SMB",
542 szDefaultPortDrvPath,
543 szPathName,
544 256 );
545
546 rcLoadMod = DosLoadModule (NULL, 0, szPathName, &hModule);
547
548 if (cbBuf == 0L)
549 {
550 *pulReturned = 0;
551 *pcbRequired = CalcBufLength (hab, hModule);
552 *pulTotal = MAX_PORTS;
553 if (!rcLoadMod)
554 DosFreeModule (hModule);
555 return(ERROR_MORE_DATA);
556 }
557
558 /*
559 ** check number of ports info we can fit in supplied buffer
560 */
561 *pulTotal = MAX_PORTS;
562 *pcbRequired = CalcBufLength (hab, hModule);
563 *pulReturned = NumPortsCanFit (hab, hModule, cbBuf);
564
565 /*
566 ** return error if we can not fit one port.
567 */
568 if (!(*pulReturned))
569 {
570 if (!rcLoadMod)
571 DosFreeModule (hModule);
572 return(ERROR_INSUFFICIENT_BUFFER);
573 }
574
575 /*
576 ** copy all the ports which we can store in the pBuf
577 */
578 CopyNPorts (hab, hModule, (PCH)pBuf, *pulReturned);
579
580 /*
581 ** Free the module - we do not need it any more.
582 */
583 if (!rcLoadMod)
584 DosFreeModule (hModule);
585
586 /*
587 ** copy all the ports which we can store in the pBuf
588 */
589 if (*pulReturned < *pulTotal)
590 {
591 return(ERROR_MORE_DATA);
592 }
593
594 return(NO_ERROR);
595}
596APIRET APIENTRY SplPdInstallPort ( HAB hab,
597 PSZ pszPortName )
598{
599 CHAR chBuf[STR_LEN_PORTNAME];
600 CHAR chPortDesc[STR_LEN_PORTDESC];
601 ULONG ulBootDrive;
602 HMODULE hModule;
603 CHAR szPathName[260]; /* will contain full path to this port driver */
604
605 if (!pszPortName)
606 {
607 return(ERROR_INVALID_PARAMETER);
608 }
609 strcpy(szDefaultPortDrvPath,PATH_SMB_PDR);
610 DosQuerySysInfo (QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive,
611 sizeof (ULONG));
612 szDefaultPortDrvPath[0] = (CHAR)(ulBootDrive + 'A' - 1);
613 strcpy( szPathName, szDefaultPortDrvPath );
614
615 /* Make sure the port driver itself is installed */
616 PrfWriteProfileString (HINI_SYSTEMPROFILE,
617 "PM_PORT_DRIVER",
618 "SMB",
619 szDefaultPortDrvPath);
620
621 /* Generate appname for "PM_SMBx" */
622 strcpy (chBuf, APPNAME_LEAD_STR);
623 strcat (chBuf, pszPortName);
624
625 /*
626 ** Check for this being our default Port Name to install.
627 ** If so (pszPortName == "SMB") then generate a unique
628 ** port name so that we can install multiple SMB printers.
629 */
630 if (!strcmp(pszPortName, DEF_PORTNAME))
631 {
632 /*
633 ** Use chBuf to store the new portname to install
634 ** Must first increment past "PM_" in chBuf
635 */
636 pszPortName = chBuf + 3;
637 GenerateUniquePortName( pszPortName );
638 }
639
640 /* Get initial port description (fall back to portname if unavailable) */
641 hModule = 0L ; /* Init module handle to null */
642 DosLoadModule (NULL, 0, szPathName, &hModule);
643 if (!GetPortDescription (hab, hModule, pszPortName, chPortDesc))
644 {
645 strcpy( chPortDesc, pszPortName );
646 }
647 DosFreeModule (hModule);
648
649 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
650 chBuf,
651 KEY_DESCRIPTION,
652 chPortDesc))
653 {
654 return (WinGetLastError (hab));
655 }
656
657 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
658 chBuf,
659 KEY_INITIALIZATION,
660 DEF_INITIALIZATION))
661 {
662 return (WinGetLastError (hab));
663 }
664
665 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
666 chBuf,
667 KEY_TERMINATION,
668 DEF_TERMINATION))
669 {
670 return (WinGetLastError (hab));
671 }
672
673 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
674 chBuf,
675 KEY_PORTDRIVER,
676 DEF_PORTDRIVER))
677 {
678 return (WinGetLastError (hab));
679 }
680
681 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
682 chBuf,
683 KEY_TIMEOUT,
684 DEF_TIMEOUT))
685 {
686 return (WinGetLastError (hab));
687 }
688 if (!PrfWriteProfileString (HINI_SYSTEMPROFILE,
689 APPNAME_PM_SPOOLER_PORT,
690 pszPortName,
691 DEF_INITIALIZATION))
692 {
693 return (WinGetLastError (hab));
694 }
695 return(NO_ERROR);
696}
697BOOL APIENTRY SplPdGetPortIcon ( HAB hab,
698 PULONG idIcon )
699{
700 if (idIcon)
701 {
702 *idIcon = SMB_ICON;
703 }
704 return(TRUE);
705}
706APIRET APIENTRY SplPdQueryPort ( HAB hab,
707 PSZ pszPortName,
708 PVOID pBufIn,
709 ULONG cbBuf,
710 PULONG cItems )
711{
712 HMODULE hModule;
713 CHAR chString[STR_LEN_DESC];
714 USHORT usNumLines;
715 USHORT usLineID;
716 USHORT usStrLength;
717 ULONG ulBootDrive;
718 PCH pBuf = pBufIn;
719 CHAR szPathName[260]; /* will contain full path to this port driver */
720
721 if (!cItems)
722 {
723 return(ERROR_INVALID_PARAMETER);
724 }
725
726 if (!pBuf || !cbBuf)
727 {
728 return(ERROR_INVALID_PARAMETER);
729 }
730
731
732 DosQuerySysInfo (QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive,
733 sizeof (ULONG));
734 szDefaultPortDrvPath[0] = (CHAR)(ulBootDrive + 'A' - 1);
735
736 PrfQueryProfileString (HINI_SYSTEMPROFILE,
737 "PM_PORT_DRIVER",
738 "SMB",
739 szDefaultPortDrvPath,
740 szPathName,
741 256 );
742
743 hModule = 0L ;
744
745 DosLoadModule (NULL, 0, szPathName, &hModule);
746
747 chString[0] = '\0' ;
748
749 WinLoadString(hab, hModule, (USHORT)ID_NUMBER_OF_DESC_LINES, STR_LEN_DESC,
750 chString);
751 usNumLines = (USHORT)atoi (chString);
752 usLineID = ID_FIRST_DESC_LINES;
753 for (*cItems = 0; *cItems < usNumLines; *cItems++)
754 {
755 WinLoadString(hab, hModule, usLineID, STR_LEN_DESC, chString);
756 if (cbBuf >= (usStrLength = (USHORT)(strlen (chString) + 1)))
757 {
758 strcpy (pBuf, chString);
759 pBuf += usStrLength;
760 cbBuf -= usStrLength;
761 }
762 else
763 {
764 DosFreeModule (hModule);
765 return(ERROR_INSUFFICIENT_BUFFER);
766 }
767 }
768 DosFreeModule (hModule);
769 return(NO_ERROR);
770}
771APIRET APIENTRY SplPdSetPort ( HAB hab,
772 PSZ pszPortName,
773 PULONG flModified )
774{
775 CHAR chBuf[STR_LEN_PORTNAME];
776 CHAR chPortDriver[STR_LEN_PORTNAME];
777 ULONG ulBootDrive;
778 HMODULE hModule;
779 CHAR szPathName[260]; /* will contain full path to this port driver */
780
781 if (!pszPortName || !flModified)
782 {
783 return(ERROR_INVALID_PARAMETER);
784 }
785
786 strcpy (chBuf, APPNAME_LEAD_STR);
787 strcat (chBuf, pszPortName);
788
789 if (!(PrfQueryProfileString (HINI_SYSTEMPROFILE, chBuf,
790 KEY_PORTDRIVER, NULL, chPortDriver,
791 STR_LEN_PORTNAME)))
792 {
793 return(ERROR_INVALID_PARAMETER);
794 }
795
796 if (strcmp (chPortDriver, DEF_PORTDRIVER))
797 {
798 return(ERROR_INVALID_PARAMETER);
799 }
800
801 DosQuerySysInfo (QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive,
802 sizeof (ULONG));
803 szDefaultPortDrvPath[0] = (CHAR)(ulBootDrive + 'A' - 1);
804
805 PrfQueryProfileString (HINI_SYSTEMPROFILE,
806 "PM_PORT_DRIVER",
807 "SMB",
808 szDefaultPortDrvPath,
809 szPathName,
810 256 );
811
812 hModule = 0L ; /* Init module handle to null */
813
814 DosLoadModule (NULL, 0, szPathName, &hModule);
815
816 *flModified = OpenLprPortDlg (hab, hModule, pszPortName, chBuf);
817
818 DosFreeModule (hModule);
819 return(NO_ERROR);
820}
821
822
823APIRET APIENTRY SplPdRemovePort ( HAB hab,
824 PSZ pszPortName )
825{
826 CHAR chBuf[STR_LEN_PORTNAME];
827 CHAR chPortDriver[STR_LEN_PORTNAME];
828
829 if (!pszPortName)
830 {
831 return(ERROR_INVALID_PARAMETER);
832 }
833
834 strcpy (chBuf, APPNAME_LEAD_STR);
835 strcat (chBuf, pszPortName);
836
837 if (!(PrfQueryProfileString (HINI_SYSTEMPROFILE, chBuf,
838 KEY_PORTDRIVER, NULL, chPortDriver,
839 STR_LEN_PORTNAME)))
840 {
841 return(ERROR_INVALID_PARAMETER);
842 }
843
844 if (strcmp (chPortDriver, DEF_PORTDRIVER))
845 {
846 return(ERROR_INVALID_PARAMETER);
847 }
848
849 PrfWriteProfileString (HINI_SYSTEMPROFILE, chBuf, NULL, NULL);
850
851 PrfWriteProfileString (HINI_SYSTEMPROFILE,
852 APPNAME_PM_SPOOLER_PORT,
853 pszPortName,
854 NULL);
855 return(NO_ERROR);
856
857}
858ULONG APIENTRY SplPdOpen( PSZ pszPortName,
859 PHFILE phFile,
860 PULONG pDeviceFlags,
861 PVOID pPrtOpenStruct)
862{
863 APIRET rc;
864 ULONG ulAction = 0; /* Action taken by DosOpen */
865 ULONG ulBytesRead = 0; /* Number of bytes read by DosRead */
866 ULONG ulWrote = 0; /* Number of bytes written by DosWrite */
867 ULONG ulLocal = 0; /* File pointer position after DosSetFilePtr */
868 CHAR szTemp[ 256];
869 UCHAR tmp[256];
870 ULONG pcbWritten ;
871 USHORT i;
872 HFILE control;
873 UCHAR filename[256];
874 DATETIME dt;
875 UCHAR spool_dir[256];
876 PEAOP2 pEABuf = NULL;
877/* UCHAR pszPSHeader[] = "%!PS-Adobe-3.0\n";
878 ULONG cbHeader; */
879
880
881 if (!phFile || !pDeviceFlags )
882 {
883 return(ERROR_INVALID_PARAMETER);
884 }
885 DosGetDateTime(&dt);
886 rc = PrfQueryProfileString (HINI_SYSTEMPROFILE,
887 "PM_SPOOLER",
888 "DIR",
889 NULL,
890 (PSZ)spool_dir,
891 sizeof(spool_dir));
892 spool_dir[ strlen(spool_dir) - 1] = '\0';
893 sprintf(tmp,"%s\\SMB",spool_dir);
894 DosCreateDir( tmp,pEABuf );
895 sprintf(filename,"%s\\SMB\\%02d_%02d_%02d_%02d_%s",spool_dir,dt.hours,dt.minutes,dt.seconds,dt.hundredths,pszPortName);
896 rc = DosOpen(filename,
897 phFile, /* File handle */
898 &ulAction, /* Action taken */
899 100L, /* File primary allocation */
900 FILE_ARCHIVED | FILE_NORMAL, /* File attribute */
901 OPEN_ACTION_CREATE_IF_NEW |
902 OPEN_ACTION_OPEN_IF_EXISTS, /* Open function type */
903 OPEN_FLAGS_NOINHERIT |
904 OPEN_SHARE_DENYNONE |
905 OPEN_ACCESS_READWRITE, /* Open mode of the file */
906 0L); /* No extended attribute */
907/* DosWrite(*phFile,pszPSHeader,strlen(pszPSHeader),&cbHeader); */
908 sprintf(szTemp,"PM_%s",pszPortName);
909 if (PrfQueryProfileString (HINI_SYSTEMPROFILE,
910 szTemp,
911 KEY_INITIALIZATION,
912 NULL,
913 szTemp,
914 sizeof(szTemp)))
915 {
916 sprintf(tmp ,"%s\\SMB\\%d.control",spool_dir,*phFile);
917 rc = DosOpen( tmp ,
918 &control, /* File handle */
919 &ulAction, /* Action taken */
920 strlen(szTemp), /* File primary allocation */
921 FILE_ARCHIVED | FILE_NORMAL, /* File attribute */
922 OPEN_ACTION_CREATE_IF_NEW |
923 OPEN_ACTION_OPEN_IF_EXISTS, /* Open function type */
924 OPEN_FLAGS_NOINHERIT |
925 OPEN_SHARE_DENYNONE |
926 OPEN_ACCESS_READWRITE, /* Open mode of the file */
927 0L); /* No extended attribute */
928 rc = DosWrite( control,szTemp,strlen(szTemp),&pcbWritten);
929 rc = DosWrite( control,"#",1,&pcbWritten);
930 rc = DosWrite( control,filename,strlen(filename),&pcbWritten);
931 rc = DosWrite( control,"@",1,&pcbWritten);
932 rc = DosClose(control);
933 }
934return rc;
935
936}
937#if 1
938ULONG APIENTRY SplPdQuery ( PSZ pszPortName,
939 ULONG ulFlags,
940 ULONG ulCommand,
941 PVOID pInData,
942 ULONG cbInData,
943 PVOID pOutData,
944 PULONG pcbOutData )
945{
946 PPORTSETTINGS pSettings;
947 CHAR szAppName[ STR_LEN_PORTNAME ];
948 ULONG rc;
949
950 // Generate appname for "PM_SMBx"
951 strcpy( szAppName, APPNAME_LEAD_STR);
952 strncat( szAppName, pszPortName, STR_LEN_PORTNAME-1 );
953
954 switch ( ulCommand ) {
955
956 case BIDI_Q_PORTDRV:
957 // Make sure the data is valid
958 if ( !pOutData || *pcbOutData < sizeof( PORTSETTINGS ))
959 return( ERROR_INVALID_PARAMETER );
960 pSettings = (PPORTSETTINGS) pOutData;
961
962 PrfQueryProfileString( HINI_SYSTEMPROFILE, szAppName,
963 KEY_INITIALIZATION, NULL,
964 pSettings->szPortData, STR_LEN_PORTDESC );
965 *pcbOutData = sizeof( PORTSETTINGS );
966 rc = NO_ERROR;
967 break;
968
969 default:
970 rc = ERROR_NOT_SUPPORTED;
971 //rc = NO_ERROR;
972 break;
973 }
974
975 return ( rc );
976}
977ULONG APIENTRY SplPdSet ( PSZ pszPortName,
978 ULONG ulFlags,
979 ULONG ulCommand,
980 PVOID pInData,
981 ULONG cbInData )
982{
983 PPORTSETTINGS pSettings;
984 CHAR szIniStr[ STR_LEN_PORTDESC ] = {0};
985 CHAR szAppName[ STR_LEN_PORTNAME ];
986 PSZ token;
987 ULONG rc;
988
989 // Generate appname for "PM_CUPSx"
990 strcpy( szAppName, APPNAME_LEAD_STR);
991 strncat( szAppName, pszPortName, STR_LEN_PORTNAME-1 );
992
993 switch ( ulCommand ) {
994
995 case BIDI_SET_PORTDRV:
996 // Validate the data
997 if ( !pInData || cbInData < sizeof( PORTSETTINGS ))
998 return( ERROR_INVALID_PARAMETER );
999 pSettings = (PPORTSETTINGS) pInData;
1000 // Update the INITIALIZATION string
1001 PrfWriteProfileString( HINI_SYSTEMPROFILE, szAppName,
1002 KEY_INITIALIZATION, pSettings->szPortData );
1003 PrfWriteProfileString( HINI_SYSTEMPROFILE, APPNAME_PM_SPOOLER_PORT,
1004 pszPortName, pSettings->szPortData );
1005 // Update the DESCRIPTION string
1006 if (( token = lprtok( pSettings->szPortData, "#")) != NULL ) {
1007 strncpy( szIniStr, token, STR_LEN_PORTDESC-1 );
1008 if (( token = lprtok( NULL, "#")) != NULL ) {
1009 if ( token[ strlen(token) - 1 ] == ';')
1010 token[ strlen(token) - 1 ] = '\0';
1011 strncat( szIniStr, ":", STR_LEN_PORTDESC-1 );
1012 strncat( szIniStr, token, STR_LEN_PORTDESC-1 );
1013 }
1014 }
1015 PrfWriteProfileString( HINI_SYSTEMPROFILE,
1016 szAppName, KEY_DESCRIPTION, szIniStr );
1017 rc = NO_ERROR;
1018 break;
1019
1020 default:
1021 //rc = ERROR_NOT_SUPPORTED;
1022 rc = NO_ERROR;
1023 break;
1024 }
1025 return ( rc );
1026
1027}
1028#else
1029ULONG APIENTRY SplPdQuery ( PSZ pszDeviceName,
1030 ULONG ulFlags,
1031 ULONG ulCommand,
1032 PVOID pInData,
1033 ULONG cbInData,
1034 PVOID pOutData,
1035 PULONG pcbOutData )
1036{
1037/* return ERROR_NOT_SUPPORTED; */
1038 return NO_ERROR;
1039}
1040ULONG APIENTRY SplPdSet ( PSZ pszDeviceName,
1041 ULONG ulFlags,
1042 ULONG ulCommand,
1043 PVOID pInData,
1044 ULONG cbInData )
1045{
1046/* return ERROR_NOT_SUPPORTED; */
1047 return NO_ERROR;
1048}
1049#endif
1050ULONG APIENTRY SplPdNewPage ( HFILE hFile, ULONG ulPageNumber )
1051{
1052 return NO_ERROR;
1053}
1054ULONG APIENTRY SplPdAbortDoc( HFILE hFile,
1055 PVOID pchData,
1056 ULONG cbData,
1057 ULONG ulFlags )
1058{
1059 return NO_ERROR;
1060}
1061ULONG APIENTRY SplPdClose( HFILE hFile )
1062{
1063 APIRET rc;
1064 APIRET resp;
1065 USHORT i;
1066 USHORT j;
1067 RESULTCODES rc_child;
1068 ULONG nbr_lu;
1069 ULONG ulAction;
1070 UCHAR szTemp[256];
1071 HFILE control;
1072 UCHAR binfile[256];
1073 UCHAR arg[256];
1074 UCHAR j_url[256] ;
1075 UCHAR j_id[3];
1076 UCHAR j_user[256];
1077 UCHAR j_title[256];
1078 UCHAR j_copies[3];
1079 UCHAR j_options[8];
1080 UCHAR filename[256];
1081 UCHAR ip_add[256];
1082 UCHAR queue_name[256];
1083 UCHAR workgroup[256];
1084 UCHAR username[256];
1085 UCHAR password_enc[256];
1086 UCHAR password_dec[256];
1087 UCHAR errorstr[256];
1088 USHORT pos;
1089 UCHAR spool_dir[256];
1090 ULONG ulBootDrive;
1091
1092 rc = PrfQueryProfileString (HINI_SYSTEMPROFILE,
1093 "PM_SPOOLER",
1094 "DIR",
1095 NULL,
1096 (PSZ)spool_dir,
1097 sizeof(spool_dir));
1098 spool_dir[ strlen(spool_dir) - 1] = '\0';
1099 sprintf(szTemp,"%s\\SMB\\%d.control",spool_dir,hFile);
1100 rc = DosOpen(szTemp,
1101 &control,
1102 &ulAction,
1103 0L,
1104 FILE_ARCHIVED | FILE_NORMAL,
1105 OPEN_ACTION_CREATE_IF_NEW |
1106 OPEN_ACTION_OPEN_IF_EXISTS,
1107 OPEN_FLAGS_NOINHERIT |
1108 OPEN_SHARE_DENYNONE |
1109 OPEN_ACCESS_READWRITE,
1110 0L);
1111 rc = DosRead( control,szTemp,sizeof(szTemp),&nbr_lu);
1112 rc = DosClose( control );
1113 sprintf(filename,"%s\\SMB\\%d.control",spool_dir,hFile);
1114 DosDelete(filename);
1115
1116 i = 0;
1117 j = 0;
1118 pos = 0;
1119 while (szTemp[i] != '@')
1120 {
1121 if (szTemp[i] == '#')
1122 {
1123 szTemp[i] = '\0';
1124 switch(j)
1125 {
1126 case 0:strcpy(ip_add,&szTemp[pos]);
1127 break;
1128 case 1:strcpy(queue_name,&szTemp[pos]);
1129 break;
1130 case 2:strcpy(workgroup,&szTemp[pos]);
1131 break;
1132 case 3:strcpy(username,&szTemp[pos]);
1133 break;
1134 case 4:strcpy(j_copies,&szTemp[pos]);
1135 break;
1136 case 5:strcpy(password_enc,&szTemp[pos]);
1137 break;
1138 }
1139 pos = i+1;
1140 j++;
1141 }
1142 i++;
1143 }
1144 szTemp[i] = '\0';
1145 strcpy(filename,&szTemp[pos]);
1146
1147 rc = DosClose( hFile );
1148 DosQuerySysInfo (QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive,
1149 sizeof (ULONG));
1150
1151 decryptPassword(password_enc,password_dec);
1152
1153// Usage: smbspool [DEVICE_URI] job-id user title copies options [file]
1154
1155 sprintf(binfile, "smbspool.exe\0");
1156 sprintf(j_url,"smb://%s:%s@%s/%s/%s",username,password_dec,workgroup,ip_add,queue_name);
1157 sprintf(j_id,"999");
1158 sprintf(j_user,username);
1159 sprintf(j_title,"from %s",getenv("HOSTNAME"));
1160 sprintf(j_options,"opt");
1161 rc = spawnlp(P_WAIT,binfile,binfile,j_url,j_id,j_user,j_title,j_copies,j_options,filename,NULL);
1162
1163 while (rc != 0)
1164 {
1165 sprintf(errorstr,"Error %d during spooling to smb://%s:****@%s/%s/%s",rc,username,workgroup,ip_add,queue_name);
1166 resp = WinMessageBox (HWND_DESKTOP,
1167 HWND_DESKTOP,
1168 errorstr,
1169 "CIFS/SMB Port driver error",
1170 0L, MB_RETRYCANCEL | MB_WARNING | MB_MOVEABLE);
1171 if (resp != MBID_CANCEL )
1172 {
1173 rc = spawnlp(P_WAIT,binfile,binfile,j_url,j_id,j_user,j_title,j_copies,j_options,filename,NULL);
1174 }
1175 else rc = 0;
1176 };
1177
1178 strcpy(filename,&szTemp[pos]);
1179 DosDelete(filename);
1180
1181 /* We always have to return success to the spooler subsystem */
1182 rc = NO_ERROR;
1183 return rc;
1184}
1185ULONG APIENTRY SplPdWrite( HFILE hFile,
1186 PVOID pchData,
1187 ULONG cbData,
1188 PULONG pcbWritten )
1189{ APIRET rc;
1190
1191 rc = DosWrite( hFile,pchData,cbData,pcbWritten);
1192 rc = DosSleep(0);
1193 return rc;
1194}
1195
Note: See TracBrowser for help on using the repository browser.