CatNiP prefinal
Sähköinen nuottikirja, HY-TKTKL-OHTUPROJ KESÄ11
/Users/awniemel/Notepad-SVN/svn/trunk/CatNiP/CatNiP/MediaWikiCategoryQuery.m
Go to the documentation of this file.
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
 All Classes Files Functions Variables Enumerations Enumerator Properties Defines