This is EMErrorAction+Dispatch.m in view mode; [Download] [Up]
#import "EMErrorAction+Dispatch.h"
#import "EMErrorInfo.h"
#import "EMErrorManager.h"
#import "localizable_strings.h"
#import <syslog.h>
#import <appkit/appkit.h>
//--------------------------------------------------------------------------------
// MANCHE APPLICATIONEN SIND AUSKUNFTSFREUDIGER...
//--------------------------------------------------------------------------------
@protocol EMCleverApplication
- (const char *)appVersion;
- (const char *)appName;
@end
//--------------------------------------------------------------------------------
// HILFSFUNKTIONEN.
//--------------------------------------------------------------------------------
@implementation EMErrorAction(Dispatch)
static BOOL isvar(char **p,const char *var)
{
size_t l=strlen(var);
BOOL match;
match=!strncmp(*p,var,l);
if(match)
(*p)+=l;
return match;
}
//--------------------------------------------------------------------------------
// ARCHIVIERUNG
//--------------------------------------------------------------------------------
- awake
{
support3=NULL;
return self;
}
//--------------------------------------------------------------------------------
// DISPATCH ERROR
// Bei Aenderungen auch errlexer.lm im Compiler mit aendern!!!!
//--------------------------------------------------------------------------------
- (void)dispatch:(EMErrorInfo *)infoObj;
{
NXStream *stream;
FILE *mail;
const char *p;
char cmd[MAXPATHLEN+1],hostname[MAXHOSTNAMELEN+1];
int maxlen,len;
stream=NXOpenMemory(NULL,0,NX_WRITEONLY);
for(p=msgTemplate;*p;)
if(*p!='$')
NXPutc(stream,*p++);
else
{
p++;
if(isvar(&p,"CODE"))
NXPrintf(stream,"%s",[infoObj codeString]);
else if(isvar(&p,"MESSAGE"))
NXPrintf(stream,[infoObj message]);
else if(isvar(&p,"TIMESTAMP"))
NXPrintf(stream,[infoObj timeStamp]);
else if(isvar(&p,"TIME"))
NXPrintf(stream,"%10d",[infoObj time]);
else if(isvar(&p,"STACKFRAME"))
NXPrintf(stream,[infoObj stack]);
else if(isvar(&p,"STACK"))
NXPrintf(stream,[infoObj stack]);
else if(isvar(&p,"SOURCE"))
NXPrintf(stream,[infoObj location]);
else if(isvar(&p,"PID"))
NXPrintf(stream,"%6d",(int)getpid());
else if(isvar(&p,"USER"))
NXPrintf(stream,NXUserName());
else if(isvar(&p,"HOST"))
{
if(!gethostname(hostname,MAXHOSTNAMELEN))
NXPrintf(stream,hostname);
else
NXPrintf(stream,"<<cannot determine hostname>>");
}
else if(isvar(&p,"APPNAME"))
{
if([NXApp respondsTo:@selector(appName)])
NXPrintf(stream,[NXApp appName]);
else
NXPrintf(stream,"<<cannot determine name of application>>");
}
else if(isvar(&p,"APPVERSION"))
{
if([NXApp respondsTo:@selector(appVersion)])
NXPrintf(stream,[NXApp appVersion]);
else
NXPrintf(stream,"<<cannot determine version of application>>");
}
else if(isvar(&p,"ARCHITECTURE"))
NXPrintf(stream,__ARCHITECTURE__);
else if(isvar(&p,"COMPILER"))
NXPrintf(stream,"%s (%d)",__VERSION__,NX_CURRENT_COMPILER_RELEASE);
else if(isvar(&p,"$"))
NXPrintf(stream,"$");
else
NXPrintf(stream,"<<unknown variable>>");
}
NXGetMemoryBuffer(stream,&p,&len,&maxlen);
EM_DURING
switch(type)
{
case EMActionAlert:
NXRunAlertPanel([self title],p,[self button],NULL,NULL);
break;
case EMActionMail:
if([infoObj code]==EM_INTBASE+23)
break;
if([self respondsTo:@selector(sendMailTo:subject:body:)])
[(id)self sendMailTo:[self recipient] subject:[self subject] body:p];
else if(NXRunAlertPanel(NULL,WILL_SEND_MAIL,SEND_BUTTON,CANCEL_BUTTON,
NULL,(void *)strlen(p),[self recipient])==NX_ALERTDEFAULT)
{
sprintf(cmd,"/usr/ucb/Mail -s \"%s\" %s\n",
[self subject],[self recipient]);
mail=popen(cmd,"w");
EM_CONDERROR(mail==NULL,EM_INTBASE+23,[self recipient],NULL);
fprintf(mail,p);
fprintf(mail,"\n\n.\n");
pclose(mail);
}
break;
default:
if([infoObj code]==EM_INTBASE+21)
break;
EM_ERROR(EM_INTBASE+21,(void *)type,NULL);
break;
}
EM_HANDLER
NXCloseMemory(stream,NX_FREEBUFFER);
EM_ENDHANDLER
}
//--------------------------------------------------------------------------------
// THAT'S IT
//--------------------------------------------------------------------------------
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.