This is INewsD.m in view mode; [Download] [Up]
/*$Copyright: * Copyright (C) 1992.5.22. Recruit Co.,Ltd. * Institute for Supercomputing Research * All rights reserved. * NewsBase by ISR, Kazuto MIYAI, Gary ARAKAKI, Katsunori SUZUKI, Kok-meng Lue * * You may freely copy, distribute and reuse the code in this program under * following conditions. * - to include this notice in the source code, if it is to be distributed * with source code. * - to add the file named "COPYING" within the code, which shall include * GNU GENERAL PUBLIC LICENSE(*). * - to display an acknowledgement in binary code as follows: "This product * includes software developed by Recruit Co.,Ltd., ISR." * - to display a notice which shall state that the users may freely copy, * distribute and reuse the code in this program under GNU GENERAL PUBLIC * LICENSE(*) * - to indicate the way to access the copy of GNU GENERAL PUBLIC LICENSE(*) * * (*)GNU GENERAL PUBLIC LICENSE is stored in the file named COPYING * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. $*/ // This exists as a Class only no instances. Provides support routines for // io with the NNTP server. Really just an object-oriented interface to // an NNTP io library. #import "INewsD.h" #import <c.h> #import <libc.h> #import <sys/types.h> #import <sys/stat.h> #import <sys/dir.h> #import "IConvertMIME.h" #import "IArticleD.h" #import "InfoD.h" #import "ITextD.h" #import "IMediaTable.h" #import "IMediaD.h" #import "IBinaryD.h" #import "data_types.h" #import "IAppDelegate.h" #import "IReceiveSpeaker.h" #import <appkit/NXImage.h> #import <appkit/Pasteboard.h> #import "Localization.h" #import "errdebug.h" // All communication with the NNTP Server should flow through this class. // This is a class only. There are no instances. Really just an object- // oriented interface to the NNTP server. @implementation INewsD static NXAtom domain; static NXAtom fileExtension; + initialize { domain = NXUniqueStringNoCopy("X-news"); fileExtension = NXUniqueStringNoCopy("X-news"); return(self); } + (NXAtom)domain { return(domain); } + (NXAtom)fileExtension { return(fileExtension); } + (NXAtom)pasteboardType { return(NULL); } //***************************************************************************** // post article to NNTP server //***************************************************************************** + (BOOL)saveWithoutPrompt:(IArticleD *)saveArticle { return([self save:saveArticle]); } + (BOOL)save:(IArticleD *)article // really post to NNTP server (save: is the generic method name for external // domain method for output) { NXStream *articlestream; id conv; int len,max,size; char *buff; // convert to MIME conv = [[IConvertMIME alloc] init]; articlestream = NXOpenMemory(NULL, 0, NX_READWRITE); [conv convertToMIME:article stream:articlestream]; [conv free]; // send to NNTP NXSeek(articlestream, (long)0,NX_FROMEND); (long)size = NXTell(articlestream); NXSeek(articlestream, (long)0,NX_FROMSTART); NXGetMemoryBuffer(articlestream,&buff, &len, &max); [[NXApp delegate] postArticle:(const char *)buff length:(int)size]; NXCloseMemory(articlestream,NX_FREEBUFFER); // link NNTP article to IExternalD for object [[article external] setDomain:domain andPath:[[article dataForKey:HEADER_INFO] infoForKey:MESSAGE_ID]]; return(YES); } + setSaveDomainAndPath:(IArticleD *)article { [[article external] setDomain:domain andPath:[[article dataForKey:HEADER_INFO] infoForKey:MESSAGE_ID]]; return(self); } //***************************************************************************** // receive article from NNTP server //***************************************************************************** // receive article from NNTP and open viewer/editor + (BOOL)openArticle:(const char *)articleBuffer length:(int)length { NXStream *stream; IConvertMIME *conv; IArticleD *article; IExternalD *external; const char *path; NXZone *zone; DBG(1, ;) // convert from MIME stream = NXOpenMemory(articleBuffer, length, NX_READONLY); conv = [[IConvertMIME allocFromZone:NXCreateZone(vm_page_size, vm_page_size, YES)] init]; article = [conv convertToItem:stream]; [conv free]; // make IExternalD and create appropriate links path = [[article dataForKey:HEADER_INFO] infoForKey:MESSAGE_ID]; zone = [article zone]; external = [[IExternalD allocFromZone:zone] initWithDomain:domain andPath:path]; if ([external zone] != zone) { // article created in wrong zone so recreate it in right zone conv = [[IConvertMIME allocFromZone:[external zone]] init]; article = [conv convertToItem:stream]; [conv free]; } if ([external objectExists] == nil) { [external setObject:article]; [article setExternal:external]; } else { // article already exists (from earlier read) [article free]; article = [external object]; } // INewsD will temporarily reference this external [external incrementReferenceCount]; // [article referenceAllObjects]; // create viewer if it doesn't exists [article openEditor]; // remove temporary reference [external decrementReferenceCount]; // [article unreferenceAllObjects]; NXCloseMemory(stream, NX_FREEBUFFER); return(YES); } // loadFromName:inZone: is done asynchronously. i.e., the article // will be defined some time AFTER the return. + (IArticleD *)loadFromName:(const char *)path inZone:(NXZone *)zone { port_t port; int returnCode; if ((port = NXPortFromName(NEWSBASE, NULL)) == PORT_NULL) { NXRunAlertPanel(MMEDITOR, LoStr("Cannot find port %s"), LoStr("OK"), NULL, NULL, NEWSBASE); return(nil); } [[NXApp appSpeaker] setSendPort:port]; if ((returnCode = [[NXApp appSpeaker] sendArticleWithMessageID:path]) != 0) { NXRunAlertPanel(MMEDITOR, LoStr("Cannot contact %s"), LoStr("OK"), NULL, NULL, NEWSBASE); } return(nil); } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.