[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

cblu cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 06:04:55 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit e886dbab8d85fecae9a47cb473489bbab6a7dcd6
Author: cblu <cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Sat Apr 13 01:03:06 2002 +0000

            First implementation of IFDownloadHandler and IFDownloadHandlerPrivate.
    
            Added:
            - (void) startedDownloadWithHandler:(IFDownloadHandler *)downloadHandler
            - (void) receivedProgress:(IFLoadProgress *)progress forDownloadHandler$
            - (void) receivedError:(IFError *)error forDownloadHandler:(IFDownloadH$
    
            to Alex's WebController.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@1003 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index 788f8f4..2949ab4 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,4 +1,8 @@
-2002-04-11  Chris Blumenberg  <set EMAIL_ADDRESS environment variable>
+2002-04-12 Chris Blumenberg <cblu at apple.com>
+
+	First implementation of IFDownloadHandler and IFDownloadHandlerPrivate.
+
+2002-04-11  Chris Blumenberg  <cblu at apple.com>
 
 	Added support for non-html content. Non-html content is embedded in a
 	contrived HTML document.
@@ -28,7 +32,7 @@
 	(-[IFMainURLHandleClient IFURLHandleResourceDidFinishLoading:data:]),
 	(-[IFMainURLHandleClient IFURLHandle:resourceDataDidBecomeAvailable:]):
 
-2002-04-10  Chris Blumenberg  <set EMAIL_ADDRESS environment variable>
+2002-04-10  Chris Blumenberg  <cblu at apple.com>
 
 	Cleaned up stream deallocations.
 
diff --git a/WebKit/ChangeLog-2002-12-03 b/WebKit/ChangeLog-2002-12-03
index 788f8f4..2949ab4 100644
--- a/WebKit/ChangeLog-2002-12-03
+++ b/WebKit/ChangeLog-2002-12-03
@@ -1,4 +1,8 @@
-2002-04-11  Chris Blumenberg  <set EMAIL_ADDRESS environment variable>
+2002-04-12 Chris Blumenberg <cblu at apple.com>
+
+	First implementation of IFDownloadHandler and IFDownloadHandlerPrivate.
+
+2002-04-11  Chris Blumenberg  <cblu at apple.com>
 
 	Added support for non-html content. Non-html content is embedded in a
 	contrived HTML document.
@@ -28,7 +32,7 @@
 	(-[IFMainURLHandleClient IFURLHandleResourceDidFinishLoading:data:]),
 	(-[IFMainURLHandleClient IFURLHandle:resourceDataDidBecomeAvailable:]):
 
-2002-04-10  Chris Blumenberg  <set EMAIL_ADDRESS environment variable>
+2002-04-10  Chris Blumenberg  <cblu at apple.com>
 
 	Cleaned up stream deallocations.
 
diff --git a/WebKit/MIME.subproj/IFContentHandler.h b/WebKit/MIME.subproj/IFContentHandler.h
index 1811903..05def3f 100644
--- a/WebKit/MIME.subproj/IFContentHandler.h
+++ b/WebKit/MIME.subproj/IFContentHandler.h
@@ -4,7 +4,7 @@
 */
 
 #import <Foundation/Foundation.h>
-#import <IFMIMEHandler.h>
+#import <WebKit/IFMIMEHandler.h>
 
 @interface IFContentHandler : NSObject {
     IFMIMEHandlerType handlerType;
diff --git a/WebKit/MIME.subproj/IFContentHandler.m b/WebKit/MIME.subproj/IFContentHandler.m
index 9295023..05dee87 100644
--- a/WebKit/MIME.subproj/IFContentHandler.m
+++ b/WebKit/MIME.subproj/IFContentHandler.m
@@ -3,7 +3,7 @@
 	Copyright 2002, Apple, Inc. All rights reserved.
 */
 
-#import "IFContentHandler.h"
+#import <WebKit/IFContentHandler.h>
 
 static NSString *imageDocumentTemplate = nil;
 static NSString *pluginDocumentTemplate = nil;
diff --git a/WebKit/MIME.subproj/IFDownloadHandler.h b/WebKit/MIME.subproj/IFDownloadHandler.h
new file mode 100644
index 0000000..c29894c
--- /dev/null
+++ b/WebKit/MIME.subproj/IFDownloadHandler.h
@@ -0,0 +1,23 @@
+//
+//  IFDownloadHandler.h
+//  WebKit
+//
+//  Created by Chris Blumenberg on Thu Apr 11 2002.
+//  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <WebKit/IFMIMEHandler.h>
+#import <WebFoundation/WebFoundation.h>
+
+ at interface IFDownloadHandler : NSObject {
+ at private
+    id _downloadHandlerPrivate;
+}
+
+- (NSURL *) url;
+- (IFMIMEHandler *) mimeHandler;
+- (void) cancelDownload;
+- (void) storeAtPath:(NSString *)path;
+- (void) setOpenAfterDownload:(BOOL)open;
+ at end
diff --git a/WebKit/MIME.subproj/IFDownloadHandler.m b/WebKit/MIME.subproj/IFDownloadHandler.m
new file mode 100644
index 0000000..7333773
--- /dev/null
+++ b/WebKit/MIME.subproj/IFDownloadHandler.m
@@ -0,0 +1,44 @@
+//
+//  IFDownloadHandler.m
+//  WebKit
+//
+//  Created by Chris Blumenberg on Thu Apr 11 2002.
+//  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
+//
+
+#import <WebKit/IFDownloadHandler.h>
+#import <WebKit/IFDownloadHandlerPrivate.h>
+
+ at implementation IFDownloadHandler
+
+- (NSURL *) url
+{
+    return [((IFDownloadHandlerPrivate *)_downloadHandlerPrivate) _url];
+}
+
+- (IFMIMEHandler *) mimeHandler
+{
+    return [((IFDownloadHandlerPrivate *)_downloadHandlerPrivate) _mimeHandler];
+}
+
+- (void) cancelDownload
+{
+    [((IFDownloadHandlerPrivate *)_downloadHandlerPrivate) _cancelDownload];
+}
+
+- (void) storeAtPath:(NSString *)path
+{
+    [((IFDownloadHandlerPrivate *)_downloadHandlerPrivate) _storeAtPath:path];
+}
+
+- (void) dealloc
+{
+    [_downloadHandlerPrivate release];
+}
+
+- (void) setOpenAfterDownload:(BOOL)open
+{
+    [((IFDownloadHandlerPrivate *)_downloadHandlerPrivate) _setOpenAfterDownload:open];
+}
+
+ at end
diff --git a/WebKit/MIME.subproj/IFDownloadHandlerPrivate.h b/WebKit/MIME.subproj/IFDownloadHandlerPrivate.h
new file mode 100644
index 0000000..82244a5
--- /dev/null
+++ b/WebKit/MIME.subproj/IFDownloadHandlerPrivate.h
@@ -0,0 +1,37 @@
+//
+//  IFDownloadHandlerPrivate.h
+//  WebKit
+//
+//  Created by Chris Blumenberg on Thu Apr 11 2002.
+//  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <WebFoundation/WebFoundation.h>
+#import <WebKit/IFDownloadHandler.h>
+#import <WebKit/IFMIMEHandler.h>
+
+ at interface IFDownloadHandlerPrivate : NSObject {
+    IFMIMEHandler *mimeHandler;
+    IFURLHandle *urlHandle;
+    NSString *path;
+    BOOL openAfterDownload;
+}
+
+- (void) _setMIMEHandler:(IFMIMEHandler *) mHandler;
+- (void) _setURLHandle:(IFURLHandle *)uHandle;
+- (NSURL *) _url;
+- (IFMIMEHandler *) _mimeHandler;
+- (void) _cancelDownload;
+- (void) _storeAtPath:(NSString *)newPath;
+- (void) _finishedDownload;
+- (void) _setOpenAfterDownload:(BOOL)open;
+
+ at end
+
+ at interface IFDownloadHandler (IFPrivate)
+- _initWithURLHandle:(IFURLHandle *)uHandle mimeHandler:(IFMIMEHandler *)mHandler;
+- (void) _receivedData:(NSData *)data;
+- (void) _finishedDownload;
+
+ at end
\ No newline at end of file
diff --git a/WebKit/MIME.subproj/IFDownloadHandlerPrivate.m b/WebKit/MIME.subproj/IFDownloadHandlerPrivate.m
new file mode 100644
index 0000000..ec5bad2
--- /dev/null
+++ b/WebKit/MIME.subproj/IFDownloadHandlerPrivate.m
@@ -0,0 +1,132 @@
+//
+//  IFDownloadHandlerPrivate.m
+//  WebKit
+//
+//  Created by Chris Blumenberg on Thu Apr 11 2002.
+//  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
+//
+
+#import <WebKit/IFDownloadHandlerPrivate.h>
+#import <ApplicationServices/ApplicationServices.h>
+
+ at implementation IFDownloadHandlerPrivate
+
+
+- init
+{
+    //FIXME: we should not open files by default
+    openAfterDownload = YES;
+    return self;
+}
+
+- (void) _setMIMEHandler:(IFMIMEHandler *) mHandler
+{
+    mimeHandler = [mHandler retain];
+}
+
+- (void) _setURLHandle:(IFURLHandle *)uHandle
+{
+    urlHandle = [uHandle retain];
+}
+
+- (NSURL *) _url
+{
+    return [urlHandle url];
+}
+
+- (IFMIMEHandler *) _mimeHandler
+{
+    return mimeHandler;
+}
+
+- (void) _cancelDownload
+{
+    NSFileManager *fileManager;
+    
+    [urlHandle cancelLoadInBackground];
+    if(path){
+        fileManager = [NSFileManager defaultManager];
+        [fileManager removeFileAtPath:path handler:nil];
+    }
+}
+
+- (void) _storeAtPath:(NSString *)newPath
+{
+    NSFileManager *fileManager=nil;
+    
+    if(path){
+        [fileManager movePath:path toPath:newPath handler:nil];
+        [path release];
+    }
+    path = [newPath retain];
+}
+
+- (void) _openDownloadedFile
+{
+    CFURLRef pathURL;
+    pathURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)path, kCFURLPOSIXPathStyle, FALSE);
+    NSLog(@"Opening: %@", path);
+    LSOpenCFURLRef(pathURL, NULL);
+    CFRelease(pathURL);
+}
+
+- (void) _finishedDownload
+{
+    NSFileManager *fileManager;
+    NSString *filename;
+    
+    if(!path){
+        //FIXME: need a better way to get a file name out of a URL
+        //FIXME: need to save temp file in file cache or somewhere else
+        filename = [[[urlHandle url] absoluteString] lastPathComponent];
+        path = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Desktop/%@", filename]];
+        [path retain];
+    }
+    fileManager = [NSFileManager defaultManager];
+    [fileManager createFileAtPath:path contents:[urlHandle resourceData] attributes:nil];
+    
+    //FIXME: need to send FNNotify here
+    NSLog(@"Downloaded completed. Saved to: %@", path);
+    
+    if(openAfterDownload)
+        [self _openDownloadedFile];
+}
+
+- (void) _setOpenAfterDownload:(BOOL)open
+{
+    openAfterDownload = open;
+    if(path){
+        [self _openDownloadedFile];
+    }
+}
+
+- (void) dealloc
+{
+    [mimeHandler release];
+    [urlHandle release];
+    [path release];
+}
+
+ at end
+
+ at implementation IFDownloadHandler (IFPrivate)
+
+- _initWithURLHandle:(IFURLHandle *)uHandle mimeHandler:(IFMIMEHandler *)mHandler
+{
+    ((IFDownloadHandlerPrivate *)_downloadHandlerPrivate) = [[IFDownloadHandlerPrivate alloc] init];
+    [((IFDownloadHandlerPrivate *)_downloadHandlerPrivate) _setURLHandle:uHandle];
+    [((IFDownloadHandlerPrivate *)_downloadHandlerPrivate) _setMIMEHandler:mHandler];
+    return self;
+}
+
+- (void) _receivedData:(NSData *)data
+{
+
+}
+
+- (void) _finishedDownload
+{
+    [((IFDownloadHandlerPrivate *)_downloadHandlerPrivate) _finishedDownload];
+}
+
+ at end
\ No newline at end of file
diff --git a/WebKit/WebKit.pbproj/project.pbxproj b/WebKit/WebKit.pbproj/project.pbxproj
index f58fd9c..00b3a7d 100644
--- a/WebKit/WebKit.pbproj/project.pbxproj
+++ b/WebKit/WebKit.pbproj/project.pbxproj
@@ -217,6 +217,8 @@
 				F5A672BB0263866E01000102,
 				F5A672BD0263866E01000102,
 				F5A357540265E57A01000102,
+				F5E6396B0266996101000102,
+				F544394F02674FD501FF6181,
 			);
 			isa = PBXHeadersBuildPhase;
 		};
@@ -266,6 +268,8 @@
 				F5A672BC0263866E01000102,
 				F5A672BE0263866E01000102,
 				F5A357530265E57A01000102,
+				F5E6396A0266996101000102,
+				F544395002674FD501FF6181,
 			);
 			isa = PBXSourcesBuildPhase;
 		};
@@ -1128,6 +1132,30 @@
 			settings = {
 			};
 		};
+		F544394D02674FD501FF6181 = {
+			isa = PBXFileReference;
+			name = IFDownloadHandler.h;
+			path = MIME.subproj/IFDownloadHandler.h;
+			refType = 4;
+		};
+		F544394E02674FD501FF6181 = {
+			isa = PBXFileReference;
+			name = IFDownloadHandler.m;
+			path = MIME.subproj/IFDownloadHandler.m;
+			refType = 4;
+		};
+		F544394F02674FD501FF6181 = {
+			fileRef = F544394D02674FD501FF6181;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F544395002674FD501FF6181 = {
+			fileRef = F544394E02674FD501FF6181;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
 		F5883BDE025E5C6A01000102 = {
 			isa = PBXFileReference;
 			name = nullplugin.tiff;
@@ -1426,6 +1454,30 @@
 			settings = {
 			};
 		};
+		F5E639680266996101000102 = {
+			isa = PBXFileReference;
+			name = IFDownloadHandlerPrivate.m;
+			path = MIME.subproj/IFDownloadHandlerPrivate.m;
+			refType = 4;
+		};
+		F5E639690266996101000102 = {
+			isa = PBXFileReference;
+			name = IFDownloadHandlerPrivate.h;
+			path = MIME.subproj/IFDownloadHandlerPrivate.h;
+			refType = 4;
+		};
+		F5E6396A0266996101000102 = {
+			fileRef = F5E639680266996101000102;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		F5E6396B0266996101000102 = {
+			fileRef = F5E639690266996101000102;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
 		F5EBC45202134BB601CA1520 = {
 			children = (
 				F5EBC45502134BC301CA1520,
@@ -1485,6 +1537,10 @@
 				F5F084BE024BDCA701CA1520,
 				F5A357510265E57A01000102,
 				F5A357520265E57A01000102,
+				F544394D02674FD501FF6181,
+				F544394E02674FD501FF6181,
+				F5E639690266996101000102,
+				F5E639680266996101000102,
 			);
 			isa = PBXGroup;
 			name = MIME;
@@ -1507,6 +1563,9 @@
 			fileRef = F5F084B9024BDC8E01CA1520;
 			isa = PBXBuildFile;
 			settings = {
+				ATTRIBUTES = (
+					Public,
+				);
 			};
 		};
 		F5F084BC024BDC8E01CA1520 = {
diff --git a/WebKit/WebView.subproj/IFBaseWebController.mm b/WebKit/WebView.subproj/IFBaseWebController.mm
index e96d2e6..48aba86 100644
--- a/WebKit/WebView.subproj/IFBaseWebController.mm
+++ b/WebKit/WebView.subproj/IFBaseWebController.mm
@@ -300,4 +300,19 @@
     // Do nothing.  Subclasses typically override this method.
 }
 
+- (void) startedDownloadWithHandler:(IFDownloadHandler *)downloadHandler
+{
+    // Do nothing.  Subclasses typically override this method.
+}
+
+- (void) receivedProgress:(IFLoadProgress *)progress forDownloadHandler:(IFDownloadHandler *)downloadHandler
+{
+    // Do nothing.  Subclasses typically override this method.
+}
+
+- (void) receivedError:(IFError *)error forDownloadHandler:(IFDownloadHandler *)downloadHandler partialProgress: (IFLoadProgress *)progress
+{
+    // Do nothing.  Subclasses typically override this method.
+}
+
 @end
diff --git a/WebKit/WebView.subproj/IFMainURLHandleClient.h b/WebKit/WebView.subproj/IFMainURLHandleClient.h
index b3bfefb..545e218 100644
--- a/WebKit/WebView.subproj/IFMainURLHandleClient.h
+++ b/WebKit/WebView.subproj/IFMainURLHandleClient.h
@@ -17,8 +17,10 @@
 {
     id dataSource;
     KHTMLPart *part;
-    BOOL sentFakeDocForNonHTMLContentType, typeChecked;
+    BOOL sentFakeDocForNonHTMLContentType, typeChecked, downloadStarted;
     IFMIMEHandler *mimeHandler;
+    IFMIMEHandlerType handlerType;
+    IFDownloadHandler *downloadHandler;
 }
 - initWithDataSource: (IFWebDataSource *)ds part: (KHTMLPart *)p;
 @end
diff --git a/WebKit/WebView.subproj/IFMainURLHandleClient.mm b/WebKit/WebView.subproj/IFMainURLHandleClient.mm
index 1042146..7050b67 100644
--- a/WebKit/WebView.subproj/IFMainURLHandleClient.mm
+++ b/WebKit/WebView.subproj/IFMainURLHandleClient.mm
@@ -11,6 +11,7 @@
 #import <WebKit/IFMIMEDatabase.h>
 #import <WebKit/WebKitDebug.h>
 #import <WebKit/IFContentHandler.h>
+#import <WebKit/IFDownloadHandlerPrivate.h>
 
 #include <khtmlview.h>
 
@@ -23,6 +24,7 @@
         part = p;
         part->ref();
         sentFakeDocForNonHTMLContentType = NO;
+        downloadStarted = NO;
         typeChecked = NO;
         return self;
     }
@@ -51,7 +53,12 @@
     IFLoadProgress *loadProgress = [[IFLoadProgress alloc] init];
     loadProgress->totalToLoad = -1;
     loadProgress->bytesSoFar = -1;
-    [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedProgress:loadProgress forDownloadHandler:downloadHandler];
+    }else{
+        [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
+            forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    }
     [loadProgress release];
 }
 
@@ -63,7 +70,7 @@
 
     WEBKITDEBUGLEVEL (WEBKIT_LOG_LOADING, "url = %s\n", [[[sender url] absoluteString] cString]);
 
-    if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_TEXT) {
+    if(handlerType == IFMIMEHANDLERTYPE_TEXT) {
         contentHandler = [[IFContentHandler alloc] initWithMIMEHandler:mimeHandler URL:[sender url]];
         fakeHTMLDocument = [contentHandler textHTMLDocumentBottom];
         fakeHTMLDocumentBytes = [fakeHTMLDocument cString];
@@ -74,7 +81,13 @@
     IFLoadProgress *loadProgress = [[IFLoadProgress alloc] init];
     loadProgress->totalToLoad = [data length];
     loadProgress->bytesSoFar = [data length];
-    [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedProgress:loadProgress forDownloadHandler:downloadHandler];
+        [downloadHandler _finishedDownload];
+    }else{
+        [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
+            forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    }
     [loadProgress release];
 }
 
@@ -91,50 +104,57 @@
     if(!typeChecked){
         mimeDatabase = [IFMIMEDatabase sharedMIMEDatabase];
         mimeHandler = [[mimeDatabase MIMEHandlerForMIMEType:[sender contentType]] retain];
+        handlerType = [mimeHandler handlerType];
         typeChecked = YES;
     }
     
     // if it's html, send the data to the part
     // FIXME: [sender contentType] still returns nil if from cache
-    if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_NIL || [mimeHandler handlerType] == IFMIMEHANDLERTYPE_HTML) {
+    if(handlerType == IFMIMEHANDLERTYPE_NIL || handlerType == IFMIMEHANDLERTYPE_HTML) {
         part->slotData(sender, (const char *)[data bytes], [data length]);
     }
     
     // for non-html documents, create html doc that embeds them
-    else if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_IMAGE  || 
-            [mimeHandler handlerType] == IFMIMEHANDLERTYPE_PLUGIN || 
-            [mimeHandler handlerType] == IFMIMEHANDLERTYPE_TEXT) {
+    else if(handlerType == IFMIMEHANDLERTYPE_IMAGE  || 
+            handlerType == IFMIMEHANDLERTYPE_PLUGIN || 
+            handlerType == IFMIMEHANDLERTYPE_TEXT) {
         if (!sentFakeDocForNonHTMLContentType) {
             contentHandler = [[IFContentHandler alloc] initWithMIMEHandler:mimeHandler URL:[sender url]];
             fakeHTMLDocument = [contentHandler HTMLDocument];
             fakeHTMLDocumentBytes = [fakeHTMLDocument cString];
             part->slotData(sender, (const char *)fakeHTMLDocumentBytes, strlen(fakeHTMLDocumentBytes));
-            sentFakeDocForNonHTMLContentType = YES;
             [contentHandler release];
+            sentFakeDocForNonHTMLContentType = YES;
         }
         
         // for text documents, the incoming data is part of the main page
-        if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_TEXT){
+        if(handlerType == IFMIMEHANDLERTYPE_TEXT){
             part->slotData(sender, (const char *)[data bytes], [data length]);
         }
     }
 
-    // FIXME: download code goes here, stop reporting error
-    else{
-        [sender cancelLoadInBackground];
-        IFError *error = [[IFError alloc] initWithErrorCode: IFFileDownloadNotSupportedError failingURL: [sender url]];
-        [[dataSource controller] _mainReceivedError: error 
-            forResource: [[sender url] absoluteString] partialProgress:nil fromDataSource: dataSource];
-        [error release];
-        return;
+    // downloaded file
+    else if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        if(!downloadStarted){
+            downloadHandler = [[IFDownloadHandler alloc] _initWithURLHandle:sender mimeHandler:mimeHandler];
+            [[dataSource controller] startedDownloadWithHandler:downloadHandler];
+            downloadStarted = YES;
+        }
+        [downloadHandler _receivedData:data];
     }
 
     // update progress
+
     IFLoadProgress *loadProgress = [[IFLoadProgress alloc] init];
     loadProgress->totalToLoad = [sender contentLength];
     loadProgress->bytesSoFar = [sender contentLengthReceived];
-    [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
-        forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedProgress:loadProgress forDownloadHandler:downloadHandler];
+        NSLog(@"%d of %d", loadProgress->bytesSoFar, loadProgress->totalToLoad);
+    }else{
+        [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
+            forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    }
     [loadProgress release];
 }
 
@@ -147,7 +167,13 @@
     loadProgress->bytesSoFar = [sender contentLengthReceived];
 
     IFError *error = [[IFError alloc] initWithErrorCode: result failingURL: [sender url]];
-    [[dataSource controller] _mainReceivedError: error forResource: [[sender url] absoluteString] partialProgress: loadProgress fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedError: error forDownloadHandler:downloadHandler 
+            partialProgress: loadProgress];
+    }else{
+        [[dataSource controller] _mainReceivedError: error forResource: [[sender url] absoluteString] 
+            partialProgress: loadProgress fromDataSource: dataSource];
+    }
     [error release];
 }
 
diff --git a/WebKit/WebView.subproj/IFWebController.h b/WebKit/WebView.subproj/IFWebController.h
index e0ef50c..9fc2c9f 100644
--- a/WebKit/WebView.subproj/IFWebController.h
+++ b/WebKit/WebView.subproj/IFWebController.h
@@ -7,7 +7,7 @@
 #import <Cocoa/Cocoa.h>
 
 #import <WebKit/IFLoadProgress.h>
-
+#import <WebKit/IFDownloadHandler.h>
 
 /*
    ============================================================================= 
@@ -145,6 +145,15 @@
 // Called when a plug-in for a certain mime type is not installed
 - (void)pluginNotFoundForMIMEType:(NSString *)mime pluginPageURL:(NSURL *)url;
 
+// Called when a file download has started
+- (void) startedDownloadWithHandler:(IFDownloadHandler *)downloadHandler;
+
+// Called when progress of a download has been made
+- (void) receivedProgress:(IFLoadProgress *)progress forDownloadHandler:(IFDownloadHandler *)downloadHandler;
+
+// Called when the download has had an error
+- (void) receivedError:(IFError *)error forDownloadHandler:(IFDownloadHandler *)downloadHandler partialProgress: (IFLoadProgress *)progress;
+
 @end
 
 
diff --git a/WebKit/WebView.subproj/WebController.h b/WebKit/WebView.subproj/WebController.h
index e0ef50c..9fc2c9f 100644
--- a/WebKit/WebView.subproj/WebController.h
+++ b/WebKit/WebView.subproj/WebController.h
@@ -7,7 +7,7 @@
 #import <Cocoa/Cocoa.h>
 
 #import <WebKit/IFLoadProgress.h>
-
+#import <WebKit/IFDownloadHandler.h>
 
 /*
    ============================================================================= 
@@ -145,6 +145,15 @@
 // Called when a plug-in for a certain mime type is not installed
 - (void)pluginNotFoundForMIMEType:(NSString *)mime pluginPageURL:(NSURL *)url;
 
+// Called when a file download has started
+- (void) startedDownloadWithHandler:(IFDownloadHandler *)downloadHandler;
+
+// Called when progress of a download has been made
+- (void) receivedProgress:(IFLoadProgress *)progress forDownloadHandler:(IFDownloadHandler *)downloadHandler;
+
+// Called when the download has had an error
+- (void) receivedError:(IFError *)error forDownloadHandler:(IFDownloadHandler *)downloadHandler partialProgress: (IFLoadProgress *)progress;
+
 @end
 
 
diff --git a/WebKit/WebView.subproj/WebMainResourceClient.h b/WebKit/WebView.subproj/WebMainResourceClient.h
index b3bfefb..545e218 100644
--- a/WebKit/WebView.subproj/WebMainResourceClient.h
+++ b/WebKit/WebView.subproj/WebMainResourceClient.h
@@ -17,8 +17,10 @@
 {
     id dataSource;
     KHTMLPart *part;
-    BOOL sentFakeDocForNonHTMLContentType, typeChecked;
+    BOOL sentFakeDocForNonHTMLContentType, typeChecked, downloadStarted;
     IFMIMEHandler *mimeHandler;
+    IFMIMEHandlerType handlerType;
+    IFDownloadHandler *downloadHandler;
 }
 - initWithDataSource: (IFWebDataSource *)ds part: (KHTMLPart *)p;
 @end
diff --git a/WebKit/WebView.subproj/WebMainResourceClient.m b/WebKit/WebView.subproj/WebMainResourceClient.m
index 1042146..7050b67 100644
--- a/WebKit/WebView.subproj/WebMainResourceClient.m
+++ b/WebKit/WebView.subproj/WebMainResourceClient.m
@@ -11,6 +11,7 @@
 #import <WebKit/IFMIMEDatabase.h>
 #import <WebKit/WebKitDebug.h>
 #import <WebKit/IFContentHandler.h>
+#import <WebKit/IFDownloadHandlerPrivate.h>
 
 #include <khtmlview.h>
 
@@ -23,6 +24,7 @@
         part = p;
         part->ref();
         sentFakeDocForNonHTMLContentType = NO;
+        downloadStarted = NO;
         typeChecked = NO;
         return self;
     }
@@ -51,7 +53,12 @@
     IFLoadProgress *loadProgress = [[IFLoadProgress alloc] init];
     loadProgress->totalToLoad = -1;
     loadProgress->bytesSoFar = -1;
-    [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedProgress:loadProgress forDownloadHandler:downloadHandler];
+    }else{
+        [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
+            forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    }
     [loadProgress release];
 }
 
@@ -63,7 +70,7 @@
 
     WEBKITDEBUGLEVEL (WEBKIT_LOG_LOADING, "url = %s\n", [[[sender url] absoluteString] cString]);
 
-    if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_TEXT) {
+    if(handlerType == IFMIMEHANDLERTYPE_TEXT) {
         contentHandler = [[IFContentHandler alloc] initWithMIMEHandler:mimeHandler URL:[sender url]];
         fakeHTMLDocument = [contentHandler textHTMLDocumentBottom];
         fakeHTMLDocumentBytes = [fakeHTMLDocument cString];
@@ -74,7 +81,13 @@
     IFLoadProgress *loadProgress = [[IFLoadProgress alloc] init];
     loadProgress->totalToLoad = [data length];
     loadProgress->bytesSoFar = [data length];
-    [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedProgress:loadProgress forDownloadHandler:downloadHandler];
+        [downloadHandler _finishedDownload];
+    }else{
+        [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
+            forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    }
     [loadProgress release];
 }
 
@@ -91,50 +104,57 @@
     if(!typeChecked){
         mimeDatabase = [IFMIMEDatabase sharedMIMEDatabase];
         mimeHandler = [[mimeDatabase MIMEHandlerForMIMEType:[sender contentType]] retain];
+        handlerType = [mimeHandler handlerType];
         typeChecked = YES;
     }
     
     // if it's html, send the data to the part
     // FIXME: [sender contentType] still returns nil if from cache
-    if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_NIL || [mimeHandler handlerType] == IFMIMEHANDLERTYPE_HTML) {
+    if(handlerType == IFMIMEHANDLERTYPE_NIL || handlerType == IFMIMEHANDLERTYPE_HTML) {
         part->slotData(sender, (const char *)[data bytes], [data length]);
     }
     
     // for non-html documents, create html doc that embeds them
-    else if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_IMAGE  || 
-            [mimeHandler handlerType] == IFMIMEHANDLERTYPE_PLUGIN || 
-            [mimeHandler handlerType] == IFMIMEHANDLERTYPE_TEXT) {
+    else if(handlerType == IFMIMEHANDLERTYPE_IMAGE  || 
+            handlerType == IFMIMEHANDLERTYPE_PLUGIN || 
+            handlerType == IFMIMEHANDLERTYPE_TEXT) {
         if (!sentFakeDocForNonHTMLContentType) {
             contentHandler = [[IFContentHandler alloc] initWithMIMEHandler:mimeHandler URL:[sender url]];
             fakeHTMLDocument = [contentHandler HTMLDocument];
             fakeHTMLDocumentBytes = [fakeHTMLDocument cString];
             part->slotData(sender, (const char *)fakeHTMLDocumentBytes, strlen(fakeHTMLDocumentBytes));
-            sentFakeDocForNonHTMLContentType = YES;
             [contentHandler release];
+            sentFakeDocForNonHTMLContentType = YES;
         }
         
         // for text documents, the incoming data is part of the main page
-        if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_TEXT){
+        if(handlerType == IFMIMEHANDLERTYPE_TEXT){
             part->slotData(sender, (const char *)[data bytes], [data length]);
         }
     }
 
-    // FIXME: download code goes here, stop reporting error
-    else{
-        [sender cancelLoadInBackground];
-        IFError *error = [[IFError alloc] initWithErrorCode: IFFileDownloadNotSupportedError failingURL: [sender url]];
-        [[dataSource controller] _mainReceivedError: error 
-            forResource: [[sender url] absoluteString] partialProgress:nil fromDataSource: dataSource];
-        [error release];
-        return;
+    // downloaded file
+    else if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        if(!downloadStarted){
+            downloadHandler = [[IFDownloadHandler alloc] _initWithURLHandle:sender mimeHandler:mimeHandler];
+            [[dataSource controller] startedDownloadWithHandler:downloadHandler];
+            downloadStarted = YES;
+        }
+        [downloadHandler _receivedData:data];
     }
 
     // update progress
+
     IFLoadProgress *loadProgress = [[IFLoadProgress alloc] init];
     loadProgress->totalToLoad = [sender contentLength];
     loadProgress->bytesSoFar = [sender contentLengthReceived];
-    [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
-        forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedProgress:loadProgress forDownloadHandler:downloadHandler];
+        NSLog(@"%d of %d", loadProgress->bytesSoFar, loadProgress->totalToLoad);
+    }else{
+        [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
+            forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    }
     [loadProgress release];
 }
 
@@ -147,7 +167,13 @@
     loadProgress->bytesSoFar = [sender contentLengthReceived];
 
     IFError *error = [[IFError alloc] initWithErrorCode: result failingURL: [sender url]];
-    [[dataSource controller] _mainReceivedError: error forResource: [[sender url] absoluteString] partialProgress: loadProgress fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedError: error forDownloadHandler:downloadHandler 
+            partialProgress: loadProgress];
+    }else{
+        [[dataSource controller] _mainReceivedError: error forResource: [[sender url] absoluteString] 
+            partialProgress: loadProgress fromDataSource: dataSource];
+    }
     [error release];
 }
 
diff --git a/WebKit/WebView.subproj/WebMainResourceLoader.h b/WebKit/WebView.subproj/WebMainResourceLoader.h
index b3bfefb..545e218 100644
--- a/WebKit/WebView.subproj/WebMainResourceLoader.h
+++ b/WebKit/WebView.subproj/WebMainResourceLoader.h
@@ -17,8 +17,10 @@
 {
     id dataSource;
     KHTMLPart *part;
-    BOOL sentFakeDocForNonHTMLContentType, typeChecked;
+    BOOL sentFakeDocForNonHTMLContentType, typeChecked, downloadStarted;
     IFMIMEHandler *mimeHandler;
+    IFMIMEHandlerType handlerType;
+    IFDownloadHandler *downloadHandler;
 }
 - initWithDataSource: (IFWebDataSource *)ds part: (KHTMLPart *)p;
 @end
diff --git a/WebKit/WebView.subproj/WebMainResourceLoader.m b/WebKit/WebView.subproj/WebMainResourceLoader.m
index 1042146..7050b67 100644
--- a/WebKit/WebView.subproj/WebMainResourceLoader.m
+++ b/WebKit/WebView.subproj/WebMainResourceLoader.m
@@ -11,6 +11,7 @@
 #import <WebKit/IFMIMEDatabase.h>
 #import <WebKit/WebKitDebug.h>
 #import <WebKit/IFContentHandler.h>
+#import <WebKit/IFDownloadHandlerPrivate.h>
 
 #include <khtmlview.h>
 
@@ -23,6 +24,7 @@
         part = p;
         part->ref();
         sentFakeDocForNonHTMLContentType = NO;
+        downloadStarted = NO;
         typeChecked = NO;
         return self;
     }
@@ -51,7 +53,12 @@
     IFLoadProgress *loadProgress = [[IFLoadProgress alloc] init];
     loadProgress->totalToLoad = -1;
     loadProgress->bytesSoFar = -1;
-    [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedProgress:loadProgress forDownloadHandler:downloadHandler];
+    }else{
+        [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
+            forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    }
     [loadProgress release];
 }
 
@@ -63,7 +70,7 @@
 
     WEBKITDEBUGLEVEL (WEBKIT_LOG_LOADING, "url = %s\n", [[[sender url] absoluteString] cString]);
 
-    if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_TEXT) {
+    if(handlerType == IFMIMEHANDLERTYPE_TEXT) {
         contentHandler = [[IFContentHandler alloc] initWithMIMEHandler:mimeHandler URL:[sender url]];
         fakeHTMLDocument = [contentHandler textHTMLDocumentBottom];
         fakeHTMLDocumentBytes = [fakeHTMLDocument cString];
@@ -74,7 +81,13 @@
     IFLoadProgress *loadProgress = [[IFLoadProgress alloc] init];
     loadProgress->totalToLoad = [data length];
     loadProgress->bytesSoFar = [data length];
-    [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedProgress:loadProgress forDownloadHandler:downloadHandler];
+        [downloadHandler _finishedDownload];
+    }else{
+        [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
+            forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    }
     [loadProgress release];
 }
 
@@ -91,50 +104,57 @@
     if(!typeChecked){
         mimeDatabase = [IFMIMEDatabase sharedMIMEDatabase];
         mimeHandler = [[mimeDatabase MIMEHandlerForMIMEType:[sender contentType]] retain];
+        handlerType = [mimeHandler handlerType];
         typeChecked = YES;
     }
     
     // if it's html, send the data to the part
     // FIXME: [sender contentType] still returns nil if from cache
-    if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_NIL || [mimeHandler handlerType] == IFMIMEHANDLERTYPE_HTML) {
+    if(handlerType == IFMIMEHANDLERTYPE_NIL || handlerType == IFMIMEHANDLERTYPE_HTML) {
         part->slotData(sender, (const char *)[data bytes], [data length]);
     }
     
     // for non-html documents, create html doc that embeds them
-    else if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_IMAGE  || 
-            [mimeHandler handlerType] == IFMIMEHANDLERTYPE_PLUGIN || 
-            [mimeHandler handlerType] == IFMIMEHANDLERTYPE_TEXT) {
+    else if(handlerType == IFMIMEHANDLERTYPE_IMAGE  || 
+            handlerType == IFMIMEHANDLERTYPE_PLUGIN || 
+            handlerType == IFMIMEHANDLERTYPE_TEXT) {
         if (!sentFakeDocForNonHTMLContentType) {
             contentHandler = [[IFContentHandler alloc] initWithMIMEHandler:mimeHandler URL:[sender url]];
             fakeHTMLDocument = [contentHandler HTMLDocument];
             fakeHTMLDocumentBytes = [fakeHTMLDocument cString];
             part->slotData(sender, (const char *)fakeHTMLDocumentBytes, strlen(fakeHTMLDocumentBytes));
-            sentFakeDocForNonHTMLContentType = YES;
             [contentHandler release];
+            sentFakeDocForNonHTMLContentType = YES;
         }
         
         // for text documents, the incoming data is part of the main page
-        if([mimeHandler handlerType] == IFMIMEHANDLERTYPE_TEXT){
+        if(handlerType == IFMIMEHANDLERTYPE_TEXT){
             part->slotData(sender, (const char *)[data bytes], [data length]);
         }
     }
 
-    // FIXME: download code goes here, stop reporting error
-    else{
-        [sender cancelLoadInBackground];
-        IFError *error = [[IFError alloc] initWithErrorCode: IFFileDownloadNotSupportedError failingURL: [sender url]];
-        [[dataSource controller] _mainReceivedError: error 
-            forResource: [[sender url] absoluteString] partialProgress:nil fromDataSource: dataSource];
-        [error release];
-        return;
+    // downloaded file
+    else if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        if(!downloadStarted){
+            downloadHandler = [[IFDownloadHandler alloc] _initWithURLHandle:sender mimeHandler:mimeHandler];
+            [[dataSource controller] startedDownloadWithHandler:downloadHandler];
+            downloadStarted = YES;
+        }
+        [downloadHandler _receivedData:data];
     }
 
     // update progress
+
     IFLoadProgress *loadProgress = [[IFLoadProgress alloc] init];
     loadProgress->totalToLoad = [sender contentLength];
     loadProgress->bytesSoFar = [sender contentLengthReceived];
-    [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
-        forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedProgress:loadProgress forDownloadHandler:downloadHandler];
+        NSLog(@"%d of %d", loadProgress->bytesSoFar, loadProgress->totalToLoad);
+    }else{
+        [[dataSource controller] _mainReceivedProgress: (IFLoadProgress *)loadProgress 
+            forResource: [[sender url] absoluteString] fromDataSource: dataSource];
+    }
     [loadProgress release];
 }
 
@@ -147,7 +167,13 @@
     loadProgress->bytesSoFar = [sender contentLengthReceived];
 
     IFError *error = [[IFError alloc] initWithErrorCode: result failingURL: [sender url]];
-    [[dataSource controller] _mainReceivedError: error forResource: [[sender url] absoluteString] partialProgress: loadProgress fromDataSource: dataSource];
+    if(handlerType == IFMIMEHANDLERTYPE_APPLICATION){
+        [[dataSource controller] receivedError: error forDownloadHandler:downloadHandler 
+            partialProgress: loadProgress];
+    }else{
+        [[dataSource controller] _mainReceivedError: error forResource: [[sender url] absoluteString] 
+            partialProgress: loadProgress fromDataSource: dataSource];
+    }
     [error release];
 }
 
diff --git a/WebKit/WebView.subproj/WebView.h b/WebKit/WebView.subproj/WebView.h
index e0ef50c..9fc2c9f 100644
--- a/WebKit/WebView.subproj/WebView.h
+++ b/WebKit/WebView.subproj/WebView.h
@@ -7,7 +7,7 @@
 #import <Cocoa/Cocoa.h>
 
 #import <WebKit/IFLoadProgress.h>
-
+#import <WebKit/IFDownloadHandler.h>
 
 /*
    ============================================================================= 
@@ -145,6 +145,15 @@
 // Called when a plug-in for a certain mime type is not installed
 - (void)pluginNotFoundForMIMEType:(NSString *)mime pluginPageURL:(NSURL *)url;
 
+// Called when a file download has started
+- (void) startedDownloadWithHandler:(IFDownloadHandler *)downloadHandler;
+
+// Called when progress of a download has been made
+- (void) receivedProgress:(IFLoadProgress *)progress forDownloadHandler:(IFDownloadHandler *)downloadHandler;
+
+// Called when the download has had an error
+- (void) receivedError:(IFError *)error forDownloadHandler:(IFDownloadHandler *)downloadHandler partialProgress: (IFLoadProgress *)progress;
+
 @end
 
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list