Files
harbour-core/harbour/examples/terminal/trm_cli.prg
Viktor Szakats 45a114e471 2010-06-03 18:17 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* tests/testsha1.prg
  * tests/longdev.prg
  * tests/clsccast.prg
  * tests/cmphello.prg
  * tests/clsicast.prg
  * tests/testop.prg
  * tests/clsscast.prg
  * tests/objarr.prg
  * tests/rddtest/rddmktst.prg
  * tests/rddtest/adscl52.prg
  * tests/rddtest/adscl53.prg
  * tests/rddtest/ntxcl52.prg
  * tests/rddtest/ntxcl53.prg
  * tests/rddtest/cdxcl52.prg
  * tests/rddtest/rddtst.prg
  * tests/rddtest/cdxcl53.prg
  * tests/transtst.prg
  * tests/output.prg
  * tests/ac_test2.prg
  * tests/clsscope.prg
  * tests/dosshell.prg
  * tests/sbartest.prg
  * tests/speedold.prg
  * tests/sdf_test.prg
  * tests/wcecon.prg
  * tests/debugtst.prg
  * tests/testdyn.c
  * tests/multiarg.prg
  * tests/fornext.prg
  * tests/hbinline.prg
  * tests/foreach2.prg
  * tests/objasign.prg
  * tests/scroll.prg
  * tests/inherit.prg
  * tests/rto_get.prg
  * tests/boxtst2.prg
  * tests/inkeytst.prg
  * tests/overload.prg
  * tests/cpinfo.prg
  * tests/gtwin.prg
  * tests/mt/mttest08.prg
  * tests/mt/mttest09.prg
  * tests/mt/mttest01.prg
  * tests/mt/mttest10.prg
  * tests/mt/mttest02.prg
  * tests/mt/mttest11.prg
  * tests/mt/mttest03.prg
  * tests/mt/mttest12.prg
  * tests/mt/mttest04.prg
  * tests/mt/mttest05.prg
  * tests/mt/mttest06.prg
  * tests/mt/mttest07.prg
  * tests/speedtst.prg
  * tests/testsha2.prg
  * tests/hsxtest.prg
  * tests/arrayidx.prg
  * tests/clsnv.prg
  * tests/rto_tb.prg
  * tests/gtchars.prg
  * tests/disptest.prg
  * tests/funcarr.prg
  * tests/testhtml.prg
  * tests/readhrb.prg
  * tests/tstcolor.prg
  * tests/gtxfnt.prg
  * tests/devtest.prg
  * tests/aliaslck.prg
  * tests/stripem.prg
  * tests/dynobj.prg
  * tests/tb1.prg
  * tests/round.prg
  * tests/longstr.prg
  * tests/testdyn.prg
  * tests/testdyn1.prg
  * tests/delimtst.prg
  * tests/tstdspac.prg
  * tests/version.prg
  * tests/setkeys.prg
  * tests/gtcolors.prg
  * tests/destruct.prg
  * tests/seconds.prg
  * tests/gtkeys.prg
  * tests/usrrdd/exarr.prg
  * doc/en/diskspac.txt
  * doc/en/string.txt
  * doc/en/rdd.txt
  * doc/en/hashes.txt
  * doc/en/hb_apigt.txt
  * doc/en/rddord.txt
  * doc/en/hb_api.txt
  * doc/en/hb_date.txt
  * doc/en/math.txt
  * doc/en/hb_vm.txt
  * doc/en/treport.txt
  * doc/en/terminal.txt
  * doc/en/hb_apiln.txt
  * doc/en/dir.txt
  * doc/en/command.txt
  * doc/en/rddmisc.txt
  * doc/en/errsys.txt
  * doc/en/nation.txt
  * doc/en/var.txt
  * doc/en/dbstrux.txt
  * doc/en/datetime.txt
  * doc/en/memo.txt
  * doc/en/tgetlist.txt
  * doc/en/tlabel.txt
  * doc/en/1stread.txt
  * doc/en/hb_set.txt
  * doc/en/hb_compa.txt
  * doc/en/hb_apier.txt
  * doc/en/hbinet.txt
  * doc/en/hb_macro.txt
  * doc/en/array.txt
  * doc/en/hb_apiit.txt
  * doc/en/rdddb.txt
  * doc/en/dbsdf.txt
  * doc/en/hvm.txt
  * doc/en/input.txt
  * doc/en/dbdelim.txt
  * doc/en/browse.txt
  * doc/en/menu.txt
  * doc/en/hb_apird.txt
  * doc/en/hb_apifs.txt
  * doc/en/file.txt
  * doc/en/lang.txt
  * doc/en/objfunc.txt
  * doc/en/eval.txt
  * doc/en/binnum.txt
  * doc/en/tclass.txt
  * doc/en/misc.txt
  * doc/en/set.txt
  * doc/en/readme.txt
  * doc/man/harbour.1
  * doc/man/hbmk2.1
  * doc/man/hbpp.1
  * doc/man/hbtest.1
  * doc/man/hbrun.1
  * examples/hbextern/hbextern.prg
  * examples/pp/pp.c
  * examples/pp/hbpragma.c
  * examples/pp/hbppcore.c
  * examples/pp/hbppcomp.c
  * examples/pp/hbpptbl.c
  * examples/pp/hbppdef.h
  * examples/superlib/hbsuper.prg
  * examples/hbsqlit2/hbsqlit2.ch
  * examples/misc/mankala.prg
  * examples/misc/guess.prg
  * examples/rddado/adordd.prg
  * examples/rddado/adordd.ch
  * examples/hbapollo/apollo.ch
  * examples/hbapollo/apollo.c
  * examples/hbapollo/apollo1.prg
  * examples/hbdoc2/gentpl.prg
  * examples/hbdoc2/gentxt.prg
  * examples/hbdoc2/tmplates.prg
  * examples/hbdoc2/genxml.prg
  * examples/hbdoc2/genhtml.prg
  * examples/hbdoc2/hbdoc2.prg
  * examples/hbdoc2/hbdoc2.ch
  * examples/guestbk/guestbk.prg
  * examples/httpsrv/uhttpd.ini
  * examples/httpsrv/uhttpd.prg
  * examples/httpsrv/cookie.prg
  * examples/httpsrv/cgifunc.prg
  * examples/httpsrv/session.prg
  * examples/terminal/trm_cli.prg
  * examples/terminal/terminal.prg
  * examples/terminal/trm_srv.prg
  * examples/terminal/trm_app.prg
  * examples/hbbtree/hb_btree.h
  * examples/hbbtree/hb_btree.ch
  * examples/hbbtree/hb_btree.c
  * examples/hbbtree/tbtree.prg
  * examples/hscript/hscript.prg
  * examples/hscript/dir.hs
  * examples/hscript/multiply.hs
  * examples/hscript/ugly.hs
  * examples/hscript/hello.hs
  * examples/gtwvw/hbole.h
  * examples/gtwvw/wvwdraw.c
  * examples/gtwvw/wvwmenu.c
  * examples/gtwvw/gtwvw.c
  * examples/gtwvw/wvwstbar.c
  * examples/gtwvw/wvwcheck.c
  * examples/gtwvw/wvwfuncs.c
  * examples/gtwvw/wvwpush.c
  * examples/gtwvw/wvwedit.c
  * examples/gtwvw/wvwtbar.c
  * examples/gtwvw/hbgtwvw.h
    * Deleted 'www.' from harbour-project.org website name.
      (www.harbour-project.org -> harbour-project.org)
2010-06-03 16:23:36 +00:00

809 lines
21 KiB
Plaintext

/*
* $Id$
*/
/*
* Harbour Project source code:
*
* Copyright 2009 Pritpal Bedi <pritpal@vouchcac.com>
* http://harbour-project.org
*
* 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, 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 software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
//----------------------------------------------------------------------//
//----------------------------------------------------------------------//
//----------------------------------------------------------------------//
//
// Terminal Client
//
// Pritpal Bedi (pritpal@vouchcac.com)
// 13 Feb 2009
//
//----------------------------------------------------------------------//
//----------------------------------------------------------------------//
//----------------------------------------------------------------------//
#include "hbgtinfo.ch"
#include "fileio.ch"
#include "inkey.ch"
#include "setcurs.ch"
//----------------------------------------------------------------------//
#define WSABASEERR 10000
#define WSAECONNABORTED (WSABASEERR+53)
//----------------------------------------------------------------------//
#define TIMER_RECEIVE 5001
#define TIMER_SEND 5002
#define TIMER_PING 5010
#define TIMER_CLOCK 5020
#define TIMER_REFRESH 5030
#define COMPILE( cStr ) &( "{|v| "+cStr+ "}" )
#define CR_LF chr(13)+chr(10)
#define VouchClientVersion "0.9.4"
#define __TRACE__
//----------------------------------------------------------------------//
REQUEST Tone
//----------------------------------------------------------------------//
Static s_commSocket
static s_nTotalBytes := 0
static s_nScreens := 0
static s_nPing := 0
static s_lReceiving := .f.
static s_lSending := .f.
static s_lTraceLog := .f.
static s_nTrace := 0
static s_aDat := { {"",""} }
Function Main( cAddress, cPort, cAppln, cParams, cDirectory )
LOCAL Socket, n, cText, cResponse
ResolveParams( @cAddress, @cPort, @cAppln, @cParams, @cDirectory )
TrmInitFont()
SetCursor( SC_NONE )
SetColor( "W/N" )
SetBlink( .T. )
CLS
/* Comment out following line if you wish to receive log */
// s_lTraceLog := .t.
Hb_InetInit()
TrmDispLogin( cAddress, cPort )
Socket := Hb_InetConnect( cAddress, Val( cPort ) )
IF Hb_InetErrorCode( Socket ) != 0
DispOutAt( 17,0, padc( "Can't connect with " + cAddress +" : " + Hb_InetErrorDesc( Socket ),maxcol()+1 ), "w+/n" )
DispOutAt( 18,0, padc( "Press a key to terminate the program...", maxcol()+1 ), "w+/n" )
Inkey( 0 )
RETURN nil
ENDIF
// Wvt_SetTitle( "[ "+cAddress+" ][ "+cPort+" ]" )
hb_gtInfo( HB_GTI_WINTITLE, "[ "+cAddress+" ][ "+cPort+" ]" )
DispOutAt( 18,0, padc( "Connection Secured",maxcol()+1 ), "w+/n" )
// Wvt_SetTitle( "[ "+cAddress+" ][ "+cPort+" ]"+"[Secured]" )
hb_gtInfo( HB_GTI_WINTITLE, "[ "+cAddress+" ][ "+cPort+" ]"+"[Secured]" )
cText := "VOUCH|"+ cAppln +"|"+ cParams +"|"+ cDirectory +"|"
Hb_InetSend( Socket, cText + CR_LF )
if TrmReceiveALine( Socket, @cResponse )
if ( n := at( ";", cResponse ) ) > 0
if substr( cResponse,1,n-1 ) == "CONNECT"
TrmServeServer( Socket, cAddress, substr( cResponse,n+1 ) )
endif
endif
endif
Hb_InetClose( Socket )
Hb_InetCleanup()
RETURN 0
//----------------------------------------------------------------------//
STATIC FUNCTION ResolveParams( cAddress, cPort, cAppln, cParams, cDirectory )
Local i, n, cLine, cVal, nLines, cTxt, cPath, cFile
Local dat_ := {}
LOCAL lFile
if PCount() == 1
cFile := cAddress
cAddress := ""
else
cFile := "vclient.ini"
endif
cPath := hb_DirBase()
if !empty( cPath )
n := rat( "\", cPath )
if n > 0
cPath := substr( cPath, 1, n )
endif
endif
cFile := cPath + cFile
lFile := hb_FileExists( cFile )
if empty( cAddress ) .and. lFile
alert( "File found: "+cFile )
cTxt := memoread( cFile )
nLines := mlCount( cTxt,254,3,.f. )
for i := 1 to nLines
if !empty( cLine := memoLine( cTxt,254,i,3,.f. ) )
if ( n := at( "#",cLine ) ) > 0
cLine := substr( cLine,1,n-1 )
endif
if ( n := at( "=",cLine ) ) > 0
if !empty( cVal := alltrim( substr( cLine,n+1 ) ) )
aadd( dat_,{ lower( alltrim( substr( cLine,1,n-1 ) ) ),cVal } )
endif
endif
endif
next
if !empty( dat_ )
if ( n := ascan( dat_, {|e_| e_[ 1 ] == "serverip" } ) ) > 0
cAddress := dat_[ n,2 ]
endif
if ( n := ascan( dat_, {|e_| e_[ 1 ] == "serverport" } ) ) > 0
cPort := dat_[ n,2 ]
endif
if ( n := ascan( dat_, {|e_| e_[ 1 ] == "application" } ) ) > 0
cAppln := dat_[ n,2 ]
endif
if ( n := ascan( dat_, {|e_| e_[ 1 ] == "parameters" } ) ) > 0
cParams := dat_[ n,2 ]
endif
if ( n := ascan( dat_, {|e_| e_[ 1 ] == "initdirectory" } ) ) > 0
cDirectory := dat_[ n,2 ]
endif
endif
endif
if !empty( cAddress )
if empty( cPort ) .or. empty( cAppln )
cAddress := ""
endif
endif
// Defaults to Vouch Server
//
if empty( cAddress )
cAddress := "localhost"
cPort := "8085"
cAppln := "trm_app.exe"
cParams := ""
cDirectory := hb_DirBase()
endif
if empty( cParams )
cParams := ""
endif
if empty( cDirectory )
cDirectory := ""
endif
Return nil
//----------------------------------------------------------------------//
Function TrmServeServer( Socket, cAddress, cServerInfo )
Local nPort, a_, nError
Local nSeconds := Seconds()
Local nKey
a_:= hb_aTokens( cServerInfo, ";" )
nPort := val( a_[ 2 ] )
s_commSocket := Hb_INetConnect( cAddress, nPort )
do while Hb_INetErrorCode( s_commSocket ) != 0
s_commSocket := Hb_INetConnect( cAddress, nPort )
if Seconds()-nSeconds > 60 .or. Seconds()-nSeconds < 0
exit
endif
enddo
IF Hb_InetErrorCode( s_commSocket ) != 0
Hb_INetClose( Socket )
DispOutAt( 17,0, padc( "Can't connect with " + cAddress+": " + Hb_InetErrorDesc( s_commSocket ),maxcol()+1), "w+/n" )
DispOutAt( 18,0, padc( "Press a key to terminate the program", maxcol()+1 ), "w+/n" )
Inkey(0)
quit
ENDIF
// Very Important Factor 10-50 ok
//
Hb_INetTimeout( s_commSocket, -1 )
Hb_INetSend( Socket, "ARCONNECTED" + CR_LF )
Hb_INetClose( Socket )
// Wvt_SetTimer( TIMER_RECEIVE, 10 )
// Wvt_SetTimer( TIMER_SEND , 1 )
// Wvt_SetTimer( TIMER_CLOCK , 5000 )
// Wvt_SetTimer( TIMER_PING , 3000 )
hb_threadStart( @Thread_Receive(), 0.01 )
hb_threadStart( @Thread_Send() , 1 / 1000 )
hb_threadStart( @Thread_Ping() , 3 )
hb_threadStart( @Thread_Clock() , 5 )
do while .t.
nKey := Inkey( 0, INKEY_ALL )
IF s_commSocket <> NIL .AND. ! Empty( nKey )
s_lSending := .T.
hb_inetSendAll( s_commSocket, hb_ntos( nKey ) + CR_LF )
s_lSending := .F.
ENDIF
nError := hb_inetErrorCode( s_commSocket )
IF AScan( { -2, WSAECONNABORTED, 10054 }, nError ) > 0
EXIT
ENDIF
enddo
// Wvt_KillTimer( TIMER_RECEIVE )
// Wvt_KillTimer( TIMER_SEND )
// Wvt_KillTimer( TIMER_CLOCK )
// Wvt_KillTimer( TIMER_PING )
Return nil
//----------------------------------------------------------------------//
Function TrmReceiveServer()
Local a_, b_, cBuffer, nBytes, cCommand, cData, cOdd, cEvn, n
LOCAL cOdd1, cEvn1
if !( s_lReceiving ) .and. ( s_commSocket != NIL )
s_lReceiving := .t.
if ( nBytes := Hb_INetDataReady( s_commSocket ) ) > 0
Hb_INetTimeout( s_commSocket, 10 )
cBuffer := Hb_INetRecvEndBlock( s_commSocket, "|/END\|", @nBytes )
Hb_INetTimeout( s_commSocket, -1 )
if nBytes > 0 .and. !empty( cBuffer )
s_nTotalBytes += nBytes
do while .t.
cCommand := TrmFetchCommand( @cBuffer, @cData )
if empty( cCommand )
exit
endif
do case
case cCommand == "SCR"
s_nScreens++
a_:= Str2A( cData, "</E?>" )
b_:= hb_aTokens( a_[ 1 ], ";" )
aeval( b_, {|e,i| b_[ i ] := val( e ) } )
n := ( b_[ 3 ]-b_[ 1 ]+1 ) * ( b_[ 4 ]-b_[ 2 ]+1 )
cOdd1 := substr( a_[ 2 ], 1, b_[ 5 ] )
cOdd := hb_zuncompress( cOdd1, n )
cEvn1 := substr( a_[ 2 ], b_[ 5 ]+1 )
cEvn := hb_zuncompress( cEvn1, n )
RestScreen( b_[ 1 ], b_[ 2 ], b_[ 3 ], b_[ 4 ], CharMix( cOdd, cEvn ) )
case cCommand == "CRS"
a_:= hb_aTokens( @cData, ";" )
SetPos( val( a_[ 1 ] ), val( a_[ 2 ] ) )
SetCursor( val( a_[ 3 ] ) )
case cCommand == "ID"
// Verify if objects are serialized and executed accordingly
case cCommand == "MUSIC"
PlayMusic( cData )
case cCommand == "CLK_ONOFF"
SetClock( cData == "TRUE" )
case cCommand == "CLK_INFO"
SetClockInfo( cData )
case cCommand == "BLK"
BEGIN SEQUENCE
Eval( COMPILE( cData ) )
ENDSEQUENCE
endcase
enddo
endif
ENDIF
s_lReceiving := .f.
endif
Return 0
STATIC PROCEDURE Thread_Receive( nWait )
DO WHILE .T.
TrmReceiveServer()
hb_idleSleep( nWait )
ENDDO
RETURN
STATIC PROCEDURE Thread_Send( nWait )
DO WHILE .T.
inkey()
hb_idleSleep( nWait )
ENDDO
RETURN
STATIC PROCEDURE Thread_Ping( nWait )
DO WHILE .T.
Keyboard( 1021 )
hb_idleSleep( nWait )
ENDDO
RETURN
STATIC PROCEDURE Thread_Clock( nWait )
DO WHILE .T.
DispClock()
hb_idleSleep( nWait )
ENDDO
RETURN
//----------------------------------------------------------------------//
Static Function TrmFetchCommand( cBuffer, cData )
Local cToken, c, cCmd := ""
Local n
if left( @cBuffer,1 ) == "<"
if ( n := at( ">", @cBuffer ) ) > 0
c := substr( cBuffer, 2, n-2 )
cBuffer := substr( cBuffer, n+1 )
cToken := "</"+ c +">"
if ( n := at( cToken, cBuffer ) ) > 0
cData := substr( cBuffer, 1, n-1 )
cBuffer := substr( cBuffer, n+len( cToken ) )
cCmd := c
endif
endif
endif
Return cCmd
//----------------------------------------------------------------------//
Static Function TrmReceiveALine( Socket, cInfo )
Local lRet := .t.
Local nBytes
do while .t.
if Hb_InetDataReady( Socket, 100 ) > 0
BEGIN SEQUENCE
cInfo := Hb_InetRecvLine( Socket, @nBytes )
RECOVER
lRet := .f.
END
exit
endif
enddo
Return lRet
//----------------------------------------------------------------------//
Static Function uiDebug( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10 )
#ifdef __TRACE__
Local cDebug := ""
if p1 <> nil
cDebug += uiXtos( p1 )
endif
if p2 <> nil
cDebug += " " + uiXtos( p2 )
endif
if p3 <> nil
cDebug += " " + uiXtos( p3 )
endif
if p4 <> nil
cDebug += " " + uiXtos( p4 )
endif
if p5 <> nil
cDebug += " " + uiXtos( p5 )
endif
if p6 <> nil
cDebug += " " + uiXtos( p6 )
endif
if p7 <> nil
cDebug += " " + uiXtos( p7 )
endif
if p8 <> nil
cDebug += " " + uiXtos( p8 )
endif
if p9 <> nil
cDebug += " " + uiXtos( p9 )
endif
if p10 <> nil
cDebug += " " + uiXtos( p10 )
endif
if s_lTraceLog
DbgTraceLog( cDebug )
else
wapi_OutputDebugString( cDebug )
endif
#endif
Return nil
//----------------------------------------------------------------------//
Static Function TrmXtoS( xVar )
Local cType := valtype( xVar )
do case
case cType $ "CM"
case cType == "N"
xVar := ltrim( str( xVar ) )
case cType == "D"
xVar := dtoc( xVar )
case cType == "L"
xVar := if( xVar, "T","F" )
otherwise
xVar := ""
endcase
Return xVar
//----------------------------------------------------------------------//
Static Function Str2A( cStr, cDel )
Local a_:={}, n
Local nlen
nLen := len( cDel )
do while .t.
if ( n := at( cDel, cStr ) ) == 0
exit
endif
aadd( a_, substr( cStr,1,n-1 ) )
cStr := substr( cStr,n+nLen )
enddo
Return a_
//----------------------------------------------------------------------//
FUNCTION uiXtos( xVar )
SWITCH ValType( xVar )
CASE "C"
RETURN xVar
CASE "N"
RETURN Str( xVar )
CASE "D"
RETURN DToC( xVar )
CASE "L"
RETURN iif( xVar, "Yes", "No " )
ENDSWITCH
RETURN "NIL"
//----------------------------------------------------------------------//
Static Function TrmInitFont()
#define __JUSTGT__
#ifdef __JUSTGT__
/* set OEM font encoding for non unicode modes */
hb_gtInfo( HB_GTI_CODEPAGE, 255 )
/* Set EN CP-437 encoding */
hb_cdpSelect( "EN" )
hb_setTermCP( "EN" )
#ifdef __WINCE__
/* Set font size */
hb_gtInfo( HB_GTI_FONTSIZE, 10 )
hb_gtInfo( HB_GTI_FONTWIDTH, 5 )
#endif
#else
Local cFont := GetEnv( "VouchFont" )
Local nSize := val( GetEnv( "VouchFontSize" ) )
Local nScrWidth
Wvt_SetCodepage( 255 )
hb_cdpSelect( "EN" )
hb_setTermCP( "EN" )
if empty( cFont )
cFont := "Courier New"
endif
if empty( nSize )
nScrWidth := Wvt_GetScreenWidth()
if nScrWidth >= 1280
nSize := 28
elseif nScrWidth >= 1200
nSize := 22
elseif nScrWidth >= 1000
nSize := 18
elseif nScrWidth >= 800
nSize := 16
else
nSize := 15
endif
endif
Wvt_SetFont( cFont, nSize, 0, 0 )
#endif
SetMode( 25,80 )
return nil
//----------------------------------------------------------------------//
Static Function TrmDispLogin( cAddress, cPort )
Local nMaxCol := maxcol()+1
DispOutAt( 0,0, padc( "Vouch Client "+VouchClientVersion, nMaxCol ), "W+/r" )
DispOutAt( 10,0, padc( "...Please Wait...", nMaxCol ), "W+/N" )
DispOutAt( 12,0, padc( "Securing Server Connection", nMaxCol ), "W+/N" )
DispOutAt( 13,0, padc( "Address[ "+cAddress+" ] Port[ "+cPort+" ]", nMaxCol ), "W+/N" )
DispOutAt( maxrow(), 0, padc( "the software that GROWS with you", nMaxCol ), "W+/r" )
Return nil
//----------------------------------------------------------------------//
Static Function SetClockInfo( cData )
Local lInfo, a_
static aInfo := {}
lInfo := aclone( aInfo )
if cData <> NIL
a_:= hb_aTokens( cData, ";" )
if len( a_ ) >= 3
aInfo := { val( a_[ 1 ] ), val( a_[ 2 ] ), a_[ 3 ] }
endif
endif
Return lInfo
//----------------------------------------------------------------------//
Static Function SetClock( lOnOff )
Local oClock
static lClock := .f.
oClock := lClock
if valtype( lOnOff ) == "L"
lClock := lOnOff
endif
Return oClock
//----------------------------------------------------------------------//
Static Function DispClock()
Local aInfo, nCrs, nRow, nCol
if SetClock()
if !empty( aInfo := SetClockInfo() )
nCrs := SetCursor( SC_NONE )
nRow := row()
nCol := col()
DispOutAt( aInfo[ 1 ], aInfo[ 2 ], time(), aInfo[ 3 ] )
setpos( nRow,nCol )
SetCursor( nCrs )
endif
endif
Return nil
//----------------------------------------------------------------------//
Static Function PlayMusic( cTheme )
do case
case cTheme == "THUD"
tone(60,0.5)
case cTheme == "WAITON"
tone(800,1); tone(1600,1)
case cTheme == "WAITOFF"
tone(1600,1); tone(800,1)
case cTheme == "CHARGE"
Eval( {|| tone(523,2),tone(698,2),tone(880,2),tone(1046,4),tone(880,2),tone(1046,8) } )
case cTheme == "NANNYBOO"
AEval( {{196,2},{196,2},{164,2},{220,2},{196,4},{164,4}}, {|a| tone(a[1],a[2]) } )
case cTheme == "BADKEY"
tone(480,0.25); tone(240,0.25)
endcase
Return nil
//----------------------------------------------------------------------//
#define S_LBL 1
#define S_TYP 2
#define S_LEN 3
#define S_DEC 4
#define S_PIC 5
#define S_ROW 6
#define S_COL 7
#define S_CLR 8
#define S_DEF 9
Static Function GetForm( cForm )
Local cReply := ""
Local i, scr
Local aFields
Local a_
Local frm_:={}
Local getlist := {}
aFields := hb_aTokens( cForm, "^" )
for i := 1 to len( aFields )
//a_:= Str2A( aFields[ i ], "," )
a_:= hb_aTokens( aFields[ i ], "," )
a_[ S_LEN ] := val(a_[ S_LEN ])
a_[ S_DEC ] := val(a_[ S_DEC ])
a_[ S_ROW ] := val(a_[ S_ROW ])
a_[ S_COL ] := val(a_[ S_COL ])
if empty( a_[ S_CLR ] )
a_[ S_CLR ] := "W+/BG,W+/B"
endif
if empty( a_[ S_PIC ] )
a_[ S_PIC ] := "@ "
endif
do case
case a_[ S_TYP ] == "C"
a_[ S_DEF ] := pad( a_[ S_DEF ], a_[ S_LEN ] )
case a_[ S_TYP ] == "N"
a_[ S_DEF ] := val( a_[ S_DEF ] )
case a_[ S_TYP ] == "D"
a_[ S_DEF ] := ctod( a_[ S_DEF ] )
case a_[ S_TYP ] == "L"
a_[ S_DEF ] := if( a_[ S_DEF ] == "T", .t., .f. )
endcase
/*
aadd( frm_, { a_[ S_LBL ], a_[ S_TYP ], a_[ S_LEN ], a_[ S_DEC ], ;
a_[ S_PIC ], a_[ S_ROW ], a_[ S_COL ], a_[ S_CLR ], a_[ S_DEF ] } )
*/
aadd( frm_, a_ )
next
scr := savescreen( 0,0,maxrow(),maxcol() )
cls
for i := 1 to len( frm_ )
DispOutAt( frm_[ i,S_ROW ], frm_[ i,S_COL ]-10, frm_[ i,S_LBL ], "W+/B" )
@ frm_[ i,S_ROW ], frm_[ i,S_COL ] GET frm_[ i,S_DEF ] ;
PICTURE frm_[ i,S_PIC ] COLOR frm_[ i,S_CLR ]
next
READ
RestScreen( 0,0,maxrow(),maxcol(),scr )
for i := 1 to len( frm_ )
cReply += TrmXtos( frm_[ i,S_DEF ] ) + "^"
next
Return cReply
//----------------------------------------------------------------------//
Static Function dbgTraceLog( cString, cFile )
Local lRet := .f.
Local nBytes
static nHandle
if nHandle == NIL
if ( nHandle := fopen( cFile,FO_WRITE ) ) == F_ERROR
if ( nHandle := fcreate( cFile ) ) == F_ERROR
Return .f.
endif
endif
endif
if nHandle <> F_ERROR
fseek( nHandle, 0, FS_END )
nBytes := fwrite( nHandle, cString+chr(13)+chr(10), len( cString )+2 )
lRet := nBytes == len( cString )+2
endif
Return lRet
//----------------------------------------------------------------------//