diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 25c10458ce..890fd6b8ae 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,43 @@ The license applies to all entries newer than 2009-04-28. */ +2011-01-25 12:41 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) + * contrib/hbxbp/xbp3state.prg + * contrib/hbxbp/xbpbrowse.prg + * contrib/hbxbp/xbpcheckbox.prg + * contrib/hbxbp/xbpdataref.prg + * contrib/hbxbp/xbplistbox.prg + * contrib/hbxbp/xbpmenubar.prg + * contrib/hbxbp/xbpmle.prg + * contrib/hbxbp/xbpradiobutton.prg + * contrib/hbxbp/xbpscrollbar.prg + * contrib/hbxbp/xbpsle.prg + * contrib/hbxbp/xbpspinbutton.prg + * contrib/hbxbp/xbptoolbar.prg + * contrib/hbxbp/xbptreeview.prg + * contrib/hbxbp/xbpwindow.prg + ! Renamed: XbpDataRef() => DataRef() to be exact Xbase++ compatible. + + XbpMenu():popup() + + * contrib/hbnetio/netiosrv.c + + Added: NETIO_SRVOPENFILES( pConnectionSocket ) -> nFilesOpen + + + contrib/hbnetio/utils/harbour.ico + + contrib/hbnetio/utils/about.png + + contrib/hbnetio/utils/exit.png + + contrib/hbnetio/utils/fullscreen.png + + contrib/hbnetio/utils/harbour.png + + contrib/hbnetio/utils/help.png + + contrib/hbnetio/utils/terminate.png + + contrib/hbnetio/utils/netiosrvq.qrc + + contrib/hbnetio/utils/netiosrvq.prg + + contrib/hbnetio/utils/netiosrvqt.hbp + + Added: GUI NetIO Server based on hbXBP and hbQT. + implements : DateTime In, DateTime Out, IP connected from, + Port number connected from, number of files open. + implements : Termination of a particular connection + via context menu or toolbar icon. + 2011-01-24 23:12 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/include/hbcomp.h * harbour/src/compiler/cmdcheck.c diff --git a/harbour/contrib/hbnetio/netiosrv.c b/harbour/contrib/hbnetio/netiosrv.c index 7123e05b6e..24898b976a 100644 --- a/harbour/contrib/hbnetio/netiosrv.c +++ b/harbour/contrib/hbnetio/netiosrv.c @@ -1387,3 +1387,14 @@ HB_FUNC( NETIO_SRVSOCKET ) if( conn ) hb_socketItemPut( hb_stackReturnItem(), conn->sd ); } + +HB_FUNC( NETIO_SRVOPENFILES ) +{ + PHB_CONSRV conn = s_consrvParam( 1 ); + + if( conn ) + hb_retni( conn->filesCount ); + else + hb_retni( 0 ) +} + diff --git a/harbour/contrib/hbnetio/utils/about.png b/harbour/contrib/hbnetio/utils/about.png new file mode 100644 index 0000000000..873294b3a9 Binary files /dev/null and b/harbour/contrib/hbnetio/utils/about.png differ diff --git a/harbour/contrib/hbnetio/utils/exit.png b/harbour/contrib/hbnetio/utils/exit.png new file mode 100644 index 0000000000..cb7ceb0ce0 Binary files /dev/null and b/harbour/contrib/hbnetio/utils/exit.png differ diff --git a/harbour/contrib/hbnetio/utils/fullscreen.png b/harbour/contrib/hbnetio/utils/fullscreen.png new file mode 100644 index 0000000000..c4a33524ec Binary files /dev/null and b/harbour/contrib/hbnetio/utils/fullscreen.png differ diff --git a/harbour/contrib/hbnetio/utils/harbour.ico b/harbour/contrib/hbnetio/utils/harbour.ico new file mode 100644 index 0000000000..f92a768e65 Binary files /dev/null and b/harbour/contrib/hbnetio/utils/harbour.ico differ diff --git a/harbour/contrib/hbnetio/utils/harbour.png b/harbour/contrib/hbnetio/utils/harbour.png new file mode 100644 index 0000000000..8fdffd4dc2 Binary files /dev/null and b/harbour/contrib/hbnetio/utils/harbour.png differ diff --git a/harbour/contrib/hbnetio/utils/help.png b/harbour/contrib/hbnetio/utils/help.png new file mode 100644 index 0000000000..9f15e06b0f Binary files /dev/null and b/harbour/contrib/hbnetio/utils/help.png differ diff --git a/harbour/contrib/hbnetio/utils/netiosrvq.prg b/harbour/contrib/hbnetio/utils/netiosrvq.prg new file mode 100644 index 0000000000..ce9c04172a --- /dev/null +++ b/harbour/contrib/hbnetio/utils/netiosrvq.prg @@ -0,0 +1,894 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * demonstration/test code for alternative RDD IO API which uses own + * very simple TCP/IP file server. + * + * Copyright 2009 Przemyslaw Czerpak + * www - http://harbour-project.org + * + */ + +/* + * The following parts are Copyright of the individual authors. + * www - http://harbour-project.org + * + * Copyright 2010 Viktor Szakats (harbour.01 syenar.hu) + * Copyright 2011 Pritpal Bedi + * + * See COPYING for licensing terms. + * + */ + +/* netio_mtserver() needs MT HVM version */ +REQUEST HB_MT +REQUEST __HB_EXTERN__ + +#define _RPC_FILTER "HBNETIOSRV_RPCMAIN" + +#define _NETIOSRV_nPort 1 +#define _NETIOSRV_cIFAddr 2 +#define _NETIOSRV_cRootDir 3 +#define _NETIOSRV_lRPC 4 +#define _NETIOSRV_cRPCFFileName 5 +#define _NETIOSRV_hRPCFHRB 6 +#define _NETIOSRV_lEncryption 7 +#define _NETIOSRV_pListenSocket 8 +#define _NETIOSRV_nCompressionLevel 9 +#define _NETIOSRV_nStrategy 10 +#define _NETIOSRV_cPassword 11 +#define _NETIOSRV_MAX_ 11 + +#define DAT_HBSOCKET 1 +#define DAT_SERIAL 2 +#define DAT_ACTIVATED 3 +#define DAT_IP 4 +#define DAT_PORT 5 +#define DAT_TIMEIN 6 +#define DAT_TIMEOUT 7 +#define DAT_BYTESIN 8 +#define DAT_BYTESOUT 9 +#define DAT_CONNSOCKET 10 +#define DAT_OPENFILES 11 + +#include "hbhrb.ch" +#include "fileio.ch" +#include "hbclass.ch" +#include "common.ch" +#include "hbqtgui.ch" + +#include "Xbp.ch" +#include "Gra.ch" +#include "Appevent.ch" + +#define RGB( r, g, b ) GraMakeRGBColor( { r, g, b } ) + +THREAD STATIC hSocket + +/*----------------------------------------------------------------------*/ + +Function Main( ... ) + LOCAL netiosrv[ _NETIOSRV_MAX_ ] + LOCAL cParam, cExt, cFile + + netiosrv[ _NETIOSRV_nPort ] := 2941 + netiosrv[ _NETIOSRV_cIFAddr ] := "0.0.0.0" + netiosrv[ _NETIOSRV_cRootDir ] := hb_dirBase() + netiosrv[ _NETIOSRV_lRPC ] := .F. + netiosrv[ _NETIOSRV_lEncryption ] := .F. + + FOR EACH cParam IN { ... } + DO CASE + CASE Lower( Left( cParam, 6 ) ) == "-port=" + netiosrv[ _NETIOSRV_nPort ] := Val( SubStr( cParam, 7 ) ) + CASE Lower( Left( cParam, 7 ) ) == "-iface=" + netiosrv[ _NETIOSRV_cIFAddr ] := SubStr( cParam, 8 ) + CASE Lower( Left( cParam, 9 ) ) == "-rootdir=" + netiosrv[ _NETIOSRV_cRootDir ] := SubStr( cParam, 10 ) + CASE Lower( Left( cParam, 6 ) ) == "-pass=" + netiosrv[ _NETIOSRV_cPassword ]:= SubStr( cParam, 7 ) + hb_StrClear( @cParam ) + CASE Lower( Left( cParam, 5 ) ) == "-rpc=" + netiosrv[ _NETIOSRV_cRPCFFileName ] := SubStr( cParam, 6 ) + hb_FNameSplit( netiosrv[ _NETIOSRV_cRPCFFileName ], NIL, NIL, @cExt ) + cExt := Lower( cExt ) + SWITCH cExt + CASE ".prg" + CASE ".hbs" + CASE ".hrb" + EXIT + OTHERWISE + cExt := FileSig( cFile ) + ENDSWITCH + SWITCH cExt + CASE ".prg" + CASE ".hbs" + cFile := HB_COMPILEBUF( HB_ARGV( 0 ), "-n2", "-w", "-es2", "-q0",; + "-D" + "__HBSCRIPT__HBNETIOSRV", netiosrv[ _NETIOSRV_cRPCFFileName ] ) + IF cFile != NIL + netiosrv[ _NETIOSRV_hRPCFHRB ] := hb_hrbLoad( HB_HRB_BIND_FORCELOCAL, cFile ) + ENDIF + EXIT + OTHERWISE + netiosrv[ _NETIOSRV_hRPCFHRB ] := hb_hrbLoad( HB_HRB_BIND_FORCELOCAL, netiosrv[ _NETIOSRV_cRPCFFileName ] ) + EXIT + ENDSWITCH + netiosrv[ _NETIOSRV_lRPC ] := ! Empty( netiosrv[ _NETIOSRV_hRPCFHRB ] ) .AND. ! Empty( hb_hrbGetFunSym( netiosrv[ _NETIOSRV_hRPCFHRB ], _RPC_FILTER ) ) + IF ! netiosrv[ _NETIOSRV_lRPC ] + netiosrv[ _NETIOSRV_cRPCFFileName ] := NIL + netiosrv[ _NETIOSRV_hRPCFHRB ] := NIL + ENDIF + CASE Lower( cParam ) == "-rpc" + netiosrv[ _NETIOSRV_lRPC ] := .T. + CASE Lower( cParam ) == "--version" + RETURN NIL + CASE Lower( cParam ) == "-help" .OR. ; + Lower( cParam ) == "--help" + HB_Usage() + RETURN NIL + OTHERWISE + OutStd( "Warning: Unkown parameter ignored: " + cParam + hb_eol() ) + ENDCASE + NEXT + + NetIOServer():new():create( netiosrv ) + + RETURN ( NIL ) + +/*----------------------------------------------------------------------*/ + +CLASS NetIOServer + DATA nNumConxn INIT 0 + DATA oDlg + DATA oBrw + DATA oBrowser + DATA cTitle + DATA pMtx + DATA oSys + DATA lSystemTrayAvailable + DATA oSysMenu + DATA qTimer + DATA qLayout + DATA qAct1 + DATA qAct2 + DATA nPrevWindowState + DATA lChanging INIT .f. + DATA lQuit INIT .f. + DATA nCurRec INIT 1 + DATA aData INIT { { NIL, ; // hSock + 0 , ; // nSerial + .F., ; // lActive + " ", ; // cIP + 0 , ; // nPort + " ", ; // time-in + " ", ; // time-out + 0 , ; // bytes-in + 0 , ; // bytes-out + NIL, ; // conn socket + 0 } } // files opened + + METHOD new() + METHOD create( netiosrv ) + METHOD execEvent( cEvent, p ) + + METHOD custom_netio_server( pConnectionSocket ) + METHOD register_connection( pConnectionSocket ) + METHOD unregister_connection( pConnectionSocket ) + + METHOD buildToolBar() + METHOD buildSystemTray() + METHOD buildBrowser() + + METHOD refresh() + METHOD confirmExit() + METHOD showDlgBySystemTrayIconCommand() + + METHOD terminate() + METHOD buildColumns() + + METHOD skipBlock( nHowMany ) + METHOD goTop() + METHOD goBottom() + METHOD lastRec() + METHOD recNo() + METHOD goto( nRec ) + + ENDCLASS + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:new() + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:create( netiosrv ) + LOCAL nEvent, mp1, mp2, oXbp + + netiosrv[ _NETIOSRV_pListenSocket ] := ; + netio_mtserver( netiosrv[ _NETIOSRV_nPort ],; + netiosrv[ _NETIOSRV_cIFAddr ],; + netiosrv[ _NETIOSRV_cRootDir ],; + iif( Empty( netiosrv[ _NETIOSRV_hRPCFHRB ] ), netiosrv[ _NETIOSRV_lRPC ], ; + hb_hrbGetFunSym( netiosrv[ _NETIOSRV_hRPCFHRB ], _RPC_FILTER ) ),; + netiosrv[ _NETIOSRV_cPassword ], ; + netiosrv[ _NETIOSRV_nCompressionLevel ], ; + netiosrv[ _NETIOSRV_nStrategy ], ; + {|p| ::custom_netio_server( p ) } ) + + netiosrv[ _NETIOSRV_lEncryption ] := ! Empty( netiosrv[ _NETIOSRV_cPassword ] ) + + IF Empty( netiosrv[ _NETIOSRV_pListenSocket ] ) + MsgBox( "Cannot start server." ) + + ELSE + QResource():registerResource_1( hbqtres_netiosrvq(), ":/resource" ) + + ::pMtx := hb_mutexCreate() + ::cTitle := "NetIO Server [ " + netiosrv[ _NETIOSRV_cIFAddr ] + " : " + ; + ltrim( str( int( netiosrv[ _NETIOSRV_nPort ] ) ) ) + " : " + ; + netiosrv[ _NETIOSRV_cRootDir ] + " ]" + + ::oDlg := XbpDialog():new( , , { 20,20 }, { 800,300 } ) + ::oDlg:title := ::cTitle + ::oDlg:taskList := .T. + ::oDlg:close := {|| ::confirmExit() } + ::oDlg:create() + ::oDlg:drawingArea:setFontCompoundName( "10.Ariel" ) + ::oDlg:setWindowIcon( ":/harbour.png" ) + + ::buildToolBar() + + ::qLayout := QGridLayout() + ::qLayout:setContentsMargins( 0,0,0,0 ) + ::qLayout:setHorizontalSpacing( 0 ) + ::qLayout:setVerticalSpacing( 0 ) + // + ::oDlg:drawingArea:setLayout( ::qLayout ) + + ::buildBrowser() + + ::oDlg:oWidget:connect( QEvent_WindowStateChange, {|e| ::execEvent( "QEvent_WindowStateChange", e ) } ) + ::oDlg:oWidget:connect( QEvent_Hide , {|e| ::execEvent( "QEvent_Hide" , e ) } ) + // + ::buildSystemTray() + + SetAppWindow( ::oDlg ) + SetAppFocus( ::oDlg ) + + DO WHILE nEvent <> xbeP_Quit + nEvent := AppEvent( @mp1, @mp2, @oXbp ) + oXbp:handleEvent( nEvent, mp1, mp2 ) + ENDDO + + netio_serverStop( netiosrv[ _NETIOSRV_pListenSocket ] ) + netiosrv[ _NETIOSRV_pListenSocket ] := NIL + + ::oDlg:destroy() + ENDIF + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:custom_netio_server( pConnectionSocket ) + ::register_connection( pConnectionSocket ) + BEGIN SEQUENCE + netio_server( pConnectionSocket ) + END SEQUENCE + ::unregister_connection( pConnectionSocket ) + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:register_connection( pConnectionSocket ) + LOCAL aPeer, cIP := "", nPort := 0 + + hSocket := netio_srvSocket( pConnectionSocket ) + + aPeer := hb_socketGetPeerName( hSocket ) + IF hb_isArray( aPeer ) + IF len( aPeer ) >= 2 + cIP := xtos( aPeer[ 2 ] ) + ENDIF + IF len( aPeer ) >= 3 + nPort := val( xtos( aPeer[ 3 ] ) ) + ENDIF + ENDIF + + IF hb_mutexLock( ::pMtx ) + IF ::aData[ 1,2 ] == 0 + ::aData[ 1 ] := { hSocket, 1, .t., pad( cIP, 15 ), nPort, dtoc( date() ) + " " + time(), space( 18 ), 0, 0, pConnectionSocket, 0 } + ELSE + aadd( ::aData, { hSocket, len( ::aData ) + 1, .t., pad( cIP, 15 ), nPort, dtoc( date() ) + " " + time(), space( 18 ), 0, 0, pConnectionSocket, 0 } ) + ENDIF + hb_mutexUnlock( ::pMtx ) + ENDIF + ::nNumConxn++ + ::oDlg:title := ::cTitle + " - " + ltrim( str( ::nNumConxn, 6, 0 ) ) + ::refresh() + + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:unregister_connection( pConnectionSocket ) + LOCAL n + + HB_SYMBOL_UNUSED( pConnectionSocket ) + ::nNumConxn-- + ::oDlg:title := ::cTitle + " - " + ltrim( str( ::nNumConxn, 6, 0 ) ) + if ( n := ascan( ::aData, {|e_| e_[ DAT_HBSOCKET ] == hSocket } ) ) > 0 + IF hb_mutexLock( ::pMtx ) + ::aData[ n, DAT_ACTIVATED ] := .f. + ::aData[ n, DAT_TIMEOUT ] := dtoc( date() ) + " " + time() + ::aData[ n, DAT_HBSOCKET ] := NIL + ::aData[ n, DAT_CONNSOCKET ] := NIL + hb_mutexUnlock( ::pMtx ) + ENDIF + ENDIF + hSocket := NIL + ::refresh() + + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:execEvent( cEvent, p ) + LOCAL qEvent, oMenu, txt_, s + + SWITCH cEvent + CASE "browser_contextMenu" + oMenu := XbpMenu():new():create() + oMenu:addItem( { "Terminate", {|| ::terminate() } } ) + oMenu:popup( ::oBrw, p ) + EXIT + CASE "tool_button_clicked" + SWITCH p + CASE "Help" + Hb_Usage() + EXIT + CASE "About" + txt_:= {} + AAdd( txt_, "Harbour NetIO Server" ) + AAdd( txt_, "Developed by:" ) + AAdd( txt_, "Przemyslaw Czerpak" ) + AAdd( txt_, "Viktor Szakats" ) + AAdd( txt_, "Pritpal Bedi" ) + AAdd( txt_, "" ) + AAdd( txt_, "built with:" ) + AAdd( txt_, HB_VERSION() ) + AAdd( txt_, HB_COMPILER() ) + AAdd( txt_, "Qt " + QT_VERSION_STR() ) + AAdd( txt_, "" ) + AAdd( txt_, "Visit the project website at:" ) + AAdd( txt_, "http://harbour-project.org/" ) + s := "" + aeval( txt_, {|e| s += e + chr( 10 ) } ) + MsgBox( s, " About NetIO Server" ) + EXIT + CASE "Terminate" + ::terminate() + EXIT + CASE "Exit" + PostAppEvent( xbeP_Quit, , , ::oDlg ) + EXIT + ENDSWITCH + EXIT + CASE "QEvent_WindowStateChange" + qEvent := QWindowStateChangeEventFromPointer( p ) + ::nPrevWindowState := qEvent:oldState() + EXIT + CASE "QEvent_Hide" + IF ::lSystemTrayAvailable + qEvent := QHideEventFromPointer( p ) + IF ! ::lChanging + ::lChanging := .t. + IF qEvent:spontaneous() + IF empty( ::qTimer ) + ::qTimer := QTimer() + ::qTimer:setSingleShot( .t. ) + ::qTimer:setInterval( 250 ) + ::qTimer:connect( "timeout()", {|| ::execEvent( "qTimer_timeOut" ) } ) + ENDIF + ::qTimer:start() + qEvent:ignore() + ENDIF + ::lChanging := .f. + ENDIF + ENDIF + EXIT + CASE "qTimer_timeOut" + ::oDlg:hide() + ::oSys:setToolTip( "Harbour NetIO Server: " + ::oDlg:title ) + ::oSys:show() + EXIT + CASE "qSystemTrayIcon_activated" + IF p == QSystemTrayIcon_Trigger + ::showDlgBySystemTrayIconCommand() + ELSEIF p == QSystemTrayIcon_DoubleClick + ELSEIF p == QSystemTrayIcon_Context + ELSEIF p == QSystemTrayIcon_MiddleClick + ENDIF + EXIT + CASE "qSystemTrayIcon_show" + ::showDlgBySystemTrayIconCommand() + EXIT + CASE "qSystemTrayIcon_close" + PostAppEvent( xbeP_Quit, NIL, NIL, ::oDlg ) + EXIT + ENDSWITCH + + RETURN 0 + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:showDlgBySystemTrayIconCommand() + + ::oSys:hide() + + IF hb_bitAnd( ::nPrevWindowState, Qt_WindowMaximized ) == Qt_WindowMaximized + ::oDlg:oWidget:showMaximized() + ELSEIF hb_bitAnd( ::nPrevWindowState, Qt_WindowFullScreen ) == Qt_WindowFullScreen + ::oDlg:oWidget:showFullScreen() + ELSE + ::oDlg:oWidget:showNormal() + ENDIF + + ::oDlg:oWidget:raise() + ::oDlg:oWidget:activateWindow() + + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:buildBrowser() + LOCAL s + + ::oBrw := XbpBrowse():new():create( ::oDlg:drawingArea, , { 0,0 }, ::oDlg:currentSize() ) + ::oBrw:setFontCompoundName( "10.Courier" ) + + ::qLayout:addWidget( ::oBrw:oWidget, 0, 0, 1, 1 ) + + ::oBrw:skipBlock := {|n| ::skipBlock( n ) } + ::oBrw:goTopBlock := {| | ::goTop() } + ::oBrw:goBottomBlock := {| | ::goBottom() } + // + ::oBrw:firstPosBlock := {| | 1 } + ::oBrw:lastPosBlock := {| | ::lastRec() } + + ::oBrw:posBlock := {| | ::recNo() } + ::oBrw:goPosBlock := {|n| ::goto( n ) } + ::oBrw:phyPosBlock := {| | ::recNo() } + + ::oBrw:hbContextMenu := {|mp1| ::execEvent( "browser_contextMenu", mp1 ) } + + s := "selection-background-color: qlineargradient(x1: 0, y1: 0, x2: 0.5, y2: 0.5, stop: 0 #FF92BB, stop: 1 gray); " + ::oBrw:setStyleSheet( s ) + + ::oBrw:cursorMode := XBPBRW_CURSOR_ROW + + ::buildColumns() + + ::oBrw:oWidget:show() + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:terminate() + + IF ::aData[ ::recNo(), DAT_ACTIVATED ] .AND. ::aData[ ::recNo(), DAT_CONNSOCKET ] != NIL + IF ConfirmBox( , ; + "Terminating: " + ::aData[ ::recNo(), DAT_IP ] + " : " + hb_ntos( ::aData[ ::recNo(), DAT_PORT ] ), ; + "Critical, be careful", ; + , ; + XBPMB_CRITICAL ) == XBPMB_RET_OK + + netio_serverStop( ::aData[ ::recNo(), DAT_CONNSOCKET ], .t. ) + ENDIF + ENDIF + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:refresh() + ::oBrw:refreshAll() + ::oBrw:forceStable() + ::oDlg:oWidget:setGeometry( ::oDlg:oWidget:geometry() ) + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:skipBlock( nHowMany ) + LOCAL nRecs, nCurPos, nSkipped + + nRecs := len( ::aData ) + nCurPos := ::nCurRec + + IF nHowMany >= 0 + IF ( nCurpos + nHowMany ) > nRecs + nSkipped := nRecs - nCurpos + ::nCurRec := nRecs + ELSE + nSkipped := nHowMany + ::nCurRec += nHowMany + ENDIF + ELSE + IF ( nCurpos + nHowMany ) < 1 + nSkipped := 1 - nCurpos + ::nCurRec := 1 + ELSE + nSkipped := nHowMany + ::nCurRec += nHowMany + ENDIF + ENDIF + + RETURN nSkipped + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:goTop() + ::nCurRec := 1 + ::refresh() + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:goBottom() + ::nCurRec := len( ::aData ) + ::refresh() + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:goto( nRec ) + IF nRec > 0 .AND. nRec <= len( ::aData ) + ::nCurRec := nRec + ::refresh() + ENDIF + RETURN .t. + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:lastRec() + RETURN len( ::aData ) + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:recNo() + RETURN ::nCurRec + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:buildColumns() + LOCAL aPP, oXbpColumn + LOCAL nClrBG := GRA_CLR_WHITE + LOCAL nClrHFg := GRA_CLR_YELLOW + LOCAL nClrHBg := GRA_CLR_BLUE + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "Sr" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 40 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| strzero( ::aData[ ::recNo(), DAT_SERIAL ], 4 ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "Actv" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 45 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| iif( ::aData[ ::recNo(), DAT_ACTIVATED ], " ", "X" ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "IP" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 150 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| ::aData[ ::recNo(), DAT_IP ] } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "Port" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 55 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| str( ::aData[ ::recNo(), DAT_PORT ], 5, 0 ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "DateTime IN" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 152 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| ::aData[ ::recNo(), DAT_TIMEIN ] } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "DateTime OUT" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 152 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| ::aData[ ::recNo(), DAT_TIMEOUT ] } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "KbIN" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 60 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| str( ::aData[ ::recNo(), DAT_BYTESIN ], 6, 0 ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "KbOUT" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 60 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| str( ::aData[ ::recNo(), DAT_BYTESOUT ], 6, 0 ) } + oXbpColumn:colorBlock := {|| iif( ::aData[ ::recNo,3 ], { GRA_CLR_BLACK, nClrBG }, { GRA_CLR_RED, nClrBG } ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "Files" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 60 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| str( iif( empty( ::aData[ ::recNo(), DAT_CONNSOCKET ] ), 0, ; + netio_srvOpenFiles( ::aData[ ::recNo(), DAT_CONNSOCKET ] ) ), 6, 0 ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:buildToolBar() + LOCAL oTBar + + oTBar := XbpToolBar():new( ::oDlg ) + oTBar:imageWidth := 40 + oTBar:imageHeight := 40 + oTBar:create( , , { 0, ::oDlg:currentSize()[ 2 ]-60 }, { ::oDlg:currentSize()[ 1 ], 60 } ) + oTBar:oWidget:setAllowedAreas( Qt_LeftToolBarArea + Qt_RightToolBarArea + Qt_TopToolBarArea + Qt_BottomToolBarArea ) + oTBar:oWidget:setFocusPolicy( Qt_NoFocus ) + + oTBar:buttonClick := {|oButton| ::execEvent( "tool_button_clicked", oButton:key ) } + + oTBar:addItem( "Exit" , ":/exit.png" , , , , , "Exit" ) + oTBar:addItem( , , , , , XBPTOOLBAR_BUTTON_SEPARATOR ) + oTBar:addItem( "Terminate", ":/terminate.png", , , , , "Terminate" ) + oTBar:addItem( "About" , ":/about.png" , , , , , "About" ) + oTBar:addItem( "Help" , ":/help.png" , , , , , "Help" ) + + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:confirmExit() + + IF ConfirmBox( , "Do you want to shut-down the server ?", " Please confirm", XBPMB_YESNO, XBPMB_CRITICAL ) == XBPMB_RET_YES + PostAppEvent( xbeP_Quit, , , ::oDlg ) + ENDIF + + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:buildSystemTray() + + IF empty( ::oSys ) + ::oSys := QSystemTrayIcon( ::oDlg:oWidget ) + IF ( ::lSystemTrayAvailable := ::oSys:isSystemTrayAvailable() ) + ::oSys:setIcon( ":/harbour.png" ) + ::oSys:connect( "activated(QSystemTrayIcon::ActivationReason)", {|p| ::execEvent( "qSystemTrayIcon_activated", p ) } ) + + ::oSysMenu := QMenu() + ::qAct1 := ::oSysMenu:addAction( ":/fullscreen.png", "&Show" ) + ::oSysMenu:addSeparator() + ::qAct2 := ::oSysMenu:addAction( ":/exit.png", "&Exit" ) + + ::qAct1:connect( "triggered(bool)", {|| ::execEvent( "qSystemTrayIcon_show" ) } ) + ::qAct2:connect( "triggered(bool)", {|| ::execEvent( "qSystemTrayIcon_close" ) } ) + + ::oSys:setContextMenu( ::oSysMenu ) + ::oSys:hide() + ::oSys:setToolTip( "Harbour NetIO Server: " + ::oDlg:title ) + ENDIF + ENDIF + + RETURN nil + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION AppSys() + RETURN ( NIL ) + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION FileSig( cFile ) + LOCAL hFile + LOCAL cBuff, cSig, cExt + + cExt := ".prg" + hFile := FOpen( cFile, FO_READ ) + IF hFile != F_ERROR + cSig := hb_hrbSignature() + cBuff := Space( Len( cSig ) ) + FRead( hFile, @cBuff, Len( cSig ) ) + FClose( hFile ) + IF cBuff == cSig + cExt := ".hrb" + ENDIF + ENDIF + + RETURN cExt + +/*----------------------------------------------------------------------*/ + +STATIC PROCEDURE ShowConfig( netiosrv ) + LOCAL cMsg := "" + + cMsg += "Listening on: " + netiosrv[ _NETIOSRV_cIFAddr ] + ":" + hb_ntos( netiosrv[ _NETIOSRV_nPort ] ) + hb_eol() + cMsg += "Root filesystem: " + netiosrv[ _NETIOSRV_cRootDir ] + hb_eol() + cMsg += "RPC support: " + iif( netiosrv[ _NETIOSRV_lRPC ], "enabled", "disabled" ) + hb_eol() + cMsg += "Encryption: " + iif( netiosrv[ _NETIOSRV_lEncryption ], "enabled", "disabled" ) + hb_eol() + cMsg += "RPC filter module: " + iif( Empty( netiosrv[ _NETIOSRV_hRPCFHRB ] ), iif( netiosrv[ _NETIOSRV_lRPC ], "not set (WARNING: unsafe open server)", "not set" ), netiosrv[ _NETIOSRV_cRPCFFileName ] ) + + MsgBox( cMsg ) + + RETURN + +/*----------------------------------------------------------------------*/ + +STATIC PROCEDURE HB_Logo() + + MsgBox( "Harbour NETIO Server " + HBRawVersion() + hb_eol() +; + "Copyright (c) 2009-2011, Przemyslaw Czerpak" + hb_eol() + ; + "http://harbour-project.org/" ) + + RETURN + +/*----------------------------------------------------------------------*/ + +STATIC PROCEDURE HB_Usage() + LOCAL aMsg := {} + LOCAL cMsg + + AAdd( aMsg, "Syntax:" ) + AAdd( aMsg, " " ) + AAdd( aMsg, " netiosrv [options]" ) + AAdd( aMsg, " " ) + AAdd( aMsg, "Options:" ) + AAdd( aMsg, " " ) + AAdd( aMsg, " -port= accept incoming connections on IP port " ) + AAdd( aMsg, " -iface= accept incoming connections on IPv4 interface " ) + AAdd( aMsg, " -rootdir= use as root directory for served file system" ) + AAdd( aMsg, " -rpc accept RPC requests" ) + AAdd( aMsg, " -rpc= set RPC processor .hrb module to " ) + AAdd( aMsg, hb_StrFormat( " file.hrb needs to have an entry function named %1$s()", _RPC_FILTER ) ) + AAdd( aMsg, " -pass= set server password" ) + AAdd( aMsg, " " ) + AAdd( aMsg, " --version display version header only" ) + AAdd( aMsg, " -help|--help this help" ) + + cMsg := "" + aeval( aMsg, {|e| cMsg += e + chr( 10 ) } ) + MsgBox( cMsg ) + + RETURN + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION HBRawVersion() + RETURN StrTran( Version(), "Harbour " ) + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION xtos( xVrb ) + + SWITCH valtype( xVrb ) + CASE "C" + RETURN xVrb + CASE "N" + RETURN ltrim( str( xVrb ) ) + CASE "L" + RETURN iif( xVrb, "T", "F" ) + CASE "M" + RETURN xVrb + CASE "A" + RETURN "A" + OTHERWISE + RETURN "" + ENDSWITCH + + RETURN NIL + +/*----------------------------------------------------------------------*/ diff --git a/harbour/contrib/hbnetio/utils/netiosrvq.qrc b/harbour/contrib/hbnetio/utils/netiosrvq.qrc new file mode 100644 index 0000000000..6f1699b15e --- /dev/null +++ b/harbour/contrib/hbnetio/utils/netiosrvq.qrc @@ -0,0 +1,10 @@ + + +harbour.png +exit.png +fullscreen.png +help.png +about.png +terminate.png + + diff --git a/harbour/contrib/hbnetio/utils/netiosrvqt.hbp b/harbour/contrib/hbnetio/utils/netiosrvqt.hbp new file mode 100644 index 0000000000..9adb81e3a7 --- /dev/null +++ b/harbour/contrib/hbnetio/utils/netiosrvqt.hbp @@ -0,0 +1,24 @@ +# +# $Id$ +# + +-3rd=hbide_version=1.0 +-3rd=hbide_title=NetIOServerQt +-3rd=hbide_output=netiosrvqt + +-gui +-mt +-w3 +-prgflag=-l- +-icon={allwin}harbour.ico + +../../hbqt/hbqtuitools.hbc +../../hbxbp/hbxbp.hbc +../../hbnetio/hbnetio.hbc + +netiosrvq.prg +netiosrvq.qrc + + + + diff --git a/harbour/contrib/hbnetio/utils/terminate.png b/harbour/contrib/hbnetio/utils/terminate.png new file mode 100644 index 0000000000..de8bcd2987 Binary files /dev/null and b/harbour/contrib/hbnetio/utils/terminate.png differ diff --git a/harbour/contrib/hbxbp/xbp3state.prg b/harbour/contrib/hbxbp/xbp3state.prg index 8f2d06a9fe..67a55a3cb4 100644 --- a/harbour/contrib/hbxbp/xbp3state.prg +++ b/harbour/contrib/hbxbp/xbp3state.prg @@ -73,7 +73,7 @@ /*----------------------------------------------------------------------*/ -CLASS Xbp3State INHERIT XbpWindow, XbpDataRef +CLASS Xbp3State INHERIT XbpWindow, DataRef DATA autosize INIT .F. DATA caption INIT "" diff --git a/harbour/contrib/hbxbp/xbpbrowse.prg b/harbour/contrib/hbxbp/xbpbrowse.prg index a97f92412f..2089ba53c6 100644 --- a/harbour/contrib/hbxbp/xbpbrowse.prg +++ b/harbour/contrib/hbxbp/xbpbrowse.prg @@ -3548,7 +3548,7 @@ METHOD XbpBrowse:setStyle( nStyle, lNewValue ) /*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/ -CREATE CLASS XbpColumn INHERIT XbpWindow, XbpDataRef +CREATE CLASS XbpColumn INHERIT XbpWindow, DataRef EXPORTED: diff --git a/harbour/contrib/hbxbp/xbpcheckbox.prg b/harbour/contrib/hbxbp/xbpcheckbox.prg index 2dc9e162da..11ed11028f 100644 --- a/harbour/contrib/hbxbp/xbpcheckbox.prg +++ b/harbour/contrib/hbxbp/xbpcheckbox.prg @@ -73,7 +73,7 @@ /*----------------------------------------------------------------------*/ -CLASS XbpCheckBox INHERIT XbpWindow, XbpDataRef +CLASS XbpCheckBox INHERIT XbpWindow, DataRef DATA autosize INIT .F. DATA caption INIT "" diff --git a/harbour/contrib/hbxbp/xbpdataref.prg b/harbour/contrib/hbxbp/xbpdataref.prg index e4b1b361f3..eeea970d22 100644 --- a/harbour/contrib/hbxbp/xbpdataref.prg +++ b/harbour/contrib/hbxbp/xbpdataref.prg @@ -73,7 +73,7 @@ /*----------------------------------------------------------------------*/ -CLASS XbpDataRef +CLASS DataRef DATA changed INIT .F. DATA dataLink INIT NIL @@ -95,13 +95,13 @@ CLASS XbpDataRef /*----------------------------------------------------------------------*/ -METHOD XbpDataRef:new() +METHOD DataRef:new() RETURN self /*----------------------------------------------------------------------*/ -METHOD XbpDataRef:getData() +METHOD DataRef:getData() LOCAL cClass := __ObjGetClsName( self ) DO CASE @@ -135,7 +135,7 @@ METHOD XbpDataRef:getData() /*----------------------------------------------------------------------*/ -METHOD XbpDataRef:setData( xValue, mp2 ) +METHOD DataRef:setData( xValue, mp2 ) LOCAL cClass := __ObjGetClsName( self ) HB_SYMBOL_UNUSED( mp2 ) @@ -198,13 +198,13 @@ METHOD XbpDataRef:setData( xValue, mp2 ) /*----------------------------------------------------------------------*/ -METHOD XbpDataRef:undo() +METHOD DataRef:undo() RETURN .f. /*----------------------------------------------------------------------*/ -METHOD XbpDataRef:validate( xParam ) +METHOD DataRef:validate( xParam ) IF PCount() == 0 .AND. hb_isBlock( ::sl_validate ) RETURN eval( ::sl_validate, self ) @@ -216,7 +216,7 @@ METHOD XbpDataRef:validate( xParam ) /*----------------------------------------------------------------------*/ -METHOD XbpDataRef:editBuffer( xData ) +METHOD DataRef:editBuffer( xData ) IF !( xData == NIL ) ::sl_editBuffer := xData diff --git a/harbour/contrib/hbxbp/xbplistbox.prg b/harbour/contrib/hbxbp/xbplistbox.prg index 159c70dfc8..57be2765fa 100644 --- a/harbour/contrib/hbxbp/xbplistbox.prg +++ b/harbour/contrib/hbxbp/xbplistbox.prg @@ -73,7 +73,7 @@ /*----------------------------------------------------------------------*/ -CLASS XbpListBox INHERIT XbpWindow, XbpDataRef +CLASS XbpListBox INHERIT XbpWindow, DataRef DATA adjustHeight INIT .F. DATA horizScroll INIT .F. diff --git a/harbour/contrib/hbxbp/xbpmenubar.prg b/harbour/contrib/hbxbp/xbpmenubar.prg index d320844397..5a758d56bf 100644 --- a/harbour/contrib/hbxbp/xbpmenubar.prg +++ b/harbour/contrib/hbxbp/xbpmenubar.prg @@ -617,15 +617,6 @@ METHOD XbpMenuBar:onMenuKey( ... ) /*----------------------------------------------------------------------*/ METHOD xbpMenuBar:setStyleSheet( cCSS, cCSSPops ) - #if 0 - LOCAL aChild - - FOR EACH aChild IN ::aItems - IF hb_isObject( aChild[ 1 ] == QMF_POPUP ) - aChild[ 2 ]:setStyleSheet( cCSSPops ) - ENDIF - NEXT - #endif LOCAL oMenu FOR EACH oMenu IN ::aChildren @@ -708,9 +699,12 @@ METHOD xbpMenu:create( oParent, aPresParams, lVisible ) ::xbpWindow:create( oParent, , , , aPresParams, lVisible ) ::oWidget := QMenu() - ::oParent:oWidget:addMenu( ::oWidget ) - ::oParent:addChild( self ) + IF hb_isObject( oParent ) + ::oParent:oWidget:addMenu( ::oWidget ) + ::oParent:addChild( self ) + ENDIF + ::postCreate() RETURN Self @@ -730,13 +724,16 @@ METHOD xbpMenu:setTitle( cTitle ) /*----------------------------------------------------------------------*/ METHOD xbpMenu:popUp( oXbp, aPos, nDefaultItem, nControl ) + LOCAL qPoint := QPoint( aPos[ 1 ], aPos[ 2 ] ) HB_SYMBOL_UNUSED( oXbp ) HB_SYMBOL_UNUSED( aPos ) HB_SYMBOL_UNUSED( nDefaultItem ) HB_SYMBOL_UNUSED( nControl ) - RETURN 0 + ::oWidget:exec( qPoint ) + + RETURN .f. /*----------------------------------------------------------------------*/ diff --git a/harbour/contrib/hbxbp/xbpmle.prg b/harbour/contrib/hbxbp/xbpmle.prg index 374473a25f..b5f20bb662 100644 --- a/harbour/contrib/hbxbp/xbpmle.prg +++ b/harbour/contrib/hbxbp/xbpmle.prg @@ -73,7 +73,7 @@ /*----------------------------------------------------------------------*/ -CLASS XbpMLE INHERIT XbpWindow, XbpDataRef +CLASS XbpMLE INHERIT XbpWindow, DataRef DATA border INIT .T. DATA editable INIT .T. diff --git a/harbour/contrib/hbxbp/xbpradiobutton.prg b/harbour/contrib/hbxbp/xbpradiobutton.prg index c4199d9237..f769a384a3 100644 --- a/harbour/contrib/hbxbp/xbpradiobutton.prg +++ b/harbour/contrib/hbxbp/xbpradiobutton.prg @@ -73,7 +73,7 @@ /*----------------------------------------------------------------------*/ -CLASS XbpRadioButton INHERIT XbpWindow, XbpDataRef +CLASS XbpRadioButton INHERIT XbpWindow, DataRef DATA autosize INIT .F. DATA caption INIT "" diff --git a/harbour/contrib/hbxbp/xbpscrollbar.prg b/harbour/contrib/hbxbp/xbpscrollbar.prg index 002afe145d..62fa4c1fbe 100644 --- a/harbour/contrib/hbxbp/xbpscrollbar.prg +++ b/harbour/contrib/hbxbp/xbpscrollbar.prg @@ -73,7 +73,7 @@ /*----------------------------------------------------------------------*/ -CLASS XbpScrollBar INHERIT XbpWindow, XbpDataRef +CLASS XbpScrollBar INHERIT XbpWindow, DataRef DATA autoTrack INIT .t. DATA range INIT {0,1} diff --git a/harbour/contrib/hbxbp/xbpsle.prg b/harbour/contrib/hbxbp/xbpsle.prg index a7d5b9a608..4a8dd4e671 100644 --- a/harbour/contrib/hbxbp/xbpsle.prg +++ b/harbour/contrib/hbxbp/xbpsle.prg @@ -73,7 +73,7 @@ /*----------------------------------------------------------------------*/ -CLASS XbpSLE INHERIT XbpWindow, XbpDataRef +CLASS XbpSLE INHERIT XbpWindow, DataRef DATA align INIT XBPSLE_LEFT DATA autoKeyboard INIT .T. diff --git a/harbour/contrib/hbxbp/xbpspinbutton.prg b/harbour/contrib/hbxbp/xbpspinbutton.prg index 9c83e88552..6c6596aded 100644 --- a/harbour/contrib/hbxbp/xbpspinbutton.prg +++ b/harbour/contrib/hbxbp/xbpspinbutton.prg @@ -73,7 +73,7 @@ /*----------------------------------------------------------------------*/ -CLASS XbpSpinButton INHERIT XbpWindow, XbpDataRef +CLASS XbpSpinButton INHERIT XbpWindow, DataRef DATA fastSpin INIT .f. DATA master diff --git a/harbour/contrib/hbxbp/xbptoolbar.prg b/harbour/contrib/hbxbp/xbptoolbar.prg index 8268be78c9..404a991c8a 100644 --- a/harbour/contrib/hbxbp/xbptoolbar.prg +++ b/harbour/contrib/hbxbp/xbptoolbar.prg @@ -270,7 +270,7 @@ METHOD XbpToolbar:addItem( cCaption, xImage, xDisabledImage, xHotImage, cDLL, nS oBtn:oAction := QAction( ::oWidget ) oBtn:oAction:setText( cCaption ) - IF valtype( xImage ) == "C" .and. hb_FileExists( xImage ) + IF valtype( xImage ) == "C" oBtn:oAction:setIcon( xImage ) ENDIF diff --git a/harbour/contrib/hbxbp/xbptreeview.prg b/harbour/contrib/hbxbp/xbptreeview.prg index 6f199b1472..4ddb99ce35 100644 --- a/harbour/contrib/hbxbp/xbptreeview.prg +++ b/harbour/contrib/hbxbp/xbptreeview.prg @@ -73,7 +73,7 @@ /*----------------------------------------------------------------------*/ -CLASS XbpTreeView INHERIT XbpWindow, XbpDataRef +CLASS XbpTreeView INHERIT XbpWindow, DataRef DATA alwaysShowSelection INIT .F. DATA hasButtons INIT .F. @@ -361,7 +361,7 @@ METHOD XbpTreeView:itemSelected( ... ) /* Class XbpTreeViewItem */ /*----------------------------------------------------------------------*/ -CLASS XbpTreeViewItem INHERIT XbpDataRef +CLASS XbpTreeViewItem INHERIT DataRef DATA oWidget diff --git a/harbour/contrib/hbxbp/xbpwindow.prg b/harbour/contrib/hbxbp/xbpwindow.prg index 723433d8a8..5748fee240 100644 --- a/harbour/contrib/hbxbp/xbpwindow.prg +++ b/harbour/contrib/hbxbp/xbpwindow.prg @@ -135,7 +135,6 @@ CLASS XbpWindow INHERIT XbpPartHandler DATA hBrushBG DATA is_hidden INIT .F. DATA is_enabled INIT .T. - DATA title INIT " " DATA icon INIT 0 DATA closable INIT .T. DATA resizable INIT .T. @@ -189,6 +188,9 @@ CLASS XbpWindow INHERIT XbpPartHandler METHOD setPresParam( aPPNew ) METHOD setStyleSheet( cCSS ) INLINE ::oWidget:setStyleSheet( ::oWidget:styleSheet() + " " + cCSS ) + DATA cTitle INIT "" + METHOD title( cTitle ) SETGET + METHOD enter( ... ) SETGET METHOD leave( ... ) SETGET METHOD lbClick( ... ) SETGET @@ -1323,6 +1325,20 @@ METHOD XbpWindow:hasInputFocus() RETURN ::oWidget:hasFocus() +/*----------------------------------------------------------------------*/ + +METHOD XbpWindow:title( cTitle ) + LOCAL xTitle := ::cTitle + + IF hb_isChar( cTitle ) + ::cTitle := cTitle + IF hb_isObject( ::oWidget ) + ::oWidget:setWindowTitle( ::cTitle ) + ENDIF + ENDIF + + RETURN xTitle + /*----------------------------------------------------------------------*/ * Callback Methods /*----------------------------------------------------------------------*/