home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / utilities / utilsd / drawpersp / !DrawPersp / OLELib (.txt) < prev    next >
RISC OS BBC BASIC V Source  |  1995-02-02  |  6KB  |  138 lines

  1.  Module OLE
  2.  -----------------------------------------------------------------------
  3.  OLE Handling Routines
  4.  -----------------------------------------------------------------------
  5.  Public Methods Supported:
  6.    _shell_OLELibInit           Initialises module
  7.    shell_OLELinkFile           Sets up the OLE link for the specified file
  8.    shell_OLEDeLinkFile         Breaks the link to the file
  9.    shell_OLEScanLinkedFiles    Called during the null event poll
  10.    shell_OLEGetNrOfLinkedFiles Returns nr of files currently linked
  11.    shell_OLEInProgress         Returns TRUE if OLE in progress
  12.  REM Private Methods Supported:
  13.    None
  14. *|Start FN_shell_OLELibInit
  15. _shell_OLELibInit
  16.  Set up global constants for this module
  17. OLE_RecLength%   = 16
  18. OLE_EndOfData%   = -1
  19.  Set up global variables for this module
  20. G_OLE_DataBlock% = 0
  21. G_OLE_NrOfFiles% = 0
  22.  Format of data block is:
  23.    +00 ptr to filename
  24.    +04 ptr to FN name
  25.    +08 low word file datestamp
  26.    +12 hi  word file datestamp (not used at the moment)
  27.    ...
  28.    +nn
  29.    +nn
  30.    +nn
  31. *|Stop FN_shell_OLELibInit
  32. 0!*|Start PROCshell_OLELinkFile
  33. shell_OLELinkFile( file_name$, user_FN$ )
  34.  loc_newrecord%
  35.  G_OLE_DataBlock% = 0 
  36.  First time it has been called, so initialise OLE data block...
  37. 7@  G_OLE_DataBlock% = 
  38. shell_HeapBlockFetch( OLE_RecLength% )
  39.  Initialise data block (write end of data marker words)
  40. 9*  G_OLE_DataBlock%!00 = OLE_EndOfData%
  41. :*  G_OLE_DataBlock%!04 = OLE_EndOfData%
  42. ;*  G_OLE_DataBlock%!08 = OLE_EndOfData%
  43. <*  G_OLE_DataBlock%!12 = OLE_EndOfData%
  44.  First check that file to be linked actually exists..
  45. shell_FileExists( file_name$ ) 
  46.  Make space for new OLE data and write new data, terminating OLE data block
  47.  with 'end_of_data' marker words..
  48. ES  G_OLE_DataBlock% = 
  49. shell_HeapBlockExtend( G_OLE_DataBlock%, OLE_RecLength% )
  50. FQ  loc_newrecord%   = G_OLE_DataBlock% + ( G_OLE_NrOfFiles% * OLE_RecLength% )
  51. HE  loc_newrecord%!00 = 
  52. shell_HeapBlockFetch(
  53. ( file_name$ ) + 1 )
  54. IE  loc_newrecord%!04 = 
  55. shell_HeapBlockFetch(
  56. ( user_FN$   ) + 1 )
  57. J)  $( loc_newrecord%!00 ) = file_name$
  58. K'  $( loc_newrecord%!04 ) = user_FN$
  59. LD  loc_newrecord%!08      = 
  60. shell_FileGetDateStamp( file_name$ )
  61. M   loc_newrecord%!12      = 0
  62. O@  !( loc_newrecord% + OLE_RecLength% + 00 ) = OLE_EndOfData%
  63. P@  !( loc_newrecord% + OLE_RecLength% + 04 ) = OLE_EndOfData%
  64. Q@  !( loc_newrecord% + OLE_RecLength% + 08 ) = OLE_EndOfData%
  65. R@  !( loc_newrecord% + OLE_RecLength% + 12 ) = OLE_EndOfData%
  66.   G_OLE_NrOfFiles% += 1
  67.  99, "Unable to find file '" + file_name$ + "'"
  68. ^ *|Stop PROCshell_OLELinkFile
  69. b#*|Start PROCshell_OLEDeLinkFile
  70. shell_OLEDeLinkFile( file_name$ )
  71.  OLE_index%, curr_file_name$
  72. OLE_index%     = 0
  73. shell_FileExists( file_name$ ) 
  74. l:    curr_file_name$ = $( G_OLE_DataBlock%!OLE_index% )
  75. n(    
  76.  curr_file_name$ = file_name$ 
  77. pG      
  78. shell_HeapBlockReturn( G_OLE_DataBlock%!( OLE_index% + 00 ))
  79. qG      
  80. shell_HeapBlockReturn( G_OLE_DataBlock%!( OLE_index% + 04 ))
  81.       fix_ptr% = OLE_index%
  82.       
  83. wc        G_OLE_DataBlock%!( fix_ptr% + 00 ) = G_OLE_DataBlock%!( fix_ptr% + 00 + OLE_RecLength%)
  84. xc        G_OLE_DataBlock%!( fix_ptr% + 04 ) = G_OLE_DataBlock%!( fix_ptr% + 04 + OLE_RecLength%)
  85. yc        G_OLE_DataBlock%!( fix_ptr% + 08 ) = G_OLE_DataBlock%!( fix_ptr% + 08 + OLE_RecLength%)
  86. zc        G_OLE_DataBlock%!( fix_ptr% + 12 ) = G_OLE_DataBlock%!( fix_ptr% + 12 + OLE_RecLength%)
  87. |&        fix_ptr% += OLE_RecLength%
  88. ~6      
  89.  G_OLE_DataBlock%!fix_ptr% = OLE_EndOfData%
  90.       G_OLE_NrOfFiles% -= 1
  91. Y      G_OLE_DataBlock% = 
  92. shell_HeapBlockExtend( G_OLE_DataBlock%, - OLE_RecLength% )
  93.         
  94. $    OLE_index% += OLE_RecLength%
  95.  G_OLE_DataBlock%!OLE_index% = OLE_EndOfData%
  96. "*|Stop PROCshell_OLEDeLinkFile
  97. !*|Start FNshell_OLEFileStatus
  98. shell_OLEFileStatus( file_name$ )
  99.  *|Stop FNshell_OLEFileStatus
  100. (*|Start PROCshell_OLEScanLinkedFiles
  101. shell_OLEScanLinkedFiles
  102.  OLE_index%,  _file_name$, fn_name$, void%
  103.  new_date_stamp%, old_date_stamp%
  104.  Call a user defined FN if any of the files in the OLE 'watching'
  105.  list have changed their datestamp since the last time they
  106.  were scanned. This routine should be called every 1 or 2 seconds
  107.  by the PollIdle handler of a wimp application.
  108. OLE_index%     = 0
  109. shell_OLEInProgress 
  110.  G_OLE_DataBlock%!OLE_index% <> OLE_EndOfData%
  111. @    
  112.  Note '_file_name$' is used so that crunching the BASIC
  113. >    
  114.  program does not change the name of the variable (as
  115.      
  116.  it is EVALuated later)
  117. 6    _file_name$ = $( G_OLE_DataBlock%!OLE_index% )
  118. =    old_date_stamp% = G_OLE_DataBlock%!( OLE_index% + 8 )
  119. @    new_date_stamp% = 
  120. shell_FileGetDateStamp( _file_name$ )
  121. .    
  122.  new_date_stamp% <> old_date_stamp% 
  123. ?      G_OLE_DataBlock%!( OLE_index% + 8 ) = new_date_stamp%
  124. =      fn_name$ = $( G_OLE_DataBlock%!( OLE_index% + 4 ) )
  125. 9      void% = 
  126. ( "FN" + fn_name$ + "( _file_name$ )")
  127.         
  128. $    OLE_index% += OLE_RecLength%
  129. '*|Stop PROCshell_OLEScanLinkedFiles
  130. )*|Start FNshell_OLEGetNrOfLinkedFiles
  131. shell_OLEGetNrOfLinkedFiles
  132. = G_OLE_NrOfFiles%
  133. (*|Stop FNshell_OLEGetNrOfLinkedFiles
  134. !*|Start FNshell_OLEInProgress
  135. shell_OLEInProgress
  136.  G_OLE_NrOfFiles% > 0 
  137.  *|Stop FNshell_OLEInProgress
  138.