├── .github └── workflows │ └── ci-mac.yaml ├── .gitignore ├── .gitmodules ├── .travis.yml ├── Assets ├── Icon.psd └── Screen-1.png ├── CODE_OF_CONDUCT.md ├── ISOBMFF-Explorer.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IBMFF.xcscmblueprint │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ ├── ISOBMFF Explorer - AppStore Debug.xcscheme │ ├── ISOBMFF Explorer - AppStore Release.xcscheme │ ├── ISOBMFF Explorer - Debug.xcscheme │ └── ISOBMFF Explorer - Release.xcscheme ├── ISOBMFF-Explorer ├── Classes │ ├── AboutWindowController.swift │ ├── AppInstaller.h │ ├── AppInstaller.m │ ├── ApplicationDelegate.swift │ ├── BoxItem.h │ ├── BoxItem.mm │ ├── Bridging-Header.h │ ├── DictionaryIsEmptyValueTransformer.swift │ ├── DictionaryIsNotEmptyValueTransformer.swift │ ├── FileWindowController.swift │ ├── StringIsEmptyValueTransformer.swift │ └── StringIsNotEmptyValueTransformer.swift ├── ISOBMFF-Explorer.entitlements ├── Info.plist └── Interface │ ├── Base.lproj │ ├── ISOBMFF_Explorer.AboutWindowController.xib │ ├── ISOBMFF_Explorer.FileWindowController.xib │ └── MainMenu.xib │ └── Images │ └── Icon.icns ├── Installer ├── Background.png └── DMG.dmgCanvas │ ├── Disk Image │ └── QuickLook │ └── Preview.jpg ├── LICENSE └── README.md /.github/workflows/ci-mac.yaml: -------------------------------------------------------------------------------- 1 | name: ci-mac 2 | on: [push] 3 | jobs: 4 | ci: 5 | runs-on: macos-latest 6 | strategy: 7 | matrix: 8 | run-config: 9 | - { scheme: 'ISOBMFF Explorer - Debug', configuration: 'Debug', project: 'ISOBMFF-Explorer.xcodeproj', build: 1, analyze: 1, test: 0, info: 1, destination: 'platform=macOS' } 10 | - { scheme: 'ISOBMFF Explorer - Release', configuration: 'Release', project: 'ISOBMFF-Explorer.xcodeproj', build: 1, analyze: 1, test: 0, info: 1, destination: 'platform=macOS' } 11 | - { scheme: 'ISOBMFF Explorer - AppStore Debug', configuration: 'Debug', project: 'ISOBMFF-Explorer.xcodeproj', build: 1, analyze: 1, test: 0, info: 1, destination: 'platform=macOS' } 12 | - { scheme: 'ISOBMFF Explorer - AppStore Release', configuration: 'Release', project: 'ISOBMFF-Explorer.xcodeproj', build: 1, analyze: 1, test: 0, info: 1, destination: 'platform=macOS' } 13 | steps: 14 | 15 | - uses: actions/checkout@v1 16 | with: 17 | submodules: 'recursive' 18 | 19 | - uses: macmade/action-xcodebuild@v1.0.0 20 | 21 | - uses: macmade/action-slack@v1.0.0 22 | if: ${{ always() }} 23 | env: 24 | SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} 25 | with: 26 | channel: '#ci' 27 | status: ${{ job.status }} 28 | title: ${{ matrix.run-config[ 'scheme' ] }} - ${{ matrix.run-config[ 'configuration' ] }} 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Mac Finder 2 | .DS_Store 3 | .Trashes 4 | Icon? 5 | 6 | # Thumbnails 7 | ._* 8 | 9 | # Files that might appear on external disk 10 | .Spotlight-V100 11 | .Trashes 12 | 13 | # Windows 14 | Thumbs.db 15 | 16 | # Xcode 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | *.xccheckout 22 | *.profraw 23 | !default.pbxuser 24 | !default.mode1v3 25 | !default.mode2v3 26 | !default.perspectivev3 27 | xcuserdata 28 | 29 | # VisualStudio 30 | *.suo 31 | *.sdf 32 | *.VC.db 33 | *.VC.opendb 34 | *.opensdf 35 | *.vcxproj.user 36 | *.csproj.user 37 | ipch 38 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "Submodules/PIMPL"] 2 | path = Submodules/PIMPL 3 | url = https://github.com/macmade/PIMPL.git 4 | [submodule "Submodules/gmock-xcode"] 5 | path = Submodules/gmock-xcode 6 | url = https://github.com/macmade/gmock-xcode 7 | [submodule "Submodules/makelib"] 8 | path = Submodules/makelib 9 | url = https://github.com/macmade/makelib.git 10 | [submodule "Submodules/ISOBMFF"] 11 | path = Submodules/ISOBMFF 12 | url = https://github.com/DigiDNA/ISOBMFF.git 13 | [submodule "Submodules/GitHubUpdates"] 14 | path = Submodules/GitHubUpdates 15 | url = https://github.com/macmade/GitHubUpdates.git 16 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode9.1 3 | script: 4 | - xcodebuild build -project ISOBMFF-Explorer.xcodeproj -scheme "ISOBMFF Explorer - Release" 5 | -------------------------------------------------------------------------------- /Assets/Icon.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DigiDNA/ISOBMFF-Explorer/c5b7de11785c82a6547da93fdd37a13fac12fea7/Assets/Icon.psd -------------------------------------------------------------------------------- /Assets/Screen-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DigiDNA/ISOBMFF-Explorer/c5b7de11785c82a6547da93fdd37a13fac12fea7/Assets/Screen-1.png -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | digidna.net. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0510C04E1F670716006920B4 /* StringIsNotEmptyValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0510C04C1F670715006920B4 /* StringIsNotEmptyValueTransformer.swift */; }; 11 | 0510C04F1F670716006920B4 /* StringIsEmptyValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0510C04D1F670715006920B4 /* StringIsEmptyValueTransformer.swift */; }; 12 | 051463B21F84C5110063A11F /* libISOBMFF.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 051463AB1F84C5010063A11F /* libISOBMFF.a */; }; 13 | 052342001FA12EDA00D54D4F /* StringIsEmptyValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0510C04D1F670715006920B4 /* StringIsEmptyValueTransformer.swift */; }; 14 | 052342011FA12EDA00D54D4F /* BoxItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 05AF34F51F6439A6001F54CF /* BoxItem.mm */; }; 15 | 052342021FA12EDA00D54D4F /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BFED4A1F639F6300A6909E /* AboutWindowController.swift */; }; 16 | 052342031FA12EDA00D54D4F /* FileWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BFED511F63A22F00A6909E /* FileWindowController.swift */; }; 17 | 052342041FA12EDA00D54D4F /* ApplicationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BFED4E1F63A05100A6909E /* ApplicationDelegate.swift */; }; 18 | 052342051FA12EDA00D54D4F /* DictionaryIsNotEmptyValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05AF35021F6446B9001F54CF /* DictionaryIsNotEmptyValueTransformer.swift */; }; 19 | 052342061FA12EDA00D54D4F /* DictionaryIsEmptyValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05AF35171F6449BF001F54CF /* DictionaryIsEmptyValueTransformer.swift */; }; 20 | 052342071FA12EDA00D54D4F /* StringIsNotEmptyValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0510C04C1F670715006920B4 /* StringIsNotEmptyValueTransformer.swift */; }; 21 | 0523420A1FA12EDA00D54D4F /* libISOBMFF.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 051463AB1F84C5010063A11F /* libISOBMFF.a */; }; 22 | 0523420F1FA12EDA00D54D4F /* ISOBMFF_Explorer.AboutWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 05BFED4C1F639F9D00A6909E /* ISOBMFF_Explorer.AboutWindowController.xib */; }; 23 | 052342101FA12EDA00D54D4F /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 05DFC7CF1F855FBF002E9F6A /* Icon.icns */; }; 24 | 052342111FA12EDA00D54D4F /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 05BFED3C1F639A5C00A6909E /* MainMenu.xib */; }; 25 | 052342121FA12EDA00D54D4F /* ISOBMFF_Explorer.FileWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 05BFED461F639D7F00A6909E /* ISOBMFF_Explorer.FileWindowController.xib */; }; 26 | 05738E471FA1F35900D2B96A /* AppInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 05738E461FA1F35900D2B96A /* AppInstaller.m */; }; 27 | 05812ACD1FA12419003B88DF /* GitHubUpdates.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05812A6C1FA10986003B88DF /* GitHubUpdates.framework */; }; 28 | 05812ACE1FA12419003B88DF /* GitHubUpdates.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05812A6C1FA10986003B88DF /* GitHubUpdates.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 29 | 05AF34F61F6439A6001F54CF /* BoxItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 05AF34F51F6439A6001F54CF /* BoxItem.mm */; }; 30 | 05AF35031F6446B9001F54CF /* DictionaryIsNotEmptyValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05AF35021F6446B9001F54CF /* DictionaryIsNotEmptyValueTransformer.swift */; }; 31 | 05AF35181F6449BF001F54CF /* DictionaryIsEmptyValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05AF35171F6449BF001F54CF /* DictionaryIsEmptyValueTransformer.swift */; }; 32 | 05BFED411F639B1300A6909E /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 05BFED3C1F639A5C00A6909E /* MainMenu.xib */; }; 33 | 05BFED481F639D7F00A6909E /* ISOBMFF_Explorer.FileWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 05BFED461F639D7F00A6909E /* ISOBMFF_Explorer.FileWindowController.xib */; }; 34 | 05BFED4B1F639F6300A6909E /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BFED4A1F639F6300A6909E /* AboutWindowController.swift */; }; 35 | 05BFED4F1F63A05100A6909E /* ApplicationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BFED4E1F63A05100A6909E /* ApplicationDelegate.swift */; }; 36 | 05BFED501F63A1DD00A6909E /* ISOBMFF_Explorer.AboutWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 05BFED4C1F639F9D00A6909E /* ISOBMFF_Explorer.AboutWindowController.xib */; }; 37 | 05BFED521F63A22F00A6909E /* FileWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BFED511F63A22F00A6909E /* FileWindowController.swift */; }; 38 | 05DFC7D21F855FCC002E9F6A /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 05DFC7CF1F855FBF002E9F6A /* Icon.icns */; }; 39 | /* End PBXBuildFile section */ 40 | 41 | /* Begin PBXContainerItemProxy section */ 42 | 051463AA1F84C5010063A11F /* PBXContainerItemProxy */ = { 43 | isa = PBXContainerItemProxy; 44 | containerPortal = 051463A31F84C5010063A11F /* ISOBMFF.xcodeproj */; 45 | proxyType = 2; 46 | remoteGlobalIDString = 0515C8AF1F2A71A8003B8594; 47 | remoteInfo = ISOBMFF; 48 | }; 49 | 051463AC1F84C5010063A11F /* PBXContainerItemProxy */ = { 50 | isa = PBXContainerItemProxy; 51 | containerPortal = 051463A31F84C5010063A11F /* ISOBMFF.xcodeproj */; 52 | proxyType = 2; 53 | remoteGlobalIDString = 05DA96011F2A7D5B005F46DB; 54 | remoteInfo = "ISOBMFF-Tests"; 55 | }; 56 | 051463AE1F84C5010063A11F /* PBXContainerItemProxy */ = { 57 | isa = PBXContainerItemProxy; 58 | containerPortal = 051463A31F84C5010063A11F /* ISOBMFF.xcodeproj */; 59 | proxyType = 2; 60 | remoteGlobalIDString = 05BFED221F63952E00A6909E; 61 | remoteInfo = "ISOBMFF-Dump"; 62 | }; 63 | 051463B01F84C50C0063A11F /* PBXContainerItemProxy */ = { 64 | isa = PBXContainerItemProxy; 65 | containerPortal = 051463A31F84C5010063A11F /* ISOBMFF.xcodeproj */; 66 | proxyType = 1; 67 | remoteGlobalIDString = 0515C8AE1F2A71A8003B8594; 68 | remoteInfo = ISOBMFF; 69 | }; 70 | 052341FC1FA12EDA00D54D4F /* PBXContainerItemProxy */ = { 71 | isa = PBXContainerItemProxy; 72 | containerPortal = 051463A31F84C5010063A11F /* ISOBMFF.xcodeproj */; 73 | proxyType = 1; 74 | remoteGlobalIDString = 0515C8AE1F2A71A8003B8594; 75 | remoteInfo = ISOBMFF; 76 | }; 77 | 05812A6B1FA10986003B88DF /* PBXContainerItemProxy */ = { 78 | isa = PBXContainerItemProxy; 79 | containerPortal = 05812A661FA10986003B88DF /* GitHubUpdates.xcodeproj */; 80 | proxyType = 2; 81 | remoteGlobalIDString = 05F82B251EF32EA700EC8A93; 82 | remoteInfo = GitHubUpdates; 83 | }; 84 | 05812A6D1FA10986003B88DF /* PBXContainerItemProxy */ = { 85 | isa = PBXContainerItemProxy; 86 | containerPortal = 05812A661FA10986003B88DF /* GitHubUpdates.xcodeproj */; 87 | proxyType = 2; 88 | remoteGlobalIDString = 0555EBA01EF3DDA10016167F; 89 | remoteInfo = Relauncher; 90 | }; 91 | 05812ACF1FA12419003B88DF /* PBXContainerItemProxy */ = { 92 | isa = PBXContainerItemProxy; 93 | containerPortal = 05812A661FA10986003B88DF /* GitHubUpdates.xcodeproj */; 94 | proxyType = 1; 95 | remoteGlobalIDString = 05F82B241EF32EA700EC8A93; 96 | remoteInfo = GitHubUpdates; 97 | }; 98 | /* End PBXContainerItemProxy section */ 99 | 100 | /* Begin PBXCopyFilesBuildPhase section */ 101 | 05812AD11FA1241A003B88DF /* Embed Frameworks */ = { 102 | isa = PBXCopyFilesBuildPhase; 103 | buildActionMask = 2147483647; 104 | dstPath = ""; 105 | dstSubfolderSpec = 10; 106 | files = ( 107 | 05812ACE1FA12419003B88DF /* GitHubUpdates.framework in Embed Frameworks */, 108 | ); 109 | name = "Embed Frameworks"; 110 | runOnlyForDeploymentPostprocessing = 0; 111 | }; 112 | /* End PBXCopyFilesBuildPhase section */ 113 | 114 | /* Begin PBXFileReference section */ 115 | 0510C04C1F670715006920B4 /* StringIsNotEmptyValueTransformer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringIsNotEmptyValueTransformer.swift; sourceTree = ""; }; 116 | 0510C04D1F670715006920B4 /* StringIsEmptyValueTransformer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringIsEmptyValueTransformer.swift; sourceTree = ""; }; 117 | 051463A31F84C5010063A11F /* ISOBMFF.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ISOBMFF.xcodeproj; path = Submodules/ISOBMFF/ISOBMFF.xcodeproj; sourceTree = ""; }; 118 | 051F4D1A1F5DD03700E6E12C /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 119 | 052342161FA12EDA00D54D4F /* ISOBMFF Explorer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ISOBMFF Explorer.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 120 | 05738E421FA1F35900D2B96A /* AppInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppInstaller.h; sourceTree = ""; }; 121 | 05738E461FA1F35900D2B96A /* AppInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppInstaller.m; sourceTree = ""; }; 122 | 057759011F67CF6500987694 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 123 | 05812A661FA10986003B88DF /* GitHubUpdates.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GitHubUpdates.xcodeproj; path = Submodules/GitHubUpdates/GitHubUpdates.xcodeproj; sourceTree = ""; }; 124 | 05812A811FA1217F003B88DF /* ISOBMFF-Explorer.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "ISOBMFF-Explorer.entitlements"; sourceTree = ""; }; 125 | 05AF34F41F6439A6001F54CF /* BoxItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BoxItem.h; sourceTree = ""; }; 126 | 05AF34F51F6439A6001F54CF /* BoxItem.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = BoxItem.mm; sourceTree = ""; }; 127 | 05AF35021F6446B9001F54CF /* DictionaryIsNotEmptyValueTransformer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DictionaryIsNotEmptyValueTransformer.swift; sourceTree = ""; }; 128 | 05AF35171F6449BF001F54CF /* DictionaryIsEmptyValueTransformer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DictionaryIsEmptyValueTransformer.swift; sourceTree = ""; }; 129 | 05BFED2A1F6399D400A6909E /* ISOBMFF Explorer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ISOBMFF Explorer.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 130 | 05BFED341F6399D400A6909E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 131 | 05BFED3D1F639A5C00A6909E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 132 | 05BFED471F639D7F00A6909E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ISOBMFF_Explorer.FileWindowController.xib; sourceTree = ""; }; 133 | 05BFED491F639F6200A6909E /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Bridging-Header.h"; sourceTree = ""; }; 134 | 05BFED4A1F639F6300A6909E /* AboutWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutWindowController.swift; sourceTree = ""; }; 135 | 05BFED4D1F639F9D00A6909E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ISOBMFF_Explorer.AboutWindowController.xib; sourceTree = ""; }; 136 | 05BFED4E1F63A05100A6909E /* ApplicationDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationDelegate.swift; sourceTree = ""; }; 137 | 05BFED511F63A22F00A6909E /* FileWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileWindowController.swift; sourceTree = ""; }; 138 | 05DFC7CF1F855FBF002E9F6A /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Icon.icns; sourceTree = ""; }; 139 | /* End PBXFileReference section */ 140 | 141 | /* Begin PBXFrameworksBuildPhase section */ 142 | 052342081FA12EDA00D54D4F /* Frameworks */ = { 143 | isa = PBXFrameworksBuildPhase; 144 | buildActionMask = 2147483647; 145 | files = ( 146 | 0523420A1FA12EDA00D54D4F /* libISOBMFF.a in Frameworks */, 147 | ); 148 | runOnlyForDeploymentPostprocessing = 0; 149 | }; 150 | 05BFED271F6399D400A6909E /* Frameworks */ = { 151 | isa = PBXFrameworksBuildPhase; 152 | buildActionMask = 2147483647; 153 | files = ( 154 | 05812ACD1FA12419003B88DF /* GitHubUpdates.framework in Frameworks */, 155 | 051463B21F84C5110063A11F /* libISOBMFF.a in Frameworks */, 156 | ); 157 | runOnlyForDeploymentPostprocessing = 0; 158 | }; 159 | /* End PBXFrameworksBuildPhase section */ 160 | 161 | /* Begin PBXGroup section */ 162 | 051463A41F84C5010063A11F /* Products */ = { 163 | isa = PBXGroup; 164 | children = ( 165 | 051463AB1F84C5010063A11F /* libISOBMFF.a */, 166 | 051463AD1F84C5010063A11F /* ISOBMFF-Tests.xctest */, 167 | 051463AF1F84C5010063A11F /* ISOBMFF-Dump */, 168 | ); 169 | name = Products; 170 | sourceTree = ""; 171 | }; 172 | 0515C8A61F2A71A8003B8594 = { 173 | isa = PBXGroup; 174 | children = ( 175 | 05812A661FA10986003B88DF /* GitHubUpdates.xcodeproj */, 176 | 051463A31F84C5010063A11F /* ISOBMFF.xcodeproj */, 177 | 051F4D1A1F5DD03700E6E12C /* README.md */, 178 | 057759011F67CF6500987694 /* LICENSE */, 179 | 05BFED2B1F6399D400A6909E /* ISOBMFF-Explorer */, 180 | 0515C8B01F2A71A8003B8594 /* Products */, 181 | 05AF34FB1F643A6E001F54CF /* Frameworks */, 182 | ); 183 | sourceTree = ""; 184 | }; 185 | 0515C8B01F2A71A8003B8594 /* Products */ = { 186 | isa = PBXGroup; 187 | children = ( 188 | 05BFED2A1F6399D400A6909E /* ISOBMFF Explorer.app */, 189 | 052342161FA12EDA00D54D4F /* ISOBMFF Explorer.app */, 190 | ); 191 | name = Products; 192 | sourceTree = ""; 193 | }; 194 | 05812A671FA10986003B88DF /* Products */ = { 195 | isa = PBXGroup; 196 | children = ( 197 | 05812A6C1FA10986003B88DF /* GitHubUpdates.framework */, 198 | 05812A6E1FA10986003B88DF /* Relauncher */, 199 | ); 200 | name = Products; 201 | sourceTree = ""; 202 | }; 203 | 05AF34FB1F643A6E001F54CF /* Frameworks */ = { 204 | isa = PBXGroup; 205 | children = ( 206 | ); 207 | name = Frameworks; 208 | sourceTree = ""; 209 | }; 210 | 05BFED2B1F6399D400A6909E /* ISOBMFF-Explorer */ = { 211 | isa = PBXGroup; 212 | children = ( 213 | 05812A811FA1217F003B88DF /* ISOBMFF-Explorer.entitlements */, 214 | 05BFED3E1F639A5C00A6909E /* Classes */, 215 | 05BFED3B1F639A5C00A6909E /* Interface */, 216 | 05BFED341F6399D400A6909E /* Info.plist */, 217 | ); 218 | path = "ISOBMFF-Explorer"; 219 | sourceTree = ""; 220 | }; 221 | 05BFED3B1F639A5C00A6909E /* Interface */ = { 222 | isa = PBXGroup; 223 | children = ( 224 | 05DFC7CE1F855FBF002E9F6A /* Images */, 225 | 05BFED3C1F639A5C00A6909E /* MainMenu.xib */, 226 | 05BFED4C1F639F9D00A6909E /* ISOBMFF_Explorer.AboutWindowController.xib */, 227 | 05BFED461F639D7F00A6909E /* ISOBMFF_Explorer.FileWindowController.xib */, 228 | ); 229 | path = Interface; 230 | sourceTree = ""; 231 | }; 232 | 05BFED3E1F639A5C00A6909E /* Classes */ = { 233 | isa = PBXGroup; 234 | children = ( 235 | 05BFED4A1F639F6300A6909E /* AboutWindowController.swift */, 236 | 05738E421FA1F35900D2B96A /* AppInstaller.h */, 237 | 05738E461FA1F35900D2B96A /* AppInstaller.m */, 238 | 05BFED4E1F63A05100A6909E /* ApplicationDelegate.swift */, 239 | 05AF34F41F6439A6001F54CF /* BoxItem.h */, 240 | 05AF34F51F6439A6001F54CF /* BoxItem.mm */, 241 | 05BFED491F639F6200A6909E /* Bridging-Header.h */, 242 | 05AF35171F6449BF001F54CF /* DictionaryIsEmptyValueTransformer.swift */, 243 | 05AF35021F6446B9001F54CF /* DictionaryIsNotEmptyValueTransformer.swift */, 244 | 05BFED511F63A22F00A6909E /* FileWindowController.swift */, 245 | 0510C04D1F670715006920B4 /* StringIsEmptyValueTransformer.swift */, 246 | 0510C04C1F670715006920B4 /* StringIsNotEmptyValueTransformer.swift */, 247 | ); 248 | path = Classes; 249 | sourceTree = ""; 250 | }; 251 | 05DFC7CE1F855FBF002E9F6A /* Images */ = { 252 | isa = PBXGroup; 253 | children = ( 254 | 05DFC7CF1F855FBF002E9F6A /* Icon.icns */, 255 | ); 256 | path = Images; 257 | sourceTree = ""; 258 | }; 259 | /* End PBXGroup section */ 260 | 261 | /* Begin PBXNativeTarget section */ 262 | 052341FA1FA12EDA00D54D4F /* ISOBMFF Explorer - AppStore */ = { 263 | isa = PBXNativeTarget; 264 | buildConfigurationList = 052342131FA12EDA00D54D4F /* Build configuration list for PBXNativeTarget "ISOBMFF Explorer - AppStore" */; 265 | buildPhases = ( 266 | 052341FF1FA12EDA00D54D4F /* Sources */, 267 | 052342081FA12EDA00D54D4F /* Frameworks */, 268 | 0523420B1FA12EDA00D54D4F /* ShellScript */, 269 | 0523420E1FA12EDA00D54D4F /* Resources */, 270 | ); 271 | buildRules = ( 272 | ); 273 | dependencies = ( 274 | 052341FB1FA12EDA00D54D4F /* PBXTargetDependency */, 275 | ); 276 | name = "ISOBMFF Explorer - AppStore"; 277 | productName = "ISOBMFF-Explorer"; 278 | productReference = 052342161FA12EDA00D54D4F /* ISOBMFF Explorer.app */; 279 | productType = "com.apple.product-type.application"; 280 | }; 281 | 05BFED291F6399D400A6909E /* ISOBMFF Explorer */ = { 282 | isa = PBXNativeTarget; 283 | buildConfigurationList = 05BFED381F6399D400A6909E /* Build configuration list for PBXNativeTarget "ISOBMFF Explorer" */; 284 | buildPhases = ( 285 | 05BFED261F6399D400A6909E /* Sources */, 286 | 05BFED271F6399D400A6909E /* Frameworks */, 287 | 05812A631FA108B1003B88DF /* ShellScript */, 288 | 05812AD11FA1241A003B88DF /* Embed Frameworks */, 289 | 05BFED281F6399D400A6909E /* Resources */, 290 | ); 291 | buildRules = ( 292 | ); 293 | dependencies = ( 294 | 051463B11F84C50C0063A11F /* PBXTargetDependency */, 295 | 05812AD01FA12419003B88DF /* PBXTargetDependency */, 296 | ); 297 | name = "ISOBMFF Explorer"; 298 | productName = "ISOBMFF-Explorer"; 299 | productReference = 05BFED2A1F6399D400A6909E /* ISOBMFF Explorer.app */; 300 | productType = "com.apple.product-type.application"; 301 | }; 302 | /* End PBXNativeTarget section */ 303 | 304 | /* Begin PBXProject section */ 305 | 0515C8A71F2A71A8003B8594 /* Project object */ = { 306 | isa = PBXProject; 307 | attributes = { 308 | LastUpgradeCheck = 1220; 309 | ORGANIZATIONNAME = "XS-Labs"; 310 | TargetAttributes = { 311 | 052341FA1FA12EDA00D54D4F = { 312 | ProvisioningStyle = Automatic; 313 | SystemCapabilities = { 314 | com.apple.Sandbox = { 315 | enabled = 1; 316 | }; 317 | }; 318 | }; 319 | 05BFED291F6399D400A6909E = { 320 | CreatedOnToolsVersion = 9.0; 321 | LastSwiftMigration = 0900; 322 | ProvisioningStyle = Automatic; 323 | SystemCapabilities = { 324 | com.apple.Sandbox = { 325 | enabled = 0; 326 | }; 327 | }; 328 | }; 329 | }; 330 | }; 331 | buildConfigurationList = 0515C8AA1F2A71A8003B8594 /* Build configuration list for PBXProject "ISOBMFF-Explorer" */; 332 | compatibilityVersion = "Xcode 8.0"; 333 | developmentRegion = en; 334 | hasScannedForEncodings = 0; 335 | knownRegions = ( 336 | en, 337 | Base, 338 | ); 339 | mainGroup = 0515C8A61F2A71A8003B8594; 340 | productRefGroup = 0515C8B01F2A71A8003B8594 /* Products */; 341 | projectDirPath = ""; 342 | projectReferences = ( 343 | { 344 | ProductGroup = 05812A671FA10986003B88DF /* Products */; 345 | ProjectRef = 05812A661FA10986003B88DF /* GitHubUpdates.xcodeproj */; 346 | }, 347 | { 348 | ProductGroup = 051463A41F84C5010063A11F /* Products */; 349 | ProjectRef = 051463A31F84C5010063A11F /* ISOBMFF.xcodeproj */; 350 | }, 351 | ); 352 | projectRoot = ""; 353 | targets = ( 354 | 05BFED291F6399D400A6909E /* ISOBMFF Explorer */, 355 | 052341FA1FA12EDA00D54D4F /* ISOBMFF Explorer - AppStore */, 356 | ); 357 | }; 358 | /* End PBXProject section */ 359 | 360 | /* Begin PBXReferenceProxy section */ 361 | 051463AB1F84C5010063A11F /* libISOBMFF.a */ = { 362 | isa = PBXReferenceProxy; 363 | fileType = archive.ar; 364 | path = libISOBMFF.a; 365 | remoteRef = 051463AA1F84C5010063A11F /* PBXContainerItemProxy */; 366 | sourceTree = BUILT_PRODUCTS_DIR; 367 | }; 368 | 051463AD1F84C5010063A11F /* ISOBMFF-Tests.xctest */ = { 369 | isa = PBXReferenceProxy; 370 | fileType = wrapper.cfbundle; 371 | path = "ISOBMFF-Tests.xctest"; 372 | remoteRef = 051463AC1F84C5010063A11F /* PBXContainerItemProxy */; 373 | sourceTree = BUILT_PRODUCTS_DIR; 374 | }; 375 | 051463AF1F84C5010063A11F /* ISOBMFF-Dump */ = { 376 | isa = PBXReferenceProxy; 377 | fileType = "compiled.mach-o.executable"; 378 | path = "ISOBMFF-Dump"; 379 | remoteRef = 051463AE1F84C5010063A11F /* PBXContainerItemProxy */; 380 | sourceTree = BUILT_PRODUCTS_DIR; 381 | }; 382 | 05812A6C1FA10986003B88DF /* GitHubUpdates.framework */ = { 383 | isa = PBXReferenceProxy; 384 | fileType = wrapper.framework; 385 | path = GitHubUpdates.framework; 386 | remoteRef = 05812A6B1FA10986003B88DF /* PBXContainerItemProxy */; 387 | sourceTree = BUILT_PRODUCTS_DIR; 388 | }; 389 | 05812A6E1FA10986003B88DF /* Relauncher */ = { 390 | isa = PBXReferenceProxy; 391 | fileType = "compiled.mach-o.executable"; 392 | path = Relauncher; 393 | remoteRef = 05812A6D1FA10986003B88DF /* PBXContainerItemProxy */; 394 | sourceTree = BUILT_PRODUCTS_DIR; 395 | }; 396 | /* End PBXReferenceProxy section */ 397 | 398 | /* Begin PBXResourcesBuildPhase section */ 399 | 0523420E1FA12EDA00D54D4F /* Resources */ = { 400 | isa = PBXResourcesBuildPhase; 401 | buildActionMask = 2147483647; 402 | files = ( 403 | 0523420F1FA12EDA00D54D4F /* ISOBMFF_Explorer.AboutWindowController.xib in Resources */, 404 | 052342101FA12EDA00D54D4F /* Icon.icns in Resources */, 405 | 052342111FA12EDA00D54D4F /* MainMenu.xib in Resources */, 406 | 052342121FA12EDA00D54D4F /* ISOBMFF_Explorer.FileWindowController.xib in Resources */, 407 | ); 408 | runOnlyForDeploymentPostprocessing = 0; 409 | }; 410 | 05BFED281F6399D400A6909E /* Resources */ = { 411 | isa = PBXResourcesBuildPhase; 412 | buildActionMask = 2147483647; 413 | files = ( 414 | 05BFED501F63A1DD00A6909E /* ISOBMFF_Explorer.AboutWindowController.xib in Resources */, 415 | 05DFC7D21F855FCC002E9F6A /* Icon.icns in Resources */, 416 | 05BFED411F639B1300A6909E /* MainMenu.xib in Resources */, 417 | 05BFED481F639D7F00A6909E /* ISOBMFF_Explorer.FileWindowController.xib in Resources */, 418 | ); 419 | runOnlyForDeploymentPostprocessing = 0; 420 | }; 421 | /* End PBXResourcesBuildPhase section */ 422 | 423 | /* Begin PBXShellScriptBuildPhase section */ 424 | 0523420B1FA12EDA00D54D4F /* ShellScript */ = { 425 | isa = PBXShellScriptBuildPhase; 426 | buildActionMask = 2147483647; 427 | files = ( 428 | ); 429 | inputPaths = ( 430 | ); 431 | outputPaths = ( 432 | ); 433 | runOnlyForDeploymentPostprocessing = 0; 434 | shellPath = /bin/sh; 435 | shellScript = "#!/bin/bash\nif [ \"${CONFIGURATION}\" = \"Release\" ] || [ \"${CONFIGURATION}\" = \"AppStore\" ]; then\n plist=\"ISOBMFF-Explorer/Info.plist\"\n rev=$(git rev-list `git branch | grep -e \"^*\" | cut -d' ' -f 2` | wc -l)\n /usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $rev\" \"$plist\"\nfi"; 436 | }; 437 | 05812A631FA108B1003B88DF /* ShellScript */ = { 438 | isa = PBXShellScriptBuildPhase; 439 | buildActionMask = 2147483647; 440 | files = ( 441 | ); 442 | inputPaths = ( 443 | ); 444 | outputPaths = ( 445 | ); 446 | runOnlyForDeploymentPostprocessing = 0; 447 | shellPath = /bin/sh; 448 | shellScript = "#!/bin/bash\nif [ \"${CONFIGURATION}\" = \"Release\" ] || [ \"${CONFIGURATION}\" = \"AppStore\" ]; then\n plist=\"ISOBMFF-Explorer/Info.plist\"\n rev=$(git rev-list `git branch | grep -e \"^*\" | cut -d' ' -f 2` | wc -l)\n /usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $rev\" \"$plist\"\nfi"; 449 | }; 450 | /* End PBXShellScriptBuildPhase section */ 451 | 452 | /* Begin PBXSourcesBuildPhase section */ 453 | 052341FF1FA12EDA00D54D4F /* Sources */ = { 454 | isa = PBXSourcesBuildPhase; 455 | buildActionMask = 2147483647; 456 | files = ( 457 | 052342001FA12EDA00D54D4F /* StringIsEmptyValueTransformer.swift in Sources */, 458 | 052342011FA12EDA00D54D4F /* BoxItem.mm in Sources */, 459 | 052342021FA12EDA00D54D4F /* AboutWindowController.swift in Sources */, 460 | 052342031FA12EDA00D54D4F /* FileWindowController.swift in Sources */, 461 | 052342041FA12EDA00D54D4F /* ApplicationDelegate.swift in Sources */, 462 | 052342051FA12EDA00D54D4F /* DictionaryIsNotEmptyValueTransformer.swift in Sources */, 463 | 052342061FA12EDA00D54D4F /* DictionaryIsEmptyValueTransformer.swift in Sources */, 464 | 052342071FA12EDA00D54D4F /* StringIsNotEmptyValueTransformer.swift in Sources */, 465 | ); 466 | runOnlyForDeploymentPostprocessing = 0; 467 | }; 468 | 05BFED261F6399D400A6909E /* Sources */ = { 469 | isa = PBXSourcesBuildPhase; 470 | buildActionMask = 2147483647; 471 | files = ( 472 | 0510C04F1F670716006920B4 /* StringIsEmptyValueTransformer.swift in Sources */, 473 | 05AF34F61F6439A6001F54CF /* BoxItem.mm in Sources */, 474 | 05BFED4B1F639F6300A6909E /* AboutWindowController.swift in Sources */, 475 | 05BFED521F63A22F00A6909E /* FileWindowController.swift in Sources */, 476 | 05BFED4F1F63A05100A6909E /* ApplicationDelegate.swift in Sources */, 477 | 05738E471FA1F35900D2B96A /* AppInstaller.m in Sources */, 478 | 05AF35031F6446B9001F54CF /* DictionaryIsNotEmptyValueTransformer.swift in Sources */, 479 | 05AF35181F6449BF001F54CF /* DictionaryIsEmptyValueTransformer.swift in Sources */, 480 | 0510C04E1F670716006920B4 /* StringIsNotEmptyValueTransformer.swift in Sources */, 481 | ); 482 | runOnlyForDeploymentPostprocessing = 0; 483 | }; 484 | /* End PBXSourcesBuildPhase section */ 485 | 486 | /* Begin PBXTargetDependency section */ 487 | 051463B11F84C50C0063A11F /* PBXTargetDependency */ = { 488 | isa = PBXTargetDependency; 489 | name = ISOBMFF; 490 | targetProxy = 051463B01F84C50C0063A11F /* PBXContainerItemProxy */; 491 | }; 492 | 052341FB1FA12EDA00D54D4F /* PBXTargetDependency */ = { 493 | isa = PBXTargetDependency; 494 | name = ISOBMFF; 495 | targetProxy = 052341FC1FA12EDA00D54D4F /* PBXContainerItemProxy */; 496 | }; 497 | 05812AD01FA12419003B88DF /* PBXTargetDependency */ = { 498 | isa = PBXTargetDependency; 499 | name = GitHubUpdates; 500 | targetProxy = 05812ACF1FA12419003B88DF /* PBXContainerItemProxy */; 501 | }; 502 | /* End PBXTargetDependency section */ 503 | 504 | /* Begin PBXVariantGroup section */ 505 | 05BFED3C1F639A5C00A6909E /* MainMenu.xib */ = { 506 | isa = PBXVariantGroup; 507 | children = ( 508 | 05BFED3D1F639A5C00A6909E /* Base */, 509 | ); 510 | name = MainMenu.xib; 511 | sourceTree = ""; 512 | }; 513 | 05BFED461F639D7F00A6909E /* ISOBMFF_Explorer.FileWindowController.xib */ = { 514 | isa = PBXVariantGroup; 515 | children = ( 516 | 05BFED471F639D7F00A6909E /* Base */, 517 | ); 518 | name = ISOBMFF_Explorer.FileWindowController.xib; 519 | sourceTree = ""; 520 | }; 521 | 05BFED4C1F639F9D00A6909E /* ISOBMFF_Explorer.AboutWindowController.xib */ = { 522 | isa = PBXVariantGroup; 523 | children = ( 524 | 05BFED4D1F639F9D00A6909E /* Base */, 525 | ); 526 | name = ISOBMFF_Explorer.AboutWindowController.xib; 527 | sourceTree = ""; 528 | }; 529 | /* End PBXVariantGroup section */ 530 | 531 | /* Begin XCBuildConfiguration section */ 532 | 0515C8B81F2A71A8003B8594 /* Debug */ = { 533 | isa = XCBuildConfiguration; 534 | buildSettings = { 535 | ALWAYS_SEARCH_USER_PATHS = NO; 536 | CLANG_ADDRESS_SANITIZER_CONTAINER_OVERFLOW = YES; 537 | CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO; 538 | CLANG_ANALYZER_DEADCODE_DEADSTORES = YES; 539 | CLANG_ANALYZER_GCD = YES; 540 | CLANG_ANALYZER_LOCALIZABILITY_EMPTY_CONTEXT = YES; 541 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 542 | CLANG_ANALYZER_MEMORY_MANAGEMENT = YES; 543 | CLANG_ANALYZER_NONNULL = YES; 544 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 545 | CLANG_ANALYZER_OBJC_ATSYNC = YES; 546 | CLANG_ANALYZER_OBJC_COLLECTIONS = YES; 547 | CLANG_ANALYZER_OBJC_DEALLOC = YES; 548 | CLANG_ANALYZER_OBJC_GENERICS = YES; 549 | CLANG_ANALYZER_OBJC_INCOMP_METHOD_TYPES = YES; 550 | CLANG_ANALYZER_OBJC_NSCFERROR = YES; 551 | CLANG_ANALYZER_OBJC_RETAIN_COUNT = YES; 552 | CLANG_ANALYZER_OBJC_SELF_INIT = YES; 553 | CLANG_ANALYZER_OBJC_UNUSED_IVARS = YES; 554 | CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; 555 | CLANG_ANALYZER_SECURITY_INSECUREAPI_GETPW_GETS = YES; 556 | CLANG_ANALYZER_SECURITY_INSECUREAPI_MKSTEMP = YES; 557 | CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; 558 | CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; 559 | CLANG_ANALYZER_SECURITY_INSECUREAPI_UNCHECKEDRETURN = YES; 560 | CLANG_ANALYZER_SECURITY_INSECUREAPI_VFORK = YES; 561 | CLANG_ANALYZER_SECURITY_KEYCHAIN_API = YES; 562 | CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; 563 | CLANG_CXX_LIBRARY = "libc++"; 564 | CLANG_ENABLE_CODE_COVERAGE = YES; 565 | CLANG_ENABLE_MODULES = YES; 566 | CLANG_ENABLE_MODULE_DEBUGGING = NO; 567 | CLANG_ENABLE_OBJC_ARC = YES; 568 | CLANG_ENABLE_OBJC_WEAK = NO; 569 | CLANG_LINK_OBJC_RUNTIME = YES; 570 | CLANG_MODULES_AUTOLINK = YES; 571 | CLANG_STATIC_ANALYZER_MODE = deep; 572 | CLANG_STATIC_ANALYZER_MODE_ON_ANALYZE_ACTION = deep; 573 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_INTEGER = YES; 574 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES; 575 | CLANG_WARN_ASSIGN_ENUM = YES; 576 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 577 | CLANG_WARN_BOOL_CONVERSION = YES; 578 | CLANG_WARN_COMMA = YES; 579 | CLANG_WARN_CONSTANT_CONVERSION = YES; 580 | CLANG_WARN_CXX0X_EXTENSIONS = YES; 581 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 582 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 583 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 584 | CLANG_WARN_EMPTY_BODY = YES; 585 | CLANG_WARN_ENUM_CONVERSION = YES; 586 | CLANG_WARN_FLOAT_CONVERSION = YES_ERROR; 587 | CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES_ERROR; 588 | CLANG_WARN_INFINITE_RECURSION = YES; 589 | CLANG_WARN_INT_CONVERSION = YES; 590 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 591 | CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; 592 | CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; 593 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 594 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 595 | CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO; 596 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES_AGGRESSIVE; 597 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 598 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 599 | CLANG_WARN_STRICT_PROTOTYPES = YES; 600 | CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES_ERROR; 601 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 602 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 603 | CLANG_WARN_UNREACHABLE_CODE = YES; 604 | CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES; 605 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 606 | CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; 607 | CODE_SIGN_IDENTITY = "-"; 608 | COMBINE_HIDPI_IMAGES = YES; 609 | COPY_PHASE_STRIP = NO; 610 | DEBUG_INFORMATION_FORMAT = dwarf; 611 | ENABLE_HARDENED_RUNTIME = YES; 612 | ENABLE_NS_ASSERTIONS = YES; 613 | ENABLE_STRICT_OBJC_MSGSEND = YES; 614 | ENABLE_TESTABILITY = YES; 615 | GCC_C_LANGUAGE_STANDARD = c11; 616 | GCC_DYNAMIC_NO_PIC = NO; 617 | GCC_ENABLE_CPP_EXCEPTIONS = YES; 618 | GCC_ENABLE_CPP_RTTI = YES; 619 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 620 | GCC_GENERATE_TEST_COVERAGE_FILES = YES; 621 | GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES; 622 | GCC_NO_COMMON_BLOCKS = YES; 623 | GCC_OPTIMIZATION_LEVEL = 0; 624 | GCC_PREPROCESSOR_DEFINITIONS = ( 625 | "DEBUG=1", 626 | "$(inherited)", 627 | ); 628 | GCC_STRICT_ALIASING = YES; 629 | GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; 630 | GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; 631 | GCC_TREAT_WARNINGS_AS_ERRORS = YES; 632 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 633 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; 634 | GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES; 635 | GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; 636 | GCC_WARN_ABOUT_MISSING_NEWLINE = YES; 637 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 638 | GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES; 639 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 640 | GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES; 641 | GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; 642 | GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; 643 | GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; 644 | GCC_WARN_INHIBIT_ALL_WARNINGS = NO; 645 | GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; 646 | GCC_WARN_MISSING_PARENTHESES = YES; 647 | GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; 648 | GCC_WARN_PEDANTIC = YES; 649 | GCC_WARN_SHADOW = YES; 650 | GCC_WARN_SIGN_COMPARE = YES; 651 | GCC_WARN_STRICT_SELECTOR_MATCH = YES; 652 | GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; 653 | GCC_WARN_UNDECLARED_SELECTOR = YES; 654 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 655 | GCC_WARN_UNKNOWN_PRAGMAS = YES; 656 | GCC_WARN_UNUSED_FUNCTION = YES; 657 | GCC_WARN_UNUSED_LABEL = YES; 658 | GCC_WARN_UNUSED_PARAMETER = YES; 659 | GCC_WARN_UNUSED_VALUE = YES; 660 | GCC_WARN_UNUSED_VARIABLE = YES; 661 | HEADER_SEARCH_PATHS = ""; 662 | LLVM_LTO = NO; 663 | MACOSX_DEPLOYMENT_TARGET = 10.12; 664 | ONLY_ACTIVE_ARCH = YES; 665 | RUN_CLANG_STATIC_ANALYZER = YES; 666 | SDKROOT = macosx; 667 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 668 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 669 | SWIFT_VERSION = 5.0; 670 | }; 671 | name = Debug; 672 | }; 673 | 0515C8B91F2A71A8003B8594 /* Release */ = { 674 | isa = XCBuildConfiguration; 675 | buildSettings = { 676 | ALWAYS_SEARCH_USER_PATHS = NO; 677 | CLANG_ADDRESS_SANITIZER_CONTAINER_OVERFLOW = YES; 678 | CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO; 679 | CLANG_ANALYZER_DEADCODE_DEADSTORES = YES; 680 | CLANG_ANALYZER_GCD = YES; 681 | CLANG_ANALYZER_LOCALIZABILITY_EMPTY_CONTEXT = YES; 682 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 683 | CLANG_ANALYZER_MEMORY_MANAGEMENT = YES; 684 | CLANG_ANALYZER_NONNULL = YES; 685 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 686 | CLANG_ANALYZER_OBJC_ATSYNC = YES; 687 | CLANG_ANALYZER_OBJC_COLLECTIONS = YES; 688 | CLANG_ANALYZER_OBJC_DEALLOC = YES; 689 | CLANG_ANALYZER_OBJC_GENERICS = YES; 690 | CLANG_ANALYZER_OBJC_INCOMP_METHOD_TYPES = YES; 691 | CLANG_ANALYZER_OBJC_NSCFERROR = YES; 692 | CLANG_ANALYZER_OBJC_RETAIN_COUNT = YES; 693 | CLANG_ANALYZER_OBJC_SELF_INIT = YES; 694 | CLANG_ANALYZER_OBJC_UNUSED_IVARS = YES; 695 | CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; 696 | CLANG_ANALYZER_SECURITY_INSECUREAPI_GETPW_GETS = YES; 697 | CLANG_ANALYZER_SECURITY_INSECUREAPI_MKSTEMP = YES; 698 | CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; 699 | CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; 700 | CLANG_ANALYZER_SECURITY_INSECUREAPI_UNCHECKEDRETURN = YES; 701 | CLANG_ANALYZER_SECURITY_INSECUREAPI_VFORK = YES; 702 | CLANG_ANALYZER_SECURITY_KEYCHAIN_API = YES; 703 | CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; 704 | CLANG_CXX_LIBRARY = "libc++"; 705 | CLANG_ENABLE_CODE_COVERAGE = NO; 706 | CLANG_ENABLE_MODULES = YES; 707 | CLANG_ENABLE_MODULE_DEBUGGING = NO; 708 | CLANG_ENABLE_OBJC_ARC = YES; 709 | CLANG_ENABLE_OBJC_WEAK = NO; 710 | CLANG_LINK_OBJC_RUNTIME = YES; 711 | CLANG_MODULES_AUTOLINK = YES; 712 | CLANG_STATIC_ANALYZER_MODE = deep; 713 | CLANG_STATIC_ANALYZER_MODE_ON_ANALYZE_ACTION = deep; 714 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_INTEGER = YES; 715 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES; 716 | CLANG_WARN_ASSIGN_ENUM = YES; 717 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 718 | CLANG_WARN_BOOL_CONVERSION = YES; 719 | CLANG_WARN_COMMA = YES; 720 | CLANG_WARN_CONSTANT_CONVERSION = YES; 721 | CLANG_WARN_CXX0X_EXTENSIONS = YES; 722 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 723 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 724 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 725 | CLANG_WARN_EMPTY_BODY = YES; 726 | CLANG_WARN_ENUM_CONVERSION = YES; 727 | CLANG_WARN_FLOAT_CONVERSION = YES_ERROR; 728 | CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES_ERROR; 729 | CLANG_WARN_INFINITE_RECURSION = YES; 730 | CLANG_WARN_INT_CONVERSION = YES; 731 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 732 | CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; 733 | CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; 734 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 735 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 736 | CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO; 737 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES_AGGRESSIVE; 738 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 739 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 740 | CLANG_WARN_STRICT_PROTOTYPES = YES; 741 | CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES_ERROR; 742 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 743 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 744 | CLANG_WARN_UNREACHABLE_CODE = YES; 745 | CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES; 746 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 747 | CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; 748 | CODE_SIGN_IDENTITY = "-"; 749 | COMBINE_HIDPI_IMAGES = YES; 750 | COPY_PHASE_STRIP = NO; 751 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 752 | ENABLE_HARDENED_RUNTIME = YES; 753 | ENABLE_NS_ASSERTIONS = NO; 754 | ENABLE_STRICT_OBJC_MSGSEND = YES; 755 | GCC_C_LANGUAGE_STANDARD = c11; 756 | GCC_ENABLE_CPP_EXCEPTIONS = YES; 757 | GCC_ENABLE_CPP_RTTI = YES; 758 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 759 | GCC_GENERATE_TEST_COVERAGE_FILES = NO; 760 | GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO; 761 | GCC_NO_COMMON_BLOCKS = YES; 762 | GCC_OPTIMIZATION_LEVEL = s; 763 | GCC_STRICT_ALIASING = YES; 764 | GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; 765 | GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; 766 | GCC_TREAT_WARNINGS_AS_ERRORS = YES; 767 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 768 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; 769 | GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES; 770 | GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; 771 | GCC_WARN_ABOUT_MISSING_NEWLINE = YES; 772 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 773 | GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES; 774 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 775 | GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES; 776 | GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; 777 | GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; 778 | GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; 779 | GCC_WARN_INHIBIT_ALL_WARNINGS = NO; 780 | GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; 781 | GCC_WARN_MISSING_PARENTHESES = YES; 782 | GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; 783 | GCC_WARN_PEDANTIC = YES; 784 | GCC_WARN_SHADOW = YES; 785 | GCC_WARN_SIGN_COMPARE = YES; 786 | GCC_WARN_STRICT_SELECTOR_MATCH = YES; 787 | GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; 788 | GCC_WARN_UNDECLARED_SELECTOR = YES; 789 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 790 | GCC_WARN_UNKNOWN_PRAGMAS = YES; 791 | GCC_WARN_UNUSED_FUNCTION = YES; 792 | GCC_WARN_UNUSED_LABEL = YES; 793 | GCC_WARN_UNUSED_PARAMETER = YES; 794 | GCC_WARN_UNUSED_VALUE = YES; 795 | GCC_WARN_UNUSED_VARIABLE = YES; 796 | HEADER_SEARCH_PATHS = ""; 797 | LLVM_LTO = YES_THIN; 798 | MACOSX_DEPLOYMENT_TARGET = 10.12; 799 | RUN_CLANG_STATIC_ANALYZER = YES; 800 | SDKROOT = macosx; 801 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; 802 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 803 | SWIFT_VERSION = 5.0; 804 | }; 805 | name = Release; 806 | }; 807 | 052342141FA12EDA00D54D4F /* Debug */ = { 808 | isa = XCBuildConfiguration; 809 | buildSettings = { 810 | CODE_SIGN_ENTITLEMENTS = "ISOBMFF-Explorer/ISOBMFF-Explorer.entitlements"; 811 | CODE_SIGN_IDENTITY = "Mac Developer"; 812 | CODE_SIGN_STYLE = Automatic; 813 | DEVELOPMENT_TEAM = J5PR93692Y; 814 | HEADER_SEARCH_PATHS = ( 815 | "$(inherited)", 816 | "$(SRCROOT)/Submodules/ISOBMFF/ISOBMFF/include", 817 | "$(SRCROOT)/Submodules/ISOBMFF/Submodules/PIMPL/PIMPL/include", 818 | ); 819 | INFOPLIST_FILE = "ISOBMFF-Explorer/Info.plist"; 820 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 821 | PRODUCT_BUNDLE_IDENTIFIER = "com.DigiDNA.ISOBMFF-Explorer"; 822 | PRODUCT_NAME = "ISOBMFF Explorer"; 823 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "APPSTORE $(inherited)"; 824 | SWIFT_OBJC_BRIDGING_HEADER = "ISOBMFF-Explorer/Classes/Bridging-Header.h"; 825 | }; 826 | name = Debug; 827 | }; 828 | 052342151FA12EDA00D54D4F /* Release */ = { 829 | isa = XCBuildConfiguration; 830 | buildSettings = { 831 | CODE_SIGN_ENTITLEMENTS = "ISOBMFF-Explorer/ISOBMFF-Explorer.entitlements"; 832 | CODE_SIGN_IDENTITY = "Mac Developer"; 833 | CODE_SIGN_STYLE = Automatic; 834 | DEVELOPMENT_TEAM = J5PR93692Y; 835 | HEADER_SEARCH_PATHS = ( 836 | "$(inherited)", 837 | "$(SRCROOT)/Submodules/ISOBMFF/ISOBMFF/include", 838 | "$(SRCROOT)/Submodules/ISOBMFF/Submodules/PIMPL/PIMPL/include", 839 | ); 840 | INFOPLIST_FILE = "ISOBMFF-Explorer/Info.plist"; 841 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 842 | PRODUCT_BUNDLE_IDENTIFIER = "com.DigiDNA.ISOBMFF-Explorer"; 843 | PRODUCT_NAME = "ISOBMFF Explorer"; 844 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "APPSTORE $(inherited)"; 845 | SWIFT_OBJC_BRIDGING_HEADER = "ISOBMFF-Explorer/Classes/Bridging-Header.h"; 846 | }; 847 | name = Release; 848 | }; 849 | 05BFED391F6399D400A6909E /* Debug */ = { 850 | isa = XCBuildConfiguration; 851 | buildSettings = { 852 | CODE_SIGN_IDENTITY = "Mac Developer"; 853 | CODE_SIGN_STYLE = Automatic; 854 | DEVELOPMENT_TEAM = J5PR93692Y; 855 | HEADER_SEARCH_PATHS = ( 856 | "$(inherited)", 857 | "$(SRCROOT)/Submodules/ISOBMFF/ISOBMFF/include", 858 | "$(SRCROOT)/Submodules/ISOBMFF/Submodules/PIMPL/PIMPL/include", 859 | ); 860 | INFOPLIST_FILE = "ISOBMFF-Explorer/Info.plist"; 861 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 862 | PRODUCT_BUNDLE_IDENTIFIER = "com.DigiDNA.ISOBMFF-Explorer"; 863 | PRODUCT_NAME = "ISOBMFF Explorer"; 864 | SWIFT_OBJC_BRIDGING_HEADER = "ISOBMFF-Explorer/Classes/Bridging-Header.h"; 865 | }; 866 | name = Debug; 867 | }; 868 | 05BFED3A1F6399D400A6909E /* Release */ = { 869 | isa = XCBuildConfiguration; 870 | buildSettings = { 871 | CODE_SIGN_IDENTITY = "Mac Developer"; 872 | CODE_SIGN_STYLE = Automatic; 873 | DEVELOPMENT_TEAM = J5PR93692Y; 874 | HEADER_SEARCH_PATHS = ( 875 | "$(inherited)", 876 | "$(SRCROOT)/Submodules/ISOBMFF/ISOBMFF/include", 877 | "$(SRCROOT)/Submodules/ISOBMFF/Submodules/PIMPL/PIMPL/include", 878 | ); 879 | INFOPLIST_FILE = "ISOBMFF-Explorer/Info.plist"; 880 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 881 | PRODUCT_BUNDLE_IDENTIFIER = "com.DigiDNA.ISOBMFF-Explorer"; 882 | PRODUCT_NAME = "ISOBMFF Explorer"; 883 | SWIFT_OBJC_BRIDGING_HEADER = "ISOBMFF-Explorer/Classes/Bridging-Header.h"; 884 | }; 885 | name = Release; 886 | }; 887 | /* End XCBuildConfiguration section */ 888 | 889 | /* Begin XCConfigurationList section */ 890 | 0515C8AA1F2A71A8003B8594 /* Build configuration list for PBXProject "ISOBMFF-Explorer" */ = { 891 | isa = XCConfigurationList; 892 | buildConfigurations = ( 893 | 0515C8B81F2A71A8003B8594 /* Debug */, 894 | 0515C8B91F2A71A8003B8594 /* Release */, 895 | ); 896 | defaultConfigurationIsVisible = 0; 897 | defaultConfigurationName = Release; 898 | }; 899 | 052342131FA12EDA00D54D4F /* Build configuration list for PBXNativeTarget "ISOBMFF Explorer - AppStore" */ = { 900 | isa = XCConfigurationList; 901 | buildConfigurations = ( 902 | 052342141FA12EDA00D54D4F /* Debug */, 903 | 052342151FA12EDA00D54D4F /* Release */, 904 | ); 905 | defaultConfigurationIsVisible = 0; 906 | defaultConfigurationName = Release; 907 | }; 908 | 05BFED381F6399D400A6909E /* Build configuration list for PBXNativeTarget "ISOBMFF Explorer" */ = { 909 | isa = XCConfigurationList; 910 | buildConfigurations = ( 911 | 05BFED391F6399D400A6909E /* Debug */, 912 | 05BFED3A1F6399D400A6909E /* Release */, 913 | ); 914 | defaultConfigurationIsVisible = 0; 915 | defaultConfigurationName = Release; 916 | }; 917 | /* End XCConfigurationList section */ 918 | }; 919 | rootObject = 0515C8A71F2A71A8003B8594 /* Project object */; 920 | } 921 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer.xcodeproj/project.xcworkspace/xcshareddata/IBMFF.xcscmblueprint: -------------------------------------------------------------------------------- 1 | { 2 | "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "61AA9713A3A3709F2007883528A1EAE56893592A", 3 | "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { 4 | 5 | }, 6 | "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { 7 | "A59B79241FF48B87B8A2D6239F13C873F14163E3" : 9223372036854775807, 8 | "61AA9713A3A3709F2007883528A1EAE56893592A" : 9223372036854775807 9 | }, 10 | "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "CED860CF-8F49-4949-9FD5-54FCA086FD6A", 11 | "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { 12 | "A59B79241FF48B87B8A2D6239F13C873F14163E3" : "IBMFF\/Submodules\/gmock-xcode\/", 13 | "61AA9713A3A3709F2007883528A1EAE56893592A" : "IBMFF\/" 14 | }, 15 | "DVTSourceControlWorkspaceBlueprintNameKey" : "IBMFF", 16 | "DVTSourceControlWorkspaceBlueprintVersion" : 204, 17 | "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "IBMFF.xcodeproj", 18 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ 19 | { 20 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:macmade\/IBMFF.git", 21 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 22 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "61AA9713A3A3709F2007883528A1EAE56893592A" 23 | }, 24 | { 25 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/macmade\/gmock-xcode", 26 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 27 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "A59B79241FF48B87B8A2D6239F13C873F14163E3" 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /ISOBMFF-Explorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer.xcodeproj/xcshareddata/xcschemes/ISOBMFF Explorer - AppStore Debug.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer.xcodeproj/xcshareddata/xcschemes/ISOBMFF Explorer - AppStore Release.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 60 | 61 | 67 | 68 | 69 | 70 | 72 | 73 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer.xcodeproj/xcshareddata/xcschemes/ISOBMFF Explorer - Debug.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 60 | 61 | 67 | 68 | 69 | 70 | 72 | 73 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer.xcodeproj/xcshareddata/xcschemes/ISOBMFF Explorer - Release.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 60 | 61 | 67 | 68 | 69 | 70 | 72 | 73 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/AboutWindowController.swift: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2020 Jean-David Gadina - www.xs-labs.com 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | import Cocoa 26 | 27 | public class AboutWindowController: NSWindowController 28 | { 29 | @objc private dynamic var name: String? 30 | @objc private dynamic var version: String? 31 | @objc private dynamic var copyright: String? 32 | 33 | public override var windowNibName: NSNib.Name? 34 | { 35 | return NSNib.Name( NSStringFromClass( type( of: self ) ) ) 36 | } 37 | 38 | override public func windowDidLoad() 39 | { 40 | super.windowDidLoad() 41 | 42 | let version = Bundle.main.object( forInfoDictionaryKey: "CFBundleShortVersionString" ) as? String ?? "0.0.0" 43 | 44 | if let build = Bundle.main.object( forInfoDictionaryKey: "CFBundleVersion" ) as? String 45 | { 46 | self.version = "\(version) (\(build))" 47 | } 48 | else 49 | { 50 | self.version = version 51 | } 52 | 53 | self.name = Bundle.main.object( forInfoDictionaryKey: "CFBundleName" ) as? String 54 | self.copyright = Bundle.main.object( forInfoDictionaryKey: "NSHumanReadableCopyright" ) as? String 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/AppInstaller.h: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2017 DigiDNA - www.digidna.net 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | /*! 26 | * @header AppInstaller.h 27 | * @copyright (c) 2017, Jean-David Gadina - www.xs-labs.com / www.imazing.com 28 | * @discussion Adapted from "LetsMove" by PotionFactory: 29 | * https://github.com/potionfactory/LetsMove 30 | */ 31 | 32 | @import Cocoa; 33 | 34 | NS_ASSUME_NONNULL_BEGIN 35 | 36 | typedef NS_ENUM( NSInteger, AppInstallerStatus ) 37 | { 38 | AppInstallerStatusNoInstallNecessary = 0x00, 39 | AppInstallerStatusInstallSucessfull = 0x01, 40 | AppInstallerStatusInstallError = 0x02 41 | }; 42 | 43 | @interface AppInstaller: NSObject 44 | 45 | + ( AppInstallerStatus )installIfNecessary; 46 | 47 | @end 48 | 49 | NS_ASSUME_NONNULL_END 50 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/AppInstaller.m: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2017 DigiDNA - www.digidna.net 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | /*! 26 | * @file AppInstaller.m 27 | * @copyright (c) 2017, Jean-David Gadina - www.xs-labs.com / www.imazing.com 28 | * @discussion Adapted from "LetsMove" by PotionFactory: 29 | * https://github.com/potionfactory/LetsMove 30 | */ 31 | 32 | #import "AppInstaller.h" 33 | 34 | static NSString * const AlertSuppressKey = @"AppInstallerAlertSuppressKey"; 35 | 36 | NS_ASSUME_NONNULL_BEGIN 37 | 38 | @interface AppInstaller() 39 | 40 | + ( BOOL )isInApplicationsFolder; 41 | + ( BOOL )isInDMG; 42 | + ( BOOL )isWriteable; 43 | + ( nullable NSString * )installPath; 44 | + ( BOOL )moveToTrash: ( NSString * )path; 45 | + ( void )displayError; 46 | + ( NSString * )appName; 47 | 48 | @end 49 | 50 | NS_ASSUME_NONNULL_END 51 | 52 | @implementation AppInstaller 53 | 54 | + ( AppInstallerStatus )installIfNecessary 55 | { 56 | NSString * installDir; 57 | NSString * installPath; 58 | 59 | /* Don't show again */ 60 | if( [ [ NSUserDefaults standardUserDefaults ] boolForKey: AlertSuppressKey ] && [ AppInstaller isInDMG ] == NO ) 61 | { 62 | return AppInstallerStatusNoInstallNecessary; 63 | } 64 | 65 | /* Already installed */ 66 | if( [ AppInstaller isInApplicationsFolder ] ) 67 | { 68 | return AppInstallerStatusNoInstallNecessary; 69 | } 70 | 71 | /* Don't propose to move if we cannot remove the original app (if not in a DMG) */ 72 | if( [ AppInstaller isInDMG ] == NO && [ AppInstaller isWriteable ] == NO ) 73 | { 74 | return AppInstallerStatusNoInstallNecessary; 75 | } 76 | 77 | /* No valid install path */ 78 | if( ( installDir = [ AppInstaller installPath ] ) == nil ) 79 | { 80 | return AppInstallerStatusInstallError; 81 | } 82 | 83 | /* Final location */ 84 | installPath = [ installDir stringByAppendingPathComponent: [ [ [ NSBundle mainBundle ] bundlePath ] lastPathComponent ] ]; 85 | 86 | /* Existing app */ 87 | if( [ [ NSFileManager defaultManager ] fileExistsAtPath: installPath ] ) 88 | { 89 | { 90 | NSRunningApplication * app; 91 | 92 | for( app in [ [ NSWorkspace sharedWorkspace ] runningApplications ] ) 93 | { 94 | /* App is already running */ 95 | if( [ app.bundleURL.path isEqualToString: installPath ] ) 96 | { 97 | { 98 | NSAlert * alert; 99 | 100 | alert = [ NSAlert new ]; 101 | 102 | alert.messageText = [ NSString stringWithFormat: NSLocalizedString( @"%@ is already running", @"" ), [ AppInstaller appName ] ]; 103 | alert.informativeText = [ NSString stringWithFormat: NSLocalizedString( @"Another version of %@ is already running. In order to install this version, please quit the other one or restart your Mac and try again.", @"" ), [ AppInstaller appName ] ]; 104 | 105 | [ alert addButtonWithTitle: NSLocalizedString( @"OK", @"" ) ]; 106 | [ alert runModal ]; 107 | [ NSApp terminate: nil ]; 108 | } 109 | 110 | return AppInstallerStatusInstallError; 111 | } 112 | } 113 | } 114 | } 115 | 116 | { 117 | NSAlert * alert; 118 | 119 | if( [ NSApp isActive ] == NO ) 120 | { 121 | [ NSApp activateIgnoringOtherApps: YES ]; 122 | } 123 | 124 | alert = [ NSAlert new ]; 125 | alert.messageText = [ NSString stringWithFormat: NSLocalizedString( @"Install %@ in your \"Applications\" Folder?", @"" ), [ AppInstaller appName ] ]; 126 | alert.informativeText = [ NSString stringWithFormat: NSLocalizedString( @"%@ will now be installed in your \"Applications\" folder.", @"" ), [ AppInstaller appName ] ]; 127 | 128 | if( [ AppInstaller isInDMG ] == NO ) 129 | { 130 | alert.showsSuppressionButton = YES; 131 | } 132 | 133 | [ alert addButtonWithTitle: NSLocalizedString( @"Install", @"" ) ]; 134 | [ alert addButtonWithTitle: NSLocalizedString( @"Later", @"" ) ]; 135 | 136 | /* Don't move */ 137 | if( [ alert runModal ] != NSAlertFirstButtonReturn ) 138 | { 139 | if( [ AppInstaller isInDMG ] == NO ) 140 | { 141 | [ [ NSUserDefaults standardUserDefaults ] setBool: alert.suppressionButton.state == NSOnState forKey: AlertSuppressKey ]; 142 | [ [ NSUserDefaults standardUserDefaults ] synchronize ]; 143 | } 144 | 145 | return AppInstallerStatusInstallError; 146 | } 147 | } 148 | 149 | /* Do we need admin rights? */ 150 | if( [ [ NSFileManager defaultManager ] isWritableFileAtPath: installDir ] ) 151 | { 152 | /* Existing app */ 153 | if( [ [ NSFileManager defaultManager ] fileExistsAtPath: installPath ] ) 154 | { 155 | /* Trashes the existing app */ 156 | if( [ AppInstaller moveToTrash: installPath ] == NO ) 157 | { 158 | [ AppInstaller displayError ]; 159 | 160 | return AppInstallerStatusInstallError; 161 | } 162 | } 163 | 164 | /* Copies the new app */ 165 | if( [ [ NSFileManager defaultManager ] copyItemAtPath: [ [ NSBundle mainBundle ] bundlePath ] toPath: installPath error: NULL ] == NO ) 166 | { 167 | [ AppInstaller displayError ]; 168 | 169 | return AppInstallerStatusInstallError; 170 | } 171 | } 172 | else 173 | { 174 | if 175 | ( 176 | [ installPath hasSuffix: @".app" ] == NO 177 | || [ [ installPath stringByTrimmingCharactersInSet: [ NSCharacterSet whitespaceCharacterSet ] ] length ] == 0 178 | || [ [ installPath stringByTrimmingCharactersInSet: [ NSCharacterSet whitespaceCharacterSet ] ] length ] == 0 179 | ) 180 | { 181 | [ AppInstaller displayError ]; 182 | 183 | return AppInstallerStatusInstallError; 184 | } 185 | 186 | { 187 | OSStatus status; 188 | AuthorizationFlags flags; 189 | AuthorizationItem item; 190 | AuthorizationRights rights; 191 | AuthorizationRef authorizationRef; 192 | int pid; 193 | int exit; 194 | 195 | flags = kAuthorizationFlagDefaults; 196 | status = AuthorizationCreate 197 | ( 198 | NULL, 199 | kAuthorizationEmptyEnvironment, 200 | flags, 201 | &authorizationRef 202 | ); 203 | 204 | memset( &item, 0, sizeof( AuthorizationItem ) ); 205 | 206 | if( status != errAuthorizationSuccess ) 207 | { 208 | [ AppInstaller displayError ]; 209 | 210 | return AppInstallerStatusInstallError; 211 | } 212 | 213 | item.name = kAuthorizationRightExecute; 214 | rights.count = 1; 215 | rights.items = &item; 216 | 217 | flags = kAuthorizationFlagDefaults 218 | | kAuthorizationFlagInteractionAllowed 219 | | kAuthorizationFlagPreAuthorize 220 | | kAuthorizationFlagExtendRights; 221 | status = AuthorizationCopyRights 222 | ( 223 | authorizationRef, 224 | &rights, 225 | NULL, 226 | flags, 227 | NULL 228 | ); 229 | 230 | if( status != errAuthorizationSuccess ) 231 | { 232 | [ AppInstaller displayError ]; 233 | 234 | return AppInstallerStatusInstallError; 235 | } 236 | 237 | flags = kAuthorizationFlagDefaults; 238 | 239 | /* Existing app */ 240 | if( [ [ NSFileManager defaultManager ] fileExistsAtPath: installPath ] ) 241 | { 242 | { 243 | OSStatus err; 244 | char * args[ 3 ]; 245 | 246 | args[ 0 ] = "-rf"; 247 | args[ 1 ] = strdup( installPath.UTF8String ); 248 | args[ 2 ] = NULL; 249 | 250 | #pragma clang diagnostic push 251 | #pragma clang diagnostic ignored "-Wdeprecated-declarations" 252 | 253 | err = AuthorizationExecuteWithPrivileges 254 | ( 255 | authorizationRef, 256 | "/bin/rm", 257 | flags, 258 | args, 259 | NULL 260 | ); 261 | 262 | pid = wait( &exit ); 263 | 264 | if( pid == -1 || WIFEXITED( exit ) == 0 ) 265 | { 266 | free( args[ 1 ] ); 267 | 268 | [ AppInstaller displayError ]; 269 | 270 | return AppInstallerStatusInstallError; 271 | } 272 | 273 | free( args[ 1 ] ); 274 | 275 | #pragma clang diagnostic pop 276 | 277 | if( err != errAuthorizationSuccess ) 278 | { 279 | [ AppInstaller displayError ]; 280 | 281 | return AppInstallerStatusInstallError; 282 | } 283 | } 284 | } 285 | 286 | { 287 | OSStatus err; 288 | char * args[ 4 ]; 289 | 290 | args[ 0 ] = "-rf"; 291 | args[ 1 ] = strdup( [ [ NSBundle mainBundle ] bundlePath ].UTF8String ); 292 | args[ 2 ] = strdup( installPath.UTF8String ); 293 | args[ 3 ] = NULL; 294 | 295 | #pragma clang diagnostic push 296 | #pragma clang diagnostic ignored "-Wdeprecated-declarations" 297 | 298 | err = AuthorizationExecuteWithPrivileges 299 | ( 300 | authorizationRef, 301 | "/bin/cp", 302 | flags, 303 | args, 304 | NULL 305 | ); 306 | 307 | pid = wait( &exit ); 308 | 309 | if( pid == -1 || WIFEXITED( exit ) == 0 ) 310 | { 311 | free( args[ 1 ] ); 312 | free( args[ 2 ] ); 313 | 314 | [ AppInstaller displayError ]; 315 | 316 | return AppInstallerStatusInstallError; 317 | } 318 | 319 | free( args[ 1 ] ); 320 | free( args[ 2 ] ); 321 | 322 | #pragma clang diagnostic pop 323 | 324 | if( err != errAuthorizationSuccess ) 325 | { 326 | [ AppInstaller displayError ]; 327 | 328 | return AppInstallerStatusInstallError; 329 | } 330 | } 331 | } 332 | } 333 | 334 | if( [ AppInstaller isInDMG ] == NO ) 335 | { 336 | /* Moves the original app to the trash */ 337 | [ AppInstaller moveToTrash: [ [ NSBundle mainBundle ] bundlePath ] ]; 338 | } 339 | 340 | [ [ NSWorkspace sharedWorkspace ] openFile: installPath ]; 341 | [ NSApp terminate: nil ]; 342 | 343 | return AppInstallerStatusInstallSucessfull; 344 | } 345 | 346 | + ( BOOL )isInApplicationsFolder 347 | { 348 | NSArray * paths; 349 | NSString * path; 350 | 351 | paths = NSSearchPathForDirectoriesInDomains( NSApplicationDirectory, NSAllDomainsMask, YES ); 352 | 353 | /* All Applications directories */ 354 | for( path in paths ) 355 | { 356 | /* App is in an application directory */ 357 | if( [ [ [ NSBundle mainBundle ] bundlePath ] hasPrefix: path ] ) 358 | { 359 | return YES; 360 | } 361 | } 362 | 363 | return NO; 364 | } 365 | 366 | + ( BOOL )isInDMG 367 | { 368 | return [ [ [ NSBundle mainBundle ] bundlePath ] hasPrefix: @"/Volumes/ISOBMFF-Explorer" ]; 369 | } 370 | 371 | + ( BOOL )isWriteable 372 | { 373 | return [ [ NSFileManager defaultManager ] isWritableFileAtPath: [ [ NSBundle mainBundle ] bundlePath ] ]; 374 | } 375 | 376 | + ( nullable NSString * )installPath 377 | { 378 | NSArray * paths; 379 | BOOL isDir; 380 | 381 | paths = NSSearchPathForDirectoriesInDomains( NSApplicationDirectory, NSLocalDomainMask, YES ); 382 | 383 | if( paths.count && [ [ NSFileManager defaultManager ] fileExistsAtPath: ( id )( paths.lastObject ) isDirectory: &isDir ] && isDir ) 384 | { 385 | return paths.lastObject; 386 | } 387 | 388 | return nil; 389 | } 390 | 391 | + ( BOOL )moveToTrash: ( NSString * )path 392 | { 393 | volatile __block BOOL result; 394 | volatile __block BOOL complete; 395 | 396 | result = NO; 397 | complete = NO; 398 | 399 | [ [ NSWorkspace sharedWorkspace ] recycleURLs: @[ [ NSURL fileURLWithPath: path ] ] 400 | completionHandler: ^( NSDictionary * _Nonnull newURLs, NSError * _Nullable error ) 401 | { 402 | ( void )newURLs; 403 | 404 | result = ( error == nil ); 405 | complete = YES; 406 | } 407 | ]; 408 | 409 | while( complete == NO ) 410 | { 411 | [ [ NSRunLoop mainRunLoop ] runUntilDate: [ NSDate dateWithTimeIntervalSinceNow: 0.1 ] ]; 412 | } 413 | 414 | return result; 415 | } 416 | 417 | + ( void )displayError 418 | { 419 | NSAlert * alert; 420 | 421 | alert = [ NSAlert new ]; 422 | alert.messageText = NSLocalizedString( @"Could not move to \"Applications\" Folder", @"" ); 423 | alert.informativeText = [ NSString stringWithFormat: NSLocalizedString( @"If another version of %@ is installed on your computer, please delete it from your \"Applications\" folder and try again.", @"" ), [ AppInstaller appName ] ]; 424 | 425 | [ alert addButtonWithTitle: NSLocalizedString( @"OK", @"" ) ]; 426 | [ alert runModal ]; 427 | } 428 | 429 | + ( NSString * )appName 430 | { 431 | return [ [ NSBundle mainBundle ] objectForInfoDictionaryKey: @"CFBundleName" ]; 432 | } 433 | 434 | @end 435 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/ApplicationDelegate.swift: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2017 DigiDNA - www.digidna.net 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | import Cocoa 26 | 27 | #if APPSTORE 28 | #else 29 | import GitHubUpdates 30 | #endif 31 | 32 | @NSApplicationMain class ApplicationDelegate: NSObject, NSApplicationDelegate 33 | { 34 | #if APPSTORE 35 | #else 36 | @objc private dynamic var updater: GitHubUpdater? 37 | #endif 38 | 39 | @objc @IBOutlet private dynamic var updateMenuItem: NSMenuItem? 40 | 41 | @objc private dynamic var aboutWindowController: AboutWindowController? 42 | @objc private dynamic var controllers: [ FileWindowController ] = [] 43 | 44 | @objc private func windowWillClose( _ notification: Notification ) 45 | { 46 | let window = notification.object as! NSWindow 47 | 48 | for controller in self.controllers 49 | { 50 | if( controller.window == window ) 51 | { 52 | self.controllers = self.controllers.filter { controller != $0 } 53 | 54 | break; 55 | } 56 | } 57 | } 58 | 59 | // MARK: NSApplicationDelegate 60 | 61 | func applicationDidFinishLaunching( _ notification: Notification ) 62 | { 63 | 64 | #if APPSTORE 65 | 66 | self.updateMenuItem?.isHidden = true 67 | 68 | #else 69 | 70 | AppInstaller.installIfNecessary() 71 | 72 | self.updater = GitHubUpdater() 73 | self.updater?.user = "DigiDNA" 74 | self.updater?.repository = "ISOBMFF-Explorer" 75 | self.updateMenuItem?.target = self.updater 76 | self.updateMenuItem?.action = #selector( self.updater?.checkForUpdates( _ : ) ) 77 | 78 | self.updater?.checkForUpdatesInBackground() 79 | 80 | Timer.scheduledTimer( withTimeInterval: 3600, repeats: true ) 81 | { 82 | ( timer: Timer ) -> Void in 83 | 84 | self.updater?.checkForUpdatesInBackground() 85 | } 86 | 87 | #endif 88 | 89 | self.openDocument( nil ) 90 | } 91 | 92 | // MARK: Actions 93 | 94 | @IBAction public func showAboutWindow( _ sender: Any? ) 95 | { 96 | if( self.aboutWindowController == nil ) 97 | { 98 | self.aboutWindowController = AboutWindowController() 99 | } 100 | 101 | if( self.aboutWindowController?.window?.isVisible == false ) 102 | { 103 | self.aboutWindowController?.window?.center() 104 | } 105 | 106 | self.aboutWindowController?.window?.makeKeyAndOrderFront( sender ) 107 | } 108 | 109 | @IBAction public func openDocument( _ sender: Any? ) 110 | { 111 | let panel = NSOpenPanel() 112 | 113 | panel.canChooseDirectories = false 114 | panel.canCreateDirectories = false 115 | panel.canChooseFiles = true 116 | panel.allowsMultipleSelection = true 117 | 118 | if( panel.runModal() != .OK ) 119 | { 120 | return 121 | } 122 | 123 | for url in panel.urls 124 | { 125 | let controller = FileWindowController( url: url ) 126 | 127 | NotificationCenter.default.addObserver( self, selector: #selector( windowWillClose( _: ) ), name: NSWindow.willCloseNotification, object: controller.window ) 128 | self.controllers.append( controller ) 129 | controller.window?.center() 130 | controller.showWindow( nil ) 131 | } 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/BoxItem.h: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2017 DigiDNA - www.digidna.net 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | #import 26 | 27 | NS_ASSUME_NONNULL_BEGIN 28 | 29 | @interface BoxItem: NSObject 30 | 31 | @property( atomic, readonly ) BOOL isLeaf; 32 | @property( atomic, readonly ) NSString * name; 33 | @property( atomic, readonly ) NSString * index; 34 | @property( atomic, readonly ) NSImage * icon; 35 | @property( atomic, readonly ) NSArray< BoxItem * > * children; 36 | @property( atomic, readonly ) NSDictionary< NSString *, NSString * > * properties; 37 | @property( atomic, readonly, nullable ) NSString * data; 38 | @property( atomic, readonly, nullable ) NSString * asciiData; 39 | 40 | - ( instancetype )initWithURL: ( nullable NSURL * )url; 41 | - ( void )setPredicate: ( nullable NSPredicate * )predicate; 42 | 43 | @end 44 | 45 | NS_ASSUME_NONNULL_END 46 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/BoxItem.mm: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2017 DigiDNA - www.digidna.net 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | #import "BoxItem.h" 26 | #import 27 | 28 | NS_ASSUME_NONNULL_BEGIN 29 | 30 | @interface BoxItem() 31 | 32 | @property( atomic, readwrite, assign ) BOOL isLeaf; 33 | @property( atomic, readwrite, weak ) BoxItem * parent; 34 | @property( atomic, readwrite, strong ) NSString * name; 35 | @property( atomic, readwrite, strong ) NSString * index; 36 | @property( atomic, readwrite, strong ) NSImage * icon; 37 | @property( atomic, readwrite, strong ) NSArray< BoxItem * > * children; 38 | @property( atomic, readwrite, strong ) NSMutableArray< BoxItem * > * allChildren; 39 | @property( atomic, readwrite, strong ) NSMutableDictionary< NSString *, NSString * > * mutableProperties; 40 | @property( atomic, readwrite, strong, nullable ) NSString * data; 41 | @property( atomic, readwrite, strong, nullable ) NSString * asciiData; 42 | 43 | - ( instancetype )initWithObject: ( std::shared_ptr< ISOBMFF::DisplayableObject > )box parent: ( nullable BoxItem * )parent NS_DESIGNATED_INITIALIZER; 44 | - ( NSString * )buildIndex; 45 | - ( void )setDataBytes: ( const std::vector< uint8_t > & )bytes; 46 | 47 | @end 48 | 49 | NS_ASSUME_NONNULL_END 50 | 51 | @implementation BoxItem 52 | 53 | - ( instancetype )init 54 | { 55 | return [ self initWithObject: nullptr parent: nil ]; 56 | } 57 | 58 | - ( instancetype )initWithURL: ( nullable NSURL * )url 59 | { 60 | ISOBMFF::Parser parser; 61 | 62 | try 63 | { 64 | parser.AddOption( ISOBMFF::Parser::Options::SkipMDATData ); 65 | parser.Parse( url.path.UTF8String ); 66 | } 67 | catch( ... ) 68 | {} 69 | 70 | if( ( self = [ self initWithObject: parser.GetFile() parent: nil ] ) ) 71 | { 72 | if( url.path.lastPathComponent.length > 0 ) 73 | { 74 | self.name = url.path.lastPathComponent; 75 | self.icon = [ [ NSWorkspace sharedWorkspace ] iconForFile: url.path ]; 76 | } 77 | } 78 | 79 | return self; 80 | } 81 | 82 | - ( instancetype )initWithObject: ( std::shared_ptr< ISOBMFF::DisplayableObject > )object parent: ( nullable BoxItem * )parent 83 | { 84 | if( ( self = [ super init ] ) ) 85 | { 86 | self.isLeaf = YES; 87 | self.allChildren = [ NSMutableArray new ]; 88 | self.mutableProperties = [ NSMutableDictionary new ]; 89 | self.icon = [ [ NSWorkspace sharedWorkspace ] iconForFileType: @"pkg" ]; 90 | self.parent = parent; 91 | 92 | if( object == nullptr ) 93 | { 94 | self.name = @""; 95 | } 96 | else 97 | { 98 | self.name = [ NSString stringWithUTF8String: object->GetName().c_str() ]; 99 | 100 | if( std::dynamic_pointer_cast< ISOBMFF::Container >( object ) != nullptr ) 101 | { 102 | self.isLeaf = NO; 103 | 104 | if( std::dynamic_pointer_cast< ISOBMFF::ContainerBox >( object ) != nullptr ) 105 | { 106 | self.icon = [ NSImage imageNamed: NSImageNameFolder ]; 107 | } 108 | 109 | for( const auto & sub: std::dynamic_pointer_cast< ISOBMFF::Container >( object )->GetBoxes() ) 110 | { 111 | [ self.allChildren addObject: [ [ BoxItem alloc ] initWithObject: sub parent: self ] ]; 112 | } 113 | } 114 | 115 | if( std::dynamic_pointer_cast< ISOBMFF::DisplayableObjectContainer >( object ) != nullptr ) 116 | { 117 | self.isLeaf = NO; 118 | 119 | for( const auto & sub: std::dynamic_pointer_cast< ISOBMFF::DisplayableObjectContainer >( object )->GetDisplayableObjects() ) 120 | { 121 | [ self.allChildren addObject: [ [ BoxItem alloc ] initWithObject: sub parent: self ] ]; 122 | } 123 | } 124 | 125 | if( std::dynamic_pointer_cast< ISOBMFF::Box >( object ) != nullptr ) 126 | { 127 | [ self setDataBytes: std::dynamic_pointer_cast< ISOBMFF::Box >( object )->GetData() ]; 128 | } 129 | 130 | for( const auto & p: object->GetDisplayableProperties() ) 131 | { 132 | { 133 | NSString * k; 134 | NSString * v; 135 | 136 | k = [ NSString stringWithUTF8String: p.first.c_str() ]; 137 | v = [ NSString stringWithUTF8String: p.second.c_str() ]; 138 | 139 | [ self.mutableProperties setObject: v forKey: k ]; 140 | } 141 | } 142 | 143 | self.children = self.allChildren.copy; 144 | self.index = [ self buildIndex ]; 145 | } 146 | } 147 | 148 | return self; 149 | } 150 | 151 | - ( NSDictionary< NSString *, NSString * > * )properties 152 | { 153 | return self.mutableProperties.copy; 154 | } 155 | 156 | - ( void )setPredicate: ( nullable NSPredicate * )predicate 157 | { 158 | BoxItem * child; 159 | 160 | for( child in self.allChildren ) 161 | { 162 | [ child setPredicate: predicate ]; 163 | } 164 | 165 | if( predicate == nil ) 166 | { 167 | self.children = self.allChildren.copy; 168 | } 169 | else 170 | { 171 | self.children = [ self.allChildren filteredArrayUsingPredicate: ( NSPredicate * )predicate ]; 172 | } 173 | } 174 | 175 | - ( NSString * )buildIndex 176 | { 177 | NSMutableString * index; 178 | BoxItem * child; 179 | BoxItem * parent; 180 | NSDictionary * props; 181 | NSString * k; 182 | 183 | index = self.name.mutableCopy; 184 | 185 | for( child in self.allChildren ) 186 | { 187 | [ index appendFormat: @" %@", child.index ]; 188 | } 189 | 190 | props = self.properties; 191 | 192 | for( k in props ) 193 | { 194 | [ index appendFormat: @" %@ %@", k, [ props objectForKey: k ] ]; 195 | } 196 | 197 | parent = self.parent; 198 | 199 | while( parent != nil ) 200 | { 201 | [ index appendFormat: @" %@", parent.name ]; 202 | 203 | parent = parent.parent; 204 | } 205 | 206 | return index.copy; 207 | } 208 | 209 | - ( void )setDataBytes: ( const std::vector< uint8_t > & )bytes 210 | { 211 | NSMutableString * data; 212 | NSMutableString * ascii; 213 | 214 | if( bytes.size() == 0 ) 215 | { 216 | return; 217 | } 218 | 219 | data = [ NSMutableString new ]; 220 | ascii = [ NSMutableString new ]; 221 | 222 | for( const auto & b: bytes ) 223 | { 224 | [ data appendFormat: @"%02X ", b ]; 225 | [ ascii appendFormat: @"%c", ( isprint( b ) && !isspace( b ) ) ? b : '.' ]; 226 | } 227 | 228 | [ data deleteCharactersInRange: NSMakeRange( data.length - 1, 1 ) ]; 229 | 230 | self.data = data.copy; 231 | self.asciiData = ascii.copy; 232 | } 233 | 234 | @end 235 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/Bridging-Header.h: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2017 DigiDNA - www.digidna.net 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | /*! 26 | * @header Bridging-Header.h 27 | * @copyright (c) 2017, Jean-David Gadina - www.xs-labs.com / www.imazing.com 28 | */ 29 | 30 | #import "BoxItem.h" 31 | 32 | #ifndef APPSTORE 33 | #include "AppInstaller.h" 34 | #endif 35 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/DictionaryIsEmptyValueTransformer.swift: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2017 DigiDNA - www.digidna.net 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | import Cocoa 26 | 27 | @objc public class DictionaryIsEmptyValueTransformer: ValueTransformer 28 | { 29 | public override class func transformedValueClass() -> Swift.AnyClass 30 | { 31 | return NSNumber.self 32 | } 33 | 34 | public override class func allowsReverseTransformation() -> Bool 35 | { 36 | return false 37 | } 38 | 39 | public override func transformedValue( _ value: Any? ) -> Any? 40 | { 41 | guard let dict = value as! NSDictionary? else 42 | { 43 | return NSNumber( booleanLiteral: true ) 44 | } 45 | 46 | return NSNumber( booleanLiteral: ( dict.count > 0 ) ? false : true ) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/DictionaryIsNotEmptyValueTransformer.swift: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2017 DigiDNA - www.digidna.net 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | import Cocoa 26 | 27 | @objc public class DictionaryIsNotEmptyValueTransformer: ValueTransformer 28 | { 29 | public override class func transformedValueClass() -> Swift.AnyClass 30 | { 31 | return NSNumber.self 32 | } 33 | 34 | public override class func allowsReverseTransformation() -> Bool 35 | { 36 | return false 37 | } 38 | 39 | public override func transformedValue( _ value: Any? ) -> Any? 40 | { 41 | guard let dict = value as! NSDictionary? else 42 | { 43 | return NSNumber( booleanLiteral: false ) 44 | } 45 | 46 | return NSNumber( booleanLiteral: ( dict.count > 0 ) ? true : false ) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/FileWindowController.swift: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2017 DigiDNA - www.digidna.net 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | import Cocoa 26 | 27 | @objc class FileWindowController: NSWindowController, NSTextFieldDelegate 28 | { 29 | @objc private dynamic var url: URL? 30 | @objc private dynamic var file: String? 31 | @objc private dynamic var icon: NSImage? 32 | @objc private dynamic var box: BoxItem? 33 | 34 | @objc private dynamic var loading: Bool = false 35 | @objc private dynamic var showASCIIData: Bool = false 36 | 37 | @objc @IBOutlet private dynamic var outlineView: NSOutlineView? 38 | @objc @IBOutlet private dynamic var treeController: NSTreeController? 39 | @objc @IBOutlet private dynamic var dictionaryController: NSDictionaryController? 40 | @objc @IBOutlet private dynamic var searchField: NSSearchField? 41 | @objc @IBOutlet private dynamic var dataTextView: NSTextView? 42 | @objc @IBOutlet private dynamic var asciiTextView: NSTextView? 43 | 44 | convenience init( url: URL ) 45 | { 46 | self.init() 47 | 48 | self.url = url 49 | self.file = ( url.path as NSString ).lastPathComponent 50 | self.icon = NSWorkspace.shared.icon( forFile: url.path ) 51 | } 52 | 53 | override var windowNibName: NSNib.Name? 54 | { 55 | return NSNib.Name( NSStringFromClass( type( of: self ) ) ) 56 | } 57 | 58 | override func windowDidLoad() 59 | { 60 | super.windowDidLoad() 61 | 62 | self.window?.title = self.file ?? "" 63 | self.dictionaryController?.sortDescriptors = [ NSSortDescriptor( key: "key", ascending: true ) ] 64 | 65 | guard let url = self.url else 66 | { 67 | return 68 | } 69 | 70 | self.loading = true 71 | 72 | DispatchQueue.global( qos: .userInitiated ).async 73 | { 74 | let box = BoxItem( url: url ) 75 | 76 | DispatchQueue.main.async 77 | { 78 | self.box = box 79 | self.loading = false 80 | 81 | self.outlineView?.expandItem( self.outlineView?.item( atRow: 0 ) ) 82 | } 83 | } 84 | 85 | for textView in [ self.dataTextView, self.asciiTextView ] 86 | { 87 | textView?.font = NSFont.userFixedPitchFont( ofSize: 12 ) 88 | textView?.textContainerInset = NSSize( width: 10, height: 10 ) 89 | } 90 | } 91 | 92 | // MARK: NSTextFieldDelegate 93 | 94 | func controlTextDidChange( _ obj: Notification ) 95 | { 96 | if( self.searchField?.stringValue.count == 0 ) 97 | { 98 | self.box?.setPredicate( nil ) 99 | } 100 | else 101 | { 102 | self.box?.setPredicate( NSPredicate( format: "index contains[c] %@", argumentArray: [ self.searchField?.stringValue as Any ] ) ) 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/StringIsEmptyValueTransformer.swift: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2017 DigiDNA - www.digidna.net 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | import Cocoa 26 | 27 | @objc public class StringIsEmptyValueTransformer: ValueTransformer 28 | { 29 | public override class func transformedValueClass() -> Swift.AnyClass 30 | { 31 | return NSNumber.self 32 | } 33 | 34 | public override class func allowsReverseTransformation() -> Bool 35 | { 36 | return false 37 | } 38 | 39 | public override func transformedValue( _ value: Any? ) -> Any? 40 | { 41 | guard let str = value as! NSString? else 42 | { 43 | return NSNumber( booleanLiteral: true ) 44 | } 45 | 46 | return NSNumber( booleanLiteral: ( str.length > 0 ) ? false : true ) 47 | } 48 | } 49 | 50 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Classes/StringIsNotEmptyValueTransformer.swift: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2017 DigiDNA - www.digidna.net 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | ******************************************************************************/ 24 | 25 | import Cocoa 26 | 27 | @objc public class StringIsNotEmptyValueTransformer: ValueTransformer 28 | { 29 | public override class func transformedValueClass() -> Swift.AnyClass 30 | { 31 | return NSNumber.self 32 | } 33 | 34 | public override class func allowsReverseTransformation() -> Bool 35 | { 36 | return false 37 | } 38 | 39 | public override func transformedValue( _ value: Any? ) -> Any? 40 | { 41 | guard let str = value as! NSString? else 42 | { 43 | return NSNumber( booleanLiteral: false ) 44 | } 45 | 46 | return NSNumber( booleanLiteral: ( str.length > 0 ) ? true : false ) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/ISOBMFF-Explorer.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | Icon.icns 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0.4 21 | CFBundleVersion 22 | 38 23 | LSApplicationCategoryType 24 | public.app-category.utilities 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | MDItemKeywords 28 | image, video, iso, media, file, format, mpeg, mp4, heif, heiv, heic, parser, quicktime, gui 29 | NSHumanReadableCopyright 30 | Copyright © 2020 DigiDNA. All rights reserved. 31 | NSMainNibFile 32 | MainMenu 33 | NSPrincipalClass 34 | NSApplication 35 | 36 | 37 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Interface/Base.lproj/ISOBMFF_Explorer.AboutWindowController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Interface/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | Default 531 | 532 | 533 | 534 | 535 | 536 | 537 | Left to Right 538 | 539 | 540 | 541 | 542 | 543 | 544 | Right to Left 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | Default 556 | 557 | 558 | 559 | 560 | 561 | 562 | Left to Right 563 | 564 | 565 | 566 | 567 | 568 | 569 | Right to Left 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | -------------------------------------------------------------------------------- /ISOBMFF-Explorer/Interface/Images/Icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DigiDNA/ISOBMFF-Explorer/c5b7de11785c82a6547da93fdd37a13fac12fea7/ISOBMFF-Explorer/Interface/Images/Icon.icns -------------------------------------------------------------------------------- /Installer/Background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DigiDNA/ISOBMFF-Explorer/c5b7de11785c82a6547da93fdd37a13fac12fea7/Installer/Background.png -------------------------------------------------------------------------------- /Installer/DMG.dmgCanvas/Disk Image: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DigiDNA/ISOBMFF-Explorer/c5b7de11785c82a6547da93fdd37a13fac12fea7/Installer/DMG.dmgCanvas/Disk Image -------------------------------------------------------------------------------- /Installer/DMG.dmgCanvas/QuickLook/Preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DigiDNA/ISOBMFF-Explorer/c5b7de11785c82a6547da93fdd37a13fac12fea7/Installer/DMG.dmgCanvas/QuickLook/Preview.jpg -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 DigiDNA - www.digidna.net 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ISOBMFF-Explorer 2 | ================ 3 | 4 | [![Build Status](https://img.shields.io/github/workflow/status/DigiDNA/ISOBMFF-Explorer/ci-mac?label=macOS&logo=apple)](https://github.com/DigiDNA/ISOBMFF-Explorer/actions/workflows/ci-mac.yaml) 5 | [![Issues](http://img.shields.io/github/issues/DigiDNA/ISOBMFF-Explorer.svg?logo=github)](https://github.com/DigiDNA/ISOBMFF-Explorer/issues) 6 | ![Status](https://img.shields.io/badge/status-active-brightgreen.svg?logo=git) 7 | ![License](https://img.shields.io/badge/license-mit-brightgreen.svg?logo=open-source-initiative) 8 | [![Contact](https://img.shields.io/badge/follow-@digidna-blue.svg?logo=twitter&style=social)](https://twitter.com/digidna) 9 | 10 | Introspection utility for files in the ISO Base Media File Format 11 | ----------------------------------------------------------------- 12 | 13 | **ISOBMFF-Explorer** is a macOS utility that displays the structure and data of files conforming to the «ISO Base Media File Format» standard (ISO/IEC 14496-12). 14 | 15 | Such file formats include: 16 | 17 | - QuickTime (.mov) 18 | - MPEG-4 (.mp4, .m4v, .m4a, etc.) 19 | - HEIF/HEIC (.heif, .heic, etc.) 20 | - 3GP (.3gp) 21 | - ... 22 | 23 | ![Screenshot 1](Assets/Screen-1.png "Screenshot 1") 24 | 25 | License 26 | ------- 27 | 28 | **ISOBMFF-Explorer** is released under the terms of the MIT License. 29 | 30 | Repository Infos 31 | ---------------- 32 | 33 | Owner: DigiDNA 34 | Web: www.digidna.net 35 | Blog: imazing.com/blog 36 | Twitter: @DigiDNA 37 | GitHub: github.com/DigiDNA 38 | --------------------------------------------------------------------------------