/** GSWHTMLURLValuedElement.m - GSWeb: Class GSWHTMLURLValuedElement Copyright (C) 1999-2004 Free Software Foundation, Inc. Written by: Manuel Guesdon Date: Apr 1999 $Revision$ $Date$ $Id$ 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. **/ #include "config.h" RCS_ID("$Id$") #include "GSWeb.h" //==================================================================== @implementation GSWHTMLURLValuedElement //-------------------------------------------------------------------- -(id)initWithName:(NSString*)aName associations:(NSDictionary*)inAssociations contentElements:(NSArray*)elements { NSString* urlAttributeName=nil; NSString* valueAttributeName=nil; NSMutableDictionary* associations=nil; LOGObjectFnStartC("GSWHTMLURLValuedElement"); urlAttributeName=[self urlAttributeName];//so what ? valueAttributeName=[self valueAttributeName];//so what ? associations=[NSMutableDictionary dictionaryWithDictionary:inAssociations]; _src = [[associations objectForKey:src__Key withDefaultObject:[_src autorelease]] retain]; NSDebugMLLog(@"gswdync",@"src=%@",_src); _value = [[associations objectForKey:value__Key withDefaultObject:[_value autorelease]] retain]; NSDebugMLLog(@"gswdync",@"value=%@",_value); _pageName = [[associations objectForKey:pageName__Key withDefaultObject:[_pageName autorelease]] retain]; NSDebugMLLog(@"gswdync",@"pageName=%@",_pageName); _filename = [[associations objectForKey:filename__Key withDefaultObject:[_filename autorelease]] retain]; NSDebugMLLog(@"gswdync",@"filename=%@",_filename); _framework = [[associations objectForKey:framework__Key withDefaultObject:[_framework autorelease]] retain]; NSDebugMLLog(@"gswdync",@"framework=%@",_framework); _data = [[associations objectForKey:data__Key withDefaultObject:[_data autorelease]] retain]; NSDebugMLLog(@"gswdync",@"data=%@",_data); _mimeType = [[associations objectForKey:mimeType__Key withDefaultObject:[_mimeType autorelease]] retain]; NSDebugMLLog(@"gswdync",@"mimeType=%@",_mimeType); _key = [[associations objectForKey:key__Key withDefaultObject:[_key autorelease]] retain]; NSDebugMLLog(@"gswdync",@"key=%@",_key); _actionClass = [[associations objectForKey:actionClass__Key withDefaultObject:[_actionClass autorelease]] retain]; NSDebugMLLog(@"gswdync",@"actionClass=%@",_actionClass); _directActionName = [[associations objectForKey:directActionName__Key withDefaultObject:[_directActionName autorelease]] retain]; NSDebugMLLog(@"gswdync",@"directActionName=%@",_directActionName); _queryDictionary = [[associations objectForKey:queryDictionary__Key withDefaultObject:[_queryDictionary autorelease]] retain]; NSDebugMLLog(@"gswdync",@"queryDictionary=%@",_queryDictionary); [associations removeObjectForKey:src__Key]; [associations removeObjectForKey:value__Key]; [associations removeObjectForKey:pageName__Key]; [associations removeObjectForKey:filename__Key]; [associations removeObjectForKey:framework__Key]; [associations removeObjectForKey:data__Key]; [associations removeObjectForKey:mimeType__Key]; [associations removeObjectForKey:key__Key]; [associations removeObjectForKey:actionClass__Key]; [associations removeObjectForKey:directActionName__Key]; [associations removeObjectForKey:queryDictionary__Key]; if (!WOStrictFlag) { //pageSetVarAssociations//GNUstepWeb only NSDictionary* pageSetVarAssociations=[associations associationsWithoutPrefix:pageSetVar__Prefix__Key removeFrom:associations]; if ([pageSetVarAssociations count]>0) { ASSIGN(_pageSetVarAssociations,pageSetVarAssociations); }; _pageSetVarAssociationsDynamic=[[associations objectForKey:pageSetVars__Key withDefaultObject:[_pageSetVarAssociationsDynamic autorelease]] retain]; NSDebugMLLog(@"gswdync",@"_pageSetVarAssociationsDynamic=%@",_pageSetVarAssociationsDynamic); _cidStore = [[associations objectForKey:cidStore__Key withDefaultObject:[_cidStore autorelease]] retain]; NSDebugMLLog(@"gswdync",@"cidStore=%@",_cidStore); _cidKey = [[associations objectForKey:cidKey__Key withDefaultObject:[_cidKey autorelease]] retain]; NSDebugMLLog(@"gswdync",@"cidKey=%@",_cidKey); [associations removeObjectForKey:pageSetVars__Key]; [associations removeObjectForKey:cidStore__Key]; [associations removeObjectForKey:cidKey__Key]; }; if ([associations count]>0) { ASSIGN(_otherQueryAssociations,([associations extractObjectsForKeysWithPrefix:@"?" removePrefix:YES])); if ([_otherQueryAssociations count]==0) DESTROY(_otherQueryAssociations); if (!WOStrictFlag) { ASSIGN(_otherPathQueryAssociations,([associations extractObjectsForKeysWithPrefix:@"!" removePrefix:YES])); if ([_otherPathQueryAssociations count]==0) DESTROY(_otherPathQueryAssociations); }; }; if ((self=[super initWithName:[self elementName]//NEW attributeAssociations:associations contentElements:elements])) { }; LOGObjectFnStopC("GSWHTMLURLValuedElement"); return self; }; //-------------------------------------------------------------------- -(void)dealloc { DESTROY(_src); DESTROY(_value); DESTROY(_pageName); DESTROY(_pageSetVarAssociations);//GNUstepWeb only DESTROY(_pageSetVarAssociationsDynamic);//GSWeb only DESTROY(_filename); DESTROY(_framework); DESTROY(_data); DESTROY(_mimeType); DESTROY(_key); DESTROY(_actionClass); DESTROY(_directActionName); DESTROY(_queryDictionary); DESTROY(_otherQueryAssociations); DESTROY(_otherPathQueryAssociations); DESTROY(_cidStore);//GSWeb only DESTROY(_cidKey);//GSWeb only [super dealloc]; } //-------------------------------------------------------------------- -(NSString*)valueAttributeName { //Does nothing return nil; }; //-------------------------------------------------------------------- -(NSString*)urlAttributeName { //Does nothing return nil; }; //-------------------------------------------------------------------- -(NSString*)description { return [NSString stringWithFormat:@"<%s %p>", object_get_class_name(self), (void*)self]; }; @end //==================================================================== @implementation GSWHTMLURLValuedElement (GSWHTMLURLValuedElementA) //-------------------------------------------------------------------- -(GSWElement*)invokeActionForRequest:(GSWRequest*)aRequest inContext:(GSWContext*)aContext { //OK GSWElement* element=nil; NSString* senderID=nil; NSString* elementID=nil; LOGObjectFnStartC("GSWHTMLURLValuedElement"); NSDebugMLLog(@"gswdync",@"ET=%@ id=%@",[self class], GSWContext_elementID(aContext)); senderID=GSWContext_senderID(aContext); elementID=GSWContext_elementID(aContext); NSDebugMLLog(@"gswdync",@"senderID=%@",senderID); NSDebugMLLog(@"gswdync",@"elementID=%@",elementID); NSDebugMLLog(@"gswdync",@"[elementID isEqualToString:senderID]=%d", (int)[elementID isEqualToString:senderID]); if ([elementID isEqualToString:senderID]) { GSWComponent* component=GSWContext_component(aContext); if (_value) { element=[_value valueInComponent:component]; NSAssert4(!element || [element isKindOfClass:[GSWElement class]], @"_value: %@ component: %@ Element is a %@ not a GSWElement: %@", _value, component, [element class], element); } else if (_pageName) { NSString* pageNameValue=[_pageName valueInComponent:component]; element=[GSWApp pageWithName:pageNameValue inContext:aContext]; NSAssert3(!element || [element isKindOfClass:[GSWElement class]], @"pageNameValue: %@ Element is a %@ not a GSWElement: %@", pageNameValue, [element class], element); if (!WOStrictFlag && element)//GNUstepWeb only { if (_pageSetVarAssociations) { [_pageSetVarAssociations associationsSetValuesFromObject:component inObject:(GSWComponent*)element]; }; if (_pageSetVarAssociationsDynamic) { NSDictionary* assocs=[_pageSetVarAssociationsDynamic valueInComponent:component]; if (assocs) { if (![assocs isKindOfClass:[NSDictionary class]]) { ExceptionRaise(@"GSWHTMLURLValuedElement",@"%@ (%@) must return a Dictionary, not a %@ like %@", pageSetVars__Key, _pageSetVarAssociationsDynamic, [assocs class], assocs); } else { [assocs associationsSetValuesFromObject:component inObject:(GSWComponent*)element]; }; }; }; }; }; NSDebugMLLog(@"gswdync",@"GSWHTMLURLValuedElement invoke element=%@",element); //the end ? //TODOV if (!element) { element=[aContext page]; NSAssert2(!element || [element isKindOfClass:[GSWElement class]], @"Element is a %@ not a GSWElement: %@", [element class], element); }; } else { element=[super invokeActionForRequest:aRequest inContext:aContext]; NSAssert2(!element || [element isKindOfClass:[GSWElement class]], @"Element is a %@ not a GSWElement: %@", [element class], element); }; NSDebugMLLog(@"gswdync",@"GSWHTMLURLValuedElement invoke element=%@",element); NSDebugMLLog(@"gswdync",@"senderID=%@",GSWContext_senderID(aContext)); NSDebugMLLog(@"gswdync",@"elementID=%@",GSWContext_elementID(aContext)); NSDebugMLLog(@"gswdync",@"END ET=%@ id=%@",[self class],GSWContext_elementID(aContext)); LOGObjectFnStopC("GSWHTMLURLValuedElement"); return element; }; @end //==================================================================== @implementation GSWHTMLURLValuedElement (GSWHTMLURLValuedElementB) //-------------------------------------------------------------------- //NDFN -(void)appendURLToResponse:(GSWResponse*)aResponse inContext:(GSWContext*)aContext { //OK NSString* urlAttributeName=nil; NSString* url=nil; GSWComponent* component=nil; NSString* keyValue=nil; id data=nil; id mimeTypeValue=nil; id cidStoreValue=nil; GSWURLValuedElementData* dataValue=nil; GSWResourceManager* resourceManager=nil; LOGObjectFnStartC("GSWHTMLURLValuedElement"); NS_DURING { NSDebugMLLog(@"gswdync",@"elementID=%@",GSWContext_elementID(aContext)); component=GSWContext_component(aContext); NSDebugMLLog(@"gswdync",@"data=%@",_data); NSDebugMLLog(@"gswdync",@"filename=%@",_filename); NSDebugMLLog(@"gswdync",@"pageName=%@",_pageName); cidStoreValue=[_cidStore valueInComponent:component]; NSDebugMLLog(@"gswdync",@"cidStoreValue=%@",cidStoreValue); resourceManager=[[GSWApplication application]resourceManager]; if (_src) { url=[_src valueInComponent:component]; NSDebugMLLog(@"gswdync",@"url=%@",url); if (cidStoreValue) { url=[self addURL:url forCIDKeyAssociation:_cidKey CIDStoreAssociation:_cidStore inContext:aContext]; NSDebugMLLog(@"gswdync",@"url=%@",url); }; } else if (_actionClass || _directActionName) { url=(NSString*)[aContext componentActionURL]; NSDebugMLLog(@"gswdync",@"url=%@",url); if (cidStoreValue) { url=[self addURL:url forCIDKeyAssociation:_cidKey CIDStoreAssociation:_cidStore inContext:aContext]; NSDebugMLLog(@"gswdync",@"url=%@",url); }; } else { BOOL processed=NO; if (_key) { keyValue=[_key valueInComponent:component]; NSDebugMLLog(@"gswdync",@"keyValue=%@",keyValue); dataValue=[resourceManager _cachedDataForKey:keyValue]; NSDebugMLLog(@"gswdync",@"dataValue=%@",dataValue); }; if (_data && !dataValue) { data=[_data valueInComponent:component]; NSDebugMLLog(@"gswdync",@"_data=%@",data); mimeTypeValue=[_mimeType valueInComponent:component]; NSDebugMLLog(@"gswdync",@"mimeType=%@",_mimeType); NSDebugMLLog(@"gswdync",@"mimeTypeValue=%@",mimeTypeValue); dataValue=[[[GSWURLValuedElementData alloc] initWithData:data mimeType:mimeTypeValue key:nil] autorelease]; NSDebugMLLog(@"gswdync",@"dataValue=%@",dataValue); [resourceManager setURLValuedElementData:dataValue]; processed=YES; } if (cidStoreValue && dataValue) { url=[self addURLValuedElementData:dataValue forCIDKeyAssociation:_cidKey CIDStoreAssociation:_cidStore inContext:aContext]; NSDebugMLLog(@"gswdync",@"url=%@",url); } if (!processed && _filename) { //Exemple: Body with filename id filenameValue=nil; id frameworkValue=nil; GSWRequest* request=nil; NSArray* languages=nil; NSDebugMLLog(@"gswdync",@"filename=%@",_filename); filenameValue=[_filename valueInComponent:component]; NSDebugMLLog(@"gswdync",@"filenameValue=%@",filenameValue); frameworkValue=[self frameworkNameInContext:aContext]; NSDebugMLLog(@"gswdync",@"frameworkValue=%@",frameworkValue); request=[aContext request]; languages=[aContext languages]; if (cidStoreValue) { NSString* path=[resourceManager pathForResourceNamed:filenameValue inFramework:frameworkValue languages:languages]; if ([path length]==0) NSWarnLog(@"No path (or empty one) for filenameValue: '%@' (association=%@) in %@ named %@", filenameValue,_filename,[self className],[self declarationName]); url=[self addPath:path forCIDKeyAssociation:_cidKey CIDStoreAssociation:_cidStore inContext:aContext]; NSDebugMLLog(@"gswdync",@"filenameValue=%@ url=%@",filenameValue,url); if ([url length]==0) NSWarnLog(@"No URL (or empty one) for filenameValue: '%@' (association=%@) in %@ named %@", filenameValue,_filename,[self className],[self declarationName]); } else { url=[resourceManager urlForResourceNamed:filenameValue inFramework:frameworkValue languages:languages request:request]; NSDebugMLLog(@"gswdync",@"filenameValue=%@ url=%@",filenameValue,url); if ([url length]==0) NSWarnLog(@"No URL (or empty one) for filenameValue: '%@' (association=%@) in %@ named %@", filenameValue,_filename,[self className],[self declarationName]); }; }; }; GSWResponse_appendContentCharacter(aResponse,' '); urlAttributeName=[self urlAttributeName]; if (urlAttributeName) { GSWResponse_appendContentAsciiString(aResponse,urlAttributeName); GSWResponse_appendContentAsciiString(aResponse,@"=\""); }; if (_src) { GSWResponse_appendContentString(aResponse,url); } else if (_actionClass || _directActionName) { GSWResponse_appendContentString(aResponse,url); } else { if (dataValue)//_key || _data) { if (cidStoreValue) GSWResponse_appendContentString(aResponse,url); else [dataValue appendDataURLToResponse:aResponse inContext:aContext]; } else if (_filename) { NSDebugMLLog(@"gswdync",@"url = %@",url); GSWResponse_appendContentString(aResponse,url); }; }; if (urlAttributeName) GSWResponse_appendContentCharacter(aResponse,'"'); NSDebugMLLog(@"gswdync",@"_elementID=%@",GSWContext_elementID(aContext)); } NS_HANDLER { LOGException0(@"exception in GSWHTMLURLValuedElement appendToResponse:inContext"); LOGException(@"exception=%@",localException); localException=ExceptionByAddingUserInfoObjectFrameInfo(localException, @"In GSWHTMLURLValuedElement appendToResponse:inContext"); LOGException(@"exception=%@",localException); [localException raise]; } NS_ENDHANDLER; LOGObjectFnStopC("GSWHTMLURLValuedElement"); }; //-------------------------------------------------------------------- -(void)appendGSWebObjectsAssociationsToResponse:(GSWResponse*)aResponse inContext:(GSWContext*)aContext { //OK LOGObjectFnStartC("GSWHTMLURLValuedElement"); [self appendURLToResponse:aResponse inContext:aContext]; LOGObjectFnStopC("GSWHTMLURLValuedElement"); }; //-------------------------------------------------------------------- -(void)_appendCGIActionURLToResponse:(GSWResponse*)aResponse inContext:(GSWContext*)aContext { //OK NSString* actionString=nil; NSDictionary* queryDictionary=nil; NSString* anUrl=nil; LOGObjectFnStart(); actionString=[self computeActionStringInContext:aContext]; NSDebugMLLog(@"gswdync",@"actionString=%@",actionString); queryDictionary=[self computeQueryDictionaryInContext:aContext]; NSDebugMLLog(@"gswdync",@"queryDictionary=%@",queryDictionary); anUrl=(NSString*)[aContext directActionURLForActionNamed:actionString queryDictionary:queryDictionary]; NSDebugMLLog(@"gswdync",@"anUrl=%@",anUrl); GSWResponse_appendContentString(aResponse,anUrl); LOGObjectFnStop(); }; //-------------------------------------------------------------------- -(NSString*)computeActionStringInContext:(GSWContext*)aContext { NSString* actionString=nil; LOGObjectFnStart(); actionString=[self computeActionStringWithActionClassAssociation:_actionClass directActionNameAssociation:_directActionName otherPathQueryAssociations:_otherPathQueryAssociations inContext:aContext]; LOGObjectFnStop(); return actionString; }; //-------------------------------------------------------------------- -(NSDictionary*)computeQueryDictionaryInContext:(GSWContext*)aContext { NSDictionary* queryDictionary=nil; LOGObjectFnStart(); queryDictionary=[self computeQueryDictionaryWithActionClassAssociation:_actionClass directActionNameAssociation:_directActionName queryDictionaryAssociation:_queryDictionary otherQueryAssociations:_otherQueryAssociations inContext:aContext]; LOGObjectFnStop(); return queryDictionary; }; //-------------------------------------------------------------------- -(NSString*)frameworkNameInContext:(GSWContext*)aContext { //OK NSString* frameworkName=nil; GSWComponent* component=GSWContext_component(aContext); NSDebugMLog(@"framework=%@",_framework); if (_framework) frameworkName=[_framework valueInComponent:component]; else frameworkName=[component frameworkName]; return frameworkName; }; @end