2002-08-04 18:00:11 +00:00
/ * * GSWHTMLURLValuedElement . m - < title > GSWeb : Class GSWHTMLURLValuedElement < / title >
2004-12-14 12:54:40 +00:00
Copyright ( C ) 1999 -2004 Free Software Foundation , Inc .
2002-08-04 18:00:11 +00:00
Written by : Manuel Guesdon < mguesdon @ orange - concept . com >
Date : Apr 1999
2000-01-22 12:49:49 +00:00
2002-08-04 18:00:11 +00:00
$ Revision $
$ Date $
2003-01-19 15:33:07 +00:00
$ Id $
2002-08-04 18:00:11 +00:00
2000-01-22 12:49:49 +00:00
This file is part of the GNUstep Web Library .
2002-08-04 18:00:11 +00:00
< license >
2000-01-22 12:49:49 +00:00
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 .
2002-08-04 18:00:11 +00:00
< / license >
* * /
2000-01-22 12:49:49 +00:00
2003-03-21 14:32:57 +00:00
# include "config.h"
RCS_ID ( "$Id$" )
2000-01-22 12:49:49 +00:00
2003-01-22 Manuel Guesdon <mguesdon@orange-concept.com>
* GSWeb.framework/Makefile.postamble:
o use $(LN_S) -f in install-WO-headers
o added $(MKDIRS) $(GNUSTEP_HEADERS)/$(GSWExtensions_wo_HEADER_FILES_INSTALL_DIR);
* GSWExtensionsGSW.framework/Makefile.postamble: use $(LN_S) -f in install-WO-headers
2003-01-20 David Ayers <d.ayers@inode.at>
* Makefile.postamble
o added support for make gswnames=(gsw,wo,all) (corrected
typo)
o reinserted support for $(INSTALL_ROOT_DIR)
* config.h.in
o added HAVE_GDL2
* configure
o added support for --with-gswnames=(gsw,wo,all)
o set LIBWRAP during configure
o added config.mak.in as configurable file
* configure.ac
o (see configure)
* config.mak: removed (replaced by config.mak.in)
* config.mak.in: new file
o added support for make gswnames=(gsw,wo,all)
* gsweb.make.in
o add GSANTLR as auxiliary lib
o add gsweb libs to AUXILIARY_GSW_LIBS
o include correct extensions for GSW/WO-libs
* gsweb_wo.make: new file
* GSWeb/GSWConfig.h
o changed support for GSWEB_WONAMES
o conditionally import file GSWWOCompatiblity
here instead of in GSWeb.h
* GSWeb/GNUMakefile
o added support for make gswnames=(gsw,wo,all)
o ensure each lib gets built with its own object files
o removed deactivated framework extension determination code
o removed reference to unused files:
GSWeb.m, GSWWOCompatibility.m
o added references to new files:
GSWExtenstions.h, GSWExtWOCompatibility.h
o added support to create WO header files
* GSWeb/Makefile.postamble
o changed support to install WO header files according to
make gswnames=(gsw,wo,all)
o remove Makefile.preamble during distclean
* GSWeb/Makefile.preamble.in
o fixed typo
* GSWeb/GSWeb.h
o moved GSW/WO-Name-mapping to GSWWOCompatibility.h
o replaced inclusions of
<GSWeb/file.h> with "file.h"
* GSWeb/GSWeb.m: removed
* GSWeb/GSWWOCompatibility.h
o changed GSWEB_WONAMES handling
o removed hybrid namespace WO subclasses
o moved & reorganized GSW/WO-Name-mapping from GSWeb.h
o inlucluded missing GSW/WO-Name-mappings
* GSWeb/GSWWOCompatibility.m: removed
* GSWeb/*.m
o replaced inclusions of
<GSWeb/file.h> with "file.h"
* GSWeb/GSWApplication.m
o remove special GSW/WO handling of WOApp
* GSWeb/WebObject/WO*: removed
* GSWeb/WebObject/WebObjects
o replaced inclusions of
<GSWeb/file.h> with "file.h"
* GSWExtensions/GNUMakefile
o added support for make gswnames=(gsw,wo,all)
o ensure each lib gets built with its own object files
o removed deactivated framework extension determination code
o added references to new files:
GSWExtenstions.h, GSWExtWOCompatibility.h
o added support to create WO header files
* GSWExtensions/Makefile.preamble
o let gnustep make figure whether to link agains debug libs
o added support for make gswnames=(gsw,wo,all)
* GSWExtensions/Makefile.postamble
o changed support to install WO header files according to
make gswnames=(gsw,wo,all)
* GSWExtensions/*.m
o replaced inclusions of
<GSWeb/GSWeb.h> with "GSWExtWOCompatibility.h"
o replaces inclusions of
<GSWExtensions/file.h> with "file.h"
* GSWExtensions/GSWExtensions.h: new file
* GSWExtensions/WOExtensions.h: new file
* GSWExtensions/GSWExtWOCompatibility.h: new file
* GSWExtensionsGSW/GNUMakefile
o added support for make gswnames=(gsw,wo,all)
o ensure each lib gets built with its own object files
o removed deactivated framework extension determination code
o added references to new file GSWExtGSWWOCompatibility.h
o added support to create WO header files
* GSWExtensionsGSW/Makefile.pramble
o let gnustep make figure whether to link agains debug libs
o added support for make gswnames=(gsw,wo,all)
o removed GSWExtensions from ADDITIONAL_LIB_DIRS
* GSWExtensionsGSW/*.m
o replaced inclusions of
<GSWeb/GSWeb.h> with "GSWExtGSWWOCompatibility.h"
* GSWExtensions/GSWExtGSWWOCompatibility.h: new file
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gsweb/trunk@15675 72102866-910b-0410-8b05-ffd578937521
2003-01-22 12:24:26 +00:00
# include "GSWeb.h"
2000-01-22 12:49:49 +00:00
// === === === === === === === === === === === === === === === === === === === === === === = =
@ implementation GSWHTMLURLValuedElement
2007-04-13 18:32:02 +00:00
- ( NSString * ) valueAttributeName
{
return @ "src" ;
}
- ( NSString * ) urlAttributeName
{
return @ "value" ;
}
2002-08-04 18:00:11 +00:00
- ( id ) initWithName : ( NSString * ) aName
2007-04-13 18:32:02 +00:00
associations : ( NSDictionary * ) associations
template : ( GSWElement * ) template
2000-01-22 12:49:49 +00:00
{
2002-08-04 18:00:11 +00:00
NSString * urlAttributeName = nil ;
NSString * valueAttributeName = nil ;
2003-01-19 15:33:07 +00:00
2007-04-13 18:32:02 +00:00
self = [ super initWithName : aName
associations : associations
template : template ] ;
if ( ! self ) {
return nil ;
}
urlAttributeName = [ self urlAttributeName ] ;
valueAttributeName = [ self valueAttributeName ] ;
ASSIGN ( _src , [ _associations objectForKey : urlAttributeName ] ) ;
if ( _src ! = nil ) {
[ _associations removeObjectForKey : urlAttributeName ] ;
}
ASSIGN ( _value , [ _associations objectForKey : valueAttributeName ] ) ;
if ( _value ! = nil ) {
[ _associations removeObjectForKey : valueAttributeName ] ;
}
ASSIGN ( _pageName , [ _associations objectForKey : pageName__Key ] ) ;
if ( _pageName ! = nil ) {
[ _associations removeObjectForKey : pageName__Key ] ;
}
ASSIGN ( _filename , [ _associations objectForKey : filename__Key ] ) ;
if ( _filename ! = nil ) {
[ _associations removeObjectForKey : filename__Key ] ;
}
ASSIGN ( _framework , [ _associations objectForKey : framework__Key ] ) ;
if ( _framework ! = nil ) {
[ _associations removeObjectForKey : framework__Key ] ;
}
ASSIGN ( _data , [ _associations objectForKey : data__Key ] ) ;
if ( _data ! = nil ) {
[ _associations removeObjectForKey : data__Key ] ;
}
ASSIGN ( _mimeType , [ _associations objectForKey : mimeType__Key ] ) ;
if ( _mimeType ! = nil ) {
[ _associations removeObjectForKey : mimeType__Key ] ;
}
ASSIGN ( _key , [ _associations objectForKey : key__Key ] ) ;
if ( _key ! = nil ) {
[ _associations removeObjectForKey : key__Key ] ;
}
ASSIGN ( _actionClass , [ _associations objectForKey : actionClass__Key ] ) ;
if ( _actionClass ! = nil ) {
[ _associations removeObjectForKey : actionClass__Key ] ;
}
ASSIGN ( _directActionName , [ _associations objectForKey : directActionName__Key ] ) ;
if ( _directActionName ! = nil ) {
[ _associations removeObjectForKey : directActionName__Key ] ;
}
ASSIGN ( _queryDictionary , [ _associations objectForKey : queryDictionary__Key ] ) ;
if ( _queryDictionary ! = nil ) {
[ _associations removeObjectForKey : queryDictionary__Key ] ;
}
_otherQueryAssociations = RETAIN ( [ _associations extractObjectsForKeysWithPrefix : @ "?"
removePrefix : YES ] ) ;
if ( _filename ! = nil ) {
if ( ( _src ! = nil ) || ( _pageName ! = nil ) || ( _value ! = nil ) || ( _data ! = nil ) ) {
[ NSException raise : NSInvalidArgumentException
format : @ "%s: Can't have 'filename' and '%@', 'pageName', 'data', or '%@'." ,
__PRETTY _FUNCTION __ , [ self urlAttributeName ] , [ self valueAttributeName ] ] ;
}
} else {
if ( _data ! = nil ) {
if ( _src ! = nil || _pageName ! = nil || _value ! = nil ) {
[ NSException raise : NSInvalidArgumentException
format : @ "%s: Can't have 'data' and '%@', 'pageName', 'pageName', or '%@'." ,
__PRETTY _FUNCTION __ , [ self urlAttributeName ] , [ self valueAttributeName ] ] ;
}
if ( _mimeType = = nil ) {
[ NSException raise : NSInvalidArgumentException
format : @ "%s: Missing 'mimeType' when 'data' is specified." ,
__PRETTY _FUNCTION __ ] ;
}
} else {
if ( ( ( _pageName ! = nil ) && ( _src ! = nil ) ) || ( ( _pageName ! = nil ) && ( _value ! = nil ) ) || ( ( _src ! = nil ) && ( _value ! = nil ) ) ) {
[ NSException raise : NSInvalidArgumentException
format : @ "%s: dynamic element can not have two conflicting bindings: 'pageName' and '%@', or 'pageName' and '%@', or 'pageName', or '%@' and '%@'." ,
__PRETTY _FUNCTION __ ,
[ self urlAttributeName ] ,
[ self valueAttributeName ] ,
[ self urlAttributeName ] ,
[ self valueAttributeName ] ] ;
}
if ( ( ( _pageName = = nil ) && ( _value = = nil ) && ( _src = = nil ) && ( _directActionName = = nil ) ) &&
( ( _actionClass = = nil ) && ( ! [ self isKindOfClass : [ GSWBody class ] ] ) ) ) {
[ NSException raise : NSInvalidArgumentException
format : @ "%s: At least one of the following bindings is required for this dynamic element: 'directActionName', 'actionClass', 'filename', 'pageName', 'data', '%@' or '%@'." ,
__PRETTY _FUNCTION __ , [ self urlAttributeName ] ,
[ self valueAttributeName ] ] ;
}
}
}
2003-11-24 12:05:48 +00:00
2000-01-22 12:49:49 +00:00
return self ;
} ;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ( void ) dealloc
{
2002-08-04 18:00:11 +00:00
DESTROY ( _src ) ;
DESTROY ( _value ) ;
DESTROY ( _pageName ) ;
DESTROY ( _filename ) ;
DESTROY ( _framework ) ;
DESTROY ( _data ) ;
DESTROY ( _mimeType ) ;
DESTROY ( _key ) ;
2007-04-13 18:32:02 +00:00
DESTROY ( _queryDictionary ) ;
2002-08-04 18:00:11 +00:00
DESTROY ( _actionClass ) ;
DESTROY ( _directActionName ) ;
DESTROY ( _otherQueryAssociations ) ;
2007-04-13 18:32:02 +00:00
2000-01-22 12:49:49 +00:00
[ super dealloc ] ;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ( NSString * ) description
{
return [ NSString stringWithFormat : @ "<%s %p>" ,
2010-04-22 04:28:50 +00:00
object_getClassName ( self ) ,
2002-08-04 18:00:11 +00:00
( void * ) self ] ;
2000-01-22 12:49:49 +00:00
} ;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2002-08-04 18:00:11 +00:00
- ( GSWElement * ) invokeActionForRequest : ( GSWRequest * ) aRequest
2007-04-13 18:32:02 +00:00
inContext : ( GSWContext * ) context
2000-01-22 12:49:49 +00:00
{
2013-02-27 04:27:07 +00:00
id < GSWActionResults , NSObject > element = nil ;
2007-04-13 18:32:02 +00:00
NSString * senderID = nil ;
NSString * elementID = nil ;
GSWComponent * component = nil ;
elementID = GSWContext_elementID ( context ) ;
senderID = GSWContext_senderID ( context ) ;
if ( elementID ! = nil && senderID ! = nil && [ elementID isEqual : senderID ] ) {
component = GSWContext_component ( context ) ;
if ( _value ! = nil ) {
element = [ _value valueInComponent : component ] ;
} else {
if ( _pageName ! = nil ) {
GSWElement * element1 = [ _pageName valueInComponent : component ] ;
if ( element1 ! = nil ) {
NSString * pageName = ( NSString * ) element1 ; // stringValue ?
if ( pageName ! = nil ) {
element = [ GSWApp pageWithName : pageName inContext : context ] ;
}
2003-03-21 14:32:57 +00:00
}
2007-04-13 18:32:02 +00:00
}
2002-08-04 18:00:11 +00:00
}
2007-04-13 18:32:02 +00:00
} else {
2013-02-27 04:27:07 +00:00
element = ( id < GSWActionResults , NSObject > ) [ super invokeActionForRequest : aRequest inContext : context ] ;
2007-04-13 18:32:02 +00:00
}
2002-08-04 18:00:11 +00:00
return element ;
2000-01-22 12:49:49 +00:00
} ;
2007-04-13 18:32:02 +00:00
- ( NSString * ) _imageURL : ( GSWContext * ) context
2000-01-22 12:49:49 +00:00
{
2007-04-13 18:32:02 +00:00
GSWComponent * component = GSWContext_component ( context ) ;
NSString * fname = [ _filename valueInComponent : component ] ;
2010-04-16 00:18:46 +00:00
NSString * fwname = [ [ self class ] _frameworkNameForAssociation : _framework
inComponent : component ] ;
2007-04-13 18:32:02 +00:00
NSString * url = [ context _urlForResourceNamed : fname
inFramework : fwname ] ;
if ( url = = nil ) {
url = [ [ GSWApp resourceManager ] errorMessageUrlForResourceNamed : fname inFramework : fwname ] ;
}
return url ;
}
2000-01-22 12:49:49 +00:00
2007-04-13 18:32:02 +00:00
- ( void ) _appendFilenameToResponse : ( GSWResponse * ) response
inContext : ( GSWContext * ) context
2000-01-22 12:49:49 +00:00
{
2007-04-13 18:32:02 +00:00
NSString * myurl = [ self _imageURL : context ] ;
2000-01-22 12:49:49 +00:00
2007-04-13 18:32:02 +00:00
[ response _appendTagAttribute : [ self urlAttributeName ]
value : myurl
escapingHTMLAttributeValue : NO ] ;
}
- ( NSString * ) CGIActionURL : ( GSWContext * ) context
2000-01-22 12:49:49 +00:00
{
2003-01-19 15:33:07 +00:00
2007-04-13 18:32:02 +00:00
NSString * actionString = [ self computeActionStringWithActionClassAssociation : _actionClass
directActionNameAssociation : _directActionName
inContext : context ] ;
2003-01-19 15:33:07 +00:00
2007-04-13 18:32:02 +00:00
NSDictionary * queryDict = [ self computeQueryDictionaryWithActionClassAssociation : _actionClass
directActionNameAssociation : _directActionName
queryDictionaryAssociation : _queryDictionary
otherQueryAssociations : _otherQueryAssociations
inContext : context ] ;
2003-01-19 15:33:07 +00:00
2007-04-13 18:32:02 +00:00
return [ context directActionURLForActionNamed : actionString
queryDictionary : queryDict ] ;
2003-01-19 15:33:07 +00:00
2007-04-13 18:32:02 +00:00
}
2003-01-19 15:33:07 +00:00
2000-01-22 12:49:49 +00:00
2007-04-13 18:32:02 +00:00
- ( void ) appendAttributesToResponse : ( GSWResponse * ) response
inContext : ( GSWContext * ) context
2000-01-22 12:49:49 +00:00
{
2007-04-13 18:32:02 +00:00
NSString * src = nil ;
GSWComponent * component = GSWContext_component ( context ) ;
[ super appendAttributesToResponse : response
inContext : context ] ;
if ( _src ! = nil ) {
src = [ _src valueInComponent : component ] ;
}
if ( _directActionName ! = nil || _actionClass ! = nil ) {
[ response _appendTagAttribute : [ self urlAttributeName ]
value : [ self CGIActionURL : context ]
escapingHTMLAttributeValue : NO ] ;
} else {
if ( _filename ! = nil ) {
[ self _appendFilenameToResponse : response inContext : context ] ;
} else {
if ( _value ! = nil || _pageName ! = nil ) {
GSWResponse_appendTagAttributeValueEscapingHTMLAttributeValue ( response ,
[ self urlAttributeName ] ,
[ context componentActionURL ] ,
NO ) ;
} else {
if ( src ! = nil ) {
if ( [ src isRelativeURL ] && ( ! [ src isFragmentURL ] ) ) {
NSString * s1 = [ context _urlForResourceNamed : src
inFramework : nil ] ;
if ( s1 ! = nil ) {
[ response _appendTagAttribute : [ self urlAttributeName ]
value : s1
escapingHTMLAttributeValue : NO ] ;
} else {
GSWResponse_appendContentCharacter ( response , ' ' ) ;
GSWResponse_appendContentAsciiString ( response , [ self urlAttributeName ] ) ;
GSWResponse_appendContentCharacter ( response , ' = ' ) ;
GSWResponse_appendContentCharacter ( response , ' " ' ) ;
GSWResponse_appendContentAsciiString ( response , [ component baseURL ] ) ;
GSWResponse_appendContentCharacter ( response , ' / ' ) ;
GSWResponse_appendContentString ( response , src ) ;
GSWResponse_appendContentCharacter ( response , ' " ' ) ;
}
} else {
GSWResponse_appendTagAttributeValueEscapingHTMLAttributeValue ( response ,
[ self urlAttributeName ] ,
src ,
NO ) ;
}
} else
if ( _data ! = nil && _mimeType ! = nil )
{
// TODO call _appendDataURLAttributeToResponse
[ NSException raise : NSInvalidArgumentException
format : @ "%s: you need to add a call to _appendDataURLAttributeToResponse in file '%s'" ,
__PRETTY _FUNCTION __ , __FILE __ ] ;
}
}
}
}
}
2000-01-22 12:49:49 +00:00
@ end
2003-01-19 15:33:07 +00:00