From: Andrey C. <sku...@us...> - 2007-03-12 17:14:32
|
Update of /cvsroot/eas-dev/eas/libeas In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv5417/libeas Modified Files: Makefile componentmanager.prg config.prg connection.prg execmanager.prg functions.prg messagemanager.prg protocol_raw.prg session.prg transportmanager.prg uimanager.prg Log Message: Fix some bugs. Add sessions support Index: Makefile =================================================================== RCS file: /cvsroot/eas-dev/eas/libeas/Makefile,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Makefile 16 Jan 2007 14:23:25 -0000 1.3 +++ Makefile 12 Mar 2007 17:14:23 -0000 1.4 @@ -32,7 +32,8 @@ mkdir -p $(DESTDIR)$(CLIPROOT)/lib $(CLIPROOT)/bin/clip_cp $(TARGET) $(DESTDIR)$(CLIPROOT)/lib $(CLIPROOT)/bin/clip_cp $(RTARGET) $(DESTDIR)$(CLIPROOT)/lib - /sbin/ldconfig -n $(DESTDIR)$(CLIPROOT)/lib + test -f $(DESTDIR)/usr/lib/$(TARGET) || ln -s $(DESTDIR)$(CLIPROOT)/lib/$(TARGET) $(DESTDIR)/usr/lib + /sbin/ldconfig -n $(DESTDIR)/usr/lib uninstall: rm -rf $(CLIPROOT)/lib/$(TARGET) $(CLIPROOT)/lib/$(RTARGET) Index: componentmanager.prg =================================================================== RCS file: /cvsroot/eas-dev/eas/libeas/componentmanager.prg,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- componentmanager.prg 20 Nov 2006 12:57:55 -0000 1.5 +++ componentmanager.prg 12 Mar 2007 17:14:23 -0000 1.6 @@ -93,7 +93,7 @@ /** Execute component command found by ::lookup() */ static function c_execute( self, params ) local oErr, component, method, id, q:=map(), obj - local fName, f, fBlock, p, ret:=NIL, i, codeFile:=NIL + local fName, f, fBlock, p, ret:=NIL, i, codeFile:=NIL, old component := params:receiver method := params:command @@ -127,9 +127,11 @@ endif if .T. //.not. file(fName) // DEBUG: all occurences + old := set(_SET_TRANSLATE_PATH, .F.) // turn DOS mode off f := fcreate(fName, 0) fwrite(f, codeFile:content) fclose(f) + set(_SET_TRANSLATE_PATH, old) endif // Use code Index: config.prg =================================================================== RCS file: /cvsroot/eas-dev/eas/libeas/config.prg,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- config.prg 15 Nov 2006 10:37:18 -0000 1.2 +++ config.prg 12 Mar 2007 17:14:23 -0000 1.3 @@ -97,7 +97,7 @@ function EASConfig( params, check_load, description ) local obj, file:=NIL, i local driver:=NIL, connection:=NIL, exec:=0, repo:='' - local debug:=NIL + local debug:=NIL, old // Scan parameters for help if ascan(params, "-h") > 0 .or. ascan(params, "--help") > 0 @@ -126,11 +126,13 @@ exec := i+1 endif next - + // Inherit from INIFILE class + old := set(_SET_TRANSLATE_PATH, .F.) // turn DOS mode off obj := iniFileNew( file ) + set(_SET_TRANSLATE_PATH, old) obj:file := file - + // Attributes and methods obj:className := "EASConfig" obj:driver := driver Index: connection.prg =================================================================== RCS file: /cvsroot/eas-dev/eas/libeas/connection.prg,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- connection.prg 15 Nov 2006 10:37:18 -0000 1.2 +++ connection.prg 12 Mar 2007 17:14:23 -0000 1.3 @@ -12,8 +12,6 @@ /** EASConnection - connection manager */ -/* TODO: thread support */ - function EASConnection( params ) local obj Index: execmanager.prg =================================================================== RCS file: /cvsroot/eas-dev/eas/libeas/execmanager.prg,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- execmanager.prg 20 Nov 2006 12:57:55 -0000 1.5 +++ execmanager.prg 12 Mar 2007 17:14:23 -0000 1.6 @@ -53,6 +53,7 @@ static function c_execute( self, params ) // params: receiver:C, command:C, args:AO, sender:C local i, j, bCode, vRet, id, slot_list + local tmp self:lastError := NIL @@ -65,6 +66,14 @@ if valtype(params:receiver) == 'C' i := ascan( self:commands, {|e| e[1]==params:receiver } ) if i > 0 + /* + eDebug(4, "COMMAND:", params:receiver, params:command) + for i in self:commands + if i[1]==params:receiver + eDebug(4, chr(9), i[2]) + endif + next + */ i := ascan( self:commands, {|e| e[1]==params:receiver .and. e[2]==params:command } ) if i > 0 // Execute command @@ -74,7 +83,7 @@ eDebug( 34, "Execute '"+params:receiver+"."+params:command+"' returns:", vRet ) return vRet else - self:lastError := "ERROR: command '"+params:command+"' for '"+params:receiver+"' not found" + self:lastError := "Command '"+params:command+"' for '"+params:receiver+"' is not found" eDebug( 4, self:lastError ) return NIL endif @@ -85,7 +94,7 @@ eDebug( 34, "Execute component '"+params:command+"' returns:", vRet ) return vRet else - self:lastError := iif(empty(self:cManager:lastError),"ERROR: component '"+params:receiver+"' not found",self:cManager:lastError) + self:lastError := iif(empty(self:cManager:lastError),"Component '"+params:receiver+"' not found",self:cManager:lastError) eDebug( 4, self:lastError ) //eDebug(5, var2log(self:getCommands(),2,.T.)) return NIL @@ -104,7 +113,7 @@ eval( bCode, params:args ) next else - eDebug( 14, "Tthere are no handlers for event '"+params:command+"'" ) + eDebug( 14, "There are no handlers for event '"+params:command+"'" ) endif return NIL Index: functions.prg =================================================================== RCS file: /cvsroot/eas-dev/eas/libeas/functions.prg,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- functions.prg 23 Nov 2006 11:24:03 -0000 1.6 +++ functions.prg 12 Mar 2007 17:14:23 -0000 1.7 @@ -161,7 +161,7 @@ /* Network transparent resource retrieving and caching */ function getResource(name) - local oErr, real, content, f, l, lFile + local oErr, real, content, f, l, lFile, old // Translate path real := strtran(name, "/", "_") @@ -178,6 +178,8 @@ if valtype(content) <> 'C' .or. len(content) == 0 return NIL endif + + old := set(_SET_TRANSLATE_PATH, .F.) // turn DOS mode off f := fcreate(real) if f < 0 eDebug( 10, "getResource(): Error open file for writing:", ferror(), ferrorstr() ) @@ -186,6 +188,8 @@ l := fwrite(f, content) eDebug( 30, "getResource(): wrote", real, l, "bytes" ) fclose(f) + set(_SET_TRANSLATE_PATH, old) + else eDebug( 30, "getResource():", real, "(cached)" ) endif Index: messagemanager.prg =================================================================== RCS file: /cvsroot/eas-dev/eas/libeas/messagemanager.prg,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- messagemanager.prg 16 Jan 2007 14:23:25 -0000 1.4 +++ messagemanager.prg 12 Mar 2007 17:14:23 -0000 1.5 @@ -118,7 +118,7 @@ ret := map() ret:error := self:exec:lastError - if ret:error != "Method 'add' of component 'errorlog' was not found" + if at("'errorlog'", ret:error) == 0 // Pass error to administrator lcomponent( "errorlog", "add", "error", ret:error ) endif Index: protocol_raw.prg =================================================================== RCS file: /cvsroot/eas-dev/eas/libeas/protocol_raw.prg,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- protocol_raw.prg 16 Jan 2007 14:23:25 -0000 1.6 +++ protocol_raw.prg 12 Mar 2007 17:14:23 -0000 1.7 @@ -9,7 +9,7 @@ /* published by the Free Software Foundation; either version 2 of the */ /* License, or (at your option) any later version. */ /*-------------------------------------------------------------------------*/ - +#include <clipcfg.h> #include <tcp.ch> #define TCP_READ_TIMEOUT 6000 @@ -22,24 +22,26 @@ local obj := map() - obj:type := "raw" - obj:socket := map() + obj:type := "raw" + obj:socket := map() obj:socket:handle := NIL obj:sessions := array(0) obj:className := "EASRAWProtocol" - obj:params := params - obj:errno := 0 + obj:params := params + obj:errno := 0 + obj:lock := .F. + obj:queue := array(0) _recover_EASRAWPROTOCOL(obj) return obj function _recover_EASRAWPROTOCOL(obj) - obj:open := @c_open() - obj:close := @c_close() + obj:open := @c_open() + obj:close := @c_close() obj:closeSession := @c_closeSession() - obj:read := @c_read() - obj:write := @c_write() + obj:read := @c_read() + obj:write := @c_write() obj:serialize := @c_serialize() obj:deserialize := @c_deserialize() return obj @@ -114,10 +116,10 @@ if (session := tcpAccept( self:socket:handle, self:socket:aTimeOut )) != -1 // Create new session eDebug( 26, "Start new session: ", session) -#ifdef SINGLE_CONNECTION - threadId := session_open(self, session) // Begin session -#else +#ifdef USE_TASKS threadId := start(@session_open(), self, session) // Begin new thread +#else + threadId := session_open(self, session) // Begin session #endif eDebug( 26, "Ready for new connection") endif @@ -142,6 +144,9 @@ setCommand(, 'sys.transport.'+params:name, 'write', {|p| self:write(self:serialize(p)) } ) setCommand(, 'sys.transport.default', 'read', {|p| self:deserialize(self:read(p)) } ) setCommand(, 'sys.transport.default', 'write', {|p| self:write(self:serialize(p)) } ) +#ifdef USE_TASKS + threadId := start(@client_session_open(), self) +#endif endif endif @@ -149,13 +154,26 @@ /* Thread function for session open */ static function session_open( s, session ) - local oSession + local oSession, old // Set global variables set deleted on - set translate path off + old := set(_SET_TRANSLATE_PATH, .F.) // turn DOS mode off oSession := EASSession( s, session ) + set(_SET_TRANSLATE_PATH, old) return oSession:open() +/* TODO: Thread function for client session open */ +static function client_session_open( s ) + local session +/* do while( .T. ) + if (session := tcpAccept( self:socket:handle, self:socket:aTimeOut )) != -1 + + endif + sleep(0.01) + enddo +*/ +return NIL + /** Close connection */ static function c_close( self, params ) if self:socket:handle != NIL @@ -218,6 +236,9 @@ params := map() endif params:session := self:socket:handle + if self:lock + return NIL + endif endif eDebug( 36, "Read from socket..." ) @@ -232,6 +253,7 @@ cBuf := space(nSize) + self:lock := .T. oErr := ErrorBlock({|e| break(e) }) begin sequence nRead := tcpRead( params:session, @cBuf, nSize, self:socket:rTimeout ) @@ -254,9 +276,12 @@ recover using oErr eDebug( 6, "Read error") cBuffer := '' - nTotal := 0 + nTotal := 0 + end sequence + self:lock := .F. + oData:data := cBuffer oData:size := nTotal eDebug( 26, "Read", oData:size, "bytes,", seconds()-sec, "sec" ) Index: session.prg =================================================================== RCS file: /cvsroot/eas-dev/eas/libeas/session.prg,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- session.prg 15 Nov 2006 10:37:18 -0000 1.4 +++ session.prg 12 Mar 2007 17:14:23 -0000 1.5 @@ -17,6 +17,8 @@ local obj := map() obj:name := "session_"+ltrim(str(handle)) + obj:user := "" + obj:role := {} obj:connection := connection obj:handle := handle obj:messages := NIL // TODO: Message manager per session. Only for server @@ -29,6 +31,8 @@ setCommand(, 'sys.transport.'+obj:name, 'login', {|p| obj:login(p) } ) setCommand(, 'sys.transport.'+obj:name, 'close', {|p| obj:close(p) } ) + lcomponent( 'sys.transport', 'addSession', "session", obj ) + return obj function _recover_EASSESSION(obj) @@ -73,16 +77,22 @@ endif eDebug( 27, "Access for "+self:name+": ",self:access ) oWrite:answer := self:access + if "NAME" $ params + self:user := params:name + endif eDebug( 27, "Answer:", oWrite:answer ) return oWrite /** Close session */ static function c_close( self, params ) + // Unregister session in pool + lcomponent( 'sys.transport', 'removeSession', "handle", self:handle ) + removeCommand(, 'sys.transport.'+self:name, 'login' ) removeCommand(, 'sys.transport.'+self:name, 'close' ) self:connection:closeSession( self ) - eDebug( 27, "Session closing." ) + eDebug( 27, "Session closed." ) return NIL /** Read data */ @@ -112,11 +122,16 @@ eDebug( 27, "Arguments:", obj:args ) - // Translate session fo sys.transport + // Pass session fo sys.transport if lower(obj:receiver) == 'sys.transport.default' obj:receiver := 'sys.transport.'+self:name endif + // Pass user name to sendmessage + if lower(obj:receiver) == 'sendmessage' + obj:args:user := self:user + endif + // Check for session.close if lower(obj:receiver) == 'session' .and. lower(obj:command) == 'close' //?? "SESSION CLOSE: session.close signal message&\n" @@ -153,7 +168,7 @@ endif if .not. valtype( params ) $ 'AO' .or. ( (oData := self:connection:serialize( params )) == NIL ) - eDebug( 17, "ERROR preparing data for write. Sending message with data.") + eDebug( 17, "Preparing data for write. Sending message with data.") oError := map() oError:data := params oData := self:connection:serialize( oError ) Index: transportmanager.prg =================================================================== RCS file: /cvsroot/eas-dev/eas/libeas/transportmanager.prg,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- transportmanager.prg 16 Jan 2007 14:23:25 -0000 1.5 +++ transportmanager.prg 12 Mar 2007 17:14:23 -0000 1.6 @@ -9,6 +9,7 @@ /* published by the Free Software Foundation; either version 2 of the */ /* License, or (at your option) any later version. */ /*-------------------------------------------------------------------------*/ +#include <clipcfg.h> /** EASTransportManager - Transport manager */ static oCurConn @@ -18,16 +19,20 @@ local obj := map(), i, cfg, sections, pkeys, pset, j, c, cstr, a obj:connections := array(0) + obj:sessions := array(0) obj:connectionNames := array(0) - obj:active := .F. - obj:role := iif(valtype(params)=='O' .and. 'ROLE' $ params, params:role, 1) + obj:active := .F. + obj:role := iif(valtype(params)=='O' .and. 'ROLE' $ params, params:role, 1) obj:className := "EASTransportManager" _recover_EASTRANSPORTMANAGER(obj) - setCommand(, 'sys.transport', 'open', {|p| obj:open(p) } ) - setCommand(, 'sys.transport', 'close', {|p| obj:close(p) } ) - setCommand(, 'sys.transport', 'addConnection', {|p| obj:addConnection(p) } ) + setCommand(, 'sys.transport', 'open', {|p| obj:open(p) } ) + setCommand(, 'sys.transport', 'close', {|p| obj:close(p) } ) + setCommand(, 'sys.transport', 'addConnection', {|p| obj:addConnection(p) } ) + setCommand(, 'sys.transport', 'addSession', {|p| obj:addSession(p) } ) + setCommand(, 'sys.transport', 'removeSession', {|p| obj:removeSession(p) } ) + setCommand(, 'sys.transport', 'sessions', {|p| obj:listSessions(p) } ) // Read from config file cfg := EASGetConfig() @@ -98,6 +103,9 @@ obj:open := @c_open() obj:addConnection := @c_addConnection() obj:close := @c_close() + obj:addSession := @c_addSession() + obj:removeSession := @c_removeSession() + obj:listSessions := @c_listSessions() return obj /** Open manager */ @@ -119,10 +127,10 @@ // Open each connection for c in self:connections oCurConn := c -#ifdef SINGLE_CONNECTION - threadId := connection_open() // Begin connection -#else +#ifdef USE_TASKS threadId := start( @connection_open() ) // Begin thread for each connection +#else + threadId := connection_open() // Begin connection #endif next @@ -191,3 +199,29 @@ return NIL +/** Add sesion to pool */ +static function c_addSession( self, params ) + eDebug(16, "Add session", params) + if assertParameters( params, { 'session:O' } ) + return NIL + endif + aadd( self:sessions, params:session ) +return NIL + +/** Remove sesion from pool */ +static function c_removeSession( self, params ) + local p + eDebug(16, "Remove session", params) + if assertParameters( params, { 'handle:N' } ) + return NIL + endif + p := ascan(self:sessions, {|e| e:handle == params:handle } ) + if p > 0 + adel( self:sessions, p ) + asize( self:sessions, len(self:sessions) - 1 ) + endif +return NIL + +/** List all active sesions */ +static function c_listSessions( self, params ) +return self:sessions Index: uimanager.prg =================================================================== RCS file: /cvsroot/eas-dev/eas/libeas/uimanager.prg,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- uimanager.prg 16 Jan 2007 14:23:25 -0000 1.6 +++ uimanager.prg 12 Mar 2007 17:14:23 -0000 1.7 @@ -116,17 +116,17 @@ //eDebug(19, vRet) if empty(vRet) - eDebug( 8, "ERROR: cannot open empty form" ) + eDebug( 8, "Cannot open empty form" ) return .F. endif if valtype(vRet) == 'O' .and. 'ERROR' $ vRet - eDebug( 8, "ERROR on form open:", vRet:error ) + eDebug( 8, "Form open:", vRet:error ) return .F. endif if valtype(vRet) <> 'C' - eDebug( 8, "ERROR on form open: return value must be string" ) + eDebug( 8, "Form open: return value must be string" ) return .F. endif @@ -249,11 +249,12 @@ // Define name and columns name := params:name for i in params:widget:columns - fields += i+',' + fields += i:name+',' next fields += 'id' // Get content from server + //eDebug( 28, "Open view ", name, fields ) d := component('form', 'getView', 'name', name, 'fields', fields) // Apply data to widget |