Reviewed by Anders.
[WebKit-https.git] / WebKit / Loader / WebNetscapePlugInStreamLoader.m
1 /*
2  * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #import <WebKit/WebNetscapePlugInStreamLoader.h>
30
31 #import <WebKit/WebFrameLoader.h>
32
33 @implementation WebNetscapePlugInStreamLoader
34
35 - (id)initWithDelegate:(NSObject<WebPlugInStreamLoaderDelegate> *)theStream frameLoader:(WebFrameLoader *)fl;
36 {
37     [super init];
38     stream = [theStream retain];
39     [self setFrameLoader:fl];
40     return self;
41 }
42
43 - (BOOL)isDone
44 {
45     return stream == nil;
46 }
47
48 - (void)releaseResources
49 {
50     [stream release];
51     stream = nil;
52     [super releaseResources];
53 }
54
55 - (void)didReceiveResponse:(NSURLResponse *)theResponse
56 {
57     // retain/release self in this delegate method since the additional processing can do
58     // anything including possibly releasing self; one example of this is 3266216
59     [self retain];
60     [stream startStreamWithResponse:theResponse];
61     
62     // Don't continue if the stream is cancelled in startStreamWithResponse or didReceiveResponse.
63     if (stream) {
64         [super didReceiveResponse:theResponse];
65         if (stream) {
66             if ([theResponse isKindOfClass:[NSHTTPURLResponse class]] &&
67                 ([(NSHTTPURLResponse *)theResponse statusCode] >= 400 || [(NSHTTPURLResponse *)theResponse statusCode] < 100)) {
68                 NSError *error = [frameLoader fileDoesNotExistErrorWithResponse:theResponse];
69                 [stream cancelLoadAndDestroyStreamWithError:error];
70             }
71         }
72     }
73     [self release];
74 }
75
76 - (void)didReceiveData:(NSData *)data lengthReceived:(long long)lengthReceived allAtOnce:(BOOL)allAtOnce
77 {
78     // retain/release self in this delegate method since the additional processing can do
79     // anything including possibly releasing self; one example of this is 3266216
80     [self retain];
81     [stream receivedData:data];
82     [super didReceiveData:data lengthReceived:lengthReceived allAtOnce:(BOOL)allAtOnce];
83     [self release];
84 }
85
86 - (void)didFinishLoading
87 {
88     // Calling _removePlugInStreamLoader will likely result in a call to release, so we must retain.
89     [self retain];
90
91     [frameLoader _removePlugInStreamLoader:self];
92     [frameLoader _finishedLoadingResource];
93     [stream finishedLoadingWithData:[self resourceData]];
94     [super didFinishLoading];
95
96     [self release];
97 }
98
99 - (void)didFailWithError:(NSError *)error
100 {
101     // Calling _removePlugInStreamLoader will likely result in a call to release, so we must retain.
102     // The other additional processing can do anything including possibly releasing self;
103     // one example of this is 3266216
104     [self retain];
105
106     [[self frameLoader] _removePlugInStreamLoader:self];
107     [[self frameLoader] _receivedError:error];
108     [stream destroyStreamWithError:error];
109     [super didFailWithError:error];
110
111     [self release];
112 }
113
114 - (void)cancelWithError:(NSError *)error
115 {
116     // Calling _removePlugInStreamLoader will likely result in a call to release, so we must retain.
117     [self retain];
118
119     [[self frameLoader] _removePlugInStreamLoader:self];
120     [stream destroyStreamWithError:error];
121     [super cancelWithError:error];
122
123     [self release];
124 }
125
126 @end