Skip to content

Commit

Permalink
Manages string encodings different from UTF-8
Browse files Browse the repository at this point in the history
  • Loading branch information
EddyLB committed Aug 2, 2019
1 parent 6f640dd commit b8f7cd2
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 24 deletions.
4 changes: 2 additions & 2 deletions piwigo/Albums/Album Data/AlbumService.m
Expand Up @@ -205,8 +205,8 @@ +(NSArray*)parseAlbumJSON:(NSArray*)json

albumData.nearestUpperCategory = albumData.upperCategories.count > 2 ? [[albumData.upperCategories objectAtIndex:albumData.upperCategories.count - 2] integerValue] : [[albumData.upperCategories objectAtIndex:0] integerValue];

albumData.name = [category objectForKey:@"name"];
albumData.comment = [category objectForKey:@"comment"];
albumData.name = [NetworkHandler UTF8EncodedStringFromString:[category objectForKey:@"name"]];
albumData.comment = [NetworkHandler UTF8EncodedStringFromString:[category objectForKey:@"comment"]];
albumData.globalRank = [[category objectForKey:@"global_rank"] floatValue];
albumData.numberOfImages = [[category objectForKey:@"nb_images"] integerValue];
albumData.totalNumberOfImages = [[category objectForKey:@"total_nb_images"] integerValue];
Expand Down
27 changes: 6 additions & 21 deletions piwigo/Albums/Images/ImageService.m
Expand Up @@ -538,30 +538,18 @@ +(PiwigoImageData*)parseBasicImageInfoJSON:(NSDictionary*)imageJson
categoryIds = nil;

// Object "name"
imageData.name = [imageJson objectForKey:@"name"];
if(!imageData.name || [imageData.name isKindOfClass:[NSNull class]])
{
imageData.name = @"";
}
imageData.name = [NetworkHandler UTF8EncodedStringFromString:[imageJson objectForKey:@"name"]];

// Object "comment"
imageData.imageDescription = [imageJson objectForKey:@"comment"];
if(!imageData.imageDescription || [imageData.imageDescription isKindOfClass:[NSNull class]])
{
imageData.imageDescription = @"";
}
imageData.imageDescription = [NetworkHandler UTF8EncodedStringFromString:[imageJson objectForKey:@"comment"]];

// Object "hit"
if (![[imageJson objectForKey:@"hit"] isKindOfClass:[NSNull class]]) {
imageData.visits = [[imageJson objectForKey:@"hit"] integerValue];
}

// Object "file"
imageData.fileName = [imageJson objectForKey:@"file"];
if(!imageData.fileName || [imageData.fileName isKindOfClass:[NSNull class]])
{
imageData.fileName = @"";
}
imageData.fileName = [NetworkHandler UTF8EncodedStringFromString:[imageJson objectForKey:@"file"]];
NSString *fileExt = [[imageData.fileName pathExtension] uppercaseString];
if([fileExt isEqualToString:@"MP4"] || [fileExt isEqualToString:@"M4V"] ||
[fileExt isEqualToString:@"OGG"] || [fileExt isEqualToString:@"OGV"] ||
Expand Down Expand Up @@ -773,11 +761,8 @@ +(PiwigoImageData*)parseBasicImageInfoJSON:(NSDictionary*)imageJson
//

// Object "author"
if([imageJson objectForKey:@"author"] &&
![[imageJson objectForKey:@"author"] isKindOfClass:[NSNull class]]) {
imageData.author = [imageJson objectForKey:@"author"];
}
else {
imageData.author = [NetworkHandler UTF8EncodedStringFromString:[imageJson objectForKey:@"author"]];
if(imageData.author.length == 0) {
imageData.author = @"NSNotFound";
}

Expand All @@ -798,7 +783,7 @@ +(PiwigoImageData*)parseBasicImageInfoJSON:(NSDictionary*)imageJson
{
PiwigoTagData *tagData = [PiwigoTagData new];
tagData.tagId = [[tag objectForKey:@"id"] integerValue];
tagData.tagName = [tag objectForKey:@"name"];
tagData.tagName = [NetworkHandler UTF8EncodedStringFromString:[tag objectForKey:@"name"]];
[imageTags addObject:tagData];
}
imageData.tags = imageTags;
Expand Down
47 changes: 46 additions & 1 deletion piwigo/Login/SessionService.m
Expand Up @@ -130,9 +130,54 @@ +(NSURLSessionTask*)getPiwigoStatusAtLogin:(BOOL)isLogginIn
[Model sharedInstance].pwgToken = [result objectForKey:@"pwg_token"];
[Model sharedInstance].language = [result objectForKey:@"language"];
[Model sharedInstance].version = [result objectForKey:@"version"];
NSString *charset = [[result objectForKey:@"charset"] uppercaseString];
if ([charset isEqualToString:@"UTF-8"]) {
[Model sharedInstance].stringEncoding = NSUTF8StringEncoding;
} else if ([charset isEqualToString:@"UTF-16"]) {
[Model sharedInstance].stringEncoding = NSUTF16StringEncoding;
} else if ([charset isEqualToString:@"ISO-8859-1"]) {
[Model sharedInstance].stringEncoding = NSWindowsCP1252StringEncoding;
} else if ([charset isEqualToString:@"US-ASCII"]) {
[Model sharedInstance].stringEncoding = NSASCIIStringEncoding;
} else if ([charset isEqualToString:@"X-EUC"]) {
[Model sharedInstance].stringEncoding = NSJapaneseEUCStringEncoding;
} else if ([charset isEqualToString:@"ISO-8859-3"]) {
[Model sharedInstance].stringEncoding = NSISOLatin1StringEncoding;
} else if ([charset isEqualToString:@"ISO-8859-3"]) {
[Model sharedInstance].stringEncoding = NSISOLatin1StringEncoding;
} else if ([charset isEqualToString:@"SHIFT-JIS"]) {
[Model sharedInstance].stringEncoding = NSShiftJISStringEncoding;
} else if ([charset isEqualToString:@"CP870"]) {
[Model sharedInstance].stringEncoding = NSISOLatin2StringEncoding;
} else if ([charset isEqualToString:@"UNICODE"]) {
[Model sharedInstance].stringEncoding = NSUnicodeStringEncoding;
} else if ([charset isEqualToString:@"WINDOWS-1251"]) {
[Model sharedInstance].stringEncoding = NSWindowsCP1251StringEncoding;
} else if ([charset isEqualToString:@"WINDOWS-1252"]) {
[Model sharedInstance].stringEncoding = NSWindowsCP1252StringEncoding;
} else if ([charset isEqualToString:@"WINDOWS-1253"]) {
[Model sharedInstance].stringEncoding = NSWindowsCP1253StringEncoding;
} else if ([charset isEqualToString:@"WINDOWS-1254"]) {
[Model sharedInstance].stringEncoding = NSWindowsCP1254StringEncoding;
} else if ([charset isEqualToString:@"WINDOWS-1250"]) {
[Model sharedInstance].stringEncoding = NSWindowsCP1250StringEncoding;
} else if ([charset isEqualToString:@"ISO-2022-JP"]) {
[Model sharedInstance].stringEncoding = NSISO2022JPStringEncoding;
} else if ([charset isEqualToString:@"ISO-2022-JP"]) {
[Model sharedInstance].stringEncoding = NSISO2022JPStringEncoding;
} else if ([charset isEqualToString:@"MACINTOSH"]) {
[Model sharedInstance].stringEncoding = NSMacOSRomanStringEncoding;
} else if ([charset isEqualToString:@"UNICODEFFFE"]) {
[Model sharedInstance].stringEncoding = NSUTF16BigEndianStringEncoding;
} else if ([charset isEqualToString:@"UTF-32"]) {
[Model sharedInstance].stringEncoding = NSUTF32StringEncoding;
} else {
// UTF-8 string encoding by default
[Model sharedInstance].stringEncoding = NSUTF8StringEncoding;
}

NSInteger uploadChunkSize = [[result objectForKey:@"upload_form_chunk_size"] integerValue];
// Upload chunk size is null if not provided by server
NSInteger uploadChunkSize = [[result objectForKey:@"upload_form_chunk_size"] integerValue];
if (uploadChunkSize != 0) {
[Model sharedInstance].uploadChunkSize = [[result objectForKey:@"upload_form_chunk_size"] integerValue];
}
Expand Down
1 change: 1 addition & 0 deletions piwigo/Network/NetworkHandler.h
Expand Up @@ -68,6 +68,7 @@ FOUNDATION_EXPORT NSInteger const loadingViewTag;

+(NSString*)encodedImageURL:(NSString*)originalURL;
+(NSString*)getURLWithPath:(NSString*)originalURL withURLParams:(NSDictionary*)params;
+(NSString*)UTF8EncodedStringFromString:(NSString *)string;

+(NSURLSessionTask*)post:(NSString*)path
URLParameters:(NSDictionary*)urlParams
Expand Down
12 changes: 12 additions & 0 deletions piwigo/Network/NetworkHandler.m
Expand Up @@ -469,6 +469,18 @@ +(NSString*)getURLWithPath:(NSString*)originalURL withURLParams:(NSDictionary*)p
return url;
}

+(NSString*)UTF8EncodedStringFromString:(NSString *)string
{
// Return empty string is nothing provided
if(!string || [string isKindOfClass:[NSNull class]]) {
return @"";
}

// Convert to UTF-8 string encoding
NSData *strData = [string dataUsingEncoding:[Model sharedInstance].stringEncoding allowLossyConversion:YES];
return [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];
}

// path: format={param1}
// URLParams: {@"param1" : @"hello" }
+(NSURLSessionTask*)post:(NSString*)path
Expand Down
1 change: 1 addition & 0 deletions piwigo/Supporting Files/Model.h
Expand Up @@ -53,6 +53,7 @@ typedef enum {
@property (nonatomic, strong) NSString *serverName; // returns the wrong protocol (http: or https:)
@property (nonatomic, strong) NSString *pwgToken;
@property (nonatomic, strong) NSString *language;
@property (nonatomic, assign) NSUInteger stringEncoding; // Character encoding used by the Piwigo server
@property (nonatomic, strong) NSString *version;
@property (nonatomic, strong) NSString *username;
@property (nonatomic, strong) NSString *HttpUsername;
Expand Down
8 changes: 8 additions & 0 deletions piwigo/Supporting Files/Model.m
Expand Up @@ -47,6 +47,7 @@ + (Model*)sharedInstance

instance.serverProtocol = @"https://";
instance.serverName = @"";
instance.stringEncoding = NSUTF8StringEncoding; // UTF-8 by default
instance.username = @"";
instance.HttpUsername = @"";
instance.hasAdminRights = NO;
Expand Down Expand Up @@ -300,6 +301,7 @@ - (void)readFromDisk
self.shareMetadataTypeSaveToCameraRoll = modelData.shareMetadataTypeSaveToCameraRoll;
self.shareMetadataTypeOther = modelData.shareMetadataTypeOther;
self.uploadChunkSize = modelData.uploadChunkSize;
self.stringEncoding = modelData.stringEncoding;
}
}

Expand Down Expand Up @@ -369,6 +371,7 @@ - (void)encodeWithCoder:(NSCoder *)encoder {
[saveObject addObject:[NSNumber numberWithBool:self.shareMetadataTypeOther]];
// Added in v2.4.1…
[saveObject addObject:[NSNumber numberWithInteger:self.uploadChunkSize]];
[saveObject addObject:[NSNumber numberWithUnsignedInteger:self.stringEncoding]];

[encoder encodeObject:saveObject forKey:@"Model"];
}
Expand Down Expand Up @@ -612,6 +615,11 @@ - (id)initWithCoder:(NSCoder *)decoder {
self.uploadChunkSize = [[savedData objectAtIndex:45] integerValue];
} else {
self.uploadChunkSize = 500;
}
if(savedData.count > 46) {
self.stringEncoding = [[savedData objectAtIndex:46] unsignedIntegerValue];
} else {
self.stringEncoding = NSUTF8StringEncoding;
}
return self;
}
Expand Down

0 comments on commit b8f7cd2

Please sign in to comment.