diff --git a/LauncherOSX/LOXPackage.mm b/LauncherOSX/LOXPackage.mm index 1888a49..2f16263 100644 --- a/LauncherOSX/LOXPackage.mm +++ b/LauncherOSX/LOXPackage.mm @@ -129,6 +129,13 @@ - (RDPackageResource *)resourceAtRelativePath:(NSString *)relativePath { initWithByteStream:byteStream.release() relativePath:relativePath pack: self]; + + ePub3::ConstManifestItemPtr item = _sdkPackage->ManifestItemAtRelativePath(s); + + if (item) { + const ePub3::ManifestItem::MimeType &mediaType = item->MediaType(); + resource.mimeType = [NSString stringWithUTF8String:mediaType.c_str()]; + } return resource; } diff --git a/LauncherOSX/PackageResourceServer.h b/LauncherOSX/PackageResourceServer.h index 94969f0..e2fdee8 100644 --- a/LauncherOSX/PackageResourceServer.h +++ b/LauncherOSX/PackageResourceServer.h @@ -13,6 +13,8 @@ @class RDPackageResource; #import "HTTPConnection.h" +#import "HTTPResponse.h" +#import "HTTPDataResponse.h" @interface PackageResourceConnection : HTTPConnection @@ -20,6 +22,12 @@ @end +@interface PackageDataResponse : HTTPDataResponse + +@property (nonatomic, copy) NSString *contentType; + +@end + @interface PackageResourceResponse : NSObject { @private UInt64 m_offset; @private RDPackageResource *m_resource; diff --git a/LauncherOSX/PackageResourceServer.mm b/LauncherOSX/PackageResourceServer.mm index 29ab378..eab7ae4 100644 --- a/LauncherOSX/PackageResourceServer.mm +++ b/LauncherOSX/PackageResourceServer.mm @@ -44,6 +44,8 @@ @implementation PackageResourceConnection return nil; } + NSObject *response = nil; + // Synchronize using a process-level lock to guard against multiple threads accessing a // resource byte stream, which may lead to instability. @@ -61,15 +63,20 @@ @implementation PackageResourceConnection NSData *data = resource.data; if (data != nil) { - return [[HTTPDataResponse alloc] initWithData:data]; + PackageDataResponse *dataResponse = [[PackageDataResponse alloc] initWithData:data]; + if (resource.mimeType) { + dataResponse.contentType = resource.mimeType; + } + response = dataResponse; } } else { - return [[PackageResourceResponse alloc] initWithResource:resource]; + PackageResourceResponse *resourceResponse = [[PackageResourceResponse alloc] initWithResource:resource]; + response = resourceResponse; } } - return nil; + return response; } @@ -78,6 +85,19 @@ + (void)setPackage:(LOXPackage *)package { } +@end + +@implementation PackageDataResponse + +- (NSDictionary *)httpHeaders { + if (self.contentType) { + return @{@"Content-Type": self.contentType}; + } + else { + return @{}; + } +} + @end @implementation PackageResourceResponse @@ -135,6 +155,17 @@ - (void)setOffset:(UInt64)offset { } +- (NSDictionary *)httpHeaders { + NSString *contentType = self->m_resource.mimeType; + if (contentType) { + return @{@"Content-Type": contentType}; + } + else { + return @{}; + } +} + + @end @interface PackageResourceServer() diff --git a/LauncherOSX/RDPackageResource.h b/LauncherOSX/RDPackageResource.h index 22f3dae..1d58431 100644 --- a/LauncherOSX/RDPackageResource.h +++ b/LauncherOSX/RDPackageResource.h @@ -30,6 +30,8 @@ @property (nonatomic, readonly) NSString *relativePath; +@property (nonatomic, copy) NSString *mimeType; + - (NSData *)readDataOfLength:(NSUInteger)length; - (void)setOffset:(UInt64)offset;