Showing preview only (1,497K chars total). Download the full file or copy to clipboard to get everything.
Repository: BlueMatthew/WechatExporter
Branch: main
Commit: 8f8ce412fc57
Files: 187
Total size: 1.4 MB
Directory structure:
gitextract_4jypkpqy/
├── .gitignore
├── LICENSE
├── README.md
├── WechatExporter/
│ ├── AppConfiguration.h
│ ├── AppConfiguration.mm
│ ├── AppDelegate.h
│ ├── AppDelegate.mm
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── MainMenuCN.imageset/
│ │ │ └── Contents.json
│ │ └── MainMenuEN.imageset/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── Main.storyboard
│ ├── ExportNotifierImpl.h
│ ├── HttpHelper.h
│ ├── HttpHelper.mm
│ ├── Info.plist
│ ├── LICENSES/
│ │ ├── jsoncpp.LICENSE
│ │ ├── lame.LICENSE
│ │ ├── libcurl.COPYING
│ │ ├── libimobiledevice-glue.COPYING
│ │ ├── libimobiledevice.COPYING.LESSER
│ │ ├── libplist.COPYING.LESSER
│ │ ├── libusbmuxd.COPYING
│ │ ├── libxml2.Copyright
│ │ ├── opencore-amr.LICENSE
│ │ ├── openssl.LICENSE
│ │ └── protobuf.LICENSE
│ ├── LoggerImpl.h
│ ├── PdfConverterImpl.h
│ ├── SessionDataSource.h
│ ├── SessionDataSource.mm
│ ├── ViewController copy.mm
│ ├── ViewController.h
│ ├── ViewController.mm
│ ├── WechatExporter.entitlements
│ ├── core/
│ │ ├── AsyncExecutor.cpp
│ │ ├── AsyncExecutor.h
│ │ ├── AsyncTask.cpp
│ │ ├── AsyncTask.h
│ │ ├── ByteArrayLocater.h
│ │ ├── DownloadPool.cpp
│ │ ├── DownloadPool.h
│ │ ├── Downloader.cpp
│ │ ├── Downloader.h
│ │ ├── ExportContext.h
│ │ ├── ExportNotifier.h
│ │ ├── ExportOption.h
│ │ ├── Exporter.cpp
│ │ ├── Exporter.h
│ │ ├── FileSystem.cpp
│ │ ├── FileSystem.h
│ │ ├── IDeviceBackup.cpp
│ │ ├── IDeviceBackup.h
│ │ ├── ITunesParser.cpp
│ │ ├── ITunesParser.h
│ │ ├── Logger.h
│ │ ├── MMKVReader.h
│ │ ├── MbdbReader.h
│ │ ├── MessageParser.cpp
│ │ ├── MessageParser.h
│ │ ├── PdfConverter.h
│ │ ├── RawMessage.cpp
│ │ ├── RawMessage.h
│ │ ├── ResManager.cpp
│ │ ├── ResManager.h
│ │ ├── TaskManager.cpp
│ │ ├── TaskManager.h
│ │ ├── Template.cpp
│ │ ├── Template.h
│ │ ├── Updater.cpp
│ │ ├── Updater.h
│ │ ├── Utils.cpp
│ │ ├── Utils.h
│ │ ├── Utils_audio.cpp
│ │ ├── Utils_md5.cpp
│ │ ├── Utils_protobuf.cpp
│ │ ├── Utils_silk.cpp
│ │ ├── Utils_thread.cpp
│ │ ├── Utils_xml.cpp
│ │ ├── WechatObjects.h
│ │ ├── WechatParser.cpp
│ │ ├── WechatParser.h
│ │ ├── WechatSource.h
│ │ ├── XmlParser.cpp
│ │ ├── XmlParser.h
│ │ ├── endianness.h
│ │ ├── md5.c
│ │ ├── md5.h
│ │ └── semaphore.h
│ ├── en.lproj/
│ │ ├── Localizable.strings
│ │ └── Main.strings
│ ├── main.m
│ ├── res/
│ │ ├── emoji/
│ │ │ └── emoji.json
│ │ ├── en.txt
│ │ ├── templates/
│ │ │ ├── audio.html
│ │ │ ├── card.html
│ │ │ ├── channels.html
│ │ │ ├── emoji.html
│ │ │ ├── filter.html
│ │ │ ├── frame.html
│ │ │ ├── frame_filter.html
│ │ │ ├── image.html
│ │ │ ├── listframe.html
│ │ │ ├── listitem.html
│ │ │ ├── member.html
│ │ │ ├── members.html
│ │ │ ├── msg.html
│ │ │ ├── notice.html
│ │ │ ├── plainshare.html
│ │ │ ├── refermsg.html
│ │ │ ├── scripts.html
│ │ │ ├── share.html
│ │ │ ├── system.html
│ │ │ ├── thumb.html
│ │ │ ├── transfer.html
│ │ │ ├── video.html
│ │ │ ├── videonew.html
│ │ │ └── wxemoji.html
│ │ ├── templates_txt/
│ │ │ ├── audio.html
│ │ │ ├── card.html
│ │ │ ├── channels.html
│ │ │ ├── emoji.html
│ │ │ ├── frame.html
│ │ │ ├── image.html
│ │ │ ├── listframe.html
│ │ │ ├── listitem.html
│ │ │ ├── msg.html
│ │ │ ├── notice.html
│ │ │ ├── plainshare.html
│ │ │ ├── refermsg.html
│ │ │ ├── scripts.html
│ │ │ ├── share.html
│ │ │ ├── system.html
│ │ │ ├── thumb.html
│ │ │ ├── transfer.html
│ │ │ ├── video.html
│ │ │ └── wxemoji.html
│ │ └── zh-Hans.txt
│ └── zh-Hans.lproj/
│ ├── Localizable.strings
│ └── Main.strings
├── WechatExporter.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata/
│ └── xcschemes/
│ └── WechatExporter.xcscheme
├── WechatExporter.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── WechatExporterCmd/
│ ├── WechatExporter.cpp
│ └── WechatExporterCmd.h
├── WechatExporterCmd.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata/
│ └── xcschemes/
│ └── WechatExporterCmd.xcscheme
├── docs/
│ ├── index.html
│ └── update.conf
├── libplist.README.md
├── release
└── vcproject/
├── AboutDlg.h
├── AppConfiguration.cpp
├── AppConfiguration.h
├── BackupDlg.h
├── ColoredControls.h
├── Core.h
├── ExportNotifierImpl.h
├── ITunesDetector.h
├── LogListBox.h
├── LoggerImpl.h
├── MainFrm.h
├── PdfConverterImpl.h
├── ProgressListViewCtrl.h
├── TextProgressBarCtrl.h
├── ToolTipButton.h
├── VersionDetector.h
├── View.h
├── ViewHelper.cpp
├── ViewHelper.h
├── WechatExporter.cpp
├── WechatExporter.h
├── WechatExporter.rc
├── WechatExporter.sln
├── WechatExporter.vcxproj
├── WechatExporter.vcxproj.filters
├── WechatExporterCmd.cpp
├── WechatExporterCmd.vcxproj
├── WechatExporterCmd.vcxproj.filters
├── resource.h
├── stdafx.cpp
└── stdafx.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## User settings
xcuserdata/
## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
*.xcscmblueprint
*.xccheckout
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
release/
releases/
DerivedData/
*.moved-aside
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
## Obj-C/Swift specific
*.hmap
## App packaging
*.ipa
*.dSYM.zip
*.dSYM
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
#
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build/
# fastlane
#
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode
iOSInjectionProject/
.DS_Store
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
================================================
FILE: README.md
================================================
# WechatExporter
> **BUG!!! 1.8.0.7以前的版本异步加载方式存在一个比较严重的小白bug:当设置为滚动到页面底部异步加载时,越靠后面的页码,加载的消息数量越少;设置为页面打开全部消息异步加载时,消息只能加载到一半。如果iTunes备份还存在,请使用版本1.8.0.8重新导出一遍。如果过往的备份已经清除了,可以下载补丁程序[Win64版本](https://github.com/BlueMatthew/WechatExporter/releases/download/v1.8.0.8/patch_x64_win.zip)/[MacOS 64版本](https://github.com/BlueMatthew/WechatExporter/releases/download/v1.8.0.8/patch_x64_macos.zip)并解压,把wxexpatch.exe/wxexppatch拷贝到导出目录,并执行,来修复已经导出的页面(补丁修复的文件清单可查看日志文件 patch.log)。**
本程序参考 https://github.com/stomakun/WechatExport-iOS 修改成C++来实现,便于在各个平台以更少依赖运行。同时增加了聊天群名称的解析支持和更多消息类型的导出支持。导出支持Text、HTML、PDF三种格式。
- 导出的聊天记录页面可以设置为打开时一次性加载完成(默认方式)、打开时异步加载、页面滑动到底部时加载更多三种方式,可以在菜单“选项”中修改加载方式。
- 可以在导出的页面增加过滤功能,功能也需要在菜单“选项”中设置。
- PDF格式,实质是导出打开时一次性加载完成的HTML页面,然后通过Google Chrome或者Microsoft Edge浏览器的功能转成PDF文件,转PDF文件耗时较长,请不要关闭自动弹出的命令行窗口。
- 增量导出:菜单“选项”中,如果设置了增量导出,则会仅仅导出上一次导出的最后一条消息之后的部分,通过此功能,再一次备份之后,微信中的聊天记录可以删除,下一次导出,可以把同一个聊天群的消息合并在一起。
## 操作步骤:
1. 通过iTunes将手机备份到电脑上(备份时不要选择设置口令),Windows操作系统一般位于目录:C:\用户[用户名]\AppData\Roaming\Apple Computer\MobileSync\Backup\。Android手机可以找一个iPad/iPhone设备,把聊天记录迁移到iPad/iPhone设备上,然后通过iTunes备份到电脑上。

2. 下载本代码的执行文件:[Windows x64版本](https://github.com/BlueMatthew/WechatExporter/releases/download/v1.8.0.10/v1.8.0.10_x64_win.zip) 或者 [MacOS x64版本](https://github.com/BlueMatthew/WechatExporter/releases/download/v1.8.0.10/v1.8.0.10_x64_macos.zip),然后解压压缩文件
3. 执行解压出来的WechatExport.exe/WechatExporter (Windows下如果运行报缺少必须的dll文件,请安装[Visual C++ 2017 redist](https://aka.ms/vs/16/release/vc_redist.x64.exe)后再尝试运行)
4. 按界面提示进行操作。
 
5. 导出后的页面示例:

[点击链接可打开网页:https://src.wakin.org/github/wxexp/demo/](https://src.wakin.org/github/wxexp/demo/)
## 模版修改
解压目录下的res\templates(MacOS版本位于Contents\Resources\res)子目录里存放了输出聊天记录的html页面模版,其中通过两个%包含起来的字符串,譬如,%%NAME%%,不要修改之外,其它页面内容和格式都可以自行调整。
特别感谢Chao.M帮忙优化当前的模版。
## 系统依赖:
Windows版本:Windows 7+(XP不支持), [Visual C++ 2017 redist](https://aka.ms/vs/16/release/vc_redist.x64.exe) at [The latest supported Visual C++ downloads](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
MacOS版本:MacOS 10.10(Yosemite)+
## 程序编译
程序依赖如下第三方库:
- libxml2: http://www.xmlsoft.org/
- libcurl: https://curl.se/libcurl/
- libsqlite3: https://www.sqlite.org/index.html
- libprotobuf: https://github.com/protocolbuffers/protobuf
- libjsoncpp: https://github.com/open-source-parsers/jsoncpp
- lame: http://lame.sourceforge.net/
- silk: https://github.com/collects/silk (也参考了: https://github.com/kn007/silk-v3-decoder)
- libplist: https://github.com/libimobiledevice/libplist https://github.com/libimobiledevice-win32/libplist
- libiconv(windows only): https://www.gnu.org/software/libiconv/
- openssl(windows only):https://github.com/openssl/openssl
- WTL (windows only):https://sourceforge.net/projects/wtl/
MacOS下,libxml2,libcurl,libsqlite3直接使用了Xcode自带的库,其它第三方库需自行编译。
libmp3lame需手动删除文件include/libmp3lame.sym中的行:lame_init_old
Windows环境下,silk自带Visual Studio工程文件,可以直接利用Visual Studio编译,其余除了libplist之外,都通过vcpkg可以编译。libplist在vcpkg中也存在,但是在编译x64-windows-static target的时候报了错,于是直接通过Visual Studio建了工程进行编译。
https://github.com/BlueMatthew/WechatExporter/releases/download/v1.0/x64-windows-static.zip
https://github.com/BlueMatthew/WechatExporter/releases/download/v1.0/x86-windows-static.zip
https://github.com/BlueMatthew/WechatExporter/releases/download/v1.0/x64-windows-static-dbg.zip
https://github.com/BlueMatthew/WechatExporter/releases/download/v1.0/x86-windows-static-dbg.zip
https://github.com/BlueMatthew/WechatExporter/releases/download/v1.0/x64-macos-static.zip
已测试iTunes和微信版本
iTunes 12.3.3.17 + 微信6.5.9
iTunes 12.5.1.21 + 微信6.3.30
iTunes 12.10.10.2 + 微信7.0.2
iTunes 12.10.9.3 + 微信 7.0.15
iTunes 12.9.5.5 + 微信 7.0.2
Windows 10 + iTunes 12.11.0.26(Microsoft Store) + 微信 7.0.2
Windows 10 + iTunes 12.11.0.26(Microsoft Store) + 微信 8.0.1
Mac Catalina (Embedded iTunes) + 微信 8.0.1/8.0.2
Windows 7 + iTunes 12.10.9.3 + 微信版本 8.0.2
Windows 10 + iTunes 12.11.3.17 + 微信 8.0.7
Windows 7 + iTunes 12.10.9.3/Mac Catalina (Embedded iTunes) + 微信 7.0.2 + iOS 9.3.5
Windows + iTunes 12.10.3.1+ 微信 7.0.10 + iOS 13.3 (@lazybug163)
MacOS 11.6(Embedded iTunes)+ iOS Version: 15.0 + 微信 8.0.9
================================================
FILE: WechatExporter/AppConfiguration.h
================================================
//
// AppConfiguration.h
// WechatExporter
//
// Created by Matthew on 2021/3/18.
// Copyright © 2021 Matthew. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger, OUTPUT_FORMAT)
{
OUTPUT_FORMAT_HTML = 0,
OUTPUT_FORMAT_TEXT,
OUTPUT_FORMAT_PDF,
OUTPUT_FORMAT_LAST
};
@interface AppConfiguration : NSObject
+ (void)setDescOrder:(BOOL)descOrder;
+ (BOOL)getDescOrder;
+ (BOOL)IsPdfSupported;
+ (NSInteger)getOutputFormat;
+ (BOOL)isHtmlMode;
+ (BOOL)isTextMode;
+ (BOOL)isPdfMode;
+ (void)setOutputFormat:(NSInteger)outputFormat;
+ (void)setSavingInSession:(BOOL)savingInSession;
+ (BOOL)getSavingInSession;
+ (void)setSyncLoading;
+ (BOOL)getSyncLoading;
+ (void)setIncrementalExporting:(BOOL)incrementalExp;
+ (BOOL)getIncrementalExporting;
+ (void)setLastOutputDir:(NSString *)outputDir;
+ (NSString *)getLastOrDefaultOutputDir;
+ (NSString *)getDefaultOutputDir;
+ (void)setLastBackupDir:(NSString *)backupDir;
+ (NSString *)getLastBackupDir;
+ (NSString *)getDefaultBackupDir:(BOOL)checkExistence; // YES
+ (NSInteger)getLastCheckUpdateTime;
+ (void)setLastCheckUpdateTime;
+ (void)setLastCheckUpdateTime:(NSInteger)lastCheckUpdateTime;
+ (void)setCheckingUpdateDisabled:(BOOL)disabled;
+ (BOOL)isCheckingUpdateDisabled;
+ (void)setLoadingDataOnScroll;
+ (BOOL)getLoadingDataOnScroll;
+ (void)setNormalPagination;
+ (BOOL)getNormalPagination;
+ (void)setPaginationOnYear;
+ (BOOL)getPaginationOnYear;
+ (void)setPaginationOnMonth;
+ (BOOL)getPaginationOnMonth;
+ (void)setSupportingFilter:(BOOL)supportingFilter;
+ (BOOL)getSupportingFilter;
+ (void)setOutputDebugLogs:(BOOL)dbgLogs;
+ (BOOL)outputDebugLogs;
+ (void)setIncludingSubscriptions:(BOOL)includingSubscriptions;
+ (BOOL)includeSubscriptions;
+ (void)setOpenningFolderAfterExp:(BOOL)openningFolderAfterExp;
+ (BOOL)getOpenningFolderAfterExp;
+ (void)setSkipGuide:(BOOL)skipGuide;
+ (BOOL)getSkipGuide;
+ (void)upgrade;
+ (uint64_t)buildOptions;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: WechatExporter/AppConfiguration.mm
================================================
//
// AppConfiguration.m
// WechatExporter
//
// Created by Matthew on 2021/3/18.
// Copyright © 2021 Matthew. All rights reserved.
//
#import "AppConfiguration.h"
#include "Utils.h"
#include "PdfConverterImpl.h"
#include "ExportOption.h"
#define ASYNC_NONE 0
#define ASYNC_ONSCROLL 1
#define ASYNC_PAGER_NORMAL 2
#define ASYNC_PAGER_ON_YEAR 3
#define ASYNC_PAGER_ON_MONTH 4
@implementation AppConfiguration
+ (NSInteger)getAsyncLoadingValue
{
NSObject *obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"AsyncLoading"];
if (nil == obj)
{
return ASYNC_ONSCROLL;
}
return [[NSUserDefaults standardUserDefaults] integerForKey:@"AsyncLoading"];
}
+ (void)setDescOrder:(BOOL)descOrder
{
[[NSUserDefaults standardUserDefaults] setBool:descOrder forKey:@"DescOrder"];
}
+ (BOOL)getDescOrder
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"DescOrder"];
}
+ (BOOL)IsPdfSupported
{
PdfConverterImpl converter(NULL);
return converter.isPdfSupported() ? YES : NO;
}
+ (NSInteger)getOutputFormat
{
return [[NSUserDefaults standardUserDefaults] integerForKey:@"OutputFormat"];
}
+ (BOOL)isHtmlMode
{
return [self getOutputFormat] == OUTPUT_FORMAT_HTML;
}
+ (BOOL)isTextMode
{
return [self getOutputFormat] == OUTPUT_FORMAT_TEXT;
}
+ (BOOL)isPdfMode
{
return [self getOutputFormat] == OUTPUT_FORMAT_PDF;
}
+ (void)setOutputFormat:(NSInteger)outputFormat
{
[[NSUserDefaults standardUserDefaults] setInteger:outputFormat forKey:@"OutputFormat"];
}
+ (void)setSavingInSession:(BOOL)savingInSession
{
[[NSUserDefaults standardUserDefaults] setBool:(!savingInSession) forKey:@"UniversalFolder"];
}
+ (BOOL)getSavingInSession
{
return ![[NSUserDefaults standardUserDefaults] boolForKey:@"UniversalFolder"];
}
+ (void)setSyncLoading
{
[[NSUserDefaults standardUserDefaults] setInteger:ASYNC_NONE forKey:@"AsyncLoading"];
}
+ (BOOL)getSyncLoading
{
return [AppConfiguration getAsyncLoadingValue] == ASYNC_NONE;
}
+ (void)setIncrementalExporting:(BOOL)incrementalExp
{
[[NSUserDefaults standardUserDefaults] setBool:incrementalExp forKey:@"IncrementalExp"];
}
+ (BOOL)getIncrementalExporting
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"IncrementalExp"];
}
+ (void)setLastOutputDir:(NSString *)outputDir
{
[[NSUserDefaults standardUserDefaults] setObject:outputDir forKey:@"OutputDir"];
}
+ (NSString *)getLastOrDefaultOutputDir
{
NSString *outputDir = [[NSUserDefaults standardUserDefaults] stringForKey:@"OutputDir"];
if (nil != outputDir && outputDir.length > 0)
{
return outputDir;
}
return [self getDefaultOutputDir];
}
+ (NSString *)getDefaultOutputDir
{
NSMutableArray *components = [NSMutableArray array];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
if (nil == paths && paths.count > 0)
{
[components addObject:[paths objectAtIndex:0]];
}
else
{
[components addObject:NSHomeDirectory()];
[components addObject:@"Documents"];
}
[components addObject:@"WechatHistory"];
return [NSString pathWithComponents:components];
}
+ (void)setLastBackupDir:(NSString *)backupDir
{
[[NSUserDefaults standardUserDefaults] setObject:backupDir forKey:@"BackupDir"];
}
+ (NSString *)getLastBackupDir
{
return [[NSUserDefaults standardUserDefaults] stringForKey:@"BackupDir"];
}
+ (NSString *)getDefaultBackupDir:(BOOL)checkExistence // YES
{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *appSupport = [fileManager URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
NSArray *components = @[[appSupport path], @"MobileSync", @"Backup"];
NSString *backupDir = [NSString pathWithComponents:components];
if (!checkExistence)
{
return backupDir;
}
BOOL isDir = NO;
if ([fileManager fileExistsAtPath:backupDir isDirectory:&isDir] && isDir)
{
return backupDir;
}
return nil;
}
+ (NSInteger)getLastCheckUpdateTime
{
return [[NSUserDefaults standardUserDefaults] integerForKey:@"LastChkUpdateTime"];
}
+ (void)setLastCheckUpdateTime
{
[self setLastCheckUpdateTime:0];
}
+ (void)setLastCheckUpdateTime:(NSInteger)lastCheckUpdateTime
{
if (0 == lastCheckUpdateTime)
{
lastCheckUpdateTime = static_cast<NSInteger>(getUnixTimeStamp());
}
[[NSUserDefaults standardUserDefaults] setInteger:lastCheckUpdateTime forKey:@"LastChkUpdateTime"];
}
+ (void)setCheckingUpdateDisabled:(BOOL)disabled
{
[[NSUserDefaults standardUserDefaults] setBool:disabled forKey:@"ChkUpdateDisabled"];
}
+ (BOOL)isCheckingUpdateDisabled
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"ChkUpdateDisabled"];
}
+ (void)setLoadingDataOnScroll
{
[[NSUserDefaults standardUserDefaults] setInteger:ASYNC_ONSCROLL forKey:@"AsyncLoading"];
}
+ (BOOL)getLoadingDataOnScroll
{
return [AppConfiguration getAsyncLoadingValue] == ASYNC_ONSCROLL;
}
+ (void)setNormalPagination
{
[[NSUserDefaults standardUserDefaults] setInteger:ASYNC_PAGER_NORMAL forKey:@"AsyncLoading"];
}
+ (BOOL)getNormalPagination
{
return [AppConfiguration getAsyncLoadingValue] == ASYNC_PAGER_NORMAL;
}
+ (void)setPaginationOnYear
{
[[NSUserDefaults standardUserDefaults] setInteger:ASYNC_PAGER_ON_YEAR forKey:@"AsyncLoading"];
}
+ (BOOL)getPaginationOnYear
{
return [AppConfiguration getAsyncLoadingValue] == ASYNC_PAGER_ON_YEAR;
}
+ (void)setPaginationOnMonth
{
[[NSUserDefaults standardUserDefaults] setInteger:ASYNC_PAGER_ON_MONTH forKey:@"AsyncLoading"];
}
+ (BOOL)getPaginationOnMonth
{
return [AppConfiguration getAsyncLoadingValue] == ASYNC_PAGER_ON_MONTH;
}
+ (void)setSupportingFilter:(BOOL)supportingFilter
{
[[NSUserDefaults standardUserDefaults] setBool:(!supportingFilter) forKey:@"NoFilter"];
}
+ (BOOL)getSupportingFilter
{
return ![[NSUserDefaults standardUserDefaults] boolForKey:@"NoFilter"];
}
+ (void)setOutputDebugLogs:(BOOL)dbgLogs
{
[[NSUserDefaults standardUserDefaults] setBool:dbgLogs forKey:@"OutputDebugLogs"];
}
+ (BOOL)outputDebugLogs
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"OutputDebugLogs"];
}
+ (void)setIncludingSubscriptions:(BOOL)includingSubscriptions
{
[[NSUserDefaults standardUserDefaults] setBool:includingSubscriptions forKey:@"IncludingSubscriptions"];
}
+ (BOOL)includeSubscriptions
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"IncludingSubscriptions"];
}
+ (void)setOpenningFolderAfterExp:(BOOL)openningFolderAfterExp
{
[[NSUserDefaults standardUserDefaults] setBool:openningFolderAfterExp forKey:@"OpenningFolderAfterExp"];
}
+ (BOOL)getOpenningFolderAfterExp
{
NSObject *obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"OpenningFolderAfterExp"];
return (nil == obj) ? YES : [[NSUserDefaults standardUserDefaults] boolForKey:@"OpenningFolderAfterExp"];
}
+ (void)setSkipGuide:(BOOL)skipGuide
{
[[NSUserDefaults standardUserDefaults] setBool:skipGuide forKey:@"SkipGuide"];
}
+ (BOOL)getSkipGuide
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"SkipGuide"];
}
+ (void)upgrade
{
NSObject *obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"SyncLoading"];
if (obj != nil)
{
BOOL val = [[NSUserDefaults standardUserDefaults] boolForKey:@"SyncLoading"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"SyncLoading"];
if (val)
{
[[NSUserDefaults standardUserDefaults] setInteger:ASYNC_NONE forKey:@"AsyncLoading"];
}
}
obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"LoadingOnScroll"];
if (obj != nil)
{
BOOL val = [[NSUserDefaults standardUserDefaults] boolForKey:@"LoadingOnScroll"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"LoadingOnScroll"];
if (val)
{
[[NSUserDefaults standardUserDefaults] setInteger:ASYNC_ONSCROLL forKey:@"AsyncLoading"];
}
}
}
+ (uint64_t)buildOptions
{
ExportOption options;
if ([AppConfiguration isTextMode])
{
options.setTextMode();
}
if ([AppConfiguration isPdfMode])
{
options.setPdfMode();
}
options.setOrder(![AppConfiguration getDescOrder]);
// getSavingInSession
if ([AppConfiguration getSyncLoading])
{
options.setSyncLoading();
}
else
{
// options.setSyncLoading(false);
if ([AppConfiguration getLoadingDataOnScroll])
{
options.setLoadingDataOnScroll([AppConfiguration getLoadingDataOnScroll]);
}
if ([AppConfiguration getNormalPagination])
{
options.setPager();
}
if ([AppConfiguration getPaginationOnYear])
{
options.setPagerByYear();
}
if ([AppConfiguration getPaginationOnMonth])
{
options.setPagerByMonth();
}
// options.set([AppConfiguration getLoadingDataOnScroll]);
}
options.setIncrementalExporting([AppConfiguration getIncrementalExporting]);
options.supportsFilter([AppConfiguration getSupportingFilter]);
options.outputDebugLogs([AppConfiguration outputDebugLogs]);
if ([AppConfiguration includeSubscriptions])
{
options.includesSubscription();
}
return (uint64_t)options;
}
@end
================================================
FILE: WechatExporter/AppDelegate.h
================================================
//
// AppDelegate.h
// WechatExporter
//
// Created by Matthew on 2020/9/29.
// Copyright © 2020 Matthew. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
- (IBAction)fileMenuItemClick:(NSMenuItem *)sender;
- (IBAction)formatMenuItemClick:(NSMenuItem *)sender;
- (IBAction)optionsMenuItemClick:(NSMenuItem *)sender;
@end
================================================
FILE: WechatExporter/AppDelegate.mm
================================================
//
// AppDelegate.m
// WechatExporter
//
// Created by Matthew on 2020/9/29.
// Copyright © 2020 Matthew. All rights reserved.
//
#import "AppDelegate.h"
#include "Exporter.h"
#import "AppConfiguration.h"
@interface AppDelegate ()
{
BOOL m_pdfSupported;
}
@end
@implementation AppDelegate
- (void)applicationWillBecomeActive:(NSNotification *)notification
{
}
- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
[AppConfiguration upgrade];
Exporter::initializeExporter();
m_pdfSupported = [AppConfiguration IsPdfSupported];
NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];
NSMenuItem *fileMenu = [mainMenu itemAtIndex:1];
for (NSMenuItem *menuItem in fileMenu.submenu.itemArray)
{
if ([@"updater" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration isCheckingUpdateDisabled] ? NSControlStateValueOff : NSControlStateValueOn;
}
else if ([@"openFolder" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration getOpenningFolderAfterExp] ? NSControlStateValueOn : NSControlStateValueOff;
}
else if ([@"outputDbgLogs" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration outputDebugLogs] ? NSControlStateValueOn : NSControlStateValueOff;
}
}
BOOL htmlMode = [AppConfiguration isHtmlMode];
NSMenuItem *formatMenu = [mainMenu itemAtIndex:2];
for (NSMenuItem *menuItem in formatMenu.submenu.itemArray)
{
if ([@"htmlMode" isEqual:menuItem.identifier])
{
menuItem.state = htmlMode ? NSControlStateValueOn : NSControlStateValueOff;
}
else if ([@"textMode" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration isTextMode] ? NSControlStateValueOn : NSControlStateValueOff;
}
else if ([@"pdfMode" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration isPdfMode] && m_pdfSupported ? NSControlStateValueOn : NSControlStateValueOff;
}
}
NSMenuItem *optionsMenu = [mainMenu itemAtIndex:3];
for (NSMenuItem *menuItem in optionsMenu.submenu.itemArray)
{
if ([@"descOrder" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration getDescOrder] ? NSControlStateValueOn : NSControlStateValueOff;
}
else if ([@"asyncLoadingOnScroll" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration getLoadingDataOnScroll] ? NSControlStateValueOn : NSControlStateValueOff;
menuItem.enabled = htmlMode;
}
else if ([@"asyncPagerNormal" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration getNormalPagination] ? NSControlStateValueOn : NSControlStateValueOff;
menuItem.enabled = htmlMode;
}
else if ([@"asyncPagerYear" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration getPaginationOnYear] ? NSControlStateValueOn : NSControlStateValueOff;
menuItem.enabled = htmlMode;
}
else if ([@"asyncPagerMonth" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration getPaginationOnMonth] ? NSControlStateValueOn : NSControlStateValueOff;
menuItem.enabled = htmlMode;
}
else if ([@"filter" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration getSupportingFilter] ? NSControlStateValueOn : NSControlStateValueOff;
menuItem.enabled = htmlMode;
}
else if ([@"incrementalExp" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration getIncrementalExporting] ? NSControlStateValueOn : NSControlStateValueOff;
}
else if ([@"includingSubscriptions" isEqual:menuItem.identifier])
{
menuItem.state = [AppConfiguration includeSubscriptions] ? NSControlStateValueOn : NSControlStateValueOff;
#ifndef NDEBUG
menuItem.hidden = NO;
#endif
}
else
{
}
}
}
- (void)applicationWillTerminate:(NSNotification *)aNotification
{
// Insert code here to tear down your application
Exporter::uninitializeExporter();
}
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
{
return YES;
}
- (IBAction)fileMenuItemClick:(NSMenuItem *)sender
{
if ([sender.identifier isEqualToString:@"openFolder"])
{
[AppConfiguration setOpenningFolderAfterExp:(sender.state == NSControlStateValueOff)];
sender.state = (sender.state == NSControlStateValueOff) ? NSControlStateValueOn : NSControlStateValueOff;
}
else if ([sender.identifier isEqualToString:@"outputDbgLogs"])
{
[AppConfiguration setOutputDebugLogs:(sender.state == NSControlStateValueOff)];
sender.state = (sender.state == NSControlStateValueOff) ? NSControlStateValueOn : NSControlStateValueOff;
}
else if ([sender.identifier isEqualToString:@"updater"])
{
[AppConfiguration setCheckingUpdateDisabled:(sender.state == NSControlStateValueOn)];
sender.state = (sender.state == NSControlStateValueOff) ? NSControlStateValueOn : NSControlStateValueOff;
}
}
- (IBAction)formatMenuItemClick:(NSMenuItem *)sender
{
if ([sender.identifier isEqualToString:@"htmlMode"] || [sender.identifier isEqualToString:@"textMode"] || [sender.identifier isEqualToString:@"pdfMode"])
{
if (sender.state == NSControlStateValueOff)
{
NSInteger outputFormat = [sender.identifier isEqualToString:@"htmlMode"] ? OUTPUT_FORMAT_HTML : ([sender.identifier isEqualToString:@"pdfMode"] ? OUTPUT_FORMAT_PDF : OUTPUT_FORMAT_TEXT);
[AppConfiguration setOutputFormat:outputFormat];
BOOL htmlMode = [AppConfiguration isHtmlMode];
NSMenuItem *menuItem = nil;
NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];
NSMenuItem *formatMenu = [mainMenu itemAtIndex:2];
for (NSInteger idx = 0; idx < 3; idx++)
{
menuItem = [formatMenu.submenu itemAtIndex:idx];
menuItem.state = [menuItem.identifier isEqualToString:sender.identifier] ? NSControlStateValueOn : NSControlStateValueOff;
}
NSMenuItem *optionsMenu = [mainMenu itemAtIndex:3];
for (NSMenuItem *menuItem in optionsMenu.submenu.itemArray)
{
if ([menuItem.identifier hasPrefix:@"async"])
{
menuItem.enabled = htmlMode;
}
else if ([@"filter" isEqual:menuItem.identifier])
{
menuItem.enabled = htmlMode;
}
}
}
}
}
- (IBAction)optionsMenuItemClick:(NSMenuItem *)sender
{
BOOL newValue = sender.state == NSControlStateValueOff;
// if (![sender.identifier hasPrefix:@"pager"])
{
sender.state = newValue ? NSControlStateValueOn : NSControlStateValueOff;
}
if ([sender.identifier isEqualToString:@"includingSubscriptions"])
{
[AppConfiguration setIncludingSubscriptions:newValue];
}
else if ([sender.identifier isEqualToString:@"descOrder"])
{
[AppConfiguration setDescOrder:newValue];
}
else if ([sender.identifier isEqualToString:@"savingInSessionFolder"])
{
[AppConfiguration setSavingInSession:newValue];
}
/*
else if ([sender.identifier isEqualToString:@"asyncLoading"])
{
[AppConfiguration setAsyncLoading:newValue];
NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];
NSMenuItem *optionsMenu = [mainMenu itemAtIndex:3];
for (NSMenuItem *menuItem in optionsMenu.submenu.itemArray)
{
if ([@"loadingOnScroll" isEqual:menuItem.identifier])
{
menuItem.enabled = [AppConfiguration isHtmlMode] && [AppConfiguration getAsyncLoading];
}
}
}
else if ([sender.identifier isEqualToString:@"asyncLoadingOnScroll"])
{
[AppConfiguration setLoadingDataOnScroll:newValue];
}
*/
else if ([sender.identifier isEqualToString:@"filter"])
{
[AppConfiguration setSupportingFilter:newValue];
}
else if ([sender.identifier isEqualToString:@"incrementalExp"])
{
[AppConfiguration setIncrementalExporting:newValue];
}
else if ([sender.identifier hasPrefix:@"async"])
{
if (newValue)
{
for (NSMenuItem *menuItem in sender.parentItem.submenu.itemArray)
{
if ((menuItem != sender) && [menuItem.identifier hasPrefix:@"async"])
{
if (menuItem.state == NSControlStateValueOn)
{
menuItem.state = NSControlStateValueOff;
}
}
}
if ([sender.identifier isEqualToString:@"asyncLoadingOnScroll"])
{
[AppConfiguration setLoadingDataOnScroll];
}
else if ([sender.identifier isEqualToString:@"asyncPagerNormal"])
{
[AppConfiguration setNormalPagination];
}
else if ([sender.identifier isEqualToString:@"asyncPagerYear"])
{
[AppConfiguration setPaginationOnYear];
}
else if ([sender.identifier isEqualToString:@"asyncPagerMonth"])
{
[AppConfiguration setPaginationOnMonth];
}
}
else
{
[AppConfiguration setSyncLoading];
}
}
}
@end
================================================
FILE: WechatExporter/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"filename" : "16.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"filename" : "32.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"filename" : "32.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"filename" : "64.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"filename" : "128.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"filename" : "256.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"filename" : "256.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"filename" : "512.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"filename" : "512.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"filename" : "1024.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: WechatExporter/Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: WechatExporter/Assets.xcassets/MainMenuCN.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "main-menu-cn@1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "main-menu-cn@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "main-menu-cn@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: WechatExporter/Assets.xcassets/MainMenuEN.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "main-menu-en@1x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "main-menu-en@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "main-menu-en@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: WechatExporter/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="17156" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17156"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="WechatExporter" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="WechatExporter" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About WechatExporter" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Hide WechatExporter" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit WechatExporter" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="UCE-Dj-bc1">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" autoenablesItems="NO" id="yFn-8R-v2s">
<items>
<menuItem title="Check Update Automatically" state="on" identifier="updater" id="0eV-Ry-IfP" userLabel="Update">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="fileMenuItemClick:" target="Voe-Tx-rLC" id="xct-X6-Tm8"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="4FA-3H-oyN"/>
<menuItem title="Open the Folder After Exporting" identifier="openFolder" id="TWh-AV-CCF" userLabel="OpenFolder">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="fileMenuItemClick:" target="Voe-Tx-rLC" id="ogW-Y1-xTE"/>
</connections>
</menuItem>
<menuItem title="Output Detailed Logs" identifier="outputDbgLogs" id="Pyu-qm-bT0" userLabel="Logs">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="fileMenuItemClick:" target="Voe-Tx-rLC" id="JLp-9y-Hr3"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Format" id="v5F-yk-5ct" userLabel="Format">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Format" autoenablesItems="NO" id="or1-Xl-Us0">
<items>
<menuItem title="HTML" state="on" identifier="htmlMode" id="cWo-5k-XRR" userLabel="HTML">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="formatMenuItemClick:" target="Voe-Tx-rLC" id="NHl-5W-ye0"/>
</connections>
</menuItem>
<menuItem title="Text" identifier="textMode" id="GeM-zb-UkW" userLabel="TEXT">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="formatMenuItemClick:" target="Voe-Tx-rLC" id="5kY-da-x9v"/>
</connections>
</menuItem>
<menuItem title="PDF" identifier="pdfMode" id="T2A-kG-daZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="formatMenuItemClick:" target="Voe-Tx-rLC" id="g68-A8-wGQ"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Options" id="fod-ax-X6A" userLabel="Options">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Options" autoenablesItems="NO" id="uG2-8c-wjP">
<items>
<menuItem title="From Newer To Earlier" identifier="descOrder" id="eJH-AO-QUD" userLabel="DescOrder">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="optionsMenuItemClick:" target="Voe-Tx-rLC" id="bmE-bp-yvx"/>
</connections>
</menuItem>
<menuItem title="Save Avatar/Emoji in Chat Folder" state="on" hidden="YES" identifier="savingInSessionFolder" id="tGU-e5-isp" userLabel="SavingInSession">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="optionsMenuItemClick:" target="Voe-Tx-rLC" id="Ak2-Wp-Nxc"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="cxg-sZ-JjI"/>
<menuItem title="Asynchronous Loading for HTML Format" hidden="YES" id="WOF-ft-ZWq" userLabel="AsyncLoading">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="optionsMenuItemClick:" target="Voe-Tx-rLC" id="2yw-ca-llR"/>
</connections>
</menuItem>
<menuItem title="Load Messages on Scrolling" state="on" identifier="asyncLoadingOnScroll" id="c4Q-qP-ppM" userLabel="LoadOnScroll">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="optionsMenuItemClick:" target="Voe-Tx-rLC" id="zuW-td-SIh"/>
</connections>
</menuItem>
<menuItem title="Normal Pagination (Every 1000 Messages)" identifier="asyncPagerNormal" id="Ygm-65-QSG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="optionsMenuItemClick:" target="Voe-Tx-rLC" id="MG1-Vl-fgK"/>
</connections>
</menuItem>
<menuItem title="Pagination Based on Year" identifier="asyncPagerYear" id="91m-8a-U1P">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="optionsMenuItemClick:" target="Voe-Tx-rLC" id="aU3-uy-zps"/>
</connections>
</menuItem>
<menuItem title="Pagination Based on Month" identifier="asyncPagerMonth" id="QlU-BX-D1D">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="optionsMenuItemClick:" target="Voe-Tx-rLC" id="295-GE-eQy"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bTu-p0-ZCF"/>
<menuItem title="Show Message Filter" identifier="filter" id="HWn-ip-mii" userLabel="Filter">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="optionsMenuItemClick:" target="Voe-Tx-rLC" id="0Pi-LY-fNC"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="BZ6-lW-JdL"/>
<menuItem title="Incremental Exporting" identifier="incrementalExp" id="5c2-wM-XIf" userLabel="IncrementalExp">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="optionsMenuItemClick:" target="Voe-Tx-rLC" id="HQe-Oy-Na5"/>
</connections>
</menuItem>
<menuItem title="Including Subscriptions" hidden="YES" identifier="includingSubscriptions" id="GbO-lL-BLb" userLabel="Subscriptions">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="optionsMenuItemClick:" target="Voe-Tx-rLC" id="MEP-ZQ-Zdq"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="k5c-yf-BQl">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="pOf-8G-Ji8">
<items>
<menuItem title="WechatExporter Help" keyEquivalent="?" id="vp6-q8-ljb">
<connections>
<action selector="showHelp:" target="Ady-hI-5gd" id="pmH-Nb-8ng"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="0.0"/>
</scene>
<!--Window Controller-->
<scene sceneID="R2V-B0-nI4">
<objects>
<windowController id="B8D-0N-5wS" sceneMemberID="viewController">
<window key="window" title="Wechat Exporter" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="IQv-IB-iLA">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<rect key="contentRect" x="196" y="240" width="1024" height="640"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
<value key="minSize" type="size" width="1024" height="640"/>
<connections>
<outlet property="delegate" destination="B8D-0N-5wS" id="98r-iN-zZc"/>
</connections>
</window>
<connections>
<segue destination="XfG-lQ-9wD" kind="relationship" relationship="window.shadowedContentViewController" id="cq2-FE-JQM"/>
</connections>
</windowController>
<customObject id="Oky-zY-oP4" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="250"/>
</scene>
<!--View Controller-->
<scene sceneID="hIz-AP-VOD">
<objects>
<viewController id="XfG-lQ-9wD" customClass="ViewController" sceneMemberID="viewController">
<view key="view" id="m2S-Jp-Qdl">
<rect key="frame" x="0.0" y="0.0" width="642" height="400"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Kpd-TD-eLh">
<rect key="frame" x="472" y="376" width="160" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="right" id="I2S-Gi-YO0">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="OAQ-rY-5Vw">
<rect key="frame" x="12" y="376" width="575" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="iTunes Backup Directory:" id="BqF-Du-vMt">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="FYs-pu-LFe">
<rect key="frame" x="10" y="343" width="599" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="gUM-SE-fVj">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="8a7-Ad-bIv"/>
</popUpButtonCell>
</popUpButton>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8gl-oS-xn6">
<rect key="frame" x="603" y="339" width="33" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="LFI-6K-mnE">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="az7-4y-9PZ">
<rect key="frame" x="12" y="292" width="594" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="Ka2-DD-4h3">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="c7I-ig-uay">
<rect key="frame" x="542" y="7" width="96" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Export" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="wX7-rb-1cu">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="9La-2q-J8z">
<rect key="frame" x="12" y="322" width="596" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Output Directory:" id="uh4-ix-NCq">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="mwI-Gk-UmA">
<rect key="frame" x="10" y="259" width="418" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="uSN-2a-KEP">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="YIH-W8-iNB"/>
</popUpButtonCell>
</popUpButton>
<scrollView fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pql-rp-pLF">
<rect key="frame" x="12" y="48" width="618" height="206"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="zyz-bc-zu0">
<rect key="frame" x="1" y="0.0" width="616" height="190"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" headerView="wdC-HO-Vvc" viewBased="YES" id="J2V-fs-LwZ">
<rect key="frame" x="0.0" y="0.0" width="899" height="165"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<tableViewGridLines key="gridStyleMask" vertical="YES" horizontal="YES"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="columnCheck" editable="NO" width="20" minWidth="20" maxWidth="20" id="wOB-II-58U">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="gtr-oV-Pno">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<prototypeCellViews>
<tableCellView id="QOc-nX-BuW">
<rect key="frame" x="1" y="1" width="20" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button verticalHuggingPriority="750" id="asV-0M-pRJ">
<rect key="frame" x="1" y="1" width="20" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="58n-zQ-LqF">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
</subviews>
</tableCellView>
</prototypeCellViews>
</tableColumn>
<tableColumn identifier="columnName" editable="NO" width="256" minWidth="40" maxWidth="1000" id="8FB-hv-fkB">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Name">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="X6v-WO-gkU">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="lR5-LQ-1Qd">
<rect key="frame" x="24" y="1" width="256" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Jim-uO-w4w">
<rect key="frame" x="0.0" y="1" width="256" height="16"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="fos-aD-v3q">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<connections>
<outlet property="textField" destination="Jim-uO-w4w" id="Kfv-s2-e0D"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
<tableColumn identifier="columnRecordCount" width="96" minWidth="10" maxWidth="3.4028234663852886e+38" id="bsY-Rr-JHi">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Number of Msgs">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="Q3f-RG-97F">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="qEb-Tp-Qka">
<rect key="frame" x="283" y="1" width="96" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="lYR-ar-9XO">
<rect key="frame" x="0.0" y="1" width="96" height="16"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="qJ3-t0-qJh">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<connections>
<outlet property="textField" destination="lYR-ar-9XO" id="J96-Vh-lc5"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
<tableColumn identifier="columnLastMsg" width="384" minWidth="40" maxWidth="3.4028234663852886e+38" id="hIY-8j-rpO" userLabel="Last Msg">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Last Message">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="CrY-ui-CpL">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="9Mg-vi-1eQ">
<rect key="frame" x="382" y="1" width="384" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xHM-Sg-n34">
<rect key="frame" x="0.0" y="1" width="384" height="16"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="sWr-dF-dlL">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<connections>
<outlet property="textField" destination="xHM-Sg-n34" id="5GB-En-lll"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
<tableColumn identifier="columnUser" width="128" minWidth="10" maxWidth="3.4028234663852886e+38" id="mqg-xB-lDI">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Wechat Account">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="O0i-cF-8Ix">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="BcU-k8-Igt">
<rect key="frame" x="769" y="1" width="128" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DFJ-Vc-mZN">
<rect key="frame" x="0.0" y="1" width="128" height="16"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="5Mi-xr-dCf">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<connections>
<outlet property="textField" destination="DFJ-Vc-mZN" id="epd-Xc-GX3"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
</tableView>
</subviews>
<nil key="backgroundColor"/>
</clipView>
<scroller key="horizontalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="adY-Ee-7bA">
<rect key="frame" x="1" y="190" width="616" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="OzV-b0-sAV">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<tableHeaderView key="headerView" wantsLayer="YES" id="wdC-HO-Vvc">
<rect key="frame" x="0.0" y="0.0" width="899" height="25"/>
<autoresizingMask key="autoresizingMask"/>
</tableHeaderView>
</scrollView>
<progressIndicator wantsLayer="YES" fixedFrame="YES" maxValue="100" indeterminate="YES" style="bar" translatesAutoresizingMaskIntoConstraints="NO" id="VMi-pK-9Z0">
<rect key="frame" x="12" y="13" width="391" height="20"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</progressIndicator>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ybQ-bI-p2r">
<rect key="frame" x="603" y="285" width="33" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="1GT-FK-TVG">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button hidden="YES" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="kaB-gl-s4B">
<rect key="frame" x="446" y="7" width="96" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" enabled="NO" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="CHb-bh-1kG">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
Gw
</string>
</buttonCell>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yOo-KU-sM8">
<rect key="frame" x="-2" y="222" width="22" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" state="on" allowsMixedState="YES" inset="2" id="xAr-eh-ypW">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZAV-Dz-fdD">
<rect key="frame" x="446" y="7" width="96" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Close" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="dkl-Nk-ye1">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<scrollView hidden="YES" fixedFrame="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mkn-sk-kD7">
<rect key="frame" x="12" y="48" width="618" height="206"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="jiT-mv-qJD">
<rect key="frame" x="0.0" y="0.0" width="618" height="206"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textView editable="NO" importsGraphics="NO" richText="NO" verticallyResizable="YES" textCompletion="NO" id="09Z-23-gCi">
<rect key="frame" x="0.0" y="0.0" width="618" height="206"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<size key="minSize" width="618" height="206"/>
<size key="maxSize" width="618" height="10000000"/>
<color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
</textView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="F2k-Dr-bCj">
<rect key="frame" x="-100" y="-100" width="225" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="5aF-5y-0Jo">
<rect key="frame" x="603" y="0.0" width="15" height="241"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Kgc-dQ-c8D">
<rect key="frame" x="542" y="255" width="96" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Show Logs" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="WmO-MK-b5O">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button hidden="YES" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8bu-eG-BOn">
<rect key="frame" x="312" y="7" width="130" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Backup Device" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="3sn-TB-2UJ">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
</subviews>
</view>
<connections>
<outlet property="btnBackup" destination="8gl-oS-xn6" id="ykX-mi-M09"/>
<outlet property="btnBackupDevice" destination="8bu-eG-BOn" id="Cxy-vH-TgJ"/>
<outlet property="btnCancel" destination="kaB-gl-s4B" id="pBJ-1v-c4B"/>
<outlet property="btnExport" destination="c7I-ig-uay" id="L8d-sU-cTy"/>
<outlet property="btnOutput" destination="ybQ-bI-p2r" id="PLg-jN-ozw"/>
<outlet property="btnQuit" destination="ZAV-Dz-fdD" id="Kfh-6w-xj4"/>
<outlet property="btnShowLogs" destination="Kgc-dQ-c8D" id="PBX-v1-ITi"/>
<outlet property="btnToggleAll" destination="yOo-KU-sM8" id="RX5-S3-gcr"/>
<outlet property="lblITunes" destination="Kpd-TD-eLh" id="uWI-3i-BEz"/>
<outlet property="popupBackup" destination="FYs-pu-LFe" id="Z34-x5-0Me"/>
<outlet property="popupUsers" destination="mwI-Gk-UmA" id="cu6-0h-a2o"/>
<outlet property="progressBar" destination="VMi-pK-9Z0" id="O1p-nX-RQW"/>
<outlet property="sclSessions" destination="pql-rp-pLF" id="trV-0t-r84"/>
<outlet property="sclViewLogs" destination="Mkn-sk-kD7" id="42K-bF-yhL"/>
<outlet property="tblSessions" destination="J2V-fs-LwZ" id="vR2-aN-XfD"/>
<outlet property="txtViewLogs" destination="09Z-23-gCi" id="8iS-At-7Jk"/>
<outlet property="txtboxOutput" destination="az7-4y-9PZ" id="H1v-yu-igB"/>
</connections>
</viewController>
<customObject id="rPt-NT-nkU" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="155" y="720"/>
</scene>
</scenes>
</document>
================================================
FILE: WechatExporter/ExportNotifierImpl.h
================================================
#pragma once
#include "ExportNotifier.h"
#include "ViewController.h"
class ExportNotifierImpl : public ExportNotifier
{
protected:
__weak ViewController *m_viewController;
public:
ExportNotifierImpl(ViewController* viewController)
{
m_viewController = viewController;
}
~ExportNotifierImpl()
{
m_viewController = nil;
}
void onStart() const
{
__block __weak ViewController* viewController = m_viewController;
dispatch_async(dispatch_get_main_queue(), ^{
__strong __typeof(viewController)strongVC = viewController;
if (strongVC)
{
[strongVC onStart];
strongVC = nil;
}
});
}
void onProgress(uint32_t numberOfMessages, uint32_t numberOfTotalMessages) const
{
}
void onComplete(bool cancelled) const
{
__block __weak ViewController* viewController = m_viewController;
__block BOOL localCancelled = cancelled;
dispatch_async(dispatch_get_main_queue(), ^{
__strong __typeof(viewController)strongVC = viewController;
if (strongVC)
{
[strongVC onComplete:localCancelled];
strongVC = nil;
}
});
}
void onUserSessionStart(const std::string& usrName, uint32_t numberOfSessions) const
{
}
void onUserSessionComplete(const std::string& usrName) const
{
}
void onSessionStart(const std::string& sessionUsrName, void * sessionData, uint32_t numberOfTotalMessages) const
{
__block __weak ViewController* viewController = m_viewController;
__block NSInteger row = (NSInteger)sessionData;
__block NSString *usrName = [NSString stringWithUTF8String:sessionUsrName.c_str()];
dispatch_async(dispatch_get_main_queue(), ^{
__strong __typeof(viewController)strongVC = viewController;
if (strongVC)
{
[strongVC onSessionStart:usrName row:row];
strongVC = nil;
}
});
}
void onSessionProgress(const std::string& sessionUsrName, void * sessionData, uint32_t numberOfMessages, uint32_t numberOfTotalMessages) const
{
__block __weak ViewController* viewController = m_viewController;
__block NSInteger row = (NSInteger)sessionData;
__block NSUInteger numberOfMsgs = (NSUInteger)numberOfMessages;
__block NSUInteger numberOfTotalMsgs = (NSUInteger)numberOfTotalMessages;
__block NSString *usrName = [NSString stringWithUTF8String:sessionUsrName.c_str()];
dispatch_async(dispatch_get_main_queue(), ^{
__strong __typeof(viewController)strongVC = viewController;
if (strongVC)
{
[strongVC onSessionProgress:usrName row:row numberOfMessages:numberOfMsgs numberOfTotalMessages:numberOfTotalMsgs];
strongVC = nil;
}
});
}
void onSessionComplete(const std::string& sessionUsrName, void * sessionData, bool cancelled) const
{
__block __weak ViewController* viewController = m_viewController;
// __block BOOL localCancelled = cancelled;
__block NSString *usrName = [NSString stringWithUTF8String:sessionUsrName.c_str()];
dispatch_async(dispatch_get_main_queue(), ^{
__strong __typeof(viewController)strongVC = viewController;
if (strongVC)
{
[strongVC onSessionComplete:usrName];
strongVC = nil;
}
});
}
void onTasksStart(const std::string& usrName, uint32_t numberOfTotalTasks) const
{
}
void onTasksProgress(const std::string& usrName, uint32_t numberOfCompletedTasks, uint32_t numberOfTotalMessages) const
{
}
void onTasksComplete(const std::string& usrName, bool cancelled) const
{
}
};
================================================
FILE: WechatExporter/HttpHelper.h
================================================
//
// HttpHelper.h
// WechatExporter
//
// Created by Matthew on 2021/3/9.
// Copyright © 2021 Matthew. All rights reserved.
//
#ifndef HttpHelper_h
#define HttpHelper_h
#import <Foundation/Foundation.h>
@interface HttpHelper : NSObject
+ (NSString *)standardUserAgent;
@end
#endif /* HttpHelper_h */
================================================
FILE: WechatExporter/HttpHelper.mm
================================================
//
// HttpHelper.m
// WechatExporter
//
// Created by Matthew on 2021/3/9.
// Copyright © 2021 Matthew. All rights reserved.
//
#import "HttpHelper.h"
#if defined(__ppc__) || defined(__ppc64__)
#define PROCESSOR "PPC"
#elif defined(__i386__) || defined(__x86_64__)
#define PROCESSOR "Intel"
#else
#error Unknown architecture
#endif
@implementation HttpHelper
static inline int callGestalt(OSType selector)
{
SInt32 value = 0;
Gestalt(selector, &value);
return value;
}
// Uses underscores instead of dots because if "4." ever appears in a user agent string, old DHTML libraries treat it as Netscape 4.
+ (NSString *)macOSXVersionString
{
// Can't use -[NSProcessInfo operatingSystemVersionString] because it has too much stuff we don't want.
int major = callGestalt(gestaltSystemVersionMajor);
// ASSERT(major);
int minor = callGestalt(gestaltSystemVersionMinor);
int bugFix = callGestalt(gestaltSystemVersionBugFix);
if (bugFix)
return [NSString stringWithFormat:@"%d_%d_%d", major, minor, bugFix];
if (minor)
return [NSString stringWithFormat:@"%d_%d", major, minor];
return [NSString stringWithFormat:@"%d", major];
}
+ (NSString *)userVisibleWebKitVersionString
{
// If the version is 4 digits long or longer, then the first digit represents
// the version of the OS. Our user agent string should not include this first digit,
// so strip it off and report the rest as the version. <rdar://problem/4997547>
NSString *fullVersion = [[NSBundle bundleForClass:NSClassFromString(@"WKView")] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
NSRange nonDigitRange = [fullVersion rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
if (nonDigitRange.location == NSNotFound && [fullVersion length] >= 4)
return [fullVersion substringFromIndex:1];
if (nonDigitRange.location != NSNotFound && nonDigitRange.location >= 4)
return [fullVersion substringFromIndex:1];
return fullVersion;
}
+ (NSString *)standardUserAgent
{
// https://opensource.apple.com/source/WebKit2/WebKit2-7536.26.14/UIProcess/mac/WebPageProxyMac.mm.auto.html
NSString *osVersion = [self macOSXVersionString];
NSString *webKitVersion = [self userVisibleWebKitVersionString];
return [NSString stringWithFormat:@"Mozilla/5.0 (Macintosh; %@ Mac OS X %@) AppleWebKit/%@ (KHTML, like Gecko) ", @PROCESSOR, osVersion, webKitVersion];
}
@end
================================================
FILE: WechatExporter/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2020 Matthew. All rights reserved.</string>
<key>NSMainStoryboardFile</key>
<string>Main</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSSupportsAutomaticTermination</key>
<true/>
<key>NSSupportsSuddenTermination</key>
<true/>
</dict>
</plist>
================================================
FILE: WechatExporter/LICENSES/jsoncpp.LICENSE
================================================
The JsonCpp library's source code, including accompanying documentation,
tests and demonstration applications, are licensed under the following
conditions...
Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all
jurisdictions which recognize such a disclaimer. In such jurisdictions,
this software is released into the Public Domain.
In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and
The JsonCpp Authors, and is released under the terms of the MIT License (see below).
In jurisdictions which recognize Public Domain property, the user of this
software may choose to accept it either as 1) Public Domain, 2) under the
conditions of the MIT License (see below), or 3) under the terms of dual
Public Domain/MIT License conditions described here, as they choose.
The MIT License is about as close to Public Domain as a license can get, and is
described in clear, concise terms at:
http://en.wikipedia.org/wiki/MIT_License
The full text of the MIT License follows:
========================================================================
Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy,
modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
========================================================================
(END LICENSE TEXT)
The MIT license is compatible with both the GPL and commercial
software, affording one all of the rights of Public Domain with the
minor nuisance of being required to keep the above copyright notice
and license text in the source code. Note also that by accepting the
Public Domain "license" you can re-license your copy using whatever
license you like.
================================================
FILE: WechatExporter/LICENSES/lame.LICENSE
================================================
Can I use LAME in my commercial program?
Yes, you can, under the restrictions of the LGPL (see COPYING
in this folder). The easiest way to do this is to:
1. Link to LAME as separate library (libmp3lame.a on unix or
lame_enc.dll or libmp3lame.dll on windows)
2. Fully acknowledge that you are using LAME, and give a link
to our web site, www.mp3dev.org
3. If you make modifications to LAME, you *must* release these
modifications back to the LAME project, under the LGPL.
================================================
FILE: WechatExporter/LICENSES/libcurl.COPYING
================================================
COPYRIGHT AND PERMISSION NOTICE
Copyright (c) 1996 - 2020, Daniel Stenberg, <daniel@haxx.se>, and many
contributors, see the THANKS file.
All rights reserved.
Permission to use, copy, modify, and distribute this software for any purpose
with or without fee is hereby granted, provided that the above copyright
notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of a copyright holder shall not
be used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization of the copyright holder.
================================================
FILE: WechatExporter/LICENSES/libimobiledevice-glue.COPYING
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
================================================
FILE: WechatExporter/LICENSES/libimobiledevice.COPYING.LESSER
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
================================================
FILE: WechatExporter/LICENSES/libplist.COPYING.LESSER
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
gitextract_4jypkpqy/
├── .gitignore
├── LICENSE
├── README.md
├── WechatExporter/
│ ├── AppConfiguration.h
│ ├── AppConfiguration.mm
│ ├── AppDelegate.h
│ ├── AppDelegate.mm
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── MainMenuCN.imageset/
│ │ │ └── Contents.json
│ │ └── MainMenuEN.imageset/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── Main.storyboard
│ ├── ExportNotifierImpl.h
│ ├── HttpHelper.h
│ ├── HttpHelper.mm
│ ├── Info.plist
│ ├── LICENSES/
│ │ ├── jsoncpp.LICENSE
│ │ ├── lame.LICENSE
│ │ ├── libcurl.COPYING
│ │ ├── libimobiledevice-glue.COPYING
│ │ ├── libimobiledevice.COPYING.LESSER
│ │ ├── libplist.COPYING.LESSER
│ │ ├── libusbmuxd.COPYING
│ │ ├── libxml2.Copyright
│ │ ├── opencore-amr.LICENSE
│ │ ├── openssl.LICENSE
│ │ └── protobuf.LICENSE
│ ├── LoggerImpl.h
│ ├── PdfConverterImpl.h
│ ├── SessionDataSource.h
│ ├── SessionDataSource.mm
│ ├── ViewController copy.mm
│ ├── ViewController.h
│ ├── ViewController.mm
│ ├── WechatExporter.entitlements
│ ├── core/
│ │ ├── AsyncExecutor.cpp
│ │ ├── AsyncExecutor.h
│ │ ├── AsyncTask.cpp
│ │ ├── AsyncTask.h
│ │ ├── ByteArrayLocater.h
│ │ ├── DownloadPool.cpp
│ │ ├── DownloadPool.h
│ │ ├── Downloader.cpp
│ │ ├── Downloader.h
│ │ ├── ExportContext.h
│ │ ├── ExportNotifier.h
│ │ ├── ExportOption.h
│ │ ├── Exporter.cpp
│ │ ├── Exporter.h
│ │ ├── FileSystem.cpp
│ │ ├── FileSystem.h
│ │ ├── IDeviceBackup.cpp
│ │ ├── IDeviceBackup.h
│ │ ├── ITunesParser.cpp
│ │ ├── ITunesParser.h
│ │ ├── Logger.h
│ │ ├── MMKVReader.h
│ │ ├── MbdbReader.h
│ │ ├── MessageParser.cpp
│ │ ├── MessageParser.h
│ │ ├── PdfConverter.h
│ │ ├── RawMessage.cpp
│ │ ├── RawMessage.h
│ │ ├── ResManager.cpp
│ │ ├── ResManager.h
│ │ ├── TaskManager.cpp
│ │ ├── TaskManager.h
│ │ ├── Template.cpp
│ │ ├── Template.h
│ │ ├── Updater.cpp
│ │ ├── Updater.h
│ │ ├── Utils.cpp
│ │ ├── Utils.h
│ │ ├── Utils_audio.cpp
│ │ ├── Utils_md5.cpp
│ │ ├── Utils_protobuf.cpp
│ │ ├── Utils_silk.cpp
│ │ ├── Utils_thread.cpp
│ │ ├── Utils_xml.cpp
│ │ ├── WechatObjects.h
│ │ ├── WechatParser.cpp
│ │ ├── WechatParser.h
│ │ ├── WechatSource.h
│ │ ├── XmlParser.cpp
│ │ ├── XmlParser.h
│ │ ├── endianness.h
│ │ ├── md5.c
│ │ ├── md5.h
│ │ └── semaphore.h
│ ├── en.lproj/
│ │ ├── Localizable.strings
│ │ └── Main.strings
│ ├── main.m
│ ├── res/
│ │ ├── emoji/
│ │ │ └── emoji.json
│ │ ├── en.txt
│ │ ├── templates/
│ │ │ ├── audio.html
│ │ │ ├── card.html
│ │ │ ├── channels.html
│ │ │ ├── emoji.html
│ │ │ ├── filter.html
│ │ │ ├── frame.html
│ │ │ ├── frame_filter.html
│ │ │ ├── image.html
│ │ │ ├── listframe.html
│ │ │ ├── listitem.html
│ │ │ ├── member.html
│ │ │ ├── members.html
│ │ │ ├── msg.html
│ │ │ ├── notice.html
│ │ │ ├── plainshare.html
│ │ │ ├── refermsg.html
│ │ │ ├── scripts.html
│ │ │ ├── share.html
│ │ │ ├── system.html
│ │ │ ├── thumb.html
│ │ │ ├── transfer.html
│ │ │ ├── video.html
│ │ │ ├── videonew.html
│ │ │ └── wxemoji.html
│ │ ├── templates_txt/
│ │ │ ├── audio.html
│ │ │ ├── card.html
│ │ │ ├── channels.html
│ │ │ ├── emoji.html
│ │ │ ├── frame.html
│ │ │ ├── image.html
│ │ │ ├── listframe.html
│ │ │ ├── listitem.html
│ │ │ ├── msg.html
│ │ │ ├── notice.html
│ │ │ ├── plainshare.html
│ │ │ ├── refermsg.html
│ │ │ ├── scripts.html
│ │ │ ├── share.html
│ │ │ ├── system.html
│ │ │ ├── thumb.html
│ │ │ ├── transfer.html
│ │ │ ├── video.html
│ │ │ └── wxemoji.html
│ │ └── zh-Hans.txt
│ └── zh-Hans.lproj/
│ ├── Localizable.strings
│ └── Main.strings
├── WechatExporter.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata/
│ └── xcschemes/
│ └── WechatExporter.xcscheme
├── WechatExporter.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── WechatExporterCmd/
│ ├── WechatExporter.cpp
│ └── WechatExporterCmd.h
├── WechatExporterCmd.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata/
│ └── xcschemes/
│ └── WechatExporterCmd.xcscheme
├── docs/
│ ├── index.html
│ └── update.conf
├── libplist.README.md
├── release
└── vcproject/
├── AboutDlg.h
├── AppConfiguration.cpp
├── AppConfiguration.h
├── BackupDlg.h
├── ColoredControls.h
├── Core.h
├── ExportNotifierImpl.h
├── ITunesDetector.h
├── LogListBox.h
├── LoggerImpl.h
├── MainFrm.h
├── PdfConverterImpl.h
├── ProgressListViewCtrl.h
├── TextProgressBarCtrl.h
├── ToolTipButton.h
├── VersionDetector.h
├── View.h
├── ViewHelper.cpp
├── ViewHelper.h
├── WechatExporter.cpp
├── WechatExporter.h
├── WechatExporter.rc
├── WechatExporter.sln
├── WechatExporter.vcxproj
├── WechatExporter.vcxproj.filters
├── WechatExporterCmd.cpp
├── WechatExporterCmd.vcxproj
├── WechatExporterCmd.vcxproj.filters
├── resource.h
├── stdafx.cpp
└── stdafx.h
SYMBOL INDEX (524 symbols across 72 files)
FILE: WechatExporter/ExportNotifierImpl.h
function class (line 6) | class ExportNotifierImpl : public ExportNotifier
function onProgress (line 36) | void onProgress(uint32_t numberOfMessages, uint32_t numberOfTotalMessage...
function onComplete (line 40) | void onComplete(bool cancelled) const
function onUserSessionStart (line 55) | void onUserSessionStart(const std::string& usrName, uint32_t numberOfSes...
function onUserSessionComplete (line 60) | void onUserSessionComplete(const std::string& usrName) const
function onSessionStart (line 65) | void onSessionStart(const std::string& sessionUsrName, void * sessionDat...
function onSessionProgress (line 80) | void onSessionProgress(const std::string& sessionUsrName, void * session...
function onSessionComplete (line 97) | void onSessionComplete(const std::string& sessionUsrName, void * session...
function onTasksStart (line 112) | void onTasksStart(const std::string& usrName, uint32_t numberOfTotalTask...
function onTasksProgress (line 117) | void onTasksProgress(const std::string& usrName, uint32_t numberOfComple...
function onTasksComplete (line 122) | void onTasksComplete(const std::string& usrName, bool cancelled) const
FILE: WechatExporter/LoggerImpl.h
function class (line 16) | class LoggerImpl : public Logger
FILE: WechatExporter/PdfConverterImpl.h
function class (line 17) | class PdfConverterImpl : public PdfConverter
function detectEdgeInstalled (line 171) | bool detectEdgeInstalled()
function initShellFile (line 187) | void initShellFile(const char *outputDir)
FILE: WechatExporter/core/AsyncExecutor.h
function class (line 19) | class AsyncExecutor
FILE: WechatExporter/core/AsyncTask.cpp
function writeHttpDataToBuffer (line 23) | size_t writeHttpDataToBuffer(void *buffer, size_t size, size_t nmemb, vo...
type curl_slist (line 61) | struct curl_slist
type curl_slist (line 64) | struct curl_slist
function writeTaskHttpData (line 128) | size_t writeTaskHttpData(void *buffer, size_t size, size_t nmemb, void *...
FILE: WechatExporter/core/AsyncTask.h
function virtual (line 40) | virtual ~DownloadTask() {}
function setUserAgent (line 52) | void setUserAgent(const std::string& userAgent)
function getRetries (line 82) | unsigned int getRetries() const;
function class (line 122) | class Mp3Task : public AsyncExecutor::Task
function class (line 158) | class PdfTask : public AsyncExecutor::Task
FILE: WechatExporter/core/ByteArrayLocater.h
function class (line 14) | class ByteArrayLocater
function isMatch (line 74) | bool isMatch(const unsigned char* data, int length, int position, const ...
function isEmptyLocate (line 86) | bool isEmptyLocate(const unsigned char* data, int length, const unsigned...
FILE: WechatExporter/core/DownloadPool.cpp
function writeData (line 17) | size_t writeData(void *buffer, size_t size, size_t nmemb, void *user_p)
type stat (line 79) | struct stat
FILE: WechatExporter/core/DownloadPool.h
function class (line 20) | class Task
function class (line 52) | class DownloadPool
FILE: WechatExporter/core/Downloader.cpp
function writeDataToBuffer (line 27) | size_t writeDataToBuffer(void *buffer, size_t size, size_t nmemb, void *...
type curl_slist (line 55) | struct curl_slist
type curl_slist (line 58) | struct curl_slist
function writeTaskData (line 122) | size_t writeTaskData(void *buffer, size_t size, size_t nmemb, void *user_p)
FILE: WechatExporter/core/Downloader.h
function class (line 24) | class Task
function class (line 94) | class Downloader
FILE: WechatExporter/core/ExportContext.h
function class (line 33) | class ExportContext
function class (line 517) | class PageInfo
function setCount (line 547) | void setCount(uint32_t count)
function class (line 576) | class Pager
function class (line 609) | class NumberPager : public Pager
function class (line 648) | class YearPager : public Pager
function class (line 684) | class YearMonthPager : public YearPager
FILE: WechatExporter/core/ExportNotifier.h
function class (line 4) | class ExportNotifier
FILE: WechatExporter/core/ExportOption.h
type SessionParsingOption (line 12) | enum SessionParsingOption
type EXPORT_OPTION (line 43) | enum EXPORT_OPTION : uint64_t
function class (line 81) | class ExportOption
function filterByName (line 147) | void filterByName()
function setIncrementalExporting (line 157) | void setIncrementalExporting(bool incrementalExporting)
function outputDebugLogs (line 183) | void outputDebugLogs(bool outputDebugLogs)
function useRemoteEmoji (line 196) | void useRemoteEmoji(bool useEmojiUrl)
function includesSubscription (line 209) | void includesSubscription()
function setSyncLoading (line 229) | void setSyncLoading()
function setPager (line 252) | void setPager()
function setPagerByYear (line 260) | void setPagerByYear()
function setPagerByMonth (line 272) | void setPagerByMonth()
function fromSessionParsingOptions (line 290) | void fromSessionParsingOptions(int options)
FILE: WechatExporter/core/Exporter.h
function class (line 32) | class Exporter
FILE: WechatExporter/core/FileSystem.cpp
function getFileSizeImpl (line 41) | inline size_t getFileSizeImpl(const std::string& path)
function getFileSize (line 65) | size_t getFileSize(const std::string& path)
function existsDirectoryImpl (line 76) | inline bool existsDirectoryImpl(LPCTSTR lpszPath)
function isDirectoryImpl (line 82) | inline bool isDirectoryImpl(LPCTSTR lpszPath)
function time_t (line 88) | time_t FileTimeToTime(FILETIME ft)
function isDirectoryImpl (line 110) | inline bool isDirectoryImpl(const std::string& path)
function existsDirectory (line 119) | bool existsDirectory(const std::string& path)
function makePathImpl (line 131) | int makePathImpl(const std::string::value_type *path, mode_t mode)
function makeDirectory (line 152) | bool makeDirectory(const std::string& path)
function deleteFile (line 203) | bool deleteFile(const std::string& path)
function deleteDirectory (line 213) | bool deleteDirectory(const std::string& path)
function existsFileImpl (line 306) | inline bool existsFileImpl(const std::string& path)
function existsFile (line 319) | bool existsFile(const std::string& path)
function listSubDirectories (line 329) | bool listSubDirectories(const std::string& path, std::vector<std::string...
function listDirectory (line 384) | bool listDirectory(const std::string& path, std::vector<std::string>& su...
function copyFileImpl (line 450) | inline bool copyFileImpl(const std::string& src, const std::string& dest)
function copyFile (line 501) | bool copyFile(const std::string& src, const std::string& dest, bool over...
function checkFileNewer (line 526) | inline bool checkFileNewer(const std::string& src, const std::string& dest)
function copyFileIfNewer (line 596) | bool copyFileIfNewer(const std::string& src, const std::string& dest)
function copyDirectory (line 616) | bool copyDirectory(const std::string& src, const std::string& dest)
function moveFile (line 722) | bool moveFile(const std::string& src, const std::string& dest, bool over...
function CString (line 776) | CString removeInvalidCharsForFileName(const CString& fileName)
function removeInvalidCharsForFileName (line 796) | std::string removeInvalidCharsForFileName(const std::string& fileName)
function isValidFileName (line 858) | bool isValidFileName(const std::string& fileName)
function readFile (line 909) | std::string readFile(const std::string& path)
function readFile (line 921) | bool readFile(const std::string& path, std::vector<unsigned char>& data)
function writeFile (line 953) | bool writeFile(const std::string& path, const std::vector<unsigned char>...
function writeFile (line 958) | bool writeFile(const std::string& path, const std::string& data)
function writeFile (line 963) | bool writeFile(const std::string& path, const unsigned char* data, size_...
function appendFile (line 995) | bool appendFile(const std::string& path, const std::string& data)
function appendFile (line 1000) | bool appendFile(const std::string& path, const unsigned char* data, size...
function combinePath (line 1031) | std::string combinePath(const std::string& p1, const std::string& p2)
function combinePath (line 1076) | std::string combinePath(const std::string& p1, const std::string& p2, co...
function combinePath (line 1081) | std::string combinePath(const std::string& p1, const std::string& p2, co...
function normalizePath (line 1086) | std::string normalizePath(const std::string& path)
function normalizePath (line 1093) | void normalizePath(std::string& path)
function calcFreeSpace (line 1098) | int calcFreeSpace(const std::string& path, uint64_t& freeSpace)
function time_t (line 1145) | time_t FileEnumerator::File::getModifiedTime() const
type stat (line 1245) | struct stat
type __stat64 (line 1252) | struct __stat64
type dirent (line 1277) | struct dirent
type stat (line 1288) | struct stat
FILE: WechatExporter/core/FileSystem.h
function std (line 86) | const std::string& getFileName() const;
FILE: WechatExporter/core/IDeviceBackup.cpp
function printlog (line 49) | int __cdecl printlog(const char *format, ...)
function usleep (line 85) | void usleep(__int64 usec)
type plist_format_t (line 99) | enum plist_format_t
function formatDiskSize (line 105) | std::string formatDiskSize(uint64_t size)
function writePlistFile (line 127) | int writePlistFile(plist_t plist, const std::string& filename, enum plis...
function readPlistFile (line 149) | int readPlistFile(plist_t *plist, const std::string& filename)
type fs (line 164) | namespace fs
function win32err_to_errno (line 167) | static int win32err_to_errno(int err_value)
function win32err_to_device_error (line 185) | static int win32err_to_device_error(DWORD errValue)
function convertErrnoToDeviceError (line 205) | static int convertErrnoToDeviceError(int errnoValue)
function deleteFile (line 229) | static int deleteFile(const std::string& path)
function deleteDirectoryRecursively (line 249) | static int deleteDirectoryRecursively(LPCTSTR szPath)
function deleteDirectoryRecursively (line 314) | static int deleteDirectoryRecursively(const std::string& path)
function moveFile (line 396) | static int moveFile(const std::string& src, const std::string& dest)
function makeDirectory (line 415) | static int makeDirectory(const std::string& path, mode_t mode)
class FileEnumerator (line 469) | class FileEnumerator
class FileInfo (line 472) | class FileInfo
method FileInfo (line 478) | FileInfo() : m_isDir(false), m_isNormalFile(false), m_fileSize(0)
method isDirectory (line 488) | bool isDirectory() const
method isNormalFile (line 493) | bool isNormalFile() const
method time_t (line 498) | time_t getModifiedTime() const
method getFileSize (line 503) | uint64_t getFileSize() const
function isValid (line 543) | bool isValid() const
function nextFile (line 552) | bool nextFile(FileInfo& file)
type File (line 679) | struct File
method File (line 684) | File() : size(0)
method File (line 688) | File(const std::string& fid, size_t sz) : fileId(fid), size(sz)
function IDeviceBackupClient (line 704) | IDeviceBackupClient(const std::string udid) : m_device(NULL), m_afc(NULL...
function init (line 735) | bool init()
function lockdownd_error_t (line 747) | lockdownd_error_t initWithHandShake()
function updateDeviceInfo (line 759) | void updateDeviceInfo(DeviceInfo& device, lockdownd_error_t err)
function freeClient (line 784) | void freeClient()
function needUnlock (line 793) | inline bool needUnlock(lockdownd_error_t err) const
function needTrust (line 798) | inline bool needTrust(lockdownd_error_t err) const
function loadFiles (line 803) | bool loadFiles(const std::string& backupPath, const std::string& udid)
function queryFileSize (line 860) | bool queryFileSize(const std::string& fileId, size_t& fileSize) const
function queryDeviceName (line 871) | bool queryDeviceName(std::string& name) const
function queryAppContainer (line 887) | bool queryAppContainer(const std::string& bundleId, std::string& container)
function setOverallProgressFromMessage (line 931) | void setOverallProgressFromMessage(IDeviceBackup *pThis, plist_t message...
function doPostNotification (line 952) | void doPostNotification(idevice_t device, const char *notification)
function notifyCallback (line 981) | static void notifyCallback(const char *notification, void *userdata)
function checkSnapshotState (line 997) | static int checkSnapshotState(const std::string& path, const std::string...
function instproxy_error_t (line 1022) | instproxy_error_t getContainderForBundleIdentifier(instproxy_client_t cl...
function handleListDirectory (line 1077) | void handleListDirectory(plist_t message, const char *backupDir)
function handleMakeDirectory (line 1151) | void handleMakeDirectory(plist_t message, const char *backup_dir)
function receiveFilename (line 1177) | int receiveFilename(IDeviceBackup *pThis, char** filename)
type _stati64 (line 1231) | struct _stati64
type stat (line 1234) | struct stat
function handleSendFiles (line 1380) | void handleSendFiles(plist_t message, const char *backup_dir)
function handleReceiveFiles (line 1425) | int handleReceiveFiles(IDeviceBackup *pThis, plist_t message, const std:...
function handleMoveFiles (line 1633) | void handleMoveFiles(IDeviceBackup *pThis, plist_t message, char *dlmsg,...
function handleRemoveFiles (line 1693) | void handleRemoveFiles(IDeviceBackup *pThis, plist_t message, char *dlms...
function handleCopyItem (line 1745) | void handleCopyItem(IDeviceBackup *pThis, plist_t message, char *dlmsg, ...
function handleProcessMessage (line 1780) | void handleProcessMessage(plist_t message, int& operation_ok, int& resul...
function mb2_multi_status_add_file_error (line 1823) | void mb2_multi_status_add_file_error(plist_t status_dict, const char *pa...
function mobilebackup_afc_get_file_contents (line 1832) | void mobilebackup_afc_get_file_contents(afc_client_t afc, const char *fi...
function plist_t (line 1883) | plist_t newInfoPlist(const char* udid, idevice_t device, afc_client_t afc)
function willEncrypt (line 2083) | bool willEncrypt()
function getProductVersion (line 2101) | int getProductVersion()
function mobilebackup2_error_t (line 2129) | inline mobilebackup2_error_t sendHelloMessage(double& remote_version)
function backup (line 2136) | bool backup(IDeviceBackup *pThis, const std::string& outputPath)
function freeService (line 2464) | inline void freeService(lockdownd_service_descriptor_t& service)
function unlockAfc (line 2473) | void unlockAfc()
function idevice_t (line 2485) | idevice_t getDevice() const
function lockdownd_client_t (line 2490) | lockdownd_client_t getClient() const
FILE: WechatExporter/core/IDeviceBackup.h
function class (line 16) | class DeviceInfo
function class (line 149) | class IDeviceBackup
FILE: WechatExporter/core/ITunesParser.cpp
function getPlistStringValue (line 42) | inline std::string getPlistStringValue(plist_t node)
function getPlistStringValue (line 59) | inline std::string getPlistStringValue(plist_t node, const char* key)
type __string_less (line 80) | struct __string_less
class SqliteITunesFileEnumerator (line 89) | class SqliteITunesFileEnumerator : public ITunesDb::ITunesFileEnumerator
method SqliteITunesFileEnumerator (line 92) | SqliteITunesFileEnumerator(const std::string& dbPath, const std::vecto...
method isInvalid (line 142) | virtual bool isInvalid() const
method nextFile (line 147) | virtual bool nextFile(ITunesFile& file)
method closeDb (line 215) | void closeDb()
method finalizeStmt (line 224) | void finalizeStmt()
class MbdbITunesFileEnumerator (line 239) | class MbdbITunesFileEnumerator : public ITunesDb::ITunesFileEnumerator
method MbdbITunesFileEnumerator (line 242) | MbdbITunesFileEnumerator(const std::string& dbPath, const std::vector<...
method isInvalid (line 253) | virtual bool isInvalid() const
method nextFile (line 258) | virtual bool nextFile(ITunesFile& file)
method existsDomain (line 370) | bool existsDomain(const std::string& domain) const
function ITunesFile (line 729) | const ITunesFile* ITunesDb::findITunesFile(const std::string& relativePa...
type stat (line 924) | struct stat
type dirent (line 931) | struct dirent
type _stat (line 1370) | struct _stat
type stat (line 1375) | struct stat
FILE: WechatExporter/core/ITunesParser.h
type ITunesFile (line 21) | struct ITunesFile
function setPath (line 91) | void setPath(const std::string& path)
function setBackupId (line 96) | void setBackupId(const std::string& backupId)
function setDeviceName (line 101) | void setDeviceName(const std::string& deviceName)
function setDisplayName (line 106) | void setDisplayName(const std::string& displayName)
function setBackupTime (line 111) | void setBackupTime(const std::string& backupTime)
function setITunesVersion (line 116) | void setITunesVersion(const std::string& iTunesVersion)
function setMacOSVersion (line 120) | void setMacOSVersion(const std::string& macOSVersion)
function setIOSVersion (line 125) | void setIOSVersion(const std::string& iOSVersion)
function setEncrypted (line 140) | void setEncrypted(bool encrypted)
function addApp (line 145) | void addApp(const AppInfo& appInfo)
function class (line 186) | class ITunesDb
function class (line 264) | class DecodedWechatITunesDb : public ITunesDb
function class (line 278) | class DecodedSharedWechatITunesDb : public DecodedWechatITunesDb
function class (line 321) | class ManifestParser
function class (line 346) | class DecodedManifestParser : public ManifestParser
FILE: WechatExporter/core/Logger.h
function class (line 14) | class Logger
FILE: WechatExporter/core/MMKVReader.h
function class (line 12) | class MMKVReader
function skipValue (line 54) | void skipValue() const
function seek (line 115) | void seek(size_t position) const
FILE: WechatExporter/core/MbdbReader.h
function class (line 38) | class MbdbReader {
FILE: WechatExporter/core/MessageParser.h
function class (line 26) | class TemplateValues
type WechatTemplateHandler (line 85) | struct WechatTemplateHandler
function class (line 173) | class MessageParser
FILE: WechatExporter/core/PdfConverter.h
function class (line 12) | class PdfConverter
FILE: WechatExporter/core/RawMessage.cpp
function convertUnknownField (line 14) | bool convertUnknownField(const UnknownField &uf, std::string& value)
function convertUnknownField (line 40) | bool convertUnknownField(const UnknownField &uf, int& value)
FILE: WechatExporter/core/RawMessage.h
function class (line 40) | class RawMessage
function parse (line 70) | bool RawMessage::parse(const std::string& fields, T& value)
FILE: WechatExporter/core/ResManager.cpp
type FindEmojiItem (line 335) | struct FindEmojiItem
method FindEmojiItem (line 341) | FindEmojiItem(std::string::size_type p, std::string::size_type l, cons...
type FindEmojiItemCompare (line 356) | struct FindEmojiItemCompare
FILE: WechatExporter/core/ResManager.h
function class (line 18) | class ResManager
type EmojiItemCompare (line 68) | struct EmojiItemCompare
type EmojiItemCompareN (line 76) | struct EmojiItemCompareN
type EmojiTag (line 84) | struct EmojiTag
FILE: WechatExporter/core/TaskManager.h
function class (line 20) | class TaskManager : public AsyncExecutor::Callback
FILE: WechatExporter/core/Template.cpp
function Template (line 49) | Template& Template::operator=(const Template& rhs)
FILE: WechatExporter/core/Template.h
type TEMPLATE_TAG (line 16) | struct TEMPLATE_TAG
FILE: WechatExporter/core/Updater.h
function class (line 14) | class Updater
FILE: WechatExporter/core/Utils.cpp
function replaceAll (line 46) | int replaceAll(std::string& input, const std::string& search, const std:...
function replaceAll (line 60) | int replaceAll(std::string& input, const std::vector<std::pair<std::stri...
function replaceAll (line 77) | std::string replaceAll(const std::string& input, const std::string& sear...
function replaceAll (line 84) | std::string replaceAll(const std::string& input, const std::vector<std::...
function endsWith (line 92) | bool endsWith(const std::string& str, const std::string& suffix)
function endsWith (line 97) | bool endsWith(const std::string& str, std::string::value_type ch)
function startsWith (line 102) | bool startsWith(const std::string& str, const std::string& prefix, int p...
function startsWith (line 107) | bool startsWith(const std::string& str, std::string::value_type ch)
function toUpper (line 112) | std::string toUpper(const std::string& str)
function toLower (line 119) | std::string toLower(const std::string& str)
function split (line 126) | std::vector<std::string> split(const std::string& str, const std::string...
function join (line 142) | std::string join(const std::vector<std::string>& elements, const char *c...
function join (line 147) | std::string join(std::vector<std::string>::const_iterator b, std::vector...
function safeHTML (line 168) | std::string safeHTML(const std::string& s)
function removeHtmlTags (line 175) | void removeHtmlTags(std::string& html)
function removeCdata (line 190) | std::string removeCdata(const std::string& str)
function fromUnixTime (line 196) | std::string fromUnixTime(unsigned int unixtime, bool localTime/* = true*/)
function getUnixTimeStamp (line 220) | uint32_t getUnixTimeStamp()
function utf8ToLocalAnsi (line 334) | std::string utf8ToLocalAnsi(const std::string& utf8Str)
function updateFileTime (line 342) | void updateFileTime(const std::string& path, time_t mtime)
function openSqlite3Database (line 375) | int openSqlite3Database(const std::string& path, sqlite3 **ppDb, bool re...
function isBigEndian (line 454) | bool isBigEndian()
function T (line 462) | T swapEndian(T u)
function GetBigEndianInteger (line 478) | int GetBigEndianInteger(const unsigned char* data, int startIndex/* = 0*/)
function bigEndianToNative (line 500) | int16_t bigEndianToNative(int16_t n)
function bigEndianToNative (line 505) | int32_t bigEndianToNative(int32_t n)
function bigEndianToNative (line 510) | int64_t bigEndianToNative(int64_t n)
function bigEndianToNative (line 515) | uint16_t bigEndianToNative(uint16_t n)
function bigEndianToNative (line 520) | uint32_t bigEndianToNative(uint32_t n)
function bigEndianToNative (line 525) | uint64_t bigEndianToNative(uint64_t n)
function GetLittleEndianInteger (line 531) | int GetLittleEndianInteger(const unsigned char* data, int startIndex/* =...
function encodeUrl (line 539) | std::string encodeUrl(const std::string& url)
function decodeUrl (line 558) | std::string decodeUrl(const std::string& url)
function getTimestampString (line 578) | std::string getTimestampString(bool includingYMD/* = false*/, bool inclu...
function isNumber (line 598) | bool isNumber(const std::string &s)
function makeUuid (line 604) | std::string makeUuid()
function toHex (line 625) | std::string toHex(unsigned char* data, size_t length)
function toHex (line 637) | std::string toHex(char* data, size_t length)
FILE: WechatExporter/core/Utils.h
type mode_t (line 17) | typedef int mode_t;
type sqlite3 (line 92) | struct sqlite3
FILE: WechatExporter/core/Utils_audio.cpp
function pcmToMp3 (line 23) | bool pcmToMp3(const std::string& pcmPath, const std::string& mp3Path, st...
function pcmToMp3 (line 34) | bool pcmToMp3(const std::vector<unsigned char>& pcmData, const std::stri...
function amrPcmToMp3 (line 131) | bool amrPcmToMp3(const std::string& pcmPath, const std::string& mp3Path,...
function amrPcmToMp3 (line 142) | bool amrPcmToMp3(const std::vector<unsigned char>& pcmData, const std::s...
FILE: WechatExporter/core/Utils_md5.cpp
function md5Impl (line 28) | std::string md5Impl(const void* data, size_t dataSize)
function md5 (line 76) | std::string md5(const std::string& s)
function md5File (line 81) | std::string md5File(const std::string& path)
function sha1 (line 93) | std::string sha1(const std::string& s)
FILE: WechatExporter/core/Utils_silk.cpp
function swap_endian (line 39) | void swap_endian(
function GetHighResolutionTime (line 64) | unsigned long GetHighResolutionTime() /* O: time in usec*/
function GetHighResolutionTime (line 76) | unsigned long GetHighResolutionTime() /* O: time in usec*/
function silkToPcm (line 87) | bool silkToPcm(const std::string& silkPath, std::vector<unsigned char>& ...
function silkToPcm (line 485) | bool silkToPcm(const std::string& silkPath, const std::string& pcmPath, ...
function skipAmrnbHeader (line 496) | size_t skipAmrnbHeader(FILE* fp)
function amrToPcm (line 512) | bool amrToPcm(const std::string& amrPath, std::vector<unsigned char>& pc...
function amrToPcm (line 573) | bool amrToPcm(const std::string& amrPath, const std::string& pcmPath, st...
FILE: WechatExporter/core/Utils_thread.cpp
type tagTHREADNAME_INFO (line 20) | struct tagTHREADNAME_INFO
function setThreadName (line 29) | void setThreadName(uint32_t dwThreadID, const char* threadName)
function setThreadName (line 46) | void setThreadName( const char* threadName)
function setThreadName (line 51) | void setThreadName(std::thread* thread, const char* threadName)
function setThreadName (line 59) | void setThreadName(const char* threadName)
function setThreadName (line 66) | void setThreadName(const char* threadName)
FILE: WechatExporter/core/Utils_xml.cpp
function getXmlNodeValue (line 15) | bool getXmlNodeValue(const std::string& xml, const std::string& xpath, s...
function getXmlNodeAttributeValue (line 55) | bool getXmlNodeAttributeValue(const std::string& xml, const std::string&...
FILE: WechatExporter/core/WechatObjects.h
function class (line 68) | class WechatInfo
function isSubscription (line 252) | inline bool isSubscription() const
function setUsrName (line 260) | void setUsrName(const std::string& usrName) { this->m_usrName = usrName;...
function setEmptyUsrName (line 270) | void setEmptyUsrName(const std::string& usrName) { this->m_usrName = usr...
function setDeleted (line 277) | void setDeleted(bool deleted)
function containMember (line 282) | bool containMember(const std::string& usrName) const
function addMember (line 294) | void addMember(const std::string& usrName, const std::string& displayName)
function setWxName (line 328) | inline void setWxName(const std::string& wxName)
function setDisplayName (line 333) | inline void setDisplayName(const std::string& displayName)
function setUserType (line 338) | inline void setUserType(int userType)
function setPortrait (line 345) | inline void setPortrait(const std::string& portrait)
function setPortraitHD (line 356) | inline void setPortraitHD(const std::string& portraitHD)
function setOutputFileName (line 366) | inline void setOutputFileName(const std::string& outputFileName)
function clearTags (line 402) | void clearTags()
function swapTags (line 407) | void swapTags(std::vector<std::string> tags)
function isSubscription (line 512) | inline bool Friend::isSubscription(const std::string& usrName)
function isChatroom (line 524) | inline bool Friend::isChatroom(const std::string& usrName)
function isDefaultAvatar (line 530) | inline bool Friend::isDefaultAvatar(const std::string& path)
function isDefaultAvatar (line 535) | inline bool Friend::isDefaultAvatar(size_t fileSize, const std::string& ...
function isInvalidPortrait (line 540) | inline bool Friend::isInvalidPortrait(const std::string& portrait)
function const (line 545) | struct FriendDisplayNameCompare
function const (line 557) | bool operator()(const Friend* f1, const Friend* f2) const
function const (line 562) | bool operator()(const Friend* f1, const std::string& s2) const
function class (line 568) | class Friends
function class (line 666) | class Session : public Friend
function const (line 884) | struct SessionUsrNameCompare
function const (line 897) | struct SessionHashCompare
type SessionLastMsgTimeCompare (line 910) | struct SessionLastMsgTimeCompare
type WXMSG (line 918) | struct WXMSG
type WXAPPMSG (line 931) | struct WXAPPMSG
type WXFWDMSG (line 941) | struct WXFWDMSG
FILE: WechatExporter/core/WechatParser.cpp
function parseMembers (line 34) | bool parseMembers(const std::string& xml, T& f)
type MSG_ENUMERATOR_CONTEXT (line 1930) | struct MSG_ENUMERATOR_CONTEXT
method MSG_ENUMERATOR_CONTEXT (line 1935) | MSG_ENUMERATOR_CONTEXT(sqlite3* d, sqlite3_stmt* s) : db(d), stmt(s)
FILE: WechatExporter/core/WechatParser.h
function const (line 38) | bool operator() (const T& s2, const ITunesFile* s1) const // greater
function const (line 68) | bool operator() (const T& s2, const ITunesFile* s1) const // greater
function class (line 88) | class MessageDbFilter : public RegexFilterBase<MessageDbFilter>
function class (line 106) | class UserFolderFilter : public RegexFilterBase<UserFolderFilter>
function class (line 144) | class WechatInfoParser
function class (line 159) | class SessionCellDataFilter : public FilterBase<SessionCellDataFilter>
function class (line 172) | class LoginInfo2Parser
function class (line 195) | class MMSettingInMMappedKVFilter : public FilterBase<MMSettingInMMappedK...
function class (line 234) | class MMSettings
function class (line 254) | class MMKVParser : public MMSettings
function class (line 267) | class MMSettingParser : public MMSettings
function class (line 277) | class FriendsParser
function class (line 301) | class SessionsParser
function class (line 329) | class SessionParser
FILE: WechatExporter/core/WechatSource.h
function class (line 15) | class WechatSource
function setBackupItem (line 60) | void setBackupItem(const BackupItem& backupItem)
function DeviceInfo (line 65) | const DeviceInfo* getDeviceInfo() const
function DeviceInfo (line 70) | DeviceInfo* getDeviceInfo()
FILE: WechatExporter/core/XmlParser.cpp
type NodeValueHandler (line 11) | struct NodeValueHandler
type NodesValueHandler (line 31) | struct NodesValueHandler
type AttributeHandler (line 61) | struct AttributeHandler
type AttributesHandler (line 83) | struct AttributesHandler
function xmlNodePtr (line 128) | xmlNodePtr XmlParser::getChildNode(xmlNodePtr node, const std::string& c...
function xmlNodePtr (line 146) | xmlNodePtr XmlParser::getNextNodeSibling(xmlNodePtr node)
function xmlXPathObjectPtr (line 187) | xmlXPathObjectPtr XmlParser::evalXPathOnNode(xmlNodePtr node, const std:...
FILE: WechatExporter/core/XmlParser.h
function class (line 21) | class XmlParser
FILE: WechatExporter/core/md5.c
function uint32 (line 51) | static uint32
function putu32 (line 59) | static void
function MD5Init (line 74) | void
function MD5Update (line 91) | void
function MD5Final (line 142) | void
function main (line 302) | int
FILE: WechatExporter/core/md5.h
type uint32 (line 13) | typedef unsigned long uint32;
type MD5Context (line 15) | struct MD5Context {
type MD5Context (line 27) | struct MD5Context
type MD5Context (line 28) | struct MD5Context
type MD5Context (line 29) | struct MD5Context
type MD5_CTX (line 35) | typedef struct MD5Context MD5_CTX;
FILE: WechatExporter/core/semaphore.h
function class (line 6) | class semaphore
FILE: WechatExporterCmd/WechatExporter.cpp
class LoggerImpl (line 30) | class LoggerImpl : public Logger
method write (line 34) | void write(const std::string& log)
method debug (line 39) | void debug(const std::string& log)
function main (line 46) | int main(int argc, const char * argv[]) {
function getExecutablePath (line 140) | std::string getExecutablePath()
function getExecutableDir (line 152) | std::string getExecutableDir()
function getCurrentLanguageCode (line 162) | std::string getCurrentLanguageCode()
FILE: WechatExporterCmd/WechatExporterCmd.h
function printHelp (line 36) | void printHelp(const char *executableName)
function exportSessions (line 80) | int exportSessions(const std::string& languageCode, Logger* logger, cons...
FILE: vcproject/AboutDlg.h
function class (line 9) | class CAboutDlg : public CDialogImpl<CAboutDlg>
function LRESULT (line 46) | LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOO...
FILE: vcproject/AppConfiguration.cpp
function BOOL (line 15) | BOOL AppConfiguration::GetDescOrder()
function BOOL (line 32) | BOOL AppConfiguration::GetUsingRemoteEmoji()
function BOOL (line 44) | BOOL AppConfiguration::GetIncrementalExporting()
function UINT (line 51) | UINT AppConfiguration::GetOutputFormat()
function BOOL (line 80) | BOOL AppConfiguration::GetSavingInSession()
function CString (line 95) | CString AppConfiguration::GetLastOrDefaultOutputDir()
function CString (line 106) | CString AppConfiguration::GetDefaultOutputDir()
function CString (line 118) | CString AppConfiguration::GetLastBackupDir()
function CString (line 125) | CString AppConfiguration::GetDefaultBackupDir(BOOL bCheckExistence/* = T...
function DWORD (line 156) | DWORD AppConfiguration::GetLastCheckUpdateTime()
function BOOL (line 177) | BOOL AppConfiguration::GetCheckingUpdateDisabled()
function BOOL (line 190) | BOOL AppConfiguration::GetSyncLoading()
function DWORD (line 195) | DWORD AppConfiguration::GetAsyncLoading()
function BOOL (line 210) | BOOL AppConfiguration::GetLoadingDataOnScroll()
function BOOL (line 220) | BOOL AppConfiguration::GetNormalPagination()
function BOOL (line 230) | BOOL AppConfiguration::GetPaginationOnYear()
function BOOL (line 240) | BOOL AppConfiguration::GetPaginationOnMonth()
function BOOL (line 250) | BOOL AppConfiguration::GetSupportingFilter()
function BOOL (line 262) | BOOL AppConfiguration::OutputDebugLogs()
function BOOL (line 274) | BOOL AppConfiguration::IncludeSubscriptions()
function BOOL (line 286) | BOOL AppConfiguration::GetOpenningFolderAfterExp()
function BOOL (line 293) | BOOL AppConfiguration::IsPdfSupported()
function BOOL (line 373) | BOOL AppConfiguration::GetStringProperty(LPCTSTR name, CString& value)
function BOOL (line 393) | BOOL AppConfiguration::SetStringProperty(LPCTSTR name, LPCTSTR value)
function BOOL (line 406) | BOOL AppConfiguration::GetDwordProperty(LPCTSTR name, DWORD& value)
function DWORD (line 419) | DWORD AppConfiguration::GetDwordValue(LPCTSTR name, DWORD defaultValue)
function BOOL (line 430) | BOOL AppConfiguration::SetDwordProperty(LPCTSTR name, DWORD value)
FILE: vcproject/AppConfiguration.h
function class (line 11) | class AppConfiguration
FILE: vcproject/BackupDlg.h
function class (line 9) | class CBackupDlg : public CDialogImpl<CBackupDlg>
function LRESULT (line 100) | LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOO...
FILE: vcproject/ColoredControls.h
function BOOL (line 60) | BOOL SetBitmap(UINT nRes)
function SetColor (line 71) | void SetColor(COLORREF clr)
function MESSAGE_HANDLER (line 83) | BEGIN_MSG_MAP(CColoredDialog)
function BOOL (line 123) | BOOL SubclassWindow(HWND hWnd)
function SetNormalColors (line 139) | void SetNormalColors(COLORREF clrText, COLORREF clrBack)
function SetDisabledColors (line 159) | void SetDisabledColors(COLORREF clrText, COLORREF clrBack)
function SetBkColor (line 179) | void SetBkColor(COLORREF clrBack)
function _Init (line 192) | void _Init()
function MESSAGE_HANDLER (line 202) | BEGIN_MSG_MAP(CColoredStaticImpl)
function LRESULT (line 216) | LRESULT OnCtlColorStatic(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/...
function LRESULT (line 225) | LRESULT OnCtlColorDlg(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*...
function class (line 614) | class CColoredButtonCtrl : public CColoredButtonImpl<CColoredButtonCtrl>
function class (line 794) | class CColoredComboBoxCtrl : public CColoredComboBoxImpl<CColoredComboBo...
function class (line 1051) | class CColoredTabCtrl : public CColoredTabImpl<CColoredTabCtrl>
function InsertItem (line 1116) | int InsertItem(int nItem, LPCTSTR lpszItem, int nImage)
function DWORD_PTR (line 1121) | DWORD_PTR GetItemData(int nItem) const
function BOOL (line 1131) | BOOL SetItemColors(int nItem, int nSubItem, COLORREF clrText, COLORREF c...
function BOOL (line 1149) | BOOL SetItemData(int /*nItem*/, DWORD_PTR /*dwData*/)
function AddItem (line 1154) | int AddItem(int /*nItem*/, int /*nSubItem*/, LPCTSTR /*strItem*/, int /*...
function _Init (line 1162) | void _Init()
function MESSAGE_HANDLER (line 1170) | BEGIN_MSG_MAP(CColoredListViewImpl)
function LRESULT (line 1186) | LRESULT OnDeleteItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
function LRESULT (line 1195) | LRESULT OnNotifyCustomDraw(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
function DWORD (line 1213) | DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
function DWORD (line 1217) | DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
function DWORD (line 1221) | DWORD OnSubItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw)
function class (line 1233) | class CColoredListViewCtrl : public CColoredListViewImpl<CColoredListVie...
function class (line 1353) | class CColoredTreeViewCtrl : public CColoredTreeViewImpl<CColoredTreeVie...
FILE: vcproject/ExportNotifierImpl.h
function class (line 6) | class ExportNotifierImpl : public ExportNotifier
FILE: vcproject/ITunesDetector.h
function class (line 6) | class ITunesDetector
FILE: vcproject/LogListBox.h
function class (line 98) | class CLogListBox : public CLogListBoxImpl<CLogListBox>
FILE: vcproject/LoggerImpl.h
function class (line 8) | class LoggerImpl : public Logger
FILE: vcproject/MainFrm.h
function virtual (line 18) | virtual BOOL PreTranslateMessage(MSG* pMsg)
function virtual (line 26) | virtual BOOL OnIdle()
FILE: vcproject/PdfConverterImpl.h
function class (line 7) | class PdfConverterImpl : public PdfConverter
FILE: vcproject/ProgressListViewCtrl.h
function BOOL (line 27) | BOOL SubclassWindow(HWND hWnd)
function LRESULT (line 38) | LRESULT OnNotifyCustomDraw(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
function DWORD (line 53) | DWORD OnPrePaint(int idCtrl, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
function DWORD (line 58) | DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
function DWORD (line 63) | DWORD OnSubItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw)
function SetProgressPos (line 138) | void SetProgressPos(int progressPos)
function ClearProgressBar (line 148) | void ClearProgressBar()
FILE: vcproject/TextProgressBarCtrl.h
function LRESULT (line 60) | LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHan...
function DrawThemedProgressBar (line 87) | void DrawThemedProgressBar(CMemoryDC& dc, const CRect& rc)
function DrawClassicProgressBar (line 96) | void DrawClassicProgressBar(CMemoryDC& dc, const CRect& rc)
function DrawText (line 114) | void DrawText(CMemoryDC& dc, const CRect& rc)
function class (line 136) | class CTextProgressBarCtrl : public CTextProgressBarCtrlT<CTextProgressB...
FILE: vcproject/ToolTipButton.h
function m_lpstrToolTipText (line 30) | m_lpstrToolTipText(NULL)
function BOOL (line 41) | BOOL SubclassWindow(HWND hWnd)
function GetToolTipText (line 60) | bool GetToolTipText(LPTSTR lpstrText, int nLength) const
function SetToolTipText (line 71) | bool SetToolTipText(LPCTSTR lpstrText)
function MESSAGE_HANDLER (line 104) | BEGIN_MSG_MAP(CBitmapButtonImpl)
function LRESULT (line 132) | LRESULT OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bH...
function Init (line 142) | void Init()
function BOOL (line 156) | BOOL StartTrackMouseLeave()
function class (line 166) | class CToolTipButton : public CToolTipButtonImpl<CToolTipButton>
FILE: vcproject/VersionDetector.h
function class (line 5) | class VersionDetector
FILE: vcproject/View.h
type VIEW_STATE (line 27) | enum VIEW_STATE
function class (line 62) | class CLoadingHandler
function LRESULT (line 198) | LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHan...
function OnFinalMessage (line 302) | void OnFinalMessage(HWND hWnd)
function BOOL (line 318) | BOOL PreTranslateMessage(MSG* pMsg)
function MESSAGE_HANDLER (line 323) | BEGIN_MSG_MAP(CView)
function LRESULT (line 393) | LRESULT OnUpdateViewState(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&...
function LRESULT (line 404) | LRESULT OnLoadData(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
function LRESULT (line 421) | LRESULT OnCheckUpdate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHa...
function LRESULT (line 513) | LRESULT OnBackupSelChange(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWn...
function LRESULT (line 568) | LRESULT OnUserSelChange(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndC...
function LRESULT (line 648) | LRESULT OnBnClickedShowLogs(WORD /*wNotifyCode*/, WORD /*wID*/, HWND hWn...
function LRESULT (line 661) | LRESULT OnBnClickedClose(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWnd...
function LRESULT (line 684) | LRESULT OnListItemChanged(int idCtrl, LPNMHDR pnmh, BOOL& /*bHandled*/)
function LRESULT (line 700) | LRESULT OnListClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
function LRESULT (line 721) | LRESULT OnBnClickedExpITunes(WORD /*wNotifyCode*/, WORD /*wID*/, HWND hW...
function onCopyFile (line 796) | bool onCopyFile(const ITunesDb* iTunesDb, const ITunesFile* file, DWORD&...
function ExportITunesBackup (line 816) | void ExportITunesBackup()
function LRESULT (line 986) | LRESULT OnStart(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
function LRESULT (line 996) | LRESULT OnComplete(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
function LRESULT (line 1033) | LRESULT OnProgress(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
function LRESULT (line 1038) | LRESULT OnUserSessionStart(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL...
function LRESULT (line 1048) | LRESULT OnUserSessionComplete(UINT uMsg, WPARAM wParam, LPARAM lParam, B...
function LRESULT (line 1057) | LRESULT OnSessionStart(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bH...
function LRESULT (line 1074) | LRESULT OnSessionComplete(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&...
function LRESULT (line 1086) | LRESULT OnSessionProgress(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&...
function LRESULT (line 1103) | LRESULT OnTasksStart(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHan...
function LRESULT (line 1114) | LRESULT OnTasksComplete(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& b...
function LRESULT (line 1123) | LRESULT OnTasksProgress(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& b...
function UpdateProgressBarOnDownloadingEmoji (line 1190) | void UpdateProgressBarOnDownloadingEmoji(uint32_t restedNumberOfFiles, u...
function UpdateProgressBar (line 1200) | void UpdateProgressBar(int increasedPos, int increasedUpper)
function InitializeSessionList (line 1348) | void InitializeSessionList()
function InitializeSessionProgressList (line 1409) | void InitializeSessionProgressList()
function GetCheckedSessionsAndCopyItems (line 1469) | void GetCheckedSessionsAndCopyItems(std::map<std::string, std::map<std::...
function LoadUsers (line 1533) | void LoadUsers(const CString& versions)
function LoadSessions (line 1562) | void LoadSessions(BOOL allUsers, const std::string& usrName)
function SyncHeaderCheckbox (line 1650) | void SyncHeaderCheckbox()
FILE: vcproject/ViewHelper.cpp
type LibraryDeleter (line 8) | struct LibraryDeleter
function MessageBoxTimeoutA (line 22) | int MessageBoxTimeoutA(HWND hWnd, LPCSTR lpText,
function MessageBoxTimeoutW (line 40) | int MessageBoxTimeoutW(HWND hWnd, LPCWSTR lpText,
function MsgBox (line 57) | int MsgBox(HWND hWnd, UINT uStrId, UINT uType/* = MB_OK*/)
function MsgBox (line 64) | int MsgBox(HWND hWnd, const CString& text, UINT uType/* = MB_OK*/)
function SetComboBoxCurSel (line 71) | void SetComboBoxCurSel(HWND hWnd, CComboBox &cbm, int nCurSel)
function CheckAllItems (line 78) | void CheckAllItems(CListViewCtrl& listViewCtrl, BOOL fChecked)
function SetHeaderCheckState (line 86) | void SetHeaderCheckState(CListViewCtrl& listViewCtrl, BOOL fChecked)
function BOOL (line 103) | BOOL SetHeaderCheckState(CListViewCtrl& listViewCtrl)
type ExplorerFolderInfo (line 114) | struct ExplorerFolderInfo
function GetCurrentExplorerFolders (line 122) | std::vector< ExplorerFolderInfo > GetCurrentExplorerFolders()
function BOOL (line 197) | BOOL OpenFolder(LPCTSTR szFolder)
FILE: vcproject/ViewHelper.h
type CoTaskMemDeleter (line 40) | struct CoTaskMemDeleter
FILE: vcproject/WechatExporter.cpp
function Run (line 23) | int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
function _tWinMain (line 44) | int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, L...
FILE: vcproject/WechatExporterCmd.cpp
function UPrint (line 22) | void UPrint(LPCWSTR String) {
class LoggerImpl (line 109) | class LoggerImpl : public Logger
method LoggerImpl (line 116) | LoggerImpl()
method write (line 128) | void write(const std::string& log)
method debug (line 143) | void debug(const std::string& log)
function parseArgumentwithQuatoW (line 160) | std::string parseArgumentwithQuatoW(LPCWSTR path)
function main (line 185) | int main()
function getCurrentLanguageCode (line 306) | std::string getCurrentLanguageCode()
Condensed preview — 187 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,571K chars).
[
{
"path": ".gitignore",
"chars": 7699,
"preview": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n"
},
{
"path": "LICENSE",
"chars": 18092,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Fr"
},
{
"path": "README.md",
"chars": 4557,
"preview": "# WechatExporter\n \n \n> **BUG!!! 1.8.0.7以前的版本异步加载方式存在一个比较严重的小白bug:当设置为滚动到页面底部异步加载时,越靠后面的页码,加载的消息数量越少;设置为页面打开全部消息异步加载时,消息"
},
{
"path": "WechatExporter/AppConfiguration.h",
"chars": 2036,
"preview": "//\n// AppConfiguration.h\n// WechatExporter\n//\n// Created by Matthew on 2021/3/18.\n// Copyright © 2021 Matthew. All r"
},
{
"path": "WechatExporter/AppConfiguration.mm",
"chars": 9596,
"preview": "//\n// AppConfiguration.m\n// WechatExporter\n//\n// Created by Matthew on 2021/3/18.\n// Copyright © 2021 Matthew. All r"
},
{
"path": "WechatExporter/AppDelegate.h",
"chars": 386,
"preview": "//\n// AppDelegate.h\n// WechatExporter\n//\n// Created by Matthew on 2020/9/29.\n// Copyright © 2020 Matthew. All rights"
},
{
"path": "WechatExporter/AppDelegate.mm",
"chars": 10150,
"preview": "//\r\n// AppDelegate.m\r\n// WechatExporter\r\n//\r\n// Created by Matthew on 2020/9/29.\r\n// Copyright © 2020 Matthew. All r"
},
{
"path": "WechatExporter/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1269,
"preview": "{\r\n \"images\" : [\r\n {\r\n \"filename\" : \"16.png\",\r\n \"idiom\" : \"mac\",\r\n \"scale\" : \"1x\",\r\n \"size\" : \"1"
},
{
"path": "WechatExporter/Assets.xcassets/Contents.json",
"chars": 69,
"preview": "{\r\n \"info\" : {\r\n \"author\" : \"xcode\",\r\n \"version\" : 1\r\n }\r\n}\r\n"
},
{
"path": "WechatExporter/Assets.xcassets/MainMenuCN.imageset/Contents.json",
"chars": 397,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"main-menu-cn@1x.png\",\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "WechatExporter/Assets.xcassets/MainMenuEN.imageset/Contents.json",
"chars": 397,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"main-menu-en@1x.png\",\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "WechatExporter/Base.lproj/Main.storyboard",
"chars": 56716,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" t"
},
{
"path": "WechatExporter/ExportNotifierImpl.h",
"chars": 3995,
"preview": "#pragma once\n\n#include \"ExportNotifier.h\"\n#include \"ViewController.h\"\n\nclass ExportNotifierImpl : public ExportNotifier\n"
},
{
"path": "WechatExporter/HttpHelper.h",
"chars": 311,
"preview": "//\n// HttpHelper.h\n// WechatExporter\n//\n// Created by Matthew on 2021/3/9.\n// Copyright © 2021 Matthew. All rights r"
},
{
"path": "WechatExporter/HttpHelper.mm",
"chars": 2484,
"preview": "//\n// HttpHelper.m\n// WechatExporter\n//\n// Created by Matthew on 2021/3/9.\n// Copyright © 2021 Matthew. All rights r"
},
{
"path": "WechatExporter/Info.plist",
"chars": 1304,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "WechatExporter/LICENSES/jsoncpp.LICENSE",
"chars": 2723,
"preview": "The JsonCpp library's source code, including accompanying documentation, \ntests and demonstration applications, are lice"
},
{
"path": "WechatExporter/LICENSES/lame.LICENSE",
"chars": 487,
"preview": "Can I use LAME in my commercial program? \n\nYes, you can, under the restrictions of the LGPL (see COPYING\nin this folder"
},
{
"path": "WechatExporter/LICENSES/libcurl.COPYING",
"chars": 1088,
"preview": "COPYRIGHT AND PERMISSION NOTICE\n\nCopyright (c) 1996 - 2020, Daniel Stenberg, <daniel@haxx.se>, and many\ncontributors, se"
},
{
"path": "WechatExporter/LICENSES/libimobiledevice-glue.COPYING",
"chars": 26434,
"preview": "\t\t GNU LESSER GENERAL PUBLIC LICENSE\n\t\t Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Found"
},
{
"path": "WechatExporter/LICENSES/libimobiledevice.COPYING.LESSER",
"chars": 26434,
"preview": "\t\t GNU LESSER GENERAL PUBLIC LICENSE\n\t\t Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Found"
},
{
"path": "WechatExporter/LICENSES/libplist.COPYING.LESSER",
"chars": 26434,
"preview": "\t\t GNU LESSER GENERAL PUBLIC LICENSE\n\t\t Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Found"
},
{
"path": "WechatExporter/LICENSES/libusbmuxd.COPYING",
"chars": 26434,
"preview": "\t\t GNU LESSER GENERAL PUBLIC LICENSE\n\t\t Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Found"
},
{
"path": "WechatExporter/LICENSES/libxml2.Copyright",
"chars": 1289,
"preview": "Except where otherwise noted in the source code (e.g. the files hash.c,\nlist.c and the trio files, which are covered by "
},
{
"path": "WechatExporter/LICENSES/opencore-amr.LICENSE",
"chars": 10271,
"preview": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AN"
},
{
"path": "WechatExporter/LICENSES/openssl.LICENSE",
"chars": 6121,
"preview": "\n LICENSE ISSUES\n ==============\n\n The OpenSSL toolkit stays under a double license, i.e. both the conditions of\n th"
},
{
"path": "WechatExporter/LICENSES/protobuf.LICENSE",
"chars": 1732,
"preview": "Copyright 2008 Google Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmod"
},
{
"path": "WechatExporter/LoggerImpl.h",
"chars": 2463,
"preview": "//\n// LoggerImpl.h\n// WechatExporter\n//\n// Created by Matthew on 2020/10/1.\n// Copyright © 2020 Matthew. All rights "
},
{
"path": "WechatExporter/PdfConverterImpl.h",
"chars": 7571,
"preview": "//\n// PdfConverterImpl.h\n// WechatExporter\n//\n// Created by Matthew on 2021/4/22.\n// Copyright © 2021 Matthew. All r"
},
{
"path": "WechatExporter/SessionDataSource.h",
"chars": 2005,
"preview": "//\n// SessionDataSource.h\n// WechatExporter\n//\n// Created by Matthew on 2021/2/1.\n// Copyright © 2021 Matthew. All r"
},
{
"path": "WechatExporter/SessionDataSource.mm",
"chars": 10692,
"preview": "//\n// SessionDataSource.m\n// WechatExporter\n//\n// Created by Matthew on 2021/2/1.\n// Copyright © 2021 Matthew. All r"
},
{
"path": "WechatExporter/ViewController copy.mm",
"chars": 16324,
"preview": "//\r\n// ViewController.m\r\n// WechatExporter\r\n//\r\n// Created by Matthew on 2020/9/29.\r\n// Copyright © 2020 Matthew. Al"
},
{
"path": "WechatExporter/ViewController.h",
"chars": 1470,
"preview": "//\n// ViewController.h\n// WechatExporter\n//\n// Created by Matthew on 2020/9/29.\n// Copyright © 2020 Matthew. All rig"
},
{
"path": "WechatExporter/ViewController.mm",
"chars": 39855,
"preview": "//\r\n// ViewController.mm\r\n// WechatExporter\r\n//\r\n// Created by Matthew on 2020/9/29.\r\n// Copyright © 2020 Matthew. A"
},
{
"path": "WechatExporter/WechatExporter.entitlements",
"chars": 530,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/"
},
{
"path": "WechatExporter/core/AsyncExecutor.cpp",
"chars": 4786,
"preview": "//\n// AsyncExecutor.cpp\n// WechatExporter\n//\n// Created by Matthew on 2021/4/17.\n// Copyright © 2021 Matthew. All ri"
},
{
"path": "WechatExporter/core/AsyncExecutor.h",
"chars": 2916,
"preview": "//\n// AsyncExecutor.h\n// WechatExporter\n//\n// Created by Matthew on 2021/4/17.\n// Copyright © 2021 Matthew. All righ"
},
{
"path": "WechatExporter/core/AsyncTask.cpp",
"chars": 9500,
"preview": "//\n// AsyncTask.cpp\n// WechatExporter\n//\n// Created by Matthew on 2021/4/20.\n// Copyright © 2021 Matthew. All rights"
},
{
"path": "WechatExporter/core/AsyncTask.h",
"chars": 3789,
"preview": "//\n// AsyncTask.h\n// WechatExporter\n//\n// Created by Matthew on 2021/4/20.\n// Copyright © 2021 Matthew. All rights r"
},
{
"path": "WechatExporter/core/ByteArrayLocater.h",
"chars": 2653,
"preview": "//\n// ByteArrayLocater.h\n// WechatExporter\n//\n// Created by Matthew on 2020/10/19.\n// Copyright © 2020 Matthew. All "
},
{
"path": "WechatExporter/core/DownloadPool.cpp",
"chars": 3487,
"preview": "//\n// DownloadPool.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All rig"
},
{
"path": "WechatExporter/core/DownloadPool.h",
"chars": 1253,
"preview": "//\n// DownloadPool.h\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All right"
},
{
"path": "WechatExporter/core/Downloader.cpp",
"chars": 12552,
"preview": "//\n// Downloader.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All right"
},
{
"path": "WechatExporter/core/Downloader.h",
"chars": 3179,
"preview": "//\n// Downloader.h\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All rights "
},
{
"path": "WechatExporter/core/ExportContext.h",
"chars": 21385,
"preview": "//\n// ExportContext.h\n// WechatExporter\n//\n// Created by Matthew on 2021/7/15.\n// Copyright © 2021 Matthew. All righ"
},
{
"path": "WechatExporter/core/ExportNotifier.h",
"chars": 1259,
"preview": "#ifndef ExportNotifier_h\n#define ExportNotifier_h\n\nclass ExportNotifier\n{\npublic:\n\n\tvirtual ~ExportNotifier() {}\n\n vi"
},
{
"path": "WechatExporter/core/ExportOption.h",
"chars": 8269,
"preview": "//\n// ExportOption.h\n// WechatExporter\n//\n// Created by Matthew on 2022/7/10.\n// Copyright © 2022 Matthew. All right"
},
{
"path": "WechatExporter/core/Exporter.cpp",
"chars": 51739,
"preview": "//\n// Exporter.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All rights "
},
{
"path": "WechatExporter/core/Exporter.h",
"chars": 5307,
"preview": "//\n// Exporter.h\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All rights re"
},
{
"path": "WechatExporter/core/FileSystem.cpp",
"chars": 35408,
"preview": "//\r\n// FileSystem_Win.cpp\r\n// WechatExporter\r\n//\r\n// Created by Matthew on 2021/1/21.\r\n// Copyright © 2021 Matthew. "
},
{
"path": "WechatExporter/core/FileSystem.h",
"chars": 3995,
"preview": "//\n// FileSystem.h\n// WechatExporter\n//\n// Created by Matthew on 2021/1/21.\n// Copyright © 2021 Matthew. All rights "
},
{
"path": "WechatExporter/core/IDeviceBackup.cpp",
"chars": 81593,
"preview": "//\n// IDevice.cpp\n// WechatExporter\n//\n// Created by Matthew on 2021/12/7.\n// Copyright © 2021 Matthew. All rights r"
},
{
"path": "WechatExporter/core/IDeviceBackup.h",
"chars": 3698,
"preview": "//\n// IDevice.h\n// WechatExporter\n//\n// Created by Matthew on 2021/12/7.\n// Copyright © 2021 Matthew. All rights res"
},
{
"path": "WechatExporter/core/ITunesParser.cpp",
"chars": 39454,
"preview": "//\n// ITunesParser.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/9/29.\n// Copyright © 2020 Matthew. All rig"
},
{
"path": "WechatExporter/core/ITunesParser.h",
"chars": 9599,
"preview": "//\n// ITunesParser.h\n// WechatExporter\n//\n// Created by Matthew on 2020/9/29.\n// Copyright © 2020 Matthew. All right"
},
{
"path": "WechatExporter/core/Logger.h",
"chars": 362,
"preview": "//\n// Logger.h\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All rights rese"
},
{
"path": "WechatExporter/core/MMKVReader.h",
"chars": 3178,
"preview": "//\n// MMKVReader.h\n// WechatExporter\n//\n// Created by Matthew on 2021/1/26.\n// Copyright © 2021 Matthew. All rights "
},
{
"path": "WechatExporter/core/MbdbReader.h",
"chars": 4411,
"preview": "//\n// MbdbReader.h\n// WechatExporter\n//\n// Created by Matthew on 2021/6/25.\n// Copyright © 2021 Matthew. All rights "
},
{
"path": "WechatExporter/core/MessageParser.cpp",
"chars": 78668,
"preview": "//\n// MessageParser.cpp\n// WechatExporter\n//\n// Created by Matthew on 2021/2/22.\n// Copyright © 2021 Matthew. All ri"
},
{
"path": "WechatExporter/core/MessageParser.h",
"chars": 17391,
"preview": "//\n// MessageParser.h\n// WechatExporter\n//\n// Created by Matthew on 2021/2/22.\n// Copyright © 2021 Matthew. All righ"
},
{
"path": "WechatExporter/core/PdfConverter.h",
"chars": 430,
"preview": "//\n// PdfConverter.h\n// WechatExporter\n//\n// Created by Matthew on 2021/4/14.\n// Copyright © 2021 Matthew. All right"
},
{
"path": "WechatExporter/core/RawMessage.cpp",
"chars": 6057,
"preview": "//\n// RawMessage.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/10/13.\n// Copyright © 2020 Matthew. All righ"
},
{
"path": "WechatExporter/core/RawMessage.h",
"chars": 4413,
"preview": "//\n// RawMessage.h\n// WechatExporter\n//\n// Created by Matthew on 2020/10/13.\n// Copyright © 2020 Matthew. All rights"
},
{
"path": "WechatExporter/core/ResManager.cpp",
"chars": 15831,
"preview": "//\n// BaseResConverter.cpp\n// WechatExporter\n//\n// Created by Matthew on 2021/10/27.\n// Copyright © 2021 Matthew. Al"
},
{
"path": "WechatExporter/core/ResManager.h",
"chars": 3845,
"preview": "//\n// BaseResConverter.h\n// WechatExporter\n//\n// Created by Matthew on 2021/10/26.\n// Copyright © 2021 Matthew. All "
},
{
"path": "WechatExporter/core/TaskManager.cpp",
"chars": 9557,
"preview": "//\n// TaskManager.cpp\n// WechatExporter\n//\n// Created by Matthew on 2021/4/20.\n// Copyright © 2021 Matthew. All righ"
},
{
"path": "WechatExporter/core/TaskManager.h",
"chars": 2446,
"preview": "//\n// SessionTaskManager.h\n// WechatExporter\n//\n// Created by Matthew on 2021/4/20.\n// Copyright © 2021 Matthew. All"
},
{
"path": "WechatExporter/core/Template.cpp",
"chars": 1683,
"preview": "//\n// Template.cpp\n// WechatExporter\n//\n// Created by Matthew on 2022/4/21.\n// Copyright © 2022 Matthew. All rights "
},
{
"path": "WechatExporter/core/Template.h",
"chars": 904,
"preview": "//\n// Template.h\n// WechatExporter\n//\n// Created by Matthew on 2022/4/21.\n// Copyright © 2022 Matthew. All rights re"
},
{
"path": "WechatExporter/core/Updater.cpp",
"chars": 2684,
"preview": "//\n// Updater.cpp\n// WechatExporter\n//\n// Created by Matthew on 2021/3/6.\n// Copyright © 2021 Matthew. All rights re"
},
{
"path": "WechatExporter/core/Updater.h",
"chars": 604,
"preview": "//\n// Updater.h\n// WechatExporter\n//\n// Created by Matthew on 2021/3/6.\n// Copyright © 2021 Matthew. All rights rese"
},
{
"path": "WechatExporter/core/Utils.cpp",
"chars": 15660,
"preview": "//\r\n// Utils.cpp\r\n// WechatExporter\r\n//\r\n// Created by Matthew on 2020/9/30.\r\n// Copyright © 2020 Matthew. All right"
},
{
"path": "WechatExporter/core/Utils.h",
"chars": 4659,
"preview": "//\n// util.h\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All rights reserv"
},
{
"path": "WechatExporter/core/Utils_audio.cpp",
"chars": 7106,
"preview": "//\n// Utils_audio.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All righ"
},
{
"path": "WechatExporter/core/Utils_md5.cpp",
"chars": 3673,
"preview": "//\n// Utils.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All rights res"
},
{
"path": "WechatExporter/core/Utils_protobuf.cpp",
"chars": 5548,
"preview": "//\n// Utils.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All rights res"
},
{
"path": "WechatExporter/core/Utils_silk.cpp",
"chars": 18789,
"preview": "#ifdef _WIN32\n#define _CRT_SECURE_NO_DEPRECATE 1\n#endif\n\n#include \"Utils.h\"\n#include \"FileSystem.h\"\n#include <stdio.h"
},
{
"path": "WechatExporter/core/Utils_thread.cpp",
"chars": 1725,
"preview": "//\n// Utils_thread.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All rig"
},
{
"path": "WechatExporter/core/Utils_xml.cpp",
"chars": 2295,
"preview": "//\n// Utils.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All rights res"
},
{
"path": "WechatExporter/core/WechatObjects.h",
"chars": 25329,
"preview": "//\n// WechatObjects.h\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All righ"
},
{
"path": "WechatExporter/core/WechatParser.cpp",
"chars": 64831,
"preview": "//\n// WechatParser.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All rig"
},
{
"path": "WechatExporter/core/WechatParser.h",
"chars": 9504,
"preview": "//\n// WechatParser.h\n// WechatExporter\n//\n// Created by Matthew on 2020/9/30.\n// Copyright © 2020 Matthew. All right"
},
{
"path": "WechatExporter/core/WechatSource.h",
"chars": 1830,
"preview": "//\n// WechatDataSource.h\n// WechatExporter\n//\n// Created by Matthew on 2021/12/23.\n// Copyright © 2021 Matthew. All "
},
{
"path": "WechatExporter/core/XmlParser.cpp",
"chars": 6343,
"preview": "//\n// XmlParser.cpp\n// WechatExporter\n//\n// Created by Matthew on 2020/11/12.\n// Copyright © 2020 Matthew. All right"
},
{
"path": "WechatExporter/core/XmlParser.h",
"chars": 5215,
"preview": "//\n// XmlParser.hpp\n// WechatExporter\n//\n// Created by Matthew on 2020/11/12.\n// Copyright © 2020 Matthew. All right"
},
{
"path": "WechatExporter/core/endianness.h",
"chars": 2217,
"preview": "#ifndef ENDIANNESS_H\n#define ENDIANNESS_H\n\n#ifndef __LITTLE_ENDIAN\n#define __LITTLE_ENDIAN 1234\n#endif\n\n#ifndef __BIG_EN"
},
{
"path": "WechatExporter/core/md5.c",
"chars": 9387,
"preview": "/*\n * This code implements the MD5 message-digest algorithm.\n * The algorithm is due to Ron Rivest. This code was\n * wr"
},
{
"path": "WechatExporter/core/md5.h",
"chars": 1352,
"preview": "/* See md5.c for explanation and copyright information. */\n// https://opensource.apple.com/source/cvs/cvs-19/cvs/lib/md"
},
{
"path": "WechatExporter/core/semaphore.h",
"chars": 615,
"preview": "#pragma once\n\n#include <mutex>\n#include <condition_variable>\n\nclass semaphore\n{\nprivate:\n\tstd::mutex mutex_;\n\tstd::condi"
},
{
"path": "WechatExporter/en.lproj/Localizable.strings",
"chars": 1679,
"preview": "/* \n Localizable.strings\n WechatExporter\n\n Created by Matthew on 2021/3/10.\n Copyright © 2021 Matthew. All rights re"
},
{
"path": "WechatExporter/en.lproj/Main.strings",
"chars": 6128,
"preview": "\n/* Class = \"NSButtonCell\"; title = \"...\"; ObjectID = \"1GT-FK-TVG\"; */\n\"1GT-FK-TVG.title\" = \"...\";\n\n/* Class = \"NSMenuIt"
},
{
"path": "WechatExporter/main.m",
"chars": 364,
"preview": "//\r\n// main.m\r\n// WechatExporter\r\n//\r\n// Created by Matthew on 2020/9/29.\r\n// Copyright © 2020 Matthew. All rights r"
},
{
"path": "WechatExporter/res/emoji/emoji.json",
"chars": 60093,
"preview": "[\n {\n \"preTag\": \"[\",\n \"postTag\": \"]\",\n \"keys\": [\n {\n \"key\": \"666\",\n "
},
{
"path": "WechatExporter/res/en.txt",
"chars": 1013,
"preview": "[\n\t{\n\t\t\"key\": \"Transfer_Subtype_1\",\n\t\t\"value\": \"Transfer\"\n\t},\n\t\n\t{\n\t\t\"key\": \"Transfer_Subtype_3\",\n\t\t\"value\": \"Accepted \""
},
{
"path": "WechatExporter/res/templates/audio.html",
"chars": 605,
"preview": "\t\t\t\t<div class=\"msg media %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-"
},
{
"path": "WechatExporter/res/templates/card.html",
"chars": 568,
"preview": "\t\t\t\t<div class=\"msg media %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-"
},
{
"path": "WechatExporter/res/templates/channels.html",
"chars": 833,
"preview": "\t\t\t\t<div class=\"msg chat %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-b"
},
{
"path": "WechatExporter/res/templates/emoji.html",
"chars": 470,
"preview": "\t\t\t\t<div class=\"msg media %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-"
},
{
"path": "WechatExporter/res/templates/filter.html",
"chars": 568,
"preview": "\t\t\t\t\t<input placeholder=\"%%ML:Press [Enter] key after inputting keywords%%\" id=\"filter-keyword\" class=\"filter-btn\" onkey"
},
{
"path": "WechatExporter/res/templates/frame.html",
"chars": 32178,
"preview": "<!doctype html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width,initial-scal"
},
{
"path": "WechatExporter/res/templates/frame_filter.html",
"chars": 9466,
"preview": "<!doctype html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width,initial-scal"
},
{
"path": "WechatExporter/res/templates/image.html",
"chars": 505,
"preview": "\t\t\t\t<div class=\"msg media %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-"
},
{
"path": "WechatExporter/res/templates/listframe.html",
"chars": 831,
"preview": "<!doctype html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width,initial-scal"
},
{
"path": "WechatExporter/res/templates/listitem.html",
"chars": 240,
"preview": " <tr height=\"60\">\n <td width=\"100\" align=\"center\">\n <img src=\"%%ITEMPICPATH%%\" style=\"float:left;max-widt"
},
{
"path": "WechatExporter/res/templates/member.html",
"chars": 491,
"preview": "\t\t\t\t<div class=\"msg media %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-"
},
{
"path": "WechatExporter/res/templates/members.html",
"chars": 491,
"preview": "\t\t\t\t<div class=\"msg media %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-"
},
{
"path": "WechatExporter/res/templates/msg.html",
"chars": 454,
"preview": "\t\t\t\t<div class=\"msg chat %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-b"
},
{
"path": "WechatExporter/res/templates/notice.html",
"chars": 194,
"preview": "\t\t\t\t<div class=\"msg chat-notice %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\">\n\t\t\t\t\t<div class=\"content-box\">\n\t\t\t\t\t\t<span class=\"dont"
},
{
"path": "WechatExporter/res/templates/plainshare.html",
"chars": 797,
"preview": "\t\t\t\t<div class=\"msg chat %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-b"
},
{
"path": "WechatExporter/res/templates/refermsg.html",
"chars": 601,
"preview": "\t\t\t\t<div class=\"msg chat %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-b"
},
{
"path": "WechatExporter/res/templates/scripts.html",
"chars": 254,
"preview": " (function() {\n var msgArray = %%JSON_DATA%%;\n for (var idx = 0; idx < msgArray.length; idx++)\n "
},
{
"path": "WechatExporter/res/templates/share.html",
"chars": 994,
"preview": "\t\t\t\t<div class=\"msg chat %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-b"
},
{
"path": "WechatExporter/res/templates/system.html",
"chars": 148,
"preview": "\t\t <div class=\"msg chat-notice %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\"><span class=\"dont-break-out\">%%ML:System Message:"
},
{
"path": "WechatExporter/res/templates/thumb.html",
"chars": 482,
"preview": "\t\t\t\t<div class=\"msg media %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-"
},
{
"path": "WechatExporter/res/templates/transfer.html",
"chars": 1036,
"preview": "\t\t\t\t<div class=\"msg chat %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-b"
},
{
"path": "WechatExporter/res/templates/video.html",
"chars": 540,
"preview": "\t\t\t\t<div class=\"msg media %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-"
},
{
"path": "WechatExporter/res/templates/videonew.html",
"chars": 486,
"preview": "\t\t\t\t<div class=\"msg media %%ALIGNMENT%% %%EXTRA_CLS%%\" msgid=\"%%MSGID%%\" msgtype=\"%%MSGTYPE%%\">\n\t\t\t\t\t<div class=\"avatar-"
},
{
"path": "WechatExporter/res/templates/wxemoji.html",
"chars": 93,
"preview": "<img src=\"%%EMOJI_PATH%%\" title=\"%%EMOJI_TITLE%%\" rawemoji=\"%%EMOJI_RAW%%\" class=\"wxemoji\" />"
},
{
"path": "WechatExporter/res/templates_txt/audio.html",
"chars": 32,
"preview": "%%NAME%% (%%TIME%%):%%MESSAGE%%\n"
},
{
"path": "WechatExporter/res/templates_txt/card.html",
"chars": 46,
"preview": "%%NAME%% (%%TIME%%):%%CARDTYPE%% %%CARDNAME%%\n"
},
{
"path": "WechatExporter/res/templates_txt/channels.html",
"chars": 60,
"preview": "%%NAME%% (%%TIME%%):%%MESSAGE%% - %%CHANNELS%% %%CARDNAME%%\n"
},
{
"path": "WechatExporter/res/templates_txt/emoji.html",
"chars": 35,
"preview": "%%NAME%% (%%TIME%%):%%ML:[Emoji]%%\n"
},
{
"path": "WechatExporter/res/templates_txt/frame.html",
"chars": 55,
"preview": "%%DISPLAYNAME%% - %%ML:WeChat Chat History%%\n\n%%BODY%%\n"
},
{
"path": "WechatExporter/res/templates_txt/image.html",
"chars": 35,
"preview": "%%NAME%% (%%TIME%%):%%ML:[Photo]%%\n"
},
{
"path": "WechatExporter/res/templates_txt/listframe.html",
"chars": 52,
"preview": "%%ML:WeChat Chat History%% %%USERNAME%%\n\n\n%%TBODY%%\n"
},
{
"path": "WechatExporter/res/templates_txt/listitem.html",
"chars": 14,
"preview": "%%ITEMLINK%%\n\n"
},
{
"path": "WechatExporter/res/templates_txt/msg.html",
"chars": 32,
"preview": "%%NAME%% (%%TIME%%):%%MESSAGE%%\n"
},
{
"path": "WechatExporter/res/templates_txt/notice.html",
"chars": 12,
"preview": "%%MESSAGE%%\n"
},
{
"path": "WechatExporter/res/templates_txt/plainshare.html",
"chars": 37,
"preview": "%%NAME%% (%%TIME%%):%%SHARINGTITLE%%\n"
},
{
"path": "WechatExporter/res/templates_txt/refermsg.html",
"chars": 71,
"preview": "「%%REFERNAME%%:%%REFERMSG%%」\n- - - - - - - - - - - - - - -\n%%MESSAGE%%\n"
},
{
"path": "WechatExporter/res/templates_txt/scripts.html",
"chars": 0,
"preview": ""
},
{
"path": "WechatExporter/res/templates_txt/share.html",
"chars": 51,
"preview": "%%NAME%% (%%TIME%%):%%SHARINGTITLE%% - %%APPNAME%%\n"
},
{
"path": "WechatExporter/res/templates_txt/system.html",
"chars": 35,
"preview": "%%ML:System Message:%% %%MESSAGE%%\n"
},
{
"path": "WechatExporter/res/templates_txt/thumb.html",
"chars": 32,
"preview": "%%NAME%% (%%TIME%%):%%MESSAGE%%\n"
},
{
"path": "WechatExporter/res/templates_txt/transfer.html",
"chars": 54,
"preview": "%%NAME%% (%%TIME%%):%%ML:Weixin Transfer%% %%MESSAGE%%"
},
{
"path": "WechatExporter/res/templates_txt/video.html",
"chars": 35,
"preview": "%%NAME%% (%%TIME%%):%%ML:[Video]%%\n"
},
{
"path": "WechatExporter/res/templates_txt/wxemoji.html",
"chars": 15,
"preview": "[%%EMOJI_RAW%%]"
},
{
"path": "WechatExporter/res/zh-Hans.txt",
"chars": 4080,
"preview": "[\n\t{\n\t\t\"key\": \"[Video]\",\n\t\t\"value\": \"[视频]\"\n\t},\n\t{\n\t\t\"key\": \"(Video Missed)\",\n\t\t\"value\": \"(视频丢失)\"\n\t},\n\t{\n\t\t\"key\": \"[Emoji"
},
{
"path": "WechatExporter/zh-Hans.lproj/Localizable.strings",
"chars": 1128,
"preview": "/* \n Localizable.strings\n WechatExporter\n\n Created by Matthew on 2021/3/10.\n Copyright © 2021 Matthew. All rights re"
},
{
"path": "WechatExporter/zh-Hans.lproj/Main.strings",
"chars": 5820,
"preview": "\n/* Class = \"NSButtonCell\"; title = \"...\"; ObjectID = \"1GT-FK-TVG\"; */\n\"1GT-FK-TVG.title\" = \"...\";\n\n/* Class = \"NSMenuIt"
},
{
"path": "WechatExporter.xcodeproj/project.pbxproj",
"chars": 43838,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "WechatExporter.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 166,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<Workspace\r\n version = \"1.0\">\r\n <FileRef\r\n location = \"self:WechatExpor"
},
{
"path": "WechatExporter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 246,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/"
},
{
"path": "WechatExporter.xcodeproj/xcshareddata/xcschemes/WechatExporter.xcscheme",
"chars": 2903,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1200\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "WechatExporter.xcworkspace/contents.xcworkspacedata",
"chars": 240,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:WechatExporter"
},
{
"path": "WechatExporter.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "WechatExporterCmd/WechatExporter.cpp",
"chars": 4367,
"preview": "//\n// main.cpp\n// WechatExporterCmd\n//\n// Created by Matthew on 2022/3/4.\n//\n\n#include <iostream>\n#include <string>\n#"
},
{
"path": "WechatExporterCmd/WechatExporterCmd.h",
"chars": 3865,
"preview": "//\n// main.cpp\n// WechatExporterCmd\n//\n// Created by Matthew on 2022/3/4.\n//\n\n#include <iostream>\n#include <string>\n#"
},
{
"path": "WechatExporterCmd.xcodeproj/project.pbxproj",
"chars": 37456,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "WechatExporterCmd.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "WechatExporterCmd.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "WechatExporterCmd.xcodeproj/xcshareddata/xcschemes/WechatExporterCmd.xcscheme",
"chars": 3951,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1200\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "docs/index.html",
"chars": 3368,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>微信聊天记录导出程序 Wechat Exporter</title>\n <meta charset=\"UTF-8\">\n <meta name="
},
{
"path": "docs/update.conf",
"chars": 79,
"preview": "1.8.0.8\nhttps://src.wakin.org/github/wxexp/\nhttps://src.wakin.org/github/wxexp/"
},
{
"path": "libplist.README.md",
"chars": 233,
"preview": "the libplist is for win32 from vcpkg as vcpkg install fails on x64-windows-static\nit should be from: https://github.com/"
},
{
"path": "release",
"chars": 8,
"preview": "releases"
},
{
"path": "vcproject/AboutDlg.h",
"chars": 1699,
"preview": "// aboutdlg.h : interface of the CAboutDlg class\n//\n////////////////////////////////////////////////////////////////////"
},
{
"path": "vcproject/AppConfiguration.cpp",
"chars": 10277,
"preview": "#include \"stdafx.h\"\r\n#include \"AppConfiguration.h\"\r\n#include \"PdfConverterImpl.h\"\r\n#include \"Core.h\"\r\n#include <Shlobj.h"
},
{
"path": "vcproject/AppConfiguration.h",
"chars": 2666,
"preview": "#pragma once\r\n\r\n#include <cstdint>\r\n\r\n#define ASYNC_NONE 0\r\n#define ASYNC_ONSCROLL 1\r\n#define ASYN"
},
{
"path": "vcproject/BackupDlg.h",
"chars": 2886,
"preview": "// aboutdlg.h : interface of the CAboutDlg class\n//\n////////////////////////////////////////////////////////////////////"
},
{
"path": "vcproject/ColoredControls.h",
"chars": 44160,
"preview": "#if !defined(AFX_COLOREDCONTROLS_H__20020226_0D16_1B29_088A_0080AD509054__INCLUDED_)\r\n#define AFX_COLOREDCONTROLS_H__200"
},
{
"path": "vcproject/Core.h",
"chars": 390,
"preview": "#pragma once\n\n#include \"..\\WechatExporter\\core\\FileSystem.h\"\n#include \"..\\WechatExporter\\core\\Logger.h\"\n#include \"..\\Wec"
},
{
"path": "vcproject/ExportNotifierImpl.h",
"chars": 2790,
"preview": "#pragma once\r\n\r\n#include \"stdafx.h\"\r\n#include \"Core.h\"\r\n\r\nclass ExportNotifierImpl : public ExportNotifier\r\n{\r\nprotected"
},
{
"path": "vcproject/ITunesDetector.h",
"chars": 8114,
"preview": "#pragma once\r\n\r\n#include \"stdafx.h\"\r\n#include \"VersionDetector.h\"\r\n\r\nclass ITunesDetector\r\n{\r\npublic:\r\n\tITunesDetector()"
},
{
"path": "vcproject/LogListBox.h",
"chars": 2777,
"preview": "#if !defined(AFX_LOGLISTBOX_H_INCLUDED_)\r\n#define AFX_LOGLISTBOX_H_INCLUDED_\r\n\r\n#include <vector>\r\n#include <atlctrls.h>"
},
{
"path": "vcproject/LoggerImpl.h",
"chars": 2664,
"preview": "#pragma once\r\n\r\n#include \"stdafx.h\"\r\n#include \"Core.h\"\r\n#include <locale>\r\n#include <codecvt>\r\n\r\nclass LoggerImpl : publ"
},
{
"path": "vcproject/MainFrm.h",
"chars": 13750,
"preview": "// MainFrm.h : interface of the CMainFrame class\n//\n////////////////////////////////////////////////////////////////////"
},
{
"path": "vcproject/PdfConverterImpl.h",
"chars": 6425,
"preview": "#pragma once\r\n\r\n#include \"stdafx.h\"\r\n#include \"Core.h\"\r\n#include <atlstr.h>\r\n\r\nclass PdfConverterImpl : public PdfConver"
},
{
"path": "vcproject/ProgressListViewCtrl.h",
"chars": 5625,
"preview": "#ifndef _PROGRESSLISTVIEWCTRL_H\r\n#define _PROGRESSLISTVIEWCTRL_H\r\n\r\nclass CProgressListViewCtrl : public CWindowImpl<CPr"
},
{
"path": "vcproject/TextProgressBarCtrl.h",
"chars": 3319,
"preview": "#pragma once\r\n\r\n#include <atlctrls.h>\r\n#include <atlmisc.h>\r\n#include <atltheme.h>\r\n\r\ntemplate<typename T, typename TBas"
},
{
"path": "vcproject/ToolTipButton.h",
"chars": 3516,
"preview": "#pragma once\n\ntemplate <class T, class TBase = CButton, class TWinTraits = ATL::CControlWinTraits>\nclass ATL_NO_VTABLE C"
},
{
"path": "vcproject/VersionDetector.h",
"chars": 1056,
"preview": "#pragma once\r\n\r\n#include \"stdafx.h\"\r\n\r\nclass VersionDetector\r\n{\r\npublic:\r\n\tCString GetProductVersion()\r\n\t{\r\n\t\tTCHAR szPa"
},
{
"path": "vcproject/View.h",
"chars": 50107,
"preview": "// View.h : interface of the CView class\r\n//\r\n/////////////////////////////////////////////////////////////////////////"
},
{
"path": "vcproject/ViewHelper.cpp",
"chars": 6295,
"preview": "#include \"stdafx.h\"\r\n#include <atlctrls.h>\r\n#include \"resource.h\"\r\n#include \"ViewHelper.h\"\r\n\r\n#include <memory>\r\n\r\nstruc"
},
{
"path": "vcproject/ViewHelper.h",
"chars": 1507,
"preview": "#pragma once\r\n\r\n#include <shlobj.h>\r\n#include <atlcomcli.h> // for COM smart pointers\r\n#include <atlbase.h> // for C"
},
{
"path": "vcproject/WechatExporter.cpp",
"chars": 1818,
"preview": "// WechatExporter.cpp : main source file for WechatExporter.exe\r\n//\r\n\r\n#include \"stdafx.h\"\r\n\r\n#include <atlframe.h>\r\n#in"
},
{
"path": "vcproject/WechatExporter.h",
"chars": 20,
"preview": "// WechatExporter.h\n"
},
{
"path": "vcproject/WechatExporter.rc",
"chars": 18400,
"preview": "// Microsoft Visual C++ generated resource script.\r\n//\r\n#include \"resource.h\"\r\n\r\n#define APSTUDIO_READONLY_SYMBOLS\r\n////"
},
{
"path": "vcproject/WechatExporter.sln",
"chars": 2203,
"preview": "\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 15\r\nVisualStudioVersion = 15.0.28307.125"
},
{
"path": "vcproject/WechatExporter.vcxproj",
"chars": 20109,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.micros"
},
{
"path": "vcproject/WechatExporter.vcxproj.filters",
"chars": 8856,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbui"
},
{
"path": "vcproject/WechatExporterCmd.cpp",
"chars": 6965,
"preview": "// WechatExporterCmd.cpp : This file contains the 'main' function. Program execution begins and ends there.\n//\n\n#include"
},
{
"path": "vcproject/WechatExporterCmd.vcxproj",
"chars": 13271,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microso"
},
{
"path": "vcproject/WechatExporterCmd.vcxproj.filters",
"chars": 6384,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuil"
},
{
"path": "vcproject/resource.h",
"chars": 4346,
"preview": "//{{NO_DEPENDENCIES}}\r\n// Microsoft Visual C++ generated include file.\r\n// Used by WechatExporter.rc\r\n//\r\n#define IDD_A"
},
{
"path": "vcproject/stdafx.cpp",
"chars": 205,
"preview": "// stdafx.cpp : source file that includes just the standard includes\n//\tWechatExporter.pch will be the pre-compiled head"
},
{
"path": "vcproject/stdafx.h",
"chars": 1356,
"preview": "// stdafx.h : include file for standard system include files,\n// or project specific include files that are used freque"
}
]
About this extraction
This page contains the full source code of the BlueMatthew/WechatExporter GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 187 files (1.4 MB), approximately 385.5k tokens, and a symbol index with 524 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.