This is IBinaryD.m in view mode; [Download] [Up]
#import <libc.h>
#import <appkit/Application.h>
#import <appkit/Speaker.h>
#import <appkit/Listener.h>
#import <objc/HashTable.h>
#import "IBinaryD.h"
static NXAtom rtfControlWord;
static NXAtom fileExtension;
static NXAtom pasteboardType;
static NXImage *icon;
static NXImage *defaultImage;
// IBinaryD is used to embedded files of unknown type into a document.
// The embedded object is represented as a file icon in the document.
// The workspace manager is used to supply the file icon.
// A double click on this icon will cause workspace manager to open the
// file.
// ## REWRITE! ## might be better to send a message than use extern
extern HashTable *listOfTempFiles;
@implementation IBinaryD
+ initialize
{
rtfControlWord = NXUniqueStringNoCopy("MMbin");
fileExtension = NXUniqueStringNoCopy("bin");
pasteboardType = NXUniqueStringNoCopy("Binary Format");
// ## REWRITE! ## should provide default icon
icon = nil;
defaultImage = nil;
return(self);
}
+ (NXAtom)rtfControlWord
{
return(rtfControlWord);
}
+ (NXAtom)fileExtension
{
return(fileExtension);
}
+ (NXAtom)pasteboardType
{
return(pasteboardType);
}
+ setIcon:(NXImage *)theIcon
{
icon = theIcon;
return(self);
}
+ (NXImage *)icon
{
return(icon);
}
- setImage:(NXImage *)theIcon
{
image = theIcon;
return(self);
}
//****************************************************************************
// return image to be displayed.
//****************************************************************************
- (NXImage *)image
{
char path[256];
char *data;
int length;
int maxLen;
NXStream *outStream;
char stringBuffer[512];
int flag;
NXStream *iconStream;
if (image != nil) {
return(image);
}
if (stream == NULL) {
return(defaultImage);
}
// get WorkSpace Manager to provide the file icon
// First create head of this file on disk
NXGetMemoryBuffer(stream, &data, &length, &maxLen);
if ((outStream = NXOpenMemory(NULL, 0, NX_WRITEONLY)) == NULL) {
return(defaultImage);
}
NXWrite(outStream, data, 1024);
sprintf(path, "/tmp/%.250s", key);
if (NXSaveToFile(outStream, path) != 0) {
NXCloseMemory(outStream, NX_FREEBUFFER);
return(defaultImage);
}
NXCloseMemory(outStream, NX_FREEBUFFER);
// add executable permissions if neccessary
sprintf(stringBuffer, "file %.250s | grep executable > /dev/null", path);
if (system(stringBuffer) == 0) {
chmod(path, 0700);
} else {
chmod(path, 0600);
}
// get WorkSpace Manager to provide file icon
[[NXApp appSpeaker] setSendPort:NXPortFromName(NX_WORKSPACEREQUEST, NULL)];
[[NXApp appSpeaker] getFileIconFor:path TIFF:&data TIFFLength:&length
ok:&flag];
unlink(path);
if (flag != YES) {
return(defaultImage);
}
iconStream = NXOpenMemory(data, length, NX_READONLY);
image = [[NXImage alloc] initFromStream:iconStream];
NXCloseMemory(iconStream, NX_FREEBUFFER);
return(image);
}
//****************************************************************************
// get WorkSpace Manager to open the file.
//****************************************************************************
- performDoubleClickAction:sender
{
char stringBuffer[512];
const char *filename;
NXStream *tempStream;
int flag;
sprintf(stringBuffer, "/tmp/%.506s", [self key]);
filename = NXCopyStringBuffer(stringBuffer);
tempStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
[self writeToStream:tempStream];
NXSaveToFile(tempStream, filename);
NXCloseMemory(tempStream, NX_FREEBUFFER);
[[NXApp appSpeaker] setSendPort:NXPortFromName(NX_WORKSPACEREQUEST, NULL)];
[[NXApp appSpeaker] openFile:filename ok:&flag];
[listOfTempFiles insertKey:filename value:nil];
return(self);
}
- free
{
if (image != nil) {
[image free];
}
return([super free]);
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.