diff --git a/.gitmodules b/.gitmodules index 8df9069..e0394d2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "ClassDumpRuntime"] path = ClassDumpRuntime - url = git@github.com:leptos-null/ClassDumpRuntime.git + url = https://github.com/leptos-null/ClassDumpRuntime.git diff --git a/ClassDumpTweak.plist b/ClassDumpTweak.plist new file mode 100644 index 0000000..10dc654 --- /dev/null +++ b/ClassDumpTweak.plist @@ -0,0 +1 @@ +{ Filter = { Bundles = ( "com.apple.springboard" ); }; } diff --git a/Makefile b/Makefile index 2b07a38..98f44f7 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,15 @@ TARGET := iphone:clang:latest:8.0 +INSTALL_TARGET_PROCESSES := SpringBoard ARCHS := arm64 include $(THEOS)/makefiles/common.mk -TOOL_NAME = classdumpctl +TWEAK_NAME = ClassDumpTweak -classdumpctl_FILES = Sources/classdumpctl/main.m -classdumpctl_FILES += $(wildcard ClassDumpRuntime/Sources/ClassDumpRuntime/ClassDump/*/*.m) -classdumpctl_FILES += $(wildcard ClassDumpRuntime/Sources/ClassDumpRuntime/ClassDump/*/*/*.m) +ClassDumpTweak_FILES = Tweak.x +ClassDumpTweak_FILES += $(wildcard ClassDumpRuntime/Sources/ClassDumpRuntime/ClassDump/*/*.m) +ClassDumpTweak_FILES += $(wildcard ClassDumpRuntime/Sources/ClassDumpRuntime/ClassDump/*/*/*.m) -classdumpctl_CFLAGS = -fobjc-arc -I ClassDumpRuntime/Sources/ClassDumpRuntime/include -classdumpctl_CODESIGN_FLAGS = -Sentitlements.plist -classdumpctl_INSTALL_PATH = /usr/local/bin +ClassDumpTweak_CFLAGS = -fobjc-arc -I ClassDumpRuntime/Sources/ClassDumpRuntime/include -include $(THEOS_MAKE_PATH)/tool.mk +include $(THEOS_MAKE_PATH)/tweak.mk diff --git a/Tweak.x b/Tweak.x new file mode 100644 index 0000000..bfeb083 --- /dev/null +++ b/Tweak.x @@ -0,0 +1,37 @@ +#import +#import + +static CDClassModel *safelyGenerateModelForClass(Class const cls, IMP const blankIMP) { + Method const initializeMthd = class_getClassMethod(cls, @selector(initialize)); + method_setImplementation(initializeMthd, blankIMP); + + return [CDClassModel modelWithClass:cls]; +} + +static void dumpHeader(NSString *requestImage, NSString *outputDir) { + IMP const blankIMP = imp_implementationWithBlock(^{ }); // returns void, takes no parameters + + CDGenerationOptions *const generationOptions = [CDGenerationOptions new]; + generationOptions.stripSynthesized = YES; + + unsigned int classCount = 0; + const char **classNames = objc_copyClassNamesForImage(requestImage.fileSystemRepresentation, &classCount); + for (unsigned int classIndex = 0; classIndex < classCount; classIndex++) { + Class const cls = objc_getClass(classNames[classIndex]); + CDClassModel *model = safelyGenerateModelForClass(cls, blankIMP); + CDSemanticString *semanticString = [model semanticLinesWithOptions:generationOptions]; + NSString *lines = [semanticString string]; + NSString *headerName = [NSStringFromClass(cls) stringByAppendingPathExtension:@"h"]; + + NSString *headerPath = [outputDir stringByAppendingPathComponent:headerName]; + + NSError *writeError = nil; + if (![lines writeToFile:headerPath atomically:NO encoding:NSUTF8StringEncoding error:&writeError]) { + NSLog(@"writeToFileError: %@", writeError); + } + } +} + +%ctor { + dumpHeader(@"TODO", @"TODO"); +}