{Ŀ X - P a c k e t X P T R X . P A S Routinen fuer die Aussendung von Files } Procedure FileTxMenu (* Kanal : Byte *); Const ArtMax = 8; Var i : Byte; KC : Sondertaste; VC : Char; Fehler, Flag : Boolean; X,Y, Art : Byte; Begin with K[Kanal]^ do begin if node then Wishbuf:=false; Moni_Off(0); Flag := false; for i := 9 to 15 do G^.Fstx[i] := 2; G^.Fstr[7] := InfoZeile(334); G^.Fstr[9] := InfoZeile(335); G^.Fstr[10] := InfoZeile(336); G^.Fstr[11] := InfoZeile(337); G^.Fstr[12] := InfoZeile(338); G^.FStr[13] := InfoZeile(339); if FileSendWait then Art := 5 else begin if FileSend then begin case TX_Bin of 0 : Art := 1; 1 : Art := 2; 2, 3 : Art := 3; end; if XBin.TX then Art:=5; end else if TNC_Puffer then Art := 6 else if WishBuf then Art := 7 else Art := 1; end; Repeat for i := 9 to 13 do begin G^.Fstr[i][vM+1] := B1; G^.Fstr[i][hM+1] := B1; G^.Fstr[i][vM] := B1; G^.Fstr[i][hM] := B1; end; if Art in [1..5] then begin X := vM; Y := Art + 8; end else begin X := hM; Y := Art + 4; end; { if Art= 9 then begin x:=vm; y:=art+8; end;} G^.Fstr[Y][X] := A_ch; if HardCur then SetzeCursor(X+1,Y); if FileSend then begin case TX_Bin of 0 : G^.Fstr[9][vM+1] := X_ch; 1 : G^.Fstr[10][vM+1] := X_ch; 2 : G^.Fstr[11][vM+1] := 'x'; 3 : G^.Fstr[11][vM+1] := X_ch; end; end; if FileSendWait then G^.Fstr[9][hM+1] := X_ch; if TNC_Puffer then G^.Fstr[10][hM+1] := X_ch; if WishBuf then G^.Fstr[11][hM+1] := X_ch; if BufExists then G^.Fstr[12][hM+1] := X_ch; {if XBin.AN then G^.FSTR[13]:='XBIN AN ' else G^.Fstr[13]:='XBIN Aus';} {G^.Fstr[13] := '';} G^.Fstr[14] := ''; G^.Fstr[15] := ''; Fenster(15); _ReadKey(KC,VC); Case KC of _Esc : Flag := true; _AltH : XP_Help(G^.OHelp[22]); _Ret : ; _F1 : Art := 1; {text} _F2 : Art := 2; {bin} _F3 : Art := 3; {autobin} _F4 : Art := 4; {autobin sof} _F5 : Art := 5; {xbin} _F6 : Art := 6; {ftx anhalten} _F7 : Art := 7; {tnc-puffer} _F8 : Art := 8; {ZWP anlegen} _F9 : Art := 9; {ZWP lschen} _F10 : Alarm; _Up : if Art > 1 then dec(Art) else Alarm; _Dn : if Art < ArtMax then inc(Art) else Alarm; _Right : if Art < ArtMax then begin Art := Art + 4; if Art > ArtMax then Art := ArtMax; end else Alarm; _Left : if Art > 1 then begin if Art <= 4 then Art := 1 else Art := Art - 4; end else Alarm; else Alarm; End; if KC in [_F1.._F9,_Ret] then case Art of 1, 2, 3, 4, 5 : begin if Art=5 then XBin.AN:=true; if (not FileSend) and (not SPlSave) and (RX_bin=0) then begin case Art of 1 : G^.Fstr[9][vM] := S_ch; 2 : G^.Fstr[10][vM] := S_ch; 3 : G^.Fstr[11][vM] := S_ch; 4 : G^.Fstr[12][vM] := S_ch; 5 : G^.Fstr[13][vM] := S_ch; end; Fenster(15); if art=5 then art:=3; Datei_Senden(Kanal,Art); if FileSend then begin Flag := true; end else if xbin.an then art:=5; end else Alarm; end; 6 : if (FileSend) and (not XBin.TX) then begin if (not XBin.TX) then FileSendWait := not FileSendWait else begin xbinWait:=not XBinWait; {if not FileSendWait then begin FileSendWait:=true; end;} end; end else Alarm; 7 : begin if not TNC_Puffer then begin Fehler:=false; For i:=1 to maxlink do if K[i]^.TNC_Puffer then Fehler:=true; if not fehler then TNC_Puffer := not TNC_Puffer else Alarm; end else TNC_Puffer := not TNC_Puffer; end; 8 : if not node then WishBuf := not WishBuf else Alarm; 9 : If BufExists then EraseBufferFile(Kanal); end; SetzeFlags(Kanal); Until Flag; if (filesend) and (XBin.AN) then TNC_Puffer:=false; {bei XBIN-protokoll unbedingt vorzeitiges senden an TNC verbieten, zwecks Prfsummenerstellung und Framezhler!!} ClrFenster; Neu_Bild; Moni_On; end; End; Procedure Datei_Senden (* Kanal : Byte; Art : Byte *); Var Hstr : String[80]; abByte : Boolean; KC : Sondertaste; Flag : Boolean; Begin if Kanal > 0 then with K[Kanal]^ do begin xbin.rtxok:=true; if FileSend then begin FileSend := false; BoxZaehl:=5; FiResult := CloseBin(TxFile); S_PAC(Kanal,NU,true,''); TNC_Puffer := false; end else begin Flag := false; Case Art of 1 : TX_Bin := 0; 2 : TX_Bin := 1; 3 : TX_Bin := 2; 4 : begin TX_Bin := 2; Flag := true; end; End; G^.Fstr[14]:=InfoZeile(204); Fenster(15); GetString(FTxName,Attrib[3],60,2,15,KC,1,Ins); G^.Fstr[14]:=''; Fenster(15); if KC <> _Esc then begin if pos(B1,FTxName) > 0 then begin Hstr := RestStr(FTxName); FTxName := CutStr(FTxName); abByte := true; end else abByte := false; FTxName := UpCaseStr(FTxName); if pos(DP,FTxName) = 0 then FTxName := Konfig.SavVerz + FTxName; if SaveNameCheck(1,FTxName) then Assign(TxFile,FTxName) else Assign(TxFile,'###***##'); if ResetBin(TxFile,T) = 0 then begin (* File vorhanden *) TX_Laenge := FileSize(TxFile); TX_Count := 0; TX_Time := Uhrzeit; if abByte then FileSendVon(Kanal,Hstr); abByte := false; FileSend := true; if TX_Bin = 2 then begin (* Bei Auto-Bin-Send die Filelnge bertragen *) Hstr := MakeBinStr(Kanal,FTxName); if paclen<30 then paclen:=30; TX_CRC := 0; S_PAC(Kanal,NU,not Flag,Hstr); if Flag then TX_Bin := 3; end; end else begin (* File nicht vorhanden *) Alarm; G^.Fstr[15] := FTxName + B1 + InfoZeile(157) + B2 + InfoZeile(78); Fenster(15); SetzeCursor(length(G^.Fstr[15])+2,15); Warten; Cursor_aus; end; end; end; end else Alarm; End; Procedure FileSendVon (* Kanal : Byte; Zeile : Str40 *); Var von,bis : LongInt; Hstr : String[20]; Function Pos_ZlNr(Kanal : Byte; ZNr : LongInt) : LongInt; Var i, Result : Word; ir,iz : LongInt; Hstr : String; Begin with K[Kanal]^ do begin iz := 0; ir := 0; Seek(TxFile,0); While not Eof(TxFile) and (ir < ZNr) do begin BlockRead(TxFile,Hstr[1],FF,Result); Hstr[0] := Chr(Result); for i := 1 to Result do begin if ir < ZNr then inc(iz); if Hstr[i] = M1 then inc(ir); end; end; Pos_ZlNr := iz; end; End; Begin with K[Kanal]^ do begin Hstr := CutStr(Zeile); if Hstr > '' then begin if copy(Hstr,1,1) = '$' then begin delete(Hstr,1,1); von := Pos_ZlNr(Kanal,str_int(Hstr)-1); end else von := str_int(Hstr); end else von := 0; Hstr := RestStr(Zeile); if Hstr > '' then begin if copy(Hstr,1,1) = '$' then begin delete(Hstr,1,1); bis := Pos_ZlNr(Kanal,str_int(Hstr)); end else bis := str_int(Hstr); end else bis := TX_Laenge - 1; if (von < 0) or (von >= TX_Laenge) then von := 0; if (bis <= 0) or (bis >= TX_Laenge) or (bis < von) then bis := TX_Laenge - 1; TX_Laenge := bis - von + 1; Seek(TxFile,von); end; End; Procedure Send_File (* Kanal : Byte; OFlag : Boolean; *); Var Zeile : String; Hstr : String[9]; i,l : Byte; ch : Char; FileEnde : Boolean; Result : Word; XBTrans : Boolean; DatPos : longint; Begin FileEnde := false; Zeile := ''; with K[Kanal]^ do Begin XBTrans:=(XBIN.AN) and (TX_BIN=3); FileFlag := (TX_Bin = 0) and (Echo in [2,3,6,7]); if TX_Bin <> 2 then Begin if TxComp then l := maxCompPac else l := FF; if XBTrans then l:=paclen-8; if xbtrans and txcomp then l:=paclen-10; if xbtrans then DatPos:=filepos(TXFile); BlockRead(TxFile,Zeile[1],l,Result); if (TX_Count + Result) > TX_Laenge then Result := TX_Laenge - TX_Count; Zeile[0] := chr(Byte(Result)); if XBTRANS then Zeile:=XBinStr(Kanal, Zeile, DatPos)+Zeile; {if XBTrans then Zeile[0] := chr(Byte(Result+7));} TX_Count := TX_Count + Result; IF (TX_Count >= TX_Laenge) then FileEnde := true; if TX_Bin = 0 then (* Textfile senden *) Begin While pos(^J,Zeile) > 0 do delete(Zeile,pos(^J,Zeile),1); While pos(^Z,Zeile) > 0 do delete(Zeile,pos(^Z,Zeile),1); for i := 1 to length(Zeile) do case Zeile[i] of ^I : ; M1 : ; #1..#31 : Zeile[i] := '^'; end; Zeile := Line_convert(Kanal,1,Zeile); end else TX_CRC := Compute_CRC(TX_CRC,Zeile); S_PAC(Kanal,NU,false,Zeile); FileInfo(Kanal,1,TX_Laenge,TX_Count,0,0); if FileEnde then Begin TNC_Puffer := false; FileSend := false; Result := Word(TX_CRC); boxzaehl:=5; FiResult := CloseBin(TxFile); if not DirScroll then SetzeFlags(Kanal); case TX_Bin of 0 : begin if FileSendRem then Send_Prompt(Kanal,FF) else S_PAC(Kanal,NU,true,''); end; 1 : begin _aus(Attrib[20],Kanal,M2 + InfoZeile(100) + M1); S_PAC(Kanal,NU,true,''); if FileSendRem then S_PAC(Kanal,CM,true,'D'); end; 3 : begin Hstr := Time_Differenz(TX_Time,Uhrzeit); Zeile := FName_aus_FVar(TxFile); While pos(BS,Zeile) > 0 do delete(Zeile,1,pos(BS,Zeile)); Zeile := M1 + B1 + InfoZeile(102) + B1 + EFillStr(14,B1,Zeile) + InfoZeile(100) + int_str(Result) + B2 + LRK + Hex(Result,4) + B1 + BdStr + FileBaud(Hstr,int_str(TX_Count)) + B2 + LRK + Hstr + RRK + M1; if OFlag then _aus(Attrib[20],Kanal,Zeile); { if FileSendRem then begin } {//db1ras} if SysArt = 3 then {FBB} S_PAC(Kanal,NU,true,M1) else begin if (SysArt in [0,17,21]) and not XBin.An then begin {XP, PROFI} S_PAC(Kanal,NU,false,Zeile); Send_Prompt(Kanal,FF); end else if XBin.An then begin S_pac(kanal,NU,TRUE,''); s_pac(kanal,nu,true,xprot+COMD+chr(TRASK)); xbin.framenr:=0; xbin.ok:=false; xbin.pdat:=false; xbin.datpos:=0; xbin.retries:=0; end else S_PAC(Kanal,NU,true,''); end; { end else S_PAC(Kanal,NU,true,''); } end; end; FileSendRem := false; End; End; FileFlag := false; End; End; Procedure SF_Text (* Kanal : Byte; Zeile : Str80 *); var f : Text; i : Byte; Hstr : String; Begin with K[Kanal]^ do begin Assign(f,Zeile); if ResetTxt(f) = 0 then begin WishBuf := true; While not Eof(f) do begin Readln(f,Hstr); Hstr := Line_convert(Kanal,1,Platzhalter(Kanal,Hstr)) + M1; S_PAC(Kanal,NU,false,Hstr); end; FiResult := CloseTxt(f); end else S_PAC(Kanal,NU,true,InfoZeile(114) + B1 + Zeile + B1 + InfoZeile(115) +M1); end; End; Procedure TXT_Senden (* Kanal,Art,FNr : Byte *); Var Hstr : String; EndText, First, Flag, FixFlag : Boolean; TNr : String[1]; GegCall : String[6]; Kenner : Str32; Function FindLine(TncStr,ArtStr,CallStr : Str9) : Boolean; Var Find : Boolean; Tstr : String[4]; Cstr, Rstr : String[9]; Begin Tstr := copy(TncStr,1,3) + 'A'; Repeat Readln(G^.TFile,Hstr); KillEndBlanks(Hstr); Find := (pos(TncStr + ArtStr,Hstr) = 1) or (pos(TStr + ArtStr,Hstr) = 1); if Find and (RestStr(Hstr) > '') then begin Find := false; Repeat Hstr := RestStr(Hstr); Rstr := CutStr(Hstr); if Rstr[length(Rstr)] = '-' then begin delete(Rstr,length(Rstr),1); Cstr := copy(CallStr,1,length(Rstr)); end else Cstr := CallStr; Find := Cstr = Rstr; Until Find or (length(Hstr) = 0); end; Until Find or Eof(G^.TFile); FindLine := Find; End; Begin with K[Kanal]^ do begin Assign(G^.TFile,Sys1Pfad + TxtDatei); if ResetTxt(G^.TFile) = 0 then begin Hstr := ''; Flag := false; First := true; FixFlag := false; TNr := int_str(TncNummer); GegCall := Call; Strip(GegCall); case Art of 1 : begin (* INFO *) Flag := FindLine(TncI + TNr,TInf + int_str(TNC[TncNummer]^.Info),OwnCall); end; 2 : begin (* AKTUELL *) Flag := FindLine(TncI + TNr,TAkt + int_str(TNC[TncNummer]^.Aktuell),OwnCall); end; 3 : begin (* CTEXT *) Flag := FindLine(TncI + TNr,TCtx + int_str(TNC[TncNummer]^.CText),OwnCall); end; 4 : begin (* QTEXT *) Flag := FindLine(TncI + TNr,TQtx + int_str(TNC[TncNummer]^.QText),OwnCall); end; 5 : begin (* FIX *) Flag := FindLine(TncI + TNr,TFix + int_str(FNr) + GL + int_str(TNC[TncNummer]^.FIX),OwnCall); FixFlag := Flag; end; 6 : begin (* GRT *) Flag := FindLine(TncI + TNr,TGrt,GegCall); GrtFlag := Flag; end; end; if Flag then begin if FixFlag then begin if Vor_im_EMS then EMS_Seite_Einblenden(Kanal,Vor); Set_st_Szeile(Kanal,1,1); if VorWrite[Kanal]^[stV] <> '' then begin Vor_Feld_Scroll(Kanal); Vor_Dn_Scroll(Kanal); end; end; EndText:=False; if (Art=3) or (art=6) then begin {Kenner:=AutoSysKenner[3]+copy(Version,Pos(' ',Version)+1,Length(Version)); if node then Kenner:=Kenner + NodeK + M1 else Kenner:=Kenner+ ']' + M1; } Kenner:=AutoSysKenner[3]; if node then Kenner:=Kenner + NodeK; Kenner:=Kenner+copy(Version,Pos(' ',Version)+1,Length(Version))+DatenKenner+int_str(Umlaut); if ((user_komp=1) or (user_komp=3)) and (not node) then kenner:=kenner+'C'+int_str(user_komp-1); kenner:=kenner+']'+m1; S_PAC(Kanal,NU,false,Kenner); end; EigFlag := SysTextEcho; While (not Eof(G^.TFile)) and (Not EndText) do begin Readln(G^.TFile,Hstr); if (pos('#ENDE#',UpcaseStr(Hstr)) > 0) then EndText:=true; if Not EndText then begin Hstr := Line_convert(Kanal,1,Platzhalter(Kanal,Hstr)); if FixFlag then begin if not First then begin Set_st_Szeile(Kanal,0,stV); Vor_Feld_Scroll(Kanal); end; First := false; VorWrite[Kanal]^[stV] := Hstr; Chr_Vor_Show(Kanal,_End,#255); Chr_Vor_Show(Kanal,_Andere,#255); end else begin S_PAC(Kanal,NU,FALSE,Hstr + M1); end; end; end; {while} end; FiResult := CloseTxt(G^.TFile); EigFlag:=false; end; if art= 3 then RequestName(Kanal); end; End; Procedure RequestName (* (Kanal) *); var hstr:String; begin with k[kanal]^ do if (not node) and ((not einstiegskanal) and (not ausstiegskanal)) then if (not reqName) and (konfig.ReqNam) then begin hstr:=''; if User_Name='' then hstr:=hstr+'+' else hstr:=hstr+'-'; if User_QTH='' then hstr:=hstr+'+' else hstr:=hstr+'-'; if User_LOC='' then hstr:=hstr+'+' else hstr:=hstr+'-'; hstr:=Meldung[36]+hstr+'#'; if pos('+', hstr)>0 then s_pac(kanal, nu, true, hstr+#13); reqName:=true; end; end; Procedure BIN_TX_File_Sofort (* Kanal : Byte ; Zeile : Str80 *); Var Bstr : String[80]; RResult, WResult : Word; HeapFree : LongInt; Begin with K[Kanal]^ do begin Assign(TxFile,Zeile); if ResetBin(TxFile,T) = 0 then begin FileSend := true; TX_Laenge := FileSize(TxFile); if TxComp then begin TX_Count := 0; TX_CRC := 0; TX_Bin := 3; TX_Time := Uhrzeit; WishBuf := true; S_PAC(Kanal,NU,false,MakeBinStr(Kanal,Zeile)); FertigSenden(Kanal); end else begin WishBuf := true; if not BufExists then OpenBufferFile(Kanal); Bstr := MakeBinStr(Kanal,Zeile); BlockWrite(BufFile,Bstr[1],length(Bstr),RResult); HeapFree := MaxAvail; if HeapFree > FA00 then HeapFree := FA00; if HeapFree > TX_Laenge then HeapFree := TX_Laenge; GetMem(BFeld,HeapFree); FillChar(BFeld^,HeapFree,0); Seek(BufFile,FileSize(BufFile)); Repeat BlockRead(TxFile,BFeld^,HeapFree,RResult); if RResult > 0 then TxLRet := BFeld^[RResult] = 13; BlockWrite(BufFile,BFeld^,RResult,WResult); Until RResult = 0; FreeMem(BFeld,HeapFree); FiResult := CloseBin(TxFile); FileSend := false; end; end; end; End; Procedure TXT_TX_File_Sofort (* Kanal : Byte ; Zeile : Str80 *); Begin with K[Kanal]^ do begin Assign(TxFile,Zeile); if ResetBin(TxFile,T) = 0 then begin FileSend := true; TX_Laenge := FileSize(TxFile); TX_Count := 0; TX_CRC := 0; TX_Bin := 0; TX_Time := Uhrzeit; FertigSenden(Kanal); end; end; End; Procedure FertigSenden (* Kanal : Byte *); Begin with K[Kanal]^ do begin WishBuf := true; Repeat if TX_Bin = 2 then inc(TX_Bin); Send_File(Kanal,false); Until not FileSend; end; End;