1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-04 10:27:46 +01:00
Telegram/thirdparty/GDFileManager/GDGoogleDriveFileServiceSession.m
2015-10-01 19:19:52 +03:00

193 lines
8.7 KiB
Objective-C
Executable File

//
// GDGoogleDriveFileServiceSession.m
// GDFileManagerExample
//
// Created by Graham Dennis on 29/06/13.
// Copyright (c) 2013 Graham Dennis. All rights reserved.
//
#import "GDGoogleDriveFileServiceSession.h"
#import "GDGoogleDriveFileService.h"
#import "GDGoogleDriveURLMetadata.h"
#import "GDURLMetadata_Private.h"
#import "GDDispatchUtilities.h"
@implementation GDGoogleDriveFileServiceSession
@dynamic client;
- (id)initWithFileService:(GDFileService *)fileService client:(GDHTTPClient *)client
{
if (([super initWithFileService:fileService client:client])) {
[(GDGoogleDriveClient *)client setDefaultMetadataFields:@"id,etag,title,mimeType,md5Checksum,fileSize,headRevisionId,editable,parents,thumbnailLink,imageMediaMetadata,downloadUrl,exportLinks"];
}
return self;
}
- (void)validateAccessWithSuccess:(void (^)())success failure:(void (^)(NSError *error))failure
{
[self.client getAccountInfoWithSuccess:^(__unused GDGoogleDriveAccountInfo *accountInfo) {
if (success) {
success();
}
} failure:failure];
}
- (void)getMetadataForURL:(NSURL *)url metadataCache:(id <GDMetadataCache>)metadataCache cachedMetadata:(id<GDURLMetadata>)cachedMetadata
success:(void (^)(GDURLMetadata *metadata))success failure:(void (^)(NSError *error))failure
{
NSString *fileID = [self fileIDFromURL:url];
NSURL *canonicalURL = [self canonicalURLForURL:url];
if (!cachedMetadata)
cachedMetadata = [metadataCache metadataForURL:canonicalURL];
[self.client getMetadataForFileID:fileID etag:[(GDGoogleDriveURLMetadata *)cachedMetadata etag]
success:^(GDGoogleDriveMetadata *metadata) {
GDURLMetadata *urlMetadata = nil;
if (!metadata) {
urlMetadata = [[GDURLMetadata alloc] initWithURLMetadata:cachedMetadata clientURL:url canonicalURL:canonicalURL];
} else {
urlMetadata = [self clientMetadataForGoogleDriveMetadata:metadata clientURL:url];
}
[metadataCache setMetadata:urlMetadata forURL:urlMetadata.canonicalURL];
if (success) success(urlMetadata);
} failure:failure];
}
- (void)getContentsOfDirectoryAtURL:(NSURL *)url metadataCache:(id<GDMetadataCache>)metadataCache
cachedMetadata:(id<GDURLMetadata>)__unused cachedMetadata cachedContents:(NSArray *)__unused contents
success:(void (^)(NSArray *))success failure:(void (^)(NSError *))failure
{
NSString *fileID = [self fileIDFromURL:url];
[self.client getContentsOfFileID:fileID
success:^(NSArray *contents, __unused NSString *etag) {
return [self addMetadata:contents parentURL:url toCache:metadataCache
continuation:^(__unused GDURLMetadata *metadata, NSArray *metadataContents) {
if (success) success(metadataContents);
}];
} failure:failure];
}
- (void)deleteURL:(NSURL *)url success:(void (^)())success failure:(void (^)(NSError *))failure
{
NSString *fileID = [self fileIDFromURL:url];
[self.client trashFileID:fileID
success:^(__unused GDGoogleDriveMetadata *metadata) {
if (success) success();
} failure:failure];
}
- (void)copyFileAtURL:(NSURL *)sourceURL toParentURL:(NSURL *)destinationParentURL name:(NSString *)name success:(void (^)(GDURLMetadata *))success failure:(void (^)(NSError *))failure
{
NSString *sourceFileID = [self fileIDFromURL:sourceURL];
NSString *destinationFolderID = [self fileIDFromURL:destinationParentURL];
[self.client copyFileID:sourceFileID toParentIDs:@[destinationFolderID] name:name success:^(GDGoogleDriveMetadata *metadata) {
if (success) success([self clientMetadataForGoogleDriveMetadata:metadata parentURL:destinationParentURL]);
} failure:failure];
}
- (void)moveFileAtURL:(NSURL *)sourceURL toParentURL:(NSURL *)destinationParentURL name:(NSString *)name success:(void (^)(GDURLMetadata *))success failure:(void (^)(NSError *))failure
{
NSString *sourceFileID = [self fileIDFromURL:sourceURL];
NSString *destinationFolderID = [self fileIDFromURL:destinationParentURL];
[self.client moveFileID:sourceFileID toParentIDs:@[destinationFolderID] name:name success:^(GDGoogleDriveMetadata *metadata) {
if (success) success([self clientMetadataForGoogleDriveMetadata:metadata parentURL:destinationParentURL]);
} failure:failure];
}
- (NSOperation *)downloadURL:(NSURL *)url intoFileURL:(NSURL *)localURL fileVersion:(NSString *)__unused fileVersionIdentifier
progress:(void (^)(NSInteger, NSInteger, NSInteger))progress
success:(void (^)(NSURL *localURL, GDURLMetadata *metadata))success failure:(void (^)(NSError *))failure
{
NSString *fileID = [self fileIDFromURL:url];
return [self.client downloadFileID:fileID intoPath:[localURL path]
progress:progress
success:^(NSString *localPath, GDGoogleDriveMetadata *metadata) {
GDURLMetadata *urlMetadata = [self clientMetadataForGoogleDriveMetadata:metadata clientURL:url];
if (success) success([NSURL fileURLWithPath:localPath], urlMetadata);
} failure:failure];
}
#pragma mark - URL / path support
- (NSString *)fileIDFromURL:(NSURL *)canonicalURL
{
NSString *lastPathComponent = [canonicalURL lastPathComponent];
if ([lastPathComponent isEqualToString:@"/"])
return @"root";
return lastPathComponent;
}
- (NSURL *)clientURLByAppendingFileID:(NSString *)fileID toClientURL:(NSURL *)parentURL
{
return [parentURL URLByAppendingPathComponent:fileID];
}
- (NSURL *)_canonicalURLForURL:(NSURL *)url
{
if ([[url lastPathComponent] isEqualToString:@"/"])
return self.baseURL;
return [self.baseURL URLByAppendingPathComponent:[url lastPathComponent]];
}
- (GDURLMetadata *)clientMetadataForGoogleDriveMetadata:(GDGoogleDriveMetadata *)metadata parentURL:(NSURL *)parentURL
{
return [self clientMetadataForGoogleDriveMetadata:metadata parentURL:parentURL clientURL:nil];
}
- (GDURLMetadata *)clientMetadataForGoogleDriveMetadata:(GDGoogleDriveMetadata *)metadata clientURL:(NSURL *)clientURL
{
return [self clientMetadataForGoogleDriveMetadata:metadata parentURL:nil clientURL:clientURL];
}
- (GDURLMetadata *)clientMetadataForGoogleDriveMetadata:(GDGoogleDriveMetadata *)metadata parentURL:(NSURL *)parentURL clientURL:(NSURL *)clientURL
{
if (!parentURL && !clientURL) return nil;
if (!clientURL)
clientURL = [self clientURLByAppendingFileID:metadata.identifier toClientURL:parentURL];
return [[GDURLMetadata alloc] initWithURLMetadata:[[GDGoogleDriveURLMetadata alloc] initWithGoogleDriveMetadata:metadata]
clientURL:clientURL
canonicalURL:[self canonicalURLForURL:clientURL]];
}
- (GDURLMetadata *)clientMetadataWithCachedMetadata:(id<GDURLMetadata>)urlMetadata parentURL:(NSURL *)url
{
NSURL *clientURL = [self clientURLByAppendingFileID:[(GDGoogleDriveURLMetadata *)urlMetadata fileID] toClientURL:url];
return [[GDURLMetadata alloc] initWithURLMetadata:urlMetadata
clientURL:clientURL
canonicalURL:[self canonicalURLForURL:clientURL]];
}
#pragma mark - Support
- (void)addMetadata:(NSArray *)metadataArray parentURL:(NSURL *)parentURL toCache:(id<GDMetadataCache>)cache continuation:(void (^)(GDURLMetadata *, NSArray *))continuation
{
NSMutableArray *childMetadataArray = [NSMutableArray arrayWithCapacity:[metadataArray count]];
NSMutableDictionary *keyedChildMetadata = [NSMutableDictionary dictionaryWithCapacity:[metadataArray count]];
for (GDGoogleDriveMetadata *metadata in metadataArray) {
GDURLMetadata *urlMetadata = [self clientMetadataForGoogleDriveMetadata:metadata parentURL:parentURL];
if (urlMetadata) {
NSURL *canonicalURL = urlMetadata.canonicalURL;
[childMetadataArray addObject:urlMetadata];
keyedChildMetadata[canonicalURL] = urlMetadata;
}
}
[cache setDirectoryContents:keyedChildMetadata forURL:[self canonicalURLForURL:parentURL]];
return continuation(nil, [childMetadataArray copy]);
}
@end