2000-01-22 12:49:49 +00:00
/ * GSWDirectActionRequestHandler . m - GSWeb : Class GSWDirectActionRequestHandler
Copyright ( C ) 1999 Free Software Foundation , Inc .
Written by : Manuel Guesdon < mguesdon @ sbuilders . com >
Date : Feb 1999
This file is part of the GNUstep Web Library .
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation ; either
version 2 of the License , or ( at your option ) any later version .
This library 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
Library General Public License for more details .
You should have received a copy of the GNU Library General Public
License along with this library ; if not , write to the Free
Software Foundation , Inc . , 675 Mass Ave , Cambridge , MA 02139 , USA .
* /
static char rcsId [ ] = "$Id$" ;
2000-10-30 15:36:50 +00:00
# include < GSWeb / GSWeb . h >
2000-01-22 12:49:49 +00:00
// === === === === === === === === === === === === === === === === === === === === === === = =
@ implementation GSWDirectActionRequestHandler
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ( GSWResponse * ) handleRequest : ( GSWRequest * ) request_
{
// OK
GSWResponse * _response = nil ;
GSWStatisticsStore * _statisticsStore = nil ;
GSWApplication * _application = nil ;
LOGObjectFnStart ( ) ;
_application = [ GSWApplication application ] ;
2001-10-25 Manuel Guesdon <mguesdon@orange-concept.com>
Applied patch from Turbocat (www.turbocat.de): GSWPatch_04-JUL_2001.diff
except GSWeb.framework/GSWInput.m/.h one (have to verify coherence of it)
* GSWAdaptors/common/GSWApp.c/.h: Added GSWAppInfo
* GSWAdaptors/common/GSWAppConnectNSSocket.c: Changes on includes
* GSWAdaptors/common/GSWLoadBalancing.h: Added parameter to GSWLoadBalancing_Find*
* GSWAdaptors/common/GSWLoadBalancing.c: added p_pURLComponents parameter,
o management of AppInfo
* GSWAdaptors/common/GSWAppRequest.c: managing refused connections
* GSWExtensions.framework/GSWStatsPage.gswc/GSWStatsPage.gswd: misspelling correction
* GSWExtensions.framework/GSWStatsPage.gswc/GSWStatsPage.html: Various Changes
* GSWExtensions.framework/GSWStatsPage.m: changes in login/password validation
o -awake added
* GSWeb.framework/GSWApplication.m/.h: Manage refusing new sessions
* GSWeb.framework/GSWBundle.m: debug traces commented
* GSWeb.framework/GSWComponent.m: implementation of ensureAwakeInContext:
* GSWeb.framework/GSWAssociation.m: special case for returned value of type GSMutableArray (Why ?)
* GSWeb.framework/GSWComponentRequestHandler.m: comments added
* GSWeb.framework/GSWDefaultAdaptorThread.m: added debug traces
* GSWeb.framework/GSWDirectActionRequestHandler.m: replaced GSWDirectAction by DirectAction
* GSWeb.framework/GSWDisplayGroup.m: initialize _baseIndex,
o correct misspelled names,
o added -description,
o use delegate in _changedInEditingContext:, _invalidatedAllObjectsInStore:,
o changes in -deleteObjectAtIndex:,
* GSWeb.framework/GSWFileUpload.m: different handling of _fileDatasCount,
handle bug in omniweb-browser
* GSWeb.framework/GSWHyperlink.m: added ensureAwakeInContext: call
* GSWeb.framework/GSWImageButton.m: added ensureAwakeInContext: call
* GSWeb.framework/GSWPopUpButton.m:
o use [response_ appendContentString:_noSelectionStringValue] instead of
[response_ appendContentHTMLString:_noSelectionStringValue]
o handle no displayString case
o use [response_ appendContentString:_displayStringValue] instead of
[response_ appendContentHTMLString:_displayStringValue]
* GSWeb.framework/GSWConfig.h: set GSWOPTVALUE_AutoOpenInBrowser to NO
* GSWeb.framework/GSWElementIDString.m: comment some debug traces
* GSWeb.framework/GSWHTMLStaticGroup.m/.h: added support of documentType
* GSWeb.framework/GSWHTMLURLValuedElement.m: addeded debug trace
* GSWeb.framework/GSWKeyValueAssociation.m: use NSStringFromClass([retValue class])
instead of [retValue class] for log
* GSWeb.framework/GSWRequest.m/.h: added -(NSDictionary*)headers;
o added test on _contentType in _contentType
o autorelease _dict in -uriElements
* GSWeb.framework/GSWResponse.m/.h: added -setHeaders: and -headers
o Added GSWResponse (GSWResponseRefused)
o return self in -generateResponse
* GSWeb.framework/GSWServerSessionStore.m/.h: added @interface GSWServerSessionStore (GSWServerSessionStoreInfo)
o added refusing session management
* GSWeb.framework/GSWSession.m:
o in -terminate forces to call removeSessionWithID in GSWServerSessionStore to dealloc it
* GSWeb.framework/GSWSessionTimeOutManager.m/.h: replace NSMutableOrderedArray* sessionOrderedTimeOuts;
by NSMutableArray* sessionOrderedTimeOuts;
o added traces
o added GSWSessionTimeOutManager (GSWSessionRefused)
* GSWeb.framework/GSWSubmitButton.m: raise exception if no element is returned
* GSWeb.framework/GSWTemplateParser.m: added doctype management
* GSWeb.framework/GSWUtils.h: added if defined for __NetBSD__
* GSWeb.framework/GSWWOCompatibility.m/.h: added WOGenericContainer, WOImageButton, WOHyperlink
* GSWeb.framework/attach.m: added if defined for __NetBSD__
* GSWeb.framework/stacktrace.m: added if defined for __NetBSD__
* GSWeb.framework/GSWTemplateParserXML.m: traces commented
o test XML node content before adding it
* GSWeb.framework/NSObject+IVarAccess+PerformSel.m
o changes in -getIVarNamed: and in setIVarNamed:withValue: (use of sel+imp, tests on parameters)
* GSWAdaptors/common/GSWHTTPResponse.c: change in GSWHTTPResponse_GetResponse()
o debug traces removed
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gsweb/trunk@11251 72102866-910b-0410-8b05-ffd578937521
2001-10-26 08:50:52 +00:00
if ( 0 / * [ _application isRefusingNewSessions ] * / )
2000-01-22 12:49:49 +00:00
{
// TODO
}
else
{
id _submitButtonsActionPathFromRequest = nil ;
NSArray * _requestHandlerPathArray = nil ;
NSString * _actionName = nil ;
NSString * _className = nil ;
GSWContext * _context = nil ;
[ _application lockRequestHandling ] ;
NS_DURING
2001-10-28 10:29:17 +00:00
{
NS_DURING
{
2000-01-22 12:49:49 +00:00
_statisticsStore = [ [ GSWApplication application ] statisticsStore ] ;
[ _statisticsStore _applicationWillHandleDirectActionRequest ] ;
_submitButtonsActionPathFromRequest = [ self submitButtonsActionPathFromRequest : request_ ] ; // So what ?
NSDebugMLLog ( @ "requests" , @ "_submitButtonsActionPathFromRequest=%@" , _submitButtonsActionPathFromRequest ) ;
_requestHandlerPathArray = [ request_ requestHandlerPathArray ] ;
NSDebugMLLog ( @ "requests" , @ "_requestHandlerPathArray=%@" , _requestHandlerPathArray ) ;
switch ( [ _requestHandlerPathArray count ] )
2001-10-28 10:29:17 +00:00
{
case 0 :
_actionName = @ "default" ;
_className = @ "DirectAction" ;
break ;
case 1 :
{
NSString * _tmpActionName = [ NSString stringWithFormat : @ "%@Action" ,
[ _requestHandlerPathArray objectAtIndex : 0 ] ] ;
SEL _tmpActionSel = NSSelectorFromString ( _tmpActionName ) ;
Class _class = NSClassFromString ( @ "DirectAction" ) ;
NSDebugMLLog ( @ "requests" , @ "_tmpActionName=%@" , _tmpActionName ) ;
if ( _tmpActionSel && _class )
{
if ( [ _class instancesRespondToSelector : _tmpActionSel ] )
{
_actionName = [ _requestHandlerPathArray objectAtIndex : 0 ] ;
_className = @ "DirectAction" ;
} ;
} ;
if ( ! _actionName )
{
_className = [ _requestHandlerPathArray objectAtIndex : 0 ] ;
_actionName = @ "default" ;
} ;
} ;
break ;
case 2 :
_className = [ _requestHandlerPathArray objectAtIndex : 0 ] ;
_actionName = [ NSString stringWithFormat : @ "%@" ,
[ _requestHandlerPathArray objectAtIndex : 1 ] ] ;
break ;
default :
ExceptionRaise0 ( @ "GSWDirectActionRequestHandler" , @ "bad parameters count" ) ;
break ;
} ;
2000-01-22 12:49:49 +00:00
NSDebugMLLog ( @ "requests" , @ "_className=%@" , _className ) ;
NSDebugMLLog ( @ "requests" , @ "_actionName=%@" , _actionName ) ;
if ( [ _application isCachingEnabled ] )
2001-10-28 10:29:17 +00:00
{
// TODO
} ;
2000-01-22 12:49:49 +00:00
{
2001-10-28 10:29:17 +00:00
GSWResourceManager * _resourceManager = nil ;
GSWDeployedBundle * _appBundle = nil ;
GSWDirectAction * _directAction = nil ;
id < GSWActionResults > _actionResult = nil ;
Class _class = nil ;
_resourceManager = [ _application resourceManager ] ;
_appBundle = [ _resourceManager _appProjectBundle ] ;
[ _resourceManager _allFrameworkProjectBundles ] ; // So what ?
[ _application awake ] ;
_class = NSClassFromString ( _className ) ;
NSAssert1 ( _class , @ "No direct action class named %@" , _className ) ;
_directAction = [ [ _class alloc ] initWithRequest : request_ ] ;
NSAssert1 ( _directAction , @ "Direct action of class named %@ can't be created" , _className ) ;
_context = [ _directAction _context ] ;
_actionResult = [ _directAction performActionNamed : _actionName ] ;
_response = [ _actionResult generateResponse ] ;
2000-01-22 12:49:49 +00:00
2001-10-28 10:29:17 +00:00
// Finir ?
2000-01-22 12:49:49 +00:00
} ;
}
NS_HANDLER
{
LOGException ( @ "%@ (%@)" , localException , [ localException reason ] ) ;
if ( ! _context )
_context = [ GSWApp _context ] ;
_response = [ _application handleException : localException
inContext : _context ] ;
// TODO
} ;
NS_ENDHANDLER ;
NSDebugMLLog ( @ "requests" , @ "_response=%@" , _response ) ;
RETAIN ( _response ) ;
if ( ! _context )
_context = [ GSWApp _context ] ;
[ _context _putAwakeComponentsToSleep ] ;
[ _application saveSessionForContext : _context ] ;
NSDebugMLLog ( @ "requests" , @ "_response=%@" , _response ) ;
AUTORELEASE ( _response ) ;
// Here ? ? ?
[ _application sleep ] ;
// TODO do not fnalize if already done ( in handleException for exemple )
[ _response _finalizeInContext : _context ] ;
[ _application _setContext : nil ] ;
_statisticsStore = [ [ GSWApplication application ] statisticsStore ] ;
[ _statisticsStore _applicationDidHandleDirectActionRequestWithActionNamed : _actionName ] ;
2001-10-28 10:29:17 +00:00
}
NS_HANDLER
{
LOGException ( @ "%@ (%@)" , localException , [ localException reason ] ) ;
[ _application unlockRequestHandling ] ;
[ localException raise ] ; // TODO
} ;
NS_ENDHANDLER ;
2000-01-22 12:49:49 +00:00
[ _application unlockRequestHandling ] ;
} ;
LOGObjectFnNotImplemented ( ) ; // TODOFN
LOGObjectFnStop ( ) ;
return _response ;
} ;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ( GSWResponse * ) _nilResponse
{
// OK
GSWResponse * _response = nil ;
LOGObjectFnStart ( ) ;
_response = [ [ GSWResponse new ] autorelease ] ;
[ _response appendContentString : @ "<HTML><HEAD><TITLE>DirectAction Error</TITLE></HEAD><BODY>The result of a direct action returned nothing.</BODY></HTML>" ] ;
LOGObjectFnStop ( ) ;
return _response ;
} ;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ( void ) _initializeRequestSessionIDInContext : ( GSWContext * ) _context
{
LOGObjectFnNotImplemented ( ) ; // TODOFN
} ;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ( id ) submitButtonsActionPathFromRequest : ( GSWRequest * ) _request
{
// OK
NSArray * _submitActions = nil ;
LOGObjectFnStart ( ) ;
2001-03-11 Manuel Guesdon <mguesdon@orange-concept.com>
* GSWeb.framework/GSWWOCompatibility.h/.m: added
* GSWeb.framework/GNUmakefile: added GSWWOCompatibility.h/.m
* GSWeb.framework/GSWApplication.h/m: added WOApplicationMain, handle WO/GSWeb names
* GSWeb.framework/GSWContext.m: handle WO/GSWeb names, added traces
* GSWeb.framework/GSWConstants.h/.m: handle WO/GSWeb names
* GSWeb.framework/GSWDynamicURLString.m: handle WO/GSWeb names
* GSWeb.framework/GSWProjectBundle.m/.h: handle WO/GSWeb names, suppress warnings
* GSWeb.framework/GSWSession.m: handle WO/GSWeb names
* GSWeb.framework/GSWRequest.m: handle WO/GSWeb names
* GSWeb.framework/GSWTemplateParser.m: handle WO/GSWeb names,
added tag counts to help errors hunt
* GSWeb.framework/GSWBundle.m: handle WO/GSWeb names, added traces
* GSWeb.framework/GSWResourceManager.m: handle WO/GSWeb names
* GSWeb.framework/GSWURLValuedElementData.m: handle WO/GSWeb names
* GSWeb.framework/GSWComponentRequestHandler.m: handle WO/GSWeb names
* GSWeb.framework/GSWDirectAction.m: handle WO/GSWeb names
* GSWeb.framework/GSWForm.m/.h: handle WO/GSWeb names
* GSWeb.framework/GSWHyperlink.m/.h: handle WO/GSWeb names
* GSWeb.framework/GSWResourceRequestHandler.m: handle WO/GSWeb names
* GSWeb.framework/GSWDirectActionRequestHandler.m: handle WO/GSWeb names
* GSWeb.framework/GSWActiveImage.m/.h: handle WO/GSWeb names
* GSWeb.framework/GSWBindingNameAssociation.h/.m: handle WO/GSWeb names
* GSWeb.framework/GSWBrowser.h/.m: handle WO/GSWeb names
* GSWeb.framework/GSWComponent.h/.m: handle WO/GSWeb names
* GSWeb.framework/GSWHTMLURLValuedElement.h/.m: handle WO/GSWeb names
* GSWeb.framework/GSWImageButton.h/.m: handle WO/GSWeb names
* GSWeb.framework/GSWInput.h/.m: handle WO/GSWeb names
* GSWeb.framework/GSWPopUpButton.h/.m: handle WO/GSWeb names
* GSWeb.framework/GSWString.h/.m: handle WO/GSWeb names
* GSWeb.framework/GSWAssociation.m: handle WO/GSWeb names
* GSWeb.framework/GSWCheckBox.m: handle WO/GSWeb names
* GSWeb.framework/GSWCheckBoxList.m: handle WO/GSWeb names
* GSWeb.framework/GSWComponentDefinition.m: handle WO/GSWeb names
* GSWeb.framework/GSWRadioButton.m: handle WO/GSWeb names
* GSWeb.framework/GSWRadioButtonList.m: handle WO/GSWeb names
* GSWeb.framework/GSWText.m: handle WO/GSWeb names
* GSWeb.framework/GSWTextField.m: handle WO/GSWeb names
* GSWeb.framework/GSWDeployedBundle.m: warnings
* GSWeb.framework/GSWeb.h: added include GSWeb/GSWSessionTimeOut.h, GSWWOCompatibility.h
* GSWeb.framework/GSWAdaptor.m: traces
* GSWeb.framework/GSWDefaultAdaptor.m: handle WO/GSWeb names, added traces
* GSWeb.framework/GSWDefaultAdaptorThread.m/.h: handle WO/GSWeb names
* GSWeb.framework/NSNonBlockingFileHandle.m: added traces
* GSWeb.framework/GSWTemplateParserANTLR.m: handle WO/GSWeb names
* GSWeb.framework/GSWTemplateParserXML.m: handle WO/GSWeb names
added tag count to help errors hunt
remove "Tag gsweb invalid" message
handle unicode strings in node content traces
remove html and body tags if they are not present in the template
* GSWeb.framework/GSWTemplateParseXML.h: added ivar _isHTMLTag, _isBodyTag
* GSWeb.framework/GSWSessionTimeOutManager.m: dealloc sessionOrderedTimeOuts instead
of deallocating 2 times sessionTimeOuts
* GSWExtensions.framework/French.lproj/GSWSessionRestorationErrorPage.gswc/GSWSessionRestorationErrorPage.html:
tag mismatch, Encode french characters
* GSWExtensions.framework/GSWSessionRestorationErrorPage.gswc/GSWSessionRestorationErrorPage.html:
tag mismatch
* GSWHTMLBareString.m: handle unicode strings in description
* GSWExtensions.framework/French.lproj/GSWExceptionPage.gswc/GSWExceptionPage.html:
Encode french characters, Tag Mismatch
* GSWExtensions.framework/French.lproj/GSWPageRestorationErrorPage.gswc/GSWPageRestorationErrorPage.html:
Encode french characters
* GSWExtensions.framework/French.lproj/GSWSessionCreationErrorPage.gswc/GSWSessionCreationErrorPage.html:
Encode french characters
* GSWExtensions.framework/GSWExceptionPage.gswc/GSWExceptionPage.html:
Tag Mismatch
* GSWExtensions.framework/GSWExceptionPage.gswc/GSWExceptionPage.gswd:
added convertHTMLEntities for strings
* GSWeb.framework/GSWRepetition.m: added traces, fix "count" property bug, standardize ivars
* GSWeb.framework/NSObject+IVarAccess+PerformSel.m: added traces, handle underscored ivars search
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gsweb/trunk@9332 72102866-910b-0410-8b05-ffd578937521
2001-03-11 17:15:44 +00:00
_submitActions = [ _request formValuesForKey : GSWKey_SubmitAction [ GSWebNamingConv ] ] ;
2000-01-22 12:49:49 +00:00
if ( _submitActions )
{
// TODO
} ;
LOGObjectFnNotImplemented ( ) ; // TODOFN
LOGObjectFnStop ( ) ;
return nil ;
} ;
@ end
// === === === === === === === === === === === === === === === === === === === === === === = =
@ implementation GSWDirectActionRequestHandler ( GSWRequestHandlerClassA )
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ ( id ) handler
{
return [ [ GSWDirectActionRequestHandler new ] autorelease ] ;
} ;
@ end