home *** CD-ROM | disk | FTP | other *** search
/ Media Share 13 / mediashare_13.zip / mediashare_13 / ZIPPED / NETWORK / GP25.ZIP / SETPJOB.PRG < prev    next >
Text File  |  1993-08-26  |  12KB  |  290 lines

  1. *  The purpose of this program is to read the PRINTCON.DAT file,
  2. *  and set the current capture settings to that specified by the
  3. *  job.  If no job is specified, then the defaultJobName will be
  4. *  used.  The intent is to allow the developer to Use Novell's
  5. *  JOB system to control printer output.  For information on how
  6. *  Novell uses the JOB system, please refer to your Novell documentation.
  7. *  One feature this program permits is the use of a "GLOBAL"
  8. *  PRINTCON.DAT.  This means that one user may develop a PRINTCON.DAT
  9. *  and place it in a location accessible to users running the PROGRAM.
  10. *  This eliminates the requirement that each user have his own PRINTCON.DAT
  11. *  stored in his MAIL directory.
  12. *
  13. *    To create a GLOBAL printcon, create a PRINTCON.DAT file using Novells
  14. *   PRINTCON utility.  Then copy the PRINTCON.DAT from your MAIL directory
  15. *   into a common area.  To find your mail directory look up your
  16. *   object ID in SYSCON/USER INFO/OTHER.  The mail directory is located
  17. *   on the SYS volume.
  18. *
  19. *   For information on the API calls, please refer to the documentation
  20. *   for the API library.
  21. *
  22. *
  23. *  Parameters
  24. *
  25. *    JobName        This is the name of the print job to set to.  If it
  26. *                is not specified, the program set the print parameters
  27. *                to the DEFAULT job.
  28. *
  29. *    DatName        This is the name of the file to use containing the
  30. *                PRINTCON information.  If no  name is specified for
  31. *                the PRINTCON.DAT file in the Mail directory for the
  32. *                logged in USER on the SYS volume of the default
  33. *                server.  If you specify a file name you must
  34. *                specify the drive letter in the path name.  The program
  35. *                will look for the NET$PRN.DAT in the PUBLIC directory
  36. *                on the same drive.  The file name must be in the format
  37. *                <DRIVE>:\DIRECTORY\FILENAME.
  38. *
  39. *
  40. *   Examples
  41. *
  42. *            PJobSet=SetPJob()
  43. *            if .not. PJobSet
  44. *                Wait Window "Unable to get default print job"
  45. *            Endif
  46. *
  47. *            PJobSet=SetPJob("LTRHEAD")  && set to job name letterhead
  48. *
  49. *            PJobSet=SetPJob(.f.,"F:\PUBLIC\PRINTCON.DAT")  && Set default form from global PRINTCON.DAT
  50. *
  51. *             PJobSet=SetPJob('LTRHEAD',"F:\PUBLIC\PRINTCON.DAT")
  52. *            && Set job ltrhead from global PRINTCON.DAT
  53. *
  54. *    Notes        This program was developed using information I obtained from
  55. *                the NOVLIB forum on CompuServe about the PRINTCON.DAT
  56. *                and NET$PRN.DAT files.  If you are interested, the file
  57. *                names are PRNTCN.ZIP and NETPRN.ZIP.  This function could
  58. *                be optimized by eliminating the parts that read in
  59. *                the complete device name tables and mode name tables.
  60. *                In the interest of clarity, and ease of maintenance
  61. *                I have left them in.
  62. *
  63. *                This function requires that the GPLIB API library
  64. *                have been previously loaded by
  65. *                issuing the command SET LIBRARY TO GPLIB
  66. *
  67. parameter JobName, DatName
  68. private file_handle, TempDrive, TempArray, counter, InString, OffSet, ;
  69.         TempString, P_Array, DeviceName, ModeName, PortNumber
  70. * Initialize variables
  71. set talk off
  72. store 0 to Offset, counter
  73. if type('DatName') <> 'C'
  74.     *  We need to look for the printcon.dat in the users mail directory on volume SYS
  75.     TempDrive = GetSYSLtr()
  76.     = N_AcctList('TempArray', N_UserID())
  77.     DatName = TempDrive + ':\MAIL\' + tempArray[1, 2] + '\PRINTCON.DAT'
  78. else
  79.     DatName = alltrim(upper(DATNAME))
  80.     TempDrive = left(datname, 1)
  81. endif
  82. file_handle = fopen(DatName)
  83. if file_handle < 0
  84.     return .f.
  85. endif
  86. if type('JobName') <> 'C'
  87.     *  Get the default job name
  88.     = fseek(file_handle, 118)
  89.     JobName = NullTrim(fread(file_handle, 32))
  90. endif
  91. JobName = upper(JobName)
  92. * locate the end of the header, and try to find our job name
  93. = fseek(file_handle, 150)
  94. for Counter = 1 to 37
  95.     *  Search throught the Job Name table to find our Job Offset
  96.     InString = fread(file_handle, 36)
  97.     if upper(NullTrim(InString)) = JobName
  98.         offset = Bin2L(right(instring, 4))
  99.         exit
  100.     endif
  101. endfor
  102. if offset > 0
  103.     * ok, we have found the offset into the job
  104.     * Goto the offset, and initialize P_Array to contain the
  105.     * Job parameters, then call N_StPParms()
  106.     *
  107.     = N_RdPParms('P_Array', 1)                                         && really just calling this to create array
  108.     = fseek(file_handle, int(OffSet))
  109.     P_Array[3] = nulltrim(fread(file_handle, 48))                     && Server Name
  110.     P_Array[4] = nulltrim(fread(file_handle, 48))                     && Queue Name
  111.     P_Array[7] = asc(fread(file_handle, 1))                             && Tab size
  112.     P_Array[14] = Bin2L(fread(file_handle, 2))                         && Number of Copies
  113.     P_Array[6] = NullTrim(fread(File_Handle, 13))                     && Form Name
  114.     = fread(File_Handle, 27)                                         && Reserved record
  115.     P_Array[10] = iif(asc(fread(file_handle, 1)) = 0, .f., .t.)         && Notify
  116.     = fread(File_Handle, 4)                                             && Print Server
  117.     = fread(File_Handle, 13)                                         && UserName
  118.     P_Array[12] = nulltrim(fread(file_handle, 13))                     && Banner Text
  119.     DeviceName = NullTrim(fread(file_handle, 33))                     && Device Name
  120.     ModeName = NullTrim(fread(file_handle, 33))                         && Mode Name
  121.     P_Array[13] = iif(asc(fread(file_handle, 1)) = 0, .f., .t.)         && Banner Flag
  122.     P_Array[8] = iif(asc(fread(file_handle, 1)) = 1, .f., .t.)         && Tab Expansion Flag
  123.     P_Array[9] = iif(asc(fread(file_handle, 1)) = 1, .f., .t.)         && Form Feed Flag
  124.     P_Array[15] = Bin2L(fread(file_handle, 2))                         && Timeout in Seconds
  125.     PortNumber = asc(fread(file_handle, 1))
  126.     *  Make the call to GetDevInfo() to read the Device, MODE, and Form Information
  127.     = GetDevInfo(TempDrive + ':\PUBLIC\NET$PRN.DAT', @P_ARRAY, DeviceName, ModeName, p_array[10])
  128.     *  If your initialization string is longer than 64 bytes you will need
  129.     *  to modify your SHELL.CFG statement to permit this.  Refer to
  130.     *  documentation on N_StPParms() and your Novell documentation.
  131.     = N_StPParms(PortNumber, 'P_Array')
  132. endif
  133. *  Perform clean up
  134. = fclose(file_handle)
  135. return (Offset > 0)
  136.  
  137. function Bin2L
  138.  
  139.     *  The purpose of this function is to convert a string to an integer
  140.     *  number.  The Offsets stored in the file are read in as a string
  141.     *  and converted to an integer.  I.E. a string consisting of
  142.     *  CHR(1)+CHR(2) would return 513.
  143.  
  144.     parameter InString
  145.     private Counter, RetVal
  146.     RetVal = 0
  147.     for Counter = 0 to len(Instring) - 1
  148.         RetVal = RetVal + 256^Counter * asc(substr(Instring, counter + 1, 1))
  149.     endfor
  150. return int(RetVal)
  151.  
  152. function GetDevInfo
  153.     parameter Fname, aPrint, DeviceName, ModeName, FormName
  154.     private Dat_Handle, DevTableOffset, FormTableOffset, Counter, DeviceCount, DevArray ;
  155.             , DeviceNumber, DevNameArray, FuncArray, InitString, ModeNumber, Length, FormArray
  156.     InitString = ''
  157.     *  Open NET$PRN.DAT
  158.     Dat_Handle = fopen(fname)
  159.     if Dat_Handle < 0
  160.         return .f.
  161.     endif
  162.     = fgets(Dat_Handle)                                                 && Read line 1, Description
  163.     = fgets(Dat_Handle)                                                 && Read Line 2, Copyright Notice
  164.     = fread(Dat_Handle, 1)                                             && read 0x1A
  165.     = fread(Dat_Handle, 12)                                             && skip past the date stamp
  166.     DevTableOffset = Bin2L(fread(Dat_Handle, 4))                     && Get offset to Device Table
  167.     FormTableOffset = Bin2L(fread(Dat_Handle, 4))                     && Get Offset to Form Table
  168.     = fseek(Dat_Handle, DevTableOffset)
  169.     DeviceCount = Bin2L(fread(Dat_Handle, 2))                         && Get number of devices in table
  170.     declare DevArray[DeviceCount, 5]
  171.     *  Column 1 is offset to device definition
  172.     *  Column 2 is Length of Device Name
  173.     *  Column 3 is Device Name
  174.     *  Column 4 is Offset to Device Modes
  175.     *  Column 5 is offset to device Functions
  176.     for Counter = 1 to DeviceCount                                     && Get the offsets to the table
  177.         DevArray[Counter, 1] = Bin2L(fread(Dat_Handle, 4))
  178.     endfor
  179.     for Counter = 1 to DeviceCount
  180.         *  Now, fill in the array with the Device Information
  181.         = fseek(Dat_Handle, DevArray[counter, 1])
  182.         DevArray[Counter, 2] = Bin2L(fread(Dat_Handle, 1))
  183.         DevArray[Counter, 3] = fread(Dat_Handle, DevArray[Counter, 2])
  184.         DevArray[Counter, 4] = Bin2L(fread(Dat_Handle, 4))
  185.         DevArray[Counter, 5] = Bin2L(fread(Dat_Handle, 4))
  186.     endfor
  187.     DeviceNumber = ascan(DevArray, DeviceName)
  188.     if (deviceNumber > 0)
  189.         * Ok, We have found our device
  190.         DeviceNumber = 1 + int(DeviceNumber / alen(DevArray, 2))     && Convert the element number to a row number
  191.         = fseek(Dat_Handle, DevArray[DeviceNumber, 4])
  192.         declare DevNameArray[Bin2L(fread(Dat_Handle, 2)), 4]
  193.         *  Column 1 Offset to Device Mode Definition
  194.         *  Column 2 Length of Device Mode Name
  195.         *  Column 3 Mode Name
  196.         *  Column 4 Offset to Mode function list table
  197.         for Counter = 1 to alen(DevNameArray, 1)                     && build list to ModeNames
  198.             DevNameArray[Counter, 1] = Bin2L(fread(Dat_Handle, 4))
  199.         endfor
  200.         for Counter = 1 to alen(DevNameArray, 1)                     && Fill In Table with offsets to mode names
  201.             = fseek(Dat_Handle, devNameArray[counter, 1])
  202.             DevNameArray[Counter, 2] = asc(fread(Dat_Handle, 1))     && mode name length
  203.             DevNameArray[Counter, 3] = fread(Dat_Handle, DevNameArray[Counter, 2])       && mode name
  204.             DevNameArray[Counter, 4] = Bin2L(fread(Dat_Handle, 4))
  205.         endfor
  206.         ModeNumber = ascan(DevNameArray, ModeName)
  207.         if (ModeNumber > 0)
  208.             *  Ok, we now have the mode we want to use
  209.             ModeNumber = 1 + int(ModeNumber / alen(DevNameArray, 2))
  210.             * Seek to Mode function list table
  211.             = fseek(Dat_Handle, DevNameArray[ModeNumber, 4])
  212.             * Declare array to hold offsets to Functions for the MODE
  213.             declare FuncArray[ Bin2L(fread(Dat_Handle, 2)) ]
  214.             for Counter = 1 to alen(FuncArray, 1)                     && Read the Offsets to the functions
  215.                 FuncArray[counter] = Bin2L(fread(Dat_Handle, 4))
  216.             endfor
  217.             for Counter = 1 to alen(FuncArray, 1)
  218.                 *  Ok, now we read each function in and build our
  219.                 *  initialization string.
  220.                 = fseek(Dat_Handle, FuncArray[counter])
  221.                 Length = asc(fread(Dat_Handle, 1))                     && Function Name Length
  222.                 = fread(Dat_Handle, Length)                             && Function Name
  223.                 Length = asc(fread(Dat_Handle, 1))                     && Escape Code Length
  224.                 InitString = InitString + fread(Dat_Handle, length)
  225.             endfor
  226.             aPrint[1] = InitString
  227.             *  From examining the results of capture J= the Reset string
  228.             *  is the same as the initialization string.  I am setting it
  229.             *  to 16 because that is the default length of the buffer reserved
  230.             *  by the NetWare shell.  You may wish to change how this works.
  231.             aPrint[2] = left(InitString, 16)
  232.             *  Yea, Yea (Picture Kermit the Frog going Yea.)
  233.             *  We now have the initialization string.
  234.         endif
  235.         if .not. empty(formname)
  236.             *  Now, we need to get the form number if possible
  237.             = fseek(dat_handle, FormTableOffset)
  238.             Length = Bin2L(fread(dat_handle, 2))                     && Number of Forms
  239.             if Length > 0
  240.                 declare FormArray[length]
  241.                 for counter = 1 to alen(FormArray, 1)
  242.                     FormArray[counter] = Bin2L(fread(dat_handle, 4))
  243.                 endfor
  244.                 for counter = 1 to alen(FormArray, 1)
  245.                     = fseek(dat_handle, FormArray[counter])
  246.                     length = asc(fread(dat_handle, 1))
  247.                     if fread(dat_handle, length) = FormName
  248.                         aPrint[5] = Bin2L(fread(dat_handle, 2))
  249.                         exit
  250.                     endif
  251.                 endfor
  252.             endif
  253.         endif
  254.     endif
  255.     = fclose(Dat_Handle)
  256. return
  257.  
  258. function GetSYSLtr
  259.  
  260.     *  The purpose of this function is to find a drive mapped to
  261.     *  the SYS volume of the current DEFAULT server.
  262.  
  263.     private Start
  264.     Start = chr(65 + N_DriveCnt())                                     && Get the lowest Novell drive
  265.     do while Start < '['
  266.         if N_ServFrDr(start) = N_DefServr() .and. n_DrvPath(start) = 'SYS:'
  267.             exit
  268.         else
  269.             Start = chr(asc(Start) + 1)
  270.         endif
  271.     enddo
  272.     if start = 'Z'
  273.         wait window 'Unable to find drive mapped to SYS:'
  274.         cancel
  275.     else
  276.         return Start
  277.     endif
  278. return
  279.  
  280.  
  281. function NullTrim
  282.  
  283.     *  The purpose of this function is to trim off any characters in a string
  284.     *  after the null character (CHR(0)).
  285.  
  286.     parameter String
  287.     String = left(String, at(chr(0), String) - 1)
  288. return String
  289.  
  290.