Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /bathyscaphe/trunk/application/subproj/reply/error/SG2chErrorHandler.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1815 - (hide annotations) (download)
Mon Mar 23 06:54:25 2015 UTC (9 years ago) by tsawada2
File size: 10899 byte(s)
Omake-commit: fix reply error parsing.
1 tsawada2 815 //
2     // SG2chErrorHandler.m
3     // BathyScaphe
4     //
5     // Updated by Tsutomu Sawada on 07/10/15.
6 tsawada2 1795 // Copyright 2005-2015 BathyScaphe Project. All rights reserved.
7 tsawada2 815 // encoding="UTF-8"
8     //
9    
10 tsawada2 3 #import "SG2chErrorHandler.h"
11     #import "SG2chConnector.h"
12     #import "URLConnector_Prefix.h"
13    
14     #define k2ch_XCommentTypeFile @"ReplyErrorCode.plist"
15     #define IS_HTML(s) ((s) && [(s) rangeOfString:@"<html" options:NSCaseInsensitiveSearch].length != 0)
16    
17    
18     // Error Code Dictionary
19 tsawada2 1310 enum {
20     ReplyErrorCodeTitleOr2ch_XDict = 1,
21     ReplyErrorCodeMessageBodyDict = 2,
22     };
23     typedef NSUInteger ReplyErrorCodeDictionaryType;
24     static NSDictionary *replyErrorCodeDictionary(ReplyErrorCodeDictionaryType type);
25 tsawada2 3
26 tsawada2 440 // 2ch_X comment
27     static NSString *scan2ch_XCommentStringWithHTML(NSString *contents);
28 tsawada2 3
29 tsawada2 440 // Constants
30     static NSString *const kHTMLBreakLine = @"<br>";
31     static NSString *const kHTMLHorizotalLine = @"<br>----------------<br>";
32 tsawada2 3
33     @implementation SG2chErrorHandler
34 tsawada2 815 + (id)handlerWithURL:(NSURL *)anURL
35 tsawada2 3 {
36 tsawada2 815 return [[[self alloc] initWithURL:anURL] autorelease];
37 tsawada2 3 }
38 tsawada2 815
39     - (id)initWithURL:(NSURL *)anURL
40 tsawada2 3 {
41 tsawada2 815 if (![[self class] canInitWithURL:anURL]) {
42 tsawada2 3 [self release];
43     return nil;
44     }
45     if (self = [super init]) {
46 tsawada2 815 [self setRequestURL:anURL];
47     [self setAdditionalFormsData:nil];
48 tsawada2 3 }
49     return self;
50     }
51    
52 tsawada2 815 - (void)dealloc
53 tsawada2 3 {
54     [m_requestURL release];
55 tsawada2 815 [m_recentError release];
56 tsawada2 438 [m_additionalFormsData release];
57 tsawada2 3 [super dealloc];
58     }
59    
60 tsawada2 815 + (BOOL)canInitWithURL:(NSURL *)anURL
61 tsawada2 3 {
62     const char *host_;
63     NSString *cgiName_;
64    
65     host_ = [[anURL host] UTF8String];
66     cgiName_ = [[anURL absoluteString] lastPathComponent];
67     if (NULL == host_) return NO;
68    
69 tsawada2 815 if (is_2channel(host_)) {
70     return [cgiName_ isEqualToString:@"bbs.cgi"];
71     }
72 tsawada2 818 if (is_machi(host_) || is_jbbs_livedoor(host_)) {
73 tsawada2 815 return [cgiName_ isEqualToString:@"write.cgi"];
74     }
75 tsawada2 3 return NO;
76     }
77    
78 tsawada2 1309 static NSString *titleForCode(NSInteger code)
79     {
80     if (code == k2chNinjaFirstAlertType) {
81     id template = SGTemplateResource(@"Reply - Ninja FirstWaitSeconds");
82     NSUInteger sec = [(NSNumber *)template unsignedIntegerValue];
83     return [NSString stringWithFormat:PluginLocalizedStringFromTable(@"k2chNinjaFirstAlertTitleFormat", nil, nil), (unsigned long)sec];
84     } else if (code == k2chBeLoginErrorType) {
85     return PluginLocalizedStringFromTable(@"k2chBeLoginErrorAlertTitle", nil, nil);
86 tsawada2 1795 } else if (code == k2chSPIDCookieErrorType) {
87     return nil;
88 tsawada2 1309 }
89     return @"ERROR";
90     }
91    
92 tsawada2 815 - (NSError *)handleErrorWithContents:(NSString *)contents
93 tsawada2 3 {
94 tsawada2 1177 NSInteger code = k2chUnknownErrorType;
95 tsawada2 3 NSString *title_ = @"";
96     NSString *message_ = @"";
97 tsawada2 815 NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithCapacity:2];
98 tsawada2 3
99     if (IS_HTML(contents)) {
100 tsawada2 815 if ([self parseHTMLContents:contents intoTitle:&title_ intoMessage:&message_]) {
101 tsawada2 3 title_ = [title_ stringByStriped];
102     message_ = [message_ stringByStriped];
103     }
104 tsawada2 1310
105     // ������������������������������������
106     code = [replyErrorCodeDictionary(ReplyErrorCodeTitleOr2ch_XDict) integerForKey:title_ defaultValue:k2chUnknownErrorType];
107 tsawada2 3
108 tsawada2 815 // ���������������������������������������������������������
109     // <!-- 2ch_X:... -->���������������
110     if (k2chUnknownErrorType == code) {
111 tsawada2 3 NSString *mark_;
112     mark_ = scan2ch_XCommentStringWithHTML(contents);
113 tsawada2 1310 code = [replyErrorCodeDictionary(ReplyErrorCodeTitleOr2ch_XDict) integerForKey:mark_ defaultValue:k2chUnknownErrorType];
114 tsawada2 3 }
115 tsawada2 1306
116 tsawada2 1815 if (k2chAnyErrorType == code || k2chUnknownErrorType == code) {
117 tsawada2 1309 // ������������������������������������������������������������������������������������be������������������������
118 tsawada2 1310 NSDictionary *bodys = replyErrorCodeDictionary(ReplyErrorCodeMessageBodyDict);
119 tsawada2 1309 NSArray *messages = [bodys allKeys];
120     for (NSString *foo in messages) {
121     NSRange range = [message_ rangeOfString:foo options:NSLiteralSearch range:[message_ range]];
122     if (range.location != NSNotFound) {
123     code = [bodys integerForKey:foo];
124 tsawada2 1795 title_ = titleForCode(code) ?: foo;
125 tsawada2 1310 break;
126 tsawada2 1309 }
127 tsawada2 1306 }
128     }
129 tsawada2 438
130     // hana=mogera
131 tsawada2 815 if (k2chContributionCheckErrorType == code || k2chSPIDCookieErrorType == code) {
132 tsawada2 438 NSDictionary *tmp_;
133 tsawada2 815 tmp_ = [self scanAdditionalFormsWithHTML:contents];
134     if (tmp_) {
135     [self setAdditionalFormsData:tmp_];
136     }
137 tsawada2 438 }
138 tsawada2 3 } else {
139     const char *host_ = [[[self requestURL] host] UTF8String];
140    
141 tsawada2 1310 if (is_jbbs_livedoor(host_) || is_machi(host_)) {
142 tsawada2 3 /*
143     2004-02-25 Takanori Ishikawa <takanori@gd5.so-net.ne.jp>
144     ----------------------------------------
145 tsawada2 815 ������������������������������������������html ������
146 tsawada2 3 */
147 tsawada2 787 /*
148     2007-08-08 tsawada2 <ben-sawa@td5.so-net.ne.jp>
149     ----------------------------------------
150 tsawada2 815 ������BBS������������������������
151 tsawada2 787 */
152 tsawada2 815 code = k2chNoneErrorType;
153     } else if (!contents || [contents isEmpty]) {
154 tsawada2 3 // Server's response contains no data.
155 tsawada2 815 code = k2chEmptyDataErrorType;
156     title_ = PluginLocalizedStringFromTable(@"k2chEmptyDataErrorType", nil, nil);
157     message_ = PluginLocalizedStringFromTable(@"k2chEmptyDataErrorType", nil, nil);
158 tsawada2 3 }
159     }
160    
161 tsawada2 815 if (k2chUnknownErrorType == code) {
162 tsawada2 3 title_ = @"ERROR";
163     message_ = contents;
164 tsawada2 815 code = k2chAnyErrorType;
165 tsawada2 3 }
166    
167 tsawada2 815 [userInfo setObject:title_ forKey:SG2chErrorTitleErrorKey];
168     [userInfo setObject:message_ forKey:SG2chErrorMessageErrorKey];
169 tsawada2 3
170 tsawada2 815 [self setRecentError:[NSError errorWithDomain:SG2chErrorHandlerErrorDomain code:code userInfo:userInfo]];
171     return [self recentError];
172 tsawada2 3 }
173    
174 tsawada2 815 - (NSURL *)requestURL
175 tsawada2 3 {
176     return m_requestURL;
177     }
178 tsawada2 815
179     - (void)setRequestURL:(NSURL *)aRequestURL
180 tsawada2 3 {
181     [aRequestURL retain];
182 tsawada2 1048 [m_requestURL release];
183 tsawada2 3 m_requestURL = aRequestURL;
184     }
185 tsawada2 815
186     - (NSError *)recentError
187 tsawada2 3 {
188     return m_recentError;
189     }
190 tsawada2 815
191     - (void)setRecentError:(NSError *)error
192 tsawada2 3 {
193 tsawada2 815 [error retain];
194     [m_recentError release];
195     m_recentError = error;
196 tsawada2 3 }
197 tsawada2 438
198 tsawada2 815 - (NSDictionary *)additionalFormsData
199 tsawada2 438 {
200     return m_additionalFormsData;
201     }
202    
203 tsawada2 815 - (void)setAdditionalFormsData:(NSDictionary *)anAdditionalFormsData
204 tsawada2 438 {
205     [anAdditionalFormsData retain];
206     [m_additionalFormsData release];
207     m_additionalFormsData = anAdditionalFormsData;
208     }
209 tsawada2 440 #pragma mark HTML Utilities
210 tsawada2 3
211 tsawada2 440 #define HTML_TAG(xpp, tagName, theType) (theType == [xpp eventType] && [[xpp name] isEqualToString : tagName])
212 tsawada2 3
213 tsawada2 815 - (id<XmlPullParser>)setUpParserWithInputSource:(NSString *)htmlContents
214 tsawada2 440 {
215 tsawada2 815 if (!htmlContents) return nil;
216 tsawada2 440 id<XmlPullParser> xpp_ = [[[SGXmlPullParser alloc] initHTMLParser] autorelease];
217 tsawada2 1685 // ������
218     // [xpp_ setInputSource:htmlContents];
219     NSString *fakeString = [htmlContents stringByReplaceCharacters:@"value=>" toString:@"value=\"\">"];
220     [xpp_ setInputSource:fakeString];
221     // ������������������
222 tsawada2 440 return xpp_;
223 tsawada2 3 }
224    
225 tsawada2 815 - (BOOL)parseHTMLContents:(NSString *)htmlContents intoTitle:(NSString **)ptitle intoMessage:(NSString **)pbody
226 tsawada2 440 {
227 tsawada2 815 id<XmlPullParser> xpp_ = [self setUpParserWithInputSource:htmlContents];
228     if (!xpp_) return NO;
229 tsawada2 3
230 tsawada2 1177 NSInteger type_;
231 tsawada2 3 NSMutableString *body_;
232     NSString *title_ = @"";
233    
234     NS_DURING
235     body_ = [NSMutableString string];
236     while ((type_ = [xpp_ next]) != XMLPULL_END_DOCUMENT) {
237     if (HTML_TAG(xpp_, @"body", XMLPULL_START_TAG)) {
238     while ((type_ = [xpp_ next]) != XMLPULL_END_DOCUMENT) {
239     NSString *text_;
240    
241     if (HTML_TAG(xpp_, @"body", XMLPULL_END_TAG))
242     break;
243    
244     text_ = [xpp_ text];
245 tsawada2 815 if (text_) [body_ appendString:text_];
246 tsawada2 3
247 tsawada2 815 // ������
248 tsawada2 3 if (HTML_TAG(xpp_, @"br", XMLPULL_START_TAG))
249 tsawada2 815 [body_ appendString:kHTMLBreakLine];
250 tsawada2 3
251 tsawada2 815 // ������������
252 tsawada2 3 if (HTML_TAG(xpp_, @"hr", XMLPULL_START_TAG))
253 tsawada2 815 [body_ appendString:kHTMLHorizotalLine];
254 tsawada2 3 }
255     }
256    
257     if (HTML_TAG(xpp_, @"head", XMLPULL_START_TAG)) {
258     while ((type_ = [xpp_ next]) != XMLPULL_END_DOCUMENT) {
259     if (HTML_TAG(xpp_, @"head", XMLPULL_END_TAG)) {
260     break;
261 tsawada2 440 } else if (HTML_TAG(xpp_, @"title", XMLPULL_START_TAG)) {
262 tsawada2 3 type_ = [xpp_ next];
263     if (XMLPULL_TEXT == type_)
264     title_ = [[[xpp_ text] copy] autorelease];
265     else
266     title_ = @"";
267     }
268     }
269     }
270     }
271     NS_HANDLER
272    
273     title_ = nil;
274     body_ = nil;
275     UTILCatchException(XmlPullParserException) {
276     NSLog(@"***XMLPULL_EXCEPTION***%@", localException);
277    
278     } else {
279     [localException raise];
280     }
281    
282     NS_ENDHANDLER
283    
284 tsawada2 815 if (!title_ && !body_)
285 tsawada2 3 return NO;
286    
287     [body_ replaceCharacters:@"\n" toString:@""];
288     [body_ replaceCharacters:kHTMLBreakLine toString:@"\n"];
289    
290     if (ptitle != NULL) *ptitle = title_;
291     if (pbody != NULL) *pbody = body_;
292    
293     return YES;
294     }
295    
296 tsawada2 815 - (NSDictionary *)scanAdditionalFormsWithHTML:(NSString *)htmlContents
297 tsawada2 438 {
298 tsawada2 815 id<XmlPullParser> xpp_ = [self setUpParserWithInputSource:htmlContents];
299 tsawada2 440
300 tsawada2 1177 NSInteger type_;
301 tsawada2 438 NSMutableDictionary *additionalFormData_ = [[[NSMutableDictionary alloc] init] autorelease];
302 tsawada2 815 NSSet *defaultKeys_ = [NSSet setWithObjects:@"bbs", @"key", @"time", @"FROM", @"mail", @"MESSAGE", @"subject", nil];
303 tsawada2 438
304     NS_DURING
305     while ((type_ = [xpp_ next]) != XMLPULL_END_DOCUMENT) {
306     if (HTML_TAG(xpp_, @"form", XMLPULL_START_TAG)) {
307     while ((type_ = [xpp_ next]) != XMLPULL_END_DOCUMENT) {
308     if (HTML_TAG(xpp_, @"form", XMLPULL_END_TAG))
309     break;
310    
311     if (HTML_TAG(xpp_, @"input", XMLPULL_START_TAG)) {
312    
313 tsawada2 815 if ([[xpp_ attributeForName:@"type"] isEqualToString:@"hidden"]) {
314     NSString *value_ = [xpp_ attributeForName:@"name"];
315 tsawada2 438 if (value_ == NULL) break;
316 tsawada2 440
317 tsawada2 815 if (![defaultKeys_ containsObject:value_]) {
318     NSString *value2_ = [xpp_ attributeForName:@"value"];
319 tsawada2 440 if (value2_ == NULL) break;
320 tsawada2 815 [additionalFormData_ setObject:value2_ forKey:value_];
321 tsawada2 438 }
322     }
323     }
324     }
325     }
326     }
327     NS_HANDLER
328    
329     UTILCatchException(XmlPullParserException) {
330     NSLog(@"***XMLPULL_EXCEPTION***%@", localException);
331     } else {
332     [localException raise];
333     }
334    
335     NS_ENDHANDLER
336     if ([additionalFormData_ count] == 0) return nil;
337     return additionalFormData_;
338     }
339 tsawada2 440 @end
340 tsawada2 438
341 tsawada2 440 #pragma mark -
342 tsawada2 1310 static NSDictionary *replyErrorCodeDictionary(ReplyErrorCodeDictionaryType type)
343 tsawada2 440 {
344     static NSDictionary *typeTbl;
345 tsawada2 1309
346 tsawada2 815 if (!typeTbl) {
347 tsawada2 440 NSString *filepath_;
348    
349 tsawada2 815 filepath_ = [PLUGIN_BUNDLE pathForResourceWithName:k2ch_XCommentTypeFile];
350 tsawada2 440 UTILCAssertNotNil(filepath_);
351 tsawada2 815 typeTbl = [[NSDictionary alloc] initWithContentsOfFile:filepath_];
352 tsawada2 440 UTILCAssertNotNil(typeTbl);
353     }
354 tsawada2 1309
355 tsawada2 1310 if (type == ReplyErrorCodeTitleOr2ch_XDict) {
356 tsawada2 1309 return [typeTbl objectForKey:@"TitleOr2ch_X"];
357 tsawada2 1310 } else if (type == ReplyErrorCodeMessageBodyDict) {
358 tsawada2 1309 return [typeTbl objectForKey:@"MessageBody"];
359     }
360     return nil;
361 tsawada2 440 }
362    
363 tsawada2 3 static NSString *scan2ch_XCommentStringWithHTML(NSString *contents)
364     {
365     NSScanner *scanner_;
366     NSString *mark_;
367    
368 tsawada2 815 if (!contents) return nil;
369     scanner_ = [NSScanner scannerWithString:contents];
370     if (!scanner_) return nil;
371 tsawada2 3
372 tsawada2 815 [scanner_ scanUpToString:@"<!--" intoString:NULL];
373     [scanner_ scanString:@"<!--" intoString:NULL];
374     [scanner_ scanString:@"2ch_X" intoString:NULL];
375     [scanner_ scanString:@":" intoString:NULL];
376 tsawada2 3
377 tsawada2 815 if (![scanner_ scanCharactersFromSet:[NSCharacterSet alphanumericCharacterSet] intoString:&mark_]) {
378 tsawada2 3 return nil;
379 tsawada2 815 }
380 tsawada2 3 return mark_;
381     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26