home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / scoadmin / root.1 / usr / lib / sysadm.tlib / sysadm
Text File  |  1998-08-19  |  202KB  |  6,413 lines

  1. # Copyright (c) 1991-1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
  2. #                                                                         
  3. #        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
  4. #                   SANTA CRUZ OPERATION INC.                             
  5. #                                                                         
  6. #   The copyright notice above does not evidence any actual or intended   
  7. #   publication of such source code.                                      
  8.  
  9. #******************************************************************************
  10. #
  11. #    Copyright (C) 1991-1998 The Santa Cruz Operation, Inc.
  12. #        All Rights Reserved.
  13. #
  14. #    The information in this file is provided for the exclusive use of
  15. #    the licensees of The Santa Cruz Operation, Inc.  Such users have the
  16. #    right to use, modify, and incorporate this code into other products
  17. #    for purposes authorized by the license agreement provided they include
  18. #    this notice and the associated copyright notice with any such product.
  19. #    The information in this file is provided "AS IS" without warranty.
  20. #
  21. #===============================================================================
  22.  
  23. #@package: SCO_UNIX_MSGS SCO_UNIX_MSGS
  24.  
  25. proc SCO_UNIX_MSGS {} {}
  26.  
  27. global SCO_UNIX_MSGS
  28. set SCO_UNIX_MSGS(@catalog@) {unix.cat@sa 1}
  29. set SCO_UNIX_MSGS(ERR_EPERM) {1 {Not privileged}}
  30. set SCO_UNIX_MSGS(ERR_ENOENT) {2 {No such file or directory}}
  31. set SCO_UNIX_MSGS(ERR_ESRCH) {3 {No such process}}
  32. set SCO_UNIX_MSGS(ERR_EINTR) {4 {Interrupted system call}}
  33. set SCO_UNIX_MSGS(ERR_EIO) {5 {I/O error}}
  34. set SCO_UNIX_MSGS(ERR_ENXIO) {6 {No such device or address}}
  35. set SCO_UNIX_MSGS(ERR_E2BIG) {7 {Arg list too long}}
  36. set SCO_UNIX_MSGS(ERR_ENOEXEC) {8 {Exec format error}}
  37. set SCO_UNIX_MSGS(ERR_EBADF) {9 {Bad file number}}
  38. set SCO_UNIX_MSGS(ERR_ECHILD) {10 {No child processes}}
  39. set SCO_UNIX_MSGS(ERR_EAGAIN) {11 {Resource temporarily unavailable}}
  40. set SCO_UNIX_MSGS(ERR_EWOULDBLOCK) {12 {Resource temporarily unavailable}}
  41. set SCO_UNIX_MSGS(ERR_ENOMEM) {13 {Insufficient or invalid memory}}
  42. set SCO_UNIX_MSGS(ERR_EACCES) {14 {Permission denied}}
  43. set SCO_UNIX_MSGS(ERR_EFAULT) {15 {Bad address}}
  44. set SCO_UNIX_MSGS(ERR_ENOTBLK) {16 {Block device required}}
  45. set SCO_UNIX_MSGS(ERR_EBUSY) {17 {Device busy}}
  46. set SCO_UNIX_MSGS(ERR_EEXIST) {18 {File exists}}
  47. set SCO_UNIX_MSGS(ERR_EXDEV) {19 {Cross-device link}}
  48. set SCO_UNIX_MSGS(ERR_ENODEV) {20 {No such device}}
  49. set SCO_UNIX_MSGS(ERR_ENOTDIR) {21 {Not a directory}}
  50. set SCO_UNIX_MSGS(ERR_EISDIR) {22 {Is a directory}}
  51. set SCO_UNIX_MSGS(ERR_EINVAL) {23 {Invalid argument}}
  52. set SCO_UNIX_MSGS(ERR_ENFILE) {24 {File table overflow}}
  53. set SCO_UNIX_MSGS(ERR_EMFILE) {25 {Too many open files}}
  54. set SCO_UNIX_MSGS(ERR_ENOTTY) {26 {Not a typewriter}}
  55. set SCO_UNIX_MSGS(ERR_ETXTBSY) {27 {Text file busy}}
  56. set SCO_UNIX_MSGS(ERR_EFBIG) {28 {File too large}}
  57. set SCO_UNIX_MSGS(ERR_ENOSPC) {29 {No space left on device}}
  58. set SCO_UNIX_MSGS(ERR_ESPIPE) {30 {Illegal seek}}
  59. set SCO_UNIX_MSGS(ERR_EROFS) {31 {Read-only file system}}
  60. set SCO_UNIX_MSGS(ERR_EMLINK) {32 {Too many links}}
  61. set SCO_UNIX_MSGS(ERR_EPIPE) {33 {Broken pipe}}
  62. set SCO_UNIX_MSGS(ERR_EDOM) {34 {Argument out of domain}}
  63. set SCO_UNIX_MSGS(ERR_ERANGE) {35 {Result too large}}
  64. set SCO_UNIX_MSGS(ERR_ENOMSG) {36 {No message of desired type}}
  65. set SCO_UNIX_MSGS(ERR_EIDRM) {37 {Identifier removed}}
  66. set SCO_UNIX_MSGS(ERR_ECHRNG) {38 {Channel number out of range}}
  67. set SCO_UNIX_MSGS(ERR_EL2NSYNC) {39 {Level 2 not synchronized}}
  68. set SCO_UNIX_MSGS(ERR_EL3HLT) {40 {Level 3 halted}}
  69. set SCO_UNIX_MSGS(ERR_EL3RST) {41 {Level 3 reset}}
  70. set SCO_UNIX_MSGS(ERR_ELNRNG) {42 {Link number out of range}}
  71. set SCO_UNIX_MSGS(ERR_EUNATCH) {43 {Protocol driver not attached}}
  72. set SCO_UNIX_MSGS(ERR_ENOCSI) {44 {No CSI structure available}}
  73. set SCO_UNIX_MSGS(ERR_EL2HLT) {45 {Level 2 halted}}
  74. set SCO_UNIX_MSGS(ERR_EDEADLK) {46 {Deadlock situation detected/avoided}}
  75. set SCO_UNIX_MSGS(ERR_ENOLCK) {47 {No record locks available}}
  76. set SCO_UNIX_MSGS(ERR_EBADE) {48 {Bad exchange descriptor}}
  77. set SCO_UNIX_MSGS(ERR_EBADR) {49 {Bad request descriptor}}
  78. set SCO_UNIX_MSGS(ERR_EXFULL) {50 {Message tables full}}
  79. set SCO_UNIX_MSGS(ERR_ENOANO) {51 {Anode table overflow}}
  80. set SCO_UNIX_MSGS(ERR_EBADRQC) {52 {Bad request code}}
  81. set SCO_UNIX_MSGS(ERR_EBADSLT) {53 {Invalid slot}}
  82. set SCO_UNIX_MSGS(ERR_EDEADLOCK) {54 {File locking deadlock}}
  83. set SCO_UNIX_MSGS(ERR_EBFONT) {55 {Bad font file format}}
  84. set SCO_UNIX_MSGS(ERR_ECLNRACE) {56 {Error 59}}
  85. set SCO_UNIX_MSGS(ERR_ENOSTR) {57 {Not a stream device}}
  86. set SCO_UNIX_MSGS(ERR_ENODATA) {58 {No data available}}
  87. set SCO_UNIX_MSGS(ERR_ETIME) {59 {Timer expired}}
  88. set SCO_UNIX_MSGS(ERR_ENOSR) {60 {Out of stream resources}}
  89. set SCO_UNIX_MSGS(ERR_ENONET) {61 {Machine is not on the network}}
  90. set SCO_UNIX_MSGS(ERR_ENOPKG) {62 {Package not installed}}
  91. set SCO_UNIX_MSGS(ERR_EREMOTE) {63 {Object is remote}}
  92. set SCO_UNIX_MSGS(ERR_ENOLINK) {64 {Link has been severed}}
  93. set SCO_UNIX_MSGS(ERR_EADV) {65 {Advertise error}}
  94. set SCO_UNIX_MSGS(ERR_ESRMNT) {66 {Srmount error}}
  95. set SCO_UNIX_MSGS(ERR_ECOMM) {67 {Communication error on send}}
  96. set SCO_UNIX_MSGS(ERR_EPROTO) {68 {Protocol error}}
  97. set SCO_UNIX_MSGS(ERR_EMULTIHOP) {69 {Multihop attempted}}
  98. set SCO_UNIX_MSGS(ERR_EBADMSG) {70 {Not a data message}}
  99. set SCO_UNIX_MSGS(ERR_ENAMETOOLONG) {71 {File name too long}}
  100. set SCO_UNIX_MSGS(ERR_EOVERFLOW) {72 {Value too large for defined data type}}
  101. set SCO_UNIX_MSGS(ERR_ENOTUNIQ) {73 {Name not unique on network}}
  102. set SCO_UNIX_MSGS(ERR_EBADFD) {74 {File descriptor in bad state}}
  103. set SCO_UNIX_MSGS(ERR_EREMCHG) {75 {Remote address changed}}
  104. set SCO_UNIX_MSGS(ERR_ELIBACC) {76 {Can not access a needed shared library}}
  105. set SCO_UNIX_MSGS(ERR_ELIBBAD) {77 {Accessing a corrupted shared library}}
  106. set SCO_UNIX_MSGS(ERR_ELIBSCN) {78 {.lib section in a.out corrupted}}
  107. set SCO_UNIX_MSGS(ERR_ELIBMAX) {79 {Attempting to link in more shared libraries than system limit}}
  108. set SCO_UNIX_MSGS(ERR_ELIBEXEC) {80 {Can not exec a shared library directly}}
  109. set SCO_UNIX_MSGS(ERR_EILSEQ) {81 {Illegal byte sequence}}
  110. set SCO_UNIX_MSGS(ERR_ENOSYS) {82 {Operation not applicable}}
  111. set SCO_UNIX_MSGS(ERR_ELOOP) {83 {Too many symbolic links in path name traversal}}
  112. set SCO_UNIX_MSGS(ERR_ERESTART) {84 {Restartable system call}}
  113. set SCO_UNIX_MSGS(ERR_ESTRPIPE) {85 {Streams pipe error}}
  114. set SCO_UNIX_MSGS(ERR_ENOTEMPTY) {86 {Directory not empty}}
  115. set SCO_UNIX_MSGS(ERR_EUSERS) {87 {Too many users}}
  116. set SCO_UNIX_MSGS(ERR_ENOTSOCK) {88 {Socket operation on non-socket}}
  117. set SCO_UNIX_MSGS(ERR_EDESTADDRREQ) {89 {Destination address required}}
  118. set SCO_UNIX_MSGS(ERR_EMSGSIZE) {90 {Message too long}}
  119. set SCO_UNIX_MSGS(ERR_EPROTOTYPE) {91 {Protocol wrong type for socket}}
  120. set SCO_UNIX_MSGS(ERR_ENOPROTOOPT) {92 {Option not supported by protocol}}
  121. set SCO_UNIX_MSGS(ERR_EPROTONOSUPPORT) {93 {Protocol not supported}}
  122. set SCO_UNIX_MSGS(ERR_ESOCKTNOSUPPORT) {94 {Socket type not supported}}
  123. set SCO_UNIX_MSGS(ERR_EOPNOTSUPP) {95 {Operation not supported on transport endpoint}}
  124. set SCO_UNIX_MSGS(ERR_EPFNOSUPPORT) {96 {Protocol family not supported}}
  125. set SCO_UNIX_MSGS(ERR_EAFNOSUPPORT) {97 {Address family not supported by protocol family}}
  126. set SCO_UNIX_MSGS(ERR_EADDRINUSE) {98 {Address already in use}}
  127. set SCO_UNIX_MSGS(ERR_EADDRNOTAVAIL) {99 {Cannot assign requested address}}
  128. set SCO_UNIX_MSGS(ERR_ENETDOWN) {100 {Network is down}}
  129. set SCO_UNIX_MSGS(ERR_ENETUNREACH) {101 {Network is unreachable}}
  130. set SCO_UNIX_MSGS(ERR_ENETRESET) {102 {Network dropped connection because of reset}}
  131. set SCO_UNIX_MSGS(ERR_ECONNABORTED) {103 {Software caused connection abort}}
  132. set SCO_UNIX_MSGS(ERR_ECONNRESET) {104 {Connection reset by peer}}
  133. set SCO_UNIX_MSGS(ERR_ENOBUFS) {105 {No buffer space available}}
  134. set SCO_UNIX_MSGS(ERR_EISCONN) {106 {Transport endpoint is already connected}}
  135. set SCO_UNIX_MSGS(ERR_ENOTCONN) {107 {Transport endpoint is not connected}}
  136. set SCO_UNIX_MSGS(ERR_EUCLEAN) {108 {Structure needs cleaning}}
  137. set SCO_UNIX_MSGS(ERR_ENOTNAM) {109 {Not a name file}}
  138. set SCO_UNIX_MSGS(ERR_ENAVAIL) {110 {Not available}}
  139. set SCO_UNIX_MSGS(ERR_EISNAM) {111 {Is a name file}}
  140. set SCO_UNIX_MSGS(ERR_EREMOTEIO) {112 {Remote I/O error}}
  141. set SCO_UNIX_MSGS(ERR_EINIT) {113 {Reserved for future use}}
  142. set SCO_UNIX_MSGS(ERR_EREMDEV) {114 {Error 142}}
  143. set SCO_UNIX_MSGS(ERR_ESHUTDOWN) {115 {Cannot send after socket shutdown}}
  144. set SCO_UNIX_MSGS(ERR_ETOOMANYREFS) {116 {Too many references: cannot splice}}
  145. set SCO_UNIX_MSGS(ERR_ETIMEDOUT) {117 {Connection timed out}}
  146. set SCO_UNIX_MSGS(ERR_ECONNREFUSED) {118 {Connection refused}}
  147. set SCO_UNIX_MSGS(ERR_EHOSTDOWN) {119 {Host is down}}
  148. set SCO_UNIX_MSGS(ERR_EHOSTUNREACH) {120 {No route to host}}
  149. set SCO_UNIX_MSGS(ERR_EALREADY) {121 {Operation already in progress}}
  150. set SCO_UNIX_MSGS(ERR_EINPROGRESS) {122 {Operation now in progress}}
  151. set SCO_UNIX_MSGS(ERR_ESTALE) {123 {Stale remote file handle}}
  152. set SCO_UNIX_MSGS(ERR_ENOLOAD) {124 {Cannot load required kernel module}}
  153. set SCO_UNIX_MSGS(ERR_ERELOC) {125 {Object file error in loading kernel module}}
  154. set SCO_UNIX_MSGS(ERR_ENOMATCH) {126 {Symbol matching given spec not found}}
  155. set SCO_UNIX_MSGS(ERR_EBADVER) {127 {Version number mismatch for loadable kernel module}}
  156. set SCO_UNIX_MSGS(ERR_ECONFIG) {128 {Configured kernel resource exhausted}}
  157. set SCO_UNIX_MSGS(ERR_ECANCELED) {129 {Asynchronous I/O request canceled}}
  158. set SCO_UNIX_MSGS(ERR_ENOTAUTH) {130 {Not authenticated}}
  159. set SCO_UNIX_MSGS(ERR_ELKBUSY) {131 {Unknown error}}
  160. set SCO_UNIX_MSGS(ERR_ENOVERS) {132 {Unknown error}}
  161. set SCO_UNIX_MSGS(ERR_EVFILE) {133 {Unknown error}}
  162. set SCO_UNIX_MSGS(ERR_ENOCACHE) {134 {Unknown error}}
  163. set SCO_UNIX_MSGS(ERR_EBLANKCK) {135 {Unknown error}}
  164. set SCO_UNIX_MSGS(ERR_ENOSERVICE) {136 {Unknown error}}
  165. set SCO_UNIX_MSGS(ERR_ENOSTATISTIC) {137 {Unknown error}}
  166. set SCO_UNIX_MSGS(ERR_EARCHIVE) {138 {Unknown error}}
  167. set SCO_UNIX_MSGS(ERR_ENORESOURCE) {139 {Unknown error}}
  168. set SCO_UNIX_MSGS(ERR_ERESINUSE) {140 {Unknown error}}
  169. set SCO_UNIX_MSGS(ERR_EYETARCHIVED) {141 {Unknown error}}
  170. set SCO_UNIX_MSGS(ERR_ELIBOFFLINE) {142 {Unknown error}}
  171. set SCO_UNIX_MSGS(ERR_ENORCHANNEL) {143 {Unknown error}}
  172. set SCO_UNIX_MSGS(ERR_ESEQUENCE) {144 {Unknown error}}
  173. set SCO_UNIX_MSGS(ERR_EBADREPLY) {145 {Unknown error}}
  174. set SCO_UNIX_MSGS(ERR_EINVCORRUPTED) {146 {Unknown error}}
  175. set SCO_UNIX_MSGS(ERR_EBADLABEL) {147 {Unknown error}}
  176. set SCO_UNIX_MSGS(ERR_ENOHDCH) {148 {Unknown error}}
  177. set SCO_UNIX_MSGS(ERR_EOUTHDCH) {149 {Unknown error}}
  178. set SCO_UNIX_MSGS(ERR_ERRNO_UNKNOWN) {150 {Unknown unix errno: %d}}
  179.  
  180.  
  181. #@package: saIntlMgr IntlLocal IntlLocalizeMsg
  182.  
  183. global Intl:messageCats Intl:msgCatalogLRU
  184.  
  185. set Intl:messageCats(x) {}
  186. unset Intl:messageCats(x)
  187. set Intl:msgCatalogLRU {}
  188.  
  189.  
  190. proc Intl:GetMsgEntry {messageId} {
  191.  
  192.  
  193.     set msgSepIdx [string first _MSG_ $messageId]
  194.     set errSepIdx [string first _ERR_ $messageId]
  195.     if {$msgSepIdx < 0} {
  196.         set sepIdx $errSepIdx
  197.     } else {
  198.         if {$errSepIdx < 0} {
  199.             set sepIdx $msgSepIdx
  200.         } else {
  201.             set sepIdx [min $msgSepIdx $errSepIdx]
  202.         }
  203.     }
  204.     
  205.     
  206.     if {$sepIdx <= 0} {
  207.         error "Invalid message ID `$messageId'"
  208.     }
  209.  
  210.     set modId [csubstr $messageId 0 $sepIdx]    
  211.     set msgName [csubstr $messageId [expr $sepIdx+1] end]
  212.  
  213.  
  214.     upvar #0 "${modId}_MSGS" moduleDecls
  215.  
  216.     if {![info exists moduleDecls]} {
  217.         auto_load "${modId}_MSGS"
  218.     }
  219.  
  220.  
  221.     append msgEntryVar moduleDecls "(" $msgName ")"
  222.     if {![info exists $msgEntryVar]} {
  223.         error "Unknown message ID `$messageId'"
  224.     }
  225.     append msgCatalogVar moduleDecls "(@catalog@)"
  226.     return [concat [set $msgCatalogVar] [set $msgEntryVar]]
  227. }
  228.  
  229.  
  230. proc Intl:GetMessageCat {catalog} {
  231.     global Intl:messageCats Intl:msgCatalogLRU
  232.  
  233.  
  234.     if [info exists Intl:messageCats($catalog)] {
  235.         set idx [lsearch ${Intl:msgCatalogLRU} $catalog]
  236.         set Intl:msgCatalogLRU [lreplace ${Intl:msgCatalogLRU} $idx $idx]
  237.         lappend Intl:msgCatalogLRU $catalog
  238.         return [set Intl:messageCats($catalog)]
  239.     }
  240.  
  241.  
  242.     if {[array size Intl:messageCats] >= 4} {
  243.         set overlayCat [lvarpop Intl:msgCatalogLRU]
  244.         catclose [set Intl:messageCats($overlayCat)]
  245.         unset Intl:messageCats($overlayCat)
  246.     }
  247.  
  248.  
  249.     set catHandle [catopen $catalog]
  250.     set Intl:messageCats($catalog) $catHandle
  251.     lappend Intl:msgCatalogLRU $catalog
  252.     return $catHandle
  253. }
  254.  
  255.  
  256. proc Intl:GetLocalizedText {msgEntry argList} {
  257.  
  258.     set catHandle [Intl:GetMessageCat [lindex $msgEntry 0]]
  259.     
  260.     set localStr [catgets $catHandle [lindex $msgEntry 1] \
  261.                           [lindex $msgEntry 2] [lindex $msgEntry 3]]
  262.     return [eval format [list [cexpand $localStr]] $argList]
  263. }
  264.  
  265.  
  266. proc IntlLocal {type messageId {argList {}}} {
  267.  
  268.     set msgEntry [Intl:GetMsgEntry $messageId]
  269.  
  270.     set localText [Intl:GetLocalizedText $msgEntry $argList]
  271.  
  272.     if [cequal $type text] {
  273.         return $localText
  274.     }
  275.     if [cequal $type ext] {
  276.         return [list $messageId $localText]
  277.     }
  278.     error "Invalid type `$type', expected `text' or `ext'"
  279. }
  280.  
  281.  
  282. proc IntlLocalizeMsg {messageId {argList {}}} {
  283.  
  284.     set msgEntry [Intl:GetMsgEntry $messageId]
  285.  
  286.     return [Intl:GetLocalizedText $msgEntry $argList]
  287. }
  288.  
  289.  
  290. #@package: saErrorMgr ErrorStackSize ErrorId ErrorData ErrorText ErrorPush \
  291.     ErrorPushUnix ErrorAddData ErrorOutput ErrorCatch ErrorPass \
  292.     ErrorTopLevelCatch ErrorThrow
  293.  
  294.  
  295. proc ErrorStackSize {errStackVar} {
  296.     upvar $errStackVar errStack
  297.  
  298.     return [llength $errStack]
  299. }
  300.  
  301.  
  302. proc ErrorId {errStackVar {level 0}} {
  303.     upvar $errStackVar errStack
  304.  
  305.     return [lindex [lindex $errStack $level] 0]
  306. }
  307.  
  308.  
  309. proc ErrorText {errStackVar {level 0}} {
  310.     upvar $errStackVar errStack
  311.  
  312.     return [lindex [lindex $errStack $level] 1]
  313. }
  314.  
  315.  
  316. proc ErrorData {errStackVar {level 0}} {
  317.     upvar $errStackVar errStack
  318.  
  319.     return [lindex [lindex $errStack $level] 2]
  320. }
  321.  
  322.  
  323. proc ErrorPush {errStackVar throw messageId {argList {}} {dataList {}}} {
  324.     
  325.     if [lempty $errStackVar] {
  326.         set errStack {}
  327.     } else {
  328.         upvar $errStackVar errStack
  329.         if ![info exists errStack] {
  330.             set errStack {}
  331.         }
  332.     }
  333.     set message [IntlLocal ext $messageId $argList]
  334.     if ![lempty $dataList] {
  335.         set message [concat $message $dataList]
  336.     }
  337.     set errStack [linsert $errStack 0 $message]
  338.     if $throw {
  339.         error [lindex $message 1] {} [list ERRORSTACK $errStack]
  340.     }
  341. }
  342.  
  343.  
  344. proc ErrorPushUnix {errStackVar throw {messageId {}} {argList {}}} {
  345.     global errorInfo errorCode
  346.     
  347.     if [lempty $errStackVar] {
  348.         set errStack {}
  349.     } else {
  350.         upvar $errStackVar errStack
  351.         if ![info exists errStack] {
  352.             set errStack {}
  353.         }
  354.     }
  355.     
  356.     if {"[lindex $errorCode 0]" == "UNIX"} { ;# ???? 6.2 compat..
  357.         set errorCode [concat POSIX [lrange $errorCode 1 end]]
  358.     }
  359.     if {"[lindex $errorCode 0]" != "POSIX"} {
  360.         error {*ErrorPushUnix: Unexpected error*} $errorInfo $errorCode
  361.     }
  362.  
  363.     set message [IntlLocal ext "SCO_UNIX_ERR_[lindex $errorCode 1]"]
  364.     set errStack [linsert $errStack 0 $message]
  365.                           
  366.     if ![lempty $messageId] {
  367.         set errStack [linsert $errStack 0 [IntlLocal ext $messageId $argList]]
  368.     }
  369.     if $throw {
  370.         error [lindex $message 1] {} [list ERRORSTACK $errStack]
  371.     }
  372. }
  373.  
  374.  
  375. proc ErrorAddData {errStackVar dataList} {
  376.     upvar $errStackVar errStack
  377.  
  378.     set message [lindex $errStack 0]
  379.     set oldDataList [lvarpop message 2]
  380.     lvarpop errStack 0 [concat $message $oldDataList $dataList]
  381. }
  382.  
  383. proc ErrorOutput {errStackVar {fileId stderr} {options {}} {prefix {}}} {
  384.     upvar $errStackVar errStack
  385.     
  386.     foreach entry $errStack {
  387.         set outstr $prefix
  388.         if {[lsearch $options ERRORMGR_OUTPUT_IDS] >= 0} {
  389.             append outstr [lindex $entry 0] ": "
  390.         }
  391.         append outstr [lindex $entry 1]
  392.         puts $fileId $outstr
  393.     }
  394. }
  395.  
  396.  
  397. proc ErrorCatch {errStackVar throw command resultVar {messageId {}}
  398.                  {argList {}}} {
  399.     if ![lempty $errStackVar] {
  400.         upvar $errStackVar errStack
  401.     }
  402.     if ![lempty $resultVar] {
  403.         upvar $resultVar result
  404.     }
  405.     set errStack {}
  406.     set resultCode [catch {uplevel $command} result]
  407.     if {$resultCode != 1} {
  408.         return $resultCode
  409.     }
  410.  
  411.  
  412.     global errorInfo errorCode
  413.  
  414.     switch -exact -- [lindex $errorCode 0] {
  415.         "POSIX"      {ErrorPushUnix errStack 0 {}}
  416.         "ERRORSTACK" {set errStack [lindex $errorCode 1]}
  417.         default      {error $result $errorInfo $errorCode}
  418.     }
  419.     if ![lempty $messageId] {
  420.         ErrorPush errStack 0 $messageId $argList
  421.     }
  422.     if $throw {
  423.         error [lindex [lindex $errStack 0] 1] {} [list ERRORSTACK $errStack]
  424.     }
  425.     return $resultCode
  426. }
  427.  
  428.  
  429. proc ErrorPass {command messageId {argList {}}} {
  430.     set resultCode [catch {uplevel $command} result]
  431.     if {$resultCode != 1} {
  432.         return -code $resultCode $result
  433.     }
  434.  
  435.     global errorInfo errorCode
  436.  
  437.     switch -exact -- [lindex $errorCode 0] {
  438.         "POSIX"      {ErrorPushUnix errStack 0 {}}
  439.         "ERRORSTACK" {set errStack [lindex $errorCode 1]}
  440.         default      {error $result $errorInfo $errorCode}
  441.     }
  442.     ErrorPush errStack 0 $messageId $argList
  443.     error [lindex [lindex $errStack 0] 1] {} [list ERRORSTACK $errStack]
  444. }
  445.  
  446.  
  447. proc ErrorTopLevelCatch {command description} {
  448.  
  449.     set resultCode [catch {uplevel $command} result]
  450.     if {$resultCode != 1} {
  451.         return $resultCode 
  452.     }
  453.  
  454.  
  455.     global errorInfo errorCode
  456.  
  457.     set saveErrorInfo $errorInfo
  458.     set saveErrorCode $errorCode
  459.  
  460.     set logFile /tmp/tclerror.[pid].log
  461.     if {[catch {open $logFile w} logFH] != 0} {
  462.         set logFile "stderr"
  463.         set logFH stderr
  464.     }
  465.  
  466.     puts $logFH "Uncaught error in Tcl program: $description:"
  467.     puts $logFH "$result"
  468.     puts $logFH [replicate - 75]
  469.     puts $logFH "Error code = $saveErrorCode"
  470.     puts $logFH [replicate - 75]
  471.     puts $logFH $saveErrorInfo
  472.     puts $logFH [replicate = 75]
  473.  
  474.     puts stderr "Fatal error: $result"
  475.     puts stderr "Error Information logged to: $logFile"
  476.     close $logFH
  477.     return $resultCode
  478. }
  479.  
  480.  
  481. proc ErrorThrow {errStackVar} {
  482.     upvar $errStackVar errStack
  483.  
  484.     error [lindex [lindex $errStack 0] 1] {} [list ERRORSTACK $errStack]
  485. }
  486.  
  487.  
  488.  
  489. #@package: SaCU CallNonStdCmd CallNonStdCmdLocale CallTfadminCmd
  490.  
  491.  
  492. proc SaCU:ForkCmd {cmd argList outPipeVar errPipeVar} {
  493.     upvar $outPipeVar outPipeRead $errPipeVar errPipeRead
  494.  
  495.     flush stdout
  496.     flush stderr
  497.     pipe outPipeRead outPipeWrite
  498.     pipe errPipeRead errPipeWrite
  499.     set pid [fork]
  500.     if {$pid != 0} {
  501.         close $outPipeWrite
  502.         close $errPipeWrite
  503.         return $pid
  504.     }
  505.  
  506.     close $outPipeRead
  507.     close $errPipeRead
  508.  
  509.     dup   $outPipeWrite stdout
  510.     dup   $errPipeWrite stderr
  511.  
  512.     close $outPipeWrite
  513.     close $errPipeWrite
  514.  
  515.     catch {execl $cmd $argList}
  516.  
  517.  
  518.     catch {
  519.         global errorCode
  520.         puts stderr [IntlLocalizeMsg SCO_CMD_UTIL_ERR_EXEC \
  521.                                      [list $cmd [lrange $errorCode 1 end]]]
  522.         flush stderr
  523.         kill SIGKILL [id process]
  524.     }
  525.     exit 100
  526. }
  527.  
  528.  
  529. proc SaCU:PollCmd {outPipe errPipe outRetVar errRetVar} {
  530.     upvar $outRetVar outReturn $errRetVar errReturn
  531.  
  532.     set outReturn {}
  533.     set errReturn {}
  534.  
  535.     set handleList [list $outPipe $errPipe]
  536.     set outEof 0
  537.     set errEof 0
  538.     set outCnt 0
  539.     set errCnt 0
  540.  
  541.     while {(!$outEof) || (!$errEof)} {
  542.         set readyFiles [lindex [select $handleList] 0]
  543.  
  544.         if {(!$outEof) && ([lsearch $readyFiles $outPipe] >= 0)} {
  545.            if {[gets $outPipe data] < 0} {
  546.                set outEof 1
  547.            } else {
  548.               if {$outCnt != 0} {
  549.                   append outReturn "\n"
  550.               }
  551.               append outReturn $data
  552.               incr outCnt
  553.            }
  554.         }
  555.         if {(!$errEof) && ([lsearch $readyFiles $errPipe] >= 0)} {
  556.            if {[gets $errPipe data] < 0} {
  557.                set errEof 1
  558.            } else {
  559.               if {$errCnt != 0} {
  560.                   append errReturn "\n"
  561.               }
  562.               append errReturn $data
  563.               incr errCnt
  564.            }
  565.         }
  566.     }
  567. }
  568.  
  569.  
  570. proc CallNonStdCmd {cmd argList cmdErrId {errStackVar {}} {messageId {}} 
  571.                     {msgArgList {}} {exitCodeVar {}}} {
  572.     if {$errStackVar != ""} {
  573.         upvar $errStackVar errStack
  574.         set throw 0
  575.     } else {
  576.         set throw 1
  577.     }
  578.     set errStack {}
  579.  
  580.     set pid [SaCU:ForkCmd $cmd $argList outPipe errPipe]
  581.     SaCU:PollCmd $outPipe $errPipe outReturn errReturn
  582.     close $outPipe
  583.     close $errPipe
  584.     set exitStatus [wait $pid]
  585.  
  586.  
  587.     if {[lindex $exitStatus 1] != "EXIT"} {
  588.         ErrorPush errStack 0 SCO_CMD_UTIL_ERR_NO_EXIT \
  589.                   [list $cmd [lrange $exitStatus 1 end] $errReturn]
  590.         if {$messageId != ""} {
  591.             ErrorPush errStack 0 $messageId $msgArgList
  592.         }
  593.         if $throw {
  594.             ErrorThrow errStack
  595.         }
  596.         return $outReturn
  597.     } else {
  598.         if ![lempty $exitCodeVar] {
  599.             upvar $exitCodeVar exitCode
  600.             set exitCode [lindex $exitStatus 2]
  601.         }
  602.     }
  603.  
  604.  
  605.     if {$errReturn != ""} {
  606.         set cmdName [file tail $cmd]
  607.         ErrorPush errStack 0 $cmdErrId [list $errReturn] [lindex $exitStatus 2]
  608.         if {$messageId != ""} {
  609.             ErrorPush errStack 0 $messageId $msgArgList
  610.         }
  611.         if $throw {
  612.             ErrorThrow errStack
  613.         }
  614.     }
  615.     return $outReturn
  616.  
  617. }
  618.  
  619. proc CallNonStdCmdLocale {locale cmd argList cmdErrId {errStackVar {}} 
  620.         {messageId {}} {msgArgList {}} {exitCodeVar {}}} {
  621.     global env
  622.  
  623.     if {![lempty $errStackVar]} {
  624.         upvar $errStackVar callStack
  625.     }
  626.  
  627.     if {[info exists env(LANG)]} {
  628.         set olang $env(LANG)
  629.     }
  630.  
  631.  
  632.     set env(LANG) $locale 
  633.  
  634.     set ret [CallNonStdCmd $cmd $argList $cmdErrId stack \
  635.         $messageId $msgArgList exCode]
  636.  
  637.     if {[info exists olang]} {
  638.         set env(LANG) $olang
  639.     } else {
  640.         unset env(LANG)
  641.     }
  642.  
  643.     if {![lempty $exitCodeVar]} {
  644.                 upvar $exitCodeVar exitCode
  645.                 set exitCode $exCode
  646.         }
  647.     
  648.     if {![lempty $errStackVar]} {
  649.         set callStack $stack
  650.     } else {
  651.         if {![lempty $stack]} {
  652.             ErrorThrow stack
  653.         }
  654.     }
  655.     return $ret    
  656. }
  657.  
  658.  
  659. proc CallTfadminCmd {command args cmdErrId {errStackVar {}} {messageId {}} 
  660.                     {msgArgList {}} {exitCodeVar {}}} {
  661.     if {$errStackVar != ""} {
  662.         upvar $errStackVar errStack
  663.         set throw 0
  664.     } else {
  665.         set throw 1
  666.     }
  667.     set errStack {}
  668.  
  669.     if {[id userid] == "0"} {
  670.     set cmd $command
  671.     set argList $args
  672.     } else {
  673.     set cmd /sbin/tfadmin
  674.     set argList [list $command $args]
  675.     }
  676.     set pid [SaCU:ForkCmd $cmd $argList outPipe errPipe]
  677.     SaCU:PollCmd $outPipe $errPipe outReturn errReturn
  678.     close $outPipe
  679.     close $errPipe
  680.     set exitStatus [wait $pid]
  681.  
  682.  
  683.     if {[lindex $exitStatus 1] != "EXIT"} {
  684.         ErrorPush errStack 0 SCO_CMD_UTIL_ERR_NO_EXIT \
  685.                   [list $cmd [lrange $exitStatus 1 end] $errReturn]
  686.         if {$messageId != ""} {
  687.             ErrorPush errStack 0 $messageId $msgArgList
  688.         }
  689.         if $throw {
  690.             ErrorThrow errStack
  691.         }
  692.         return $outReturn
  693.     } else {
  694.         if ![lempty $exitCodeVar] {
  695.             upvar $exitCodeVar exitCode
  696.             set exitCode [lindex $exitStatus 2]
  697.         }
  698.     }
  699.  
  700.  
  701.     if {$errReturn != ""} {
  702.         set cmdName [file tail $cmd]
  703.         ErrorPush errStack 0 $cmdErrId [list $errReturn] [lindex $exitStatus 2]
  704.         if {$messageId != ""} {
  705.             ErrorPush errStack 0 $messageId $msgArgList
  706.         }
  707.         if $throw {
  708.             ErrorThrow errStack
  709.         }
  710.     }
  711.     return $outReturn
  712.  
  713. }
  714.  
  715. #@package: SCO_CMD_UTIL_MSGS SCO_CMD_UTIL_MSGS
  716.  
  717. proc SCO_CMD_UTIL_MSGS {} {}
  718.  
  719. global SCO_CMD_UTIL_MSGS
  720. set SCO_CMD_UTIL_MSGS(@catalog@) {sysadm.cat@sa 9}
  721. set SCO_CMD_UTIL_MSGS(ERR_NO_EXIT) {1 {%1$s terminated with %2$s, stderr: %3$s}}
  722. set SCO_CMD_UTIL_MSGS(ERR_EXEC) {2 {exec of \"%1$s\" failed: %2$s}}
  723.  
  724. #@package: SCO_NONSTD_CMDS_MSGS SCO_NONSTD_CMDS_MSGS
  725.  
  726. proc SCO_NONSTD_CMDS_MSGS {} {}
  727.  
  728. global SCO_NONSTD_CMDS_MSGS
  729. set SCO_NONSTD_CMDS_MSGS(@catalog@) {sysadm.cat@sa 10}
  730. set SCO_NONSTD_CMDS_MSGS(ERR_accept) {1 %s}
  731. set SCO_NONSTD_CMDS_MSGS(ERR_auths) {2 %s}
  732. set SCO_NONSTD_CMDS_MSGS(ERR_brand) {3 %s}
  733. set SCO_NONSTD_CMDS_MSGS(ERR_cancel) {4 %s}
  734. set SCO_NONSTD_CMDS_MSGS(ERR_cat) {5 %s}
  735. set SCO_NONSTD_CMDS_MSGS(ERR_chgrp) {6 %s}
  736. set SCO_NONSTD_CMDS_MSGS(ERR_chmod) {7 %s}
  737. set SCO_NONSTD_CMDS_MSGS(ERR_chown) {8 %s}
  738. set SCO_NONSTD_CMDS_MSGS(ERR_configure) {9 %s}
  739. set SCO_NONSTD_CMDS_MSGS(ERR_copy) {10 %s}
  740. set SCO_NONSTD_CMDS_MSGS(ERR_cp) {11 %s}
  741. set SCO_NONSTD_CMDS_MSGS(ERR_devtree) {12 %s}
  742. set SCO_NONSTD_CMDS_MSGS(ERR_df) {13 %s}
  743. set SCO_NONSTD_CMDS_MSGS(ERR_disable) {14 %s}
  744. set SCO_NONSTD_CMDS_MSGS(ERR_dkconfig) {15 %s}
  745. set SCO_NONSTD_CMDS_MSGS(ERR_dprint) {16 %s}
  746. set SCO_NONSTD_CMDS_MSGS(ERR_enable) {17 %s}
  747. set SCO_NONSTD_CMDS_MSGS(ERR_exportfs) {18 %s}
  748. set SCO_NONSTD_CMDS_MSGS(ERR_find) {19 %s}
  749. set SCO_NONSTD_CMDS_MSGS(ERR_format) {20 %s}
  750. set SCO_NONSTD_CMDS_MSGS(ERR_fsck) {21 %s}
  751. set SCO_NONSTD_CMDS_MSGS(ERR_fsstat) {22 %s}
  752. set SCO_NONSTD_CMDS_MSGS(ERR_fstyp) {23 %s}
  753. set SCO_NONSTD_CMDS_MSGS(ERR_hostname) {24 %s}
  754. set SCO_NONSTD_CMDS_MSGS(ERR_link_unix) {25 %s}
  755. set SCO_NONSTD_CMDS_MSGS(ERR_ln) {26 %s}
  756. set SCO_NONSTD_CMDS_MSGS(ERR_lpadmin) {27 %s}
  757. set SCO_NONSTD_CMDS_MSGS(ERR_lpsched) {28 %s}
  758. set SCO_NONSTD_CMDS_MSGS(ERR_lpshut) {29 %s}
  759. set SCO_NONSTD_CMDS_MSGS(ERR_lpstat) {30 %s}
  760. set SCO_NONSTD_CMDS_MSGS(ERR_lpusers) {31 %s}
  761. set SCO_NONSTD_CMDS_MSGS(ERR_lp) {32 %s}
  762. set SCO_NONSTD_CMDS_MSGS(ERR_lpd) {33 %s}
  763. set SCO_NONSTD_CMDS_MSGS(ERR_lpmove) {34 %s}
  764. set SCO_NONSTD_CMDS_MSGS(ERR_lpfilter) {35 %s}
  765. set SCO_NONSTD_CMDS_MSGS(ERR_lpform) {36 %s}
  766. set SCO_NONSTD_CMDS_MSGS(ERR_ls) {37 %s}
  767. set SCO_NONSTD_CMDS_MSGS(ERR_mkdev) {38 %s}
  768. set SCO_NONSTD_CMDS_MSGS(ERR_mkdir) {39 %s}
  769. set SCO_NONSTD_CMDS_MSGS(ERR_mknod) {40 %s}
  770. set SCO_NONSTD_CMDS_MSGS(ERR_mnt) {41 %s}
  771. set SCO_NONSTD_CMDS_MSGS(ERR_mount) {42 %s}
  772. set SCO_NONSTD_CMDS_MSGS(ERR_mountd) {43 %s}
  773. set SCO_NONSTD_CMDS_MSGS(ERR_mv) {44 %s}
  774. set SCO_NONSTD_CMDS_MSGS(ERR_nfsd) {45 %s}
  775. set SCO_NONSTD_CMDS_MSGS(ERR_nfstyp) {46 %s}
  776. set SCO_NONSTD_CMDS_MSGS(ERR_nping) {47 %s}
  777. set SCO_NONSTD_CMDS_MSGS(ERR_nwlpadmin) {48 %s}
  778. set SCO_NONSTD_CMDS_MSGS(ERR_nwservers) {49 %s}
  779. set SCO_NONSTD_CMDS_MSGS(ERR_nwvolumes) {50 %s}
  780. set SCO_NONSTD_CMDS_MSGS(ERR_ping) {51 %s}
  781. set SCO_NONSTD_CMDS_MSGS(ERR_ps) {52 %s}
  782. set SCO_NONSTD_CMDS_MSGS(ERR_reject) {53 %s}
  783. set SCO_NONSTD_CMDS_MSGS(ERR_rm) {54 %s}
  784. set SCO_NONSTD_CMDS_MSGS(ERR_scoprint) {55 %s}
  785. set SCO_NONSTD_CMDS_MSGS(ERR_secdefs) {56 %s}
  786. set SCO_NONSTD_CMDS_MSGS(ERR_sed) {57 %s}
  787. set SCO_NONSTD_CMDS_MSGS(ERR_share) {58 %s}
  788. set SCO_NONSTD_CMDS_MSGS(ERR_showmount) {59 %s}
  789. set SCO_NONSTD_CMDS_MSGS(ERR_tape) {60 %s}
  790. set SCO_NONSTD_CMDS_MSGS(ERR_umount) {61 %s}
  791. set SCO_NONSTD_CMDS_MSGS(ERR_uname) {62 %s}
  792. set SCO_NONSTD_CMDS_MSGS(ERR_unshare) {63 %s}
  793. set SCO_NONSTD_CMDS_MSGS(ERR_who) {64 %s}
  794. set SCO_NONSTD_CMDS_MSGS(ERR_xdtarch) {65 %s}
  795. set SCO_NONSTD_CMDS_MSGS(ERR_objcall) {66 %s}
  796.  
  797.  
  798. #@package: SaGetOpt getopt SaGetOpt:Reset
  799.  
  800.  
  801. set optind        0    
  802. set optarg        ""
  803. set SaGetOpt_optindChar    1    
  804. set SaGetOpt_optindArg    1
  805. set SaGetOpt_state    "arg"
  806.  
  807.  
  808. proc SaGetOpt:Reset {} {
  809.     global SaGetOpt_optindChar SaGetOpt_optindArg SaGetOpt_state
  810.     global optind optarg
  811.     set SaGetOpt_optindChar    1    
  812.     set SaGetOpt_optindArg    1
  813.     set SaGetOpt_state        "arg"
  814. }
  815.  
  816.  
  817. proc SaGetOpt:CharFromString {index str} {
  818.     return [string range $str $index $index]
  819. }
  820.  
  821. proc getopt {argc argv optstr} {
  822.  
  823.     global optind opterr optarg
  824.     global SaGetOpt_state SaGetOpt_optindChar SaGetOpt_optindArg 
  825.  
  826.     if {![info exists opterr]} {
  827.         set opterr    1    ;# booelan - error to stderr
  828.     }
  829.     while {1} {
  830.         if {$optind >= $argc} {
  831.             return -1
  832.         }
  833.         case $SaGetOpt_state {
  834.             {arg} {
  835.                 set SaGetOpt_optindChar 1
  836.                 set arg [lindex $argv $optind]
  837.                 set opt [SaGetOpt:CharFromString 0 $arg]
  838.                 if {$opt != "-"} {
  839.                     SaGetOpt:Reset
  840.                     return -1
  841.                 }
  842.                 if {$arg == "--"} {
  843.                     set optind [expr "$optind + 1"]    
  844.                     SaGetOpt:Reset
  845.                     return -1
  846.                 }
  847.                 set SaGetOpt_state option
  848.                 continue
  849.             }
  850.             {option} {
  851.                 set arg [lindex $argv $optind]
  852.                 if {$SaGetOpt_optindChar >= [string length $arg]} {
  853.                     set SaGetOpt_state arg
  854.                     set optind $SaGetOpt_optindArg
  855.                     set SaGetOpt_optindArg \
  856.                         [expr "$SaGetOpt_optindArg + 1" ]
  857.                     continue
  858.                 }
  859.                 set opt [SaGetOpt:CharFromString $SaGetOpt_optindChar $arg]
  860.                 set SaGetOpt_optindChar [expr "$SaGetOpt_optindChar + 1" ]
  861.                 if {[set i [string first $opt $optstr]] == -1} {
  862.                     if {$opterr} {
  863.                         puts stderr [IntlLocalizeMsg SCO_GETOPT_ERR_BADOPT $opt]
  864.                     }
  865.                     return "?"
  866.                 }
  867.                 if {[SaGetOpt:CharFromString \
  868.                     [expr "$i + 1"] $optstr] == ":"} {
  869.                     if {$SaGetOpt_optindChar < \
  870.                         [string length $arg]} {
  871.                         set optarg [string range \
  872.                             $arg \
  873.                             $SaGetOpt_optindChar \
  874.                             end]
  875.                         set SaGetOpt_state arg
  876.                         set optind $SaGetOpt_optindArg
  877.                         set SaGetOpt_optindArg \
  878.                             [expr "$optind + 1" ]
  879.                     } else {
  880.                         if {$SaGetOpt_optindArg >= $argc} {
  881.                             if {$opterr} {
  882.                                puts stderr [IntlLocalizeMsg \
  883.                                 SCO_GETOPT_ERR_MISSING \
  884.                         $opt]
  885.                             }
  886.                             return "?"
  887.                         }
  888.                         set optarg [lindex $argv $SaGetOpt_optindArg] 
  889.                         set SaGetOpt_optindArg [expr "$SaGetOpt_optindArg + 1"]
  890.                     }
  891.                 }
  892.                 return $opt
  893.             }
  894.         }
  895.     }
  896. }
  897.  
  898. #@packend: SaGetOpt
  899.  
  900. #@package: SCO_GETOPT_MSGS SCO_GETOPT_MSGS
  901.  
  902. proc SCO_GETOPT_MSGS {} {}
  903.  
  904. global SCO_GETOPT_MSGS
  905. set SCO_GETOPT_MSGS(@catalog@) {sysadm.cat@sa 16}
  906. set SCO_GETOPT_MSGS(ERR_BADOPT) {1 {getopt: illegal option -- %s}}
  907. set SCO_GETOPT_MSGS(ERR_MISSING) {2 {getopt: option requires an argument -- %s}}
  908.  
  909.  
  910. #@package: SaBR BmipResponseOperation BmipResponseOperation BmipResponseClass BmipResponseObjectInstance BmipResponseAttrValList BmipResponseActionType BmipResponseActionInfo BmipResponseErrorStack BmipResponseErrorId BmipResponseErrorText BmipResponseErrorIsPresent
  911.  
  912.  
  913. proc BmipResponseOperation {bmipVarName} {
  914.         upvar $bmipVarName bmipResponse
  915.  
  916.         return [lindex $bmipResponse 0]
  917. }
  918.  
  919.  
  920. proc BmipResponseClass {bmipVarName} {
  921.         upvar $bmipVarName bmipResponse
  922.  
  923.         return [lindex $bmipResponse 1]
  924. }
  925.  
  926.  
  927. proc BmipResponseObjectInstance {bmipVarName} {
  928.         upvar $bmipVarName bmipResponse
  929.  
  930.         return [lindex $bmipResponse 2]
  931. }
  932.  
  933.  
  934. proc BmipResponseAttrValList {bmipVarName} {
  935.         upvar $bmipVarName bmipResponse
  936.  
  937.         return [lindex $bmipResponse 3]
  938. }
  939.  
  940.  
  941. proc BmipResponseActionType {bmipVarName} {
  942.         upvar $bmipVarName bmipResponse
  943.  
  944.         return [lindex $bmipResponse 4]
  945. }
  946.  
  947.  
  948. proc BmipResponseActionInfo {bmipVarName} {
  949.         upvar $bmipVarName bmipResponse
  950.  
  951.         return [lindex $bmipResponse 5]
  952. }
  953.  
  954.  
  955. proc BmipResponseErrorStack {bmipVarName} {
  956.         upvar $bmipVarName bmipResponse
  957.  
  958.         return [lindex $bmipResponse 6]
  959. }
  960.  
  961.  
  962. proc BmipResponseErrorId {bmipVarName {index 0}} {
  963.         upvar $bmipVarName bmipResponse
  964.  
  965.         set errorStack [lindex $bmipResponse 6]
  966.         if {[string match $index end]} {
  967.             set index [expr "[llength $errorStack] - 1"]
  968.         }
  969.         return [lindex [lindex $errorStack $index] 0]
  970. }
  971.  
  972.  
  973. proc BmipResponseErrorText {bmipVarName {index 0}} {
  974.         upvar $bmipVarName bmipResponse
  975.  
  976.         set errorStack [lindex $bmipResponse 6]
  977.         if {[string match $index end]} {
  978.             set index [expr "[llength $errorStack] - 1"]
  979.         }
  980.         return [lindex [lindex $errorStack $index] 1]
  981. }
  982.  
  983.  
  984. proc BmipResponseErrorIsPresent {bmipVarName} {
  985.         upvar $bmipVarName bmipResponse
  986.  
  987.         if {"" != [lindex $bmipResponse 6]} {
  988.                 return 1
  989.         }
  990.         return 0
  991. }
  992.  
  993.  
  994. #@package: SCO_OSA_MSGS SCO_OSA_MSGS
  995.  
  996. proc SCO_OSA_MSGS {} {}
  997.  
  998. global SCO_OSA_MSGS
  999. set SCO_OSA_MSGS(@catalog@) {fw.cat@sa 2}
  1000. set SCO_OSA_MSGS(ERR_ACCESS_DENIED) {1 {The requested operation was not performed for reasons pertinent to the security of the system.}}
  1001. set SCO_OSA_MSGS(ERR_CLASS_INSTANCE_CONFLICT) {2 {The specified managed object instance is not a member of the specified class.}}
  1002. set SCO_OSA_MSGS(ERR_DUPLICATE_INVOCATION) {3 {The invoke identifier specified is allocated to another operation.}}
  1003. set SCO_OSA_MSGS(ERR_DUPLICATE_MANAGED_OBJECT_INSTANCE) {4 {The object instance %s already exists.}}
  1004. set SCO_OSA_MSGS(ERR_GET_LIST_ERROR) {5 %s}
  1005. set SCO_OSA_MSGS(ERR_INVALID_ARGUMENT_VALUE) {6 {The action information value specified, %s, was out of range or otherwise inappropriate.}}
  1006. set SCO_OSA_MSGS(ERR_INVALID_ATTRIBUTE_VALUE) {7 {The value supplied for attribute %s is invalid.}}
  1007. set SCO_OSA_MSGS(ERR_INVALID_FILTER) {8 {A filter parameter, %s, contains an invalid assertion or an unrecognized logical operator.}}
  1008. set SCO_OSA_MSGS(ERR_INVALID_SCOPE) {9 {The value of the scope parameter, %s, is invalid.}}
  1009. set SCO_OSA_MSGS(ERR_INVALID_OBJECT_INSTANCE) {10 {An object name, %s, violates the naming rules.}}
  1010. set SCO_OSA_MSGS(ERR_MISSING_ATTRIBUTE_VALUE) {11 {An attribute, %s, was given without an associated value.}}
  1011. set SCO_OSA_MSGS(ERR_MISTYPED_ARGUMENT) {12 {One of the parameters supplied, %s, is not supported by this service.}}
  1012. set SCO_OSA_MSGS(ERR_NO_SUCH_ACTION) {13 {The action type %s is not implemented.}}
  1013. set SCO_OSA_MSGS(ERR_NO_SUCH_ARGUMENT) {14 {The action information specified was not supported.}}
  1014. set SCO_OSA_MSGS(ERR_NO_SUCH_ATTRIBUTE) {15 {No such attribute %1$s in class %2$s}}
  1015. set SCO_OSA_MSGS(ERR_NO_SUCH_OBJECT_CLASS) {16 {The class %s has not been bound to the framework.}}
  1016. set SCO_OSA_MSGS(ERR_NO_SUCH_OBJECT_INSTANCE) {17 {The object instance %s does not exist.}}
  1017. set SCO_OSA_MSGS(ERR_NO_SUCH_REFERENCE_OBJECT) {18 {The reference object %s does not exist.}}
  1018. set SCO_OSA_MSGS(ERR_PROCESSING_FAILURE) {19 {General failure occured in processing the request.}}
  1019. set SCO_OSA_MSGS(ERR_PROCESSING_FAILURE_ON_ATTRIBUTE) {20 {General failure occured in processing attribute %s}}
  1020. set SCO_OSA_MSGS(ERR_RESOURCE_LIMITATION) {21 {The operation failed due to lack of a needed resource.}}
  1021. set SCO_OSA_MSGS(ERR_SET_LIST_ERROR) {22 %s}
  1022. set SCO_OSA_MSGS(ERR_SYNC_NOT_SUPPORTED) {23 {The type of synchronization specified, %s, is not supported.}}
  1023. set SCO_OSA_MSGS(ERR_UNRECOGNIZED_OPERATION) {24 {The operation attempted, %s, is not supported.}}
  1024.  
  1025.  
  1026. #@package: SaSH SaSelectHostText SaSelectHostDialog SaSelectHostGetText SaSelectHostGetTextWidget SaSelectHostGetButtonWidget SaSelectHostGetSelection
  1027.  
  1028.  
  1029.  
  1030.  
  1031. proc SCO_SA_SELHOST_MSGS {} {}
  1032.  
  1033. global SCO_SA_SELHOST_MSGS
  1034. set SCO_SA_SELHOST_MSGS(@catalog@) {sysadm.cat@sa 24}
  1035. set SCO_SA_SELHOST_MSGS(MSG_DIALOG_TITLE) {1 {Select Host}}
  1036. set SCO_SA_SELHOST_MSGS(MSG_LLABEL_NAME) {2 {Host Name}}
  1037. set SCO_SA_SELHOST_MSGS(MSG_LLABEL_ADDR) {3 {IP Address}}
  1038. set SCO_SA_SELHOST_MSGS(MSG_BOXLABEL_SORTBY) {4 {Sort By:}}
  1039. set SCO_SA_SELHOST_MSGS(MSG_TOGGLE_BYNAME) {5 Name}
  1040. set SCO_SA_SELHOST_MSGS(MSG_TOGGLE_BYADDR) {6 Address}
  1041. set SCO_SA_SELHOST_MSGS(MSG_TXTLABEL_FILTER) {7 Filter:}
  1042. set SCO_SA_SELHOST_MSGS(MSG_TXTLABEL_SELECTION) {8 Selection:}
  1043. set SCO_SA_SELHOST_MSGS(MSG_CANCELBUTTON) {9 Cancel}
  1044. set SCO_SA_SELHOST_MSGS(MSG_APPLYBUTTON) {10 Filter}
  1045. set SCO_SA_SELHOST_MSGS(MSG_LIST_HELP) {11 {Select from list, or enter a name in the 'selection' field}}
  1046. set SCO_SA_SELHOST_MSGS(MSG_SORT_NAME_HELP) {12 {Sort list alphabetically by name}}
  1047. set SCO_SA_SELHOST_MSGS(MSG_SORT_ADDR_HELP) {13 {Sort list numerically by IP address}}
  1048. set SCO_SA_SELHOST_MSGS(MSG_FILTER_CHARM_HELP) {14 {Enter a pattern to match, use <Enter> key to activate}}
  1049. set SCO_SA_SELHOST_MSGS(MSG_FILTER_MOTIF_HELP) {15 {Enter a pattern to match}}
  1050. set SCO_SA_SELHOST_MSGS(MSG_SELECTION_HELP) {16 {Enter host here, or use the list to select a host}}
  1051. set SCO_SA_SELHOST_MSGS(ERR_NO_HOST_SELECTED) {17 {No Host has been selected}}
  1052. set SCO_SA_SELHOST_MSGS(ERR_NO_HOST_MATCH) {18 {No hosts match that filter}}
  1053. set SCO_SA_SELHOST_MSGS(ERR_BAD_HOST) {19 {Invalid host name entered}}
  1054. set SCO_SA_SELHOST_MSGS(ERR_CODE_ERR) {20 {Error:  data missing from parameter list}}
  1055. set SCO_SA_SELHOST_MSGS(MSG_RETRIEVING) {21 {Retrieving host information...}}
  1056.  
  1057.  
  1058.  
  1059.  
  1060. proc SaSelectHostText {pList} {
  1061.  
  1062.     global SaSH_info
  1063.  
  1064.     if {[keylget pList parent parent] == 0} {
  1065.     ErrorPush errorStack 1 SCO_SA_SELHOST_ERR_CODE_ERR 
  1066.     }
  1067.     if {[keylget pList instance instance] == 0} {
  1068.     ErrorPush errorStack 1 SCO_SA_SELHOST_ERR_CODE_ERR 
  1069.     }
  1070.     if {[keylget pList labeltype labeltype] == 0} {
  1071.     set labeltype title
  1072.     }
  1073.     if {[keylget pList labeltext labeltext] == 0} {
  1074.     ErrorPush errorStack 1 SCO_SA_SELHOST_ERR_CODE_ERR 
  1075.     }
  1076.     if {[keylget pList textcols textcols] == 0} {
  1077.     set textcols 30
  1078.     }
  1079.     if {[keylget pList buttontext buttontext] == 0} {
  1080.     ErrorPush errorStack 1 SCO_SA_SELHOST_ERR_CODE_ERR 
  1081.     }
  1082.     if {[keylget pList show show] == 0} {
  1083.     set show name
  1084.     }
  1085.     if {[keylget pList userproc userproc] == 0} {
  1086.     set userproc {} 
  1087.     } 
  1088.  
  1089.     set returnform [VtForm $parent.SaSH_form -marginHeight 0 -marginWidth 0]
  1090.  
  1091.     if {$labeltype == "label"} {
  1092.  
  1093.     set innerform [VtForm $returnform.innerform -marginHeight 0 -marginWidth 0]
  1094.     VtSetValues $innerform -leftSide FORM -rightSide FORM
  1095.  
  1096.     set textlabel [VtLabel $innerform.textlabel -label $labeltext]    
  1097.  
  1098.     set textfield [VtText $innerform.textfield \
  1099.         -columns $textcols]
  1100.     if {![lempty $userproc]} {
  1101.         VtSetValues $textfield -callback $userproc
  1102.     }
  1103.         keylset pList textfield $textfield
  1104.  
  1105.     set pushbutton [VtPushButton $innerform.button \
  1106.         -label $buttontext \
  1107.         -callback "SaSelectHostDialog {$pList}" ]
  1108.  
  1109.     set lheight [lindex [VtGetValues $textlabel -baseLineList] 0]
  1110.     set theight [lindex [VtGetValues $textfield -baseLineList] 0]
  1111.     set bheight [lindex [VtGetValues $pushbutton -baseLineList] 0]
  1112.  
  1113.     if {$lheight >= $theight && $lheight >= $bheight} {
  1114.  
  1115.         set diff1 [expr $lheight - $theight]
  1116.         set diff2 [expr $lheight - $bheight]
  1117.  
  1118.         VtSetValues $textlabel \
  1119.         -leftSide FORM -rightSide NONE \
  1120.         -topSide FORM -MOTIF_topOffset 0
  1121.  
  1122.         VtSetValues $textfield \
  1123.         -leftSide $textlabel -MOTIF_leftOffset 3 \
  1124.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  1125.         -topSide FORM -MOTIF_topOffset $diff1
  1126.  
  1127.         VtSetValues $pushbutton \
  1128.         -leftSide NONE \
  1129.         -rightSide FORM \
  1130.         -topSide FORM -MOTIF_topOffset $diff2
  1131.  
  1132.     } elseif {$theight >= $bheight} {
  1133.  
  1134.         set diff1 [expr $theight - $lheight]
  1135.         set diff2 [expr $theight - $bheight]
  1136.  
  1137.         VtSetValues $textlabel \
  1138.         -leftSide FORM -rightSide NONE \
  1139.         -topSide FORM -MOTIF_topOffset $diff1
  1140.  
  1141.         VtSetValues $textfield \
  1142.         -leftSide $textlabel -MOTIF_leftOffset 3 \
  1143.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  1144.         -topSide FORM -MOTIF_topOffset 0
  1145.  
  1146.         VtSetValues $pushbutton \
  1147.         -leftSide NONE \
  1148.         -rightSide FORM \
  1149.         -topSide FORM -MOTIF_topOffset $diff2
  1150.  
  1151.     } else {
  1152.  
  1153.         set diff1 [expr $bheight - $lheight]
  1154.         set diff2 [expr $bheight - $theight]
  1155.  
  1156.         VtSetValues $textlabel \
  1157.         -leftSide FORM -rightSide NONE \
  1158.         -topSide FORM -MOTIF_topOffset $diff1
  1159.  
  1160.         VtSetValues $textfield \
  1161.         -leftSide $textlabel -MOTIF_leftOffset 3 \
  1162.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  1163.         -topSide FORM -MOTIF_topOffset $diff2
  1164.  
  1165.         VtSetValues $pushbutton \
  1166.         -leftSide NONE \
  1167.         -rightSide FORM \
  1168.         -topSide FORM -MOTIF_topOffset 0
  1169.     }
  1170.  
  1171.     VtSetValues $textlabel -leftSide FORM -rightSide NONE 
  1172.  
  1173.     VtSetValues $textfield -leftSide $textlabel -MOTIF_leftOffset 3 \
  1174.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  1175.         -topSide FORM
  1176.  
  1177.     VtSetValues $pushbutton -leftSide NONE \
  1178.         -rightSide FORM -topSide FORM
  1179.  
  1180.     } else {
  1181.  
  1182.     set textlabel [VtLabel $returnform.textlabel -label $labeltext]    
  1183.  
  1184.     set innerform [VtForm $returnform.innerform -marginHeight 0 -marginWidth 0]
  1185.     VtSetValues $innerform -leftSide FORM -rightSide FORM
  1186.  
  1187.     set textfield [VtText $innerform.textfield \
  1188.         -columns $textcols]
  1189.     if {![lempty $userproc]} {
  1190.         VtSetValues $textfield -callback $userproc
  1191.     }
  1192.         keylset pList textfield $textfield
  1193.  
  1194.     set pushbutton [VtPushButton $innerform.button \
  1195.         -label $buttontext \
  1196.         -callback "SaSelectHostDialog {$pList}" ]
  1197.  
  1198.     set theight [lindex [VtGetValues $textfield -baseLineList] 0]
  1199.     set bheight [lindex [VtGetValues $pushbutton -baseLineList] 0]
  1200.  
  1201.     set diff [abs ([expr $theight - $bheight])]
  1202.  
  1203.     if {$theight > $bheight} {
  1204.  
  1205.         VtSetValues $textfield -leftSide FORM \
  1206.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  1207.         -topSide FORM -MOTIF_topOffset 0
  1208.  
  1209.         VtSetValues $pushbutton \
  1210.         -leftSide NONE -rightSide FORM \
  1211.         -topSide FORM -MOTIF_topOffset $diff
  1212.  
  1213.     } else {
  1214.  
  1215.         VtSetValues $textfield -leftSide FORM \
  1216.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  1217.         -topSide FORM -MOTIF_topOffset $diff
  1218.  
  1219.         VtSetValues $pushbutton \
  1220.         -leftSide NONE -rightSide FORM \
  1221.         -topSide FORM -MOTIF_topOffset 0
  1222.     }
  1223.     }
  1224.  
  1225.     set SaSH_info($instance:textwidgetname) $textfield
  1226.     set SaSH_info($instance:button) $pushbutton
  1227.     set SaSH_info($instance:has_textwidget) TRUE
  1228.     set SaSH_info(showvalue) $show
  1229.  
  1230.     VxSetVar $returnform text $textfield
  1231.     VxSetVar $returnform label $textlabel 
  1232.     VxSetVar $returnform button $pushbutton
  1233.  
  1234.     return $returnform
  1235. }
  1236.  
  1237.  
  1238.  
  1239. proc SaSelectHostDialog {pList cbs} {
  1240.     global SaSH_info
  1241.     global SaSH_gl_host_list SaSH_radio_value
  1242.  
  1243.     set parent [keylget cbs dialog]
  1244.  
  1245.     VtLock 
  1246.  
  1247.     if {[keylget pList instance instance] == 0} {
  1248.     VtUnLock
  1249.     ErrorPush errorStack 1 SCO_SA_SELHOST_ERR_CODE_ERR 
  1250.     }
  1251.     if {[keylget pList show show] == 0} {
  1252.     set show name
  1253.     }
  1254.     if {[keylget pList title title] == 0} {
  1255.     set title [IntlLocalizeMsg SCO_SA_SELHOST_MSG_DIALOG_TITLE]
  1256.     }
  1257.     if {[keylget pList textcols textcols] == 0} {
  1258.     set textcols 30
  1259.     }
  1260.     if {[keylget pList userproc userproc] == 0} {
  1261.     set userproc {}
  1262.     }
  1263.     if {[keylget pList textfield textfield] == 0} {
  1264.     set textfield {}
  1265.     }
  1266.  
  1267.  
  1268.     set SaSH_info(showvalue) $show
  1269.  
  1270.     set selhostdlog [VtFormDialog $parent.selhostdlog \
  1271.     -title $title \
  1272.     -ok \
  1273.     -okCallback [list SaSH:ProcessUserSelectionCB $instance $userproc ] \
  1274.     -cancel \
  1275.     -cancelLabel [IntlLocalizeMsg SCO_SA_SELHOST_MSG_CANCELBUTTON] \
  1276.     -cancelCallback SaSH:EndFormCB \
  1277.     -cancelButton CANCEL \
  1278.     -MOTIF_apply \
  1279.     -MOTIF_applyLabel [IntlLocalizeMsg SCO_SA_SELHOST_MSG_APPLYBUTTON] \
  1280.     -MOTIF_applyCallback SaSH:ApplyFilterCB \
  1281.     -MOTIF_autoLock SaSH:ApplyFilterCB \
  1282.     -help \
  1283.     -wmShadowThickness 0]
  1284.     SaCharmSetMaxFormDimensions $selhostdlog 1
  1285.     set listform [VtForm $selhostdlog.listform -marginHeight 0 -marginWidth 0]
  1286.  
  1287.     set namelabel [IntlLocalizeMsg SCO_SA_SELHOST_MSG_LLABEL_NAME]
  1288.     set addrlabel [IntlLocalizeMsg SCO_SA_SELHOST_MSG_LLABEL_ADDR]
  1289.     if [VtInfo -charm] {
  1290.     set labelstring [format "   %-30.30s  %s" $namelabel $addrlabel] 
  1291.     } else {
  1292.     set labelstring [format "%-30.30s  %s" $namelabel $addrlabel] 
  1293.     }
  1294.     set listlabel [VtLabel $listform.listlabel \
  1295.     -label $labelstring \
  1296.     -labelLeft]
  1297.  
  1298.     set hostlist [VtList $listform.hostlist \
  1299.     -autoSelect 1 \
  1300.     -rows 12 \
  1301.     -itemList {} \
  1302.     -shortHelpString [IntlLocalizeMsg SCO_SA_SELHOST_MSG_LIST_HELP] \
  1303.     -shortHelpCallback SaShortHelpCB \
  1304.     -callback "SaSH:HostListSelectCB $show" \
  1305.     -defaultCallback "SaSH:HostListEnterCB $show" ]
  1306.  
  1307.     set optionsform [VtForm $selhostdlog.optform -marginHeight 0 -marginWidth 0]
  1308.  
  1309.     set sortlabel [VtLabel $optionsform.sortlabel \
  1310.     -label [IntlLocalizeMsg SCO_SA_SELHOST_MSG_BOXLABEL_SORTBY] \
  1311.     -labelLeft]
  1312.     set sortbox [VtRadioBox $optionsform.sortbox \
  1313.     -autoSelect 1 \
  1314.     -borderWidth 1 \
  1315.     -numColumns 2 \
  1316.     ]
  1317.  
  1318.     set byname [VtToggleButton $sortbox.byname \
  1319.     -callback "SaSH:ChangeSortCB $instance" \
  1320.     -autoLock SaSH:ChangeSortCB \
  1321.     -shortHelpString [IntlLocalizeMsg SCO_SA_SELHOST_MSG_SORT_NAME_HELP] \
  1322.     -shortHelpCallback SaShortHelpCB \
  1323.     -label [IntlLocalizeMsg SCO_SA_SELHOST_MSG_TOGGLE_BYNAME] ]
  1324.     set byaddr [VtToggleButton $sortbox.byaddr \
  1325.     -callback "SaSH:ChangeSortCB $instance" \
  1326.     -autoLock SaSH:ChangeSortCB \
  1327.     -shortHelpString [IntlLocalizeMsg SCO_SA_SELHOST_MSG_SORT_ADDR_HELP] \
  1328.     -shortHelpCallback SaShortHelpCB \
  1329.     -label [IntlLocalizeMsg SCO_SA_SELHOST_MSG_TOGGLE_BYADDR] ]
  1330.  
  1331.     set flabel [VtLabel $optionsform.flabel \
  1332.     -label [IntlLocalizeMsg SCO_SA_SELHOST_MSG_TXTLABEL_FILTER] \
  1333.     -labelLeft]
  1334.     set filter [VtText $optionsform.filter \
  1335.     -MOTIF_shortHelpString \
  1336.         [IntlLocalizeMsg SCO_SA_SELHOST_MSG_FILTER_MOTIF_HELP] \
  1337.     -CHARM_shortHelpString \
  1338.         [IntlLocalizeMsg SCO_SA_SELHOST_MSG_FILTER_CHARM_HELP] \
  1339.     -shortHelpCallback SaShortHelpCB \
  1340.     -autoLock SaSH:ApplyFilterCB \
  1341.     -callback SaSH:ApplyFilterCB]
  1342.  
  1343.     if [VtInfo -charm]  {
  1344.     set textcols 28
  1345.     }
  1346.     set slabel [VtLabel $optionsform.slabel \
  1347.     -label [IntlLocalizeMsg SCO_SA_SELHOST_MSG_TXTLABEL_SELECTION] \
  1348.     -labelLeft]
  1349.     set selection [VtText $optionsform.selection \
  1350.     -columns $textcols \
  1351.     -shortHelpString [IntlLocalizeMsg SCO_SA_SELHOST_MSG_SELECTION_HELP] \
  1352.     -shortHelpCallback SaShortHelpCB \
  1353.     -autoLock SaSH:HostTextCB \
  1354.     -callback SaSH:HostTextCB \
  1355.     -horizontalScrollBar 1] 
  1356.     
  1357.     set statusBar [SaStatusBar $selhostdlog.statusbar]
  1358.  
  1359.  
  1360.     VtSetValues $listform \
  1361.     -topSide FORM \
  1362.     -leftSide FORM \
  1363.     -MOTIF_rightSide 55 -MOTIF_rightOffset 5 \
  1364.     -bottomSide $statusBar 
  1365.  
  1366.     VtSetValues $listlabel \
  1367.     -rightSide FORM -leftSide FORM \
  1368.     -topSide FORM -bottomSide NONE 
  1369.  
  1370.     VtSetValues $hostlist \
  1371.     -rightSide FORM -leftSide FORM \
  1372.     -topSide $listlabel -topOffset 0 -bottomSide FORM
  1373.  
  1374.  
  1375.     VtSetValues $optionsform \
  1376.     -topSide FORM \
  1377.     -CHARM_leftSide $listform -CHARM_leftOffset 1 \
  1378.     -MOTIF_leftSide 55 -MOTIF_leftOffset 5 \
  1379.     -rightSide FORM \
  1380.     -bottomSide $statusBar 
  1381.  
  1382.     VtSetValues $sortlabel \
  1383.     -topSide FORM -MOTIF_topOffset 10 \
  1384.     -bottomSide NONE \
  1385.     -leftSide FORM -leftOffset 0 \
  1386.     -rightSide FORM
  1387.     VtSetValues $sortbox \
  1388.     -topSide $sortlabel -topOffset 0 \
  1389.     -alignLeft $sortlabel \
  1390.     -bottomSide NONE \
  1391.     -leftSide FORM -rightSide FORM
  1392.  
  1393.     VtSetValues $flabel \
  1394.     -topSide $sortbox -topOffset 20 -CHARM_topOffset 2 \
  1395.     -bottomSide NONE \
  1396.     -leftSide FORM -rightSide FORM
  1397.     VtSetValues $filter \
  1398.     -topSide $flabel -topOffset 0 \
  1399.     -alignLeft $flabel \
  1400.     -bottomSide NONE \
  1401.     -leftSide FORM -rightSide FORM
  1402.  
  1403.     VtSetValues $slabel \
  1404.     -topSide $filter -topOffset 20 -CHARM_topOffset 2 \
  1405.     -bottomSide NONE \
  1406.     -leftSide FORM -rightSide FORM
  1407.     VtSetValues $selection \
  1408.     -topSide $slabel -topOffset 0 \
  1409.     -alignLeft $slabel \
  1410.     -bottomSide NONE -bottomOffset 0 \
  1411.     -leftSide FORM -rightSide FORM
  1412.  
  1413.     VtRemoveAllTabGroups $selhostdlog
  1414.     VtAddTabGroup $hostlist
  1415.     VtAddTabGroup $sortbox
  1416.     VtAddTabGroup $filter
  1417.     VtAddTabGroup $selection
  1418.  
  1419.     VxSetVar $selhostdlog hostlist $hostlist
  1420.     VxSetVar $selhostdlog sort $sortbox
  1421.     VxSetVar $selhostdlog byname $byname
  1422.     VxSetVar $selhostdlog byaddr $byaddr
  1423.     VxSetVar $selhostdlog filter $filter
  1424.     VxSetVar $selhostdlog text $selection
  1425.  
  1426.  
  1427.     VtShow $selhostdlog
  1428.     VtSetFocus $hostlist
  1429.  
  1430.     SaStatusBarSet $statusBar [IntlLocalizeMsg SCO_SA_SELHOST_MSG_RETRIEVING]
  1431.  
  1432.     if {![info exists SaSH_info(init)]} {
  1433.     set init 1
  1434.     set SaSH_info(init) [SaSH:init $textfield]
  1435.     } else {
  1436.     set init 0
  1437.     }
  1438.  
  1439.     if {"$SaSH_info(sortby)"== "name"} {
  1440.     set listitems [SaSH:SortByName] 
  1441.     } {
  1442.     set listitems [SaSH:SortByAddress]
  1443.     }
  1444.  
  1445.     VtListSetItem $hostlist -itemList $listitems
  1446.  
  1447.     set currentitem [lsearch $listitems $SaSH_info(screenselection)*]
  1448.  
  1449.     if {$currentitem != -1} {
  1450.     incr currentitem
  1451.     VtListSelectItem $hostlist -notify -position $currentitem
  1452.     SaListShowSelectedItem $hostlist
  1453.     }
  1454.  
  1455.     if {"$SaSH_info(sortby)"== "name"} {
  1456.     VtSetValues $byname -value 1
  1457.     } {
  1458.     VtSetValues $byaddr -value 1
  1459.     }
  1460.     set SaSH_radio_value [VtGetValues $sortbox -value]
  1461.  
  1462.     if {$init} {
  1463.         VtListSelectItem $hostlist -notify -position 1 
  1464.     SaListShowSelectedItem $hostlist
  1465.     }
  1466.  
  1467.  
  1468.     set name [lindex $SaSH_info(screenselection) 0]
  1469.     set addr [lindex $SaSH_info(screenselection) 1]
  1470.  
  1471.     case $show {
  1472.     "name" {
  1473.         set textdefault $name
  1474.     }
  1475.     "ipaddr" {
  1476.         set textdefault $addr
  1477.     }
  1478.     "both" { 
  1479.         set textdefault "$name   $addr"
  1480.     }
  1481.     default {
  1482.         set textdefault $name
  1483.     }
  1484.     }
  1485.  
  1486.     VtSetValues $selection -value $textdefault
  1487.     VtSetValues $filter -value $SaSH_info(filter)
  1488.  
  1489.     SaStatusBarClear $statusBar
  1490.  
  1491.     VtUnLock  
  1492. }
  1493.  
  1494.  
  1495. proc SaSH:SortByAddress {} {
  1496.     global SaSH_info
  1497.     global SaSH_gl_host_list
  1498.  
  1499.     set newlist ""
  1500.  
  1501.     foreach one $SaSH_gl_host_list {
  1502.         set addr [lindex $one 0]
  1503.     set name [lindex $one 1]
  1504.         lappend newlist [format "%s %s" $addr $name]
  1505.     }
  1506.  
  1507.     set sortedlist [lsort $newlist]
  1508.  
  1509.     set newlist ""
  1510.     foreach one $sortedlist {
  1511.     set addr [lindex $one 0]
  1512.     set name [lindex $one 1]
  1513.         lappend newlist [format "%-30.30s  %s" $name $addr]
  1514.     }
  1515.  
  1516.     return $newlist
  1517. }
  1518.  
  1519.  
  1520. proc SaSH:SortByName {} {
  1521.     global SaSH_info
  1522.     global SaSH_gl_host_list
  1523.   
  1524.     set newlist ""
  1525.  
  1526.     foreach one $SaSH_gl_host_list {
  1527.     set addr [lindex $one 0]
  1528.         set name [lindex $one 1]
  1529.         lappend newlist [format "%s %s" $name $addr]
  1530.     }
  1531.  
  1532.     set sortedlist [lsort $newlist]
  1533.  
  1534.     set newlist ""
  1535.     foreach one $sortedlist {
  1536.     set addr [lindex $one 1]
  1537.     set name [lindex $one 0]
  1538.         lappend newlist [format "%-30.30s  %s" $name $addr]
  1539.     }
  1540.  
  1541.     return $newlist
  1542. }
  1543.  
  1544.  
  1545. proc SaSH:ApplyFilterCB {cbs} {
  1546.     global SaSH_info
  1547.     global SaSH_gl_host_list
  1548.  
  1549.     VtLock
  1550.  
  1551.  
  1552.     set dlog [keylget cbs dialog]
  1553.     set widget [keylget cbs widget]
  1554.     set filter [VxGetVar $dlog filter]
  1555.     set hostlist [VxGetVar $dlog hostlist]
  1556.     set textfield [VxGetVar $dlog text]
  1557.     set sort [VxGetVar $dlog sort]
  1558.     set byname [VxGetVar $dlog byname]
  1559.  
  1560.     set SaSH_info(filter) [VtGetValues $filter -value]
  1561.     set hl  [SaHostsGet]
  1562.  
  1563.  
  1564.     set newhl ""
  1565.  
  1566.     foreach one $hl {
  1567.         set addr [lindex $one 0]
  1568.     set name [lindex $one 1]
  1569.  
  1570.  
  1571.     if {[string match $SaSH_info(filter) $addr]==1 || [string match $SaSH_info(filter) $name]==1 } {
  1572.         lappend newhl $one
  1573.     }
  1574.     }
  1575.  
  1576.      if {[llength $newhl]==0} {
  1577.     VtShow [VtInformationDialog $dlog.nohostmatch \
  1578.         -ok \
  1579.         -message [IntlLocalizeMsg SCO_SA_SELHOST_ERR_NO_HOST_MATCH] ]
  1580.      } else {
  1581.  
  1582.      set SaSH_gl_host_list $newhl
  1583.  
  1584.  
  1585.     set sortby [VtGetValues $sort -value]
  1586.        if {$sortby == $byname} {
  1587.            set listitems [SaSH:SortByName]
  1588.        } {
  1589.            set listitems [SaSH:SortByAddress]
  1590.        }
  1591.  
  1592.     VtListDeleteItem $hostlist -all
  1593.     VtListSetItem $hostlist -itemList $listitems
  1594.  
  1595.     set currentitem [lsearch $listitems $SaSH_info(screenselection)*]
  1596.  
  1597.     if {$currentitem != -1} {
  1598.         set show $SaSH_info(showvalue)
  1599.         incr currentitem
  1600.         VtListSelectItem $hostlist -notify -position $currentitem
  1601.         SaListShowSelectedItem $hostlist
  1602.         set name [lindex $SaSH_info(screenselection) 0]
  1603.         set addr [lindex $SaSH_info(screenselection) 1]
  1604.         case $show {
  1605.         "name" { set textdefault $name }
  1606.         "ipaddr" { set textdefault $addr }
  1607.         "both" { set textdefault "$name   $addr" }
  1608.         default { set textdefault $name }
  1609.         }
  1610.         VtSetValues $textfield -value $textdefault
  1611.  
  1612.     } else {
  1613.         VtListSelectItem $hostlist -notify -position 1
  1614.         VtSetValues $textfield -value ""
  1615.     }
  1616.     if {$widget == $filter} {
  1617.         VtSetFocus $hostlist
  1618.     }
  1619.     }
  1620.     VtUnLock
  1621. }
  1622.  
  1623. proc SaSH:ChangeSortCB {instance cbs} {
  1624.     global SaSH_info
  1625.     global SaSH_gl_host_list
  1626.  
  1627.     set dlog [keylget cbs dialog]
  1628.     set hostlist [VxGetVar $dlog hostlist]
  1629.     set textfield [VxGetVar $dlog text]
  1630.     set sort [VxGetVar $dlog sort]
  1631.     set byname [VxGetVar $dlog byname]
  1632.     set sortbox [VxGetVar $dlog sort]
  1633.  
  1634.     VtLock 
  1635.     if {[keylget cbs mode] != "done"} {
  1636.     }
  1637.     global SaSH_radio_value 
  1638.     set radio_value [VtGetValues $sortbox -value]
  1639.     if {$radio_value != $SaSH_radio_value} {
  1640.         set SaSH_radio_value $radio_value
  1641.  
  1642.         set ret [VtGetValues $sort -value]
  1643.         if {$ret == $byname} {
  1644.         set listitems [SaSH:SortByName]
  1645.         set SaSH_info(sortby) "name"
  1646.         } {
  1647.         set listitems [SaSH:SortByAddress]
  1648.         set SaSH_info(sortby) "addr"
  1649.         }
  1650.  
  1651.         VtListDeleteItem $hostlist -all
  1652.         VtListSetItem $hostlist -itemList $listitems
  1653.  
  1654.         set currentitem [lsearch $listitems $SaSH_info(screenselection)*]
  1655.  
  1656.         if {$currentitem != -1} {
  1657.         incr currentitem
  1658.         VtListSelectItem $hostlist -notify -position $currentitem
  1659.         SaListShowSelectedItem $hostlist
  1660.         }
  1661.     }
  1662.  
  1663.     if {[keylget cbs mode] == "done"} {
  1664.         VtSetFocus $hostlist
  1665.     }
  1666.  
  1667.     VtUnLock
  1668. }
  1669.  
  1670.  
  1671. proc SaSH:HostTextCB {cbs} {
  1672.     global SaSH_info
  1673.     
  1674.     set dialog [keylget cbs dialog]
  1675.     set hostlist [VxGetVar $dialog hostlist]
  1676.     set textwidgie [keylget cbs widget]
  1677.     set okbutton [VtGetValues $dialog -ok]
  1678.     set hostname [VtGetValues $textwidgie -value]
  1679.  
  1680.     if {[lempty $hostname]} {
  1681.     VtListDeselectItem $hostlist -notify -all    
  1682.     } else {
  1683.         if {[SaHostCheck $hostname] != 0} {
  1684.         set pattern "${hostname} *"
  1685.         if {[ctype digit [lindex [split $hostname .] 0]]} {
  1686.             set pattern "* ${hostname}"
  1687.         }
  1688.             set currentitem [lsearch [VtListGetItem $hostlist -all] \
  1689.                 $pattern]
  1690.         if {$currentitem != -1} {
  1691.             incr currentitem
  1692.             VtListSelectItem $hostlist -position $currentitem
  1693.             SaSH:HostListSelectCB show $cbs
  1694.             SaListShowSelectedItem $hostlist
  1695.         } else {
  1696.             VtListDeselectItem $hostlist -notify -all    
  1697.         }
  1698.         } else {
  1699.             ErrorPush errorStack 0 SCO_SA_SELHOST_ERR_BAD_HOST
  1700.             SaDisplayErrorStacks $dialog.errorbox [list $errorStack] HELP
  1701.         }
  1702.     }
  1703.  
  1704.     if {[keylget cbs mode] == "done"} {
  1705.         VtSetFocus $okbutton
  1706.     }
  1707.     VtUnLock
  1708. }
  1709.  
  1710.  
  1711. proc SaSH:HostListSelectCB {show cbs} {
  1712.     global SaSH_info
  1713.  
  1714.     set dlog [keylget cbs dialog]
  1715.     set hostlist [VxGetVar $dlog hostlist]
  1716.     set textfield [VxGetVar $dlog text]
  1717.  
  1718.  
  1719.     set new_item [lindex [VtListGetSelectedItem $hostlist -byItemList] 0]
  1720.  
  1721.     set name [lindex $new_item 0]
  1722.     set addr [lindex $new_item 1]
  1723.  
  1724.     case $show {
  1725.     "name" {
  1726.         set final $name
  1727.     }
  1728.     "ipaddr" {
  1729.         set final $addr
  1730.     }
  1731.     "both" { 
  1732.         set final "$name   $addr"
  1733.     }
  1734.     default {
  1735.         set final $name
  1736.     }
  1737.     }
  1738.  
  1739.     set SaSH_info(screenselection) $new_item
  1740.     VtSetValues $textfield -value $final
  1741. }
  1742.  
  1743.  
  1744. proc SaSH:HostListEnterCB {show cbs} {
  1745.  
  1746.     global SaSH_info
  1747.  
  1748.     set dlog [keylget cbs dialog]
  1749.     set hostlist [keylget cbs widget]
  1750.     set textfield [VxGetVar $dlog text]
  1751.  
  1752.  
  1753.     set new_item [lindex [VtListGetSelectedItem $hostlist -byItemList] 0]
  1754.  
  1755.     set name [lindex $new_item 0]
  1756.     set addr [lindex $new_item 1]
  1757.  
  1758.     case $show {
  1759.     "name" {
  1760.         set final $name
  1761.     }
  1762.     "ipaddr" {
  1763.         set final $addr
  1764.     }
  1765.     "both" { 
  1766.         set final "$name   $addr"
  1767.     }
  1768.     default {
  1769.         set final $name
  1770.     }
  1771.     }
  1772.  
  1773.     set SaSH_info(screenselection) $new_item
  1774.     VtSetValues $textfield -value $final
  1775.  
  1776.     set okbutton [VtGetValues $dlog -ok]
  1777.     VtSetFocus $okbutton
  1778. }
  1779.  
  1780.  
  1781.  
  1782. proc SaSH:ProcessUserSelectionCB {instance userproc cbs} {
  1783.  
  1784.     global SaSH_info
  1785.  
  1786.     set dlog [keylget cbs dialog]
  1787.     set hostlist [VxGetVar $dlog hostlist]
  1788.     set textfield [VxGetVar $dlog text]
  1789.  
  1790.  
  1791.     set returnval [VtGetValues $textfield -value]
  1792.  
  1793.     if {! [lempty $returnval] } {
  1794.  
  1795.     if [info exists SaSH_info($instance:has_textwidget)] {
  1796.  
  1797.  
  1798.         VtSetValues $SaSH_info($instance:textwidgetname) -value $returnval
  1799.     } 
  1800.  
  1801.     set SaSH_info($instance:userselection) $returnval
  1802.  
  1803.  
  1804.     set currentitem [lsearch [VtListGetItem $hostlist -all] $returnval]
  1805.     if {$currentitem == -1} {
  1806.         set currentitem [lindex $SaSH_info(screenselection) 0]
  1807.  
  1808.             VtDestroyDialog $dlog
  1809.     }
  1810.  
  1811.     if {![lempty $userproc]} {
  1812.         lappend userproc $cbs
  1813.         eval "$userproc"
  1814.     }
  1815.     } else {
  1816.     VtShow [VtErrorDialog $dlog.nohost \
  1817.         -ok \
  1818.         -message [IntlLocalizeMsg SCO_SA_SELHOST_ERR_NO_HOST_SELECTED] ]
  1819.     }
  1820. }
  1821.  
  1822.  
  1823. proc SaSH:CheckTextCB {instance userproc userdata cbs} {
  1824.  
  1825.     global SaSH_info
  1826.     set widget [keylget cbs widget]
  1827.     set dialog [keylget cbs dialog]
  1828.  
  1829.     set uservalue [VtGetValues $widget -value]
  1830.  
  1831.     if {[SaHostCheck $uservalue] != 0} {
  1832.  
  1833.     set SaSH_info($instance:userselection) $uservalue
  1834.  
  1835.     if {$userproc != "NULL"} {
  1836.         if {$userdata != "NULL"} {
  1837.         $userproc $userdata
  1838.         } else {
  1839.         $userproc
  1840.         }
  1841.     }
  1842.  
  1843.     } else {
  1844.     ErrorPush errorStack 0 SCO_SA_SELHOST_ERR_BAD_HOST
  1845.     SaDisplayErrorStacks $dialog.errorbox [list $errorStack] HELP
  1846.     }
  1847. }
  1848.  
  1849. proc SaSH:init {textfield} {
  1850.  
  1851.     global SaSH_info
  1852.     global SaSH_gl_host_list
  1853.  
  1854.     set name {}
  1855.     if {![lempty $textfield]} {
  1856.         set name [VtGetValues $textfield -value]
  1857.         set SaSH_info(screenselection) [format "%-30.30s" $name]
  1858.     } else {
  1859.         if {[info exists SaSH_info(init)]} {
  1860.         return "done"
  1861.     }
  1862.     }
  1863.  
  1864.     set SaSH_gl_host_list [SaHostsGet]
  1865.  
  1866.     set SaSH_info(sortby) "name"
  1867.  
  1868.     set SaSH_info(filter) "*"
  1869.  
  1870.  
  1871.     if {[lempty $name]} {
  1872.         set localhost [lindex $SaSH_gl_host_list 0]
  1873.         set addr [lindex $localhost 0]
  1874.         set name [lindex $localhost 1]
  1875.         set SaSH_info(screenselection) [format "%-30.30s  %s" $name $addr]
  1876.     }
  1877.  
  1878.     return "done"
  1879. }
  1880.  
  1881. proc SaSH:EndFormCB {cbs} {
  1882.     VtDestroyDialog [keylget cbs dialog]
  1883. }
  1884.  
  1885.  
  1886. proc SaSelectHostGetText {instance} {
  1887.     global SaSH_info
  1888.     return [VtGetValues $SaSH_info($instance:textwidgetname) -value ]
  1889. }
  1890.  
  1891. proc SaSelectHostGetTextWidget {instance} {
  1892.     global SaSH_info
  1893.     return $SaSH_info($instance:textwidgetname)
  1894. }
  1895.  
  1896. proc SaSelectHostGetButtonWidget {instance} {
  1897.     global SaSH_info
  1898.     return $SaSH_info($instance:button)
  1899. }
  1900.  
  1901. proc SaSelectHostGetSelection {instance} {
  1902.     global SaSH_info
  1903.     if [info exists SaSH_info($instance:userselection)] {
  1904.         return $SaSH_info($instance:userselection)
  1905.     }
  1906. }
  1907.  
  1908. #@package: BRW BRW:ExpandoList BRW:ExpandoCollapse BRW:ExpandoGetLevel BRW:ExpandoGetIcon BRW:ExpandoSetIcon BRW:ExpandoGetRecord BRW:ExpandoAddItem BRW:ExpandoDeleteItem BRW:AddItemCB BRW:ExpandoAddItemList BRW:ExpandoListReset
  1909. proc BRW:ExpandoList {dlist fmt args {prefixIcon 0}} {
  1910.     set dlist [eval VtDrawnList $dlist $args]
  1911.     set fmt [linsert $fmt 0 {DATA}]
  1912.     VxSetVar $dlist format $fmt
  1913.     VxSetVar $dlist count  0
  1914.     if {$prefixIcon} {
  1915.         VxSetVar $dlist levelOffset 1
  1916.     } else {
  1917.         VxSetVar $dlist levelOffset 0
  1918.     }
  1919.     return $dlist
  1920. }; # BRW:ExpandoList
  1921. proc BRW:ExpandoCollapse {dlist pos} {
  1922.     set count [VxGetVar $dlist count]
  1923.     if {$pos >= $count} {
  1924.     return
  1925.     }
  1926.     set deleted [BRW:ExpandoDeleteItem $dlist $pos on]
  1927.     VtDrawnListSelectItem $dlist -position $pos
  1928.     return $deleted
  1929. }; # BRW:ExpandoCollapse
  1930. proc BRW:ExpandoGetLevel {dlist pos} {
  1931.     set record [VtDrawnListGetItem $dlist -position $pos]
  1932.     set record [lindex $record 0]
  1933.     set recordLevel [lindex $record 0]
  1934.     return $recordLevel
  1935. }; # BRW:ExpandoGetLevel
  1936. proc BRW:ExpandoGetIcon {dlist pos} {
  1937.     set record [VtDrawnListGetItem $dlist -position $pos]
  1938.     set record [lindex $record 0]
  1939.     set icons [lindex $record 1]
  1940.     return [lrange $icons end end]
  1941. }; # BRW:ExpandoGetIcon
  1942. proc BRW:ExpandoSetIcon {dlist pos icon} {
  1943.     set record [VtDrawnListGetItem $dlist -position $pos]
  1944.     set record [lindex $record 0]
  1945.     set icons [lindex $record 1]
  1946.     set icons [lreplace $icons end end $icon]
  1947.     set record [lreplace $record 1 1 $icons]
  1948.     VtDrawnListSetItem $dlist -position $pos -fieldList $record
  1949. }; # BRW:ExpandoSetIcon
  1950. proc BRW:ExpandoGetRecord {dlist pos level icon rec} {
  1951.     set record [VtDrawnListGetItem $dlist -position $pos]
  1952.     set record [lindex $record 0]
  1953.     set icons [lindex $record 1]
  1954.     upvar 1 $icon rIcon $rec rRecord $level rLevel
  1955.     set rLevel  [lindex $record  0]
  1956.     set rIcon   [lrange $icons end end]
  1957.     set rRecord [lrange $record 2 end]
  1958. }; # BRW:ExpandoGetRecord
  1959. proc BRW:HasDown {icon} {
  1960.     switch $icon {
  1961.     CONNECT_I -
  1962.     CONNECT_T  {
  1963.         return 1
  1964.     }
  1965.     default {
  1966.         return 0
  1967.     }
  1968.     }
  1969. }; # BRW:HasDown
  1970. proc BRW:HasUp {icon} {
  1971.     switch $icon {
  1972.     CONNECT_L -
  1973.     CONNECT_I -
  1974.     CONNECT_T  {
  1975.         return 1
  1976.     }
  1977.     default {
  1978.         return 0
  1979.     }
  1980.     }
  1981. }; # BRW:HasUp
  1982. proc BRW:SetIconConnector {dlist n col connector} {
  1983.     set rec [VtDrawnListGetItem $dlist -position $n]
  1984.     set rec [lindex $rec 0]
  1985.     set icons [lindex $rec 1]
  1986.     if {$col < [llength $icons]} {
  1987.     set icons [lreplace $icons $col $col $connector]
  1988.     }
  1989.     set rec [lreplace $rec 1 1 $icons]
  1990.     VtDrawnListSetItem $dlist -position $n -fieldList $rec
  1991. }; # BRW:SetIconConnector
  1992. proc BRW:GetIconConnector {dlist n col} {
  1993.     set rec [VtDrawnListGetItem $dlist -position $n]
  1994.     set rec [lindex $rec 0]
  1995.     set icons [lindex $rec 1]
  1996.     if {$col < [llength $icons]} {
  1997.     return [lindex $icons $col]
  1998.     } else {
  1999.     return ""
  2000.     }
  2001. }; # BRW:GetIconConnector
  2002. proc BRW:PatchConnectors {dlist pos level cmd} {
  2003.     set count [VxGetVar $dlist count]
  2004.     set levelOffset [VxGetVar $dlist levelOffset]
  2005.     set offset [expr 1 - $levelOffset]
  2006.     set indx [expr $level - $offset]
  2007.     while {1} {
  2008.     set icon [BRW:GetIconConnector $dlist $pos $indx]
  2009.     set rLevel [BRW:ExpandoGetLevel $dlist $pos]
  2010.     if {$cmd == "ADD"} {
  2011.         if {$icon == "NO_ICON"} {
  2012.         set icon CONNECT_I
  2013.         } elseif {$icon == "CONNECT_L"} {
  2014.                 if {$count > 0} {
  2015.             set icon CONNECT_T
  2016.                 }
  2017.         } 
  2018.     } else {
  2019.         if {$icon == "CONNECT_I"} {
  2020.         set icon NO_ICON
  2021.         } elseif {$icon == "CONNECT_T"} {
  2022.         set icon CONNECT_L
  2023.         }
  2024.     }
  2025.     BRW:SetIconConnector $dlist $pos $indx $icon
  2026.     incr pos -1
  2027.     if {$rLevel <= $level} {
  2028.             break
  2029.         }
  2030.     }
  2031. }; # BRW:PatchConnectors
  2032. proc BRW:AnalyzeConnect {dlist pos level stateIcon icon} {
  2033.     set iconList ""
  2034.     if {$stateIcon != "NO_ICON"} {
  2035.         lappend iconList $stateIcon
  2036.     }
  2037.     if {$level == 0} {
  2038.         lappend iconList $icon
  2039.         return $iconList
  2040.     }
  2041.     set count [VxGetVar $dlist count]
  2042.     if {$count == 0} {
  2043.         lappend iconList CONNECT_L $icon
  2044.         return $iconList
  2045.     }
  2046.     if {$pos == 0} {
  2047.         set pos [expr $count + 1]
  2048.     }
  2049.     set aboveRec [VtDrawnListGetItem $dlist -position [expr $pos - 1]]
  2050.     set aboveRec [lindex $aboveRec 0]
  2051.     if {$pos <= $count} {
  2052.         set belowRec [VtDrawnListGetItem $dlist -position $pos]
  2053.     set belowRec [lindex $belowRec 0]
  2054.     } else {
  2055.     set belowRec ""
  2056.     }
  2057.     set aboveIcons [lindex $aboveRec 1]
  2058.     set belowIcons [lindex $belowRec 1]
  2059.     set levelOffset [VxGetVar $dlist levelOffset]
  2060.     set offset      [expr 1 - $levelOffset]
  2061.     set endLevel [expr $level - $offset]
  2062.     set start    [expr 0 + $levelOffset]
  2063.     for {set i $start} {$i < $endLevel} {incr i} {
  2064.     set abvIcon [lindex $aboveIcons $i]
  2065.     set blwIcon [lindex $belowIcons $i]
  2066.     if {[BRW:HasDown $abvIcon] && [BRW:HasUp $blwIcon]} {
  2067.         lappend iconList CONNECT_I
  2068.     } else {
  2069.         lappend iconList NO_ICON
  2070.     }
  2071.     }    
  2072.     set abvIcon [lindex $aboveIcons $endLevel]
  2073.     set blwIcon [lindex $belowIcons $endLevel]
  2074.     if {[BRW:HasUp $abvIcon] && [BRW:HasUp $blwIcon]} {
  2075.         lappend iconList CONNECT_T
  2076.     } else {
  2077.         lappend iconList CONNECT_L
  2078.     }
  2079.     lappend iconList $icon
  2080.     return $iconList
  2081. }; # BRW:AnalyzeConnect
  2082. proc BRW:IsConnector {i} {
  2083.     switch $i {
  2084.     NO_ICON   -
  2085.     CONNECT_L -
  2086.     CONNECT_I -
  2087.     CONNECT_T  {
  2088.         return 1
  2089.     }
  2090.     default {
  2091.         return 0
  2092.     }
  2093.     }
  2094. }; # BRW:IsConnector
  2095. proc BRW:ExpandoAddItem {dlist pos level icon data {stateIcon NO_ICON}} {
  2096.     set count [VxGetVar $dlist count]
  2097.     set fmt   [VxGetVar $dlist format]
  2098.     set fmt [BRW:GenFormat $fmt $level]
  2099.     set connectors [BRW:AnalyzeConnect $dlist $pos $level $stateIcon $icon]
  2100.     set data [linsert $data 0 $level $connectors]
  2101.     eval [list VtDrawnListAddItem $dlist -formatList $fmt -fieldList $data \
  2102.              -position $pos ]
  2103.     if {$pos == 0} {
  2104.     set pos $count
  2105.     } else {
  2106.     incr pos -1
  2107.     }
  2108.     if {$level > 0} {
  2109.         BRW:PatchConnectors $dlist $pos $level ADD
  2110.     }
  2111.     incr count 1
  2112.     VxSetVar $dlist count $count
  2113. }; # BRW:ExpandoAddItem
  2114. proc BRW:ExpandoDeleteItem {dlist pos {collaspe off} } {
  2115.     set count [VxGetVar $dlist count]
  2116.     set startLevel [BRW:ExpandoGetLevel $dlist $pos]
  2117.     if {[BRW:GetIconConnector $dlist $pos [expr $startLevel-1]] == "CONNECT_L"} {
  2118.     set patch on
  2119.     } else {
  2120.     set patch off
  2121.     }
  2122.     if {$collaspe} {
  2123.         incr pos
  2124.     }
  2125.     set deleted 0
  2126.     while {$pos <= $count} {
  2127.     VtDrawnListDeleteItem $dlist -position $pos
  2128.         incr deleted
  2129.     incr count -1
  2130.     if {$count == 0 || $pos > $count} {
  2131.             break
  2132.         }
  2133.     set level [BRW:ExpandoGetLevel $dlist $pos]
  2134.     if {$level <= $startLevel} {
  2135.             break
  2136.         }
  2137.     }
  2138.     if {$patch} {
  2139.     incr pos -1
  2140.     BRW:PatchConnectors $dlist $pos $startLevel SUB
  2141.     }
  2142.     VxSetVar $dlist count $count
  2143.     return $deleted
  2144. }; # BRW:ExpandoDeleteItem
  2145. proc BRW:GenFormat {userFormat level} {
  2146.     if {[VtInfo -charm]} {
  2147.         if {$level > 1} {
  2148.             set fList [list ICON [expr $level+2] 1 [expr $level * 2]]
  2149.         } else {
  2150.             set fList [list ICON [expr $level+2] 1 2]
  2151.         }
  2152.     } else {
  2153.         set fList [list ICON [expr $level+2] 3]
  2154.     }
  2155.     set fmt [linsert $userFormat 1 $fList]
  2156.     return $fmt
  2157. }; # BRW:GenFormat
  2158. proc BRW:ExpandoAddItemList {dlist pos level itemList} {
  2159.     set count [VxGetVar $dlist count]
  2160.     set fmt   [VxGetVar $dlist format]
  2161.     set fmt [BRW:GenFormat $fmt $level]
  2162.     if {$pos == 0} {
  2163.         set pos $count
  2164.     }
  2165.     set abovePos [expr $pos - 1]
  2166.     if {$abovePos > 0} {
  2167.         set aboveRec [VtDrawnListGetItem $dlist -position $abovePos]
  2168.         set aboveRec [lindex $aboveRec 0]
  2169.         set type     DRAWNLIST
  2170.     } else {
  2171.         set aboveRec ""
  2172.         set type     DATALIST
  2173.     }
  2174.     set belowPos $pos
  2175.     if {$count > 0 && $belowPos <= $count} {
  2176.         set belowRec [VtDrawnListGetItem $dlist -position $belowPos]
  2177.         set belowRec [lindex $belowRec 0]
  2178.     } else {
  2179.         set belowRec ""
  2180.     }
  2181.     set dataList {}
  2182.     set patchPos $abovePos
  2183.     set flag 1
  2184.     foreach item $itemList {
  2185.         set icon      [lindex $item 0]
  2186.         set data      [lindex $item 1]
  2187.         set stateIcon [lindex $item 2]
  2188.         if {[lempty $stateIcon]} {
  2189.             set stateIcon NO_ICON
  2190.         }
  2191.         set connectors [BRW:AnalyzeConnectList $dlist $aboveRec $belowRec \
  2192.             $level $stateIcon $icon]
  2193.         set data [linsert $data 0 $level $connectors]
  2194.         if {$level > 0} {
  2195.             BRW:PatchConnector $dlist dataList $data $aboveRec $patchPos \
  2196.                 $count $type
  2197.         }
  2198.         lappend dataList $data
  2199.         set aboveRec $data
  2200.         set type     DATALIST
  2201.         incr count
  2202.         if {$flag} {
  2203.            set flag 0
  2204.            set patchPos 0
  2205.         } else {
  2206.             incr patchPos
  2207.         }
  2208.     }
  2209.     VtDrawnListAddItem $dlist -formatList $fmt \
  2210.          -recordList $dataList -position $pos
  2211.     VxSetVar $dlist count $count
  2212. }; # BRW:ExpandoAddItemList
  2213. proc BRW:PatchConnector {dlist dataList itemRec aboveRec position count \
  2214.     type} {
  2215.     upvar $dataList itemList
  2216.     set itemLevel  [lindex $itemRec  0]
  2217.     set aboveLevel [lindex $aboveRec 0]
  2218.     if {$aboveLevel >= $itemLevel} {
  2219.         set patch 0
  2220.         set levelOffset [VxGetVar $dlist levelOffset]
  2221.         set offset [expr 1 - $levelOffset]
  2222.         set aboveIndx [expr $aboveLevel - $offset]
  2223.         set itemIndx  [expr $itemLevel  - $offset]
  2224.         set aboveIcons [lindex $aboveRec  1]
  2225.         set aboveIcon  [lindex $aboveIcons $aboveIndx]
  2226.         if {$aboveIcon == "NO_ICON"} {
  2227.            set icon CONNECT_I
  2228.            set patch 1
  2229.         } elseif {$aboveIcon == "CONNECT_L"} {
  2230.             if {$count > 0} {
  2231.                 set icon CONNECT_T
  2232.                 set patch 1
  2233.             }
  2234.         }
  2235.         if {$patch} {
  2236.             if {$type == "DRAWNLIST"} {
  2237.                 BRW:SetIconConnector $dlist $position $aboveLevel $icon
  2238.             } else {
  2239.                 set itemRec [lindex $itemList $position]
  2240.                 set itemIcons [lindex $itemRec 1]
  2241.                 set itemIcons [lreplace $itemIcons $itemIndx $itemIndx $icon]
  2242.                 set itemRec [lreplace $itemRec 1 1 $itemIcons]
  2243.                 set itemList [lreplace $itemList $position $position $itemRec]
  2244.             }
  2245.         }
  2246.     }
  2247. }; # BRW:PatchConnector
  2248. proc BRW:AnalyzeConnectList {dlist aboveRec belowRec level stateIcon icon} {
  2249.     set iconList ""
  2250.     if {$stateIcon != "NO_ICON"} {
  2251.         lappend iconList $stateIcon
  2252.     }
  2253.     if {$level == 0} {
  2254.         lappend iconList $icon
  2255.         return $iconList
  2256.     }
  2257.     set count [VxGetVar $dlist count]
  2258.     if {$count == 0} {
  2259.         lappend iconList CONNECT_L $icon
  2260.         return $iconList
  2261.     }
  2262.     set aboveIcons [lindex $aboveRec 1]
  2263.     set belowIcons [lindex $belowRec 1]
  2264.     set levelOffset [VxGetVar $dlist levelOffset]
  2265.     set offset      [expr 1 - $levelOffset]
  2266.     set endLevel [expr $level - $offset]
  2267.     set start    [expr 0 + $levelOffset]
  2268.     for {set i $start} {$i < $endLevel} {incr i} {
  2269.     set abvIcon [lindex $aboveIcons $i]
  2270.     set blwIcon [lindex $belowIcons $i]
  2271.     if {[BRW:HasDown $abvIcon] && [BRW:HasUp $blwIcon]} {
  2272.         lappend iconList CONNECT_I
  2273.     } else {
  2274.         lappend iconList NO_ICON
  2275.     }
  2276.     }    
  2277.     set abvIcon [lindex $aboveIcons $endLevel]
  2278.     set blwIcon [lindex $belowIcons $endLevel]
  2279.     if {[BRW:HasUp $abvIcon] && [BRW:HasUp $blwIcon]} {
  2280.         lappend iconList CONNECT_T
  2281.     } else {
  2282.         lappend iconList CONNECT_L
  2283.     }
  2284.     lappend iconList $icon
  2285.     return $iconList
  2286. }; # BRW:AnalyzeConnectList
  2287. proc BRW:ExpandoListReset {dlist} {
  2288.     VtDrawnListDeleteItem $dlist -all
  2289.     VxSetVar $dlist count  0
  2290. }; # BRW:ExpandoListReset
  2291. #@packend: browser
  2292. #@package: SaEH SaMakeObjectCall SaDisplayErrorStacks SaDisplayErrorInfo SaUnexpectedErrorCB SaDisplayNoAuths SaDisplayNotRoot
  2293. proc SCO_SA_ERRHANDLER_MSGS {} {}
  2294. global SCO_SA_ERRHANDLER_MSGS
  2295. set SCO_SA_ERRHANDLER_MSGS(@catalog@) {sysadm.cat@sa 23}
  2296. set SCO_SA_ERRHANDLER_MSGS(ERR_CONNECT_FAIL) {1 {%1$s failed to connect to %2$s.\n\nPlease check the following:\n   * your network configuration\n   * your network connection\n   * remote access (rhost) permissions on the remote site\n   * that SCOadmin is installed at the remote site}}
  2297. set SCO_SA_ERRHANDLER_MSGS(ERR_UNEXPECTED) {2 {Unexpected error:\n%s}}
  2298. set SCO_SA_ERRHANDLER_MSGS(ERR_UNEXPECTED_DT) {3 {\n%s}}
  2299. set SCO_SA_ERRHANDLER_MSGS(MSG_ERROR) {4 Error}
  2300. set SCO_SA_ERRHANDLER_MSGS(MSG_DETAILS) {5 Details...}
  2301. set SCO_SA_ERRHANDLER_MSGS(MSG_ERROR_DT) {6 {Error Details}}
  2302. set SCO_SA_ERRHANDLER_MSGS(MSG_NO_AUTHS) {7 {You are not authorized to run %1$s on %2$s}}
  2303. set SCO_SA_ERRHANDLER_MSGS(MSG_SAVE_BUTTON) {8 Save...}
  2304. set SCO_SA_ERRHANDLER_MSGS(MSG_SAVE_TITLE) {9 {Save Error Details}}
  2305. set SCO_SA_ERRHANDLER_MSGS(MSG_NOT_ROOT) {10 {You must be root to run %1$s on %2$s}}
  2306. proc SaEH:GetManagedHostName {} {
  2307.     return "remote host"
  2308. }
  2309. proc SaMakeObjectCall {objectCall} {
  2310. global errorCode
  2311.     set result [catch { eval $objectCall } returnValue]
  2312.     if { $result } {
  2313.         case [lindex $errorCode 0] {
  2314.         ERRORSTACK
  2315.         {
  2316.             set errorStack [lindex $errorCode 1]
  2317.                 set topErrorCode [lindex [lindex $errorStack 0] 0]
  2318.                 if {$topErrorCode == "SCO_LOCAL_PIPE_ERR_CLIENT_CONNECT_FAILURE"} {
  2319.                     set localHost [lindex [split [SaHostGetLocalName] .] 0]
  2320.                     set managedHost \
  2321.             [lindex [split [SaHostGetManagedName] .] 0]
  2322.                     ErrorPush errorStack 0 SCO_SA_ERRHANDLER_ERR_CONNECT_FAIL \
  2323.                         [list $localHost $managedHost]
  2324.                 }
  2325.         set bmipResponse \
  2326.             [list [SaEH:BuildBmipResponse $errorStack]]
  2327.         }
  2328.         default
  2329.         {
  2330.         set errorStack [lindex $errorCode 1]
  2331.         ErrorThrow errorStack
  2332.         }
  2333.     }
  2334.     } else {
  2335.     set bmipResponse $returnValue
  2336.     }
  2337.     return $bmipResponse
  2338. }
  2339. proc SaEH:BuildBmipResponse {errorStack} {
  2340.     return [list operation class instance attributes {} {} $errorStack]
  2341. }
  2342. proc SaEH:DisplayErrorStacksIterateCB {newparms cbs} {
  2343.     set dialogName [lvarpop newparms]
  2344.     set errorStacks [lvarpop newparms]
  2345.     set help [lvarpop newparms]
  2346.     set callback [lvarpop newparms]
  2347.     if {[lempty $errorStacks]} {
  2348.         VtUnLock
  2349.         eval $callback [list $cbs]
  2350.         VtUnLock
  2351.         return
  2352.     }
  2353.     VxEndFormCB $cbs
  2354.     SaDisplayErrorStacks $dialogName $errorStacks $help $callback
  2355.     VtUnLock
  2356. }
  2357. proc SaDisplayErrorStacks {dialogName errorStacks help {callBack {}}} {
  2358.     if { [lempty $callBack] } {
  2359.         set callBack VxEndFormCB
  2360.     } else {
  2361.         set callBack $callBack
  2362.     }
  2363.     set errorStack [lvarpop errorStacks]
  2364.     set newparms [list $dialogName $errorStacks $help $callBack]
  2365.     set callBack [list SaEH:DisplayErrorStacksIterateCB $newparms]
  2366.     set stackLength [llength $errorStack]
  2367.     set topErrorText [lindex [lindex $errorStack 0] 1]
  2368.     if { $stackLength == 1 } {
  2369.         if { $help == "HELP" } {
  2370.         set error [VtFormDialog $dialogName \
  2371.             -title [IntlLocalizeMsg SCO_SA_ERRHANDLER_MSG_ERROR] \
  2372.             -defaultButton OK \
  2373.             -ok \
  2374.             -okCallback $callBack \
  2375.             -autoLock [lindex $callBack 0] \
  2376.             -cancelButton OK \
  2377.             -help \
  2378.             -autoDestroy FALSE \
  2379.             -autoHide FALSE \
  2380.             -defaultButton OK \
  2381.             -cancelButton OK ]
  2382.         } else {
  2383.         set error [VtFormDialog $dialogName \
  2384.             -title [IntlLocalizeMsg SCO_SA_ERRHANDLER_MSG_ERROR] \
  2385.             -defaultButton OK \
  2386.             -ok \
  2387.             -okCallback $callBack \
  2388.             -autoLock [lindex $callBack 0] \
  2389.             -cancelButton OK \
  2390.             -autoDestroy FALSE \
  2391.             -autoHide FALSE \
  2392.             -defaultButton OK \
  2393.             -cancelButton OK ]
  2394.         }
  2395.     } else {
  2396.         set list {}
  2397.         foreach entry $errorStack {
  2398.             set list [format "%s\n%s" $list [lindex $entry 1]]
  2399.         }
  2400.         set list [string trimleft $list "\n"]
  2401.         if { $help == "HELP" } {
  2402.         set error [VtFormDialog $dialogName \
  2403.             -title [IntlLocalizeMsg SCO_SA_ERRHANDLER_MSG_ERROR] \
  2404.             -ok \
  2405.             -okCallback $callBack \
  2406.             -cancel \
  2407.             -cancelLabel [IntlLocalizeMsg SCO_SA_ERRHANDLER_MSG_DETAILS] \
  2408.             -cancelCallback "SaEH:ShowObjectErrorDetails [list $list]" \
  2409.             -autoLock [list SaEH:ShowObjectErrorDetails \
  2410.                    [lindex $callBack 0]] \
  2411.             -help \
  2412.             -autoDestroy FALSE \
  2413.             -autoHide FALSE \
  2414.             -defaultButton OK \
  2415.             -cancelButton OK \
  2416.             ]
  2417.         } else {
  2418.         set error [VtFormDialog $dialogName \
  2419.             -title [IntlLocalizeMsg SCO_SA_ERRHANDLER_MSG_ERROR] \
  2420.             -ok \
  2421.             -okCallback $callBack \
  2422.             -cancel \
  2423.             -cancelLabel [IntlLocalizeMsg SCO_SA_ERRHANDLER_MSG_DETAILS] \
  2424.             -cancelCallback "SaEH:ShowObjectErrorDetails [list $list]" \
  2425.             -autoLock [list SaEH:ShowObjectErrorDetails \
  2426.                    [lindex $callBack 0]] \
  2427.             -autoDestroy FALSE \
  2428.             -autoHide FALSE \
  2429.             -defaultButton OK \
  2430.             -cancelButton OK \
  2431.             ]
  2432.         }
  2433.     }
  2434.     VtLabel $error.message \
  2435.         -rightSide FORM \
  2436.         -label $topErrorText 
  2437.     VtSetFocus [VtGetValues $error -ok]
  2438.     VtShow $error
  2439. }
  2440. proc SaEH:SaveDetailsCB {pdialog errorList cbs} {
  2441.     set dialog [keylget cbs dialog]
  2442.     set file [keylget cbs selection]
  2443.     if {[catch [list open $file w] fd]} {
  2444.         VtShow [VtErrorDialog $dialog.writeerror \
  2445.             -message $fd]
  2446.         return
  2447.     } else {
  2448.         VtDestroyDialog $dialog
  2449.         VtSetFocus [VtGetValues $pdialog -ok]
  2450.         puts $fd $errorList
  2451.         close $fd
  2452.     }
  2453. }
  2454. proc SaEH:SaveDetailsFileSelectCB {errorList cbs} {
  2455.     set dialog [keylget cbs dialog]
  2456.     global env
  2457.     set dir [pwd]
  2458.     set dir [string trimright $dir "/"]/
  2459.     VtShow [VtFileSelectionDialog $dialog.fileSelect \
  2460.         -title \
  2461.         [IntlLocalizeMsg SCO_SA_ERRHANDLER_MSG_SAVE_TITLE] \
  2462.         -filter "${dir}*" \
  2463.         -selection "$dir" \
  2464.         -okCallback [list SaEH:SaveDetailsCB $dialog $errorList] \
  2465.         -autoDestroy 0 -autoHide 0 \
  2466.         -cancelCallback VxEndFormCB \
  2467.         ]
  2468.     VtUnLock
  2469. }
  2470. proc SaEH:ShowObjectErrorDetails {errorList cbs} {
  2471.     set detailsForm [VtFormDialog [keylget cbs dialog].detailsForm \
  2472.             -title [IntlLocalizeMsg SCO_SA_ERRHANDLER_MSG_ERROR_DT] \
  2473.             -ok \
  2474.             -defaultButton OK \
  2475.             -okCallback VxEndFormCB \
  2476.             -apply \
  2477.             -applyLabel \
  2478.             [IntlLocalizeMsg SCO_SA_ERRHANDLER_MSG_SAVE_BUTTON] \
  2479.             -applyCallback \
  2480.                 [list SaEH:SaveDetailsFileSelectCB $errorList] \
  2481.             -autoLock SaEH:SaveDetailsFileSelectCB \
  2482.             -cancelButton OK]
  2483.     VtText $detailsForm.text \
  2484.             -readOnly \
  2485.             -value $errorList \
  2486.             -verticalScrollBar TRUE \
  2487.             -horizontalScrollBar TRUE \
  2488.             -rows 5 \
  2489.             -columns 50    \
  2490.             -rightSide FORM \
  2491.             -bottomSide FORM
  2492.     VtShow $detailsForm
  2493.     VtUnLock
  2494. }
  2495. proc SaDisplayErrorInfo {errorDialog topErrorText help {callback {}}} {
  2496. global errorInfo
  2497.  ErrorPush errorStack 0 SCO_SA_ERRHANDLER_ERR_UNEXPECTED_DT [list $errorInfo]
  2498.  ErrorPush errorStack 0 SCO_SA_ERRHANDLER_ERR_UNEXPECTED [list $topErrorText]
  2499.  SaDisplayErrorStacks $errorDialog [list $errorStack] $help $callback
  2500. }
  2501. proc SaUnexpectedErrorCB {callback cbs} {
  2502.     set dialog [keylget cbs dialog] 
  2503.     set errorText [keylget cbs result]
  2504.     if {[SaEH:ExpectedUnexpectedError $errorText]} {
  2505.         VtUnLock
  2506.         return
  2507.     }
  2508.     SaDisplayErrorInfo $dialog.errorInfo $errorText HELP $callback
  2509.     VtUnLock
  2510. }
  2511. proc SaEH:ExpectedUnexpectedError {text} {
  2512.     if {[string match "*Duplicate name*" $text]} {
  2513.         return 1
  2514.     }
  2515.     return 0
  2516. }
  2517. proc SaDisplayNoAuths {dialogName manager cb {host {}} 
  2518.     {messageId SCO_SA_ERRHANDLER_MSG_NO_AUTHS}} {
  2519.         if {$host == ""} {
  2520.             set host [SaHostGetLocalName]
  2521.         }
  2522.         VtShow [VtMessageDialog $dialogName \
  2523.                 -message [IntlLocalizeMsg $messageId [list $manager $host] ] \
  2524.                 -cancelButton OK \
  2525.                 -okCallback $cb -ok -help ]
  2526. }
  2527. proc SaDisplayNotRoot {dialogName manager cb {host {}}  } {
  2528.     SaDisplayNoAuths $dialogName $manager $cb $host \
  2529.         SCO_SA_ERRHANDLER_MSG_NOT_ROOT
  2530. }
  2531. #@packend SaEH
  2532. #@package: SaHost SaHostGetLocalName SaHostGetManagedName SaHostRemoteOsaAccessible SaHostsGet SaHostCheck SaHostExtractSystemName SaHostExtractDomain
  2533. proc SaHostGetLocalName {} {
  2534.     set errStack ""
  2535.     if {[file executable /usr/ucb/hostname]} {
  2536.             set host [CallNonStdCmd /usr/ucb/hostname {} "" errStack]
  2537.     }
  2538.     if {[file executable /usr/sbin/hostname]} {
  2539.             set host [CallNonStdCmd /usr/sbin/hostname {} "" errStack]
  2540.     }
  2541.         if {[ErrorStackSize errStack]} {
  2542.                set host [CallNonStdCmd uname {-n} "" errStack]
  2543.         }
  2544.         if {[ErrorStackSize errStack]} {
  2545.                 set host "localhost"
  2546.         }
  2547.     return $host
  2548. }
  2549. proc SaHostGetManagedName {} {
  2550.     global argv
  2551.     if { $argv == "" } {
  2552.         return [SaHostGetLocalName]
  2553.     } else {
  2554.         return [lindex $argv 0]
  2555.     }
  2556. }
  2557. proc SaHostRemoteOsaAccessible {} {
  2558.     if {[FWIdentifingHostsByIpMethod]} {
  2559.     return 1
  2560.     } else {
  2561.     return 0
  2562.     }
  2563. }
  2564. proc SaHostExtractSystemName {hostname} {
  2565.     set first [lindex [split $hostname .] 0]
  2566.     if {[ctype digit $first]} {
  2567.         return $hostname
  2568.     } else {
  2569.         return $first
  2570.     }
  2571. }
  2572. proc SaHostExtractDomain {host} {
  2573.     if {[set i [string first "." $host]] == -1} {
  2574.         return {}
  2575.     }
  2576.     incr i
  2577.     return [string range $host $i end]
  2578. }
  2579. proc SaHostsGet {} {
  2580.     if {[catch {ObjectGet {sco selhost} {dummyInstance} hostAddrList} result]} {
  2581.         return [list "" ""]
  2582.     } else {
  2583.     set newlist {}
  2584.         set hostlist [lindex [lindex [lindex [lindex $result 0] 3] 0] 1]
  2585.     foreach one $hostlist {
  2586.         set addr [lindex [lindex $one 0] 0]
  2587.             set name [lindex [lindex $one 0] 1]
  2588.             lappend newlist [format "%s %s" $addr $name]
  2589.     }
  2590.     return $newlist
  2591.     }
  2592. }
  2593. proc SaHostCheck {hostname} {
  2594.     set result 1
  2595.     return $result
  2596. }
  2597. #@packend SaHost
  2598. #@package: SCO_SCREENPOLICY_MSGS SCO_SCREENPOLICY_MSGS
  2599. proc SCO_SCREENPOLICY_MSGS {} {}
  2600. global SCO_SCREENPOLICY_MSGS
  2601. set SCO_SCREENPOLICY_MSGS(@catalog@) {defaults 1}
  2602. set SCO_SCREENPOLICY_MSGS(ERR_APP_NOT_FOUND) {1 {Section %s not found}}
  2603. set SCO_SCREENPOLICY_MSGS(ERR_ATTR_NOT_FOUND) {2 {Attribute %s not found}}
  2604. #@packend
  2605. #@package: SaScreenPolicy  SaScreenPolicyGet SaScreenPolicySet
  2606. proc SaScreenPolicyGet {app attribute} {
  2607.     global env
  2608.     set home [string trimright $env(HOME) "/"]
  2609.     set stanzaFile ${home}/.scoadmin.pref
  2610.     ErrorCatch {} 1 "StanzaOpen $stanzaFile STZ_RDONLY" handle
  2611.     set sects [StanzaGetSects $handle]
  2612.     if {[lsearch $sects $app] == -1} {
  2613.         StanzaClose $handle
  2614.         ErrorPush {} 1 SCO_SCREENPOLICY_ERR_APP_NOT_FOUND $app
  2615.     }
  2616.     set attrs [StanzaGetAttrs $handle $app]
  2617.     if {[lsearch $attrs $attribute] != -1} {
  2618.         set value [StanzaGetVals $handle $app $attribute]
  2619.     } else {
  2620.         ErrorPush {} 1 SCO_SCREENPOLICY_ERR_ATTR_NOT_FOUND $attribute
  2621.     }
  2622.     StanzaClose $handle
  2623.     return $value
  2624. } ;# SaScreenPolicyGet
  2625. proc SaScreenPolicySet {app attribute value} {
  2626.     global env
  2627.     set home [string trimright $env(HOME) "/"]
  2628.     set stanzaFile ${home}/.scoadmin.pref
  2629.     ErrorCatch {} 1 "StanzaOpen $stanzaFile STZ_RDWR" handle
  2630.     set sects [StanzaGetSects $handle]
  2631.     if {[lsearch $sects $app] == -1} {
  2632.         StanzaAddSect $handle $app
  2633.     }
  2634.     set attrs [StanzaGetAttrs $handle $app]
  2635.     if {[lsearch $attrs $attribute] == -1} {
  2636.         StanzaAddAttr $handle $app $attribute
  2637.     }
  2638.     StanzaReplaceValue $handle $app $attribute $value
  2639.     StanzaClose $handle
  2640. } ;# SaScreenPolicySet
  2641. #@packend
  2642. #@package: SaSB SaStatusBar SaStatusBarSet SaStatusBarGet SaStatusBarClear SaStatusBarHide SaStatusBarShow SaShortHelpCB SaShortHelpSetState SaShortHelpGetState SaShortHelpMenuOptions SaShortHelpLoad SaShortHelpStore
  2643. proc SCO_SA_STATUSBAR_MSGS {} {}
  2644. global SCO_SA_STATUSBAR_MSGS
  2645. set SCO_SA_STATUSBAR_MSGS(@catalog@) {sysadm.cat@sa 21}
  2646. set SCO_SA_STATUSBAR_MSGS(MSG_POINTHELP) {1 {Point Help}}
  2647. set SCO_SA_STATUSBAR_MSGS(MSG_SHPOINTHELP) {2 {Enable/disable Point Help}}
  2648. set SCO_SA_STATUSBAR_MSGS(ERR_BADSTORE) {3 {Unable to save short help preference(s)}}
  2649. proc SaSB:SetDefaultFormSpacing {form} {
  2650.     VtSetValues $form \
  2651.         -horizontalSpacing 0 \
  2652.         -verticalSpacing 0 \
  2653.         -marginWidth 0 \
  2654.         -marginHeight 0 
  2655.     return $form
  2656. }
  2657. proc SaSB:SaGetParentWidget {child} {
  2658.     set i [string last . $child] 
  2659.     incr i -1
  2660.     return [string range $child 0  $i]
  2661. }
  2662. proc SaStatusBar {name {main 0} {icon /usr/lib/scoadmin/icons/statuslogo.px}} {
  2663.     set charm [VtInfo -charm]
  2664.     if $charm {
  2665.         set leftOffset 0
  2666.     } else {
  2667.         set leftOffset 5
  2668.     }
  2669.     set parent [SaSB:SaGetParentWidget $name]
  2670.     if !$charm {
  2671.         set bar [VtSeparator ${name}bar \
  2672.                 -xmArgs [list XmNseparatorType XmNO_LINE] \
  2673.                 -topSide NONE \
  2674.                 -leftSide FORM \
  2675.                 -rightSide FORM] 
  2676.     }
  2677.     set form [VtForm $name \
  2678.             -topOffset 0 \
  2679.             -topSide NONE \
  2680.             -leftSide FORM \
  2681.             -rightSide FORM \
  2682.             -bottomSide FORM \
  2683.             -bottomOffset 0]
  2684.     SaSB:SetDefaultFormSpacing $form
  2685.     set statusBar $form
  2686.     if !$charm {
  2687.         VtSetValues $bar -bottomSide $form
  2688.         set statusBar $bar
  2689.     }
  2690.     set topSide FORM
  2691.     set rightSide FORM
  2692.     if {$main} {
  2693.         set statusSep [VtSeparator $form.statusSep \
  2694.                 -topOffset 0 \
  2695.                 -leftOffset 0 \
  2696.                 -rightOffset 0\
  2697.                 -leftSide FORM \
  2698.                 -rightSide FORM] 
  2699.         set logoLabel [VtLabel $form.logoLabel \
  2700.                     -leftSide NONE \
  2701.                     -rightSide FORM \
  2702.                     -rightOffset 2 \
  2703.                     -topSide $statusSep \
  2704.                     -MOTIF_pixmap $icon \
  2705.                     -label "" \
  2706.                     -bottomSide FORM] 
  2707.         set topSide $statusSep
  2708.         set rightSide $logoLabel
  2709.         global SaSB_mainBar
  2710.         set SaSB_mainBar $statusBar
  2711.     }
  2712.     set statusLabel [VtLabel $form.statusLabel \
  2713.                 -label " " \
  2714.                 -labelLeft \
  2715.                 -leftSide FORM \
  2716.                 -rightSide $rightSide \
  2717.                 -topSide $topSide \
  2718.                 -leftOffset $leftOffset \
  2719.                 -recomputeSize 0 \
  2720.                 -bottomSide FORM]
  2721.     VxSetVar $statusBar statusLabel $statusLabel
  2722.     VxSetVar $statusBar form $form
  2723.     VxSetVar $statusBar visible 1 
  2724.     VxSetVar $parent statusBar $statusBar
  2725.     return $statusBar
  2726. }
  2727. proc SaStatusBarSet {form text} {
  2728.     set statusLabel [VxGetVar $form statusLabel]
  2729.     set old [VtGetValues $statusLabel -label]
  2730.     VtSetValues $statusLabel -label $text
  2731.     return $old
  2732. }
  2733. proc SaStatusBarClear {form} {
  2734.     set statusLabel [VxGetVar $form statusLabel]
  2735.     set old [VtGetValues $statusLabel -label]
  2736.     VtSetValues $statusLabel -label " "
  2737.     return $old
  2738. }
  2739. proc SaStatusBarGet {form} {
  2740.     set statusLabel [VxGetVar $form statusLabel]
  2741.     return [VtGetValues $statusLabel -label]
  2742. }
  2743. set SaSB_shortHelpEnabled 1
  2744. proc SaShortHelpCB {cbs} {
  2745.     global SaSB_shortHelpEnabled
  2746.     if {!$SaSB_shortHelpEnabled} {
  2747.         return
  2748.     }
  2749.     set dialog [keylget cbs dialog]
  2750.     set form [VxGetVar $dialog statusBar]
  2751.     set text [keylget cbs helpString]
  2752.     if {[lempty $text]} {
  2753.         set text " "
  2754.     }
  2755.     SaStatusBarSet $form $text
  2756. }
  2757. proc SaShortHelpSetState {state} {
  2758.     global SaSB_shortHelpEnabled
  2759.     set SaSB_shortHelpEnabled $state 
  2760.     if {!$state} {
  2761.         global SaSB_mainBar
  2762.         if {[info exists SaSB_mainBar]} {
  2763.             SaStatusBarClear $SaSB_mainBar
  2764.         }
  2765.     }
  2766. }
  2767. proc SaShortHelpGetState {} {
  2768.     global SaSB_shortHelpEnabled
  2769.     return $SaSB_shortHelpEnabled
  2770. }
  2771. proc SaSB:SaShortHelpMenuOptionCB {cbs} {
  2772.     set widget [keylget cbs widget]
  2773.     SaShortHelpSetState [VtGetValues $widget -value]
  2774. }
  2775. proc SaShortHelpMenuOptions {menu} {
  2776.     set shortHelpButton [VtToggleButton $menu.shortHelp \
  2777.         -label [IntlLocalizeMsg SCO_SA_STATUSBAR_MSG_POINTHELP] \
  2778.         -callback SaSB:SaShortHelpMenuOptionCB \
  2779.         -value [SaShortHelpGetState] \
  2780.         -shortHelpCallback SaShortHelpCB \
  2781.     -shortHelpString [IntlLocalizeMsg SCO_SA_STATUSBAR_MSG_SHPOINTHELP]]
  2782.     return $shortHelpButton
  2783. }
  2784. proc SaShortHelpLoad {client} {
  2785.     set state [SaShortHelpGetState]
  2786.     if {[catch {SaScreenPolicyGet $client shorthelp} state] == 0} {
  2787.         SaShortHelpSetState $state
  2788.     }
  2789.     global SaSB_state
  2790.     set SaSB_state [SaShortHelpGetState] 
  2791.     return $state
  2792. }
  2793. proc SaShortHelpStore {client} {
  2794.     set state [SaShortHelpGetState]
  2795.     global SaSB_state
  2796.     if {[info exists SaSB_state]} {
  2797.         if {$state == $SaSB_state} {
  2798.             return $state
  2799.         } 
  2800.     }
  2801.     set cmd [list SaScreenPolicySet $client shorthelp $state]
  2802.     ErrorCatch errorStack 1 $cmd dummy SCO_SA_STATUSBAR_ERR_BADSTORE
  2803.     return $state
  2804. }
  2805. proc SaStatusBarHide {form} {
  2806.     if {[VtInfo -charm]} {
  2807.         return
  2808.     }
  2809.     VtSetValues $form -bottomSide FORM 
  2810.     VtHide [VxGetVar $form form]
  2811.     VxSetVar $form visible 0 
  2812. }
  2813. proc SaStatusBarShow {form} {
  2814.     if {[VtInfo -charm]} {
  2815.         return
  2816.     }
  2817.     set sub [VxGetVar $form form]
  2818.     VtShow $sub
  2819.     VtSetValues $form -bottomSide $sub 
  2820.     VxSetVar $form visible 1 
  2821. }
  2822. proc SaStatusBarVisible {form} {
  2823.     if {[catch {VxGetVar $form visible} visible]} {
  2824.         return 1
  2825.     }
  2826.     return $visible 
  2827. }
  2828. #@packend: SaSB
  2829. #@package: SaTL SaTwoList SaTwoListGetItems SaTwoListSelectItems SaTwoListAddItems SaTwoListDeleteItems SaTwoListGetTabList SaTwoListSetFocus
  2830. proc SCO_SA_TWOLIST_MSGS {} {}
  2831. global SCO_SA_TWOLIST_MSGS
  2832. set SCO_SA_TWOLIST_MSGS(@catalog@) {sysadm.cat@sa 19}
  2833. set SCO_SA_TWOLIST_MSGS(MSG_SEARCH_FOR_LABEL) {1 {Search for:}}
  2834. proc SaTwoListGetItems {twoList list} {
  2835.     set listWidget [VxGetVar $twoList list${list}]
  2836.     return [VtGetValues $listWidget -itemList]
  2837. }
  2838. proc SaTwoListSelectItems {twoList list itemList} {
  2839.     set listWidget [VxGetVar $twoList list${list}]
  2840.     VtListSelectItem $listWidget -notify -itemList $itemList
  2841. }
  2842. proc SaTwoListAddItems {twoList list itemList} {
  2843.     set listWidget [VxGetVar $twoList list${list}]
  2844.     VtListAddItem $listWidget -itemList $itemList
  2845. }
  2846. proc SaTwoListDeleteItems {twoList list} {
  2847.     set listWidget [VxGetVar $twoList list${list}]
  2848.     VtListDeleteItem $listWidget -all
  2849. }
  2850. proc SaTwoList {widget \
  2851.                 label1_label list1_items \
  2852.                 label2_label list2_items \
  2853.                 1To2Button_label 2To1Button_label \
  2854.                 {optionList {}}} {
  2855.     set listRows 7
  2856.     set listColumns auto
  2857.     set selection multiple
  2858.     set search neither
  2859.     set sorting {}
  2860.     set copySelected never
  2861.     set movement next
  2862.     set searchLabel1_label [IntlLocalizeMsg SCO_SA_TWOLIST_MSG_SEARCH_FOR_LABEL]
  2863.     set searchLabel2_label $searchLabel1_label
  2864.     foreach element $optionList {
  2865.         set option [lindex $element 0]
  2866.         case $option in {
  2867.             {-rows} {
  2868.                 if {[llength $element] != 2} {
  2869.                     error "$option needs a single integer argument"
  2870.                 }
  2871.                 set listRows [lindex $element 1]
  2872.                 if {![ctype digit $listRows]} {
  2873.                     error "$option needs a single integer argument"
  2874.                 }}
  2875.             {-columns} {
  2876.                 if {[llength $element] != 2} {
  2877.                     error "$option needs a single integer argument"
  2878.                 }
  2879.                 set listColumns [lindex $element 1]
  2880.                 if {![ctype digit $listColumns]} {
  2881.                     error "$option needs a single integer argument"
  2882.                 }
  2883.                 if {$listColumns <= 0} {
  2884.                     set listColumns auto
  2885.                 } else {
  2886.             if [WsInfo -charm] {
  2887.                 incr listColumns 2
  2888.             }
  2889.         }}
  2890.             {-selection} {
  2891.                 if {[llength $element] != 2} {
  2892.                     error "$option needs an argument, either 'single' or multiple'"
  2893.                 }
  2894.                 set selection [lindex $element 1]
  2895.                 case $selection in {
  2896.                     {single multiple} {}
  2897.                     default {
  2898.                          error "$option needs an argument, either 'single' or multiple'"
  2899.                 }}}
  2900.             {-search} {
  2901.                 if {[llength $element] != 2} {
  2902.                     error "$option needs an argument, one of 'list1' 'list2' 'neither' or 'both'"
  2903.                 }
  2904.                 set search [lindex $element 1]
  2905.                 case $search in {
  2906.                     {list1 list2 neither both} {}
  2907.                     default {
  2908.                         error "$option needs an argument, one of 'list1' 'list2' 'neither' or 'both'"
  2909.                 }}}
  2910.             {-sorting} {
  2911.                 if {[llength $element] != 2} {
  2912.                     error "$option needs an argument, either 'none' or a valid lsort option."
  2913.                 }
  2914.                 set sorting [lindex $element 1]}
  2915.             {-copySelected} {
  2916.                 if {[llength $element] != 2} {
  2917.                     error "$option needs an argument, one of 'never', '1To2', '2To1', 'always'"
  2918.                 }
  2919.                 set copySelected [lindex $element 1]
  2920.                 case $copySelected in {
  2921.                     {never 1To2 2To1 always} {}
  2922.                     default {
  2923.                         error "$option needs an argument, one of 'never', '1To2', '2To1', 'always'"
  2924.                 }}}
  2925.             {-movement} {
  2926.                 if {[llength $element] != 2} {
  2927.                     error "$option needs an argument, either 'next' or 'follow'"
  2928.                 }
  2929.                 set movement [lindex $element 1]
  2930.                 case $movement in {
  2931.                     {next follow} {}
  2932.                     default {
  2933.                         error "$option needs an argument, either 'next' or 'follow'"
  2934.                 }}}
  2935.         }
  2936.     }
  2937.     set maxwidth 35
  2938.     if {$listColumns == "auto"} {
  2939.         set max [SaTL:GetLabelMaxLength $label1_label]
  2940.         set len [SaTL:GetLabelMaxLength $label2_label] 
  2941.         if { $len > $max } {
  2942.             set max $len 
  2943.         }
  2944.         set len [SaTL:GetLabelMaxLength $searchLabel1_label] 
  2945.         if { $len > $max } {
  2946.             set max $len 
  2947.         }
  2948.         set len [SaTL:GetLabelMaxLength $searchLabel2_label] 
  2949.         if { $len > $max } {
  2950.             set max $len 
  2951.         }
  2952.         foreach entry $list1_items {
  2953.             set cur [expr "[string length $entry] + 2"]
  2954.             if {$cur > $max} {
  2955.                 set max $cur
  2956.             }
  2957.         }
  2958.         foreach entry $list2_items {
  2959.             set cur [expr "[string length $entry] + 2"]
  2960.             if {$cur > $max} {
  2961.                 set max $cur
  2962.             }
  2963.         }
  2964.     } else {
  2965.         set max $listColumns
  2966.     }
  2967.     if {$max > $maxwidth} {set max $maxwidth}
  2968.     case $search in {
  2969.         {list1} {set search1_present 1; set search2_present 0}
  2970.         {list2} {set search1_present 0; set search2_present 1}
  2971.         {neither} {set search1_present 0; set search2_present 0}
  2972.         {both} {set search1_present 1; set search2_present 1}
  2973.     }
  2974.     case $copySelected in {
  2975.         {1To2} {set 1To2Move 0; set 2To1Move 1}
  2976.         {2To1} {set 1To2Move 1; set 2To1Move 0}
  2977.         {never} {set 1To2Move 1; set 2To1Move 1}
  2978.         {always} {set 1To2Move 0; set 2To1Move 0}
  2979.     }
  2980.     set selection [string toupper $selection]
  2981. if {$selection == "SINGLE"} {set selection BROWSE}
  2982.     if {$selection == "MULTIPLE"} {set selection EXTENDED}
  2983.     set parent [join [lreplace [split $widget "."] end end] "."]
  2984.     set formname [lindex [split $widget "."] end]
  2985.     set form \
  2986.             [VtForm $parent.$formname -verticalSpacing 0 -horizontalSpacing 0]
  2987.     set label1 \
  2988.             [VtLabel $form.label1 \
  2989.                     -label $label1_label \
  2990.                     -labelLeft]
  2991.     set list1 \
  2992.             [VtList $form.list1 \
  2993.             -columns $max \
  2994.             -rows $listRows \
  2995.                     -itemList $list1_items \
  2996.                     -selection $selection \
  2997.             -callback "SaTL:List1CB $form" \
  2998.             -scrollBar 1 \
  2999.             -defaultCallback "SaTL:1To2CB $form"]
  3000. if {$selection == "BROWSE"} {VtSetValues $list1 -autoSelect 1}
  3001.     VxSetVar $list1 sortOptions $sorting
  3002.     VxSetVar $list1 selectBehaviour $movement
  3003.     if {$search1_present} {
  3004.         set searchLabel1 \
  3005.                 [VtLabel $form.searchLabel1 \
  3006.                         -label $searchLabel1_label \
  3007.                         -labelLeft]
  3008.         set searchField1 \
  3009.                 [VtText $form.searchField1 \
  3010.                         -columns $max \
  3011.                         -callback "SaTL:Search1CB $form"]
  3012.     }
  3013.     set buttonRowCol \
  3014.             [VtRowColumn $form.buttonRowCol]
  3015.     set 1To2Button \
  3016.             [VtPushButton $buttonRowCol.1To2Button \
  3017.                     -label $1To2Button_label \
  3018.                     -labelCenter \
  3019.                     -callback "SaTL:1To2CB $form"]
  3020.     VtSetSensitive $1To2Button 0
  3021.     set 2To1Button \
  3022.             [VtPushButton $buttonRowCol.2To1Button \
  3023.                     -label $2To1Button_label \
  3024.                     -labelCenter \
  3025.                     -callback "SaTL:2To1CB $form"]
  3026.     VtSetSensitive $2To1Button 0
  3027.     set label2 \
  3028.             [VtLabel $form.label2 \
  3029.                     -label $label2_label \
  3030.                     -labelLeft]
  3031.     set list2 \
  3032.             [VtList $form.list2 \
  3033.                     -columns $max \
  3034.             -rows $listRows \
  3035.                     -itemList $list2_items \
  3036.                     -selection $selection \
  3037.                     -callback "SaTL:List2CB $form" \
  3038.             -scrollBar 1 \
  3039.                     -defaultCallback "SaTL:2To1CB $form"]
  3040. if {$selection == "BROWSE"} {VtSetValues $list2 -autoSelect 1}
  3041.     VxSetVar $list2 sortOptions $sorting
  3042.     VxSetVar $list2 selectBehaviour $movement
  3043.     if {$search2_present} {
  3044.         set searchLabel2 \
  3045.                 [VtLabel $form.searchLabel2 \
  3046.                         -label $searchLabel2_label \
  3047.                         -labelLeft]
  3048.         set searchField2 \
  3049.                 [VtText $form.searchField2 \
  3050.                         -columns $max \
  3051.                         -callback "SaTL:Search2CB $form"]
  3052.     }
  3053.     VtSetValues $label1 -topSide FORM -topOffset 0 -leftSide FORM -leftOffset 0
  3054.     VtSetValues $list1 -topSide $label1 -leftSide FORM -leftOffset 0
  3055.     VtSetValues $buttonRowCol -leftSide $list1 -alignTop $list1
  3056.     VtSetValues $label2 -topSide FORM -topOffset 0 -leftSide $buttonRowCol
  3057.     VtSetValues $list2 -topSide $label2 -leftSide $buttonRowCol
  3058.     if {$search1_present} {
  3059.         VtSetValues $searchLabel1 -topSide $list1 -leftSide FORM -leftOffset 0 \
  3060.                 -alignRight $list1
  3061.         VtSetValues $searchField1 -topSide $searchLabel1 -leftSide FORM \
  3062.                 -leftOffset 0 -alignRight $searchLabel1
  3063.     }
  3064.     if {$search2_present} {
  3065.         VtSetValues $searchLabel2 -topSide $list2 -leftSide $buttonRowCol \
  3066.                 -alignRight $list2
  3067.         VtSetValues $searchField2 -topSide $searchLabel2 \
  3068.                 -leftSide $buttonRowCol -alignRight $searchLabel2
  3069.     }
  3070.     VxSetVar $form selectionType $selection
  3071.     VxSetVar $form selectionMovement $movement
  3072.     VxSetVar $form buttonRowCol $buttonRowCol
  3073.     VxSetVar $form 1To2Move $1To2Move
  3074.     VxSetVar $form 2To1Move $2To1Move
  3075.     VxSetVar $form label1 $label1
  3076.     VxSetVar $form list1 $list1
  3077.     VxSetVar $form label2 $label2
  3078.     VxSetVar $form list2 $list2
  3079.     VxSetVar $form 1To2Button $1To2Button
  3080.     VxSetVar $form 2To1Button $2To1Button
  3081.     if {$search1_present} {
  3082.         VxSetVar $form searchLabel1 $searchLabel1
  3083.         VxSetVar $form searchField1 $searchField1
  3084.     } else {
  3085.         VxSetVar $form searchLabel1 {}
  3086.         VxSetVar $form searchField1 {}
  3087.     }
  3088.     if {$search2_present} {
  3089.         VxSetVar $form searchLabel2 $searchLabel2
  3090.         VxSetVar $form searchField2 $searchField2
  3091.     } else {
  3092.         VxSetVar $form searchLabel2 {}
  3093.         VxSetVar $form searchField2 {}
  3094.     }
  3095.     return $form
  3096. }
  3097. proc SaTL:GetLabelMaxLength {label} {
  3098.     set list [split $label "\n"]
  3099.     set max [string length [lindex $list 0]]
  3100.     foreach item $list {
  3101.         if { [string length $item] > $max } {
  3102.         set max [string length $item]
  3103.         }
  3104.      }
  3105.     return $max
  3106. proc SaTL:List1Sensitive {twoList} {
  3107.     set 1To2Button [VxGetVar $twoList 1To2Button]
  3108.     set 2To1Button [VxGetVar $twoList 2To1Button]
  3109.     set list1  [VxGetVar $twoList list1]
  3110.     set list2  [VxGetVar $twoList list2]
  3111.     VtSetSensitive $1To2Button 1
  3112.     VtSetSensitive $2To1Button 0
  3113.     VtListDeselectItem $list2 -all
  3114.     VtSetFocus $list1
  3115. }
  3116. proc SaTL:List2Sensitive {twoList} {
  3117.     set 1To2Button [VxGetVar $twoList 1To2Button]
  3118.     set 2To1Button [VxGetVar $twoList 2To1Button]
  3119.     set list1  [VxGetVar $twoList list1]
  3120.     set list2  [VxGetVar $twoList list2]
  3121.     VtSetSensitive $1To2Button 0
  3122.     VtSetSensitive $2To1Button 1
  3123.     VtListDeselectItem $list1 -all
  3124.     VtSetFocus $list2
  3125. }
  3126. proc SaTL:List1CB {twoList cbs} {
  3127.     set currval [keylget cbs selectedItemList]
  3128.     if {[lempty $currval]} {
  3129.         VtSetSensitive [VxGetVar $twoList 1To2Button] 0
  3130.     } else {
  3131.         SaTL:List1Sensitive $twoList
  3132.     }
  3133. }
  3134. proc SaTL:List2CB {twoList cbs} {
  3135.     set selectedItemList [keylget cbs selectedItemList]
  3136.     if {[lempty $selectedItemList]} {
  3137.         VtSetSensitive [VxGetVar $twoList 2To1Button] 0
  3138.     } else {
  3139.         SaTL:List2Sensitive $twoList
  3140.     }
  3141. }
  3142. proc SaTL:Search1CB {twoList cbs} {
  3143.     set searchValue [VtGetValues [keylget cbs widget] -value]
  3144.     set list1 [VxGetVar $twoList list1]
  3145.     set itemList [VtGetValues $list1 -itemList]
  3146.     set listIndex [lsearch $itemList ${searchValue}*]
  3147.     if {$listIndex > -1} {
  3148.         VtListSelectItem $list1 -notify -position [expr $listIndex+1] 
  3149.         SaListShowSelectedItem $list1
  3150.     }
  3151. }
  3152. proc SaTL:Search2CB {twoList cbs} {
  3153.     set searchValue [VtGetValues [keylget cbs widget] -value]
  3154.     set list2 [VxGetVar $twoList list2]
  3155.     set itemList [VtGetValues $list2 -itemList]
  3156.     set listIndex [lsearch $itemList ${searchValue}*]
  3157.     if {$listIndex > -1} {
  3158.         VtListSelectItem $list2 -notify -position [expr $listIndex+1] 
  3159.         SaListShowSelectedItem $list2
  3160.     }
  3161. }
  3162. proc SaTL:1To2CB {twoList cbs} {
  3163.     set list1 [VxGetVar $twoList list1]
  3164.     set selectedItemList [VtListGetSelectedItem $list1 -byItemList]
  3165.     if {[lempty $selectedItemList]} {return}
  3166.     set list2 [VxGetVar $twoList list2]
  3167.     set list2ItemList [VtGetValues $list2 -itemList]
  3168.     set list2AddList {}
  3169.     foreach item $selectedItemList {
  3170.         if {[lsearch $list2ItemList $item] < 0} {
  3171.             lappend list2AddList $item
  3172.         }
  3173.     }
  3174.     if {[VxGetVar $twoList 1To2Move]} {
  3175.         set selectNextItem 1
  3176.         set nextPosition [SaTL:DeleteFromList $list1 $selectedItemList]
  3177.     } else {
  3178.         set selectNextItem 0
  3179.     }
  3180.     if {![lempty $list2AddList]} {
  3181.         SaTL:AddToList $list2 $list2AddList
  3182.     }
  3183.     if {[VxGetVar $twoList selectionMovement] == "next"} {
  3184.         if {$selectNextItem} {
  3185.             if {$nextPosition < 0} {
  3186.                 VtSetSensitive [VxGetVar $twoList 1To2Button] 0
  3187.             } else {
  3188.                 VtListSelectItem $list1 -notify -position $nextPosition
  3189.             }
  3190.         }
  3191.     } else {
  3192.         VtListSelectItem $list2 -notify -itemList $selectedItemList
  3193.         SaTL:List2Sensitive $twoList
  3194.     }
  3195. }
  3196. proc SaTL:2To1CB {twoList cbs} {
  3197.     set list2 [VxGetVar $twoList list2]
  3198.     set selectedItemList [VtListGetSelectedItem $list2 -byItemList]
  3199.     if {[lempty $selectedItemList]} {return}
  3200.     set list1 [VxGetVar $twoList list1]
  3201.     set list1ItemList [VtGetValues $list1 -itemList]
  3202.     set list1AddList {}
  3203.     foreach item $selectedItemList {
  3204.         if {[lsearch $list1ItemList $item] < 0} {
  3205.             lappend list1AddList $item
  3206.         }
  3207.     }
  3208.     if {[VxGetVar $twoList 2To1Move]} {
  3209.         set selectNextItem 1
  3210.         set nextPosition [SaTL:DeleteFromList $list2 $selectedItemList]
  3211.     } else {
  3212.         set selectNextItem 0
  3213.     }
  3214.     if {![lempty $list1AddList]} {
  3215.         SaTL:AddToList $list1 $list1AddList
  3216.     }
  3217.     if {[VxGetVar $twoList selectionMovement] == "next"} {
  3218.         if {$selectNextItem} {
  3219.             if {$nextPosition < 0} {
  3220.                 VtSetSensitive [VxGetVar $twoList 2To1Button] 0
  3221.             } else {
  3222.                 VtListSelectItem $list2 -notify -position $nextPosition
  3223.             }
  3224.         }
  3225.     } else {
  3226.         VtListSelectItem $list1 -notify -itemList $selectedItemList
  3227.         SaTL:List1Sensitive $twoList
  3228.     }
  3229. }
  3230. proc SaTL:DeleteFromList {listWidget deleteItems} {
  3231.     set currentItems [VtGetValues $listWidget -itemList]
  3232.     set firstDeleteItem [lindex $deleteItems 0]
  3233.     set nextItemPosition [expr "[lsearch $currentItems $firstDeleteItem] + 1"]
  3234.     VtListDeleteItem $listWidget -itemList $deleteItems
  3235.     if {[llength [VtGetValues $listWidget -itemList]] \
  3236.             < $nextItemPosition} {
  3237.         incr nextItemPosition -1
  3238.     }
  3239.     if {$nextItemPosition == 0} {return -1}
  3240.     return $nextItemPosition
  3241. }
  3242. proc SaTL:AddToList {listWidget addItems} {
  3243.     set sortOptions [VxGetVar $listWidget sortOptions]
  3244.     set currentItems [VtGetValues $listWidget -itemList]
  3245.     case $sortOptions in {
  3246.         {none} {
  3247.             set newItems [concat $currentItems $addItems]}
  3248.         {} {
  3249.             set newItems \
  3250.         [lsort [concat $currentItems $addItems]]}
  3251.         default {
  3252.             set newItems \
  3253.                     [lsort $sortOptions [concat $currentItems $addItems]]}
  3254.     }
  3255.     VtListDeleteItem $listWidget -all
  3256.     VtListAddItem $listWidget -itemList $newItems
  3257. }
  3258. proc SaTwoListGetTabList {form} {
  3259.     lappend list [VxGetVar $form list1]
  3260.         lappend list [VxGetVar $form searchField1]
  3261.     lappend list [VxGetVar $form 1To2Button]
  3262.     lappend list [VxGetVar $form 2To1Button]
  3263.     lappend list [VxGetVar $form list2]
  3264.         lappend list [VxGetVar $form searchField2]
  3265.     return $list
  3266. }
  3267. proc SaTwoListSetFocus {twoList {i 1}} {
  3268.     set list list$i
  3269.     if {[lempty [SaTwoListGetItems $twoList $i]]} {
  3270.         set i [expr $i==1 ? 2 : 1]
  3271.         set list list${i}
  3272.         if {[lempty [SaTwoListGetItems $twoList $i]]} {
  3273.             VtSetFocus [VxGetVar $twoList $list]
  3274.             return
  3275.         }
  3276.     }
  3277.     set list [VxGetVar $twoList $list]
  3278.     VtSetFocus $list
  3279.     if {[lempty [VtListGetSelectedItem $list]]} {
  3280.         VtListSelectItem $list -position 1 -notify
  3281.     } 
  3282. }
  3283. #@packend saTwoList
  3284. #@package: SaAR SaAutoRefresh SaAutoRefreshGetState SaAutoRefreshSetInterval SaAutoRefreshGetInterval SaAutoRefreshOn SaAutoRefreshOff SaAutoRefreshCalled SaAutoRefreshLoad SaAutoRefreshStore SaAutoRefreshPause SaAutoRefreshResume SaAutoRefreshIntervalCB
  3285. proc SCO_SA_AUTOREFRESH_MSGS {} {}
  3286. global SCO_SA_AUTOREFRESH_MSGS
  3287. set SCO_SA_AUTOREFRESH_MSGS(@catalog@) {sysadm.cat@sa 17}
  3288. set SCO_SA_AUTOREFRESH_MSGS(MSG_SHSETREFRESH) {1 {Configure automatic refresh parameters}}
  3289. set SCO_SA_AUTOREFRESH_MSGS(MSG_SHREFRESH) {2 {Refresh %s}}
  3290. set SCO_SA_AUTOREFRESH_MSGS(MSG_SHREFRESHON) {3 {Enable automatic refresh}}
  3291. set SCO_SA_AUTOREFRESH_MSGS(MSG_SHREFRESHOFF) {4 {Disable automatic refresh}}
  3292. set SCO_SA_AUTOREFRESH_MSGS(MSG_SHREFRESHINT) {5 {Set time interval for automatic refresh}}
  3293. set SCO_SA_AUTOREFRESH_MSGS(MSG_INTERVAL) {6 {Auto Refresh Interval}}
  3294. set SCO_SA_AUTOREFRESH_MSGS(MSG_MINUTES) {7 Minutes}
  3295. set SCO_SA_AUTOREFRESH_MSGS(MSG_SETREFRESH) {8 {Set Auto Refresh}}
  3296. set SCO_SA_AUTOREFRESH_MSGS(MSG_SETREFRESHMN) {9 S}
  3297. set SCO_SA_AUTOREFRESH_MSGS(MSG_REFRESHNOW) {10 {Refresh Now}}
  3298. set SCO_SA_AUTOREFRESH_MSGS(MSG_REFRESH) {11 Refresh}
  3299. set SCO_SA_AUTOREFRESH_MSGS(MSG_REFRESHMN) {12 f}
  3300. set SCO_SA_AUTOREFRESH_MSGS(MSG_REFRESHACC) {13 <Key>F5}
  3301. set SCO_SA_AUTOREFRESH_MSGS(MSG_REFRESHACCSTR) {14 F5}
  3302. set SCO_SA_AUTOREFRESH_MSGS(MSG_ON) {15 On}
  3303. set SCO_SA_AUTOREFRESH_MSGS(MSG_ONMN) {16 O}
  3304. set SCO_SA_AUTOREFRESH_MSGS(MSG_OFF) {17 Off}
  3305. set SCO_SA_AUTOREFRESH_MSGS(MSG_OFFMN) {18 f}
  3306. set SCO_SA_AUTOREFRESH_MSGS(MSG_REFRESHINT) {19 Interval...}
  3307. set SCO_SA_AUTOREFRESH_MSGS(MSG_REFRESHINTMN) {20 I}
  3308. set SCO_SA_AUTOREFRESH_MSGS(ERR_BADSTORE) {21 {Unable to save auto refresh preferences}}
  3309. set SCO_SA_AUTOREFRESH_MSGS(MSG_SHREFRESHDATA) {22 {Refresh data}}
  3310. set SaAR_State 0            ;# until this is implemented
  3311. set SaAR_Interval 120000    ;# dummy value for now
  3312. set SaAR_Menu ""            ;# if null, no button actions
  3313. set SaAR_RefreshCB    ""
  3314. set SaAR_ID        ""
  3315. set SaAR_Lock        0
  3316. proc SaAutoRefresh {refreshCB {menu ""} {shortStr ""} {shortCB ""} {intervalCB ""}} {
  3317.     global SaAR_Menu SaAR_RefreshCB
  3318.     set SaAR_RefreshCB $refreshCB
  3319.     if {$menu == "" } {
  3320.         return
  3321.     }
  3322.     if {$shortCB == "" } {
  3323.         set shortCB SaShortHelpCB
  3324.     }
  3325.     set refreshMenu [VtPulldown $menu.refreshMenu \
  3326.         -label [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_SETREFRESH] \
  3327.         -shortHelpCallback $shortCB \
  3328.         -shortHelpString \
  3329.             [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_SHSETREFRESH] \
  3330.         -mnemonic [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_SETREFRESHMN]] 
  3331.     VxSetVar $menu refreshMenu $refreshMenu
  3332.     set SaAR_Menu $refreshMenu
  3333.     if { "$shortStr" == "data" } {
  3334.         set shortHelp \
  3335.             [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_SHREFRESHDATA]
  3336.     } else {
  3337.         set shortHelp \
  3338.             [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_SHREFRESH [list $shortStr]]
  3339.     }
  3340.     set refreshNow [VtPushButton $menu.refreshNow -callback $refreshCB \
  3341.         -autoLock [lindex $refreshCB 0 ] \
  3342.         -label [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_REFRESHNOW] \
  3343.         -mnemonic [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_REFRESHMN] \
  3344.         -shortHelpCallback $shortCB \
  3345.         -shortHelpString $shortHelp \
  3346.         -accelerator \
  3347.             [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_REFRESHACC] \
  3348.         -acceleratorString \
  3349.             [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_REFRESHACCSTR]]
  3350.     VxSetVar $menu refreshNow $refreshNow
  3351.     set refreshOn [VtPushButton $refreshMenu.refreshOn \
  3352.         -label [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_ON] \
  3353.         -mnemonic [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_ONMN] \
  3354.         -shortHelpCallback $shortCB \
  3355.         -shortHelpString \
  3356.             [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_SHREFRESHON] \
  3357.         -callback SaAutoRefreshOn] 
  3358.     VtSetSensitive $refreshOn off
  3359.     VxSetVar $refreshMenu refreshOn $refreshOn
  3360.     set refreshOff [VtPushButton $refreshMenu.refreshOff \
  3361.         -label [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_OFF] \
  3362.         -mnemonic [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_OFFMN] \
  3363.         -shortHelpCallback $shortCB \
  3364.         -shortHelpString \
  3365.             [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_SHREFRESHOFF] \
  3366.         -callback SaAutoRefreshOff]
  3367.     VtSetSensitive $refreshOff off
  3368.     VxSetVar $refreshMenu refreshOff $refreshOff
  3369.     SaAR:SetRefreshOptionSensitivity
  3370.     if {$intervalCB == ""} {
  3371.         return
  3372.     }
  3373.     VtSeparator $refreshMenu.s4
  3374.     set refreshInterval [VtPushButton $refreshMenu.refreshInterval \
  3375.         -label [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_REFRESHINT] \
  3376.         -mnemonic [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_REFRESHINTMN] \
  3377.         -shortHelpCallback $shortCB \
  3378.         -shortHelpString \
  3379.             [IntlLocalizeMsg SCO_SA_AUTOREFRESH_MSG_SHREFRESHINT] \
  3380.         -callback $intervalCB -autoLock $intervalCB]
  3381.     VxSetVar $refreshMenu refreshInterval $refreshInterval
  3382. }
  3383. proc SaAR:SetRefreshOptionSensitivity {} {
  3384.     global SaAR_State SaAR_Menu
  3385.     if {$SaAR_Menu == ""} {
  3386.         return
  3387.     }
  3388.     set refreshOn [VxGetVar $SaAR_Menu refreshOn]
  3389.     set refreshOff [VxGetVar $SaAR_Menu refreshOff]
  3390.     case $SaAR_State {
  3391.         {1} {
  3392.             VtSetSensitive $refreshOn off
  3393.             VtSetSensitive $refreshOff 1
  3394.         }
  3395.         {0} {
  3396.             VtSetSensitive $refreshOn 1
  3397.             VtSetSensitive $refreshOff off
  3398.         }
  3399.     }
  3400. }
  3401. proc SaAR:AutoRefreshCB {cbs} {
  3402.     global SaAR_RefreshCB SaAR_Lock SaAR_ID
  3403.     VtLock
  3404.     set SaAR_ID ""
  3405.     if {$SaAR_RefreshCB != ""} {
  3406.         keylset cbs autoRefresh 1
  3407.         eval $SaAR_RefreshCB [list $cbs]
  3408.         SaAR:AutoRefreshSchedule
  3409.     }
  3410.     VtUnLock
  3411. }
  3412. proc SaAutoRefreshOn {{cbs ""}} {
  3413.     SaAR:SetAutoRefreshState 1
  3414. }
  3415. proc SaAutoRefreshOff {{cbs ""}} {
  3416.     SaAR:SetAutoRefreshState 0
  3417. }
  3418. proc SaAutoRefreshPause {{cbs ""}} {
  3419.     global SaAR_ID SaAR_State
  3420.     set SaAR_State [expr $SaAR_State|10]
  3421.     if {$SaAR_ID != ""} {
  3422.         VtRemoveTimeOut $SaAR_ID
  3423.         set SaAR_ID ""
  3424.     }
  3425. }
  3426. proc SaAutoRefreshResume {{cbs ""}} {
  3427.     global SaAR_State 
  3428.     set SaAR_State [expr $SaAR_State&1]
  3429.     if {[SaAutoRefreshGetState]} {
  3430.         SaAR:AutoRefreshSchedule
  3431.     }
  3432. }
  3433. proc SaAR:AutoRefreshSchedule {} {
  3434.     global SaAR_ID SaAR_Interval SaAR_State
  3435.     if {[expr $SaAR_State&10] != 10 && [lempty $SaAR_ID]} {
  3436.         set SaAR_ID [VtAddTimeOut \
  3437.                     -interval $SaAR_Interval \
  3438.                     -callback SaAR:AutoRefreshCB]
  3439.     }
  3440. }
  3441. proc SaAR:SetAutoRefreshState {state {cbs ""}} {
  3442.     global SaAR_State SaAR_Interval SaAR_RefreshCB
  3443.     if {[expr $SaAR_State&1] != "$state"} {
  3444.         set SaAR_State $state
  3445.         SaAR:SetRefreshOptionSensitivity
  3446.         case $SaAR_State {
  3447.             {1} {
  3448.                 SaAR:AutoRefreshSchedule
  3449.             }
  3450.             {0} {
  3451.                 SaAutoRefreshPause
  3452.             }
  3453.         }
  3454.     }
  3455.     return $SaAR_State
  3456. }
  3457. proc SaAutoRefreshGetState {} {
  3458.     global SaAR_State
  3459.     return [expr $SaAR_State&1]
  3460. }
  3461. proc SaAutoRefreshSetInterval {interval} {
  3462.     global SaAR_Interval
  3463.     set new [expr "$interval * 1000"]
  3464.     if {$new != $SaAR_Interval} {
  3465.         SaAutoRefreshPause
  3466.     }
  3467.     set SaAR_Interval $new
  3468.     SaAutoRefreshResume
  3469.     return $interval
  3470. }
  3471. proc SaAutoRefreshGetInterval {} {
  3472.     global SaAR_Interval
  3473.     return [expr "$SaAR_Interval / 1000"]
  3474. }
  3475. proc SaAutoRefreshCalled {cbs} {
  3476.     return [keylget cbs autoRefresh dummy]
  3477. }
  3478. proc SaAutoRefreshLoad {client} {
  3479.     if {[catch {SaScreenPolicyGet $client autoRefreshInterval} value] == 0} {
  3480.         set  interval $value 
  3481.         SaAutoRefreshSetInterval $interval
  3482.     }
  3483.     if {[catch {SaScreenPolicyGet $client autoRefreshState} value] == 0} {
  3484.         set state $value 
  3485.         SaAR:SetAutoRefreshState $state 
  3486.     }
  3487.     return 1
  3488. }
  3489. proc SaAutoRefreshStore {client} {
  3490.     set state [SaAutoRefreshGetState]
  3491.     set cmd [list SaScreenPolicySet $client autoRefreshState $state]
  3492.     ErrorCatch errorStack 1 $cmd dummy SCO_SA_AUTOREFRESH_ERR_BADSTORE
  3493.     set interval [SaAutoRefreshGetInterval]
  3494.     set cmd [list SaScreenPolicySet $client autoRefreshInterval $interval]
  3495.     ErrorCatch errorStack 1 $cmd dummy SCO_SA_AUTOREFRESH_ERR_BADSTORE
  3496.     return 1
  3497. }
  3498. proc SaAR:SaAutoRefreshIntervalOkCB {cbs} {
  3499.     set dialog [keylget cbs dialog]
  3500.     set scale [VxGetVar $dialog scale]
  3501.     set value [VtGetValues $scale -value]
  3502.     set value [expr "$value * 60"]
  3503.     SaAutoRefreshSetInterval $value
  3504.     VtDestroyDialog $dialog
  3505. }
  3506. proc SaAutoRefreshIntervalCB {min max cbs} {
  3507.     set dialog [keylget cbs dialog]
  3508.     set form [VtFormDialog $dialog.interval \
  3509.             -title [IntlLocalizeMsg \
  3510.                 SCO_SA_AUTOREFRESH_MSG_INTERVAL] \
  3511.             -okCallback SaAR:SaAutoRefreshIntervalOkCB \
  3512.             -cancelCallback VxEndFormCB \
  3513.             -cancelButton CANCEL \
  3514.             -help]
  3515.     set value [SaAutoRefreshGetInterval]
  3516.     set value [expr "$value / 60"]
  3517.     set scale [VtScale $form.scale \
  3518.             -leftSide FORM -rightSide FORM -topSide FORM \
  3519.             -title [IntlLocalizeMsg \
  3520.                 SCO_SA_AUTOREFRESH_MSG_MINUTES] \
  3521.             -min $min -max $max \
  3522.             -value $value \
  3523.             -horizontal]
  3524.     VxSetVar $form scale $scale
  3525.     VtShow $form
  3526.     VtUnLock
  3527. }
  3528. #@packend: SaAR
  3529. #@package: SaTb SaToolbar SaToolbarGet SaToolbarSetVisibility SaToolbarCustomize SaToolbarMenuOptions SaToolbarDummyCB SaToolbarLoad SaToolbarStore SaToolbarButtonSetSensitive SaToolbarCustomized
  3530. proc SCO_SA_TOOLBAR_MSGS {} {}
  3531. global SCO_SA_TOOLBAR_MSGS
  3532. set SCO_SA_TOOLBAR_MSGS(@catalog@) {sysadm.cat@sa 18}
  3533. set SCO_SA_TOOLBAR_MSGS(MSG_NULLSHORTHELP) {1 {Button not assigned to any task}}
  3534. set SCO_SA_TOOLBAR_MSGS(MSG_NULLICON) {2 /usr/lib/scoadmin/icons/question.px}
  3535. set SCO_SA_TOOLBAR_MSGS(MSG_SHOW) {3 Toolbar}
  3536. set SCO_SA_TOOLBAR_MSGS(MSG_SHSHOW) {4 {Show/hide Toolbar}}
  3537. set SCO_SA_TOOLBAR_MSGS(MSG_CUSTOM) {5 {Customize Toolbar}}
  3538. set SCO_SA_TOOLBAR_MSGS(MSG_SHCUSTOM) {6 {Configure toolbar icons/commands to suit personal preferences}}
  3539. set SCO_SA_TOOLBAR_MSGS(MSG_FORMAT) {7 Formatting}
  3540. set SCO_SA_TOOLBAR_MSGS(MSG_SPACEL) {8 {Add Space Left}}
  3541. set SCO_SA_TOOLBAR_MSGS(MSG_SPACER) {9 {Add Space Right}}
  3542. set SCO_SA_TOOLBAR_MSGS(MSG_BUTTONL) {10 {Add Button Left}}
  3543. set SCO_SA_TOOLBAR_MSGS(MSG_BUTTONR) {11 {Add Button Right}}
  3544. set SCO_SA_TOOLBAR_MSGS(MSG_DELETE) {12 Delete}
  3545. set SCO_SA_TOOLBAR_MSGS(MSG_STANDARD) {13 {Restore Default Toolbar}}
  3546. set SCO_SA_TOOLBAR_MSGS(MSG_BORDER) {14 {Change Border}}
  3547. set SCO_SA_TOOLBAR_MSGS(MSG_DESC) {15 Description}
  3548. set SCO_SA_TOOLBAR_MSGS(MSG_TOOLBAR) {16 Toolbar}
  3549. set SCO_SA_TOOLBAR_MSGS(MSG_ICONS) {17 Icons}
  3550. set SCO_SA_TOOLBAR_MSGS(MSG_COMMANDS) {18 Commands}
  3551. set SCO_SA_TOOLBAR_MSGS(MSG_SEP) {19 {-----[Space]-----}}
  3552. set SCO_SA_TOOLBAR_MSGS(MSG_SEP_DESC) {20 {This separates buttons in the toolbar}}
  3553. set SCO_SA_TOOLBAR_MSGS(ERR_DUPCOMMAND) {21 {A button already exists to perform the %s command.}}
  3554. set SCO_SA_TOOLBAR_MSGS(ERR_NOCOMMAND) {22 {This button has not been assigned a command}}
  3555. set SCO_SA_TOOLBAR_MSGS(ERR_NOBUTTONS) {23 {You cannot configure an empty toolbar.\nYou can hide the toolbar with the 'Toolbar' menu option.}}
  3556. set SCO_SA_TOOLBAR_MSGS(ERR_BADCOMMAND) {24 {Invalid command index in toolbar: '%s'}}
  3557. set SCO_SA_TOOLBAR_MSGS(ERR_DUPINDEX) {25 {Duplicate command index in toolbar: '%s'}}
  3558. set SCO_SA_TOOLBAR_MSGS(ERR_BADICON) {26 {Invalid icon index in toolbar: '%s'}}
  3559. set SCO_SA_TOOLBAR_MSGS(ERR_BADSTORE) {27 {Unable to save toolbar preferences}}
  3560. set SaTb_frame ""
  3561. set SaTb_icons ""
  3562. set SaTb_commands ""
  3563. set SaTb_display ""
  3564. set SaTb_visibility 1
  3565. set SaTb_init_visibility $SaTb_visibility
  3566. set SaTb_pulldown ""
  3567. set SaTb_modified_ever 0
  3568. set SaTb_modified 0
  3569. set SaTb_nullShortHelp     [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_NULLSHORTHELP]
  3570. set SaTb_nullIcon    [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_NULLICON]
  3571. set SaTb_nullIconIndex -1
  3572. set SaTb_shrink 1
  3573. proc SaToolbar {name attachment \
  3574.         icons commands default \
  3575.         {shorthelp SaShortHelpCB} \
  3576.         {visibility 1} {current ""} {frame IN} \
  3577.         {sensitizeCB ""} {customizeCB ""} \
  3578.         {redraw 0}} {
  3579.     if {[VtInfo -charm]} {
  3580.         return ""
  3581.     }
  3582.     global SaTb_icons SaTb_display SaTb_frame 
  3583.     global SaTb_display_standard
  3584.     global SaTb_frame SaTb_commands SaTb_visibility
  3585.     global SaTb_nullIcon SaTb_nullIconIndex SaTb_nullCommandIndex
  3586.     global SaTb_nullCommandIndexNext
  3587.     if {! $redraw} then {
  3588.         set SaTb_icons $icons
  3589.         set SaTb_nullIconIndex [llength $SaTb_icons]
  3590.         set SaTb_icons [concat $SaTb_icons $SaTb_nullIcon]
  3591.         set SaTb_commands $commands
  3592.         set SaTb_nullCommandIndex [llength $SaTb_commands]
  3593.         set SaTb_display_standard [SaTb:ToolbarConvertIn $default]
  3594.         set SaTb_display [SaTb:ToolbarConvertIn $current]
  3595.         if {[lempty $current]} {
  3596.             set SaTb_display $SaTb_display_standard
  3597.         }
  3598.         set parent [SaTb:GetParentWidget $name]
  3599.         set SaTb_frame [VtFrame ${name}_frame \
  3600.             -topSide $attachment \
  3601.             -bottomSide NONE \
  3602.             -leftSide FORM \
  3603.             -rightSide FORM \
  3604.         -leftOffset 2 -rightOffset 2 -topOffset 2 \
  3605.         -xmArgs [list XmNshadowThickness 1]]
  3606.         SaToolbarSetBorder $frame
  3607.         SaTb:SET $SaTb_frame toolbar_parent $parent
  3608.         SaTb:SET $SaTb_frame toolbar_shorthelp $shorthelp
  3609.         SaTb:SET $SaTb_frame toolbar_sensitizeCB $sensitizeCB
  3610.         SaTb:SET $SaTb_frame toolbar_customizeCB $customizeCB
  3611.         SaTb:SET $SaTb_frame toolbar_attach $attachment
  3612.         SaTb:SET $SaTb_frame SaTb_frame_type $frame
  3613.         set toolbar [VtForm $SaTb_frame.toolbar \
  3614.             -marginWidth 1 \
  3615.             -marginHeight 1]
  3616.         SaTb:SET $SaTb_frame toolbar $toolbar
  3617.         set toolbar_line [VtSeparator $name \
  3618.             -xmArgs [list XmNseparatorType XmNO_LINE] \
  3619.             -topSide $SaTb_frame \
  3620.             -bottomSide NONE \
  3621.             -leftSide FORM \
  3622.             -rightSide FORM \
  3623.             -topOffset 3 \
  3624.             -horizontal]
  3625.         SaTb:SET $SaTb_frame toolbar_line $toolbar_line
  3626.     } else {
  3627.         set attachment [SaTb:GET $SaTb_frame toolbar_attach]
  3628.         set shorthelp [SaTb:GET $SaTb_frame toolbar_shorthelp]
  3629.         set toolbar [SaTb:GET $SaTb_frame toolbar]
  3630.         foreach i [SaTb:GETKEYS $toolbar] {
  3631.             VtDestroy [SaTb:GET $toolbar $i]
  3632.             SaTb:UNSET $toolbar $i
  3633.         }
  3634.     }
  3635.     set space_size 0
  3636.     set last_button FORM
  3637.     set buttonHeight 20
  3638.     foreach i $SaTb_display {
  3639.         set command [lindex $i 1]
  3640.         if {[lindex $i 1] == "S"} then {
  3641.             incr space_size 15
  3642.         } else {
  3643.             set pixmapi [lindex $i 0]
  3644.             set commandi [lindex $i 1]
  3645.             SaTb:GetButtonComponents pixmapi commandi \
  3646.                 pixmap command callback desc_text
  3647.             set button [VtPushButton $toolbar.$command \
  3648.                 -topSide FORM \
  3649.                 -bottomSide FORM \
  3650.                 -leftSide $last_button \
  3651.                 -leftOffset $space_size \
  3652.                 -rightSide NONE \
  3653.                 -pixmap $pixmap \
  3654.                 -callback $callback \
  3655.                 -autoLock [lindex $callback 0] \
  3656.                 -shortHelpCallback $shorthelp \
  3657.                 -shortHelpString $desc_text \
  3658.                 -hidden 1 \
  3659.                 -xmArgs {XmNhighlightThickness 0 \
  3660.                      XmNmarginHeight 1 \
  3661.                      XmNmarginWidth 1}]
  3662.             VtShow $button
  3663.             set buttonHeight [VtGetValues $button -height]
  3664.             SaTb:SET $toolbar $command $button
  3665.             SaTb:SET $button state 1
  3666.             set last_button $button
  3667.             set space_size 0
  3668.         }
  3669.     }
  3670.     set button [VtLabel $toolbar.Dummy \
  3671.         -topSide FORM \
  3672.         -bottomSide FORM \
  3673.         -leftSide $last_button \
  3674.         -leftOffset $space_size \
  3675.         -rightSide NONE \
  3676.         -hidden 1 \
  3677.         -label ""]
  3678.     VtShow $button
  3679.     SaTb:SET $toolbar Dummy $button
  3680.     if {!$redraw} {
  3681.         SaToolbarSetVisibility $visibility
  3682.     }
  3683.     set height [expr "$buttonHeight + 8"]
  3684.     VtSetValues $SaTb_frame -height $height
  3685.     if {! $redraw} then {
  3686.         return $toolbar_line
  3687.     } else {
  3688.         return $SaTb_frame
  3689.     }
  3690. }
  3691. proc SaToolbarMenuOptions {pulldown options {shorthelpCB SaShortHelpCB}} {
  3692.     global SaTb_visibility SaTb_pulldown
  3693.     if {[VtInfo -charm]} {
  3694.         return
  3695.     }
  3696.     foreach option $options {
  3697.         case $option {
  3698.             {show} {
  3699.                 set toolbarVisibilityButton \
  3700.                     [VtToggleButton $pulldown.but1 \
  3701.                     -label \
  3702.                         [IntlLocalizeMsg \
  3703.                         SCO_SA_TOOLBAR_MSG_SHOW] \
  3704.                     -callback SaTb:ShowToolbarCB \
  3705.                     -value $SaTb_visibility \
  3706.                 -shortHelpCallback $shorthelpCB \
  3707.                 -shortHelpString [IntlLocalizeMsg \
  3708.                         SCO_SA_TOOLBAR_MSG_SHSHOW]]
  3709.                 VxSetVar $pulldown toolbarShow \
  3710.                     $toolbarVisibilityButton
  3711.             }
  3712.             {custom} {
  3713.                 set toolbarCustomizeButton \
  3714.                     [VtPushButton $pulldown.but2 \
  3715.                     -label \
  3716.                         [IntlLocalizeMsg \
  3717.                         SCO_SA_TOOLBAR_MSG_CUSTOM]... \
  3718.                     -shortHelpCallback $shorthelpCB \
  3719.                     -shortHelpString \
  3720.                         [IntlLocalizeMsg \
  3721.                         SCO_SA_TOOLBAR_MSG_SHCUSTOM] \
  3722.                     -callback [list SaToolbarCustomize] \
  3723.                     -autoLock SaToolbarCustomize]
  3724.                 VxSetVar $pulldown toolbarCustomize \
  3725.                     $toolbarCustomizeButton
  3726.             }
  3727.         }
  3728.     }
  3729.     if {!$SaTb_visibility} {
  3730.         VtSetSensitive $toolbarCustomizeButton 0
  3731.     }
  3732.     set SaTb_pulldown $pulldown
  3733. }
  3734. proc SaToolbarButtonSetSensitive {key state} {
  3735.     global SaTb_frame
  3736.     if {[VtInfo -charm]} {
  3737.         return 0
  3738.     }
  3739.     set keys [SaToolbarGetKeys]
  3740.     if {[lsearch $keys $key] == -1} {
  3741.         return 0
  3742.     }
  3743.     set toolbar [SaTb:GET $SaTb_frame toolbar]
  3744.     set widget [SaTb:GET $toolbar $key]
  3745.     VtSetSensitive $widget $state
  3746.     SaTb:SET $widget state $state
  3747.     return 1
  3748. }
  3749. proc SaToolbarGet {vp {cp ""} {fp ""}} {
  3750.     global SaTb_display SaTb_frame SaTb_visibility
  3751.     if {[VtInfo -charm]} {
  3752.         return
  3753.     }
  3754.     upvar $vp v
  3755.     set v $SaTb_visibility
  3756.     if {$cp != ""} {
  3757.         upvar $cp c
  3758.         set c [SaTb:ToolBarConvertOut $SaTb_display]
  3759.     }
  3760.     if {$fp != ""} {
  3761.         upvar $fp f
  3762.         set f [VtGetValues $SaTb_frame -shadowType]
  3763.     }
  3764. }
  3765. proc SaToolbarSetVisibility {visibility} {
  3766.     global SaTb_frame SaTb_visibility SaTb_pulldown
  3767.     global SaTb_shrink
  3768.     if {[VtInfo -charm]} {
  3769.         return
  3770.     }
  3771.     if {$SaTb_visibility == $visibility} {
  3772.         return
  3773.     }
  3774.     set SaTb_visibility $visibility
  3775.     set toolbar_line [SaTb:GET $SaTb_frame toolbar_line]
  3776.     set toolbar_attach [SaTb:GET $SaTb_frame toolbar_attach]
  3777.     set visibilityButton [VxGetVar $SaTb_pulldown toolbarShow]
  3778.     set parent [SaTb:GET $SaTb_frame toolbar_parent]
  3779.     if {[catch \
  3780.         {VxGetVar $SaTb_pulldown toolbarCustomize} \
  3781.         customizeButton]} {
  3782.         unset customizeButton
  3783.     }
  3784.     VtSetValues $parent -xmArgs "XmNresizable 0"
  3785.     if {$SaTb_visibility} then {
  3786.         if {$SaTb_shrink} {
  3787.             VtSetValues $toolbar_line \
  3788.                 -topSide $SaTb_frame
  3789.         }
  3790.         VtShow $SaTb_frame
  3791.         VtSetValues $visibilityButton -value 1 
  3792.         if {[info exists customizeButton]} {
  3793.             VtSetSensitive $customizeButton 1
  3794.         }
  3795.     } else {
  3796.         if {$SaTb_shrink} {
  3797.             VtSetValues $toolbar_line \
  3798.                 -topSide $toolbar_attach
  3799.         }
  3800.         VtHide $SaTb_frame
  3801.         VtSetValues $visibilityButton -value 0 
  3802.         if {[info exists customizeButton]} {
  3803.             VtSetSensitive $customizeButton 0
  3804.         }
  3805.     }
  3806.     VtSetValues $parent -xmArgs "XmNresizable 1"
  3807. }
  3808. proc SaToolbarLoad {client visibilityp {currentp ""} {framep ""}} {
  3809.     upvar $visibilityp visibility
  3810.     if {[VtInfo -charm]} {
  3811.         return 0
  3812.     }
  3813.     if {[catch {SaScreenPolicyGet $client toolbarVisibility} value] == 0} {
  3814.         set visibility $value 
  3815.     }
  3816.     global SaTb_init_visibility
  3817.     set SaTb_init_visibility $visibility
  3818.     if {$currentp != ""} {
  3819.         upvar $currentp current
  3820.         if {[catch {SaScreenPolicyGet $client toolbar} value] == 0} {
  3821.             set current $value 
  3822.             set current [split $current +]
  3823.             set current2 ""
  3824.             foreach button $current {
  3825.                 lappend current2 [split $button :]
  3826.             }
  3827.             set current $current2
  3828.         }
  3829.     }
  3830.     if {$framep != ""} {
  3831.         upvar $framep frame
  3832.         if {[catch {SaScreenPolicyGet $client toolbarFrame} value] == 0} {
  3833.             set frame $value 
  3834.         }
  3835.     }
  3836.     return 1
  3837. }
  3838. proc SaToolbarStore {client vp {cp ""} {fp ""} {required 0}} {
  3839.     upvar $vp v
  3840.     upvar $cp c
  3841.     upvar $fp f
  3842.     if {[VtInfo -charm]} {
  3843.         return 0
  3844.     }
  3845.     SaToolbarGet v c f
  3846.     set visibility $v 
  3847.     global SaTb_init_visibility
  3848.     if {$SaTb_init_visibility != $visibility} {
  3849.         set cmd [list SaScreenPolicySet \
  3850.             $client toolbarVisibility $visibility]
  3851.         ErrorCatch errorStack 1 $cmd dummy SCO_SA_TOOLBAR_ERR_BADSTORE
  3852.     }
  3853.     if {!$required && ![SaToolbarCustomized]} {
  3854.         return 1
  3855.     }
  3856.     if {$cp != ""} {
  3857.         set toolbar $c 
  3858.         set toolbar2 ""
  3859.         foreach button $toolbar {
  3860.             append toolbar2 +[lindex $button 0]:[lindex $button 1]
  3861.         }
  3862.         set toolbar [string trim $toolbar2 +]
  3863.         set cmd [list SaScreenPolicySet $client toolbar $toolbar]
  3864.         ErrorCatch errorStack 1 $cmd dummy SCO_SA_TOOLBAR_ERR_BADSTORE
  3865.     }
  3866.     if {$fp != ""} {
  3867.         set frame $f 
  3868.         set cmd [list SaScreenPolicySet $client toolbarFrame $frame]
  3869.         ErrorCatch errorStack 1 $cmd dummy SCO_SA_TOOLBAR_ERR_BADSTORE
  3870.     }
  3871.     return 1
  3872. }
  3873. proc SaToolbarGetKeys {} {
  3874.     global SaTb_frame
  3875.     if {[VtInfo -charm]} {
  3876.         return ""
  3877.     }
  3878.     set toolbar [SaTb:GET $SaTb_frame toolbar]
  3879.     return [SaTb:GETKEYS $toolbar]
  3880. }
  3881. proc SaToolbarCustomized {} {
  3882.     global SaTb_modified_ever
  3883.     return $SaTb_modified_ever
  3884. }
  3885. proc SaToolbarCustomize {{cbs ""}} {
  3886.     global SaTb_icons SaTb_display SaTb_commands
  3887.     global SaTb_frame SaTb_visibility
  3888.     global SaTb_modified
  3889.     global SaTb_display_standard
  3890.     if {[VtInfo -charm]} {
  3891.         return
  3892.     }
  3893.     if {! $SaTb_visibility} then {
  3894.         return
  3895.     }
  3896.     set customizeCB [SaTb:GET $SaTb_frame toolbar_customizeCB]
  3897.     if {$customizeCB != ""} {
  3898.         $customizeCB 1 $cbs
  3899.     }
  3900.     set SaTb_modified 0
  3901.     VtLock
  3902.     SaTb:SaveButtonSensitivity 1
  3903.     set old_SaTb_display $SaTb_display
  3904.     set old_SaTb_frame [SaTb:GET $SaTb_frame SaTb_frame_type]
  3905.     set parent [SaTb:GET $SaTb_frame toolbar_parent]
  3906.     set custom [VtFormDialog $parent.custom \
  3907.         -cancel \
  3908.         -autoLock SaTb:CancelCustomCB \
  3909.         -cancelCallback "SaTb:CancelCustomCB \
  3910.                     [list $old_SaTb_display \
  3911.                         $old_SaTb_frame]" \
  3912.         -cancelButton CANCEL \
  3913.         -ok \
  3914.         -okCallback SaTb:CloseCustomCB \
  3915.         -help \
  3916.         -defaultButton OK \
  3917.         -title [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_CUSTOM] \
  3918.         -wmDecoration ALL]
  3919.     SaTb:SET $SaTb_frame custom $custom
  3920.     set button_frame [VtFrame $custom.button_frame \
  3921.         -topSide FORM \
  3922.         -bottomSide NONE \
  3923.         -leftSide NONE \
  3924.         -rightSide FORM \
  3925.         -topOffset 22 \
  3926.         -title [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_FORMAT] \
  3927.         -shadowType ETCHED_IN]
  3928.         set button_form [VtRowColumn $button_frame.button_form \
  3929.             -spacing 2 \
  3930.             -vertical]
  3931.             set toolbar_leftinsert_button [VtPushButton \
  3932.                 $button_form.toolbar_leftinsert_button \
  3933.                 -sensitive FALSE \
  3934.                 -labelCenter \
  3935.                 -label [IntlLocalizeMsg \
  3936.                         SCO_SA_TOOLBAR_MSG_BUTTONL] \
  3937.                 -callback "SaTb:ToolbarModifyButtonCB leftinsert" \
  3938.                 -autoLock SaTb:ToolbarModifyButtonCB]
  3939.             set toolbar_rightinsert_button [VtPushButton \
  3940.                 $button_form.toolbar_rightinsert_button \
  3941.                 -sensitive FALSE \
  3942.                 -labelCenter \
  3943.                 -label [IntlLocalizeMsg \
  3944.                         SCO_SA_TOOLBAR_MSG_BUTTONR] \
  3945.                 -callback "SaTb:ToolbarModifyButtonCB rightinsert" \
  3946.                 -autoLock SaTb:ToolbarModifyButtonCB]
  3947.             set toolbar_leftspace_button [VtPushButton \
  3948.                 $button_form.toolbar_leftspace_button \
  3949.                 -sensitive FALSE \
  3950.                 -labelCenter \
  3951.                 -label [IntlLocalizeMsg \
  3952.                         SCO_SA_TOOLBAR_MSG_SPACEL] \
  3953.                 -callback "SaTb:ToolbarModifyButtonCB leftspace" \
  3954.                 -autoLock SaTb:ToolbarModifyButtonCB]
  3955.             set toolbar_rightspace_button [VtPushButton \
  3956.                 $button_form.toolbar_rightspace_button \
  3957.                 -sensitive FALSE \
  3958.                 -labelCenter \
  3959.                 -label [IntlLocalizeMsg \
  3960.                         SCO_SA_TOOLBAR_MSG_SPACER] \
  3961.                 -callback "SaTb:ToolbarModifyButtonCB rightspace" \
  3962.                 -autoLock SaTb:ToolbarModifyButtonCB]
  3963.             set toolbar_delete_button [VtPushButton \
  3964.                 $button_form.toolbar_delete_button \
  3965.                 -sensitive FALSE \
  3966.                 -labelCenter \
  3967.                 -label [IntlLocalizeMsg \
  3968.                         SCO_SA_TOOLBAR_MSG_DELETE] \
  3969.                 -callback "SaTb:ToolbarModifyButtonCB delete" \
  3970.                 -autoLock SaTb:ToolbarModifyButtonCB]
  3971.             set toolbar_reset_button [VtPushButton \
  3972.                 $button_form.toolbar_reset_button \
  3973.                 -labelCenter \
  3974.                 -label  [IntlLocalizeMsg \
  3975.                         SCO_SA_TOOLBAR_MSG_STANDARD] \
  3976.                 -callback [list SaTb:ResetToolbarCB \
  3977.                         $SaTb_display_standard] \
  3978.                 -autoLock SaTb:ResetToolbarCB]
  3979.             set toolbar_border_button [VtPushButton \
  3980.                 $button_form.toolbar_border_button \
  3981.                 -labelCenter \
  3982.                 -label [IntlLocalizeMsg \
  3983.                         SCO_SA_TOOLBAR_MSG_BORDER] \
  3984.                 -callback SaTb:ToolbarBorderCB \
  3985.                 -autoLock SaTb:ToolbarBorderCB]
  3986.     set current_toolbar_label [VtLabel \
  3987.         $custom.current_toolbar_label \
  3988.         -topSide FORM \
  3989.         -bottomSide NONE \
  3990.         -leftSide FORM \
  3991.         -rightSide NONE \
  3992.         -topOffset 10 \
  3993.         -label [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_TOOLBAR]]
  3994.     SaTb:SET $custom current_toolbar_label $current_toolbar_label
  3995.     set current_toolbar_list [VtDrawnList \
  3996.         $custom.current_toolbar_list \
  3997.         -topSide $current_toolbar_label \
  3998.         -bottomSide NONE \
  3999.         -leftSide FORM \
  4000.         -rightSide $button_frame \
  4001.         -topOffset 0 \
  4002.         -rightOffset 20 \
  4003.         -rows 3 \
  4004.         -columns 25 \
  4005.         -selection SINGLE \
  4006.         -iconList $SaTb_icons \
  4007.         -callback "SaTb:ToolbarSelectButtonCB $custom"]
  4008.     SaTb:SET $custom current_toolbar_list $current_toolbar_list
  4009.     foreach i $SaTb_display {
  4010.         if {[lindex $i 1] == "S"} then {
  4011.             VtDrawnListAddItem $current_toolbar_list \
  4012.                 -formatList {{STRING 24}} \
  4013.                 -fieldList [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_SEP]
  4014.         } else {
  4015.             set pixmapi [lindex $i 0]
  4016.             set commandi [lindex $i 1]
  4017.             SaTb:GetButtonComponents pixmapi commandi \
  4018.                 pixmap command callback description
  4019.             if {[string match "NONE*" $command]} then {
  4020.                 set command "NONE"
  4021.             }
  4022.             set callback [lindex $i 2]
  4023.             set description [lindex $i 3]
  4024.             VtDrawnListAddItem $current_toolbar_list \
  4025.                 -formatList {{ICON 1 5 5} {STRING 40 10}} \
  4026.                 -fieldList "$pixmapi [list $command]"
  4027.         }
  4028.     }
  4029.     set toolbar_description_frame [VtFrame \
  4030.         $custom.toolbar_description_frame \
  4031.         -topSide NONE \
  4032.         -bottomSide FORM \
  4033.         -leftSide FORM \
  4034.         -rightSide FORM \
  4035.         -title [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_DESC] \
  4036.         -shadowType ETCHED_IN]
  4037.     VtSetValues $button_frame -bottomSide $toolbar_description_frame 
  4038.     set toolbar_descriptions [VtLabel \
  4039.         $toolbar_description_frame.toolbar_descriptions \
  4040.         -labelLeft \
  4041.         -label " "]
  4042.     set toolbar_buttons_label [VtLabel $custom.toolbar_buttons_label \
  4043.         -topSide $current_toolbar_list \
  4044.         -bottomSide NONE \
  4045.         -leftSide FORM \
  4046.         -rightSide NONE \
  4047.         -topOffset 15 \
  4048.         -sensitive FALSE \
  4049.         -label [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_ICONS ]]
  4050.     set toolbar_icon_list [VtDrawnList $custom.toolbar_icon_list \
  4051.         -topSide $toolbar_buttons_label \
  4052.         -bottomSide $toolbar_description_frame \
  4053.         -leftSide FORM \
  4054.         -rightSide NONE \
  4055.         -topOffset 0 \
  4056.         -bottomOffset 15 \
  4057.         -rows 5 \
  4058.         -columns 5 \
  4059.         -selection SINGLE \
  4060.         -formatList {{ICON 1 5 5}} \
  4061.         -sensitive FALSE \
  4062.         -iconList $SaTb_icons \
  4063.         -callback "SaTb:ChangeButtonCB $custom"]
  4064.     set i 0
  4065.     while {$i < [llength $SaTb_icons]} {
  4066.         VtDrawnListAddItem $toolbar_icon_list \
  4067.             -fieldList $i
  4068.         incr i
  4069.     }
  4070.     set toolbar_command_list [VtDrawnList $custom.toolbar_command_list \
  4071.         -rows 5 \
  4072.         -topSide NONE \
  4073.         -leftSide $toolbar_icon_list \
  4074.         -rightSide NONE \
  4075.         -alignTop $toolbar_icon_list \
  4076.         -alignBottom $toolbar_icon_list \
  4077.         -alignRight $current_toolbar_list \
  4078.         -leftOffset 15 \
  4079.         -selection SINGLE \
  4080.         -formatList {{STRING 1} {STRING 25}} \
  4081.         -sensitive FALSE \
  4082.         -callback "SaTb:ChangeButtonCB $custom"]
  4083.     set toolbar_command_label [VtLabel $custom.toolbar_command_label \
  4084.         -topSide NONE \
  4085.         -bottomSide $toolbar_command_list \
  4086.         -leftSide NONE \
  4087.         -rightSide NONE \
  4088.         -alignLeft $toolbar_command_list \
  4089.         -bottomOffset 0 \
  4090.         -sensitive FALSE \
  4091.         -label [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_COMMANDS]] 
  4092.     foreach i $SaTb_commands {
  4093.         VtDrawnListAddItem $toolbar_command_list \
  4094.             -fieldList [list " " [lindex $i 0]]
  4095.     }
  4096.     VtDrawnListAddItem $toolbar_command_list -fieldList [list " " NULL]
  4097.     SaTb:SET $custom toolbar_leftspace_button $toolbar_leftspace_button
  4098.     SaTb:SET $custom toolbar_rightspace_button $toolbar_rightspace_button
  4099.     SaTb:SET $custom toolbar_leftinsert_button $toolbar_leftinsert_button
  4100.     SaTb:SET $custom toolbar_rightinsert_button $toolbar_rightinsert_button
  4101.     SaTb:SET $custom toolbar_delete_button $toolbar_delete_button
  4102.     SaTb:SET $custom toolbar_reset_button $toolbar_reset_button
  4103.     SaTb:SET $custom toolbar_buttons_label $toolbar_buttons_label
  4104.     SaTb:SET $custom toolbar_icon_list $toolbar_icon_list
  4105.     SaTb:SET $custom toolbar_command_list $toolbar_command_list
  4106.     SaTb:SET $custom toolbar_command_label $toolbar_command_label
  4107.     SaTb:SET $custom toolbar_descriptions $toolbar_descriptions
  4108. SaTb:CustomizeSelectButton 1 
  4109.     VtShow $custom
  4110.     VtUnLock
  4111. }
  4112. proc SaToolbarSetBorder {frame} {
  4113.     global SaTb_frame
  4114.     global SaTb_modified
  4115.     incr SaTb_modified
  4116.     if {[VtInfo -charm]} {
  4117.         return
  4118.     }
  4119.     if {$frame != "NONE"} then {
  4120.         VtSetValues $SaTb_frame \
  4121.             -shadowType $frame
  4122.     } else {
  4123.     }
  4124.     SaTb:SET $SaTb_frame SaTb_frame_type $frame
  4125. }
  4126. proc SaTb:InternalKey {key} {
  4127.     if {[string match "NULL*" $key]} {
  4128.         return 1
  4129.     }
  4130.     case $key in {
  4131.         {Dummy} {
  4132.             return 1
  4133.         }
  4134.     }
  4135.     return 0
  4136. }
  4137. proc SaTb:SaveButtonSensitivity {state} {
  4138.     global SaTb_frame old_sensitivity
  4139.     if {[info exists old_sensitivity]} {
  4140.         unset old_sensitivity
  4141.     }
  4142.     set toolbar [SaTb:GET $SaTb_frame toolbar]
  4143.     set keys [SaToolbarGetKeys]
  4144.     foreach key $keys {
  4145.         if {[SaTb:InternalKey $key]} {
  4146.             continue
  4147.         }
  4148.         set widget [SaTb:GET $toolbar $key]
  4149.         lappend old_sensitivity [list $key [SaTb:GET $widget state]]
  4150.         VtSetSensitive $widget $state
  4151.     }
  4152. }
  4153. proc SaTb:RestoreButtonSensitivity {} {
  4154.     global SaTb_frame old_sensitivity
  4155.     if {![info exists old_sensitivity]} {
  4156.         return
  4157.     }
  4158.     set toolbar [SaTb:GET $SaTb_frame toolbar]
  4159.     set keys [SaToolbarGetKeys]
  4160.     foreach record $old_sensitivity {
  4161.         set okey [lindex $record 0]
  4162.         set index [lsearch $keys $okey]
  4163.         if {$index != -1} {
  4164.             set key [lindex $keys $index]
  4165.             set state [lindex $record 1]
  4166.             set widget [SaTb:GET $toolbar $key]
  4167.             VtSetSensitive $widget $state
  4168.             SaTb:SET $widget state $state
  4169.             set keys [lreplace $keys $index $index]
  4170.         }
  4171.     }
  4172.     set keys2 ""
  4173.     foreach key $keys {
  4174.         if {![SaTb:InternalKey $key]} {
  4175.             lappend keys2 $key
  4176.         }
  4177.     }
  4178.     set keys $keys2
  4179.     if {![lempty $keys]} {
  4180.         set sensitizeCB [SaTb:GET $SaTb_frame toolbar_sensitizeCB]
  4181.         if {![lempty $sensitizeCB]} {
  4182.             $sensitizeCB $keys {} 
  4183.         }
  4184.     }
  4185. }
  4186. proc SaTb:ToolbarBorderCB {cbs} {
  4187.     global SaTb_frame 
  4188.     set current_frame [SaTb:GET $SaTb_frame SaTb_frame_type]
  4189.     case $current_frame in {
  4190.         IN {set frame OUT}
  4191.         OUT {set frame ETCHED_IN}
  4192.         ETCHED_IN {set frame ETCHED_OUT}
  4193.         ETCHED_OUT {set frame NONE}
  4194.         NONE {set frame IN}
  4195.     }
  4196.     SaToolbarSetBorder $frame
  4197.     VtUnLock
  4198. }
  4199. proc SaTb:ToolbarSelectButtonCB {custom cbs} {
  4200.     global SaTb_display SaTb_frame SaTb_commands
  4201.     global SaTb_nullShortHelp
  4202.     set toolbar [SaTb:GET $SaTb_frame toolbar]
  4203.     set current_toolbar_list [SaTb:GET $custom current_toolbar_list]
  4204.     set toolbar_icon_list [SaTb:GET $custom toolbar_icon_list]
  4205.     set toolbar_command_list [SaTb:GET $custom toolbar_command_list]
  4206.     set toolbar_descriptions [SaTb:GET $custom toolbar_descriptions]
  4207.     set record [lindex [VtDrawnListGetSelectedItem \
  4208.         $current_toolbar_list -byRecordList] 0]
  4209.     set position [lindex [VtDrawnListGetSelectedItem \
  4210.         $current_toolbar_list -byPositionList] 0]
  4211.     if {[lempty $record]} {
  4212.         foreach i {toolbar_delete_button \
  4213.                 toolbar_leftspace_button \
  4214.                 toolbar_rightspace_button \
  4215.                 toolbar_rightinsert_button \
  4216.                 toolbar_buttons_label \
  4217.                 toolbar_icon_list \
  4218.                 toolbar_command_label \
  4219.                 toolbar_command_list} {
  4220.             VtSetSensitive [SaTb:GET $custom $i] 0
  4221.         }
  4222.         foreach i {toolbar_buttons_label \
  4223.                 toolbar_icon_list \
  4224.                 toolbar_command_label \
  4225.                 toolbar_command_list} {
  4226.             VtSetSensitive [SaTb:GET $custom $i] 0
  4227.         }
  4228.         VtSetValues $toolbar_descriptions \
  4229.             -label " "
  4230.         return
  4231.     }
  4232.     if {[llength $record] != 1} then {
  4233.         foreach i {toolbar_delete_button \
  4234.                 toolbar_leftspace_button \
  4235.                 toolbar_rightspace_button \
  4236.                 toolbar_leftinsert_button \
  4237.                 toolbar_rightinsert_button \
  4238.                 toolbar_buttons_label \
  4239.                 toolbar_icon_list \
  4240.                 toolbar_command_label \
  4241.                 toolbar_command_list} {
  4242.             VtSetSensitive [SaTb:GET $custom $i] 1
  4243.         }
  4244.         set ci [lindex [lindex $SaTb_display \
  4245.                     [expr {$position - 1}]] 1]
  4246.         if {$ci < 0} {
  4247.             set button NULL[expr "$ci*-1"]
  4248.             set text $SaTb_nullShortHelp
  4249.         } else {
  4250.             set SaTb_display_rec [lindex $SaTb_commands $ci] 
  4251.             set button [lindex $SaTb_display_rec 0]
  4252.             set text [lindex $SaTb_display_rec 2]
  4253.         }
  4254.         set button [SaTb:GET $toolbar $button] 
  4255.         VtDrawnListSelectItem $toolbar_icon_list \
  4256.             -field 0 [lindex $record 0]
  4257.         SaDrawnListShowSelectedItem $toolbar_icon_list
  4258.         set command [lindex $record 1]
  4259.         if {[string match "NULL*" $command]} then {
  4260.             set command "NULL"
  4261.         }
  4262.         VtDrawnListSelectItem $toolbar_command_list \
  4263.             -field 1 $command
  4264.         SaDrawnListShowSelectedItem $toolbar_command_list
  4265.         VtSetValues $toolbar_descriptions \
  4266.             -label $text 
  4267.     } else {
  4268.         VtDrawnListDeselectItem $toolbar_icon_list -all
  4269.         VtDrawnListDeselectItem $toolbar_command_list -all
  4270.         foreach i {toolbar_delete_button \
  4271.                 toolbar_leftspace_button \
  4272.                 toolbar_rightspace_button \
  4273.                 toolbar_leftinsert_button \
  4274.                 toolbar_rightinsert_button} {
  4275.             VtSetSensitive [SaTb:GET $custom $i] 1
  4276.         }
  4277.         foreach i {toolbar_buttons_label \
  4278.                 toolbar_icon_list \
  4279.                 toolbar_command_label \
  4280.                 toolbar_command_list} {
  4281.             VtSetSensitive [SaTb:GET $custom $i] 0
  4282.         }
  4283.         VtSetValues $toolbar_descriptions \
  4284.             -label [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_SEP_DESC] 
  4285.     }
  4286. }
  4287. proc SaTb:PositionToKey {pos} {
  4288.     global SaTb_display
  4289.     global SaTb_commands
  4290.     set ci [lindex [lindex $SaTb_display $pos] 1]
  4291.     if {$ci == ""} {  
  4292.         return "Dummy"
  4293.     }
  4294.     if { $ci == "S" } {
  4295.         return $ci 
  4296.     }
  4297.     if {$ci < 0} {
  4298.         return NULL[expr {$ci * -1} ]
  4299.     } else {
  4300.         return [lindex [lindex $SaTb_commands $ci] 0]
  4301.     }
  4302. }
  4303. proc SaTb:GetNeighbours {position} {
  4304.     global SaTb_display SaTb_frame SaTb_commands
  4305.     set toolbar [SaTb:GET $SaTb_frame toolbar]
  4306.     set Lsep 0
  4307.     set Rsep 0
  4308.     set Lwidget ""
  4309.     set Rwidget ""
  4310.     set widget [SaTb:PositionToKey $position]
  4311.     set count [expr {$position - 1}]
  4312.     while {$count >= 0} {
  4313.         set record [lindex [lindex $SaTb_display $count] 1]
  4314.         if {$record == "S"} then {
  4315.             incr Lsep 15
  4316.         } else {
  4317.             set Lwidget [SaTb:PositionToKey $count] 
  4318.             break
  4319.         }
  4320.         incr count -1
  4321.     }
  4322.     if {$Lwidget == ""} then {
  4323.         set Lwidget "FORM"
  4324.     }
  4325.     set count [expr {$position + 1}]
  4326.     while {$count <= [llength $SaTb_display]} {
  4327.         set record [lindex [lindex $SaTb_display $count] 1]
  4328.         if {$record == "S"} then {
  4329.             incr Rsep 15
  4330.         } else {
  4331.             set Rwidget [SaTb:PositionToKey $count] 
  4332.             break
  4333.         }
  4334.         incr count
  4335.     }
  4336.     if {$Rwidget == ""} then {
  4337.         set Rwidget "Dummy"
  4338.     }
  4339.     return [list \
  4340.         [expr {($widget == "S")? \
  4341.             $widget : [SaTb:GET $toolbar $widget]}] \
  4342.         [expr {($Lwidget == "FORM")? \
  4343.             $Lwidget : [SaTb:GET $toolbar $Lwidget]}] \
  4344.         [SaTb:GET $toolbar $Rwidget] \
  4345.         $Lsep \
  4346.         $Rsep]
  4347. }
  4348. proc SaTb:CustomizeSelectButton {position} {
  4349.         global SaTb_frame
  4350.         set custom [SaTb:GET $SaTb_frame custom]
  4351.         set current_toolbar_list [SaTb:GET $custom current_toolbar_list]
  4352.         set max [llength [VtDrawnListGetItem $current_toolbar_list -all]]
  4353.         if {$position > $max} {
  4354.             set position $max
  4355.         }
  4356.         if {$position} {
  4357.             VtDrawnListSelectItem $current_toolbar_list  -position $position
  4358.         }
  4359.         SaTb:ToolbarSelectButtonCB $custom ""
  4360. }
  4361. proc SaTb:ToolbarModifyButtonCB {modification cbs} {
  4362.     global SaTb_display SaTb_icons SaTb_commands SaTb_frame
  4363.     global SaTb_frame
  4364.     global SaTb_modified 
  4365.     global SaTb_nullShortHelp SaTb_nullIcon SaTb_nullIconIndex
  4366.     incr SaTb_modified 
  4367.     set toolbar [SaTb:GET $SaTb_frame toolbar]
  4368.     set custom [keylget cbs dialog]
  4369.     set current_toolbar_list [SaTb:GET $custom current_toolbar_list]
  4370.     set toolbar_icon_list [SaTb:GET $custom toolbar_icon_list]
  4371.     set toolbar_command_list [SaTb:GET $custom toolbar_command_list]
  4372.     set shorthelp [SaTb:GET $SaTb_frame toolbar_shorthelp]
  4373.     set record [lindex [VtDrawnListGetSelectedItem $current_toolbar_list \
  4374.         -byRecordList] 0]
  4375.     if {$record == ""} then {
  4376.         set position 1    
  4377.     } else {
  4378.         set position [lindex [VtDrawnListGetSelectedItem $current_toolbar_list \
  4379.                 -byPositionList] 0]
  4380.     }
  4381.     set neighbours [SaTb:GetNeighbours [expr {$position - 1}]]
  4382.     case $modification in {
  4383.         leftinsert {
  4384.             if {[lindex $neighbours 0] == "S"} then {
  4385.                 set nextbutton [lindex $neighbours 2]
  4386.                 set space [expr {[lindex $neighbours 4] + 15}]
  4387.             } else {
  4388.                 set nextbutton [lindex $neighbours 0]
  4389.                 set space 0
  4390.             }
  4391.             set unique [SaTb:GetUnique]
  4392.             set command NULL$unique
  4393.             set callback SaToolbarDummyCB 
  4394.             set desc_text $SaTb_nullShortHelp 
  4395.             set button [VtPushButton \
  4396.                 [SaTb:GET $SaTb_frame toolbar].$command \
  4397.                 -topSide FORM \
  4398.                 -leftSide [lindex $neighbours 1] \
  4399.                 -leftOffset [lindex $neighbours 3] \
  4400.                 -pixmap $SaTb_nullIcon \
  4401.                 -callback $callback \
  4402.                 -autoLock [lindex $callback 0] \
  4403.                 -shortHelpCallback $shorthelp \
  4404.                 -shortHelpString $desc_text \
  4405.                 -hidden 1 \
  4406.                 -xmArgs {XmNhighlightThickness 0 \
  4407.                      XmNmarginHeight 1 \
  4408.                      XmNmarginWidth 1}]
  4409.             VtShow $button
  4410.             SaTb:SET $toolbar $command $button
  4411.             VtSetValues $nextbutton \
  4412.                 -leftSide $button \
  4413.                 -leftOffset $space
  4414.             set SaTb_display [linsert $SaTb_display \
  4415.                 [expr {$position - 1}] \
  4416.                 [list $SaTb_nullIconIndex \
  4417.                     [expr {$unique * -1}]]]
  4418.             VtDrawnListAddItem $current_toolbar_list \
  4419.                 -position $position \
  4420.                 -formatList {{ICON 1 5 5} {STRING 40 10}} \
  4421.                 -fieldList "$SaTb_nullIconIndex $command"
  4422.             VtDrawnListSelectItem $current_toolbar_list \
  4423.                 -position $position
  4424.             SaDrawnListShowSelectedItem $current_toolbar_list
  4425.             SaTb:ToolbarSelectButtonCB \
  4426.                 $custom {from SaTb:ToolbarModifyButtonCB}
  4427.         }
  4428.         rightinsert {
  4429.             if {[lindex $neighbours 0] == "S"} then {
  4430.                 set nextbutton [lindex $neighbours 1]
  4431.                 set space [expr {[lindex $neighbours 3] + 15}]
  4432.             } else {
  4433.                 set nextbutton [lindex $neighbours 0]
  4434.                 set space 0
  4435.             }
  4436.             set unique [SaTb:GetUnique]
  4437.             set command NULL$unique
  4438.             set callback SaToolbarDummyCB 
  4439.             set desc_text $SaTb_nullShortHelp 
  4440.             set button [VtPushButton \
  4441.                 [SaTb:GET $SaTb_frame toolbar].NULL$unique \
  4442.                 -topSide FORM \
  4443.                 -leftSide $nextbutton \
  4444.                 -leftOffset $space \
  4445.                 -pixmap $SaTb_nullIcon \
  4446.                 -callback $callback \
  4447.                 -autoLock [lindex $callback 0] \
  4448.                 -shortHelpCallback $shorthelp \
  4449.                 -shortHelpString $desc_text \
  4450.                 -hidden 1 \
  4451.                 -xmArgs {XmNhighlightThickness 0 \
  4452.                      XmNmarginHeight 1 \
  4453.                      XmNmarginWidth 1}]
  4454.             VtShow $button
  4455.             SaTb:SET $toolbar NULL$unique $button
  4456.             VtSetValues [lindex $neighbours 2] \
  4457.                 -leftSide $button \
  4458.                 -leftOffset [lindex $neighbours 4]
  4459.             set SaTb_display [linsert $SaTb_display \
  4460.                 $position \
  4461.                 [list $SaTb_nullIconIndex \
  4462.                     [expr {$unique * -1}]]]
  4463.             VtDrawnListAddItem $current_toolbar_list \
  4464.                 -position [expr {$position + 1}] \
  4465.                 -formatList {{ICON 1 5 5} {STRING 40 10}} \
  4466.                 -fieldList "$SaTb_nullIconIndex $command"
  4467.             VtDrawnListSelectItem $current_toolbar_list \
  4468.                 -position [expr {$position + 1}]
  4469.             SaDrawnListShowSelectedItem $current_toolbar_list
  4470.             SaTb:ToolbarSelectButtonCB $custom \
  4471.                 {from SaTb:ToolbarModifyButtonCB}
  4472.         }
  4473.         delete {
  4474.             if {[lindex $neighbours 0] != "S"} then {
  4475.                 SaTb:UNSET $toolbar \
  4476.                     [SaTb:PositionToKey [expr {$position - 1}]]
  4477.                 VtDestroy [lindex $neighbours 0]
  4478.             }
  4479.             VtSetValues [lindex $neighbours 2] \
  4480.                 -leftSide [lindex $neighbours 1] \
  4481.                 -leftOffset [expr {[lindex $neighbours 3] + \
  4482.                     [lindex $neighbours 4]}]
  4483.             set SaTb_display [lreplace $SaTb_display \
  4484.                 [expr {$position - 1}] [expr {$position - 1}]]
  4485.             VtDrawnListDeleteItem $current_toolbar_list \
  4486.                 -position $position
  4487.             VtDrawnListDeselectItem $toolbar_icon_list -all
  4488.             VtDrawnListDeselectItem $toolbar_command_list -all
  4489.             SaTb:CustomizeSelectButton $position
  4490.         }
  4491.         leftspace {
  4492.             if {[lindex $neighbours 0] == "S"} then {
  4493.                 set nextbutton [lindex $neighbours 2]
  4494.                 set space [expr {[lindex $neighbours 4] + 30}]
  4495.             } else {
  4496.                 set nextbutton [lindex $neighbours 0]
  4497.                 set space 15
  4498.             }
  4499.             VtSetValues $nextbutton \
  4500.                 -leftSide [lindex $neighbours 1] \
  4501.                 -leftOffset [expr {[lindex $neighbours 3] + \
  4502.                     $space}]
  4503.             set SaTb_display [linsert $SaTb_display \
  4504.                 [expr {$position - 1}] {{} S}]
  4505.             VtDrawnListAddItem $current_toolbar_list \
  4506.                 -position $position \
  4507.                 -formatList {{STRING 24}} \
  4508.                 -fieldList  [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_SEP]
  4509.         }
  4510.         rightspace {
  4511.             if {[lindex $neighbours 0] == "S"} then {
  4512.                 set nextbutton [lindex $neighbours 1]
  4513.                 set space [expr {[lindex $neighbours 3] + 30}]
  4514.             } else {
  4515.                 set nextbutton [lindex $neighbours 0]
  4516.                 set space 15
  4517.             }
  4518.             VtSetValues [lindex $neighbours 2] \
  4519.                 -leftSide $nextbutton \
  4520.                 -leftOffset [expr {[lindex $neighbours 4] + \
  4521.                     $space}]
  4522.             set SaTb_display [linsert $SaTb_display \
  4523.                 $position {{} S}]
  4524.             VtDrawnListAddItem $current_toolbar_list \
  4525.                 -position [expr {$position + 1}] \
  4526.                 -formatList {{STRING 24}} \
  4527.                 -fieldList [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_SEP]
  4528.         }
  4529.     }
  4530.     VtUnLock
  4531. }
  4532. proc SaTb:GetUnique {} {
  4533.     global SaTb_display
  4534.     set keys [SaToolbarGetKeys]
  4535.     set unique 1
  4536.     while {$unique} {
  4537.         set ok 1
  4538.         foreach i $keys {
  4539.             if {$i == "NULL$unique"} {
  4540.                 incr unique
  4541.                 set ok 0
  4542.                 break
  4543.             }
  4544.         }
  4545.         if {$ok} {
  4546.             break
  4547.         }
  4548.     }
  4549.     return $unique
  4550. }
  4551. proc SaTb:ChangeButtonCB {custom cbs} {
  4552.     global SaTb_icons SaTb_display SaTb_commands SaTb_frame
  4553.     global SaTb_frame
  4554.     global SaTb_modified
  4555.     global SaTb_nullShortHelp SaTb_nullIcon
  4556.     incr SaTb_modified
  4557.     set toolbar [SaTb:GET $SaTb_frame toolbar]
  4558.     set current_toolbar_list [SaTb:GET $custom current_toolbar_list]
  4559.     set toolbar_icon_list [SaTb:GET $custom toolbar_icon_list]
  4560.     set toolbar_command_list [SaTb:GET $custom toolbar_command_list]
  4561.     set toolbar_descriptions [SaTb:GET $custom toolbar_descriptions]
  4562.     set shorthelp [SaTb:GET $SaTb_frame toolbar_shorthelp]
  4563.     set record [lindex [VtDrawnListGetSelectedItem $current_toolbar_list \
  4564.         -byRecordList] 0]
  4565.     set position [lindex [VtDrawnListGetSelectedItem $current_toolbar_list \
  4566.         -byPositionList] 0]
  4567.     set icon [VtDrawnListGetSelectedItem $toolbar_icon_list \
  4568.         -byRecordList]
  4569.     set command_pos [VtDrawnListGetSelectedItem $toolbar_command_list \
  4570.         -byPositionList]
  4571.     set command [VtDrawnListGetSelectedItem $toolbar_command_list -byRecordList]
  4572.     set command [lindex $command 0]
  4573.     set command [lindex $command 1]
  4574.     set command_pos [expr {$command_pos - 1}]
  4575.     if {$command == "NULL"} then {
  4576.         set unique [SaTb:GetUnique]
  4577.         set command "NULL$unique"
  4578.         set command_pos -$unique
  4579.         set callback SaToolbarDummyCB
  4580.         set description $SaTb_nullShortHelp
  4581.         set pixmap [lindex $SaTb_icons $icon]
  4582.     } else {
  4583.         SaTb:GetButtonComponents icon command_pos \
  4584.             pixmap command callback description
  4585.     }
  4586.     if {$command != [lindex $record 1]} then {
  4587.         foreach i $SaTb_display {
  4588.             set ci [lindex $i 1]
  4589.             if {$ci == "S"} {
  4590.                 continue
  4591.             }
  4592.             if {$ci < 0} {
  4593.                 continue
  4594.             }
  4595.             set i [lindex $SaTb_commands $ci]
  4596.             if {[lindex $i 0] == $command} then {
  4597.                 SaTb:Error $custom [IntlLocalizeMsg \
  4598.                     SCO_SA_TOOLBAR_ERR_DUPCOMMAND \
  4599.                     [list $command]]
  4600.                 incr SaTb_modified -1
  4601.                 VtUnLock
  4602.                 return
  4603.             }
  4604.         }
  4605.     }
  4606.     set neighbours [SaTb:GetNeighbours [expr {$position - 1}]]
  4607.     VtDestroy [lindex $neighbours 0]
  4608.     set button [VtPushButton [SaTb:GET $SaTb_frame toolbar].$command \
  4609.         -topSide FORM \
  4610.         -leftSide [lindex $neighbours 1] \
  4611.         -leftOffset [lindex $neighbours 3] \
  4612.         -pixmap $pixmap \
  4613.         -callback $callback \
  4614.         -autoLock [lindex $callback 0] \
  4615.         -shortHelpCallback $shorthelp \
  4616.         -shortHelpString $description \
  4617.         -hidden 1 \
  4618.         -xmArgs {XmNhighlightThickness 0 \
  4619.              XmNmarginHeight 1 \
  4620.              XmNmarginWidth 1}]
  4621.     VtShow $button
  4622.     VtSetValues [lindex $neighbours 2] \
  4623.         -leftSide $button \
  4624.         -leftOffset [lindex $neighbours 4]
  4625.     SaTb:UNSET $toolbar [SaTb:PositionToKey [expr {$position - 1}]]
  4626.     SaTb:SET $toolbar $command $button
  4627.     SaTb:SET $button state 1
  4628.     set SaTb_display [lreplace $SaTb_display \
  4629.         [expr {$position - 1}] [expr {$position - 1}] \
  4630.         [list $icon $command_pos]]
  4631.     VtDrawnListSetItem [SaTb:GET $custom current_toolbar_list] \
  4632.         -position $position \
  4633.         -formatList {{ICON 1 5 5} {STRING 40 10}} \
  4634.         -fieldList "$icon [list $command]"
  4635.     VtSetValues $toolbar_descriptions \
  4636.         -label $description
  4637.     VtUnLock
  4638. }
  4639. proc SaTb:CancelCustomCB {old_SaTb_display old_toolbar_border cbs} {
  4640.     global SaTb_frame SaTb_modified
  4641.     if {$SaTb_modified} {
  4642.         SaTb:ResetToolbarCB $old_SaTb_display $cbs
  4643.         SaToolbarSetBorder $old_toolbar_border
  4644.     }
  4645.     VtDestroyDialog [keylget cbs dialog]
  4646.     SaTb:RestoreButtonSensitivity
  4647.     set SaTb_modified 0
  4648.     set customizeCB [SaTb:GET $SaTb_frame toolbar_customizeCB]
  4649.     if {$customizeCB != ""} {
  4650.         $customizeCB 0 $cbs
  4651.     }
  4652.     VtUnLock
  4653. }
  4654. proc SaTb:ResetToolbarCB {old_SaTb_display cbs} {
  4655.     global SaTb_display SaTb_frame
  4656.     global SaTb_frame SaTb_visibility
  4657.     global SaTb_modified
  4658.     incr SaTb_modified
  4659.     VtLock
  4660.     set custom [keylget cbs dialog]
  4661.     set toolbar [SaTb:GET $SaTb_frame toolbar]
  4662.     set current_toolbar_list [SaTb:GET $custom current_toolbar_list]
  4663.     set toolbar_icon_list [SaTb:GET $custom toolbar_icon_list]
  4664.     set toolbar_command_list [SaTb:GET $custom toolbar_command_list]
  4665.     set toolbar_descriptions [SaTb:GET $custom toolbar_descriptions]
  4666.     set SaTb_display $old_SaTb_display
  4667.     set toolbar [SaToolbar {} {} {} {} {} {} {} {} {} {} {} 1]
  4668.     VtDrawnListDeleteItem $current_toolbar_list \
  4669.         -all
  4670.     foreach i $SaTb_display {
  4671.         if {[lindex $i 1] == "S"} then {
  4672.             VtDrawnListAddItem $current_toolbar_list \
  4673.                 -formatList {{STRING 24}} \
  4674.                 -fieldList [IntlLocalizeMsg SCO_SA_TOOLBAR_MSG_SEP]
  4675.         } else {
  4676.             set pixmapi [lindex $i 0]
  4677.             set commandi [lindex $i 1]
  4678.             SaTb:GetButtonComponents pixmapi commandi \
  4679.                 pixmap command callback desc_text
  4680.             VtDrawnListAddItem $current_toolbar_list \
  4681.                 -formatList {{ICON 1 5 5} {STRING 40 10}} \
  4682.                 -fieldList "$pixmapi [list $command]"
  4683.         }
  4684.     }
  4685.     SaTb:CustomizeSelectButton 1 
  4686.     VtUnLock
  4687. }
  4688. proc SaTb:ToolBarConvertOut {toolbar} {
  4689.     global set SaTb_nullIconIndex
  4690.     set toolbarOut ""
  4691.     foreach button $toolbar {
  4692.         set ii [lindex $button 0]
  4693.         set ci [lindex $button 1]
  4694.         if {$ii == $SaTb_nullIconIndex} {
  4695.             set ii -1 
  4696.         }
  4697.         if {$ci < 0} {
  4698.             set ci -1 
  4699.         }
  4700.         lappend toolbarOut [list $ii $ci] 
  4701.     }
  4702.     return $toolbarOut
  4703. }
  4704. proc SaTb:ToolbarConvertIn {toolbar} {
  4705.     global SaTb_nullIconIndex 
  4706.     global SaTb_nullCommandIndex SaTb_nullCommandIndexNext
  4707.     set toolbarIn ""
  4708.     set clist ""
  4709.     set SaTb_nullCommandIndexNext -1
  4710.     foreach button $toolbar {
  4711.         set ii [lindex $button 0]
  4712.         set ci [lindex $button 1]
  4713.         if {$ci != "S"} {
  4714.             if {$ci <= -1 || $ci >= $SaTb_nullCommandIndex} {
  4715.                 if {$ci != -1} {
  4716.                     puts stderr [IntlLocalizeMsg SCO_SA_TOOLBAR_ERR_BADCOMMAND \
  4717.                         [list $ci]]
  4718.                 }
  4719.                 set ci $SaTb_nullCommandIndexNext
  4720.                 incr SaTb_nullCommandIndexNext -1
  4721.             }
  4722.             if {$ci >= 0 } {
  4723.                 if {[lsearch $clist $ci] >= 0} {
  4724.                     puts stderr [IntlLocalizeMsg SCO_SA_TOOLBAR_ERR_DUPINDEX \
  4725.                         [list $ci]]
  4726.                     set ci $SaTb_nullCommandIndexNext
  4727.                     incr SaTb_nullCommandIndexNext -1
  4728.                 } else {
  4729.                     lappend clist $ci
  4730.                 }
  4731.             }
  4732.             if {$ii == "" || $ii <= -1 || $ii >= $SaTb_nullIconIndex } {
  4733.                 if {$ii != -1} {
  4734.                     puts stderr [IntlLocalizeMsg SCO_SA_TOOLBAR_ERR_BADICON \
  4735.                         [list $ii]]
  4736.                 }
  4737.                 set ii $SaTb_nullIconIndex
  4738.             }
  4739.         }
  4740.         lappend toolbarIn [list $ii $ci] 
  4741.     }
  4742.     return $toolbarIn
  4743. }
  4744. proc SaTb:GetButtonComponents {iip cip iconp commandp callbackp textp} {
  4745.     upvar $iip ii
  4746.     upvar $cip ci
  4747.     upvar $iconp icon
  4748.     upvar $commandp command
  4749.     upvar $callbackp callback
  4750.     upvar $textp text
  4751.     global SaTb_nullShortHelp SaTb_nullIcon
  4752.     global SaTb_icons SaTb_commands
  4753.     set icon [lindex $SaTb_icons $ii]
  4754.     if {$ci < 0} {
  4755.         set command NULL[expr {$ci * -1}]
  4756.         set callback SaToolbarDummyCB
  4757.         set text $SaTb_nullShortHelp
  4758.     } else {
  4759.         set record [lindex $SaTb_commands $ci]
  4760.         set command [lindex $record 0]
  4761.         set callback [lindex $record 1]
  4762.         set text [lindex $record 2]
  4763.     }
  4764. }
  4765. proc SaToolbarDummyCB {cbs} {
  4766.     set form [keylget cbs dialog]
  4767.     set message [VtMessageDialog $form.popupmessagebox \
  4768.         -ok \
  4769.         -defaultButton OK \
  4770.         -message [IntlLocalizeMsg SCO_SA_TOOLBAR_ERR_NOCOMMAND]]
  4771.     VtShowDialog $message
  4772.     VtUnLock
  4773. }
  4774. proc SaTb:CloseCustomCB {cbs} {
  4775.     global SaTb_frame
  4776.     global SaTb_modified SaTb_modified_ever
  4777.     set custom [SaTb:GET $SaTb_frame custom]
  4778.     set current_toolbar_list [SaTb:GET $custom current_toolbar_list]
  4779.     set list  [VtDrawnListGetItem $current_toolbar_list -all]
  4780.     if {[lempty $list]} {
  4781.         set form [keylget cbs dialog]
  4782.         set message [VtErrorDialog $form.popupmessagebox \
  4783.             -ok \
  4784.             -defaultButton OK \
  4785.             -message [IntlLocalizeMsg SCO_SA_TOOLBAR_ERR_NOBUTTONS]]
  4786.         VtShowDialog $message
  4787.         return
  4788.     }
  4789.     if {$SaTb_modified} {
  4790.         incr SaTb_modified_ever
  4791.     }
  4792.     VtDestroyDialog [keylget cbs dialog]
  4793.     SaTb:RestoreButtonSensitivity
  4794.     set customizeCB [SaTb:GET $SaTb_frame toolbar_customizeCB]
  4795.     if {$customizeCB != ""} {
  4796.         $customizeCB 0 $cbs
  4797.     }
  4798. }
  4799. proc SaTb:ShowToolbarCB {cbs} {
  4800.     SaToolbarSetVisibility [keylget cbs set]
  4801. }
  4802. proc SaTb:SET {klist element value} {
  4803.     eval "global $klist"
  4804.     keylset $klist $element $value
  4805. SaTb:GET $klist $element
  4806. }
  4807. proc SaTb:UNSET {klist element} {
  4808.     eval "global $klist"
  4809.     keyldel $klist $element
  4810. }
  4811. proc SaTb:GET {klist element} {
  4812.     eval "global $klist"
  4813.     set ret [catch {set value [keylget $klist $element]} res]
  4814.     if {$ret != 0} then {
  4815.             echo "Bug: $element not found in keyed list - $klist"
  4816.         return "ERROR"
  4817.     }
  4818.     return $value
  4819. }
  4820. proc SaTb:GETKEYS {klist} {
  4821.     eval "global $klist"
  4822.     return [keylkeys $klist]
  4823. }
  4824. proc SaTb:Error {form text} {
  4825.         set error [VtErrorDialog $form.popuperrorbox \
  4826.                 -ok \
  4827.                 -defaultButton OK \
  4828.                 -message $text]
  4829.         VtShowDialog $error
  4830. }
  4831. proc SaTb:GetParentWidget {child} {
  4832.     set i [string last . $child] 
  4833.     incr i -1
  4834.     return [string range $child 0 $i]
  4835. }
  4836. #@package: SaOH SaOpenHostDialog SaOpenHostCB SaOpenHostInvokeManager SaOpenHostManagerRunning
  4837. proc SCO_SA_OPENHOST_MSGS {} {}
  4838. global SCO_SA_OPENHOST_MSGS
  4839. set SCO_SA_OPENHOST_MSGS(@catalog@) {sysadm.cat@sa 20}
  4840. set SCO_SA_OPENHOST_MSGS(MSG_openHost) {1 {Open Host}}
  4841. set SCO_SA_OPENHOST_MSGS(MSG_host) {2 Host:}
  4842. set SCO_SA_OPENHOST_MSGS(MSG_select) {3 Select...}
  4843. set SCO_SA_OPENHOST_MSGS(ERR_running) {4 {%1$s manager is already running on %2$s}}
  4844. set SCO_SA_OPENHOST_MSGS(ERR_exec) {5 {Failed to execute SCOadmin %1$s manager.\n%2$s}}
  4845. set SCO_SA_OPENHOST_MSGS(ERR_missing_host) {6 {Please enter name of the remote host you want to manage.}}
  4846. set SCO_SA_OPENHOST_MSGS(MSG_noRemoteAdmin) {7 {Remote administration is not currently accessible}}
  4847. proc SaOpenHostDialog {parent instance value okcb} {
  4848.     set hostForm [VtFormDialog $parent.hostForm \
  4849.             -title [IntlLocalizeMsg SCO_SA_OPENHOST_MSG_openHost] \
  4850.             -MOTIF_marginWidth 10 \
  4851.             -MOTIF_marginHeight 10 \
  4852.             -help \
  4853.             -okCallback $okcb \
  4854.             -cancelCallback VxEndFormCB \
  4855.             -cancelButton CANCEL]
  4856.     keylset hostDisplayList parent $hostForm
  4857.     keylset hostDisplayList instance $instance
  4858.     keylset hostDisplayList labeltype title
  4859.     keylset hostDisplayList labeltext \
  4860.                 [IntlLocalizeMsg SCO_SA_OPENHOST_MSG_host]
  4861.     keylset hostDisplayList buttontext \
  4862.                 [IntlLocalizeMsg SCO_SA_OPENHOST_MSG_select]
  4863.     keylset hostDisplayList textcols 25
  4864.     keylset hostDisplayList show name
  4865.     keylset hostDisplayList userproc [list SaSetFocus next]
  4866.     set selhost [SaSelectHostText $hostDisplayList]
  4867.     VtSetValues $selhost -MOTIF_topOffset 10 -MOTIF_bottomOffset 10 \
  4868.              -leftSide FORM -rightSide FORM
  4869.     if {$value != "" } {
  4870.     VtSetValues [VxGetVar $selhost text] -value $value
  4871.     }
  4872.     VxSetVar $hostForm text [VxGetVar $selhost text]
  4873.     VtRemoveAllTabGroups $hostForm
  4874.     VtAddTabGroup [VxGetVar $selhost text]
  4875.     VtAddTabGroup [VxGetVar $selhost button]
  4876.     SaSetFocusList $hostForm [list \
  4877.             [VxGetVar $selhost text] \
  4878.             [VtGetValues $hostForm -ok]]
  4879.     return $hostForm
  4880. }
  4881. proc SaOpenHostCB {cbs} {
  4882.     VtLock
  4883.     if {![SaHostRemoteOsaAccessible]} {
  4884.     VtUnLock
  4885.     VtShow [VtInformationDialog [keylget cbs dialog].noRemote \
  4886.         -message [IntlLocalizeMsg SCO_SA_OPENHOST_MSG_noRemoteAdmin] \
  4887.         -ok -help]
  4888.     return
  4889.     }
  4890.     set parent [keylget cbs dialog]
  4891.     set script [info script]
  4892.     set form [SaOpenHostDialog $parent hostForm "" "SaOpenHostInvokeManager $script"]
  4893.     VtUnLock
  4894.     VtShow $form 
  4895.     VtSetFocus [VxGetVar $form text] 
  4896. }
  4897. proc SaOpenHostInvokeManager {script cbs} {
  4898.         set widget [keylget cbs widget]
  4899.     set hostName [SaSelectHostGetText hostForm] 
  4900.     if { $hostName == "" } {
  4901.         ErrorPush errStack 0 SCO_SA_OPENHOST_ERR_missing_host 
  4902.         SaDisplayErrorStacks $widget.error [list $errStack] NOHELP 
  4903.             VtSetFocus [VxGetVar [keylget cbs dialog] text] 
  4904.         return
  4905.     }
  4906.     set index [string last "/" $script]
  4907.     if { $index != -1 } {
  4908.         set scriptName [string range $script [expr $index+1] end]
  4909.     }
  4910.     set index [string first GUI $scriptName]
  4911.     set managerName [string range $scriptName 0 [expr $index-1]]
  4912.     if { [VtInfo -charm] } {
  4913.          set command [list exec $script $hostName]
  4914.     } else {
  4915.          set command [list exec $script $hostName &]
  4916.     }
  4917.     VtLock
  4918.     VtControl -suspend
  4919.         if { [catch $command result] } {
  4920.         ErrorPush errStack 0 SCO_SA_OPENHOST_ERR_exec \
  4921.             [list $managerName $hostName] [list $result]
  4922.         VtControl -resume
  4923.         SaDisplayErrorStacks $widget.error [list $errStack] HELP \
  4924.             [list SaOH:CloseCB $widget]
  4925.         VtUnLock
  4926.         return
  4927.         } 
  4928.     VtControl -resume
  4929.     VtDestroyDialog $widget
  4930.     VtUnLock
  4931. }
  4932. proc SaOH:CloseCB {widget cbs} {
  4933.     VtDestroyDialog $widget
  4934. }
  4935. proc SaOpenHostManagerRunning {scriptName hostname} {
  4936.     set localHost [lindex [split [SaHostGetLocalName] .] 0]
  4937.     set hostname [lindex [split $hostname .] 0]
  4938.     set command [list exec ps -ef | grep $scriptName | egrep -v grep ]
  4939.     if { [catch $command result] } {
  4940.     ErrorPushUnix errStack 1
  4941.     }
  4942.     set result [split $result \n]
  4943.     foreach i $result {
  4944.         set name [lindex $i 8]
  4945.         set name [lindex [split $name .] 0]
  4946.         if { $hostname == $name } {
  4947.             return "true"
  4948.         }
  4949.         if { $hostname == $localHost && $name == "" } {
  4950.             return "true"
  4951.         }
  4952.     }
  4953.     return "false"
  4954. }
  4955. #@packend
  4956. #@package: SaMachGroupFileCB SaMachGroupPromptCB SaMachGroupFileWrite SaMachGroupFileRead SaMachGroupUpdate SaMachGroupAddCB SaGroupSlaveDeleteCB SaMachGroupSlaveDelete SaMachGroupSlaveAdd SaMachGroupMasterAdd SaOpenGroupInvokeManager SaOpenGroupCB SaOpenGroupDialog SaMachGroupProc SaMachGroupRestart
  4957. proc SCO_SA_OPENGROUP_MSGS {} {}
  4958. global SCO_SA_OPENGROUP_MSGS
  4959. set SCO_SA_OPENGROUP_MSGS(@catalog@) {sysadm.cat@sa 25}
  4960. set SCO_SA_OPENGROUP_MSGS(MSG_openGroup) {1 {Open Host Group...}}
  4961. set SCO_SA_OPENGROUP_MSGS(MSG_master) {2 {Master Host:}}
  4962. set SCO_SA_OPENGROUP_MSGS(MSG_slave) {3 {Managed Host:}}
  4963. set SCO_SA_OPENGROUP_MSGS(MSG_select) {4 Select...}
  4964. set SCO_SA_OPENGROUP_MSGS(ERR_running) {5 {%1$s manager is already running for group}}
  4965. set SCO_SA_OPENGROUP_MSGS(ERR_exec) {6 {Failed to execute SCOadmin Group Manager}}
  4966. set SCO_SA_OPENGROUP_MSGS(ERR_missing_master) {7 {Please enter name of Master Host}}
  4967. set SCO_SA_OPENGROUP_MSGS(MSG_noRemoteAdmin) {8 {Remote Administration is not currently accessable}}
  4968. set SCO_SA_OPENGROUP_MSGS(MSG_selectMaster) {9 {Select Master Host}}
  4969. set SCO_SA_OPENGROUP_MSGS(MSG_selectSlave) {10 {Select Managed Host}}
  4970. set SCO_SA_OPENGROUP_MSGS(MSG_currentSlaves) {11 {Managed Host List:}}
  4971. set SCO_SA_OPENGROUP_MSGS(MSG_deleteSlaves) {12 Delete}
  4972. set SCO_SA_OPENGROUP_MSGS(MSG_addSlaves) {13 Add}
  4973. set SCO_SA_OPENGROUP_MSGS(MSG_fileSlaves) {14 {Open File}}
  4974. set SCO_SA_OPENGROUP_MSGS(MSG_prompt) {15 Prompt}
  4975. set SCO_SA_OPENGROUP_MSGS(ERR_execFailed) {16 {Remote Machine Failure %s}}
  4976. set SCO_SA_OPENGROUP_MSGS(MSG_noErrorContinue) {17 {Continue work on %s?}}
  4977. set SCO_SA_OPENGROUP_MSGS(MSG_errorContinue) {18 {An Error Occurred. (%1$s)\nContinue work on %2$s?}}
  4978. set SCO_SA_OPENGROUP_MSGS(MSG_machGroupDataDir) {19 /usr/lib/sysadm/mach_groups/}
  4979. set SCO_SA_OPENGROUP_MSGS(MSG_machGroupDataFilter) {20 *.mgrp}
  4980. set SCO_SA_OPENGROUP_MSGS(MSG_machGroupDataRead) {21 Read}
  4981. set SCO_SA_OPENGROUP_MSGS(MSG_machGroupDataWrite) {22 Write}
  4982. set SCO_SA_OPENGROUP_MSGS(MSG_machGroupPromptNever) {23 Never}
  4983. set SCO_SA_OPENGROUP_MSGS(MSG_machGroupPromptAlways) {24 Always}
  4984. set SCO_SA_OPENGROUP_MSGS(MSG_machGroupPromptOnError) {25 {On Error}}
  4985. set SCO_SA_OPENGROUP_MSGS(MSG_openGroupTitle) {26 {Open Host Group}}
  4986. global    SaOG_info
  4987. set    SaOG_info(SCO_SA_MachGroupSlaveText) {}
  4988. set    SaOG_info(SCO_SA_MachGroupMasterText) {}
  4989. set    SaOG_info(SCO_SA_MachGroupSlaveList) {}
  4990. set    SaOG_info(SCO_SA_MachGroupMasterList) {}
  4991. set    SaOG_info(SCO_SA_MachGroupErrorPrompt) [IntlLocalizeMsg \
  4992.         SCO_SA_OPENGROUP_MSG_machGroupPromptOnError]
  4993. set    SaOG_info(SCO_SA_MachGroupSlaveItemList) {}
  4994. proc SaOG:SaMachGroupFileCB { okcb cbs } {
  4995.     set        SCO_SA_MachGroupDataDir \
  4996.         [IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_machGroupDataDir]
  4997.     set        SCO_SA_MachGroupDataFile \
  4998.         [IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_machGroupDataFilter]
  4999.     set parent [ keylget cbs dialog ]
  5000.     set filetext [IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_fileSlaves]
  5001.     set fileForm [ VtFileSelectionDialog $parent.fileForm \
  5002.         -filter $SCO_SA_MachGroupDataDir/$SCO_SA_MachGroupDataFile \
  5003.         -title $filetext \
  5004.         -help \
  5005.         -okCallback $okcb \
  5006.         -cancelButton CANCEL]
  5007.     VtUnLock
  5008.     VtShow $fileForm
  5009. }
  5010. proc SaOG:SaMachGroupPromptCB { cbs } {
  5011.     global SaOG_info
  5012.     set value [ keylget cbs value ]
  5013.     set SaOG_info(SCO_SA_MachGroupErrorPrompt) $value
  5014. }
  5015. proc SaOG:SaMachGroupFileWrite { cbs } {
  5016.     global SaOG_info
  5017.     set filename [ keylget cbs selection ]
  5018.     set fp [ open $filename w ]
  5019.     puts $fp $SaOG_info(SCO_SA_MachGroupMasterList)
  5020.     foreach i $SaOG_info(SCO_SA_MachGroupSlaveList) {
  5021.         puts $fp $i
  5022.     }
  5023.     close $fp
  5024. }
  5025. proc SaOG:SaMachGroupFileRead { cbs } {
  5026.     global SaOG_info
  5027.     set set_master 0
  5028.     set filename [ keylget cbs selection ]
  5029.     set fp [ open $filename r ]
  5030.     while { [gets $fp buf] != -1 } {
  5031.         if { $set_master == 0 } {
  5032.             set SaOG_info(SCO_SA_MachGroupMasterList) $buf
  5033.             set SaOG_info(SCO_SA_MachGroupSlaveList) {}
  5034.             set set_master 1
  5035.         } else {
  5036.             SaOG:SaMachGroupSlaveAdd $buf
  5037.         }
  5038.     }
  5039.     close $fp
  5040.     SaOG:SaMachGroupUpdate
  5041. }
  5042. proc SaOG:SaMachGroupUpdate { } {
  5043.     global SaOG_info
  5044.     VtSetValues $SaOG_info(SCO_SA_MachGroupMasterText) \
  5045.         -value $SaOG_info(SCO_SA_MachGroupMasterList)
  5046.     VtSetValues $SaOG_info(SCO_SA_MachGroupSlaveItemList) \
  5047.         -itemList $SaOG_info(SCO_SA_MachGroupSlaveList)
  5048. }
  5049. proc SaOG:SaMachGroupAddCB {list cbs} {
  5050.     global SaOG_info
  5051.     if { "$list" == "slave" } {
  5052.         SaOG:SaMachGroupSlaveAdd [VtGetValues \
  5053.             $SaOG_info(SCO_SA_MachGroupSlaveText) -value]
  5054.         VtSetValues $SaOG_info(SCO_SA_MachGroupSlaveText) -value {}
  5055.     } else {
  5056.         SaOG:SaMachGroupMasterAdd [VtGetValues \
  5057.             $SaOG_info(SCO_SA_MachGroupMasterText) -value]
  5058.     }
  5059. }
  5060. proc SaOG:SaGroupSlaveDeleteCB { cbs } {
  5061.     global SaOG_info
  5062.     set name [VtListGetSelectedItem \
  5063.             $SaOG_info(SCO_SA_MachGroupSlaveItemList) -byItemList]
  5064.     SaOG:SaMachGroupSlaveDelete $name
  5065.     SaOG:SaMachGroupUpdate
  5066. }
  5067. proc SaOG:SaMachGroupSlaveDelete { name } {
  5068.     global SaOG_info
  5069.     set to_rep [ lsearch -exact $SaOG_info(SCO_SA_MachGroupSlaveList) \
  5070.             $name ]
  5071.     if { $to_rep != -1 } {
  5072.         set SaOG_info(SCO_SA_MachGroupSlaveList) [ lreplace \
  5073.             $SaOG_info(SCO_SA_MachGroupSlaveList) $to_rep $to_rep ]
  5074.     }
  5075. }
  5076. proc SaOG:SaMachGroupSlaveAdd { name } {
  5077.     global SaOG_info
  5078.     if { "$name" == "" } {
  5079.         return
  5080.     }
  5081.     if { [ lsearch -exact $SaOG_info(SCO_SA_MachGroupSlaveList) "$name" ] \
  5082.         == -1 } {
  5083.         set new_slave [ concat $SaOG_info(SCO_SA_MachGroupSlaveList) \
  5084.                 "$name" ]
  5085.         set SaOG_info(SCO_SA_MachGroupSlaveList) [lsort $new_slave]
  5086.     }
  5087.     SaOG:SaMachGroupUpdate
  5088. }
  5089. proc SaOG:SaMachGroupMasterAdd { name } {
  5090.     global SaOG_info
  5091.     set SaOG_info(SCO_SA_MachGroupMasterList) "$name"
  5092. }
  5093. proc SaOG:SaOpenGroupInvokeManager { script cbs } {
  5094.     global SaOG_info
  5095.     set dialog [keylget cbs dialog]
  5096.     if { "$SaOG_info(SCO_SA_MachGroupSlaveList)" != "" } {
  5097.         set command [list exec $script \
  5098.             $SaOG_info(SCO_SA_MachGroupMasterList) \
  5099.             "$SaOG_info(SCO_SA_MachGroupSlaveList)" \
  5100.             "$SaOG_info(SCO_SA_MachGroupErrorPrompt)" "&"]
  5101.     } else {
  5102.         set command [list exec \
  5103.             $script $SaOG_info(SCO_SA_MachGroupMasterList) "&"]
  5104.     }
  5105.     if { "$SaOG_info(SCO_SA_MachGroupMasterList)" != "" } {
  5106.         VtDestroyDialog $dialog
  5107.         if { [catch $command returnVal] } {
  5108.                 ErrorPush errorStack 0 SCO_SA_OPENGROUP_ERR_exec \
  5109.                 [list $returnVal]
  5110.                 SaDisplayErrorStacks execErr [list $errorStack] NOHELP
  5111.         }
  5112.     } else {
  5113.         ErrorPush errorStack 0 SCO_SA_OPENGROUP_ERR_missing_master {}
  5114.             SaDisplayErrorStacks execErr [list $errorStack] NOHELP
  5115.     }
  5116. }
  5117. proc SaOpenGroupCB {cbs} {
  5118.     VtLock
  5119.     if {![SaHostRemoteOsaAccessible]} {
  5120.         VtUnLock
  5121.         VtShow [VtInformationDialog [keylget cbs dialog].noRemote \
  5122.         -message [IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_noRemoteAdmin] \
  5123.         -ok -help]
  5124.         return
  5125.     }
  5126.     set parent [keylget cbs dialog]
  5127.     set script [info script]
  5128.     set form [SaOG:SaOpenGroupDialog $parent groupForm "" \
  5129.         "SaOG:SaOpenGroupInvokeManager $script"]
  5130.     VtUnLock
  5131.     VtShow $form
  5132.     VtSetFocus [VxGetVar $form text]
  5133. }
  5134. proc SaOG:SaOpenGroupDialog {parent instance value okcb} {
  5135.     global SaOG_info
  5136.     set groupForm [VtFormDialog $parent.groupForm \
  5137.         -title [IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_openGroupTitle] \
  5138.         -MOTIF_marginWidth 10 \
  5139.         -MOTIF_marginHeight 10 \
  5140.         -help \
  5141.         -okCallback $okcb \
  5142.         -cancelCallback VxEndFormCB \
  5143.         -cancelButton CANCEL]
  5144.     set groupMaster [VtForm $groupForm.Master \
  5145.         -leftSide FORM \
  5146.         -rightSide FORM \
  5147.         ]
  5148.     set groupSlave [VtForm $groupForm.Slave \
  5149.         -leftSide FORM \
  5150.         -rightSide FORM \
  5151.         ]
  5152.     set groupPrompt [VtForm $groupForm.Prompt \
  5153.         -leftSide FORM \
  5154.         -rightSide FORM \
  5155.         ]
  5156.     keylset groupMasterList parent $groupMaster
  5157.     keylset groupMasterList instance $groupMaster
  5158.     keylset groupMasterList labeltype text
  5159.     keylset groupMasterList labeltext \
  5160.         [ IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_master]
  5161.     keylset groupMasterList buttontext \
  5162.         [ IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_select]
  5163.     keylset groupMasterList textcols 25
  5164.     keylset groupMasterList show name
  5165.     keylset groupMasterList title \
  5166.         [ IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_selectMaster]
  5167.     keylset groupMasterList userproc [list SaOG:SaMachGroupAddCB master ]
  5168.     set selmaster [SaSelectHostText $groupMasterList]
  5169.     set SaOG_info(SCO_SA_MachGroupMasterText) [VxGetVar $selmaster text]
  5170.     if {$SaOG_info(SCO_SA_MachGroupMasterList) != "" } {
  5171.         VtSetValues [VxGetVar $selmaster text] \
  5172.             -value $SaOG_info(SCO_SA_MachGroupMasterList)
  5173.     }
  5174.     keylset groupSlaveList parent $groupSlave
  5175.     keylset groupSlaveList instance $groupSlave
  5176.     keylset groupSlaveList labeltype text
  5177.     keylset groupSlaveList labeltext \
  5178.         [ IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_slave]
  5179.     keylset groupSlaveList buttontext \
  5180.         [ IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_select]
  5181.     keylset groupSlaveList textcols 25
  5182.     keylset groupSlaveList show name
  5183.     keylset groupSlaveList title \
  5184.         [ IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_selectSlave]
  5185.     keylset groupSlaveList userproc [list SaOG:SaMachGroupAddCB slave ]
  5186.     set selslave [SaSelectHostText $groupSlaveList]
  5187.     set SaOG_info(SCO_SA_MachGroupSlaveText) [VxGetVar $selslave text]
  5188.     set buttonform [ VtForm $groupSlave.buttons ]
  5189.     set slavelistlabeltext \
  5190.         [ IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_currentSlaves]
  5191.     set slavelistlabel [VtLabel $groupSlave.listlabel \
  5192.         -label $slavelistlabeltext ]
  5193.     set SaOG_info(SCO_SA_MachGroupSlaveItemList) [VtList $groupSlave.list \
  5194.         -rows 5 \
  5195.         -autoSelect 1 \
  5196.         -itemList $SaOG_info(SCO_SA_MachGroupSlaveList) \
  5197.         ]
  5198.     set dellabeltext [ IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_deleteSlaves ]
  5199.     set slavelistdel [ VtPushButton $buttonform.del \
  5200.         -label $dellabeltext \
  5201.         -callback SaOG:SaGroupSlaveDeleteCB \
  5202.         ]
  5203.     set addlabeltext [ IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_addSlaves ]
  5204.     set slavelistadd [ VtPushButton $buttonform.add \
  5205.         -label $addlabeltext \
  5206.         -callback [list SaOG:SaMachGroupAddCB slave ] \
  5207.         ]
  5208.     set filelabeltext [ IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_fileSlaves ]
  5209.     if { 0 } {
  5210.         set slavelistfile [ VtPushButton $buttonform.file \
  5211.             -label $filelabeltext \
  5212.             -callback [list SaOG:SaMachGroupFileCB \
  5213.                 SaOG:SaMachGroupFileRead ] \
  5214.             -autoLock [list SaOG:SaMachGroupFileCB \
  5215.                 SaOG:SaMachGroupFileRead ] \
  5216.             ]
  5217.     } else {
  5218.         set slavelistfile [ VtOptionMenu $buttonform.menu \
  5219.             -label $filelabeltext \
  5220.             ]
  5221.         set slavelistfileread [ VtPushButton $slavelistfile.read \
  5222.             -label [IntlLocalizeMsg \
  5223.                 SCO_SA_OPENGROUP_MSG_machGroupDataRead] \
  5224.             -callback [list SaOG:SaMachGroupFileCB \
  5225.                 SaOG:SaMachGroupFileRead ] \
  5226.             -autoLock [list SaOG:SaMachGroupFileCB \
  5227.                 SaOG:SaMachGroupFileRead ] \
  5228.             ]
  5229.         set slavelistfilewrite [ VtPushButton $slavelistfile.write \
  5230.             -label [IntlLocalizeMsg \
  5231.                 SCO_SA_OPENGROUP_MSG_machGroupDataWrite] \
  5232.             -callback [list SaOG:SaMachGroupFileCB \
  5233.                 SaOG:SaMachGroupFileWrite ] \
  5234.             -autoLock [list SaOG:SaMachGroupFileCB \
  5235.                 SaOG:SaMachGroupFileWrite ] \
  5236.             ]
  5237.     }
  5238.     set slavepromptlabeltext [ IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_prompt ]
  5239.     set slavepromptlabel [ VtLabel $groupPrompt.label \
  5240.         -label $slavepromptlabeltext \
  5241.         ]
  5242.     set slaveprompt [ VtComboBox $groupPrompt.combo \
  5243.         -itemList [list \
  5244.             [IntlLocalizeMsg \
  5245.                 SCO_SA_OPENGROUP_MSG_machGroupPromptOnError] \
  5246.             [IntlLocalizeMsg \
  5247.                 SCO_SA_OPENGROUP_MSG_machGroupPromptNever] \
  5248.             [IntlLocalizeMsg \
  5249.                 SCO_SA_OPENGROUP_MSG_machGroupPromptAlways] ] \
  5250.         -value $SaOG_info(SCO_SA_MachGroupErrorPrompt) \
  5251.         -callback SaOG:SaMachGroupPromptCB \
  5252.         -leftSide $slavepromptlabel \
  5253.         ]
  5254.     VtSetValues $slavelistadd \
  5255.                 -leftSide FORM \
  5256.                 -rightSide FORM
  5257.     VtSetValues $slavelistfile \
  5258.                 -leftSide FORM \
  5259.                 -rightSide FORM
  5260.     VtSetValues $slavelistdel \
  5261.                 -leftSide FORM \
  5262.                 -rightSide FORM
  5263.     VtSetValues $selmaster \
  5264.                 -MOTIF_topOffset 10 \
  5265.                 -MOTIF_bottomOffset 10 \
  5266.                 -leftSide FORM \
  5267.                 -rightSide FORM
  5268.     VtSetValues $slavelistlabel \
  5269.             -leftSide FORM \
  5270.             -topSide $selslave \
  5271.             -MOTIF_topOffset 10 \
  5272.             -MOTIF_bottomOffset 10
  5273.     VtSetValues $buttonform \
  5274.             -leftSide NONE \
  5275.             -rightSide FORM \
  5276.             -topSide $slavelistlabel
  5277.     VtSetValues $SaOG_info(SCO_SA_MachGroupSlaveItemList) \
  5278.             -leftSide FORM \
  5279.             -rightSide $buttonform \
  5280.             -topSide $slavelistlabel \
  5281.             -MOTIF_topOffset 10 \
  5282.             -MOTIF_bottomOffset 10
  5283.     VtSetValues $selslave \
  5284.             -MOTIF_topOffset 10 \
  5285.             -MOTIF_bottomOffset 10 \
  5286.             -rightSide FORM \
  5287.             -leftSide FORM 
  5288.     VtSetValues $slaveprompt \
  5289.             -MOTIF_topOffset 10 \
  5290.             -MOTIF_bottomOffset 10 \
  5291.             -topSide FORM \
  5292.             -bottomSide FORM
  5293.     VtSetValues $slavepromptlabel \
  5294.             -MOTIF_topOffset 10 \
  5295.             -leftSide FORM \
  5296.             -topSide FORM \
  5297.             -bottomSide FORM
  5298.     VtShow $groupMaster
  5299.     VtShow $groupSlave
  5300.     VtShow $groupPrompt
  5301.     VxSetVar $groupForm text [VxGetVar $selmaster text]
  5302.     SaSetFocusList $groupForm [list \
  5303.                 [VxGetVar $selmaster text] \
  5304.                 [VtGetValues $groupForm -ok]]
  5305.     return $groupForm
  5306. }
  5307. proc SaMachGroupProc { masterName {groups {}} {errorPrompt {}} \
  5308.     proclist parent cbs } {
  5309.     set groupList [split $groups]
  5310.     set hosts $masterName
  5311.     if { [llength $groupList] > 0 } {
  5312.         set hosts [concat $masterName $groupList]
  5313.     }
  5314.     set alwaysPrompt [IntlLocalizeMsg \
  5315.                         SCO_SA_OPENGROUP_MSG_machGroupPromptAlways]
  5316.     set neverPrompt [IntlLocalizeMsg \
  5317.                         SCO_SA_OPENGROUP_MSG_machGroupPromptNever]
  5318.     foreach hostName $hosts {
  5319.         set errorStack {}
  5320.         set evalCmd [lindex $proclist 0]
  5321.         set evalArgs [lrange $proclist 1 [llength $proclist]]
  5322.         set cmd [list eval $evalCmd $hostName errorStack $evalArgs]
  5323.         ErrorCatch errorStack 0 $cmd dummyResult \
  5324.             SCO_SA_OPENGROUP_ERR_execFailed [list $hostName]
  5325.         if {[string compare $errorPrompt $neverPrompt] != 0} {
  5326.             set nameind [lsearch -exact $hosts $hostName]
  5327.             incr nameind
  5328.             set newmaster [lindex $hosts $nameind]
  5329.             set newlist [lrange $hosts [incr nameind] \
  5330.                 [llength $hosts]]
  5331.             if { $newmaster == {} } {
  5332.                 VtUnLock
  5333.                 if { [llength $errorStack] != 0 } {
  5334.                     SaDisplayErrorStacks openGroupErr \
  5335.                         [list $errorStack] NOHELP
  5336.                 }
  5337.                 return
  5338.             }
  5339.             if { [llength $errorStack] != 0} {
  5340.                 VtUnLock
  5341.                 SaOG:SaMachGroupRestart $errorStack \
  5342.                     $newmaster $newlist $errorPrompt \
  5343.                       $proclist $parent $cbs
  5344.                 return
  5345.             } elseif {[string compare $errorPrompt $alwaysPrompt] \
  5346.                     == 0} {
  5347.                 VtUnLock
  5348.                 SaOG:SaMachGroupRestart $errorStack $newmaster \
  5349.                      $newlist $errorPrompt $proclist \
  5350.                       $parent $cbs
  5351.                 return
  5352.             }
  5353.         }
  5354.     }
  5355.     VtUnLock
  5356. }
  5357. proc SaOG:SaMachGroupRestart { eStack master slaves prompt proclist \
  5358.                 parent cbs } {
  5359.     set cb  "SaMachGroupProc $master [list $slaves] \"$prompt\" \
  5360.         [list $proclist] $parent"
  5361.     if { [llength $eStack] != 0 } {
  5362.         set err [ErrorText eStack]
  5363.         set emsg [IntlLocalizeMsg SCO_SA_OPENGROUP_MSG_errorContinue \
  5364.             [list $err $master]]
  5365.         set msg [VtErrorDialog $parent.grpPrompt \
  5366.             -message "$emsg" \
  5367.                     -autoLock $cb \
  5368.             -okCallback $cb \
  5369.         ]
  5370.     } else {
  5371.         set msg [VtQuestionDialog $parent.grpPrompt \
  5372.             -message [IntlLocalizeMsg \
  5373.             SCO_SA_OPENGROUP_MSG_noErrorContinue $master] \
  5374.                     -autoLock $cb \
  5375.             -okCallback $cb \
  5376.         ]
  5377.     }
  5378.     VtShow $msg
  5379.     if { [llength $eStack] != 0 } {
  5380.             SaDisplayErrorStacks execErr [list $eStack] NOHELP
  5381.     }
  5382. }
  5383. #@packend
  5384. #@package: SaNW SaSelectNWDialog SaSelectNWText SaSelectNWAuth SaSelectNWGetSelection
  5385. proc SCO_SA_SELNW_MSGS {} {}
  5386. global SCO_SA_SELNW_MSGS
  5387. set SCO_SA_SELNW_MSGS(@catalog@) {sysadm.cat@sa 26}
  5388. set SCO_SA_SELNW_MSGS(MSG_TITLE) {1 {NetWare File Server Selection}}
  5389. set SCO_SA_SELNW_MSGS(MSG_LIST_TITLE) {2 {File Servers}}
  5390. set SCO_SA_SELNW_MSGS(MSG_SELECTION) {3 Selection:}
  5391. set SCO_SA_SELNW_MSGS(MSG_FILTER) {4 Filter:}
  5392. set SCO_SA_SELNW_MSGS(MSG_NETWARE_LOGIN_TI) {5 {NetWare Server Login on %s}}
  5393. set SCO_SA_SELNW_MSGS(MSG_LOGIN) {6 Login:}
  5394. set SCO_SA_SELNW_MSGS(MSG_PASSWORD) {7 Password:}
  5395. set SCO_SA_SELNW_MSGS(ERR_LOGIN) {8 {Unable to login to host %s}}
  5396. set SCO_SA_SELNW_MSGS(ERR_CODE_ERR) {9 {Error:  data missing from parameter list}}
  5397. set SCO_SA_SELNW_MSGS(ERR_AUTHHOST) {10 {You must first select a NetWare server to authenticate with.}}
  5398. set SCO_SA_SELNW_MSGS(MSG_CONTEXT) {11 Context:}
  5399. proc SaNW:NextItemCB {next cbs} {
  5400.     VtSetFocus $next
  5401. }
  5402. proc SaNW:SaSelectNWFilterCB {ins cbs} {
  5403.     global SaNW_mainList SaNW_filter SaNW_selected 
  5404.     set dialog [keylget cbs dialog]
  5405.     set selecttxt     [VxGetVar $dialog selecttxt]
  5406.     set hostlist     [VxGetVar $dialog hostlist]
  5407.     set SaNW_filter($ins)    [keylget cbs value]
  5408.     VtListDeleteItem $hostlist -all
  5409.     VtListAddItem $hostlist -itemList [lmatch $SaNW_mainList($ins) $SaNW_filter($ins)]
  5410.     VtListSelectItem $hostlist -position 1
  5411.     set SaNW_selected($ins) [lindex [VtListGetSelectedItem $hostlist -byItemList] 0]
  5412.     VtSetValues $selecttxt -value $SaNW_selected($ins)
  5413. }
  5414. proc SaNW:SaSelectNWSelectCB {ins cbs} {
  5415.     global SaNW_selected 
  5416.     set dialog [keylget cbs dialog]
  5417.     set value  [keylget cbs value]
  5418.     set hostlist [VxGetVar $dialog hostlist]
  5419.     VtListSelectItem $hostlist -item $value
  5420.     set SaNW_selected($ins) [lindex [VtListGetSelectedItem $hostlist -byItemList] 0]
  5421. }
  5422. proc SaNW:SaSelectNWlistCB {ins cbs} {
  5423.     global SaNW_selected 
  5424.     set dialog [keylget cbs dialog]
  5425.     set SaNW_selected($ins)  [lindex [keylget cbs selectedItemList] 0]
  5426.     set selecttxt [VxGetVar $dialog selecttxt]
  5427.     VtSetValues $selecttxt -value $SaNW_selected($ins)
  5428. }
  5429. proc SaNW:SaSelectNWDialogOkCB {pList ins cbs} {
  5430. global SaNW_selected
  5431.     set textfield [keylget pList textfield]
  5432.     VtSetValues $textfield -value $SaNW_selected($ins)
  5433.     if {[keylget pList userCB userCB]} {
  5434.         if {![lempty $userCB]} {
  5435.                 lappend userCB $cbs
  5436.                 eval "$userCB"
  5437.         }
  5438.     }
  5439.     VxEndFormCB $cbs
  5440. }
  5441. proc SaNW_GetNwFileServers {{host {}}} {
  5442.     if {"$host" != ""} {
  5443.         set instance [list [list [list systemId $host] NULL]]
  5444.     } else {
  5445.         set instance NULL
  5446.     }
  5447.     set objcall [list ObjectAction \
  5448.                     {sco id-oc-server} $instance listNwFservers {}]
  5449.     set bmipResponse [lindex [SaMakeObjectCall $objcall] 0]
  5450.     if {[BmipResponseErrorIsPresent bmipResponse] } {
  5451.         set errorStack [BmipResponseErrorStack bmipResponse]
  5452.     ErrorThrow errorStack
  5453.     } else {
  5454.     set nwfservers [BmipResponseActionInfo bmipResponse] 
  5455.     }
  5456. }
  5457. proc SaSelectNWDialog {pList cbs} {
  5458.     global SaNW_mainList SaNW_filter SaNW_selected
  5459.     set ins [keylget pList instance]
  5460.     set dialog  [keylget cbs dialog]
  5461.     set hosttxt [keylget pList textfield]
  5462.     set current [VtGetValues $hosttxt -value]
  5463.     set parent [keylget pList parent]
  5464.     set proc [keylget pList proc]
  5465.     if {[catch "keylget pList title" TITLE]} {
  5466.         set TITLE [IntlLocalizeMsg SCO_SA_SELNW_MSG_TITLE]
  5467.     }
  5468.     if {[catch "keylget pList listtitle" LIST_TITLE]} {
  5469.         set LIST_TITLE [IntlLocalizeMsg SCO_SA_SELNW_MSG_LIST_TITLE]
  5470.     }
  5471.     set SELECTION [IntlLocalizeMsg SCO_SA_SELNW_MSG_SELECTION]
  5472.     set FILTER    [IntlLocalizeMsg SCO_SA_SELNW_MSG_FILTER]
  5473.     if {![info exists SaNW_filter($ins)]} {
  5474.         set SaNW_filter($ins) "*"
  5475.     }
  5476.     if {![info exists SaNW_selected($ins)]} {
  5477.         set SaNW_selected($ins) ""
  5478.     }
  5479.     set form [VtFormDialog $dialog.form  \
  5480.             -title $TITLE \
  5481.             -ok \
  5482.             -okCallback "SaNW:SaSelectNWDialogOkCB [list $pList] $ins" \
  5483.             -cancel \
  5484.             -cancelCallback VxEndFormCB \
  5485.     ]
  5486.     VtLabel $form.listlbl -label "$LIST_TITLE"
  5487.     set hostlist [VtList $form.list \
  5488.                 -selection BROWSE \
  5489.                 -CHARM_autoSelect 1 \
  5490.                 -rows 13 \
  5491.                 -columns 15 \
  5492.                 -callback "SaNW:SaSelectNWlistCB $ins" \
  5493.     ]
  5494.     VxSetVar $form hostlist $hostlist
  5495.     set rowCol [VtRowColumn $form.rowcol \
  5496.             -alignTop $hostlist \
  5497.             -leftSide $hostlist \
  5498.             -packing COLUMN \
  5499.             -horizontal \
  5500.             -numColumns 4 \
  5501.     ]
  5502.     VtLabel $rowCol.selectlbl -label   "$SELECTION"
  5503.     set selecttxt [VtText  $rowCol.selecttxt \
  5504.                 -columns 15 \
  5505.                 -callback "SaNW:SaSelectNWSelectCB $ins" \
  5506.     ]
  5507.     VxSetVar $form selecttxt $selecttxt
  5508.     VtLabel $rowCol.filterlbl -label "$FILTER"
  5509.     set filtertxt [VtText  $rowCol.filtertxt \
  5510.                 -columns 15 \
  5511.                 -value "$SaNW_filter($ins)" \
  5512.                 -callback "SaNW:SaSelectNWFilterCB $ins" \
  5513.     ]
  5514.     VxSetVar $form filtertxt $filtertxt
  5515.     VtShow $form
  5516.     if {[ErrorCatch eStk 0 "$proc" SaNW_mainList($ins)]} {
  5517.     VtUnLock
  5518.     VtDestroy $form
  5519.         SaDisplayErrorStacks $parent.errbox [list $eStk] NOHELP
  5520.     return
  5521.     } 
  5522.     set SaNW_mainList($ins) [lsort $SaNW_mainList($ins)]
  5523.     VtListAddItem $hostlist -itemList [lmatch $SaNW_mainList($ins) $SaNW_filter($ins)]
  5524.     if {"$SaNW_selected($ins)" == "" } {
  5525.     VtListSelectItem $hostlist -position 1
  5526.     } else {
  5527.     VtListSelectItem $hostlist -item $SaNW_selected($ins)
  5528.     }
  5529.     set SaNW_selected($ins) [lindex [VtListGetSelectedItem $hostlist -byItemList] 0]
  5530.     VtSetValues $selecttxt -value $SaNW_selected($ins)
  5531.     VtSetFocus $hostlist
  5532.     VtUnLock
  5533. }
  5534. proc SaNW:NWLoginCB {pList parentcbs cbs} {
  5535.     set dialog [keylget cbs dialog]
  5536.     set authhost [keylget pList authhost]
  5537.     set login [VtGetValues [VxGetVar $dialog login] -value]
  5538.     set context [VtGetValues [VxGetVar $dialog context] -value]
  5539.     set passwd [VtGetValues [VxGetVar $dialog passwd] -value]
  5540.     if {"$context" != "" && ![ctype space $context]} {
  5541.     set login "$login.$context"
  5542.     }
  5543.     if {[catch "keylget pList host" host] == 0} {
  5544.         set instance [list [list [list systemId $host] NULL]]
  5545.     } else {
  5546.         set instance NULL
  5547.     }
  5548.     set objcall [list ObjectAction \
  5549.                     {sco id-oc-server} $instance nwlogin \
  5550.             [list "$authhost" "$login" "$passwd"]]
  5551.     ErrorCatch eStk 0 "SaMakeObjectCall [list $objcall]" bmipResponse
  5552.     set bmipResponse [lindex $bmipResponse 0]
  5553.     if {[BmipResponseErrorIsPresent bmipResponse]} {
  5554.         set eStk [BmipResponseErrorStack bmipResponse]
  5555.     ErrorPush eStk 0 SCO_SA_SELNW_ERR_LOGIN $authhost
  5556.         SaDisplayErrorStacks $dialog.err [list $eStk] NOHELP
  5557.     } else {
  5558.     VxEndFormCB $cbs
  5559.     SaSelectNWDialog $pList $parentcbs
  5560.     }
  5561. }
  5562. proc SaSelectNWAuth {pList cbs} {
  5563.     set dialog [keylget cbs dialog]
  5564.     if {[catch "keylget pList authhostproc" authhostproc] == 0} {
  5565.     if {[catch "eval $authhostproc" authhost] == 0} {
  5566.         if {"$authhost" != ""} {
  5567.             keylset pList authhost $authhost
  5568.         } else {
  5569.         VtUnLock
  5570.         ErrorPush eStk 0 SCO_SA_SELNW_ERR_AUTHHOST
  5571.             SaDisplayErrorStacks $dialog.ebox [list $eStk] NOHELP
  5572.         return
  5573.         }
  5574.     }
  5575.         set NETWARE_LOGIN_TI \
  5576.       [IntlLocalizeMsg SCO_SA_SELNW_MSG_NETWARE_LOGIN_TI $authhost]
  5577.         set LOGIN [IntlLocalizeMsg SCO_SA_SELNW_MSG_LOGIN]
  5578.         set CONTEXT [IntlLocalizeMsg SCO_SA_SELNW_MSG_CONTEXT]
  5579.         set PASSWORD [IntlLocalizeMsg SCO_SA_SELNW_MSG_PASSWORD]
  5580.         if {[catch "keylget pList host" host] == 0} {
  5581.             set instance [list [list [list systemId $host] NULL]]
  5582.         } else {
  5583.             set instance NULL
  5584.         }
  5585.         set objcall [list ObjectAction \
  5586.                     {sco id-oc-server} $instance nwauthquery $authhost]
  5587.         set bmipResponse [lindex [SaMakeObjectCall $objcall] 0]
  5588.         set result [BmipResponseActionInfo bmipResponse] 
  5589.     if {"$result" == "true"} {
  5590.         SaSelectNWDialog $pList $cbs
  5591.     } else {
  5592.         set logindlog [VtFormDialog dialog.loginform \
  5593.             -title "$NETWARE_LOGIN_TI" \
  5594.             -ok \
  5595.             -okCallback "SaNW:NWLoginCB [list $pList] [list $cbs]" \
  5596.             -cancel \
  5597.             -cancelCallback VxEndFormCB \
  5598.         ]
  5599.         keylset formargs $LOGIN "VtText -columns 15"
  5600.         keylset formargs $CONTEXT "VtText -columns 15"
  5601.         keylset formargs $PASSWORD "VtText -columns 15 -noEcho"
  5602.         set loginform [VxAlignedForm $logindlog.form $formargs]
  5603.         VtShow $logindlog
  5604.         set login [VxGetVar $loginform widget1]
  5605.         VxSetVar $logindlog login $login
  5606.         set context [VxGetVar $loginform widget2]
  5607.         VxSetVar $logindlog context $context
  5608.         set passwd [VxGetVar $loginform widget3]
  5609.         VxSetVar $logindlog passwd $passwd
  5610.         VtSetValues $login -callback "SaNW:NextItemCB $context"
  5611.         VtSetValues $context -callback "SaNW:NextItemCB $passwd"
  5612.         VtSetValues $passwd -callback "SaNW:NextItemCB $logindlog.ok"
  5613.         VtSetFocus $login
  5614.         VtUnLock
  5615.     }
  5616.     } else {
  5617.     SaSelectNWDialog $pList $cbs
  5618.     }
  5619. }
  5620. proc SaSelectNWText {pList} {
  5621.     global SaNW_info
  5622.     if {[keylget pList parent parent] == 0} {
  5623.     ErrorPush errorStack 1 SCO_SA_SELNW_ERR_CODE_ERR 
  5624.     }
  5625.     if {[keylget pList instance instance] == 0} {
  5626.     ErrorPush errorStack 1 SCO_SA_SELNW_ERR_CODE_ERR 
  5627.     }
  5628.     if {[keylget pList labeltype labeltype] == 0} {
  5629.     set labeltype title
  5630.     }
  5631.     if {[keylget pList labeltext labeltext] == 0} {
  5632.     ErrorPush errorStack 1 SCO_SA_SELNW_ERR_CODE_ERR 
  5633.     }
  5634.     if {[keylget pList textcols textcols] == 0} {
  5635.     set textcols 30
  5636.     }
  5637.     if {[keylget pList buttontext buttontext] == 0} {
  5638.     ErrorPush errorStack 1 SCO_SA_SELNW_ERR_CODE_ERR 
  5639.     }
  5640.     if {[keylget pList show show] == 0} {
  5641.     set show name
  5642.     }
  5643.     if {[keylget pList proc proc] == 0} {
  5644.         if {[keylget pList host host] == 0} {
  5645.         keylset pList proc SaNW_GetNwFileServers
  5646.     } else {
  5647.         keylset pList proc "SaNW_GetNwFileServers $host"
  5648.     }
  5649.     } 
  5650.     set returnform [VtForm $parent.SaNW_form$instance -marginHeight 0 -marginWidth 0]
  5651.     if {$labeltype == "label"} {
  5652.     set innerform [VtForm $returnform.innerform -marginHeight 0 -marginWidth 0]
  5653.     VtSetValues $innerform -leftSide FORM -rightSide FORM
  5654.     set textlabel [VtLabel $innerform.textlabel -label $labeltext]    
  5655.     set textfield [VtText $innerform.textfield \
  5656.         -columns $textcols]
  5657.         keylset pList textfield $textfield
  5658.     set pushbutton [VtPushButton $innerform.button \
  5659.         -label $buttontext \
  5660.         -callback "SaSelectNWAuth [list $pList]" ]
  5661.     set lheight [lindex [VtGetValues $textlabel -baseLineList] 0]
  5662.     set theight [lindex [VtGetValues $textfield -baseLineList] 0]
  5663.     set bheight [lindex [VtGetValues $pushbutton -baseLineList] 0]
  5664.     if {$lheight >= $theight && $lheight >= $bheight} {
  5665.         set diff1 [expr $lheight - $theight]
  5666.         set diff2 [expr $lheight - $bheight]
  5667.         VtSetValues $textlabel \
  5668.         -leftSide FORM -rightSide NONE \
  5669.         -topSide FORM -MOTIF_topOffset 0
  5670.         VtSetValues $textfield \
  5671.         -leftSide $textlabel -MOTIF_leftOffset 3 \
  5672.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  5673.         -topSide FORM -MOTIF_topOffset $diff1
  5674.         VtSetValues $pushbutton \
  5675.         -leftSide NONE \
  5676.         -rightSide FORM \
  5677.         -topSide FORM -MOTIF_topOffset $diff2
  5678.     } elseif {$theight >= $bheight} {
  5679.         set diff1 [expr $theight - $lheight]
  5680.         set diff2 [expr $theight - $bheight]
  5681.         VtSetValues $textlabel \
  5682.         -leftSide FORM -rightSide NONE \
  5683.         -topSide FORM -MOTIF_topOffset $diff1
  5684.         VtSetValues $textfield \
  5685.         -leftSide $textlabel -MOTIF_leftOffset 3 \
  5686.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  5687.         -topSide FORM -MOTIF_topOffset 0
  5688.         VtSetValues $pushbutton \
  5689.         -leftSide NONE \
  5690.         -rightSide FORM \
  5691.         -topSide FORM -MOTIF_topOffset $diff2
  5692.     } else {
  5693.         set diff1 [expr $bheight - $lheight]
  5694.         set diff2 [expr $bheight - $theight]
  5695.         VtSetValues $textlabel \
  5696.         -leftSide FORM -rightSide NONE \
  5697.         -topSide FORM -MOTIF_topOffset $diff1
  5698.         VtSetValues $textfield \
  5699.         -leftSide $textlabel -MOTIF_leftOffset 3 \
  5700.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  5701.         -topSide FORM -MOTIF_topOffset $diff2
  5702.         VtSetValues $pushbutton \
  5703.         -leftSide NONE \
  5704.         -rightSide FORM \
  5705.         -topSide FORM -MOTIF_topOffset 0
  5706.     }
  5707.     VtSetValues $textlabel -leftSide FORM -rightSide NONE 
  5708.     VtSetValues $textfield -leftSide $textlabel -MOTIF_leftOffset 3 \
  5709.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  5710.         -topSide FORM
  5711.     VtSetValues $pushbutton -leftSide NONE \
  5712.         -rightSide FORM -topSide FORM
  5713.     } else {
  5714.     set textlabel [VtLabel $returnform.textlabel -label $labeltext]    
  5715.     set innerform [VtForm $returnform.innerform -marginHeight 0 -marginWidth 0]
  5716.     VtSetValues $innerform -leftSide FORM -rightSide FORM
  5717.     set textfield [VtText $innerform.textfield \
  5718.         -columns $textcols]
  5719.         keylset pList textfield $textfield
  5720.     set pushbutton [VtPushButton $innerform.button \
  5721.         -label $buttontext \
  5722.         -callback "SaSelectNWAuth [list $pList]" ]
  5723.     set theight [lindex [VtGetValues $textfield -baseLineList] 0]
  5724.     set bheight [lindex [VtGetValues $pushbutton -baseLineList] 0]
  5725.     set diff [abs ([expr $theight - $bheight])]
  5726.     if {$theight > $bheight} {
  5727.         VtSetValues $textfield -leftSide FORM \
  5728.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  5729.         -topSide FORM -MOTIF_topOffset 0
  5730.         VtSetValues $pushbutton \
  5731.         -leftSide NONE -rightSide FORM \
  5732.         -topSide FORM -MOTIF_topOffset $diff
  5733.     } else {
  5734.         VtSetValues $textfield -leftSide FORM \
  5735.         -rightSide $pushbutton -MOTIF_rightOffset 20 \
  5736.         -topSide FORM -MOTIF_topOffset $diff
  5737.         VtSetValues $pushbutton \
  5738.         -leftSide NONE -rightSide FORM \
  5739.         -topSide FORM -MOTIF_topOffset 0
  5740.     }
  5741.     }
  5742.     set SaNW_info($instance:textwidgetname) $textfield
  5743.     set SaNW_info($instance:button) $pushbutton
  5744.     set SaNW_info($instance:has_textwidget) TRUE
  5745.     set SaNW_info(showvalue) $show
  5746.     VxSetVar $returnform text $textfield
  5747.     VxSetVar $returnform label $textlabel 
  5748.     VxSetVar $returnform button $pushbutton
  5749.     return $returnform
  5750. }
  5751. proc SaSelectNWGetSelection {instance} {
  5752. global SaNW_selected
  5753.     if [info exists SaNW_selected($instance)] {
  5754.     return $SaNW_selected($instance)
  5755.     }
  5756.     return ""
  5757. }
  5758. #@package: SaSF SaFileBrowserDialog SaFileGetSelection SaFileExists SaFileIsDirectory SaFileGetAttr
  5759. proc SCO_SA_SELFILE_MSGS {} {}
  5760. global SCO_SA_SELFILE_MSGS
  5761. set SCO_SA_SELFILE_MSGS(@catalog@) {sysadm.cat@sa 27}
  5762. set SCO_SA_SELFILE_MSGS(ERR_MISSING_PARAMETER) {1 {A required parameter is missing.}}
  5763. set SCO_SA_SELFILE_MSGS(ERR_MISSING_PARENT) {2 {Programming error: name of parent dialog is missing.}}
  5764. set SCO_SA_SELFILE_MSGS(ERR_NULL) {3 {Nothing is selected.}}
  5765. set SCO_SA_SELFILE_MSGS(ERR_NONEXIST) {4 {File %s does not exist.}}
  5766. set SCO_SA_SELFILE_MSGS(ERR_GET_DIRLIST) {5 {Could not get list of directories in %s}}
  5767. set SCO_SA_SELFILE_MSGS(ERR_GET_FILELIST) {6 {Could not get list of files in %s}}
  5768. set SCO_SA_SELFILE_MSGS(ERR_GET_ATTR) {7 {Could not get attribute of %s}}
  5769. set SCO_SA_SELFILE_MSGS(MSG_TITLE) {8 {Select a File on %s}}
  5770. set SCO_SA_SELFILE_MSGS(MSG_DIRECTORIES) {9 Directories}
  5771. set SCO_SA_SELFILE_MSGS(MSG_FILES) {10 Files}
  5772. set SCO_SA_SELFILE_MSGS(MSG_SELECTION) {11 Selection:}
  5773. proc SaFileBrowserDialog {arglist {cbs {}} } {
  5774.     set parent ""
  5775.     if { $cbs != "" } {
  5776.     set parent [keylget cbs dialog]
  5777.     }
  5778.     if { $parent == "" && [keylget arglist parent parent] == 0} {
  5779.     ErrorPush errorStack 1 SCO_SA_SELFILE_ERR_MISSING_PARENT 
  5780.         return
  5781.     }
  5782.     if {[keylget arglist host host] == 0} {
  5783.     set host localhost
  5784.     }
  5785.     if {[keylget arglist path path] == 0} {
  5786.     set path "/"
  5787.     }
  5788.     if {[keylget arglist title title] == 0} {
  5789.     set title [IntlLocalizeMsg SCO_SA_SELFILE_MSG_TITLE $host]
  5790.     }
  5791.     if {[keylget arglist autodestroy autodestroy] == 0 ||
  5792.     [lsearch [list 0 1 true false] $autodestroy] == -1 } { 
  5793.     set autodestroy 1 
  5794.     }
  5795.     if {[keylget arglist userproc userproc] == 0} {
  5796.     set userproc {}
  5797.     }
  5798.     if {[keylget arglist userdata userdata] == 0} {
  5799.         set hasUserData 0
  5800.     set userdata {}
  5801.     } else {
  5802.     set hasUserData 1
  5803.     }
  5804.     if { $path == "" || [string match "* *" $path] } { 
  5805.     set path "/"
  5806.     } else { 
  5807.         if { [catch "SaFileExists $host $path" result] || $result == 0 } {
  5808.         set path "/"
  5809.     }
  5810.     }
  5811.     if { ! [SaFileIsDirectory $host $path] } {
  5812.         set path [crange $path 0 [string last "/" $path]] 
  5813.     }
  5814.     if { [cindex $path end] != "/" } {
  5815.     set path $path/
  5816.     }
  5817.     set form \
  5818.         [VtFormDialog $parent.selectDirForm \
  5819.     -wmShadowThickness 0 \
  5820.     -title $title \
  5821.     -ok \
  5822.     -okCallback \
  5823.        [list SaSF:SelectionCB $userproc $userdata $autodestroy] \
  5824.     -cancelButton CANCEL -cancelCallback VxEndFormCB \
  5825.      -help] 
  5826.     SaCharmSetMaxFormDimensions $form 1
  5827.     set dirlist \
  5828.         [VxList $form.dirlist \
  5829.     -autoSelect 1 \
  5830.     -selection SINGLE \
  5831.     -title [IntlLocalizeMsg SCO_SA_SELFILE_MSG_DIRECTORIES] \
  5832.     -rows 8 \
  5833.     -MOTIF_columns 15 \
  5834.     -CHARM_columns 30 \
  5835.     -scrollBar true \
  5836.     -leftSide FORM \
  5837.     -callback SaSF:dirlistCB \
  5838.     -MOTIF_defaultCallback SaSF:dirlistCB]
  5839.     set dirlistForm [VxGetVar $dirlist form]
  5840.     set filelist \
  5841.         [VxList $form.filelist \
  5842.     -selection SINGLE \
  5843.     -title [IntlLocalizeMsg SCO_SA_SELFILE_MSG_FILES] \
  5844.     -rows 8 \
  5845.     -scrollBar true \
  5846.     -leftSide $dirlistForm \
  5847.     -alignTop $dirlistForm \
  5848.     -rightSide FORM \
  5849.     -callback SaSF:filelistCB \
  5850.     -MOTIF_defaultCallback SaSF:filelistCB]
  5851.     set dirtext \
  5852.         [VxText $form.dirtext \
  5853.     -topSide $dirlistForm \
  5854.     -title [IntlLocalizeMsg SCO_SA_SELFILE_MSG_SELECTION] \
  5855.     -leftSide FORM \
  5856.     -rightSide FORM \
  5857.     -horizontalScrollBar true \
  5858.     -value $path \
  5859.     -callback SaSF:dirtextCB]
  5860.     VxSetVar $form dirtext $dirtext
  5861.     VxSetVar $form dirlist $dirlist
  5862.     VxSetVar $form filelist $filelist
  5863.     VxSetVar $form managedHost $host
  5864.     VxSetVar $form hasUserData $hasUserData
  5865.     SaSF:UpdateBrowser $path $form 
  5866.     VtShow $form
  5867.     VtSetFocus $dirlist
  5868.     VtUnLock
  5869.     return $form
  5870. }
  5871. proc SaFileGetSelection {dialog} {
  5872.     global SaSF_info
  5873.     if [info exists SaSF_info($dialog)] {
  5874.         return $SaSF_info($dialog)
  5875.     }
  5876. }
  5877. proc SaFileExists { host file } {
  5878.     set instanceList [SaSF:GetInstanceList $file $host]
  5879.     set command "ObjectGet {sco file} [list $instanceList] {type}"
  5880.     set result [SaSF:RunObjectCommand $command]
  5881.     set result [lindex $result 0]
  5882.     if { [BmipResponseErrorIsPresent result] } {
  5883.         return 0
  5884.     }
  5885.     set attr [BmipResponseAttrValList result]
  5886.     set type [keylget attr type]
  5887.     if { $type != "file" && $type != "directory" } {
  5888.         return 0
  5889.     }
  5890.     return 1
  5891. }
  5892. proc SaFileIsDirectory { host dir } {
  5893.     set instanceList [SaSF:GetInstanceList $dir $host]
  5894.     set command "ObjectGet {sco file} [list $instanceList] {type}"
  5895.     set result [SaSF:RunObjectCommand $command]
  5896.     set result [lindex $result 0]
  5897.     if { [BmipResponseErrorIsPresent result] } {
  5898.         return 0
  5899.     }
  5900.     set attr [BmipResponseAttrValList result]
  5901.     set type [keylget attr type]
  5902.     if { $type == "directory" } {
  5903.         return 1
  5904.     }
  5905.     return 0
  5906. }
  5907. proc SaFileGetAttr {host path {attr {}}} {
  5908.         set class    [list sco file]
  5909.         set instance [SaSF:GetInstanceList $path $host]
  5910.         set command [list ObjectGet $class $instance $attr]
  5911.         VtLock
  5912.         set result [SaMakeObjectCall $command]
  5913.         VtUnLock
  5914.         set result [lindex $result 0]
  5915.         if { [BmipResponseErrorIsPresent result] } {
  5916.                 set errorStack [BmipResponseErrorStack result]
  5917.             ErrorPush errorStack 1 SCO_SA_SELFILE_ERR_GET_ATTR $path
  5918.                 return {}
  5919.         }
  5920.         set retVal [BmipResponseAttrValList result]
  5921.         return $retVal
  5922. }
  5923. proc SaSF:SelectionCB {userproc userdata autodestroy cbs} {
  5924.     global SaSF_info
  5925.     set dialog [keylget cbs dialog]
  5926.     set textfield [VxGetVar $dialog dirtext]
  5927.     set value [VtGetValues $textfield -value]
  5928.     set SaSF_info($dialog) $value
  5929.     if { $value == "" } {
  5930.     VtShow [VtErrorDialog $dialog.nohost \
  5931.         -ok \
  5932.         -message [IntlLocalizeMsg SCO_SA_SELFILE_ERR_NULL]]
  5933.     return
  5934.     } else {
  5935.     if {![lempty $userproc]} {
  5936.         if { [VxGetVar $dialog hasUserData] } {
  5937.         lappend userproc $value $userdata $cbs
  5938.         } else {
  5939.         lappend userproc $value $cbs
  5940.         }
  5941.         eval "$userproc"
  5942.     }
  5943.     }
  5944.     if { $autodestroy } {
  5945.     VtDestroyDialog $dialog
  5946.     }
  5947. }
  5948. proc SaSF:RunObjectCommand {cmd} {
  5949.     VtLock
  5950.     set objresult [SaMakeObjectCall $cmd]
  5951.     VtUnLock -once
  5952.     return $objresult
  5953. }
  5954. proc SaSF:OCGetDirList {host dir} {
  5955.     set instanceList [SaSF:GetInstanceList $dir $host]
  5956.     set command "ObjectAction {sco directory} \
  5957.                 [list $instanceList] {listDirs} {}"
  5958.     set result [SaSF:RunObjectCommand $command]
  5959.     set result [lindex $result 0]
  5960.     if { [BmipResponseErrorIsPresent result] } {
  5961.         set errorStack [BmipResponseErrorStack result]
  5962.         ErrorPush errorStack 1 SCO_SA_SELFILE_ERR_GET_DIRLIST $dir
  5963.     }
  5964.     set result [BmipResponseActionInfo result]
  5965.     set result [lsort $result]
  5966.     if { $dir == "/" } {
  5967.         set list {}
  5968.     } else {
  5969.         set list {../}
  5970.     }
  5971.     foreach name $result {
  5972.         lappend list "./$name/"
  5973.     }
  5974.     return $list
  5975. }
  5976. proc SaSF:OCGetFileList {host dir} {
  5977.     set instanceList [SaSF:GetInstanceList $dir $host]
  5978.     set command "ObjectAction {sco directory} \
  5979.                  [list $instanceList] {listRegFiles} {}"
  5980.     set result [SaSF:RunObjectCommand $command]
  5981.     set result [lindex $result 0]
  5982.     if { [BmipResponseErrorIsPresent result] } {
  5983.         set errorStack [BmipResponseErrorStack result]
  5984.         ErrorPush errorStack 1 SCO_SA_SELFILE_ERR_GET_FILELIST $dir
  5985.     }
  5986.     set list [BmipResponseActionInfo result]
  5987.     set list [lsort $list]
  5988.     return $list
  5989. }
  5990. proc SaSF:dirlistCB {cbs} {
  5991.     set dirlist [keylget cbs widget]
  5992.     set dialog [keylget cbs dialog]
  5993.     set dirtext [VxGetVar $dialog dirtext]
  5994.     set oldvalue [VtGetValues $dirtext -value]
  5995.     set selection [VtListGetSelectedItem $dirlist -byItemList]
  5996.     if { $selection == "" || $selection == "./" } {
  5997.     return
  5998.     }
  5999.     if { $selection == "../" } {
  6000.     set index [string last "/" $oldvalue]
  6001.     set value1 [crange $oldvalue 0 [expr $index-1]]
  6002.     set newvalue [crange $value1 0 [string last "/" $value1]]
  6003.     } else {
  6004.     set selection [crange $selection 2 end]
  6005.         append newvalue $oldvalue $selection 
  6006.     }
  6007.     VtSetValues $dirtext -value $newvalue 
  6008.     SaSF:UpdateBrowser $newvalue $dialog
  6009. }
  6010. proc SaSF:filelistCB {cbs} {
  6011.     set filelist [keylget cbs widget]
  6012.     set selection [VtListGetSelectedItem $filelist -byItemList]
  6013.     if { $selection == "" } {
  6014.     return
  6015.     }
  6016.     set dialog [keylget cbs dialog]
  6017.     set dirtext [VxGetVar $dialog dirtext]
  6018.     set value [VtGetValues $dirtext -value]
  6019.     set value $value$selection
  6020.     VtSetValues $dirtext -value $value
  6021.     VtSetFocus $dirtext
  6022. }
  6023. proc SaSF:dirtextCB {cbs} {
  6024.     set dirtext [keylget cbs widget]
  6025.     set dialog [keylget cbs dialog]
  6026.     set dir [keylget cbs value]
  6027.     set host [VxGetVar $dialog managedHost]
  6028.     if { [SaFileIsDirectory $host $dir] } {
  6029.     if { [crange $dir end end] != "/" } {
  6030.         VtSetValues $dirtext -value $dir/
  6031.      }
  6032.     SaSF:UpdateBrowser $dir $dialog
  6033.     }
  6034.     VtSetFocus [VtGetValues $dialog -ok]
  6035. }
  6036. proc SaSF:UpdateBrowser { dir dialog } {
  6037.     set host [VxGetVar $dialog managedHost]
  6038.     set dirlist [VxGetVar $dialog dirlist]
  6039.     if {[ErrorCatch errStack 0 "SaSF:OCGetDirList $host $dir" items]} {
  6040.     SaDisplayErrorStacks $dialog.error [list $errStack] HELP
  6041.     return
  6042.     } 
  6043.     VtListSetItem $dirlist -itemList $items
  6044.     set filelist [VxGetVar $dialog filelist]
  6045.     if {[ErrorCatch errStack 0 "SaSF:OCGetFileList $host $dir" items]} {
  6046.     SaDisplayErrorStacks $dialog.error [list $errStack] HELP
  6047.     return
  6048.     } 
  6049.     VtListSetItem $filelist -itemList $items
  6050. }
  6051. proc SaSF:GetInstanceList { names host } {
  6052.     set instanceList {}
  6053.     if { $host == "localhost" } {
  6054.         foreach name $names {
  6055.             set instance [list $name]
  6056.             lappend instanceList $instance
  6057.         }
  6058.     } else {
  6059.         foreach name $names {
  6060.             set instance [list [list systemId $host] [list $name]]
  6061.             lappend instanceList $instance
  6062.         }
  6063.     }
  6064.     return $instanceList
  6065. }
  6066. #@packend: SaSF
  6067. #@package: SaAF SaAlignedForm
  6068. proc SaAlignedForm { wname dataList } {
  6069.     set newDataList {}
  6070.     foreach list $dataList {
  6071.         set labelList [lindex $list 0]
  6072.         set wlist [lindex $list 1]
  6073.         set label [eval IntlLocalizeMsg $labelList]
  6074.         lappend newDataList [list $label $wlist]
  6075.     }
  6076.     return [WxAlignedForm $wname $newDataList]
  6077. }
  6078. #@packend: SaAF
  6079. #@package: SCO_SA_MISC_MSGS SCO_SA_MISC_MSGS
  6080. proc SCO_SA_MISC_MSGS {} {}
  6081. global SCO_SA_MISC_MSGS
  6082. set SCO_SA_MISC_MSGS(@catalog@) {sysadm.cat@sa 22}
  6083. set SCO_SA_MISC_MSGS(ERR_SCOPRINT) {1 {Error encountered while executing '%s.'}}
  6084. set SCO_SA_MISC_MSGS(ERR_GETVERS) {2 {unknown version}}
  6085. #@package: SaCharmMaxForm  SaCharmSetMaxFormDimensions
  6086. proc SaCharmSetMaxFormDimensions {form {secondary 0}} {
  6087.     if {![VtInfo -charm]} {
  6088.         return
  6089.     }
  6090.     set incr -2
  6091.     set displayWidth [VtInfo -displayWidth]
  6092.     incr displayWidth $incr
  6093.     set displayHeight [VtInfo -displayHeight]
  6094.     if {$secondary} {
  6095.         set incr -4
  6096.     }
  6097.     incr displayHeight $incr
  6098.     VtSetValues $form \
  6099.             -CHARM_height $displayHeight \
  6100.             -CHARM_width $displayWidth \
  6101.             -CHARM_resizable 0 
  6102.     return $form
  6103. }
  6104. #@packend
  6105. #@package: SaHelp  SaHelpGetOptionsList
  6106. proc SaHelpGetOptionsList {} {
  6107.     return [list ON_CONTEXT ON_WINDOW ON_KEYS INDEX ON_HELP ON_VERSION]
  6108. }
  6109. #@packend
  6110. #@package: SaList SaListShowSelectedItem SaDrawnListShowSelectedItem 
  6111. proc SaDrawnListShowSelectedItem {list {forcetop 0}} {
  6112.     SaListShowSelectedItem $list $forcetop "Drawn"
  6113. }
  6114. proc SaListShowSelectedItem {list {forcetop 0} {drawn ""}} {
  6115.     if {$drawn != ""} {
  6116.         set drawn Drawn
  6117.     }
  6118.     set selected \
  6119.             [lindex [Vt${drawn}ListGetSelectedItem $list -byPositionList] 0]
  6120.     if {[lempty $selected]} {return}
  6121.     set rows [VtGetValues $list -rows]
  6122.     set top [VtGetValues $list -topItemPosition]
  6123.     set count [llength [Vt${drawn}ListGetItem $list -all]]
  6124.     if {[expr "$selected - $top"] < 0} {
  6125.         VtSetValues $list -topItemPosition $selected
  6126.     } elseif {[expr "$selected - $top"] < $rows} {
  6127.         if {$forcetop} {
  6128.                 VtSetValues $list -topItemPosition $selected
  6129.         }
  6130.     } elseif {[expr "$count - $selected"] >= $rows} {
  6131.         if {$forcetop} {
  6132.                 VtSetValues $list -topItemPosition $selected
  6133.         } else {
  6134.                 set selected [expr "$selected - $rows + 1"]
  6135.                 VtSetValues $list -topItemPosition $selected
  6136.         }
  6137.     } else {
  6138.         VtSetValues $list -topItemPosition [expr "$count - $rows + 1"]
  6139.     }
  6140. }
  6141. #@packend
  6142. #@package: SaPrint SaPrint SaPrintSetup SaPrintGetPrinterName
  6143. proc SaPrint {icon {file {}} {option {}}} {
  6144.     global saPrint_exe
  6145.     set saPrint_exe    "/usr/X/bin/scoprint"
  6146.     VtLock
  6147.     case $option {
  6148.         printerName { 
  6149.             set saPrint_exe "/usr/bin/lpstat"
  6150.             lappend args "-d"
  6151.         }
  6152.         setup {
  6153.             if {[VtInfo -charm]} {
  6154.                 VtUnLock; return
  6155.             }
  6156.         }
  6157.         default {
  6158.             if {![lempty $file]} {
  6159.                 lappend args $file
  6160.             } else {
  6161.                 if {[VtInfo -charm]} {
  6162.                     VtUnLock; return
  6163.                 }
  6164.             }
  6165.         }
  6166.     }
  6167.     if {[VtInfo -charm]} {
  6168.         VtUnLock
  6169.     }
  6170.     if {[ErrorCatch errorStack 0 \
  6171.         [list CallNonStdCmd $saPrint_exe $args \
  6172.             SCO_NONSTD_CMDS_ERR_scoprint] \
  6173.         res] != 0 } {
  6174.         VtUnLock
  6175.         ErrorPush errorStack 1 SCO_SA_MISC_ERR_SCOPRINT [list $saPrint_exe]
  6176.     }
  6177.     if { $option == "printerName" } {
  6178.         set max [llength $res]
  6179.         set res [lindex $res [expr $max-1]]
  6180.     }
  6181.     VtUnLock
  6182.     return $res
  6183. }
  6184. proc SaPrintSetup {icon} {
  6185.     SaPrint $icon {} setup
  6186. }
  6187. proc SaPrintGetPrinterName {icon} {
  6188.     return [SaPrint $icon {} default]
  6189. }
  6190. #@packend
  6191. #@package: SaFocus SaSetFocus SaSetTabGroups  SaSetFocusList
  6192. proc SaSetFocusList {form list} {
  6193.     VxSetVar $form focusList $list
  6194. }
  6195. proc SaSetFocus { widget cbs } {
  6196.     if {[keylget cbs mode mode] != 0} {
  6197.         if {$mode != "done"} {
  6198.         return
  6199.         }
  6200.     } else {
  6201.     return
  6202.     }
  6203.     if { $widget != "next" } {
  6204.     VtSetFocus $widget
  6205.      return
  6206.     }
  6207.     set currentWidget [keylget cbs widget]
  6208.     set dialog [keylget cbs dialog]
  6209.     set catchvalue [catch "VxGetVar $currentWidget focusParent" parentWidget]
  6210.     if {$catchvalue == 0 && ![lempty $parentWidget]} {
  6211.     set currentWidget $parentWidget
  6212.     }
  6213.     if {[catch "VxGetVar $dialog focusList" focusList] || [lempty $focusList]} {
  6214.         return
  6215.     }
  6216.     set index [lsearch $focusList $currentWidget]
  6217.     if { $index == -1 } {
  6218.     return
  6219.     } 
  6220.     incr index
  6221.     if { $index >= [llength $focusList] } {
  6222.         set index 0
  6223.     }
  6224.     VtSetFocus [lindex $focusList $index]
  6225. }
  6226. proc SaSetTabGroups { form tabgroups } {
  6227.     VtRemoveAllTabGroups $form
  6228.     foreach widget $tabgroups {
  6229.     VtAddTabGroup $widget
  6230.     }
  6231. }
  6232. #@packend
  6233. #@package: SaSystem SaRunLevelGet SaRunLevelIsSingleUser SaGetSSOVersion SaGetLocale
  6234. proc SaRunLevelGet {} {
  6235.     set result [CallNonStdCmd /bin/who -r SCO_NONSTD_CMDS_ERR_who]
  6236.     set level [lindex $result 2]
  6237.     return $level
  6238. }
  6239. proc SaRunLevelIsSingleUser {} {
  6240.     set level [SaRunLevelGet]
  6241.     case $level in {
  6242.       {S s 1} {return 1}
  6243.       default {return 0}
  6244.     }
  6245. }
  6246. proc SaGetSSOVersion {{patchArea 0}} {
  6247.     set release [CallNonStdCmd uname {-r} "" errStack]
  6248.     if { [cequal $release "4.2MP"] || $release  >= 5} {
  6249.         set cmd [list exec /bin/pkginfo -x scoadmin]
  6250.         if { [catch $cmd retval] } {
  6251.             set retval [IntlLocalizeMsg SCO_SA_MISC_ERR_GETVERS]
  6252.             return $retval
  6253.         } else {
  6254.             return [lindex $retval end]
  6255.         }
  6256.     } else {
  6257.         if {$patchArea == 0} {
  6258.             set cmd [list exec /bin/pkginfo -x scoadmin]
  6259.             if { [catch $cmd retval] } {
  6260.                 set retval [IntlLocalizeMsg SCO_SA_MISC_ERR_GETVERS]
  6261.                 return $retval
  6262.             } else {
  6263.                 return [lindex $retval end]
  6264.             }
  6265.         } else {
  6266.             return [file tail [SSO_GetSegmentRootPath SHARED $patchArea]]
  6267.         }
  6268.     }
  6269. }
  6270. proc SaGetLocale {} {
  6271.     global env
  6272.     if { [info exists env(LANG)] } {
  6273.         return $env(LANG)
  6274.     } else {
  6275.         set locale [SaSystem:ReadDefaultLangFile]
  6276.                 if { $locale == "" } {
  6277.             set locale en_US
  6278.         }
  6279.         return $locale
  6280.     }
  6281. }
  6282. proc SaSystem:ReadDefaultLangFile {} {
  6283.     set filename "/etc/default/lang"
  6284.     if { [file exists $filename] && [file readable $filename] } {
  6285.         set fileid [open $filename r]
  6286.         while { [gets $fileid line] != -1 } {
  6287.             if { [string match "LANG=*" $line] == 1 } {
  6288.                 set locale [crange $line 5 end]
  6289.                 set locale [string trimright $locale]
  6290.                 break
  6291.             }
  6292.         }
  6293.         close $fileid
  6294.         return $locale
  6295.     } else {
  6296.         return  ""
  6297.     }
  6298. }
  6299. #@packend
  6300. #@package: SaAccount  SaUsersGet SaGetPwEnts SaGroupsGet
  6301. proc SaUsersGet {{host localhost}} {
  6302.     set userlist {}
  6303.     if {$host == "localhost"} {
  6304.         set instance [SaHostGetLocalName]
  6305.     } else {
  6306.         set instance [list [list [list systemId $host] $host]]
  6307.     }
  6308.     set call [list \
  6309.         ObjectGet -scope 1 {sco users} \
  6310.         $instance \
  6311.         {pw_name}]
  6312.     set bmipResponse [SaMakeObjectCall $call]
  6313.     set firstBmip [lindex $bmipResponse 0]
  6314.         set errorStack [BmipResponseErrorStack firstBmip]
  6315.         if { ![lempty $errorStack] } {
  6316.         ErrorThrow errorStack
  6317.     } else {
  6318.         foreach item $bmipResponse {
  6319.             set attrval [BmipResponseAttrValList item]
  6320.             lappend userlist [keylget attrval pw_name]
  6321.         }
  6322.     }
  6323.     return [lsort $userlist]
  6324. }
  6325. proc SaGetPwEnts {{host localhost}} {
  6326.     set userlist {}
  6327.     if {$host == "localhost"} {
  6328.         set instance [SaHostGetLocalName]
  6329.     } else {
  6330.         set instance [list [list [list systemId $host] $host]]
  6331.     }
  6332.     set call [list \
  6333.         ObjectGet -scope 1 {sco users} \
  6334.         $instance \
  6335.         {pw_name pw_uid pw_gid pw_dir pw_shell}]
  6336.     set bmipResponse [SaMakeObjectCall $call]
  6337.     set firstBmip [lindex $bmipResponse 0]
  6338.         set errorStack [BmipResponseErrorStack firstBmip]
  6339.         if { ![lempty $errorStack] } {
  6340.         ErrorThrow errorStack
  6341.     } else {
  6342.         foreach item $bmipResponse {
  6343.             set attrval [BmipResponseAttrValList item]
  6344.             set pw_name [keylget attrval pw_name]
  6345.             keylset userlist $pw_name $attrval
  6346.         }
  6347.     }
  6348.     return $userlist
  6349. }
  6350. proc SaGroupsGet {{host localhost}} {
  6351.     set grouplist {}
  6352.     if {$host == "localhost"} {
  6353.         set instance [SaHostGetLocalName]
  6354.     } else {
  6355.         set instance [list [list [list systemId $host] $host]] 
  6356.     }
  6357.     set call [list \
  6358.         ObjectGet -scope 1 {sco groups} \
  6359.         $instance \
  6360.         {gr_name}]
  6361.     set bmipResponse [SaMakeObjectCall $call]
  6362.     set firstBmip [lindex $bmipResponse 0]
  6363.         set errorStack [BmipResponseErrorStack firstBmip]
  6364.         if { ![lempty $errorStack] } {
  6365.         ErrorThrow errorStack
  6366.     } else {
  6367.         foreach item $bmipResponse {
  6368.             set attrval [BmipResponseAttrValList item]
  6369.             lappend grouplist [keylget attrval gr_name]
  6370.         }
  6371.     }
  6372.     return [lsort $grouplist]
  6373. }
  6374. #@packend
  6375. #@package: SaPrinter  SaPrintersGet SaPrinterGetDefault SaPrinterGetClasses SaPrinterGetQueues
  6376. proc SaPrintersGet {} {
  6377.     set printerlist {}
  6378.     set curdir [pwd]
  6379.     cd /usr/spool/lp/admins/lp/printers
  6380.     if {[catch "glob *" printerlist] } {
  6381.         set printerlist {}
  6382.     }
  6383.     cd $curdir
  6384.     return $printerlist
  6385. }
  6386. proc SaPrinterGetDefault {} {
  6387.     set default {}
  6388.     if {[info exists env(LPDEST)]} {
  6389.         set default $env(LPDEST)
  6390.         return $default
  6391.     } elseif {[catch "open /usr/spool/lp/admins/lp/default r" fd]} {
  6392.         return $default
  6393.     } else {
  6394.         set default [read -nonewline $fd]
  6395.         close $fd
  6396.         return $default
  6397.     }
  6398. }
  6399. proc SaPrinterGetClasses {} {
  6400.     set curdir [pwd]
  6401.     cd /usr/spool/lp/admins/lp/classes
  6402.     if {[catch "glob *" classlist] } {
  6403.         set classlist {}
  6404.     }
  6405.     cd $curdir
  6406.     return $classlist
  6407. }
  6408. proc SaPrinterGetQueues {} {
  6409.     return [concat [SaPrintersGet] [SaPrinterGetClasses]]
  6410. }
  6411. #@packend
  6412.