/****************************************************************************
  module      : vkb96
  author      : JuergenA
  responsible : UweH
  special area: Servertaskhandling
  see also    :
  description : KB_send_rcv_buf_handling
 
    ========== licence begin  GPL
    Copyright (c) 2001-2004 SAP AG
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end
 
*****************************************************************************/
 
.tt 1 $SAP$LiveCache$VKB96$
.tt 3 $UweH$KB_send_rcv_buf_handling$2000-05-22$
 
Module  : KB_send_rcv_buf_handling
 
Define  :
 
        PROCEDURE
              k96clear_mdesc (VAR mdesc : tkb09_MessDesc);
 
        PROCEDURE
              k96errtext_from_mdesc (
                    mdesc           : tkb09_MessDescPtr;
                    VAR ErrTextLen  : tsp00_Int4;
                    VAR ErrTextType : tgg00_ErrorText;
                    VAR ErrText     : tsp00_ErrText;
                    VAR e           : tgg00_BasisError);
 
        PROCEDURE
              k96free_mdesc (
                    VAR MessCache : tkb09_MessCache;
                    VAR mdesc : tkb09_MessDescPtr);
 
        PROCEDURE
              k96free_messbody (
                    VAR MessCache : tkb09_MessCache;
                    VAR MessBody : tkb09_PtrMessBodyDesc);
 
        PROCEDURE
              k96move_from_mdesc (
                    VAR mblock  : tgg00_MessBlock;
                    SourceMdesc : tkb09_MessDescPtr);
 
        PROCEDURE
              k96new_mdesc (
                    VAR Trans         : tgg00_TransContext;
                    VAR MessCache     : tkb09_MessCache;
                    VAR mdesc         : tkb09_MessDescPtr;
                    ParentTaskId      : tsp00_TaskId);
 
        PROCEDURE
              k96to_mdesc_move (
                    VAR MessCache : tkb09_MessCache;
                    VAR mblock  : tgg00_MessBlock;
                    DestinMdesc : tkb09_MessDescPtr);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              Configuration_Parameter: VGG01;
 
        PROCEDURE
              g01opmsg (
                    msg_prio  : tsp3_priority;
                    msg_type  : tsp3_msg_type;
                    msg_no    : tsp00_Int4;
                    msg_label : tsp00_C8;
                    msg_text  : tsp00_C24;
                    msg_value : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              Regions_and_Longwaits : VGG08;
 
        VAR
              g08server : tsp00_RegionId;
&       ifdef TRACE
 
        PROCEDURE
              g08check_excl (region : tsp00_RegionId);
 
        PROCEDURE
              g08excl_check (
                    pid    : tsp00_TaskId;
                    region : tsp00_RegionId);
&       endif
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG101;
 
        PROCEDURE
              SAPDB_PascalMove (
                    mod_id      : tsp00_C6;
                    mod_num     : tsp00_Int4;
                    source_upb  : tsp00_Int4;
                    dest_upb    : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;
                    src_pos     : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;
                    dest_pos    : tsp00_Int4;
                    length      : tsp00_Int4;
                    VAR e       : tgg00_BasisError);
        PROCEDURE
              g10mv (
                    mod_id      : tsp00_C6;            
                    mod_num     : tsp00_Int4;
                    source_upb  : tsp00_Int4;          
                    dest_upb    : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;       
                    src_pos     : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;       
                    dest_pos    : tsp00_Int4;
                    length      : tsp00_Int4;
                    VAR e       : tgg00_BasisError);
 
&       ifdef TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01addr (
                    debug    : tgg00_Debug;
                    nam      : tsp00_Sname;
                    bufaddr  : tgg00_StackListPtr);
 
        PROCEDURE
              t01addr_1 (
                    debug      : tgg00_Debug;
                    nam        : tsp00_Sname;
                    bufaddr    : tkb09_PtrMessBodyDesc);
 
        PROCEDURE
              t01addr_2 (
                    debug      : tgg00_Debug;
                    nam        : tsp00_Sname;
                    bufaddr    : tkb09_MessDescPtr);
 
        PROCEDURE
              t01basis_error (
                    debug : tgg00_Debug;
                    nam   : tsp00_Sname;
                    b_err : tgg00_BasisError);
 
        PROCEDURE
              t01int4 (
                    debug : tgg00_Debug;
                    nam : tsp00_Sname;
                    int : tsp00_Int4);
 
        PROCEDURE
              t01p2int4 (
                    debug : tgg00_Debug;
                    nam_1 : tsp00_Sname;
                    int_1 : tsp00_Int4;
                    nam_2 : tsp00_Sname;
                    int_2 : tsp00_Int4);
 
        PROCEDURE
              t01moveobj (
                    debug       : tgg00_Debug;
                    VAR moveobj : tsp00_MoveObj;
                    startpos    : tsp00_Int4;
                    endpos      : tsp00_Int4);
&       endif
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
&       ifdef TRACE
        PROCEDURE
              t01addr;
 
              tsp00_BufAddr tgg00_StackListPtr
 
        PROCEDURE
              t01addr_1;
 
              tsp00_BufAddr tkb09_PtrMessBodyDesc
 
        PROCEDURE
              t01addr_2;
 
              tsp00_BufAddr tkb09_MessDescPtr
&             endif
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  :
.sp
.cp 3
Created : 1988-11-22
.sp
.cp 3
.sp
.cp 3
Release :      Date : 1999-10-11
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
.CM *-END-* specification -------------------------------
.sp 2
************************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
.CM *-END-* description ---------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:
 
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
.CM -lll-
Code    :
 
 
(* PTS 1104043 JA 1999-10-08 *)
(*------------------------------*) 
 
PROCEDURE
      k96clear_mdesc (VAR mdesc : tkb09_MessDesc);
 
BEGIN
WITH mdesc DO
    BEGIN
    mdMessBody_kb09     := NIL;
    mdNext_kb09         := NIL;
    mdTransferLen_kb09  := 0;
    mdParentTaskId_kb09 := cgg_nil_pid;
    mdCommState_kb09    := csFree_ekb09
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k96errtext_from_mdesc (
            mdesc           : tkb09_MessDescPtr;
            VAR ErrTextLen  : tsp00_Int4;
            VAR ErrTextType : tgg00_ErrorText;
            VAR ErrText     : tsp00_ErrText;
            VAR e           : tgg00_BasisError);
 
VAR
 
      ErrTypeMap : RECORD
            CASE integer OF
                1:
                    (e : tgg00_ErrorText);
                2:
                    (c : tsp00_C1)
                END;
            (*ENDCASE*) 
 
 
BEGIN
e := e_ok;
WITH mdesc^ DO
    BEGIN
    ErrTextLen := mdMessHead_kb09.mhMblock_kb09.mb_data_len - 1;
    IF  (ErrTextLen + 1 > mdTransferLen_kb09 - sizeof (mdMessHead_kb09))
        OR
        (ErrTextLen > sizeof (mdShortMessBuf_kb09))
    THEN
        e := e_too_many_mb_data
    ELSE
        BEGIN
        ErrText          := bsp_errtext;
        ErrTypeMap.c [1] := mdShortMessBuf_kb09 [ErrTextLen + 1];
        ErrTextType      := ErrTypeMap.e;
        IF  ErrTextLen > sizeof (ErrText)
        THEN
            ErrTextLen := sizeof (ErrText);
        (*ENDIF*) 
        g10mv ('VKB96 ',   1,
              sizeof (mdShortMessBuf_kb09), sizeof (ErrText),
              @mdShortMessBuf_kb09, 1, @ErrText, 1, ErrTextLen, e)
        END
    (*ENDIF*) 
    END;
(*ENDWITH*) 
&ifdef TRACE
t01basis_error (kb_net, 'end ErrText ', e);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      k96free_mdesc (
            VAR MessCache : tkb09_MessCache;
            VAR mdesc : tkb09_MessDescPtr);
 
BEGIN
&ifdef TRACE
g08check_excl (g08server);
t01addr_2 (kb_net, 'mdesc       ', mdesc);
&endif
IF  mdesc <> NIL
THEN
    BEGIN
    IF  mdesc^.mdMessBody_kb09 <> NIL
    THEN
        k96free_messbody (MessCache, mdesc^.mdMessBody_kb09);
    (*ENDIF*) 
    k96clear_mdesc (mdesc^);
    mdesc^.mdNext_kb09              := MessCache.mcMdescFirstFree_kb09;
    MessCache.mcMdescFirstFree_kb09 := mdesc;
    MessCache.mcMdescCnt_kb09       := MessCache.mcMdescCnt_kb09 - 1
    END;
(*ENDIF*) 
mdesc := NIL
END;
 
(*------------------------------*) 
 
PROCEDURE
      k96free_messbody (
            VAR MessCache : tkb09_MessCache;
            VAR MessBody : tkb09_PtrMessBodyDesc);
 
BEGIN
&ifdef TRACE
g08check_excl (g08server);
t01addr_1 (kb_net, 'MessBody    ', MessBody);
&endif
IF  MessBody <> NIL
THEN
    BEGIN
    MessBody^.mbyBufLen_kb09        := 0;
    MessBody^.mbyNext_kb09          := MessCache.mcMbodyFirstFree_kb09;
    MessCache.mcMbodyFirstFree_kb09 := MessBody;
    MessCache.mcMbodyCnt_kb09       := MessCache.mcMbodyCnt_kb09 - 1
    END;
(*ENDIF*) 
MessBody := NIL
END;
 
(*------------------------------*) 
 
PROCEDURE
      k96move_from_mdesc (
            VAR mblock  : tgg00_MessBlock;
            SourceMdesc : tkb09_MessDescPtr);
 
VAR
      ShortBufPos  : tsp00_Int4;
      ShortBufLen  : tsp00_Int4;
      MessBodyPos  : tsp00_Int4;
      MessBodyLen  : tsp00_Int4;
      StackListLen : tsp00_Int4;
      UnivAddr     : tkb09_UnivPtr;
 
BEGIN
mblock.mb_trns^.trError_gg00 := e_ok;
WITH SourceMdesc^ DO
    BEGIN
    ShortBufPos := 1;
    MessBodyPos := 1;
    ShortBufLen := mdTransferLen_kb09 - sizeof (mdMessHead_kb09);
    IF  ShortBufLen < 0
    THEN
        mblock.mb_trns^.trError_gg00 := e_illegal_server_mb
    ELSE
        BEGIN
        IF  ShortBufLen > sizeof (mdShortMessBuf_kb09)
        THEN
            ShortBufLen := sizeof (mdShortMessBuf_kb09);
        (*ENDIF*) 
        MessBodyLen := mdTransferLen_kb09 - sizeof (mdMessHead_kb09) - ShortBufLen;
&       ifdef TRACE
        IF  ShortBufLen > 0
        THEN
            BEGIN
            UnivAddr.uvMoveObj_kb09 := @mdShortMessBuf_kb09;
            t01moveobj (kb_net, UnivAddr.uvMoveObj_kb09^, 1, ShortBufLen)
            END;
        (*ENDIF*) 
        IF  (MessBodyLen > 0) AND (mdMessBody_kb09 <> NIL)
        THEN
            t01moveobj (kb_net, mdMessBody_kb09^.mbyBuf_kb09^, 1, MessBodyLen);
&       endif
        (*ENDIF*) 
        IF  MessBodyLen > 0
        THEN
            BEGIN
            IF  mdMessBody_kb09 = NIL
            THEN
                mblock.mb_trns^.trError_gg00 := e_illegal_server_mb
            ELSE
                IF  MessBodyLen > mdMessBody_kb09^.mbyBufSize_kb09
                THEN
                    mblock.mb_trns^.trError_gg00 := e_illegal_server_mb
                (*ENDIF*) 
            (*ENDIF*) 
            END
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END;
(*ENDWITH*) 
IF  (mblock.mb_trns^.trError_gg00 = e_ok)
    AND
    (mblock.mb_qual_len > 0)
THEN
    BEGIN
    UnivAddr.uvQualBuf_kb09 := mblock.mb_qual;
    kb96mdesc_to_moveobj (SourceMdesc,
          mblock.mb_qual_size, UnivAddr.uvMoveObj_kb09, mblock.mb_qual_len,
          ShortBufPos, ShortBufLen, MessBodyPos, MessBodyLen,
          mblock.mb_trns^.trError_gg00, e_too_small_mb_qual_part);
    IF  mblock.mb_trns^.trError_gg00 = e_too_small_mb_qual_part
    THEN
        BEGIN
        (* PTS 1123750 UH 2003-08-25 *)
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '4 ShortBufPos           ', ShortBufPos);
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '4 ShortBufLen           ', ShortBufLen);
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '4 MessBodyPos           ', MessBodyPos);
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '4 MessBodyLen           ', MessBodyLen);
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '4 mb_struct is nil      ', ord(mblock.mb_struct));
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '4 mb_qual is nil        ', ord(mblock.mb_qual = NIL));
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '4 mb_qual_len           ', mblock.mb_qual_len);
        END;
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  (mblock.mb_trns^.trError_gg00 = e_ok)
    AND
    (mblock.mb_data_len > 0)
THEN
    BEGIN
    UnivAddr.uvDataPart_kb09 := mblock.mb_data;
    kb96mdesc_to_moveobj (SourceMdesc,
          mblock.mb_data_size, UnivAddr.uvMoveObj_kb09, mblock.mb_data_len,
          ShortBufPos, ShortBufLen, MessBodyPos, MessBodyLen,
          mblock.mb_trns^.trError_gg00, e_too_many_mb_data)
    END;
(*ENDIF*) 
IF  (mblock.mb_trns^.trError_gg00 = e_ok)
THEN
    IF  (mblock.mb_struct = mbs_stack_addr)
        AND
        ((mblock.mb_qual = NIL) OR
        ( mblock.mb_qual_len < sizeof(tgg00_FileId) + sizeof(tgg00_StackDesc)))
    THEN
        BEGIN
        (* PTS 1123750 UH 2003-08-25 *)
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '1 mb_struct             ', ord(mblock.mb_struct));
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '1 mb_qual is nil        ', ord(mblock.mb_qual = NIL));
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '1 mb_qual_len           ', mblock.mb_qual_len);
        mblock.mb_trns^.trError_gg00 := e_too_small_mb_qual_part
        END
    ELSE
        IF  (mblock.mb_struct = mbs_long)
            AND
            ((mblock.mb_qual = NIL) OR
            ( mblock.mb_qual_len < sizeof(tgg00_FileId) +
            sizeof(tgg00_StackDesc) + sizeof (tgg00_LongQual)))
        THEN
            BEGIN
            (* PTS 1123750 UH 2003-08-25 *)
            g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
                  csp3_n_net, '2 mb_struct             ', ord(mblock.mb_struct));
            g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
                  csp3_n_net, '2 mb_qual is nil        ', ord(mblock.mb_qual = NIL));
            g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
                  csp3_n_net, '2 mb_qual_len           ', mblock.mb_qual_len);
            mblock.mb_trns^.trError_gg00 := e_too_small_mb_qual_part
            END;
        (* PTS 1120287 E.Z. *)
        (*ENDIF*) 
    (*ENDIF*) 
(*ENDIF*) 
IF  (mblock.mb_trns^.trError_gg00 = e_ok)
    AND
    (mblock.mb_struct in [mbs_stack_addr, mbs_long])
THEN
    BEGIN
    mblock.mb_qual^.mst_max  := mblock.mb_st_max;
    mblock.mb_qual^.mst_addr := mblock.mb_st;
    StackListLen := (mblock.mb_qual^.mfirst_free-1) * sizeof (tgg00_StackEntry);
&   ifdef TRACE
    t01p2int4 (kb_net, 'qual_len    ', mblock.mb_qual_len
          ,            'data_len    ', mblock.mb_data_len);
    t01p2int4 (kb_net, 'st_list_len ', StackListLen
          ,            'st_size     ', mblock.mb_st_size);
    t01addr   (kb_net, 'st_addr     ', mblock.mb_st);
&   endif
    IF  StackListLen > 0
    THEN
        BEGIN
        UnivAddr.uvStackList_kb09 := mblock.mb_st;
        kb96mdesc_to_moveobj (SourceMdesc,
              mblock.mb_st_size, UnivAddr.uvMoveObj_kb09, StackListLen,
              ShortBufPos, ShortBufLen, MessBodyPos, MessBodyLen,
              mblock.mb_trns^.trError_gg00, e_too_many_mb_stackentries)
        END
    (*ENDIF*) 
    END;
&ifdef TRACE
(*ENDIF*) 
t01basis_error (kb_net, 'end movefrom', mblock.mb_trns^.trError_gg00);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      k96new_mdesc (
            VAR Trans         : tgg00_TransContext;
            VAR MessCache     : tkb09_MessCache;
            VAR mdesc         : tkb09_MessDescPtr;
            ParentTaskId      : tsp00_TaskId);
 
BEGIN
&ifdef TRACE
g08excl_check (Trans.trTaskId_gg00, g08server);
&endif
Trans.trError_gg00 := e_ok;
mdesc              := MessCache.mcMdescFirstFree_kb09;
IF  mdesc = NIL
THEN
    Trans.trError_gg00 := e_too_many_net_requests
ELSE
    BEGIN
    MessCache.mcMdescCnt_kb09       := MessCache.mcMdescCnt_kb09 + 1;
    MessCache.mcMdescFirstFree_kb09 := mdesc^.mdNext_kb09;
    mdesc^.mdParentTaskId_kb09      := ParentTaskId
    END;
(*ENDIF*) 
&ifdef TRACE
t01addr_2      (kb_net,  'mdesc       ', mdesc);
t01basis_error (kb_dist, 'end new_mdsc', Trans.trError_gg00);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      k96to_mdesc_move (
            VAR MessCache : tkb09_MessCache;
            VAR mblock  : tgg00_MessBlock;
            DestinMdesc : tkb09_MessDescPtr);
 
VAR
      ShortBufLen  : tsp00_Int4;
      StackListLen : tsp00_Int4;
      UnivAddr     : tkb09_UnivPtr;
 
BEGIN
mblock.mb_trns^.trError_gg00 := e_ok;
ShortBufLen := 0;
IF  mblock.mb_qual_len > 0
THEN
    BEGIN
    UnivAddr.uvQualBuf_kb09 := mblock.mb_qual;
    kb96moveobj_to_mdesc (MessCache, DestinMdesc,
          mblock.mb_qual_size, UnivAddr.uvMoveObj_kb09, mblock.mb_qual_len,
          ShortBufLen, mblock.mb_trns^.trError_gg00, e_too_small_mb_qual_part);
    IF  mblock.mb_trns^.trError_gg00 = e_too_small_mb_qual_part
    THEN
        BEGIN
        (* PTS 1123750 UH 2003-08-25 *)
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '5 ShortBufLen           ', ShortBufLen);
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '5 mb_struct             ', ord(mblock.mb_struct));
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '5 mb_qual is nil        ', ord(mblock.mb_qual = NIL));
        g01opmsg (sp3p_knldiag, sp3m_info, kbMsg_csp03,
              csp3_n_net, '5 mb_qual_len           ', mblock.mb_qual_len);
        END;
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  (mblock.mb_trns^.trError_gg00 = e_ok)
    AND
    (mblock.mb_data_len > 0)
THEN
    BEGIN
    UnivAddr.uvDataPart_kb09 := mblock.mb_data;
    kb96moveobj_to_mdesc (MessCache, DestinMdesc,
          mblock.mb_data_size, UnivAddr.uvMoveObj_kb09, mblock.mb_data_len,
          ShortBufLen, mblock.mb_trns^.trError_gg00, e_too_many_mb_data)
    END;
(*ENDIF*) 
IF  mblock.mb_trns^.trError_gg00 = e_ok
THEN
    CASE mblock.mb_struct OF
        mbs_stack_addr :
            IF  (mblock.mb_qual = NIL)
                OR
                (mblock.mb_qual_len <
                sizeof(tgg00_FileId) + sizeof(tgg00_StackDesc))
            THEN
                mblock.mb_trns^.trError_gg00 := e_too_many_mb_stackentries;
            (*ENDIF*) 
        mbs_long :
            IF  (mblock.mb_qual = NIL)
                OR
                (mblock.mb_qual_len < sizeof(tgg00_FileId) +
                sizeof(tgg00_StackDesc) + sizeof (tgg00_LongQual))
            THEN
                mblock.mb_trns^.trError_gg00 := e_too_many_mb_stackentries;
            (*ENDIF*) 
        OTHERWISE ;
        END;
    (*ENDCASE*) 
(*ENDIF*) 
IF  (mblock.mb_trns^.trError_gg00 = e_ok)
    AND
    (mblock.mb_struct in [mbs_stack_addr, mbs_long])
THEN
    BEGIN
    StackListLen := (mblock.mb_qual^.mfirst_free - 1) * sizeof (tgg00_StackEntry);
    IF  StackListLen > 0
    THEN
        BEGIN
        UnivAddr.uvStackList_kb09 := mblock.mb_st;
        kb96moveobj_to_mdesc (MessCache, DestinMdesc, mblock.mb_st_size,
              UnivAddr.uvMoveObj_kb09, StackListLen, ShortBufLen,
              mblock.mb_trns^.trError_gg00, e_too_many_mb_stackentries)
        END
    (*ENDIF*) 
    END;
&ifdef TRACE
(*ENDIF*) 
t01p2int4 (kb_net, 'shortbuf_len', ShortBufLen
      ,            'transfer_len', DestinMdesc^.mdTransferLen_kb09);
IF  ShortBufLen > 0
THEN
    BEGIN
    UnivAddr.uvMoveObj_kb09 := @DestinMdesc^.mdShortMessBuf_kb09;
    t01moveobj (kb_net, UnivAddr.uvMoveObj_kb09^, 1, ShortBufLen)
    END;
(*ENDIF*) 
IF  DestinMdesc^.mdMessBody_kb09 <> NIL
THEN
    WITH DestinMdesc^.mdMessBody_kb09^ DO
        BEGIN
        t01int4    (kb_net, 'MessBodyLen ', mbyBufLen_kb09);
        t01moveobj (kb_net, mbyBuf_kb09^, 1, mbyBufLen_kb09)
        END;
    (*ENDWITH*) 
(*ENDIF*) 
t01basis_error (kb_net, 'end to_move ', mblock.mb_trns^.trError_gg00);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb96mdesc_to_moveobj (
            SourceMdesc     : tkb09_MessDescPtr;
            MoveObjSize     : tsp00_Int4;
            MoveObj         : tsp00_MoveObjPtr;
            MoveObjLen      : tsp00_Int4;
            VAR ShortBufPos : tsp00_Int4;
            VAR ShortBufLen : tsp00_Int4;
            VAR MessBodyPos : tsp00_Int4;
            VAR MessBodyLen : tsp00_Int4;
            VAR b_err       : tgg00_BasisError;
            LimitError     : tgg00_BasisError);
 
VAR
      ShortMoveLen : tsp00_Int4;
 
BEGIN
b_err := e_ok;
IF  (MoveObj = NIL)
    OR
    (MoveObjLen > MoveObjSize)
    OR
    (MoveObjLen > ShortBufLen + MessBodyLen)
THEN
    b_err := LimitError
ELSE
    BEGIN
    IF  MoveObjLen > ShortBufLen
    THEN
        ShortMoveLen := ShortBufLen
    ELSE
        ShortMoveLen := MoveObjLen;
    (*ENDIF*) 
    IF  ShortMoveLen > 0
    THEN
        BEGIN
        g10mv ('VKB96 ',   2,
              sizeof(SourceMdesc^.mdShortMessBuf_kb09), MoveObjSize,
              @SourceMdesc^.mdShortMessBuf_kb09, ShortBufPos,
              MoveObj, 1, ShortMoveLen, b_err);
        ShortBufPos := ShortBufPos + ShortMoveLen;
        ShortBufLen := ShortBufLen - ShortMoveLen
        END;
    (*ENDIF*) 
    IF  (b_err = e_ok) AND (MoveObjLen > ShortMoveLen)
    THEN
        BEGIN
        WITH SourceMdesc^.mdMessBody_kb09^ DO
            g10mv ('VKB96 ',   3,
                  mbyBufSize_kb09, MoveObjSize,
                  @mbyBuf_kb09^, MessBodyPos,
                  MoveObj, ShortMoveLen + 1,
                  MoveObjLen - ShortMoveLen, b_err);
        (*ENDWITH*) 
        MessBodyPos := MessBodyPos + MoveObjLen - ShortMoveLen;
        MessBodyLen := MessBodyLen - MoveObjLen + ShortMoveLen
        END
    (*ENDIF*) 
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb96moveobj_to_mdesc (
            VAR MessCache   : tkb09_MessCache;
            DestinMdesc     : tkb09_MessDescPtr;
            MoveObjSize     : tsp00_Int4;
            MoveObj         : tsp00_MoveObjPtr;
            MoveObjLen      : tsp00_Int4;
            VAR ShortBufLen : tsp00_Int4;
            VAR b_err       : tgg00_BasisError;
            LimitError      : tgg00_BasisError);
 
VAR
      ShortMoveLen : tsp00_Int4;
 
BEGIN
b_err := e_ok;
IF  (MoveObj = NIL)
    OR
    (MoveObjLen > MoveObjSize)
THEN
    b_err := LimitError
ELSE
    IF  (MoveObjLen > sizeof (DestinMdesc^.mdShortMessBuf_kb09) - ShortBufLen)
        AND
        (DestinMdesc^.mdMessBody_kb09 = NIL)
    THEN
        kb96new_messbody (MessCache, DestinMdesc^.mdMessBody_kb09, b_err);
    (*ENDIF*) 
(*ENDIF*) 
IF  b_err = e_ok
THEN
    BEGIN
    IF  DestinMdesc^.mdMessBody_kb09 = NIL
    THEN
        BEGIN
        IF  ShortBufLen + MoveObjLen > sizeof (DestinMdesc^.mdShortMessBuf_kb09)
        THEN
            b_err := LimitError
        (*ENDIF*) 
        END
    ELSE
        IF  ShortBufLen + MoveObjLen + DestinMdesc^.mdMessBody_kb09^.mbyBufLen_kb09
            >
            sizeof (DestinMdesc^.mdShortMessBuf_kb09) +
            DestinMdesc^.mdMessBody_kb09^.mbyBufSize_kb09
        THEN
            b_err := LimitError
        (*ENDIF*) 
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  b_err = e_ok
THEN
    BEGIN
    IF  MoveObjLen > sizeof (DestinMdesc^.mdShortMessBuf_kb09) - ShortBufLen
    THEN
        ShortMoveLen := sizeof (DestinMdesc^.mdShortMessBuf_kb09) - ShortBufLen
    ELSE
        ShortMoveLen := MoveObjLen;
    (*ENDIF*) 
    IF  ShortMoveLen > 0
    THEN
        BEGIN
        g10mv ('VKB96 ',   4,
              MoveObjSize, sizeof(DestinMdesc^.mdShortMessBuf_kb09),
              MoveObj, 1,
              @DestinMdesc^.mdShortMessBuf_kb09, ShortBufLen + 1,
              ShortMoveLen, b_err);
        ShortBufLen := ShortBufLen + ShortMoveLen
        END;
    (*ENDIF*) 
    IF  (b_err = e_ok) AND (MoveObjLen > ShortMoveLen)
    THEN
        WITH DestinMdesc^.mdMessBody_kb09^ DO
            BEGIN
            g10mv ('VKB96 ',   5,
                  MoveObjSize, mbyBufSize_kb09,
                  MoveObj,    ShortMoveLen + 1,
                  @mbyBuf_kb09^, mbyBufLen_kb09 + 1,
                  MoveObjLen - ShortMoveLen, b_err);
            mbyBufLen_kb09 := mbyBufLen_kb09 + MoveObjLen - ShortMoveLen
            END;
        (*ENDWITH*) 
    (*ENDIF*) 
    DestinMdesc^.mdTransferLen_kb09 := DestinMdesc^.mdTransferLen_kb09 + MoveObjLen
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb96new_messbody (
            VAR MessCache : tkb09_MessCache;
            VAR MessBody : tkb09_PtrMessBodyDesc;
            VAR err      : tgg00_BasisError);
 
BEGIN
&ifdef TRACE
g08check_excl (g08server);
&endif
err      := e_ok;
MessBody := MessCache.mcMbodyFirstFree_kb09;
IF  MessBody = NIL
THEN
    err := e_too_many_net_requests
ELSE
    BEGIN
    MessCache.mcMbodyCnt_kb09       := MessCache.mcMbodyCnt_kb09 + 1;
    MessCache.mcMbodyFirstFree_kb09 := MessBody^.mbyNext_kb09;
    MessBody^.mbyBufLen_kb09        := 0;
    MessBody^.mbyNext_kb09          := NIL
    END;
(*ENDIF*) 
&ifdef TRACE
t01addr_1      (kb_net,  'MessBody    ', MessBody);
t01basis_error (kb_dist, 'end new_mess', err);
&endif
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
