Browse Source

initial commit

tags/v0.1.0
Bob Rudis 8 years ago
parent
commit
763bd09520
  1. 44
      QuickLookR.xcodeproj/project.pbxproj
  2. 5
      QuickLookR.xcodeproj/xcuserdata/bob.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  3. 34
      QuickLookR.xcodeproj/xcuserdata/bob.xcuserdatad/xcschemes/QuickLookR.xcscheme
  4. 23
      QuickLookR/GeneratePreviewForURL.c
  5. 64
      QuickLookR/GeneratePreviewForURL.m
  6. 0
      QuickLookR/GenerateThumbnailForURL.m
  7. 37
      QuickLookR/Info.plist
  8. 148
      QuickLookR/rdata.h

44
QuickLookR.xcodeproj/project.pbxproj

@ -7,17 +7,33 @@
objects = {
/* Begin PBXBuildFile section */
C4291BEF1D552859001238D2 /* GenerateThumbnailForURL.c in Sources */ = {isa = PBXBuildFile; fileRef = C4291BEE1D552859001238D2 /* GenerateThumbnailForURL.c */; };
C4291BF11D552859001238D2 /* GeneratePreviewForURL.c in Sources */ = {isa = PBXBuildFile; fileRef = C4291BF01D552859001238D2 /* GeneratePreviewForURL.c */; };
C4291BEF1D552859001238D2 /* GenerateThumbnailForURL.m in Sources */ = {isa = PBXBuildFile; fileRef = C4291BEE1D552859001238D2 /* GenerateThumbnailForURL.m */; };
C4291BF11D552859001238D2 /* GeneratePreviewForURL.m in Sources */ = {isa = PBXBuildFile; fileRef = C4291BF01D552859001238D2 /* GeneratePreviewForURL.m */; };
C4291BF31D552859001238D2 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = C4291BF21D552859001238D2 /* main.c */; };
C4291BFB1D552C7A001238D2 /* QuickLookR.qlgenerator in CopyFiles */ = {isa = PBXBuildFile; fileRef = C4291BEB1D552859001238D2 /* QuickLookR.qlgenerator */; };
C4291C171D552E27001238D2 /* rdata.h in Headers */ = {isa = PBXBuildFile; fileRef = C4291C161D552E27001238D2 /* rdata.h */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
C4291BFA1D552C60001238D2 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "~/Library/QuickLook";
dstSubfolderSpec = 0;
files = (
C4291BFB1D552C7A001238D2 /* QuickLookR.qlgenerator in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
C4291BEB1D552859001238D2 /* QuickLookR.qlgenerator */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QuickLookR.qlgenerator; sourceTree = BUILT_PRODUCTS_DIR; };
C4291BEE1D552859001238D2 /* GenerateThumbnailForURL.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = GenerateThumbnailForURL.c; sourceTree = "<group>"; };
C4291BF01D552859001238D2 /* GeneratePreviewForURL.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = GeneratePreviewForURL.c; sourceTree = "<group>"; };
C4291BEE1D552859001238D2 /* GenerateThumbnailForURL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GenerateThumbnailForURL.m; sourceTree = "<group>"; };
C4291BF01D552859001238D2 /* GeneratePreviewForURL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GeneratePreviewForURL.m; sourceTree = "<group>"; };
C4291BF21D552859001238D2 /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; };
C4291BF41D552859001238D2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C4291C161D552E27001238D2 /* rdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rdata.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -50,10 +66,11 @@
C4291BED1D552859001238D2 /* QuickLookR */ = {
isa = PBXGroup;
children = (
C4291BEE1D552859001238D2 /* GenerateThumbnailForURL.c */,
C4291BF01D552859001238D2 /* GeneratePreviewForURL.c */,
C4291BEE1D552859001238D2 /* GenerateThumbnailForURL.m */,
C4291BF01D552859001238D2 /* GeneratePreviewForURL.m */,
C4291BF21D552859001238D2 /* main.c */,
C4291BF41D552859001238D2 /* Info.plist */,
C4291C161D552E27001238D2 /* rdata.h */,
);
path = QuickLookR;
sourceTree = "<group>";
@ -65,6 +82,7 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
C4291C171D552E27001238D2 /* rdata.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -79,6 +97,7 @@
C4291BE71D552859001238D2 /* Frameworks */,
C4291BE81D552859001238D2 /* Headers */,
C4291BE91D552859001238D2 /* Resources */,
C4291BFA1D552C60001238D2 /* CopyFiles */,
);
buildRules = (
);
@ -135,8 +154,8 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C4291BEF1D552859001238D2 /* GenerateThumbnailForURL.c in Sources */,
C4291BF11D552859001238D2 /* GeneratePreviewForURL.c in Sources */,
C4291BEF1D552859001238D2 /* GenerateThumbnailForURL.m in Sources */,
C4291BF11D552859001238D2 /* GeneratePreviewForURL.m in Sources */,
C4291BF31D552859001238D2 /* main.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -231,6 +250,10 @@
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = QuickLookR/Info.plist;
INSTALL_PATH = /Library/QuickLook;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/QuickLookR",
);
PRODUCT_BUNDLE_IDENTIFIER = is.rud.QuickLookR;
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = qlgenerator;
@ -243,6 +266,10 @@
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = QuickLookR/Info.plist;
INSTALL_PATH = /Library/QuickLook;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/QuickLookR",
);
PRODUCT_BUNDLE_IDENTIFIER = is.rud.QuickLookR;
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = qlgenerator;
@ -268,6 +295,7 @@
C4291BF91D552859001238D2 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};

5
QuickLookR.xcodeproj/xcuserdata/bob.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
type = "1"
version = "2.0">
</Bucket>

34
QuickLookR.xcodeproj/xcuserdata/bob.xcuserdatad/xcschemes/QuickLookR.xcscheme

@ -5,6 +5,22 @@
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C4291BEA1D552859001238D2"
BuildableName = "QuickLookR.qlgenerator"
BlueprintName = "QuickLookR"
ReferencedContainer = "container:QuickLookR.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
@ -26,6 +42,15 @@
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C4291BEA1D552859001238D2"
BuildableName = "QuickLookR.qlgenerator"
BlueprintName = "QuickLookR"
ReferencedContainer = "container:QuickLookR.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
@ -35,6 +60,15 @@
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C4291BEA1D552859001238D2"
BuildableName = "QuickLookR.qlgenerator"
BlueprintName = "QuickLookR"
ReferencedContainer = "container:QuickLookR.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">

23
QuickLookR/GeneratePreviewForURL.c

@ -1,23 +0,0 @@
#include <CoreFoundation/CoreFoundation.h>
#include <CoreServices/CoreServices.h>
#include <QuickLook/QuickLook.h>
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options);
void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview);
/* -----------------------------------------------------------------------------
Generate a preview for file
This function's job is to create preview for designated file
----------------------------------------------------------------------------- */
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options)
{
// To complete your generator please implement the function GeneratePreviewForURL in GeneratePreviewForURL.c
return noErr;
}
void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview)
{
// Implement only if supported
}

64
QuickLookR/GeneratePreviewForURL.m

@ -0,0 +1,64 @@
#include <CoreFoundation/CoreFoundation.h>
#include <CoreServices/CoreServices.h>
#include <QuickLook/QuickLook.h>
#import <Cocoa/Cocoa.h>
#include "rdata.h"
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options);
void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview);
/* -----------------------------------------------------------------------------
Generate a preview for file
This function's job is to create preview for designated file
----------------------------------------------------------------------------- */
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options)
{
@autoreleasepool {
NSURL *myURL = (__bridge NSURL *)url;
NSString *contents = [ myURL absoluteString ];
NSLog(@"generate preview for %@", contents);
//int pid = [[NSProcessInfo processInfo] processIdentifier];
NSPipe *pipe = [NSPipe pipe];
NSFileHandle *file = pipe.fileHandleForReading;
NSString *cmd = @"rdatainfo::get_info('" ;
cmd = [ cmd stringByAppendingString: contents ] ;
cmd = [ cmd stringByAppendingString: @"')" ] ;
NSTask *task = [[NSTask alloc] init];
task.launchPath = @"/usr/local/bin/Rscript";
task.arguments = @[@"-e", cmd];
task.standardOutput = pipe;
[task launch];
NSData *data = [file readDataToEndOfFile];
[file closeFile];
NSString *rOutput = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
if (false == QLPreviewRequestIsCancelled(preview)) {
QLPreviewRequestSetDataRepresentation(preview,
(__bridge CFDataRef)([rOutput dataUsingEncoding:NSUTF8StringEncoding]),
kUTTypePlainText,
NULL);
}
}
return noErr;
}
void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview)
{
// Implement only if supported
}

0
QuickLookR/GenerateThumbnailForURL.c → QuickLookR/GenerateThumbnailForURL.m

37
QuickLookR/Info.plist

@ -2,8 +2,28 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>UTImportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>is.rdata.quicklook</string>
<key>UTTypeDescription</key>
<string>R Data file</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>GGG</string>
<string>RData</string>
<string>rda</string>
</array>
</dict>
</dict>
</array>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
@ -11,10 +31,21 @@
<string>QLGenerator</string>
<key>LSItemContentTypes</key>
<array>
<string>SUPPORTED_UTI_TYPE</string>
<string>public.data</string>
</array>
</dict>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>GGG</string>
<string>RData</string>
<string>rda</string>
</array>
</dict>
</array>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>

148
QuickLookR/rdata.h

@ -0,0 +1,148 @@
#include <stdint.h>
#include <sys/types.h>
#include <stdio.h>
typedef enum rdata_type_e {
RDATA_TYPE_STRING,
RDATA_TYPE_INT32,
RDATA_TYPE_REAL,
RDATA_TYPE_LOGICAL,
RDATA_TYPE_TIMESTAMP
} rdata_type_t;
typedef enum rdata_error_e {
RDATA_OK,
RDATA_ERROR_OPEN = 1,
RDATA_ERROR_SEEK,
RDATA_ERROR_READ,
RDATA_ERROR_MALLOC,
RDATA_ERROR_USER_ABORT,
RDATA_ERROR_PARSE,
RDATA_ERROR_WRITE,
RDATA_ERROR_FACTOR
} rdata_error_t;
const char *rdata_error_message(rdata_error_t error_code);
typedef int (*rdata_column_handler)(const char *name, rdata_type_t type,
void *data, long count, void *ctx);
typedef int (*rdata_table_handler)(const char *name, void *ctx);
typedef int (*rdata_text_value_handler)(const char *value, int index, void *ctx);
typedef int (*rdata_column_name_handler)(const char *value, int index, void *ctx);
typedef void (*rdata_error_handler)(const char *error_message, void *ctx);
typedef int (*rdata_progress_handler)(double progress, void *ctx);
#if defined _WIN32 || defined __CYGWIN__
typedef _off64_t rdata_off_t;
#elif defined _AIX
typedef off64_t rdata_off_t;
#else
typedef off_t rdata_off_t;
#endif
typedef enum rdata_io_flags_e {
RDATA_SEEK_SET,
RDATA_SEEK_CUR,
RDATA_SEEK_END
} rdata_io_flags_t;
typedef int (*rdata_open_handler)(const char *path, void *io_ctx);
typedef int (*rdata_close_handler)(void *io_ctx);
typedef rdata_off_t (*rdata_seek_handler)(rdata_off_t offset, rdata_io_flags_t whence, void *io_ctx);
typedef ssize_t (*rdata_read_handler)(void *buf, size_t nbyte, void *io_ctx);
typedef rdata_error_t (*rdata_update_handler)(long file_size, rdata_progress_handler progress_handler, void *user_ctx, void *io_ctx);
typedef struct rdata_io_s {
rdata_open_handler open;
rdata_close_handler close;
rdata_seek_handler seek;
rdata_read_handler read;
rdata_update_handler update;
void *io_ctx;
int external_io;
} rdata_io_t;
typedef struct rdata_parser_s {
rdata_table_handler table_handler;
rdata_column_handler column_handler;
rdata_column_name_handler column_name_handler;
rdata_text_value_handler text_value_handler;
rdata_text_value_handler value_label_handler;
rdata_error_handler error_handler;
rdata_io_t *io;
} rdata_parser_t;
rdata_parser_t *rdata_parser_init();
void rdata_parser_free(rdata_parser_t *parser);
rdata_error_t rdata_set_table_handler(rdata_parser_t *parser, rdata_table_handler table_handler);
rdata_error_t rdata_set_column_handler(rdata_parser_t *parser, rdata_column_handler column_handler);
rdata_error_t rdata_set_column_name_handler(rdata_parser_t *parser, rdata_column_name_handler column_name_handler);
rdata_error_t rdata_set_text_value_handler(rdata_parser_t *parser, rdata_text_value_handler text_value_handler);
rdata_error_t rdata_set_value_label_handler(rdata_parser_t *parser, rdata_text_value_handler value_label_handler);
rdata_error_t rdata_set_error_handler(rdata_parser_t *parser, rdata_error_handler error_handler);
rdata_error_t rdata_set_open_handler(rdata_parser_t *parser, rdata_open_handler open_handler);
rdata_error_t rdata_set_close_handler(rdata_parser_t *parser, rdata_close_handler close_handler);
rdata_error_t rdata_set_seek_handler(rdata_parser_t *parser, rdata_seek_handler seek_handler);
rdata_error_t rdata_set_read_handler(rdata_parser_t *parser, rdata_read_handler read_handler);
rdata_error_t rdata_set_update_handler(rdata_parser_t *parser, rdata_update_handler update_handler);
rdata_error_t rdata_set_io_ctx(rdata_parser_t *parser, void *io_ctx);
/* rdata_parse works on RData and RDS. The table handler will be called once
* per data frame in RData files, and zero times on RDS files. */
rdata_error_t rdata_parse(rdata_parser_t *parser, const char *filename, void *user_ctx);
// Write API
typedef ssize_t (*rdata_data_writer)(const void *data, size_t len, void *ctx);
typedef struct rdata_column_s {
rdata_type_t type;
int index;
char name[256];
char label[1024];
int32_t factor_count;
const char **factor;
} rdata_column_t;
typedef struct rdata_writer_s {
rdata_data_writer data_writer;
size_t bytes_written;
rdata_error_handler error_handler;
void *user_ctx;
void *atom_table;
int bswap;
rdata_column_t **columns;
int32_t columns_count;
int32_t columns_capacity;
int32_t row_count;
} rdata_writer_t;
rdata_writer_t *rdata_writer_init(rdata_data_writer write_callback);
void rdata_writer_free(rdata_writer_t *writer);
rdata_column_t *rdata_add_column(rdata_writer_t *writer, const char *name, rdata_type_t type);
rdata_error_t rdata_column_set_label(rdata_column_t *column, const char *label);
rdata_error_t rdata_column_add_factor(rdata_column_t *column, const char *factor);
rdata_column_t *rdata_get_column(rdata_writer_t *writer, int32_t j);
rdata_error_t rdata_begin_file(rdata_writer_t *writer, void *ctx);
rdata_error_t rdata_begin_table(rdata_writer_t *writer, const char *variable_name, int32_t row_count);
rdata_error_t rdata_begin_column(rdata_writer_t *writer, rdata_column_t *column);
rdata_error_t rdata_append_real_value(rdata_writer_t *writer, double value);
rdata_error_t rdata_append_int32_value(rdata_writer_t *writer, int32_t value);
rdata_error_t rdata_append_timestamp_value(rdata_writer_t *writer, time_t value);
rdata_error_t rdata_append_logical_value(rdata_writer_t *writer, int value);
rdata_error_t rdata_append_string_value(rdata_writer_t *writer, const char *value);
rdata_error_t rdata_end_column(rdata_writer_t *writer, rdata_column_t *column);
rdata_error_t rdata_end_table(rdata_writer_t *writer, const char *datalabel);
rdata_error_t rdata_end_file(rdata_writer_t *writer);
Loading…
Cancel
Save