CatNiP prefinal
Sähköinen nuottikirja, HY-TKTKL-OHTUPROJ KESÄ11
|
00001 00011 #import "MediaWikiCategoryQuery.h" 00012 00013 @implementation MediaWikiCategoryQuery 00014 //@synthesize wikiAction=_wikiAction; 00015 @synthesize wikiQueryType=_wikiQueryType; 00016 @synthesize wikiQuery=_wikiQuery; 00017 @synthesize wikiQueryTitles=_wikiQueryTitles; 00018 @synthesize wikiQueryPageIds=_wikiQueryPageIds; 00019 @synthesize categoryDelegate=_categoryDelegate; 00020 @synthesize continueFrom=_continueFrom; 00021 @synthesize parameters; 00022 00023 NSString* _queryContinueFrom; 00024 NSXMLParser* categoryParser; 00025 NSMutableArray* categories; 00026 00027 00028 -(void)setWikiAction:(NSString *)wikiAction { 00029 [self.parameters setValue:[NSString stringWithString:wikiAction] forKey:@"action"]; 00030 } 00031 -(NSString *)wikiAction { 00032 return [self.parameters valueForKey:@"action"]; 00033 } 00034 00035 -(void)setReturnFormat:(NSString *)returnFormat { 00036 [self.parameters setValue:[NSString stringWithString:returnFormat] forKey:@"format"]; 00037 } 00038 -(NSString *)returnFormat { 00039 return [self.parameters valueForKey:@"format"]; 00040 } 00041 00042 -(void)setCategoryName:(NSString *)categoryName { 00043 [self.parameters setValue:[NSString stringWithString:categoryName] forKey:@"cmtitle"]; 00044 00045 } 00046 -(NSString *)categoryName { 00047 return [self.parameters valueForKey:@"cmtitle"]; 00048 } 00049 00050 -(void)setChunkSize:(NSString *)chunkSize { 00051 [self.parameters setValue:[NSString stringWithString:chunkSize] forKey:@"cmlimit"]; 00052 } 00053 -(NSString *)chunkSize{ 00054 return [self.parameters valueForKey:@"cmlimit"]; 00055 } 00056 00057 00063 + (MediaWikiCategoryQuery*) newCategoryQuery:(NSString*)URL delegate:(id <MediaWikiCategoryQueryDelegate>)qDelegate { 00064 00065 if(qDelegate == nil) { 00066 return nil; 00067 } 00068 MediaWikiCategoryQuery* cQuery = [MediaWikiCategoryQuery alloc]; 00069 cQuery = [cQuery initWithDelegate:cQuery mediaWikiURL:URL]; 00070 cQuery.wikiAction = @"query"; 00071 cQuery.wikiQueryType = @"list"; 00072 cQuery.wikiQuery = @"categorymembers"; 00073 cQuery.returnFormat = @"xml"; 00074 cQuery.categoryDelegate = qDelegate; 00075 return cQuery; 00076 } 00078 -init { 00079 if((self = [super init])) { 00080 self.parameters = [[NSMutableDictionary alloc] init]; 00081 self.returnFormat = @"xml"; 00082 return self; 00083 } 00084 return nil; 00085 } 00087 - (NSString*) buildQueryURL { 00088 NSString* myParams = [self _buildGetParams]; 00089 NSString* retVal = [NSString stringWithFormat: @"%@?%@", self.mediaWikiURLString, myParams]; 00090 return retVal; 00091 } 00093 -(void)didReceiveMediaWikiData:(NSData *)data { 00094 [self parseCategoryXML:data]; 00095 } 00097 -(void)parseCategoryXML:(NSData *)XMLData { 00098 // NSLog(@"Starting parse (hopefully...)"); 00099 if (categoryParser) // categoryParser is an NSXMLParser instance variable 00100 [categoryParser release]; 00101 categoryParser = [[NSXMLParser alloc] initWithData:XMLData]; 00102 [categoryParser setDelegate:self]; 00103 [categoryParser setShouldResolveExternalEntities:YES]; 00104 [categoryParser parse]; // return value not used 00105 // if not successful, delegate is informed of error 00106 } 00108 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 00109 00110 if( [elementName isEqualToString:@"cm"] ) { 00111 if(!categories) { 00112 categories = [[NSMutableArray alloc] init]; 00113 } 00114 [categories addObject: [NSString stringWithString:[attributeDict valueForKey:@"title"]]]; 00115 } 00116 else if( [elementName isEqualToString:@"categorymembers"] ) { 00117 if([attributeDict valueForKey:@"cmcontinue"]) { 00118 self.continueFrom = [attributeDict valueForKey:@"cmcontinue"]; 00119 // NSLog(@"%@",self.continueFrom); 00120 } 00121 } 00122 } 00124 -(void)parserDidEndDocument:(NSXMLParser *)parser { 00125 if(categories) { 00126 [self.categoryDelegate didReceiveCategoryArray:[[[NSArray alloc] initWithArray:categories] autorelease]]; 00127 } 00128 } 00130 -(void)parserDidStartDocument:(NSXMLParser *)parser { 00131 // NSLog(@"Parsing supposedly started."); 00132 if(categories) { 00133 [categories release]; 00134 categories = nil; 00135 } 00136 self.continueFrom = nil; 00137 } 00139 -(void)parser:(NSXMLParser *)parser validationErrorOccurred:(NSError *)validationError { 00140 NSLog(@"Oh no, validation error!"); 00141 [self.categoryDelegate categoryParseFailed:validationError]; 00142 } 00144 -(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { 00145 NSLog(@"Oh no, parse error! %@",[parseError localizedDescription]); 00146 [self.categoryDelegate categoryParseFailed:parseError]; 00147 } 00148 00149 @end 00150 00151 @implementation MediaWikiCategoryQuery(Private) 00152 00154 - (NSString*)_buildGetParams { 00155 NSMutableString* qString=[[NSMutableString alloc] init]; 00156 NSEnumerator *enumerator = [self.parameters keyEnumerator]; 00157 id key; 00158 00159 while ((key = [enumerator nextObject])) { 00160 [qString appendString: key]; 00161 [qString appendString:@"="]; 00162 [qString appendString: [self.parameters valueForKey:key]]; 00163 [qString appendString:@"&"]; 00164 } 00165 00166 [qString appendString:_wikiQueryType]; 00167 [qString appendString:@"="]; 00168 [qString appendString:_wikiQuery]; 00169 00170 if(self.continueFrom) { 00171 [qString appendString:@"&cmcontinue="]; 00172 [qString appendString:self.continueFrom]; 00173 } 00174 NSString *retVal = [[NSString alloc] initWithString:qString]; 00175 [qString release]; 00176 return [retVal autorelease]; 00177 } 00178 00179 @end