यह किसी भी तीसरे पक्ष के पुस्तकालयों की जरूरत के बिना मूल कार्य करता है,। (चेतावनी दी रहें: कम से कम त्रुटि जाँच।)
// data for 'drag' resource (it's always the same)
#define DRAG_DATA_LENGTH 64
static const unsigned char _dragData[DRAG_DATA_LENGTH]={
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
0x54, 0x45, 0x58, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x75, 0x72, 0x6C, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x75, 0x72, 0x6C, 0x6E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
static void _addData(NSData *data, ResType type, short resId, ResFileRefNum refNum)
{
Handle handle;
if (PtrToHand([data bytes], &handle, [data length])==noErr) {
ResFileRefNum previousRefNum=CurResFile();
UseResFile(refNum);
HLock(handle);
AddResource(handle, type, resId, "\p");
HUnlock(handle);
UseResFile(previousRefNum);
}
}
void WeblocCreateFile(NSString *location, NSString *name, NSURL *fileUrl)
{
NSString *contents=[NSString stringWithFormat:
@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
@"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
@"<plist version=\"1.0\">\n"
@"<dict>\n"
@"<key>URL</key>\n"
@"<string>%@</string>\n"
@"</dict>\n"
@"</plist>\n", location];
if ([[contents dataUsingEncoding:NSUTF8StringEncoding] writeToURL:fileUrl options:NSDataWritingAtomic error:nil])
{
// split into parent and filename parts
NSString *parentPath=[[fileUrl URLByDeletingLastPathComponent] path];
NSString *fileName=[fileUrl lastPathComponent];
FSRef parentRef;
if(FSPathMakeRef((const UInt8 *)[parentPath fileSystemRepresentation], &parentRef, NULL)==noErr)
{
unichar fileNameBuffer[[fileName length]];
[fileName getCharacters:fileNameBuffer];
FSCreateResFile(&parentRef, [fileName length], fileNameBuffer, 0, NULL, NULL, NULL);
if (ResError()==noErr)
{
FSRef fileRef;
if(FSPathMakeRef((const UInt8 *)[[fileUrl path] fileSystemRepresentation], &fileRef, NULL)==noErr)
{
ResFileRefNum resFileReference = FSOpenResFile(&fileRef, fsWrPerm);
if (resFileReference>0 && ResError()==noErr)
{
_addData([NSData dataWithBytes:_dragData length:DRAG_DATA_LENGTH], 'drag', 128, resFileReference);
_addData([location dataUsingEncoding:NSUTF8StringEncoding], 'url ', 256, resFileReference);
_addData([location dataUsingEncoding:NSUTF8StringEncoding], 'TEXT', 256, resFileReference);
_addData([name dataUsingEncoding:NSUTF8StringEncoding], 'urln', 256, resFileReference);
CloseResFile(resFileReference);
}
}
}
}
}
}
क्या कोई सफारी के साथ केवल डेटा फोर्क कार्यों के साथ वेबलोक फ़ाइल की पुष्टि कर सकता है? मैंने श्वा के उदाहरण एक्सएमएल प्लिस्ट को वेबलोक फ़ाइल के रूप में सहेजने की कोशिश की लेकिन इसे सफारी में खींचते समय यह एक खाली विंडो खुलता है। मैंने फ़ायरफ़ॉक्स के साथ एक वेबलोक फ़ाइल सहेजने का भी प्रयास किया। दिलचस्प बात यह है कि फ़ायरफ़ॉक्स एक डेटा फोर्क (एसएमए के उदाहरण में एक्सएमएल प्लिस्ट) और एक संसाधन कांटा दोनों के साथ एक फाइल लिखता है। उस फ़ाइल को सफारी कार्यों में खींचें। लेकिन जब मैंने संसाधन कांटा को हटाने की कोशिश की (इसे खाली धारा के साथ कमांड लाइन पर ओवरराइट करके) यह अब काम नहीं करता है। सफारी 4.0.5 और फ़ायरफ़ॉक्स 3.6.3 का उपयोग कर परीक्षण किया गया। – Rinzwind
मेरी पिछली टिप्पणी के लिए और स्पष्टीकरण: मैंने इसे खोलने के लिए फ़ाइल को डबल क्लिक करने की कोशिश नहीं की थी। मैंने अभी किया है और वह डेटा-कांटा-केवल वेबलोक फ़ाइल के साथ काम करता है, जो सफारी में यूआरएल खोलता है। लेकिन जैसा कि मैंने उपरोक्त कहा है, सफारी में वेबलोक फ़ाइल को ड्रग करना काम नहीं करता है, यह एक खाली खिड़की लाता है। (साथ ही, फ़ाइल को एक सफारी बुकमार्क विंडो में खींचकर वेबलोक फ़ाइल में निहित यूआरएल के लिए बुकमार्क के बजाय वेबलोक फ़ाइल के लिए // // URL के साथ एक बुकमार्क बनाता है।) – Rinzwind