Module seq_chnl.pkg

     1//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
     2// Confidential Trade Secret.
     3// Copyright 1987-1994 Data Access Corporation, Miami FL, USA
     4// All Rights reserved
     5// DataFlex is a registered trademark of Data Access Corporation.
     6//
     7// Module:
     8//      seq_chnl.pkg
     9//
    10// Purpose:
    11//      Defines global sequential device management operations.
    12//
    13// Author:
    14//      Lee Smith
    15//
    16// Date:
    17//      11/2/94
    18//
    19//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    20// 12/13/2001 JJT: If channel not open, don't declare error during close
    21//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    22Use LanguageText.pkg
    23use VDFBase.pkg
    24#INCLUDE errornum.inc
    25
    26define DF_SEQ_CHANNEL_NOT_AVAILABLE for -2
    27define DF_SEQ_CHANNEL_ERROR         for -1
    28define DF_SEQ_CHANNEL_MIN           for 0
    29define DF_SEQ_CHANNEL_MAX           for 9
    30define DF_SEQ_START_CHANNEL         for 2 // leave 0 and 1 til last
    31                            // so that programs that use direct_input/output
    32                            // w/o specifying a channel will work.
    33enum_list
    34    define DF_SEQ_CHANNEL_MODE_CLOSED
    35    define DF_SEQ_CHANNEL_MODE_OPEN
    36    define DF_SEQ_CHANNEL_MODE_OUTPUT
    37    define DF_SEQ_CHANNEL_MODE_INPUT
    38end_enum_list
    39
    40enum_list
    41    define DF_SEQ_CHANNEL_ERROR_MODE_NONE
    42    define DF_SEQ_CHANNEL_ERROR_MODE_ALL
    43end_enum_list
    44
    45integer Seq$Channel$Error$Mode
    46
    47{ Visibility=Private }
    48procedure set Seq_Channel_Error_Mode GLOBAL integer Mode
    49    move Mode to Seq$Channel$Error$Mode
    50end_procedure
    51
    52{ Visibility=Private }
    53function Seq_Channel_Error_Mode GLOBAL returns integer
    54    function_return Seq$Channel$Error$Mode
    55end_procedure
    56
    57object Seq_Channel_List is an Array
    58    procedure Initialize
    59        integer Itm
    60
    61        move DF_SEQ_CHANNEL_MIN to Itm
    62
    63        while Itm LE DF_SEQ_CHANNEL_MAX
    64            set Array_Value item Itm to DF_SEQ_CHANNEL_MODE_CLOSED
    65            increment Itm
    66        end
    67    end_procedure
    68
    69    send Initialize
    70end_object
    71
    72set Seq_Channel_Error_Mode to DF_SEQ_CHANNEL_ERROR_MODE_ALL
    73
    74{ Visibility=Private }
    75function Seq_Channel_Mode GLOBAL integer Chnl returns integer
    76    function_return (Integer_Value(Seq_Channel_List(self), Chnl))
    77end_function
    78
    79{ Visibility=Private }
    80procedure set Seq_Channel_Mode GLOBAL integer Chnl integer Mode
    81    set Array_Value of (Seq_Channel_List(self)) item Chnl to Mode
    82end_procedure
    83
    84function Seq_New_Channel GLOBAL returns integer
    85    integer Obj Chnl
    86
    87    move DF_SEQ_START_CHANNEL to Chnl
    88
    89    while Chnl LE DF_SEQ_CHANNEL_MAX
    90        if (Seq_Channel_Mode(Chnl)) EQ DF_SEQ_CHANNEL_MODE_CLOSED begin
    91            set Seq_Channel_Mode Chnl to DF_SEQ_CHANNEL_MODE_OPEN
    92            function_return Chnl
    93        end
    94
    95        increment Chnl
    96    end
    97
    98    // wrap back to beginning
    99    move 0 to Chnl
   100
   101    while Chnl LT DF_SEQ_START_CHANNEL
   102        if (Seq_Channel_Mode(Chnl)) EQ DF_SEQ_CHANNEL_MODE_CLOSED begin
   103            set Seq_Channel_Mode Chnl to DF_SEQ_CHANNEL_MODE_OPEN
   104            function_return Chnl
   105        end
   106
   107        increment Chnl
   108    end
   109
   110    function_return DF_SEQ_CHANNEL_NOT_AVAILABLE
   111end_procedure
   112
   113procedure Seq_Release_Channel GLOBAL integer Chnl
   114    if ((Chnl >= DF_SEQ_CHANNEL_MIN) and (Chnl <= DF_SEQ_CHANNEL_MAX)) ;
   115        set Seq_Channel_Mode Chnl to DF_SEQ_CHANNEL_MODE_CLOSED
   116end_procedure
   117
   118{ Visibility=Private }
   119function Seq_Open_Input_Channel GLOBAL string Dvc returns integer
   120    integer Chnl
   121
   122    get Seq_New_Channel to Chnl
   123
   124    if Chnl LE DF_SEQ_CHANNEL_ERROR begin
   125        if (Seq_Channel_Error_Mode()) EQ DF_SEQ_CHANNEL_ERROR_MODE_ALL ;
   126            error DFERR_CANT_OPEN_INPUT_FILE (Dvc + ":" *C_$NoOpenChannels)
   127        function_return Chnl
   128    end
   129
   130    indicate Err FALSE
   131    direct_input channel Chnl Dvc
   132
   133    [Err] begin
   134        send Seq_Release_Channel Chnl
   135        function_return DF_SEQ_CHANNEL_ERROR
   136    end
   137
   138    set Seq_Channel_Mode Chnl to DF_SEQ_CHANNEL_MODE_INPUT
   139
   140    function_return Chnl
   141end_function
   142
   143{ Visibility=Private }
   144function Seq_Open_Output_Channel GLOBAL string Dvc returns integer
   145    integer Chnl
   146
   147    get Seq_New_Channel to Chnl
   148
   149    if Chnl LE DF_SEQ_CHANNEL_ERROR begin
   150        if (Seq_Channel_Error_Mode()) EQ DF_SEQ_CHANNEL_ERROR_MODE_ALL begin
   151            error DFERR_CANT_OPEN_OUTPUT_FILE (Dvc + ":" *C_$ChannelNotAvailable)
   152            move DF_SEQ_CHANNEL_ERROR to Chnl
   153        end
   154
   155        function_return Chnl
   156    end
   157
   158    indicate Err FALSE
   159    direct_output channel Chnl Dvc
   160
   161    [Err] begin
   162        send Seq_Release_Channel Chnl
   163        function_return DF_SEQ_CHANNEL_ERROR
   164    end
   165
   166    set Seq_Channel_Mode Chnl to DF_SEQ_CHANNEL_MODE_OUTPUT
   167
   168    function_return Chnl
   169end_function
   170
   171{ Visibility=Private }
   172function Seq_Append_Output_Channel GLOBAL string Dvc returns integer
   173    integer Chnl
   174
   175    get Seq_New_Channel to Chnl
   176
   177    if Chnl LE DF_SEQ_CHANNEL_ERROR begin
   178        if (Seq_Channel_Error_Mode()) EQ DF_SEQ_CHANNEL_ERROR_MODE_ALL begin
   179            error DFERR_CANT_OPEN_OUTPUT_FILE (Dvc + ":" *C_$ChannelNotAvailable)
   180            move DF_SEQ_CHANNEL_ERROR to Chnl
   181        end
   182
   183        function_return Chnl
   184    end
   185
   186    indicate Err FALSE
   187    append_output channel Chnl Dvc
   188
   189    [Err] begin
   190        send Seq_Release_Channel Chnl
   191        function_return DF_SEQ_CHANNEL_ERROR
   192    end
   193
   194    set Seq_Channel_Mode Chnl to DF_SEQ_CHANNEL_MODE_OUTPUT
   195
   196    function_return Chnl
   197end_function
   198
   199{ Visibility=Private }
   200procedure Seq_Close_Channel GLOBAL integer Chnl
   201    integer Mode
   202
   203    if ((Chnl >= DF_SEQ_CHANNEL_MIN) and (Chnl <= DF_SEQ_CHANNEL_MAX)) begin
   204        get Seq_Channel_Mode Chnl to Mode
   205
   206        if Mode EQ DF_SEQ_CHANNEL_MODE_OUTPUT ;
   207            close_output channel Chnl
   208        else if Mode EQ DF_SEQ_CHANNEL_MODE_INPUT ;
   209            close_input channel Chnl
   210        // 12/13/2001 - If channel not open, release it! No (fatal) Error.
   211        //else begin
   212        //    Error DFERR_FILE_NOT_OPEN ("Channel: " + string(Chnl))
   213        //    procedure_return
   214        //end
   215
   216        send Seq_Release_Channel Chnl
   217    end
   218end_procedure
   219