mirror of https://github.com/perkeep/perkeep.git
164 lines
3.5 KiB
Objective-C
164 lines
3.5 KiB
Objective-C
//
|
|
// LACamliFile.m
|
|
//
|
|
// Created by Nick O'Neill on 1/13/13.
|
|
// Copyright (c) 2013 The Camlistore Authors. All rights reserved.
|
|
//
|
|
|
|
#import "LACamliFile.h"
|
|
#import "LACamliUtil.h"
|
|
#import <AssetsLibrary/AssetsLibrary.h>
|
|
|
|
@implementation LACamliFile
|
|
|
|
@synthesize allBlobs = _allBlobs;
|
|
@synthesize allBlobRefs = _allBlobRefs;
|
|
|
|
static NSUInteger const ChunkSize = 64000;
|
|
|
|
- (id)initWithAsset:(ALAsset*)asset
|
|
{
|
|
if (self = [super init]) {
|
|
_asset = asset;
|
|
|
|
self.blobRef = [LACamliUtil blobRef:[self fileData]];
|
|
|
|
float chunkCount = (float)[self size] / (float)ChunkSize;
|
|
|
|
_uploadMarks = [NSMutableArray array];
|
|
for (int i = 0; i < chunkCount; i++) {
|
|
[_uploadMarks addObject:@YES];
|
|
}
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (id)initWithPath:(NSString*)path
|
|
{
|
|
// TODO, can init from random path to file
|
|
|
|
if (self = [super init]) {
|
|
// [self setBlobRef:[LACamliClient blobRef:data]];
|
|
// [self setFileData:data];
|
|
|
|
// set time, size and other properties here?
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
#pragma mark - convenience
|
|
|
|
- (NSData*)fileData
|
|
{
|
|
ALAssetRepresentation* rep = [_asset defaultRepresentation];
|
|
Byte* buf = (Byte*)malloc((int)rep.size);
|
|
NSUInteger bufferLength = [rep getBytes:buf
|
|
fromOffset:0.0
|
|
length:(int)rep.size
|
|
error:nil];
|
|
|
|
return [NSData dataWithBytesNoCopy:buf
|
|
length:bufferLength
|
|
freeWhenDone:YES];
|
|
}
|
|
|
|
- (long long)size
|
|
{
|
|
return [_asset defaultRepresentation].size;
|
|
}
|
|
|
|
- (NSString *)name
|
|
{
|
|
return [_asset defaultRepresentation].filename;
|
|
}
|
|
|
|
- (NSDate*)creation
|
|
{
|
|
return [_asset valueForProperty:ALAssetPropertyDate];
|
|
}
|
|
|
|
- (UIImage*)thumbnail
|
|
{
|
|
return [UIImage imageWithCGImage:[_asset thumbnail]];
|
|
}
|
|
|
|
- (NSArray*)blobsToUpload
|
|
{
|
|
NSMutableArray* blobs = [NSMutableArray array];
|
|
|
|
int i = 0;
|
|
for (NSData* blob in _allBlobs) {
|
|
if ([[_uploadMarks objectAtIndex:i] boolValue]) {
|
|
[blobs addObject:blob];
|
|
}
|
|
i++;
|
|
}
|
|
|
|
return blobs;
|
|
}
|
|
|
|
#pragma mark - delayed creation methods
|
|
|
|
- (void)setAllBlobs:(NSMutableArray*)allBlobs
|
|
{
|
|
_allBlobs = allBlobs;
|
|
}
|
|
|
|
- (NSMutableArray*)allBlobs
|
|
{
|
|
if (!_allBlobs) {
|
|
[self makeBlobsAndRefs];
|
|
}
|
|
|
|
// not a huge fan of how this doesn't obviously assign to _allBlobs
|
|
return _allBlobs;
|
|
}
|
|
|
|
- (void)setAllBlobRefs:(NSArray*)allBlobRefs
|
|
{
|
|
_allBlobRefs = allBlobRefs;
|
|
}
|
|
|
|
- (NSArray*)allBlobRefs
|
|
{
|
|
if (!_allBlobRefs) {
|
|
[self makeBlobsAndRefs];
|
|
}
|
|
|
|
// not a huge fan of how this doesn't obviously assign to _allBlobRefs
|
|
return _allBlobRefs;
|
|
}
|
|
|
|
- (void)makeBlobsAndRefs
|
|
{
|
|
LALog(@"making blob refs");
|
|
|
|
NSMutableArray* chunks = [NSMutableArray array];
|
|
NSMutableArray* blobRefs = [NSMutableArray array];
|
|
|
|
float chunkCount = (float)[self size] / (float)ChunkSize;
|
|
|
|
NSData* fileData = [self fileData];
|
|
|
|
for (int i = 0; i < chunkCount; i++) {
|
|
|
|
// ChunkSize size chunks, unless the last one is less
|
|
NSData* chunkData;
|
|
if (ChunkSize * (i + 1) <= [self size]) {
|
|
chunkData = [fileData subdataWithRange:NSMakeRange(ChunkSize * i, ChunkSize)];
|
|
} else {
|
|
chunkData = [fileData subdataWithRange:NSMakeRange(ChunkSize * i, (int)[self size] - (ChunkSize * i))];
|
|
}
|
|
|
|
[chunks addObject:chunkData];
|
|
[blobRefs addObject:[LACamliUtil blobRef:chunkData]];
|
|
}
|
|
|
|
_allBlobs = chunks;
|
|
_allBlobRefs = blobRefs;
|
|
}
|
|
|
|
@end
|