00001
00002
00003
00004
00005
00006
00007
00008
00009 #import "DropIO.h"
00010 #import "DropIODrop.h"
00011
00012 #define kAssetsPerPage 30
00013
00014 @implementation DropIODrop
00015
00016 @synthesize name;
00017 @synthesize password;
00018
00019 @synthesize adminPassword;
00020 @synthesize guestPassword;
00021 @synthesize adminToken;
00022 @synthesize guestToken;
00023
00024 @synthesize email;
00025 @synthesize voicemail;
00026 @synthesize conference;
00027
00028 @synthesize rss;
00029 @synthesize fax;
00030 @synthesize hiddenUploadUrl;
00031
00032 @synthesize expirationLength;
00033 @synthesize currentBytes;
00034 @synthesize maxBytes;
00035
00036 @synthesize assetCount;
00037
00038 @synthesize guestsCanAdd;
00039 @synthesize guestsCanDelete;
00040 @synthesize guestsCanComment;
00041
00042 @synthesize premiumCode;
00043
00044 @synthesize assets;
00045
00046 @synthesize title;
00047 @synthesize sortOrder;
00048 @synthesize page;
00049
00050 - (id) init
00051 {
00052 if ((self = [super init]) != nil)
00053 {
00054 sortOrder = AssetSortOrder_Type;
00055 page = 1;
00056 }
00057 return self;
00058 }
00059
00060 - (void) dealloc
00061 {
00062 [self unloadAssets];
00063
00064 [name release];
00065 [password release];
00066 [adminPassword release];
00067 [guestPassword release];
00068 [adminToken release];
00069 [guestToken release];
00070
00071 [email release];
00072 [voicemail release];
00073 [conference release];
00074
00075 [rss release];
00076 [fax release];
00077 [hiddenUploadUrl release];
00078
00079 [expirationLength release];
00080 [currentBytes release];
00081 [maxBytes release];
00082
00083 [assetCount release];
00084
00085 [guestsCanAdd release];
00086 [guestsCanDelete release];
00087 [guestsCanComment release];
00088
00089 [premiumCode release];
00090
00091 [title release];
00092
00093 [super dealloc];
00094 }
00095
00096
00097
00098 - (NSURL*) emailURL
00099 {
00100 if (email == nil)
00101 return nil;
00102
00103 return [NSURL URLWithString:[NSString stringWithFormat:@"mailto:%@", email]];
00104 }
00105
00106 - (NSURL*) voicemailURL
00107 {
00108 if (voicemail == nil)
00109 return nil;
00110 NSString* voicemailUrlStr = [voicemail stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
00111 voicemailUrlStr = [NSString stringWithFormat:@"tel:+1-%@", voicemailUrlStr];
00112 voicemailUrlStr = [voicemailUrlStr stringByReplacingOccurrencesOfString:@" x " withString:@",,"];
00113
00114 return [NSURL URLWithString:voicemailUrlStr];
00115 }
00116
00117 - (NSURL*) conferenceURL
00118 {
00119 if (conference == nil)
00120 return nil;
00121
00122 NSString* conferenceUrlStr = [conference stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
00123 conferenceUrlStr = [NSString stringWithFormat:@"tel:+1-%@", conferenceUrlStr];
00124 conferenceUrlStr = [conferenceUrlStr stringByReplacingOccurrencesOfString:@" x " withString:@",,"];
00125
00126 return [NSURL URLWithString:conferenceUrlStr];
00127 }
00128
00129 - (NSURL*) rssURL
00130 {
00131 if (rss == nil)
00132 return nil;
00133
00134 return [NSURL URLWithString:rss];
00135 }
00136
00137 - (NSURL*) faxURL
00138 {
00139 if (fax == nil)
00140 return nil;
00141
00142 return [NSURL URLWithString:fax];
00143 }
00144
00145 - (NSURL*) hiddenUploadURL
00146 {
00147 if (hiddenUploadUrl == nil)
00148 return nil;
00149
00150 return [NSURL URLWithString:hiddenUploadUrl];
00151 }
00152
00153 - (NSURL*) dropcastURL
00154 {
00155
00156 if (rss == nil)
00157 return nil;
00158
00159
00160
00161 NSString* dropcast = [[rss stringByReplacingOccurrencesOfString:@"http://"
00162 withString:@"itpc://"]
00163 stringByReplacingOccurrencesOfString:@".rss"
00164 withString:@"/podcast.rss"];
00165
00166 return [NSURL URLWithString:dropcast];
00167 }
00168
00169 - (NSURL*) feedURLForFormat:(DropFeedFormat)format
00170 {
00171 switch (format)
00172 {
00173 case kDropFeedFormat_RSS:
00174 return [self rssURL];
00175
00176 case kDropFeedFormat_Dropcast:
00177 return [self dropcastURL];
00178
00179 default:
00180 break;
00181 }
00182
00183 return nil;
00184 }
00185
00186 - (NSURL*) dropURL
00187 {
00188 NSString* token = [self bestTokenIncludingPassword:YES];
00189
00190 return [DropIO URLForDropNamed:name withToken:token];
00191 }
00192
00193
00194
00195 - (NSURL*) URLForAssetsPage:(NSUInteger)assetsPage
00196 {
00197
00198
00199
00200
00201 if (![DropIO checkAPIKey])
00202 return nil;
00203
00204 NSString* token = [self bestTokenIncludingPassword:YES];
00205
00206 NSString* urlStr = [NSString stringWithFormat:kDropIOAssetsUrlFormat,
00207 name,
00208 kDropIOParamKey_APIKey, [DropIO APIKey],
00209 kDropIOParamKey_Version, kDropIOParamValue_Version_Latest,
00210 kDropIOParamKey_Format, kDropIOParamValue_Format_XML,
00211 kDropIOParamKey_Token, token,
00212 kDropIOParamKey_Page, assetsPage];
00213 return [NSURL URLWithString:urlStr];
00214 }
00215
00216 - (NSURL*) URLForAssetNamed:(NSString*)assetName
00217 {
00218
00219
00220
00221 if (![DropIO checkAPIKey])
00222 return nil;
00223
00224 NSString* token = [self bestTokenIncludingPassword:YES];
00225
00226 NSString* urlStr = [NSString stringWithFormat:kDropIOAssetUrlFormat,
00227 name,
00228 assetName,
00229 kDropIOParamKey_APIKey, [DropIO APIKey],
00230 kDropIOParamKey_Version, kDropIOParamValue_Version_Latest,
00231 kDropIOParamKey_Format, kDropIOParamValue_Format_XML,
00232 kDropIOParamKey_Token, token];
00233 return [NSURL URLWithString:urlStr];
00234 }
00235
00236 - (void) loadAssets
00237 {
00238
00239 [DropIO setLastError:nil];
00240
00241 if (![DropIO checkAPIKey])
00242 return;
00243
00244 NSInteger remainingAssets = [[self assetCount] integerValue];
00245 if (assets == nil)
00246 {
00247 assets = [[NSMutableArray alloc] initWithCapacity:remainingAssets];
00248 }
00249 else
00250 {
00251 remainingAssets -= [assets count];
00252 }
00253
00254 NSLog(@"Loading %d assets for drop named: %@", remainingAssets, [self name]);
00255
00256
00257
00258 NSError* error = nil;
00259 NSArray* props = [DropIO parseResponseFromURL:[self URLForAssetsPage:page++]
00260 fromNodeName:@"asset"
00261 toObject:@"NSMutableDictionary"
00262 parseError:&error];
00263 if ((props != nil) && ([props count] > 0))
00264 {
00265 for (NSMutableDictionary* propDict in props)
00266 {
00267
00268
00269 NSString* assetName = [propDict objectForKey:kDropIOParamKey_Name];
00270 DropIOAsset* asset = [self findAssetNamed:assetName loadIfMissing:NO];
00271
00272
00273 if (asset == nil)
00274 {
00275 asset = [DropIOAsset assetWithProperties:propDict];
00276 [asset setDrop:self];
00277 [asset setValue:[[self URLForAssetNamed:[asset name]] absoluteString] forKey:kDropIOParamKey_AssetAPIUrl];
00278 [assets addObject:asset];
00279 remainingAssets--;
00280 }
00281 }
00282 }
00283
00284
00285
00286
00287 [self sortAssets];
00288 }
00289
00290 - (void) unloadAssets
00291 {
00292 [assets release];
00293 assets = nil;
00294 self.assetCount = [NSNumber numberWithInteger:0];
00295 page = 1;
00296 }
00297
00298 - (void) reloadAssets
00299 {
00300 [self unloadAssets];
00301
00302
00303 DropIODrop* tempDrop = [DropIO findDropAtAPIURL:[self dropURL] error:nil];
00304 if (tempDrop != nil)
00305 self.assetCount = tempDrop.assetCount;
00306
00307 [self loadAssets];
00308 }
00309
00310
00311 - (BOOL) areAssetsLoaded
00312 {
00313 return (assets != nil);
00314 }
00315
00316 - (DropIOAsset*) findAssetNamed:(NSString*)assetName loadIfMissing:(BOOL)loadFlag
00317 {
00318 DropIOAsset* foundAsset = nil;
00319
00320 if ([self areAssetsLoaded])
00321 {
00322 for (DropIOAsset* thisAsset in assets)
00323 {
00324 if ([[thisAsset name] isEqualToString:assetName])
00325 {
00326 foundAsset = thisAsset;
00327 break;
00328 }
00329 }
00330 }
00331
00332 if ((foundAsset == nil) && loadFlag)
00333 {
00334 if ([DropIO checkAPIKey])
00335 {
00336 NSError* error = nil;
00337 NSURL* assetURL = [self URLForAssetNamed:assetName];
00338 NSArray* props = [DropIO parseResponseFromURL:assetURL
00339 fromNodeName:@"asset"
00340 toObject:@"NSMutableDictionary"
00341 parseError:&error];
00342 if (props != nil && [props count] > 0)
00343 {
00344 foundAsset = [DropIOAsset assetWithProperties:[props objectAtIndex:0]];
00345 [foundAsset setDrop:self];
00346 [foundAsset setValue:[assetURL absoluteString] forKey:kDropIOParamKey_AssetAPIUrl];
00347
00348 if (assets == nil)
00349 assets = [[NSMutableArray arrayWithObject:foundAsset] retain];
00350 else
00351 [assets addObject:foundAsset];
00352 }
00353 }
00354 }
00355
00356 return foundAsset;
00357 }
00358
00359 - (DropIOAsset*) assetAtIndex:(NSInteger)index
00360 {
00361 NSInteger totalAssetCount = [[self assetCount] integerValue];
00362 NSInteger loadedAssetCount = 0;
00363 if (assets != nil)
00364 loadedAssetCount = [assets count];
00365
00366 if (index < loadedAssetCount)
00367 return [assets objectAtIndex:index];
00368 else
00369 if (index < totalAssetCount)
00370 {
00371
00372 NSInteger newPage = (loadedAssetCount / kAssetsPerPage) + 1 ;
00373 if (newPage >= page)
00374 {
00375 page = newPage;
00376 [self loadAssets];
00377 loadedAssetCount = [assets count];
00378 if (index < loadedAssetCount)
00379 return [assets objectAtIndex:index];
00380 }
00381 else
00382 {
00383
00384 NSLog(@"API Error: only got %d assets when %d expected in page %d for drop \"%@\".", loadedAssetCount, totalAssetCount, page, name);
00385 }
00386 }
00387 return nil;
00388 }
00389
00390
00391
00392 NSComparisonResult sortAssetsByTitle(id firstAsset, id secondAsset, void* context)
00393 {
00394 return [[[firstAsset title] lowercaseString] compare:[[secondAsset title] lowercaseString]];
00395 }
00396
00397 NSComparisonResult sortAssetsByDate(id firstAsset, id secondAsset, void* context)
00398 {
00399 return [[firstAsset createdAt] compare:[secondAsset createdAt]];
00400 }
00401
00402 NSComparisonResult sortAssetsByType(id firstAsset, id secondAsset, void* context)
00403 {
00404 NSComparisonResult result = [[secondAsset type] compare:[firstAsset type]];
00405 if (result == NSOrderedSame)
00406 result = sortAssetsByTitle(firstAsset, secondAsset, context);
00407 return result;
00408 }
00409
00410 - (void) sortAssets
00411 {
00412 NSInteger (*compareFunc)(id, id, void *) = nil;
00413 switch (sortOrder)
00414 {
00415 case AssetSortOrder_Date: compareFunc = sortAssetsByDate; break;
00416 case AssetSortOrder_Type: compareFunc = sortAssetsByType; break;
00417 case AssetSortOrder_Title: compareFunc = sortAssetsByTitle;break;
00418 default: compareFunc = sortAssetsByType; break;
00419 }
00420 NSAutoreleasePool* sortPool = [[NSAutoreleasePool alloc] init];
00421 [assets sortUsingFunction:compareFunc context:nil];
00422 [sortPool release];
00423 }
00424
00425
00426 - (DropIOAsset*) assetOperation:(NSString*)opString atUrl:(NSString*)urlStr withParameters:(NSDictionary*)params
00427 {
00428
00429 [DropIO setLastError:nil];
00430
00431 if (![DropIO checkAPIKey])
00432 return nil;
00433
00434
00435 NSMutableURLRequest* dropReq = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlStr]];
00436 [dropReq setHTTPMethod:opString];
00437 [dropReq setHTTPPostBody:params];
00438
00439
00440 NSURLResponse* dropResp = nil;
00441 NSError* error = nil;
00442 NSData* dropXmlData = [NSURLConnection sendSynchronousRequest:dropReq
00443 returningResponse:&dropResp
00444 error:&error];
00445 if (error != nil)
00446 {
00447 NSLog(@"HTTP %@ Error: %@", opString, error);
00448 [DropIO setLastError:error];
00449 return nil;
00450 }
00451
00452
00453 NSArray* propArray = [DropIO parseResponse:dropXmlData
00454 fromNodeName:@"asset"
00455 toObject:@"NSMutableDictionary"
00456 parseError:&error];
00457 if (propArray == nil || [propArray count] == 0)
00458 return nil;
00459
00460 return [DropIOAsset assetWithProperties:[propArray objectAtIndex:0]];
00461 }
00462
00463
00464 - (DropIOAsset*) assetWithParameters:(NSDictionary*)params
00465 {
00466 DropIOAsset* asset = [self assetOperation:@"POST"
00467 atUrl:[NSString stringWithFormat:kDropIONewAssetUrlFormat, [self name]]
00468 withParameters:params];
00469 if (asset != nil)
00470 {
00471 [self addAsset:asset];
00472 }
00473 return asset;
00474 }
00475
00476 - (void) addAsset:(DropIOAsset*)asset
00477 {
00478 [asset setDrop:self];
00479 [asset setValue:[[self URLForAssetNamed:[asset name]] absoluteString] forKey:kDropIOParamKey_AssetAPIUrl];
00480 [assets addObject:asset];
00481
00482 NSInteger maxAssets = [[self assetCount] integerValue];
00483 self.assetCount = [NSNumber numberWithInteger:++maxAssets];
00484
00485 [self sortAssets];
00486 }
00487
00488 - (void) removeAsset:(DropIOAsset*)asset
00489 {
00490
00491 [asset delete];
00492 }
00493
00494 - (void) removeAssetAtIndex:(NSInteger)index
00495 {
00496 DropIOAsset* assetToRemove = (DropIOAsset*)[assets objectAtIndex:index];
00497 if (assetToRemove != nil)
00498 [self removeAsset:assetToRemove];
00499 }
00500
00501 - (NSInteger) countAssetsOfType:(NSString*)assetType
00502 {
00503 NSInteger count = 0;
00504 for (DropIOAsset* asset in assets)
00505 {
00506 if ([assetType isEqualToString:asset.type])
00507 count++;
00508 }
00509 return count;
00510 }
00511
00512 - (DropIONote*) noteWithTitle:(NSString*)noteTitle contents:(NSString*)text
00513 {
00514 if (![DropIO checkAPIKey])
00515 return nil;
00516
00517 NSString* token = [self bestTokenIncludingPassword:NO];
00518
00519 NSMutableDictionary* params = [NSMutableDictionary dictionaryWithCapacity:6];
00520 [params setObject:kDropIOParamValue_Format_XML forKey:kDropIOParamKey_Format];
00521 [params setObject:kDropIOParamValue_Version_Latest forKey:kDropIOParamKey_Version];
00522 [params setObject:[DropIO APIKey] forKey:kDropIOParamKey_APIKey];
00523 [params setObject:noteTitle forKey:kDropIOParamKey_Title];
00524 [params setObject:text forKey:kDropIOParamKey_Contents];
00525 [params setObject:token forKey:kDropIOParamKey_Token];
00526
00527 return (DropIONote*)[self assetWithParameters:params];
00528 }
00529
00530 - (DropIOLink*) linkWithTitle:(NSString*)linkTitle url:(NSURL*)linkURL description:(NSString*)linkDesc
00531 {
00532 if (![DropIO checkAPIKey])
00533 return nil;
00534
00535 NSString* token = [self bestTokenIncludingPassword:NO];
00536
00537 NSString* linkUrlStr = [linkURL absoluteString];
00538
00539 NSMutableDictionary* params = [NSMutableDictionary dictionaryWithCapacity:7];
00540 [params setObject:kDropIOParamValue_Format_XML forKey:kDropIOParamKey_Format];
00541 [params setObject:kDropIOParamValue_Version_Latest forKey:kDropIOParamKey_Version];
00542 [params setObject:[DropIO APIKey] forKey:kDropIOParamKey_APIKey];
00543 [params setObject:linkTitle forKey:kDropIOParamKey_Title];
00544 [params setObject:linkUrlStr forKey:kDropIOParamKey_Url];
00545 [params setObject:token forKey:kDropIOParamKey_Token];
00546 if (linkDesc != nil)
00547 [params setObject:linkDesc forKey:kDropIOParamKey_Description];
00548
00549 return (DropIOLink*)[self assetWithParameters:params];
00550 }
00551
00552 - (DropIOImage*) imageWithName:(NSString*)imgName UIImage:(UIImage*)uiImage
00553 {
00554
00555
00556 if (![DropIO checkAPIKey])
00557 return nil;
00558
00559 NSString* token = [self bestTokenIncludingPassword:NO];
00560
00561 NSMutableDictionary* params = [NSMutableDictionary dictionaryWithCapacity:5];
00562 [params setObject:kDropIOParamValue_Version_Latest forKey:kDropIOParamKey_Version];
00563 [params setObject:[DropIO APIKey] forKey:kDropIOParamKey_APIKey];
00564 [params setObject:token forKey:kDropIOParamKey_Token];
00565 [params setObject:[self name] forKey:kDropIOParamKey_DropName];
00566
00567
00568 [DropIO setLastError:nil];
00569
00570 NSLog(@"Uploading image named \"%@\" with params %@", imgName, params);
00571
00572
00573 NSString* boundary = @"DropplerFileUpload";
00574 NSString* contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
00575
00576 NSMutableURLRequest* uploadReq = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:kDropIOFileUploadUrl]];
00577 [uploadReq setHTTPMethod:@"POST"];
00578 [uploadReq setValue:contentType forHTTPHeaderField:@"Content-Type"];
00579
00580 NSData* pngData = UIImagePNGRepresentation(uiImage);
00581 NSMutableData *postBody = [NSMutableData dataWithCapacity:[pngData length] + 512];
00582
00583
00584 for (NSString* key in [params allKeys])
00585 {
00586 NSString* paramContent = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n",
00587 boundary,
00588 key,
00589 [params objectForKey:key]
00590 ];
00591 [postBody appendData:[paramContent dataUsingEncoding:NSUTF8StringEncoding]];
00592 }
00593
00594
00595 NSString* fileContentHeader = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"file\"; filename=\"%@.png\"\r\nContent-Type:image/png\r\n\r\n",
00596 boundary, [imgName stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
00597 [postBody appendData:[fileContentHeader dataUsingEncoding:NSUTF8StringEncoding]];
00598 [postBody appendData:pngData];
00599 [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
00600
00601 [uploadReq setHTTPBody:postBody];
00602
00603
00604 NSURLResponse* uploadResp = nil;
00605 NSError* error = nil;
00606 NSData* xmlData = [NSURLConnection sendSynchronousRequest:uploadReq
00607 returningResponse:&uploadResp
00608 error:&error];
00609 if (error != nil)
00610 {
00611 NSLog(@"HTTP Image File Upload Error: %@", error);
00612 [DropIO setLastError:error];
00613 return nil;
00614 }
00615
00616
00617
00618
00619
00620
00621 NSArray* propArray = [DropIO parseResponse:xmlData
00622 fromNodeName:@"asset"
00623 toObject:@"NSMutableDictionary"
00624 parseError:&error];
00625 if (propArray == nil || [propArray count] == 0)
00626 return nil;
00627
00628 DropIOAsset* asset = [DropIOAsset assetWithProperties:[propArray objectAtIndex:0]];
00629 if (asset != nil)
00630 {
00631 [self addAsset:asset];
00632 }
00633 return (DropIOImage*)asset;
00634 }
00635
00636 - (void) recordVoicemail
00637 {
00638
00639 [[UIApplication sharedApplication] openURL:[self voicemailURL]];
00640 }
00641
00642 - (void) conferenceCall
00643 {
00644
00645 [[UIApplication sharedApplication] openURL:[self conferenceURL]];
00646 }
00647
00648 - (NSString*)bestTokenIncludingPassword:(BOOL)includePassword
00649 {
00650 NSString* token = @"";
00651 if ((adminToken != nil) && (adminToken.length > 0))
00652 token = adminToken;
00653 else
00654 if ((guestToken != nil) && (guestToken.length > 0))
00655 token = guestToken;
00656 else
00657 if (includePassword && (password != nil) && (password.length > 0))
00658 token = password;
00659
00660 return token;
00661 }
00662
00663
00664
00665 - (BOOL) canAdd
00666 {
00667
00668
00669
00670 return (((adminToken != nil) && (adminToken.length > 0))
00671 || ((guestToken != nil) && (guestToken.length > 0)
00672 && (guestsCanAdd != nil) && [guestsCanAdd isEqualToString:@"true"]));
00673 }
00674
00675 - (BOOL) canEdit
00676 {
00677
00678 return [self canAdd];
00679 }
00680
00681 - (BOOL) canDelete
00682 {
00683
00684
00685
00686 return (((adminToken != nil) && (adminToken.length > 0))
00687 || ((guestToken != nil) && (guestToken.length > 0)
00688 && (guestsCanDelete != nil) && [guestsCanDelete isEqualToString:@"true"]));
00689 }
00690
00691 - (BOOL) canComment
00692 {
00693
00694
00695
00696 return (((adminToken != nil) && (adminToken.length > 0))
00697 || ((guestToken != nil) && (guestToken.length > 0)
00698 && (guestsCanComment != nil) && [guestsCanComment isEqualToString:@"true"]));
00699
00700 }
00701
00702 - (void) update
00703 {
00704 [DropIO setLastError:nil];
00705
00706
00707 NSString* token = [self bestTokenIncludingPassword:NO];
00708
00709 NSMutableDictionary* params = [NSMutableDictionary dictionaryWithCapacity:11];
00710
00711
00712 [params setObject:kDropIOParamValue_Format_XML forKey:kDropIOParamKey_Format];
00713 [params setObject:kDropIOParamValue_Version_Latest forKey:kDropIOParamKey_Version];
00714 [params setObject:[DropIO APIKey] forKey:kDropIOParamKey_APIKey];
00715 [params setObject:token forKey:kDropIOParamKey_Token];
00716
00717
00718 if (guestPassword != nil) [params setObject:guestPassword forKey:kDropIOParamKey_GuestPassword];
00719 if (adminPassword != nil) [params setObject:adminPassword forKey:kDropIOParamKey_AdminPassword];
00720 if (premiumCode != nil) [params setObject:premiumCode forKey:kDropIOParamKey_PremiumCode];
00721 if (expirationLength != nil) [params setObject:expirationLength forKey:kDropIOParamKey_ExpirationLength];
00722 if (guestsCanAdd != nil) [params setObject:guestsCanAdd forKey:kDropIOParamKey_GuestsCanAdd];
00723 if (guestsCanDelete != nil) [params setObject:guestsCanDelete forKey:kDropIOParamKey_GuestsCanDelete];
00724 if (guestsCanComment != nil) [params setObject:guestsCanComment forKey:kDropIOParamKey_GuestsCanComment];
00725
00726 [DropIO updateDropNamed:[self name] withParameters:params];
00727 }
00728
00729 - (void) delete
00730 {
00731 [DropIO setLastError:nil];
00732
00733
00734 NSString* token = [self bestTokenIncludingPassword:NO];
00735
00736 NSMutableDictionary* params = [NSMutableDictionary dictionaryWithCapacity:4];
00737
00738
00739 [params setObject:kDropIOParamValue_Format_XML forKey:kDropIOParamKey_Format];
00740 [params setObject:kDropIOParamValue_Version_Latest forKey:kDropIOParamKey_Version];
00741 [params setObject:[DropIO APIKey] forKey:kDropIOParamKey_APIKey];
00742 [params setObject:token forKey:kDropIOParamKey_Token];
00743
00744 [DropIO deleteDropNamed:[self name] withParameters:params];
00745
00746 if ([DropIO lastError] != nil)
00747 {
00748
00749 if ([[DropIO lastError] code] == kDropIOErrorCode_DropDeleted)
00750 {
00751 [DropIO setLastError:nil];
00752 }
00753 }
00754 }
00755
00756
00757
00758 - (void)setValue:(id)value
00759 forUndefinedKey:(NSString *)key
00760 {
00761
00762
00763 }
00764 @end