diff --git a/Telegram/SourceFiles/_other/Style.plist b/Telegram/Packer.plist
similarity index 73%
rename from Telegram/SourceFiles/_other/Style.plist
rename to Telegram/Packer.plist
index 2df9c01130..f1583971a1 100644
--- a/Telegram/SourceFiles/_other/Style.plist
+++ b/Telegram/Packer.plist
@@ -2,21 +2,21 @@
- NSPrincipalClass
- NSApplication
+ CFBundleExecutable
+ Packer
+ CFBundleGetInfoString
+ Update packer utility for tdesktop
CFBundleIconFile
+ CFBundleIdentifier
+ com.ddesktop.${PRODUCT_NAME:rfc1034identifier}
CFBundlePackageType
APPL
- CFBundleGetInfoString
- Created by Qt/QMake
CFBundleSignature
????
- CFBundleExecutable
- MetaStyle
- CFBundleIdentifier
- com.yourcompany.${PRODUCT_NAME:rfc1034identifier}
NOTE
- This file was generated by Qt/QMake.
+
+ NSPrincipalClass
+ NSApplication
diff --git a/Telegram/Packer.pro b/Telegram/Packer.pro
new file mode 100644
index 0000000000..4fb98d457b
--- /dev/null
+++ b/Telegram/Packer.pro
@@ -0,0 +1,32 @@
+QT += core
+
+CONFIG(debug, debug|release) {
+ DEFINES += _DEBUG
+ OBJECTS_DIR = ./../Mac/DebugIntermediatePacker
+ MOC_DIR = ./GeneratedFiles/Debug
+ DESTDIR = ./../Mac/DebugPacker
+}
+CONFIG(release, debug|release) {
+ OBJECTS_DIR = ./../Mac/ReleaseIntermediatePacker
+ MOC_DIR = ./GeneratedFiles/Release
+ DESTDIR = ./../Mac/ReleasePacker
+}
+
+macx {
+ QMAKE_INFO_PLIST = ./SourceFiles/_other/Packer.plist
+ QMAKE_LFLAGS += -framework Cocoa
+}
+
+SOURCES += \
+ ./SourceFiles/_other/packer.cpp \
+
+HEADERS += \
+ ./SourceFiles/_other/packer.h \
+
+INCLUDEPATH += ./../../Libraries/QtStatic/qtbase/include/QtGui/5.3.0/QtGui\
+ ./../../Libraries/QtStatic/qtbase/include/QtCore/5.3.0/QtCore\
+ ./../../Libraries/QtStatic/qtbase/include\
+ ./../../Libraries/lzma/C
+
+LIBS += -lcrypto -lssl -lz
+
diff --git a/Telegram/Packer.xcodeproj/project.pbxproj b/Telegram/Packer.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..4ae0e10f90
--- /dev/null
+++ b/Telegram/Packer.xcodeproj/project.pbxproj
@@ -0,0 +1,823 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 6E977D353048DB44129F752B /* Preprocess */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 6CC3B5D2136C7CD6A5CF5A59 /* Build configuration list for PBXNativeTarget "Packer" */;
+ buildPhases = (
+ 7EF0942E79C014DCEC8976BC /* Qt Preprocessors */,
+ );
+ dependencies = (
+ );
+ name = Preprocess;
+ productName = "Qt Preprocess";
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 1A681B886F50EE30FBE62B4B /* Qt5PrintSupport in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DBF506D10449BFABD45B82DA /* Qt5PrintSupport */; };
+ 1BB705CDB741E2B7450201A5 /* Cocoa.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */; };
+ 328FD74542F6E2C873EE4D4B /* ApplicationServices.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DFD7912080BC557230093752 /* ApplicationServices.framework */; };
+ 496FD9CEEB508016AFB9F928 /* qico in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 8F500B5166907B6D9A7C3E3D /* qico */; };
+ 52B661A713AE959F9084E291 /* packer_plugin_import.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = CB20BF73330AAF80B8BC8907 /* packer_plugin_import.cpp */; settings = {ATTRIBUTES = (); }; };
+ 59789101736112A570B8EFE6 /* qjp2 in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = F0681BC551FC8A2B132FC646 /* qjp2 */; };
+ 668DDDA0C55405E7FCFD6CA5 /* CoreServices.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 9742F24EE18EA44D52824F1E /* CoreServices.framework */; };
+ 7CA5405B8503BFFC60932D2B /* qicns in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 31120EDB269DFF13E1D49847 /* qicns */; };
+ 7F76437B577F737145996DC3 /* qtga in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DCEFD9167C239650120B0145 /* qtga */; };
+ 8771A8C96E9C391044035D99 /* OpenGL.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = D4B32C2222F82AC56BADEB21 /* OpenGL.framework */; };
+ 8D267F2E4776F0ECA2F49DC8 /* IOKit.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = A1A67BEAA744704B29168D39 /* IOKit.framework */; };
+ 8D33FE22B9BBADC7FA46C15B /* qtharfbuzzng in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = D6193B79CECC9DD0142D1200 /* qtharfbuzzng */; };
+ 9F33AC0693BC81B27D8F518D /* Qt5Gui in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 04391BE7A8B9D811E255100A /* Qt5Gui */; };
+ A3F8F2284013928A02AE5C38 /* qwbmp in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 8CF51323544B886B8F4A2232 /* qwbmp */; };
+ A9563D9C9FD0D76FAAF1CA96 /* qdds in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = D3D1BE0BEA3AEE0551AD39AC /* qdds */; };
+ B9ADD90C014EA3FBE351DF03 /* Qt5Core in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 5A80A1907B6CFFB524C1E57D /* Qt5Core */; };
+ BE6AB9DF1C4880624131C669 /* Qt5Widgets in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 4689C06178B60B84E7F3A3B7 /* Qt5Widgets */; };
+ C06DDE378A7AC1FA9E6FF69A /* qtiff in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = F2453BA07315EB9F34F1CD57 /* qtiff */; };
+ D1FA8AF31837B51C762A9D4D /* qcocoa in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = D53D8E6A188E05078A114294 /* qcocoa */; };
+ D22929A2B8C5281567FCACDC /* Qt5PlatformSupport in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = E7B2F248E3F7970788F35BF5 /* Qt5PlatformSupport */; };
+ E45E51A644D5FC9F942ECE55 /* AGL.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 8D9815BDB5BD9F90D2BC05C5 /* AGL.framework */; };
+ EAA05789DF6EBAD24D3EFF96 /* packer.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = E3790AE49DBDB3F5EFA42FE1 /* packer.cpp */; settings = {ATTRIBUTES = (); }; };
+ F26454630C80841CBDCFE1CA /* Foundation.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = FCC237CA5AD60B9BA4447615 /* Foundation.framework */; };
+ F4D3747C3A03B25EDC9057BB /* qwebp in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = ADC6308023253CEA51F86E21 /* qwebp */; };
+ F8B465CE34D8DF87AAE95913 /* CoreFoundation.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 4D765E1B1EA6C757220C63E7 /* CoreFoundation.framework */; };
+ F8ED42CF8679BF83227DAFC4 /* Carbon.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 9DFF62A901D70814B8A323D4 /* Carbon.framework */; };
+ FBD56E2AC34F76BFFDB68619 /* qmng in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 83D37373949868693FB7816D /* qmng */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 072AB35C1955F39D00328D9B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 6DB9C3763D02B1415CD9D565 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 6E977D353048DB44129F752B;
+ remoteInfo = "Qt Preprocess";
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 04391BE7A8B9D811E255100A /* Qt5Gui */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Gui; path = "/usr/local/Qt-5.3.0/lib/libQt5Gui$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ 060A694B42A4555240009936 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtga.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtga.pri"; sourceTree = ""; };
+ 075EB50EB07CF69FD62FB8DF /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sql_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sql_private.pri"; sourceTree = ""; };
+ 0ABCEA8D0DD45589040B0AF2 /* /usr/local/Qt-5.3.0/mkspecs/common/unix.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/common/unix.conf"; sourceTree = ""; };
+ 111BBEE3D1432C3B517FD539 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qdds.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qdds.pri"; sourceTree = ""; };
+ 16DD53E17C65AC8B450CC6C3 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quick.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quick.pri"; sourceTree = ""; };
+ 1FAE75C970AA73F2DEDDB508 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qavfcamera.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qavfcamera.pri"; sourceTree = ""; };
+ 23BC8B0FC3279421D41CA268 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_gui.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_gui.pri"; sourceTree = ""; };
+ 2440CD1D4CEF80443BCA1B8B /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qgenericbearer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qgenericbearer.pri"; sourceTree = ""; };
+ 247D8DF3B1DDB665B80BBA25 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtaccessiblequick.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtaccessiblequick.pri"; sourceTree = ""; };
+ 24B6929EE3952310F2DAECB1 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri"; sourceTree = ""; };
+ 28BD0D10214709D95B161E24 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimediawidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimediawidgets.pri"; sourceTree = ""; };
+ 293C8DEEE270847AC20E70F9 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_network.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_network.pri"; sourceTree = ""; };
+ 2E48BB382B895A5ACD79AF9F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_bluetooth_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_bluetooth_private.pri"; sourceTree = ""; };
+ 2E6D9B1D2743D24E31B0B284 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xmlpatterns.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xmlpatterns.pri"; sourceTree = ""; };
+ 311004331A04F3D69C98643C /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_serialport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_serialport_private.pri"; sourceTree = ""; };
+ 31120EDB269DFF13E1D49847 /* qicns */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qicns; path = "/usr/local/Qt-5.3.0/plugins/imageformats/libqicns$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ 33F165B1DB8CBF182C56FAB5 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_macextras_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_macextras_private.pri"; sourceTree = ""; };
+ 346287C9E754E7C458153F03 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qwbmp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qwbmp.pri"; sourceTree = ""; };
+ 360D4B3ED25D126430DE27D4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_enginio.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_enginio.pri"; sourceTree = ""; };
+ 3685604BDB64DD6E92169B73 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qdeclarativeview.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qdeclarativeview.pri"; sourceTree = ""; };
+ 382E89A91A34F7898C25FD0D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_network_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_network_private.pri"; sourceTree = ""; };
+ 3F08D430CEC8D2117735CCB4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri"; sourceTree = ""; };
+ 45B95DB3B70B47A910FC847B /* /usr/local/Qt-5.3.0/mkspecs/common/gcc-base.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/common/gcc-base.conf"; sourceTree = ""; };
+ 45DB132B756499D4DF38430E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qjp2.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qjp2.pri"; sourceTree = ""; };
+ 4689C06178B60B84E7F3A3B7 /* Qt5Widgets */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Widgets; path = "/usr/local/Qt-5.3.0/lib/libQt5Widgets$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ 4C6C71914B1926119120DACD /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_enginio_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_enginio_private.pri"; sourceTree = ""; };
+ 4D765E1B1EA6C757220C63E7 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; };
+ 4FB6657DA22BC68B819B64B3 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qmldevtools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qmldevtools_private.pri"; sourceTree = ""; };
+ 5520A59148EC5EC44EF0D3CD /* Packer.pro */ = {isa = PBXFileReference; lastKnownFileType = text; path = Packer.pro; sourceTree = ""; };
+ 5597304BEC94BFB9EAAEBC4B /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_openglextensions_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_openglextensions_private.pri"; sourceTree = ""; };
+ 5A80A1907B6CFFB524C1E57D /* Qt5Core */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Core; path = "/usr/local/Qt-5.3.0/lib/libQt5Core$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ 5AA25EFD83BC060B26945285 /* packer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = packer.h; path = SourceFiles/_other/packer.h; sourceTree = ""; };
+ 5B22E9E4EE9AAE42ABC24AB3 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri"; sourceTree = ""; };
+ 5CEA7A2DB2136425A88D1254 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_opengl.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_opengl.pri"; sourceTree = ""; };
+ 5F781C7FD8422D359EA1D2FE /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_core_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_core_private.pri"; sourceTree = ""; };
+ 6102C69805B6398AF6FA5BEB /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qml_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qml_private.pri"; sourceTree = ""; };
+ 63E722139886C87BC82DBDF5 /* /usr/local/Qt-5.3.0/mkspecs/macx-clang/qmake.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/macx-clang/qmake.conf"; sourceTree = ""; };
+ 669FB007C4A3D58424D85EC8 /* /usr/local/Qt-5.3.0/mkspecs/common/shell-unix.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/common/shell-unix.conf"; sourceTree = ""; };
+ 69347C39E4D922E94D0860BF /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_designercomponents_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_designercomponents_private.pri"; sourceTree = ""; };
+ 6C08BFC27C4C303A3A5181DB /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_printsupport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_printsupport.pri"; sourceTree = ""; };
+ 6E67D23B15FC4B628DB2E0B2 /* /usr/local/Qt-5.3.0/mkspecs/qdevice.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/qdevice.pri"; sourceTree = ""; };
+ 74C1C232DFAA71028A0412CA /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri"; sourceTree = ""; };
+ 77FF486B1F9BCD55A8A3F35D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_concurrent.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_concurrent.pri"; sourceTree = ""; };
+ 7A94C7168B3FCBE5F04A013B /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_declarative.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_declarative.pri"; sourceTree = ""; };
+ 7C2F42B222EE88E26A6FED62 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_designer_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_designer_private.pri"; sourceTree = ""; };
+ 7D28E9003CE64D8A7F2E292E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_concurrent_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_concurrent_private.pri"; sourceTree = ""; };
+ 7DE30A90667C03C4F91A2A91 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sql.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sql.pri"; sourceTree = ""; };
+ 7ECCC1F9442988B4F2707CC1 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_core.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_core.pri"; sourceTree = ""; };
+ 817A0F5A41B553A6DE67FDEB /* /usr/local/Qt-5.3.0/mkspecs/common/macx.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/common/macx.conf"; sourceTree = ""; };
+ 82E7DCFD95559532D8FC6CDD /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quickparticles_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quickparticles_private.pri"; sourceTree = ""; };
+ 83D37373949868693FB7816D /* qmng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qmng; path = "/usr/local/Qt-5.3.0/plugins/imageformats/libqmng$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ 85061B1DA49D125991117950 /* /usr/local/Qt-5.3.0/mkspecs/macx-xcode/qmake.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/macx-xcode/qmake.conf"; sourceTree = ""; };
+ 85B6936EDBE61D9BB8F8B33B /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sensors.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sensors.pri"; sourceTree = ""; };
+ 87A4C1983FD641360BF80A02 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri"; sourceTree = ""; };
+ 87EEF25EE25CF21572D1438C /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_websockets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_websockets_private.pri"; sourceTree = ""; };
+ 8849E60AEC7DB97A475C17EA /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_testlib_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_testlib_private.pri"; sourceTree = ""; };
+ 892D36BEF797BA4AF48D378A /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensors_dummy.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensors_dummy.pri"; sourceTree = ""; };
+ 89863CCAF1D29037AE95755D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_declarative_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_declarative_private.pri"; sourceTree = ""; };
+ 8A04A4A3625204D12A1207F6 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_nfc.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_nfc.pri"; sourceTree = ""; };
+ 8B4BB4E74F8A4442EF563D7D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri"; sourceTree = ""; };
+ 8C31D89BDFCDF466DAED19A0 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quick_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quick_private.pri"; sourceTree = ""; };
+ 8C5164D4E37556D40C5E6AA2 /* /usr/local/Qt-5.3.0/mkspecs/common/clang.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/common/clang.conf"; sourceTree = ""; };
+ 8CF51323544B886B8F4A2232 /* qwbmp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwbmp; path = "/usr/local/Qt-5.3.0/plugins/imageformats/libqwbmp$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ 8D9815BDB5BD9F90D2BC05C5 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = ""; };
+ 8DDE1D26B3206CDB8B57FABE /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_svg_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_svg_private.pri"; sourceTree = ""; };
+ 8E9136256AFFBA6EF048AA55 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_widgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_widgets_private.pri"; sourceTree = ""; };
+ 8F500B5166907B6D9A7C3E3D /* qico */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qico; path = "/usr/local/Qt-5.3.0/plugins/imageformats/libqico$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ 8F572030CE9AB8CC5F672201 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_platformsupport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_platformsupport_private.pri"; sourceTree = ""; };
+ 8F97C9CAE38CA3AFAC0B3953 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_websockets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_websockets.pri"; sourceTree = ""; };
+ 946BEA667170DC1A7A8F9DB0 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmng.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmng.pri"; sourceTree = ""; };
+ 9742F24EE18EA44D52824F1E /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = ""; };
+ 9A0BDF67E013BB4FFB8685B0 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qqt7engine.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qqt7engine.pri"; sourceTree = ""; };
+ 9DFF62A901D70814B8A323D4 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; };
+ A022AF919D1977534CA66BB8 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_widgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_widgets.pri"; sourceTree = ""; };
+ A1A67BEAA744704B29168D39 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; };
+ A4D8AC60897F435C1C3B9D02 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensors_generic.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensors_generic.pri"; sourceTree = ""; };
+ A5588D4B50885E2A9CAA5505 /* Packer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Packer.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ A59F74CD76FDC2B4B9910E18 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_scripttools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_scripttools_private.pri"; sourceTree = ""; };
+ A5B17ABEFBA1C2F43443D644 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_macextras.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_macextras.pri"; sourceTree = ""; };
+ A9E30FA27827990C5F182223 /* /usr/local/Qt-5.3.0/mkspecs/common/gcc-base-mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/common/gcc-base-mac.conf"; sourceTree = ""; };
+ AA73DC3C2901E2979FE8AD5B /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xml.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xml.pri"; sourceTree = ""; };
+ AB1C02DDBD8E88DD9A9AFDDD /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri"; sourceTree = ""; };
+ AB745978DF0F41D1801ABDA6 /* .qmake.stash */ = {isa = PBXFileReference; lastKnownFileType = file; path = .qmake.stash; sourceTree = ""; };
+ ABA9AB4619F09DCFD2D4A27F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qmltest_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qmltest_private.pri"; sourceTree = ""; };
+ ACC8A73268E5D9AF64E97AF4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_bluetooth.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_bluetooth.pri"; sourceTree = ""; };
+ ADC6308023253CEA51F86E21 /* qwebp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwebp; path = "/usr/local/Qt-5.3.0/plugins/imageformats/libqwebp$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ ADFC79902C14A612AE93A89A /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_svg.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_svg.pri"; sourceTree = ""; };
+ AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; };
+ AFD721AA33A2F785E77B1698 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qcocoa.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qcocoa.pri"; sourceTree = ""; };
+ B064BF3B496A7BF7A449CA1E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qsqlite.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qsqlite.pri"; sourceTree = ""; };
+ B2246267D4C0D789259A86B0 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quickwidgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quickwidgets_private.pri"; sourceTree = ""; };
+ B26239063A068F800A2C95F4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qwebp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qwebp.pri"; sourceTree = ""; };
+ B382B645B34234E451AE5D94 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qml.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qml.pri"; sourceTree = ""; };
+ B518DA4EE7376002AFC71FD5 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_uitools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_uitools_private.pri"; sourceTree = ""; };
+ B51B01657BFE9EAEF5590561 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_nfc_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_nfc_private.pri"; sourceTree = ""; };
+ B678DA730B4ECE863AD631AE /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qminimal.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qminimal.pri"; sourceTree = ""; };
+ B8525798C5AA7D7C6D68E1B3 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri"; sourceTree = ""; };
+ B8C1F6C965A7A14FBA8D4518 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri"; sourceTree = ""; };
+ BD22EFEFCC02644B1883CE19 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtiff.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtiff.pri"; sourceTree = ""; };
+ BD4D97801B547471B37A4CDC /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_bootstrap_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_bootstrap_private.pri"; sourceTree = ""; };
+ BDC9ECADEE40D11E3C2EA93F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sensors_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sensors_private.pri"; sourceTree = ""; };
+ BFF0C38FB0EC140C5F0304AE /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_serialport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_serialport.pri"; sourceTree = ""; };
+ C4295BE59CCEBCDD16268349 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qico.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qico.pri"; sourceTree = ""; };
+ C505A18319B9B63C63877858 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_script_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_script_private.pri"; sourceTree = ""; };
+ C84546C18DCBB04166195DCF /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri"; sourceTree = ""; };
+ CB20BF73330AAF80B8BC8907 /* packer_plugin_import.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = packer_plugin_import.cpp; sourceTree = ""; };
+ CCF75CFFB857487FB18F99F9 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qoffscreen.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qoffscreen.pri"; sourceTree = ""; };
+ CE829DD126DD2B97E8D70A7A /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_scripttools.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_scripttools.pri"; sourceTree = ""; };
+ CF86CD5BB01B9011E6B6FD3E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_clucene_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_clucene_private.pri"; sourceTree = ""; };
+ CFCB992BEC24B71BFB8A2F30 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_script.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_script.pri"; sourceTree = ""; };
+ CFFBE05DB004895080314289 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qsvgicon.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qsvgicon.pri"; sourceTree = ""; };
+ D0CDC87DAFDA7F18A7AF450F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_printsupport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_printsupport_private.pri"; sourceTree = ""; };
+ D1FA7CAB5ACC09D563AE569F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimediawidgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimediawidgets_private.pri"; sourceTree = ""; };
+ D2FE4D909926A0D1656068C4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimedia.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimedia.pri"; sourceTree = ""; };
+ D3D1BE0BEA3AEE0551AD39AC /* qdds */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qdds; path = "/usr/local/Qt-5.3.0/plugins/imageformats/libqdds$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ D4B32C2222F82AC56BADEB21 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; };
+ D4DE537C1FBBD48BD989FAD1 /* /usr/local/Qt-5.3.0/mkspecs/qconfig.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/qconfig.pri"; sourceTree = ""; };
+ D5141F795670589C8CC41CBC /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_cocoaprintersupport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_cocoaprintersupport.pri"; sourceTree = ""; };
+ D53D8E6A188E05078A114294 /* qcocoa */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qcocoa; path = "/usr/local/Qt-5.3.0/plugins/platforms/libqcocoa$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ D6193B79CECC9DD0142D1200 /* qtharfbuzzng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtharfbuzzng; path = "/usr/local/Qt-5.3.0/lib/libqtharfbuzzng$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ D7A0618DE39A427EBF41940E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_help_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_help_private.pri"; sourceTree = ""; };
+ D81E3D9A18202BE8EC3D0E2C /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_gui_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_gui_private.pri"; sourceTree = ""; };
+ D948D4D8F949D45158F8DE35 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quickwidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quickwidgets.pri"; sourceTree = ""; };
+ DB0A26DDC377B2004F61BFE3 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_testlib.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_testlib.pri"; sourceTree = ""; };
+ DBF506D10449BFABD45B82DA /* Qt5PrintSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PrintSupport; path = "/usr/local/Qt-5.3.0/lib/libQt5PrintSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ DCEFD9167C239650120B0145 /* qtga */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtga; path = "/usr/local/Qt-5.3.0/plugins/imageformats/libqtga$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ DF8188E30892A4654B984221 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qmltest.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qmltest.pri"; sourceTree = ""; };
+ DFD7912080BC557230093752 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = ""; };
+ E0F4563EA350EB65112A0EF4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_opengl_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_opengl_private.pri"; sourceTree = ""; };
+ E37365B4489B4918BEBB707D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xml_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xml_private.pri"; sourceTree = ""; };
+ E3790AE49DBDB3F5EFA42FE1 /* packer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = packer.cpp; path = SourceFiles/_other/packer.cpp; sourceTree = ""; };
+ E432DA897A5F027987342E8F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_openglextensions.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_openglextensions.pri"; sourceTree = ""; };
+ E50FA73B8A23BC179A642B27 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_uitools.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_uitools.pri"; sourceTree = ""; };
+ E66B9EC81C285CA9A7FB6A2E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_positioning_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_positioning_private.pri"; sourceTree = ""; };
+ E7B2F248E3F7970788F35BF5 /* Qt5PlatformSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PlatformSupport; path = "/usr/local/Qt-5.3.0/lib/libQt5PlatformSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ E7D67CB158408BB7DEA74764 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimedia_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimedia_private.pri"; sourceTree = ""; };
+ EA5D4FF9DE4AC4215D7DCE0D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qcorewlanbearer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qcorewlanbearer.pri"; sourceTree = ""; };
+ EB1F99FD112917157F3C3F6E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qicns.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qicns.pri"; sourceTree = ""; };
+ EB29AC635054C09EFA749AE1 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_tcp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_tcp.pri"; sourceTree = ""; };
+ EBD39B69F368CEEAC360A16D /* /usr/local/Qt-5.3.0/mkspecs/common/mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/common/mac.conf"; sourceTree = ""; };
+ F0681BC551FC8A2B132FC646 /* qjp2 */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qjp2; path = "/usr/local/Qt-5.3.0/plugins/imageformats/libqjp2$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ F0A58515945747E36783CC21 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_inspector.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_inspector.pri"; sourceTree = ""; };
+ F2453BA07315EB9F34F1CD57 /* qtiff */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtiff; path = "/usr/local/Qt-5.3.0/plugins/imageformats/libqtiff$(QT_LIBRARY_SUFFIX).a"; sourceTree = ""; };
+ F2F823087EA182CCBD5748B8 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_designer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_designer.pri"; sourceTree = ""; };
+ F33BE16353DD1557A9AB3558 /* /usr/local/Qt-5.3.0/mkspecs/common/clang-mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/common/clang-mac.conf"; sourceTree = ""; };
+ F4EB01857048DCFCFFAAC4D0 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qavfmediaplayer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qavfmediaplayer.pri"; sourceTree = ""; };
+ F7ADBF552F6B9A5982915164 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_positioning.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_positioning.pri"; sourceTree = ""; };
+ F83F87F8A60C9DF666911D42 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qsvg.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qsvg.pri"; sourceTree = ""; };
+ F9BEAA743A908603687DA204 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xmlpatterns_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xmlpatterns_private.pri"; sourceTree = ""; };
+ FCC237CA5AD60B9BA4447615 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; };
+ FD944B80F033DFE737D401A2 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_help.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_help.pri"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D1C883685E82D5676953459A /* Link Binary With Libraries */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1BB705CDB741E2B7450201A5 /* Cocoa.framework in Link Binary With Libraries */,
+ 328FD74542F6E2C873EE4D4B /* ApplicationServices.framework in Link Binary With Libraries */,
+ 668DDDA0C55405E7FCFD6CA5 /* CoreServices.framework in Link Binary With Libraries */,
+ F8B465CE34D8DF87AAE95913 /* CoreFoundation.framework in Link Binary With Libraries */,
+ F26454630C80841CBDCFE1CA /* Foundation.framework in Link Binary With Libraries */,
+ 8771A8C96E9C391044035D99 /* OpenGL.framework in Link Binary With Libraries */,
+ E45E51A644D5FC9F942ECE55 /* AGL.framework in Link Binary With Libraries */,
+ D1FA8AF31837B51C762A9D4D /* qcocoa in Link Binary With Libraries */,
+ F8ED42CF8679BF83227DAFC4 /* Carbon.framework in Link Binary With Libraries */,
+ 8D267F2E4776F0ECA2F49DC8 /* IOKit.framework in Link Binary With Libraries */,
+ 1A681B886F50EE30FBE62B4B /* Qt5PrintSupport in Link Binary With Libraries */,
+ D22929A2B8C5281567FCACDC /* Qt5PlatformSupport in Link Binary With Libraries */,
+ BE6AB9DF1C4880624131C669 /* Qt5Widgets in Link Binary With Libraries */,
+ A9563D9C9FD0D76FAAF1CA96 /* qdds in Link Binary With Libraries */,
+ 7CA5405B8503BFFC60932D2B /* qicns in Link Binary With Libraries */,
+ 496FD9CEEB508016AFB9F928 /* qico in Link Binary With Libraries */,
+ 59789101736112A570B8EFE6 /* qjp2 in Link Binary With Libraries */,
+ FBD56E2AC34F76BFFDB68619 /* qmng in Link Binary With Libraries */,
+ 7F76437B577F737145996DC3 /* qtga in Link Binary With Libraries */,
+ C06DDE378A7AC1FA9E6FF69A /* qtiff in Link Binary With Libraries */,
+ A3F8F2284013928A02AE5C38 /* qwbmp in Link Binary With Libraries */,
+ F4D3747C3A03B25EDC9057BB /* qwebp in Link Binary With Libraries */,
+ 9F33AC0693BC81B27D8F518D /* Qt5Gui in Link Binary With Libraries */,
+ 8D33FE22B9BBADC7FA46C15B /* qtharfbuzzng in Link Binary With Libraries */,
+ B9ADD90C014EA3FBE351DF03 /* Qt5Core in Link Binary With Libraries */,
+ );
+ name = "Link Binary With Libraries";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 2EB56BE3C2D93CDAB0C52E67 /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 73F2E45FDEB381A085D37A49 /* SourceFiles */,
+ CB20BF73330AAF80B8BC8907 /* packer_plugin_import.cpp */,
+ );
+ name = Sources;
+ sourceTree = "";
+ };
+ 31562E815E3DF5B1A777D3EF /* _other */ = {
+ isa = PBXGroup;
+ children = (
+ E3790AE49DBDB3F5EFA42FE1 /* packer.cpp */,
+ 5AA25EFD83BC060B26945285 /* packer.h */,
+ );
+ name = _other;
+ sourceTree = "";
+ };
+ 73F2E45FDEB381A085D37A49 /* SourceFiles */ = {
+ isa = PBXGroup;
+ children = (
+ 31562E815E3DF5B1A777D3EF /* _other */,
+ );
+ name = SourceFiles;
+ sourceTree = "";
+ };
+ 74B182DB50CB5611B5C1C297 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 5520A59148EC5EC44EF0D3CD /* Packer.pro */,
+ 6E67D23B15FC4B628DB2E0B2 /* /usr/local/Qt-5.3.0/mkspecs/qdevice.pri */,
+ 669FB007C4A3D58424D85EC8 /* /usr/local/Qt-5.3.0/mkspecs/common/shell-unix.conf */,
+ 0ABCEA8D0DD45589040B0AF2 /* /usr/local/Qt-5.3.0/mkspecs/common/unix.conf */,
+ EBD39B69F368CEEAC360A16D /* /usr/local/Qt-5.3.0/mkspecs/common/mac.conf */,
+ 817A0F5A41B553A6DE67FDEB /* /usr/local/Qt-5.3.0/mkspecs/common/macx.conf */,
+ 45B95DB3B70B47A910FC847B /* /usr/local/Qt-5.3.0/mkspecs/common/gcc-base.conf */,
+ A9E30FA27827990C5F182223 /* /usr/local/Qt-5.3.0/mkspecs/common/gcc-base-mac.conf */,
+ 8C5164D4E37556D40C5E6AA2 /* /usr/local/Qt-5.3.0/mkspecs/common/clang.conf */,
+ F33BE16353DD1557A9AB3558 /* /usr/local/Qt-5.3.0/mkspecs/common/clang-mac.conf */,
+ D4DE537C1FBBD48BD989FAD1 /* /usr/local/Qt-5.3.0/mkspecs/qconfig.pri */,
+ ACC8A73268E5D9AF64E97AF4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_bluetooth.pri */,
+ 2E48BB382B895A5ACD79AF9F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_bluetooth_private.pri */,
+ BD4D97801B547471B37A4CDC /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_bootstrap_private.pri */,
+ CF86CD5BB01B9011E6B6FD3E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_clucene_private.pri */,
+ 77FF486B1F9BCD55A8A3F35D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_concurrent.pri */,
+ 7D28E9003CE64D8A7F2E292E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_concurrent_private.pri */,
+ 7ECCC1F9442988B4F2707CC1 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_core.pri */,
+ 5F781C7FD8422D359EA1D2FE /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_core_private.pri */,
+ 7A94C7168B3FCBE5F04A013B /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_declarative.pri */,
+ 89863CCAF1D29037AE95755D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_declarative_private.pri */,
+ F2F823087EA182CCBD5748B8 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_designer.pri */,
+ 7C2F42B222EE88E26A6FED62 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_designer_private.pri */,
+ 69347C39E4D922E94D0860BF /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_designercomponents_private.pri */,
+ 360D4B3ED25D126430DE27D4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_enginio.pri */,
+ 4C6C71914B1926119120DACD /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_enginio_private.pri */,
+ 23BC8B0FC3279421D41CA268 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_gui.pri */,
+ D81E3D9A18202BE8EC3D0E2C /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_gui_private.pri */,
+ FD944B80F033DFE737D401A2 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_help.pri */,
+ D7A0618DE39A427EBF41940E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_help_private.pri */,
+ A5B17ABEFBA1C2F43443D644 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_macextras.pri */,
+ 33F165B1DB8CBF182C56FAB5 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_macextras_private.pri */,
+ D2FE4D909926A0D1656068C4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimedia.pri */,
+ E7D67CB158408BB7DEA74764 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimedia_private.pri */,
+ 28BD0D10214709D95B161E24 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimediawidgets.pri */,
+ D1FA7CAB5ACC09D563AE569F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_multimediawidgets_private.pri */,
+ 293C8DEEE270847AC20E70F9 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_network.pri */,
+ 382E89A91A34F7898C25FD0D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_network_private.pri */,
+ 8A04A4A3625204D12A1207F6 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_nfc.pri */,
+ B51B01657BFE9EAEF5590561 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_nfc_private.pri */,
+ 5CEA7A2DB2136425A88D1254 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_opengl.pri */,
+ E0F4563EA350EB65112A0EF4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_opengl_private.pri */,
+ E432DA897A5F027987342E8F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_openglextensions.pri */,
+ 5597304BEC94BFB9EAAEBC4B /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_openglextensions_private.pri */,
+ 8F572030CE9AB8CC5F672201 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_platformsupport_private.pri */,
+ F7ADBF552F6B9A5982915164 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_positioning.pri */,
+ E66B9EC81C285CA9A7FB6A2E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_positioning_private.pri */,
+ 6C08BFC27C4C303A3A5181DB /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_printsupport.pri */,
+ D0CDC87DAFDA7F18A7AF450F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_printsupport_private.pri */,
+ B382B645B34234E451AE5D94 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qml.pri */,
+ 6102C69805B6398AF6FA5BEB /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qml_private.pri */,
+ 4FB6657DA22BC68B819B64B3 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qmldevtools_private.pri */,
+ DF8188E30892A4654B984221 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qmltest.pri */,
+ ABA9AB4619F09DCFD2D4A27F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qmltest_private.pri */,
+ 5B22E9E4EE9AAE42ABC24AB3 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri */,
+ 16DD53E17C65AC8B450CC6C3 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quick.pri */,
+ 8C31D89BDFCDF466DAED19A0 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quick_private.pri */,
+ 82E7DCFD95559532D8FC6CDD /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quickparticles_private.pri */,
+ D948D4D8F949D45158F8DE35 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quickwidgets.pri */,
+ B2246267D4C0D789259A86B0 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_quickwidgets_private.pri */,
+ CFCB992BEC24B71BFB8A2F30 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_script.pri */,
+ C505A18319B9B63C63877858 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_script_private.pri */,
+ CE829DD126DD2B97E8D70A7A /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_scripttools.pri */,
+ A59F74CD76FDC2B4B9910E18 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_scripttools_private.pri */,
+ 85B6936EDBE61D9BB8F8B33B /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sensors.pri */,
+ BDC9ECADEE40D11E3C2EA93F /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sensors_private.pri */,
+ BFF0C38FB0EC140C5F0304AE /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_serialport.pri */,
+ 311004331A04F3D69C98643C /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_serialport_private.pri */,
+ 7DE30A90667C03C4F91A2A91 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sql.pri */,
+ 075EB50EB07CF69FD62FB8DF /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sql_private.pri */,
+ ADFC79902C14A612AE93A89A /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_svg.pri */,
+ 8DDE1D26B3206CDB8B57FABE /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_svg_private.pri */,
+ DB0A26DDC377B2004F61BFE3 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_testlib.pri */,
+ 8849E60AEC7DB97A475C17EA /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_testlib_private.pri */,
+ E50FA73B8A23BC179A642B27 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_uitools.pri */,
+ B518DA4EE7376002AFC71FD5 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_uitools_private.pri */,
+ 8F97C9CAE38CA3AFAC0B3953 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_websockets.pri */,
+ 87EEF25EE25CF21572D1438C /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_websockets_private.pri */,
+ A022AF919D1977534CA66BB8 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_widgets.pri */,
+ 8E9136256AFFBA6EF048AA55 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_widgets_private.pri */,
+ AA73DC3C2901E2979FE8AD5B /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xml.pri */,
+ E37365B4489B4918BEBB707D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xml_private.pri */,
+ 2E6D9B1D2743D24E31B0B284 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xmlpatterns.pri */,
+ F9BEAA743A908603687DA204 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_xmlpatterns_private.pri */,
+ D5141F795670589C8CC41CBC /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_cocoaprintersupport.pri */,
+ 1FAE75C970AA73F2DEDDB508 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qavfcamera.pri */,
+ F4EB01857048DCFCFFAAC4D0 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qavfmediaplayer.pri */,
+ AFD721AA33A2F785E77B1698 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qcocoa.pri */,
+ EA5D4FF9DE4AC4215D7DCE0D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qcorewlanbearer.pri */,
+ 111BBEE3D1432C3B517FD539 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qdds.pri */,
+ 3685604BDB64DD6E92169B73 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qdeclarativeview.pri */,
+ 2440CD1D4CEF80443BCA1B8B /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qgenericbearer.pri */,
+ EB1F99FD112917157F3C3F6E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qicns.pri */,
+ C4295BE59CCEBCDD16268349 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qico.pri */,
+ 45DB132B756499D4DF38430E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qjp2.pri */,
+ B678DA730B4ECE863AD631AE /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qminimal.pri */,
+ F0A58515945747E36783CC21 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_inspector.pri */,
+ B8525798C5AA7D7C6D68E1B3 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri */,
+ EB29AC635054C09EFA749AE1 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_tcp.pri */,
+ 3F08D430CEC8D2117735CCB4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri */,
+ 946BEA667170DC1A7A8F9DB0 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qmng.pri */,
+ CCF75CFFB857487FB18F99F9 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qoffscreen.pri */,
+ 9A0BDF67E013BB4FFB8685B0 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qqt7engine.pri */,
+ B064BF3B496A7BF7A449CA1E /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qsqlite.pri */,
+ F83F87F8A60C9DF666911D42 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qsvg.pri */,
+ CFFBE05DB004895080314289 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qsvgicon.pri */,
+ 247D8DF3B1DDB665B80BBA25 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtaccessiblequick.pri */,
+ 87A4C1983FD641360BF80A02 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri */,
+ 24B6929EE3952310F2DAECB1 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri */,
+ 060A694B42A4555240009936 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtga.pri */,
+ BD22EFEFCC02644B1883CE19 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtiff.pri */,
+ B8C1F6C965A7A14FBA8D4518 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri */,
+ 74C1C232DFAA71028A0412CA /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri */,
+ C84546C18DCBB04166195DCF /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri */,
+ AB1C02DDBD8E88DD9A9AFDDD /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri */,
+ 8B4BB4E74F8A4442EF563D7D /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri */,
+ 892D36BEF797BA4AF48D378A /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensors_dummy.pri */,
+ A4D8AC60897F435C1C3B9D02 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtsensors_generic.pri */,
+ 346287C9E754E7C458153F03 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qwbmp.pri */,
+ B26239063A068F800A2C95F4 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qwebp.pri */,
+ 63E722139886C87BC82DBDF5 /* /usr/local/Qt-5.3.0/mkspecs/macx-clang/qmake.conf */,
+ 85061B1DA49D125991117950 /* /usr/local/Qt-5.3.0/mkspecs/macx-xcode/qmake.conf */,
+ AB745978DF0F41D1801ABDA6 /* .qmake.stash */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+ AF39DD055C3EF8226FBE929D /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */,
+ DFD7912080BC557230093752 /* ApplicationServices.framework */,
+ 9742F24EE18EA44D52824F1E /* CoreServices.framework */,
+ 4D765E1B1EA6C757220C63E7 /* CoreFoundation.framework */,
+ FCC237CA5AD60B9BA4447615 /* Foundation.framework */,
+ D4B32C2222F82AC56BADEB21 /* OpenGL.framework */,
+ 8D9815BDB5BD9F90D2BC05C5 /* AGL.framework */,
+ D53D8E6A188E05078A114294 /* qcocoa */,
+ 9DFF62A901D70814B8A323D4 /* Carbon.framework */,
+ A1A67BEAA744704B29168D39 /* IOKit.framework */,
+ DBF506D10449BFABD45B82DA /* Qt5PrintSupport */,
+ E7B2F248E3F7970788F35BF5 /* Qt5PlatformSupport */,
+ 4689C06178B60B84E7F3A3B7 /* Qt5Widgets */,
+ D3D1BE0BEA3AEE0551AD39AC /* qdds */,
+ 31120EDB269DFF13E1D49847 /* qicns */,
+ 8F500B5166907B6D9A7C3E3D /* qico */,
+ F0681BC551FC8A2B132FC646 /* qjp2 */,
+ 83D37373949868693FB7816D /* qmng */,
+ DCEFD9167C239650120B0145 /* qtga */,
+ F2453BA07315EB9F34F1CD57 /* qtiff */,
+ 8CF51323544B886B8F4A2232 /* qwbmp */,
+ ADC6308023253CEA51F86E21 /* qwebp */,
+ 04391BE7A8B9D811E255100A /* Qt5Gui */,
+ D6193B79CECC9DD0142D1200 /* qtharfbuzzng */,
+ 5A80A1907B6CFFB524C1E57D /* Qt5Core */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ E8C543AB96796ECAA2E65C57 /* Packer */ = {
+ isa = PBXGroup;
+ children = (
+ 2EB56BE3C2D93CDAB0C52E67 /* Sources */,
+ 74B182DB50CB5611B5C1C297 /* Supporting Files */,
+ AF39DD055C3EF8226FBE929D /* Frameworks */,
+ FE0A091FDBFB3E9C31B7A1BD /* Products */,
+ );
+ name = Packer;
+ sourceTree = "";
+ };
+ FE0A091FDBFB3E9C31B7A1BD /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ A5588D4B50885E2A9CAA5505 /* Packer.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ FD92333211119EF3CA40F70D /* Packer */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 6CC3B5D2136C7CD6A5CF5A59 /* Build configuration list for PBXNativeTarget "Packer" */;
+ buildPhases = (
+ F7E50F631C51CD5B5DC0BC43 /* Compile Sources */,
+ D1C883685E82D5676953459A /* Link Binary With Libraries */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ A7CD3B627B093BF0A5BBA9AE /* PBXTargetDependency */,
+ );
+ name = Packer;
+ productInstallPath = ../Mac/DebugPacker/;
+ productName = Packer;
+ productReference = A5588D4B50885E2A9CAA5505 /* Packer.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 6DB9C3763D02B1415CD9D565 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0510;
+ };
+ buildConfigurationList = DAC4C1AA5EDEA1C85E9CA5E6 /* Build configuration list for PBXProject "Packer" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
+ mainGroup = E8C543AB96796ECAA2E65C57 /* Packer */;
+ productRefGroup = FE0A091FDBFB3E9C31B7A1BD /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ FD92333211119EF3CA40F70D /* Packer */,
+ 6E977D353048DB44129F752B /* Preprocess */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 7EF0942E79C014DCEC8976BC /* Qt Preprocessors */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ name = "Qt Preprocessors";
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "make -C . -f Packer.xcodeproj/qt_preprocess.mak";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ F7E50F631C51CD5B5DC0BC43 /* Compile Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ EAA05789DF6EBAD24D3EFF96 /* packer.cpp in Compile Sources */,
+ 52B661A713AE959F9084E291 /* packer_plugin_import.cpp in Compile Sources */,
+ );
+ name = "Compile Sources";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ A7CD3B627B093BF0A5BBA9AE /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 6E977D353048DB44129F752B /* Preprocess */;
+ targetProxy = 072AB35C1955F39D00328D9B /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 339EE1B2CC4FC24589A0EA95 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CC = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1.0;
+ DYLIB_CURRENT_VERSION = 1.0.0;
+ FRAMEWORK_SEARCH_PATHS = "";
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ ../../Libraries/QtStatic/qtbase/include/QtGui/5.3.0/QtGui,
+ ../../Libraries/QtStatic/qtbase/include/QtCore/5.3.0/QtCore,
+ ../../Libraries/QtStatic/qtbase/include,
+ /usr/local/include,
+ "/usr/local/Qt-5.3.0/include",
+ "/usr/local/Qt-5.3.0/include/QtGui",
+ "/usr/local/Qt-5.3.0/include/QtCore",
+ GeneratedFiles/Debug,
+ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers,
+ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers,
+ "/usr/local/Qt-5.3.0/mkspecs/macx-clang",
+ );
+ INFOPLIST_FILE = Packer.plist;
+ INSTALL_DIR = "../Mac/$(CONFIGURATION)";
+ LDPLUSPLUS = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++";
+ LIBRARY_SEARCH_PATHS = (
+ /System/Library/Frameworks/,
+ "/usr/local/Qt-5.3.0/lib",
+ "/usr/local/Qt-5.3.0/plugins/platforms",
+ "/usr/local/Qt-5.3.0/plugins/imageformats",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ OBJROOT = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)IntermediatePacker/";
+ OTHER_CFLAGS = (
+ "-pipe",
+ "-g",
+ "-Wall",
+ "-W",
+ "-fPIE",
+ "-D_DEBUG",
+ "-DQT_GUI_LIB",
+ "-DQT_CORE_LIB",
+ );
+ OTHER_CPLUSPLUSFLAGS = (
+ "-pipe",
+ "-g",
+ "-std=c++11",
+ "-stdlib=libc++",
+ "-Wall",
+ "-W",
+ "-fPIE",
+ "-D_DEBUG",
+ "-DQT_GUI_LIB",
+ "-DQT_CORE_LIB",
+ );
+ OTHER_LDFLAGS = (
+ "-headerpad_max_install_names",
+ "-stdlib=libc++",
+ "-lcrypto",
+ "-lssl",
+ "-L/usr/local/Qt-5.3.0/lib",
+ "-L/usr/local/Qt-5.3.0/plugins/platforms",
+ "-lcups",
+ "-L/usr/local/Qt-5.3.0/plugins/imageformats",
+ "-lz",
+ "-lm",
+ "-llzma",
+ );
+ PRODUCT_NAME = Packer;
+ QT_LIBRARY_SUFFIX = "";
+ SDKROOT = macosx;
+ SYMROOT = ../Mac;
+ };
+ name = Release;
+ };
+ 3AA6C32AC930069E80220CF1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CC = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ DYLIB_COMPATIBILITY_VERSION = 1.0;
+ DYLIB_CURRENT_VERSION = 1.0.0;
+ FRAMEWORK_SEARCH_PATHS = "";
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ ../../Libraries/QtStatic/qtbase/include/QtGui/5.3.0/QtGui,
+ ../../Libraries/QtStatic/qtbase/include/QtCore/5.3.0/QtCore,
+ ../../Libraries/QtStatic/qtbase/include,
+ /usr/local/include,
+ "/usr/local/Qt-5.3.0/include",
+ "/usr/local/Qt-5.3.0/include/QtGui",
+ "/usr/local/Qt-5.3.0/include/QtCore",
+ GeneratedFiles/Debug,
+ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers,
+ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers,
+ "/usr/local/Qt-5.3.0/mkspecs/macx-clang",
+ );
+ INFOPLIST_FILE = Packer.plist;
+ INSTALL_DIR = "../Mac/$(CONFIGURATION)";
+ LDPLUSPLUS = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++";
+ LIBRARY_SEARCH_PATHS = (
+ /System/Library/Frameworks/,
+ "/usr/local/Qt-5.3.0/lib",
+ "/usr/local/Qt-5.3.0/plugins/platforms",
+ "/usr/local/Qt-5.3.0/plugins/imageformats",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ OBJROOT = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)IntermediatePacker/";
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_CFLAGS = (
+ "-pipe",
+ "-g",
+ "-Wall",
+ "-W",
+ "-fPIE",
+ "-D_DEBUG",
+ "-DQT_GUI_LIB",
+ "-DQT_CORE_LIB",
+ );
+ OTHER_CPLUSPLUSFLAGS = (
+ "-pipe",
+ "-g",
+ "-std=c++11",
+ "-stdlib=libc++",
+ "-Wall",
+ "-W",
+ "-fPIE",
+ "-D_DEBUG",
+ "-DQT_GUI_LIB",
+ "-DQT_CORE_LIB",
+ );
+ OTHER_LDFLAGS = (
+ "-headerpad_max_install_names",
+ "-stdlib=libc++",
+ "-lcrypto",
+ "-lssl",
+ "-L/usr/local/Qt-5.3.0/lib",
+ "-L/usr/local/Qt-5.3.0/plugins/platforms",
+ "-lcups",
+ "-L/usr/local/Qt-5.3.0/plugins/imageformats",
+ "-lz",
+ "-lm",
+ "-llzma",
+ );
+ PRODUCT_NAME = Packer;
+ QT_LIBRARY_SUFFIX = _debug;
+ SDKROOT = macosx;
+ SYMROOT = ../Mac;
+ };
+ name = Debug;
+ };
+ 6666AA5E688052234F6758D8 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ OBJROOT = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)IntermediatePacker";
+ OTHER_CFLAGS = (
+ "-pipe",
+ "-g",
+ "-Wall",
+ "-W",
+ "-fPIE",
+ "-D_DEBUG",
+ "-DQT_GUI_LIB",
+ "-DQT_CORE_LIB",
+ "-I./../../Libraries/openssl-xcode/include",
+ );
+ OTHER_CPLUSPLUSFLAGS = (
+ "-pipe",
+ "-g",
+ "-std=c++11",
+ "-stdlib=libc++",
+ "-Wall",
+ "-W",
+ "-fPIE",
+ "-D_DEBUG",
+ "-DQT_GUI_LIB",
+ "-DQT_CORE_LIB",
+ "-I./../../Libraries/openssl-xcode/include",
+ );
+ PRODUCT_NAME = Packer;
+ QT_LIBRARY_SUFFIX = "";
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ 77418F46922677BB04ED38DD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ OBJROOT = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)IntermediatePacker";
+ OTHER_CFLAGS = (
+ "-pipe",
+ "-g",
+ "-Wall",
+ "-W",
+ "-fPIE",
+ "-D_DEBUG",
+ "-DQT_GUI_LIB",
+ "-DQT_CORE_LIB",
+ "-I./../../Libraries/openssl-xcode/include",
+ );
+ OTHER_CPLUSPLUSFLAGS = (
+ "-pipe",
+ "-g",
+ "-std=c++11",
+ "-stdlib=libc++",
+ "-Wall",
+ "-W",
+ "-fPIE",
+ "-D_DEBUG",
+ "-DQT_GUI_LIB",
+ "-DQT_CORE_LIB",
+ "-I./../../Libraries/openssl-xcode/include",
+ );
+ PRODUCT_NAME = Packer;
+ QT_LIBRARY_SUFFIX = _debug;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 6CC3B5D2136C7CD6A5CF5A59 /* Build configuration list for PBXNativeTarget "Packer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 77418F46922677BB04ED38DD /* Debug */,
+ 6666AA5E688052234F6758D8 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Debug;
+ };
+ DAC4C1AA5EDEA1C85E9CA5E6 /* Build configuration list for PBXProject "Packer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 3AA6C32AC930069E80220CF1 /* Debug */,
+ 339EE1B2CC4FC24589A0EA95 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Debug;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 6DB9C3763D02B1415CD9D565 /* Project object */;
+}
diff --git a/Telegram/Packer.xcodeproj/qt_preprocess.mak b/Telegram/Packer.xcodeproj/qt_preprocess.mak
new file mode 100644
index 0000000000..cb1a0f0143
--- /dev/null
+++ b/Telegram/Packer.xcodeproj/qt_preprocess.mak
@@ -0,0 +1,52 @@
+#############################################################################
+# Makefile for building: ../Mac/DebugPacker/Packer.app/Contents/MacOS/Packer
+# Generated by qmake (3.0) (Qt 5.3.0)
+# Project: Packer.pro
+# Template: app
+# Command: /usr/local/Qt-5.3.0/bin/qmake -spec macx-xcode -o Packer.xcodeproj/project.pbxproj Packer.pro
+#############################################################################
+
+MAKEFILE = project.pbxproj
+
+MOC = /usr/local/Qt-5.3.0/bin/moc
+UIC =
+LEX = flex
+LEXFLAGS =
+YACC = yacc
+YACCFLAGS = -d
+DEFINES = -D_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB
+INCPATH = -I/usr/local/Qt-5.3.0/mkspecs/macx-clang -I. -I../../Libraries/QtStatic/qtbase/include/QtGui/5.3.0/QtGui -I../../Libraries/QtStatic/qtbase/include/QtCore/5.3.0/QtCore -I../../Libraries/QtStatic/qtbase/include -I../../Libraries/lzma/C -I/usr/local/Qt-5.3.0/include -I/usr/local/Qt-5.3.0/include/QtGui -I/usr/local/Qt-5.3.0/include/QtCore -IGeneratedFiles/Debug -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers
+DEL_FILE = rm -f
+MOVE = mv -f
+
+IMAGES =
+PARSERS =
+preprocess: $(PARSERS) compilers
+clean preprocess_clean: parser_clean compiler_clean
+
+parser_clean:
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+
+check: first
+
+compilers:
+compiler_objective_c_make_all:
+compiler_objective_c_clean:
+compiler_rcc_make_all:
+compiler_rcc_clean:
+compiler_moc_header_make_all:
+compiler_moc_header_clean:
+compiler_moc_source_make_all:
+compiler_moc_source_clean:
+compiler_rez_source_make_all:
+compiler_rez_source_clean:
+compiler_yacc_decl_make_all:
+compiler_yacc_decl_clean:
+compiler_yacc_impl_make_all:
+compiler_yacc_impl_clean:
+compiler_lex_make_all:
+compiler_lex_clean:
+compiler_clean:
+
diff --git a/Telegram/Prepare.sh b/Telegram/Prepare.sh
new file mode 100755
index 0000000000..dfdbb5c5a9
--- /dev/null
+++ b/Telegram/Prepare.sh
@@ -0,0 +1,32 @@
+AppVersionStr=0.5.5
+AppVersion=5005
+
+if [ -d "deploy/$AppVersionStr" ]; then
+ echo "Deploy folder for version $AppVersionStr already exists!"
+ exit 1
+fi
+
+if [ -f "tupdate$AppVersion" ]; then
+ echo "Update file for version $AppVersion already exists!"
+ exit 1
+fi
+
+if [ ! -d "Telegram.app" ]; then
+ echo "Telegram.app not found!"
+ exit 1
+fi
+echo "Preparing version $AppVersionStr, executing Packer.."
+./Packer.app/Contents/MacOS/Packer -path Telegram.app -version $AppVersion
+echo "Packer done!"
+
+if [ ! -d "deploy/" ]; then
+ mkdir "deploy"
+fi
+echo "Copying Telegram.app and tmacupd$AppVersion to deploy/$AppVersionStr..";
+mkdir "deploy/$AppVersionStr"
+mkdir "deploy/$AppVersionStr/Telegram"
+mv Telegram.app deploy/$AppVersionStr/Telegram/
+mv tmacupd$AppVersion deploy/$AppVersionStr/
+mv Telegram.dmg deploy/$AppVersionStr/
+echo "Version $AppVersionStr prepared!";
+
diff --git a/Telegram/SourceFiles/_other/packer.cpp b/Telegram/SourceFiles/_other/packer.cpp
index b3b6097fbb..49fe554538 100644
--- a/Telegram/SourceFiles/_other/packer.cpp
+++ b/Telegram/SourceFiles/_other/packer.cpp
@@ -111,12 +111,26 @@ int32 *hashSha1(const void *data, uint32 len, void *dest) {
int main(int argc, char *argv[])
{
+ QString workDir;
+#ifdef Q_OS_MAC
+ if (QDir(QString()).absolutePath() == "/") {
+ QString first = argc ? QString::fromLocal8Bit(argv[0]) : QString();
+ if (!first.isEmpty()) {
+ QFileInfo info(first);
+ if (info.exists()) {
+ QDir result(info.absolutePath() + "/../../..");
+ workDir = result.absolutePath() + '/';
+ }
+ }
+ }
+#endif
+
QString remove;
int version = 0;
QFileInfoList files;
for (int i = 0; i < argc; ++i) {
if (string("-path") == argv[i] && i + 1 < argc) {
- QString path = QString(argv[i + 1]);
+ QString path = workDir + QString(argv[i + 1]);
QFileInfo info(path);
files.push_back(info);
if (remove.isEmpty()) remove = info.canonicalPath() + "/";
@@ -126,8 +140,12 @@ int main(int argc, char *argv[])
}
if (files.isEmpty() || remove.isEmpty() || version <= 1016 || version > 999999) { // not for release =)
+#ifdef Q_OS_WIN
cout << "Usage: Packer.exe -path {file} -version {version} OR Packer.exe -path {dir} -version {version}\n";
- return 0;
+#elif defined Q_OS_MAC
+ cout << "Usage: Packer.app -path {file} -version {version} OR Packer.app -path {dir} -version {version}\n";
+#endif
+ return -1;
}
bool hasDirs = true;
@@ -147,6 +165,10 @@ int main(int argc, char *argv[])
} else if (!info.isReadable()) {
cout << "Can't read: " << info.absoluteFilePath().toUtf8().constData() << "\n";
return -1;
+ } else if (info.isHidden()) {
+ hasDirs = true;
+ files.erase(i);
+ break;
}
}
}
@@ -182,6 +204,9 @@ int main(int argc, char *argv[])
}
QByteArray inner = f.readAll();
stream << name << quint32(inner.size()) << inner;
+#if defined Q_OS_MAC || defined Q_OS_LINUX
+ stream << (QFileInfo(fullName).isExecutable() ? true : false);
+#endif
}
if (stream.status() != QDataStream::Ok) {
cout << "Stream status is bad: " << stream.status() << "\n";
@@ -193,20 +218,19 @@ int main(int argc, char *argv[])
cout << "Compression start, size: " << resultSize << "\n";
QByteArray compressed, resultCheck;
-
+#ifdef Q_OS_WIN // use Lzma SDK for win
const int32 hSigLen = 128, hShaLen = 20, hPropsLen = LZMA_PROPS_SIZE, hOriginalSizeLen = sizeof(int32), hSize = hSigLen + hShaLen + hPropsLen + hOriginalSizeLen; // header
compressed.resize(hSize + resultSize + 1024 * 1024); // rsa signature + sha1 + lzma props + max compressed size
size_t compressedLen = compressed.size() - hSize;
- uchar outProps[LZMA_PROPS_SIZE];
size_t outPropsSize = LZMA_PROPS_SIZE;
int res = LzmaCompress((uchar*)(compressed.data() + hSize), &compressedLen, (const uchar*)(result.constData()), result.size(), (uchar*)(compressed.data() + hSigLen + hShaLen), &outPropsSize, 9, 64 * 1024 * 1024, 0, 0, 0, 0, 0);
if (res != SZ_OK) {
cout << "Error in compression: " << res << "\n";
return -1;
}
- compressed.resize(hSize + compressedLen);
+ compressed.resize(int(hSize + compressedLen));
memcpy(compressed.data() + hSigLen + hShaLen + hPropsLen, &resultSize, hOriginalSizeLen);
cout << "Compressed to size: " << compressedLen << "\n";
@@ -228,10 +252,112 @@ int main(int argc, char *argv[])
cout << "Uncompress failed: " << uncompressRes << "\n";
return -1;
}
- if (resultLen != result.size()) {
+ if (resultLen != size_t(result.size())) {
cout << "Uncompress bad size: " << resultLen << ", was: " << result.size() << "\n";
return -1;
}
+#else // use liblzma for others
+ const int32 hSigLen = 128, hShaLen = 20, hPropsLen = 0, hOriginalSizeLen = sizeof(int32), hSize = hSigLen + hShaLen + hOriginalSizeLen; // header
+
+ compressed.resize(hSize + resultSize + 1024 * 1024); // rsa signature + sha1 + lzma props + max compressed size
+
+ size_t compressedLen = compressed.size() - hSize;
+
+ lzma_stream stream = LZMA_STREAM_INIT;
+
+ int preset = 9 | LZMA_PRESET_EXTREME;
+ lzma_ret ret = lzma_easy_encoder(&stream, preset, LZMA_CHECK_CRC64);
+ if (ret != LZMA_OK) {
+ const char *msg;
+ switch (ret) {
+ case LZMA_MEM_ERROR: msg = "Memory allocation failed"; break;
+ case LZMA_OPTIONS_ERROR: msg = "Specified preset is not supported"; break;
+ case LZMA_UNSUPPORTED_CHECK: msg = "Specified integrity check is not supported"; break;
+ default: msg = "Unknown error, possibly a bug"; break;
+ }
+ cout << "Error initializing the encoder: " << msg << " (error code " << ret << ")\n";
+ return -1;
+ }
+
+ stream.avail_in = resultSize;
+ stream.next_in = (uint8_t*)result.constData();
+ stream.avail_out = compressedLen;
+ stream.next_out = (uint8_t*)(compressed.data() + hSize);
+
+ lzma_ret res = lzma_code(&stream, LZMA_FINISH);
+ compressedLen -= stream.avail_out;
+ lzma_end(&stream);
+ if (res != LZMA_OK && res != LZMA_STREAM_END) {
+ const char *msg;
+ switch (res) {
+ case LZMA_MEM_ERROR: msg = "Memory allocation failed"; break;
+ case LZMA_DATA_ERROR: msg = "File size limits exceeded"; break;
+ default: msg = "Unknown error, possibly a bug"; break;
+ }
+ cout << "Error in compression: " << msg << " (error code " << res << ")\n";
+ return -1;
+ }
+
+ compressed.resize(int(hSize + compressedLen));
+ memcpy(compressed.data() + hSigLen + hShaLen, &resultSize, hOriginalSizeLen);
+
+ cout << "Compressed to size: " << compressedLen << "\n";
+
+ cout << "Checking uncompressed..\n";
+
+ int32 resultCheckLen;
+ memcpy(&resultCheckLen, compressed.constData() + hSigLen + hShaLen, hOriginalSizeLen);
+ if (resultCheckLen <= 0 || resultCheckLen > 1024 * 1024 * 1024) {
+ cout << "Bad result len: " << resultCheckLen << "\n";
+ return -1;
+ }
+ resultCheck.resize(resultCheckLen);
+
+ size_t resultLen = resultCheck.size();
+
+ stream = LZMA_STREAM_INIT;
+
+ ret = lzma_stream_decoder(&stream, UINT64_MAX, LZMA_CONCATENATED);
+ if (ret != LZMA_OK) {
+ const char *msg;
+ switch (ret) {
+ case LZMA_MEM_ERROR: msg = "Memory allocation failed"; break;
+ case LZMA_OPTIONS_ERROR: msg = "Specified preset is not supported"; break;
+ case LZMA_UNSUPPORTED_CHECK: msg = "Specified integrity check is not supported"; break;
+ default: msg = "Unknown error, possibly a bug"; break;
+ }
+ cout << "Error initializing the decoder: " << msg << " (error code " << ret << ")\n";
+ return -1;
+ }
+
+ stream.avail_in = compressedLen;
+ stream.next_in = (uint8_t*)(compressed.constData() + hSize);
+ stream.avail_out = resultLen;
+ stream.next_out = (uint8_t*)resultCheck.data();
+
+ res = lzma_code(&stream, LZMA_FINISH);
+ if (stream.avail_in) {
+ cout << "Error in decompression, " << stream.avail_in << " bytes left in _in of " << compressedLen << " whole.\n";
+ return -1;
+ } else if (stream.avail_out) {
+ cout << "Error in decompression, " << stream.avail_out << " bytes free left in _out of " << resultLen << " whole.\n";
+ return -1;
+ }
+ lzma_end(&stream);
+ if (res != LZMA_OK && res != LZMA_STREAM_END) {
+ const char *msg;
+ switch (res) {
+ case LZMA_MEM_ERROR: msg = "Memory allocation failed"; break;
+ case LZMA_FORMAT_ERROR: msg = "The input data is not in the .xz format"; break;
+ case LZMA_OPTIONS_ERROR: msg = "Unsupported compression options"; break;
+ case LZMA_DATA_ERROR: msg = "Compressed file is corrupt"; break;
+ case LZMA_BUF_ERROR: msg = "Compressed data is truncated or otherwise corrupt"; break;
+ default: msg = "Unknown error, possibly a bug"; break;
+ }
+ cout << "Error in decompression: " << msg << " (error code " << res << ")\n";
+ return -1;
+ }
+#endif
if (memcmp(result.constData(), resultCheck.constData(), resultLen)) {
cout << "Data differ :(\n";
return -1;
@@ -242,7 +368,7 @@ int main(int argc, char *argv[])
cout << "Counting SHA1 hash..\n";
uchar sha1Buffer[20];
- memcpy(compressed.data() + hSigLen, hashSha1(compressed.constData() + hSigLen + hShaLen, compressedLen + hPropsLen + hOriginalSizeLen, sha1Buffer), hShaLen); // count sha1
+ memcpy(compressed.data() + hSigLen, hashSha1(compressed.constData() + hSigLen + hShaLen, uint32(compressedLen + hPropsLen + hOriginalSizeLen), sha1Buffer), hShaLen); // count sha1
uint32 siglen = 0;
@@ -283,7 +409,15 @@ int main(int argc, char *argv[])
cout << "Signature verified!\n";
RSA_free(pbKey);
+#ifdef Q_OS_WIN
QString outName(QString("tupdate%1").arg(version));
+#elif defined Q_OS_MAC
+ QString outName(QString("tmacupd%1").arg(version));
+#elif defined Q_OS_LINUX
+ QString outName(QString("tlinuxupd%1").arg(version));
+#else
+#error Unknown platform!
+#endif
QFile out(outName);
if (!out.open(QIODevice::WriteOnly)) {
cout << "Can't open '" << outName.toUtf8().constData() << "' for write..\n";
diff --git a/Telegram/SourceFiles/_other/packer.h b/Telegram/SourceFiles/_other/packer.h
index 5679cfdadc..3ce13e0040 100644
--- a/Telegram/SourceFiles/_other/packer.h
+++ b/Telegram/SourceFiles/_other/packer.h
@@ -34,7 +34,11 @@ Copyright (c) 2014 John Preston, https://tdesktop.com
#include
#include
+#ifdef Q_OS_WIN // use Lzma SDK for win
#include
+#else
+#include
+#endif
#include
#include
diff --git a/Telegram/SourceFiles/_other/updater_osx.m b/Telegram/SourceFiles/_other/updater_osx.m
new file mode 100644
index 0000000000..7fe9d245e1
--- /dev/null
+++ b/Telegram/SourceFiles/_other/updater_osx.m
@@ -0,0 +1,207 @@
+/*
+This file is part of Telegram Desktop,
+an unofficial desktop messaging app, see https://telegram.org
+
+Telegram Desktop 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 3 of the License, or
+(at your option) any later version.
+
+It 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.
+
+Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
+Copyright (c) 2014 John Preston, https://tdesktop.com
+*/
+#import
+
+NSString *appName = @"Telegram.app";
+NSString *appDir = nil;
+NSString *workDir = nil;
+
+#ifdef _DEBUG
+BOOL _debug = YES;
+#else
+BOOL _debug = NO;
+#endif
+
+NSFileHandle *_logFile = nil;
+void openLog() {
+ if (!_debug || _logFile) return;
+ NSString *logDir = [workDir stringByAppendingString:@"DebugLogs"];
+ if (![[NSFileManager defaultManager] createDirectoryAtPath:logDir withIntermediateDirectories:YES attributes:nil error:nil]) {
+ return;
+ }
+
+ NSDateFormatter *fmt = [[NSDateFormatter alloc] initWithDateFormat:@"DebugLogs/%Y%m%d %H%M%S_upd.txt" allowNaturalLanguage:NO];
+ NSString *logPath = [workDir stringByAppendingString:[fmt stringFromDate:[NSDate date]]];
+ [[NSFileManager defaultManager] createFileAtPath:logPath contents:nil attributes:nil];
+ _logFile = [NSFileHandle fileHandleForWritingAtPath:logPath];
+}
+
+void closeLog() {
+ if (!_logFile) return;
+
+ [_logFile closeFile];
+}
+
+void writeLog(NSString *msg) {
+ if (!_logFile) return;
+
+ [_logFile writeData:[[msg stringByAppendingString:@"\n"] dataUsingEncoding:NSUTF8StringEncoding]];
+ [_logFile synchronizeFile];
+}
+
+void delFolder() {
+ [[NSFileManager defaultManager] removeItemAtPath:[workDir stringByAppendingString:@"tupdates/ready"] error:nil];
+ rmdir([[workDir stringByAppendingString:@"tupdates"] fileSystemRepresentation]);
+}
+
+int main(int argc, const char * argv[]) {
+ NSString *path = [[NSBundle mainBundle] bundlePath];
+ if (!path) {
+ return -1;
+ }
+ NSRange range = [path rangeOfString:appName options:NSBackwardsSearch];
+ if (range.location == NSNotFound) {
+ return -1;
+ }
+ appDir = [path substringToIndex:range.location > 0 ? range.location : 0];
+
+ openLog();
+ pid_t procId = 0;
+ BOOL update = YES, toSettings = NO, autoStart = NO;
+ NSString *key = nil;
+ for (int i = 0; i < argc; ++i) {
+ if ([@"-workpath" isEqualToString:[NSString stringWithUTF8String:argv[i]]]) {
+ if (++i < argc) {
+ workDir = [NSString stringWithUTF8String:argv[i]];
+ }
+ } else if ([@"-procid" isEqualToString:[NSString stringWithUTF8String:argv[i]]]) {
+ if (++i < argc) {
+ NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
+ [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
+ procId = [[formatter numberFromString:[NSString stringWithUTF8String:argv[i]]] intValue];
+ }
+ } else if ([@"-noupdate" isEqualToString:[NSString stringWithUTF8String:argv[i]]]) {
+ update = NO;
+ } else if ([@"-tosettings" isEqualToString:[NSString stringWithUTF8String:argv[i]]]) {
+ toSettings = YES;
+ } else if ([@"-autostart" isEqualToString:[NSString stringWithUTF8String:argv[i]]]) {
+ autoStart = YES;
+ } else if ([@"-debug" isEqualToString:[NSString stringWithUTF8String:argv[i]]]) {
+ _debug = YES;
+ } else if ([@"-key" isEqualToString:[NSString stringWithUTF8String:argv[i]]]) {
+ if (++i < argc) key = [NSString stringWithUTF8String:argv[i]];
+ }
+ }
+ if (!workDir) workDir = appDir;
+ openLog();
+ NSMutableArray *argsArr = [[NSMutableArray alloc] initWithCapacity:argc];
+ for (int i = 0; i < argc; ++i) {
+ [argsArr addObject:[NSString stringWithUTF8String:argv[i]]];
+ }
+ writeLog([[NSArray arrayWithObjects:@"Arguments: '", [argsArr componentsJoinedByString:@"' '"], @"'..", nil] componentsJoinedByString:@""]);
+ if (key) writeLog([@"Key: " stringByAppendingString:key]);
+ if (toSettings) writeLog(@"To Settings!");
+
+ if (procId) {
+ NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:procId];
+ for (int i = 0; i < 5 && app != nil && ![app isTerminated]; ++i) {
+ usleep(200000);
+ app = [NSRunningApplication runningApplicationWithProcessIdentifier:procId];
+ }
+ if (app) [app forceTerminate];
+ app = [NSRunningApplication runningApplicationWithProcessIdentifier:procId];
+ for (int i = 0; i < 5 && app != nil && ![app isTerminated]; ++i) {
+ usleep(200000);
+ app = [NSRunningApplication runningApplicationWithProcessIdentifier:procId];
+ }
+ }
+
+ if (update) {
+ writeLog(@"Starting update files iteration!");
+
+ NSFileManager *fileManager = [NSFileManager defaultManager];
+ NSString *srcDir = [workDir stringByAppendingString:@"tupdates/ready/"];
+ NSArray *keys = [NSArray arrayWithObject:NSURLIsDirectoryKey];
+ NSDirectoryEnumerator *enumerator = [fileManager
+ enumeratorAtURL:[NSURL fileURLWithPath:[workDir stringByAppendingString:@"tupdates/ready"]]
+ includingPropertiesForKeys:keys
+ options:0
+ errorHandler:^(NSURL *url, NSError *error) {
+ return NO;
+ }];
+ for (NSURL *url in enumerator) {
+ NSString *srcPath = [url path];
+ writeLog([@"Handling file " stringByAppendingString:srcPath]);
+ NSRange r = [srcPath rangeOfString:srcDir];
+ if (r.location != 0) {
+ writeLog([@"Bad file found, no base path " stringByAppendingString:srcPath]);
+ delFolder();
+ break;
+ }
+ NSString *pathPart = [srcPath substringFromIndex:r.length];
+ if ([pathPart rangeOfString:appName].location != 0) {
+ writeLog([@"Skipping not app file " stringByAppendingString:srcPath]);
+ continue;
+ }
+ NSString *dstPath = [appDir stringByAppendingString:pathPart];
+ NSError *error;
+ NSNumber *isDirectory = nil;
+ writeLog([[NSArray arrayWithObjects: @"Copying file ", srcPath, @" to ", dstPath, nil] componentsJoinedByString:@""]);
+ if (![url getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:&error]) {
+ writeLog([@"Failed to get IsDirectory for file " stringByAppendingString:[url path]]);
+ delFolder();
+ break;
+ }
+ if ([isDirectory boolValue]) {
+ if (![fileManager createDirectoryAtPath:dstPath withIntermediateDirectories:YES attributes:nil error:nil]) {
+ writeLog([@"Failed to force path for directory " stringByAppendingString:dstPath]);
+ delFolder();
+ break;
+ }
+ } else if ([fileManager fileExistsAtPath:dstPath]) {
+ if (![[NSData dataWithContentsOfFile:srcPath] writeToFile:dstPath atomically:YES]) {
+ writeLog([@"Failed to edit file " stringByAppendingString:dstPath]);
+ delFolder();
+ break;
+ }
+ } else {
+ if (![fileManager copyItemAtPath:srcPath toPath:dstPath error:nil]) {
+ writeLog([@"Failed to copy file to " stringByAppendingString:dstPath]);
+ delFolder();
+ break;
+ }
+ }
+ }
+ delFolder();
+ }
+
+ NSString *appPath = [[NSArray arrayWithObjects:appDir, appName, nil] componentsJoinedByString:@""];
+ NSMutableArray *args = [[NSMutableArray alloc] initWithObjects:@"-noupdate", nil];
+ if (toSettings) [args addObject:@"-tosettings"];
+ if (_debug) [args addObject:@"-debug"];
+ if (autoStart) [args addObject:@"-autostart"];
+ if (key) {
+ [args addObject:@"-key"];
+ [args addObject:key];
+ }
+ writeLog([[NSArray arrayWithObjects:@"Running application '", appPath, @"' with args '", [args componentsJoinedByString:@"' '"], @"'..", nil] componentsJoinedByString:@""]);
+ NSError *error = nil;
+ NSRunningApplication *result = [[NSWorkspace sharedWorkspace]
+ launchApplicationAtURL:[NSURL fileURLWithPath:appPath]
+ options:NSWorkspaceLaunchDefault
+ configuration:[NSDictionary
+ dictionaryWithObject:args
+ forKey:NSWorkspaceLaunchConfigurationArguments]
+ error:&error];
+ if (!result) {
+ writeLog([@"Could not run application, error: " stringByAppendingString:error ? [error localizedDescription] : @"(nil)"]);
+ }
+ closeLog();
+ return result ? 0 : -1;
+}
+
diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp
index 4a71418d86..395b23c56d 100644
--- a/Telegram/SourceFiles/application.cpp
+++ b/Telegram/SourceFiles/application.cpp
@@ -183,7 +183,7 @@ void Application::updateGotCurrent() {
if (updates.exists()) {
QFileInfoList list = updates.entryInfoList(QDir::Files);
for (QFileInfoList::iterator i = list.begin(), e = list.end(); i != e; ++i) {
- if (QRegularExpression("^tupdate\\d+$", QRegularExpression::CaseInsensitiveOption).match(i->fileName()).hasMatch()) {
+ if (QRegularExpression("^(tupdate|tmacupd|tlinuxupd)\\d+$", QRegularExpression::CaseInsensitiveOption).match(i->fileName()).hasMatch()) {
QFile(i->absoluteFilePath()).remove();
}
}
@@ -191,6 +191,7 @@ void Application::updateGotCurrent() {
emit updateLatest();
}
startUpdateCheck(true);
+ App::writeConfig();
}
void Application::updateFailedCurrent(QNetworkReply::NetworkError e) {
@@ -409,16 +410,16 @@ void Application::startUpdateCheck(bool forceWait) {
if (updates.exists()) {
QFileInfoList list = updates.entryInfoList(QDir::Files);
for (QFileInfoList::iterator i = list.begin(), e = list.end(); i != e; ++i) {
- if (QRegularExpression("^tupdate\\d+$", QRegularExpression::CaseInsensitiveOption).match(i->fileName()).hasMatch()) {
+ if (QRegularExpression("^(tupdate|tmacupd|tlinuxupd)\\d+$", QRegularExpression::CaseInsensitiveOption).match(i->fileName()).hasMatch()) {
sendRequest = true;
}
}
}
}
- if ((cManyInstance() && !cDebug()) || cPlatform() == dbipMac) return; // only main instance is updating
+ if ((cManyInstance() && !cDebug()) || cPlatform() == dbipLinux) return; // only main instance is updating
if (sendRequest) {
- QNetworkRequest checkVersion(QUrl(qsl("http://tdesktop.com/win/tupdates/current")));
+ QNetworkRequest checkVersion(cUpdateURL());
if (updateReply) updateReply->deleteLater();
App::setProxySettings(updateManager);
diff --git a/Telegram/SourceFiles/config.h b/Telegram/SourceFiles/config.h
index ce996a5c8d..bc4f5f8fd7 100644
--- a/Telegram/SourceFiles/config.h
+++ b/Telegram/SourceFiles/config.h
@@ -17,9 +17,13 @@ Copyright (c) 2014 John Preston, https://tdesktop.com
*/
#pragma once
-static const int32 AppVersion = 5004;
-static const wchar_t *AppVersionStr = L"0.5.4";
+static const int32 AppVersion = 5005;
+static const wchar_t *AppVersionStr = L"0.5.5";
+#ifdef Q_OS_WIN
static const wchar_t *AppName = L"Telegram Win (Unofficial)";
+#else
+static const wchar_t *AppName = L"Telegram Desktop";
+#endif
static const wchar_t *AppId = L"{53F49750-6209-4FBF-9CA8-7A333C87D1ED}";
#include "settings.h"
diff --git a/Telegram/SourceFiles/history.cpp b/Telegram/SourceFiles/history.cpp
index ca838cd8df..2262935811 100644
--- a/Telegram/SourceFiles/history.cpp
+++ b/Telegram/SourceFiles/history.cpp
@@ -528,7 +528,7 @@ void DialogRow::paint(QPainter &p, int32 w, bool act, bool sel) const {
// draw check
if (last->out() && last->needCheck()) {
- const QRect *check;
+ const style::sprite *check;
if (last->id > 0) {
if (last->unread()) {
check = act ? &st::dlgActiveCheckImg : &st::dlgCheckImg;
@@ -538,7 +538,7 @@ void DialogRow::paint(QPainter &p, int32 w, bool act, bool sel) const {
} else {
check = act ? &st::dlgActiveSendImg : &st::dlgSendImg;
}
- rectForName.setWidth(rectForName.width() - check->width() - st::dlgCheckSkip);
+ rectForName.setWidth(rectForName.width() - check->pxWidth() - st::dlgCheckSkip);
p.drawPixmap(QPoint(rectForName.left() + rectForName.width() + st::dlgCheckLeft, rectForName.top() + st::dlgCheckTop), App::sprite(), *check);
}
diff --git a/Telegram/SourceFiles/logs.cpp b/Telegram/SourceFiles/logs.cpp
index d09a6581f6..8b6c30e419 100644
--- a/Telegram/SourceFiles/logs.cpp
+++ b/Telegram/SourceFiles/logs.cpp
@@ -69,9 +69,8 @@ void debugLogWrite(const char *file, int32 line, const QString &v) {
debugLogStream->flush();
#ifdef Q_OS_WIN
OutputDebugString(reinterpret_cast(msg.utf16()));
-#endif
-#ifdef Q_OS_MAC
- objc_outputDebugString(msg.toUtf8().constData());
+#elif defined Q_OS_MAC
+ objc_outputDebugString(msg);
#endif
}
}
@@ -118,9 +117,7 @@ void logsInit() {
if (mainLogStream) return;
#ifdef Q_OS_MAC
- if (QDir(cWorkingDir()).absolutePath() == qsl("/")) {
- cSetWorkingDir(cExeDir());
- }
+ cForceWorkingDir(psAppDataPath());
#endif
QString oldDir = cWorkingDir();
diff --git a/Telegram/SourceFiles/pspecific_mac.cpp b/Telegram/SourceFiles/pspecific_mac.cpp
index 60f1082822..27045ad52c 100644
--- a/Telegram/SourceFiles/pspecific_mac.cpp
+++ b/Telegram/SourceFiles/pspecific_mac.cpp
@@ -34,63 +34,9 @@ namespace {
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) {
Window *wnd = Application::wnd();
if (!wnd) return false;
-/*
- MSG *msg = (MSG*)message;
- if (msg->message == WM_ENDSESSION) {
- App::quit();
- return false;
- }
- if (msg->hwnd == wnd->psHwnd() || msg->hwnd && !wnd->psHwnd()) {
- return mainWindowEvent(msg->hwnd, msg->message, msg->wParam, msg->lParam, (LRESULT*)result);
- }*/
+
return false;
}
-/*
- bool mainWindowEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *result) {
- if (tbCreatedMsgId && msg == tbCreatedMsgId) {
- if (CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList3, (void**)&tbListInterface) != S_OK) {
- tbListInterface = 0;
- }
- }
- switch (msg) {
-
- case WM_DESTROY: {
- App::quit();
- } return false;
-
- case WM_ACTIVATE: {
- if (LOWORD(wParam) == WA_CLICKACTIVE) {
- App::wnd()->inactivePress(true);
- }
- } return false;
-
- case WM_SIZE: {
- if (App::wnd()) {
- if (wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED || wParam == SIZE_MINIMIZED) {
- if (wParam != SIZE_RESTORED || App::wnd()->windowState() != Qt::WindowNoState) {
- Qt::WindowState state = Qt::WindowNoState;
- if (wParam == SIZE_MAXIMIZED) {
- state = Qt::WindowMaximized;
- } else if (wParam == SIZE_MINIMIZED) {
- state = Qt::WindowMinimized;
- }
- emit App::wnd()->windowHandle()->windowStateChanged(state);
- } else {
- App::wnd()->psUpdatedPosition();
- }
- int changes = (wParam == SIZE_MINIMIZED || wParam == SIZE_MAXIMIZED) ? _PsShadowHidden : (_PsShadowResized | _PsShadowShown);
- _psShadowWindows.update(changes);
- }
- }
- } return false;
-
- case WM_MOVE: {
- _psShadowWindows.update(_PsShadowMoved);
- App::wnd()->psUpdatedPosition();
- } return false;
- }
- return false;
- }*/
};
_PsEventFilter *_psEventFilter = 0;
@@ -176,50 +122,9 @@ bool PsMainWindow::psIsActive(int state) const {
}
void PsMainWindow::psRefreshTaskbarIcon() {
- /*QWidget *w = new QWidget(this);
- w->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
- w->setGeometry(x() + 1, y() + 1, 1, 1);
- QPalette p(w->palette());
- p.setColor(QPalette::Background, st::titleBG->c);
- QWindow *wnd = w->windowHandle();
- w->setPalette(p);
- w->show();
- w->activateWindow();
- delete w;*/
}
void PsMainWindow::psUpdateWorkmode() {
- /*switch (cWorkMode()) {
- case dbiwmWindowAndTray: {
- setupTrayIcon();
- HWND psOwner = (HWND)GetWindowLong(ps_hWnd, GWL_HWNDPARENT);
- if (psOwner) {
- SetWindowLong(ps_hWnd, GWL_HWNDPARENT, 0);
- psRefreshTaskbarIcon();
- }
- } break;
-
- case dbiwmTrayOnly: {
- setupTrayIcon();
- HWND psOwner = (HWND)GetWindowLong(ps_hWnd, GWL_HWNDPARENT);
- if (!psOwner) {
- SetWindowLong(ps_hWnd, GWL_HWNDPARENT, (LONG)ps_tbHider_hWnd);
- }
- } break;
-
- case dbiwmWindowOnly: {
- if (trayIconMenu) trayIconMenu->deleteLater();
- trayIconMenu = 0;
- if (trayIcon) trayIcon->deleteLater();
- trayIcon = 0;
-
- HWND psOwner = (HWND)GetWindowLong(ps_hWnd, GWL_HWNDPARENT);
- if (psOwner) {
- SetWindowLong(ps_hWnd, GWL_HWNDPARENT, 0);
- psRefreshTaskbarIcon();
- }
- } break;
- }*/
}
void PsMainWindow::psUpdateCounter() {
@@ -228,59 +133,38 @@ void PsMainWindow::psUpdateCounter() {
setWindowTitle((counter > 0) ? qsl("Telegram (%1)").arg(counter) : qsl("Telegram"));
QString cnt = (counter < 1000) ? QString("%1").arg(counter) : QString("..%1").arg(counter % 100, 2, 10, QChar('0'));
- _private.setWindowBadge(counter ? cnt.toUtf8().constData() : "");
+ _private.setWindowBadge(counter ? cnt : QString());
}
-/*namespace {
- HMONITOR enumMonitor = 0;
- RECT enumMonitorWork;
-
- BOOL CALLBACK _monitorEnumProc(
- _In_ HMONITOR hMonitor,
- _In_ HDC hdcMonitor,
- _In_ LPRECT lprcMonitor,
- _In_ LPARAM dwData
- ) {
- MONITORINFOEX info;
- info.cbSize = sizeof(info);
- GetMonitorInfo(hMonitor, &info);
- if (dwData == hashCrc32(info.szDevice, sizeof(info.szDevice))) {
- enumMonitor = hMonitor;
- enumMonitorWork = info.rcWork;
- return FALSE;
- }
- return TRUE;
- }
-}*/
-
void PsMainWindow::psInitSize() {
setMinimumWidth(st::wndMinWidth);
setMinimumHeight(st::wndMinHeight);
TWindowPos pos(cWindowPos());
- if (cDebug()) { // temp while design
- pos.w = 800;
- pos.h = 600;
- }
QRect avail(QDesktopWidget().availableGeometry());
bool maximized = false;
QRect geom(avail.x() + (avail.width() - st::wndDefWidth) / 2, avail.y() + (avail.height() - st::wndDefHeight) / 2, st::wndDefWidth, st::wndDefHeight);
if (pos.w && pos.h) {
- if (pos.y < 0) pos.y = 0;
- //enumMonitor = 0;
- //EnumDisplayMonitors(0, 0, &_monitorEnumProc, pos.moncrc);
- /*if (enumMonitor) {
- int32 w = enumMonitorWork.right - enumMonitorWork.left, h = enumMonitorWork.bottom - enumMonitorWork.top;
- if (w >= st::wndMinWidth && h >= st::wndMinHeight) {
- if (pos.w > w) pos.w = w;
- if (pos.h > h) pos.h = h;
- pos.x += enumMonitorWork.left;
- pos.y += enumMonitorWork.top;
- if (pos.x < enumMonitorWork.right - 10 && pos.y < enumMonitorWork.bottom - 10) {
- geom = QRect(pos.x, pos.y, pos.w, pos.h);
+ QList screens = App::app()->screens();
+ for (QList::const_iterator i = screens.cbegin(), e = screens.cend(); i != e; ++i) {
+ QByteArray name = (*i)->name().toUtf8();
+ if (pos.moncrc == hashCrc32(name.constData(), name.size())) {
+ QRect screen((*i)->geometry());
+ int32 w = screen.width(), h = screen.height();
+ if (w >= st::wndMinWidth && h >= st::wndMinHeight) {
+ if (pos.w > w) pos.w = w;
+ if (pos.h > h) pos.h = h;
+ pos.x += screen.x();
+ pos.y += screen.y();
+ if (pos.x < screen.x() + screen.width() - 10 && pos.y < screen.y() + screen.height() - 10) {
+ geom = QRect(pos.x, pos.y, pos.w, pos.h);
+ }
}
+ break;
}
- }*/
+ }
+
+ if (pos.y < 0) pos.y = 0;
maximized = pos.maximized;
}
setGeometry(geom);
@@ -300,31 +184,36 @@ void PsMainWindow::psInitFrameless() {
void PsMainWindow::psSavePosition(Qt::WindowState state) {
if (state == Qt::WindowActive) state = windowHandle()->windowState();
if (state == Qt::WindowMinimized || !posInited) return;
-/*
+
TWindowPos pos(cWindowPos()), curPos = pos;
if (state == Qt::WindowMaximized) {
curPos.maximized = 1;
} else {
- RECT w;
- GetWindowRect(ps_hWnd, &w);
- curPos.x = w.left;
- curPos.y = w.top;
- curPos.w = w.right - w.left;
- curPos.h = w.bottom - w.top;
+ QRect r(geometry());
+ curPos.x = r.x();
+ curPos.y = r.y();
+ curPos.w = r.width();
+ curPos.h = r.height();
curPos.maximized = 0;
}
- HMONITOR hMonitor = MonitorFromWindow(ps_hWnd, MONITOR_DEFAULTTONEAREST);
- if (hMonitor) {
- MONITORINFOEX info;
- info.cbSize = sizeof(info);
- GetMonitorInfo(hMonitor, &info);
- if (!curPos.maximized) {
- curPos.x -= info.rcWork.left;
- curPos.y -= info.rcWork.top;
+ int px = curPos.x + curPos.w / 2, py = curPos.y + curPos.h / 2, d = 0;
+ QScreen *chosen = 0;
+ QList screens = App::app()->screens();
+ for (QList::const_iterator i = screens.cbegin(), e = screens.cend(); i != e; ++i) {
+ int dx = (*i)->geometry().x() + (*i)->geometry().width() / 2 - px; if (dx < 0) dx = -dx;
+ int dy = (*i)->geometry().y() + (*i)->geometry().height() / 2 - py; if (dy < 0) dy = -dy;
+ if (!chosen || dx + dy < d) {
+ d = dx + dy;
+ chosen = *i;
}
- curPos.moncrc = hashCrc32(info.szDevice, sizeof(info.szDevice));
+ }
+ if (chosen) {
+ curPos.x -= chosen->geometry().x();
+ curPos.y -= chosen->geometry().y();
+ QByteArray name = chosen->name().toUtf8();
+ curPos.moncrc = hashCrc32(name.constData(), name.size());
}
if (curPos.w >= st::wndMinWidth && curPos.h >= st::wndMinHeight) {
@@ -332,20 +221,20 @@ void PsMainWindow::psSavePosition(Qt::WindowState state) {
cSetWindowPos(curPos);
App::writeConfig();
}
- }*/
+ }
}
void PsMainWindow::psUpdatedPosition() {
- //psUpdatedPositionTimer.start(4000);
+ psUpdatedPositionTimer.start(4000);
}
void PsMainWindow::psStateChanged(Qt::WindowState state) {
psUpdateSysMenu(state);
psUpdateMargins();
- /*if (state == Qt::WindowMinimized && GetWindowLong(ps_hWnd, GWL_HWNDPARENT)) {
- minimizeToTray();
- }
- psSavePosition(state);*/
+// if (state == Qt::WindowMinimized && GetWindowLong(ps_hWnd, GWL_HWNDPARENT)) {
+// minimizeToTray();
+// }
+ psSavePosition(state);
}
void PsMainWindow::psFirstShow() {
@@ -620,7 +509,7 @@ void PsMainWindow::psShowNextNotify(PsNotifyWindow *remove) {
_private.showOverAll(notify->winId());
--count;
} else {
- _private.showNotify(notifyItem->history()->peer->id, notifyItem->history()->peer->name.toUtf8().constData(), notifyItem->notificationHeader().toUtf8().constData(), notifyItem->notificationText().toUtf8().constData());
+ _private.showNotify(notifyItem->history()->peer->id, notifyItem->history()->peer->name, notifyItem->notificationHeader(), notifyItem->notificationText());
}
uint64 ms = getms();
@@ -1083,23 +972,7 @@ void PsUpdateDownloader::partFailed(QNetworkReply::NetworkError e) {
}
void PsUpdateDownloader::deleteDir(const QString &dir) {
- /*std::wstring wDir = QDir::toNativeSeparators(dir).toStdWString();
- WCHAR path[4096];
- memcpy(path, wDir.c_str(), (wDir.size() + 1) * sizeof(WCHAR));
- path[wDir.size() + 1] = 0;
- SHFILEOPSTRUCT file_op = {
- NULL,
- FO_DELETE,
- path,
- L"",
- FOF_NOCONFIRMATION |
- FOF_NOERRORUI |
- FOF_SILENT,
- false,
- 0,
- L""
- };
- int res = SHFileOperation(&file_op);*/
+ objc_deleteDir(dir);
}
void PsUpdateDownloader::fatalFail() {
@@ -1111,15 +984,25 @@ void PsUpdateDownloader::clearAll() {
deleteDir(cWorkingDir() + qsl("tupdates"));
}
+#ifdef Q_OS_WIN
+typedef DWORD VerInt;
+typedef WCHAR VerChar;
+#else
+typedef int VerInt;
+typedef wchar_t VerChar;
+#endif
+
void PsUpdateDownloader::unpackUpdate() {
- /*QByteArray packed;
+ QByteArray packed;
if (!outputFile.open(QIODevice::ReadOnly)) {
LOG(("Update Error: cant read updates file!"));
return fatalFail();
}
-
+#ifdef Q_OS_WIN // use Lzma SDK for win
const int32 hSigLen = 128, hShaLen = 20, hPropsLen = LZMA_PROPS_SIZE, hOriginalSizeLen = sizeof(int32), hSize = hSigLen + hShaLen + hPropsLen + hOriginalSizeLen; // header
-
+#else
+ const int32 hSigLen = 128, hShaLen = 20, hPropsLen = 0, hOriginalSizeLen = sizeof(int32), hSize = hSigLen + hShaLen + hOriginalSizeLen; // header
+#endif
QByteArray compressed = outputFile.readAll();
int32 compressedLen = compressed.size() - hSize;
if (compressedLen <= 0) {
@@ -1164,12 +1047,57 @@ void PsUpdateDownloader::unpackUpdate() {
uncompressed.resize(uncompressedLen);
size_t resultLen = uncompressed.size();
+#ifdef Q_OS_WIN // use Lzma SDK for win
SizeT srcLen = compressedLen;
int uncompressRes = LzmaUncompress((uchar*)uncompressed.data(), &resultLen, (const uchar*)(compressed.constData() + hSize), &srcLen, (const uchar*)(compressed.constData() + hSigLen + hShaLen), LZMA_PROPS_SIZE);
if (uncompressRes != SZ_OK) {
LOG(("Update Error: could not uncompress lzma, code: %1").arg(uncompressRes));
return fatalFail();
}
+#else
+ lzma_stream stream = LZMA_STREAM_INIT;
+
+ lzma_ret ret = lzma_stream_decoder(&stream, UINT64_MAX, LZMA_CONCATENATED);
+ if (ret != LZMA_OK) {
+ const char *msg;
+ switch (ret) {
+ case LZMA_MEM_ERROR: msg = "Memory allocation failed"; break;
+ case LZMA_OPTIONS_ERROR: msg = "Specified preset is not supported"; break;
+ case LZMA_UNSUPPORTED_CHECK: msg = "Specified integrity check is not supported"; break;
+ default: msg = "Unknown error, possibly a bug"; break;
+ }
+ LOG(("Error initializing the decoder: %1 (error code %2)").arg(msg).arg(ret));
+ return fatalFail();
+ }
+
+ stream.avail_in = compressedLen;
+ stream.next_in = (uint8_t*)(compressed.constData() + hSize);
+ stream.avail_out = resultLen;
+ stream.next_out = (uint8_t*)uncompressed.data();
+
+ lzma_ret res = lzma_code(&stream, LZMA_FINISH);
+ if (stream.avail_in) {
+ LOG(("Error in decompression, %1 bytes left in _in of %2 whole.").arg(stream.avail_in).arg(compressedLen));
+ return fatalFail();
+ } else if (stream.avail_out) {
+ LOG(("Error in decompression, %1 bytes free left in _out of %2 whole.").arg(stream.avail_out).arg(resultLen));
+ return fatalFail();
+ }
+ lzma_end(&stream);
+ if (res != LZMA_OK && res != LZMA_STREAM_END) {
+ const char *msg;
+ switch (res) {
+ case LZMA_MEM_ERROR: msg = "Memory allocation failed"; break;
+ case LZMA_FORMAT_ERROR: msg = "The input data is not in the .xz format"; break;
+ case LZMA_OPTIONS_ERROR: msg = "Unsupported compression options"; break;
+ case LZMA_DATA_ERROR: msg = "Compressed file is corrupt"; break;
+ case LZMA_BUF_ERROR: msg = "Compressed data is truncated or otherwise corrupt"; break;
+ default: msg = "Unknown error, possibly a bug"; break;
+ }
+ LOG(("Error in decompression: %1 (error code %2)").arg(msg).arg(res));
+ return fatalFail();
+ }
+#endif
tempDir.mkdir(tempDir.absolutePath());
@@ -1200,22 +1128,30 @@ void PsUpdateDownloader::unpackUpdate() {
LOG(("Update Error: update is empty!"));
return fatalFail();
}
- for (int32 i = 0; i < filesCount; ++i) {
+ for (uint32 i = 0; i < filesCount; ++i) {
QString relativeName;
quint32 fileSize;
QByteArray fileInnerData;
+ bool executable = false;
stream >> relativeName >> fileSize >> fileInnerData;
+#if defined Q_OS_MAC || defined Q_OS_LINUX
+ stream >> executable;
+#endif
if (stream.status() != QDataStream::Ok) {
LOG(("Update Error: cant read file from downloaded stream, status: %1").arg(stream.status()));
return fatalFail();
}
- if (fileSize != fileInnerData.size()) {
+ if (fileSize != quint32(fileInnerData.size())) {
LOG(("Update Error: bad file size %1 not matching data size %2").arg(fileSize).arg(fileInnerData.size()));
return fatalFail();
}
QFile f(tempDirPath + '/' + relativeName);
+ if (!QDir().mkpath(QFileInfo(f).absolutePath())) {
+ LOG(("Update Error: cant mkpath for file '%1'").arg(tempDirPath + '/' + relativeName));
+ return fatalFail();
+ }
if (!f.open(QIODevice::WriteOnly)) {
LOG(("Update Error: cant open file '%1' for writing").arg(tempDirPath + '/' + relativeName));
return fatalFail();
@@ -1226,13 +1162,19 @@ void PsUpdateDownloader::unpackUpdate() {
return fatalFail();
}
f.close();
+ if (executable) {
+ QFileDevice::Permissions p = f.permissions();
+ p |= QFileDevice::ExeOwner | QFileDevice::ExeUser | QFileDevice::ExeGroup | QFileDevice::ExeOther;
+ f.setPermissions(p);
+ }
}
// create tdata/version file
tempDir.mkdir(QDir(tempDirPath + qsl("/tdata")).absolutePath());
std::wstring versionString = ((version % 1000) ? QString("%1.%2.%3").arg(int(version / 1000000)).arg(int((version % 1000000) / 1000)).arg(int(version % 1000)) : QString("%1.%2").arg(int(version / 1000000)).arg(int((version % 1000000) / 1000))).toStdWString();
- DWORD versionNum = DWORD(version), versionLen = DWORD(versionString.size() * sizeof(WCHAR));
- WCHAR versionStr[32];
+
+ VerInt versionNum = VerInt(version), versionLen = VerInt(versionString.size() * sizeof(VerChar));
+ VerChar versionStr[32];
memcpy(versionStr, versionString.c_str(), versionLen);
QFile fVersion(tempDirPath + qsl("/tdata/version"));
@@ -1240,8 +1182,8 @@ void PsUpdateDownloader::unpackUpdate() {
LOG(("Update Error: cant write version file '%1'").arg(tempDirPath + qsl("/version")));
return fatalFail();
}
- fVersion.write((const char*)&versionNum, sizeof(DWORD));
- fVersion.write((const char*)&versionLen, sizeof(DWORD));
+ fVersion.write((const char*)&versionNum, sizeof(VerInt));
+ fVersion.write((const char*)&versionLen, sizeof(VerInt));
fVersion.write((const char*)&versionStr[0], versionLen);
fVersion.close();
}
@@ -1253,7 +1195,7 @@ void PsUpdateDownloader::unpackUpdate() {
deleteDir(tempDirPath);
outputFile.remove();
- emit App::app()->updateReady();*/
+ emit App::app()->updateReady();
}
PsUpdateDownloader::~PsUpdateDownloader() {
@@ -1261,208 +1203,22 @@ PsUpdateDownloader::~PsUpdateDownloader() {
reply = 0;
}
-/*namespace {
- BOOL CALLBACK _ActivateProcess(HWND hWnd, LPARAM lParam) {
- uint64 &processId(*(uint64*)lParam);
-
- DWORD dwProcessId;
- ::GetWindowThreadProcessId(hWnd, &dwProcessId);
-
- if ((uint64)dwProcessId == processId) { // found top-level window
- static const int32 nameBufSize = 1024;
- WCHAR nameBuf[nameBufSize];
- int32 len = GetWindowText(hWnd, nameBuf, nameBufSize);
- if (len && len < nameBufSize) {
- if (QRegularExpression(qsl("^Telegram(\\s*\\(\\d+\\))?$")).match(QString::fromStdWString(nameBuf)).hasMatch()) {
- BOOL res = ::SetForegroundWindow(hWnd);
- return FALSE;
- }
- }
- }
- return TRUE;
- }
-}*/
-
void psActivateProcess(uint64 pid) {
- //::EnumWindows((WNDENUMPROC)_ActivateProcess, (LPARAM)&pid);
+ objc_activateProgram();
}
QString psCurrentCountry() {
- /*int chCount = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, 0, 0);
- if (chCount && chCount < 128) {
- WCHAR wstrCountry[128];
- int len = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, wstrCountry, chCount);
- return len ? QString::fromStdWString(std::wstring(wstrCountry)) : QString::fromLatin1(DefaultCountry);
- }
- return QString::fromLatin1(DefaultCountry);*/
- return QString("");
- //TODO
+ QString country = objc_currentCountry();
+ return country.isEmpty() ? QString::fromLatin1(DefaultCountry) : country;
}
-/*namespace {
- QString langById(int lngId) {
- int primary = lngId & 0xFF;
- switch (primary) {
- case 0x36: return qsl("af");
- case 0x1C: return qsl("sq");
- case 0x5E: return qsl("am");
- case 0x01: return qsl("ar");
- case 0x2B: return qsl("hy");
- case 0x4D: return qsl("as");
- case 0x2C: return qsl("az");
- case 0x45: return qsl("bn");
- case 0x6D: return qsl("ba");
- case 0x2D: return qsl("eu");
- case 0x23: return qsl("be");
- case 0x1A:
- if (lngId == LANG_CROATIAN) {
- return qsl("hr");
- } else if (lngId == LANG_BOSNIAN_NEUTRAL || lngId == LANG_BOSNIAN) {
- return qsl("bs");
- }
- return qsl("sr");
- break;
- case 0x7E: return qsl("br");
- case 0x02: return qsl("bg");
- case 0x92: return qsl("ku");
- case 0x03: return qsl("ca");
- case 0x04: return qsl("zh");
- case 0x83: return qsl("co");
- case 0x05: return qsl("cs");
- case 0x06: return qsl("da");
- case 0x65: return qsl("dv");
- case 0x13: return qsl("nl");
- case 0x09: return qsl("en");
- case 0x25: return qsl("et");
- case 0x38: return qsl("fo");
- case 0x0B: return qsl("fi");
- case 0x0c: return qsl("fr");
- case 0x62: return qsl("fy");
- case 0x56: return qsl("gl");
- case 0x37: return qsl("ka");
- case 0x07: return qsl("de");
- case 0x08: return qsl("el");
- case 0x6F: return qsl("kl");
- case 0x47: return qsl("gu");
- case 0x68: return qsl("ha");
- case 0x0D: return qsl("he");
- case 0x39: return qsl("hi");
- case 0x0E: return qsl("hu");
- case 0x0F: return qsl("is");
- case 0x70: return qsl("ig");
- case 0x21: return qsl("id");
- case 0x5D: return qsl("iu");
- case 0x3C: return qsl("ga");
- case 0x34: return qsl("xh");
- case 0x35: return qsl("zu");
- case 0x10: return qsl("it");
- case 0x11: return qsl("ja");
- case 0x4B: return qsl("kn");
- case 0x3F: return qsl("kk");
- case 0x53: return qsl("kh");
- case 0x87: return qsl("rw");
- case 0x12: return qsl("ko");
- case 0x40: return qsl("ky");
- case 0x54: return qsl("lo");
- case 0x26: return qsl("lv");
- case 0x27: return qsl("lt");
- case 0x6E: return qsl("lb");
- case 0x2F: return qsl("mk");
- case 0x3E: return qsl("ms");
- case 0x4C: return qsl("ml");
- case 0x3A: return qsl("mt");
- case 0x81: return qsl("mi");
- case 0x4E: return qsl("mr");
- case 0x50: return qsl("mn");
- case 0x61: return qsl("ne");
- case 0x14: return qsl("no");
- case 0x82: return qsl("oc");
- case 0x48: return qsl("or");
- case 0x63: return qsl("ps");
- case 0x29: return qsl("fa");
- case 0x15: return qsl("pl");
- case 0x16: return qsl("pt");
- case 0x67: return qsl("ff");
- case 0x46: return qsl("pa");
- case 0x18: return qsl("ro");
- case 0x17: return qsl("rm");
- case 0x19: return qsl("ru");
- case 0x3B: return qsl("se");
- case 0x4F: return qsl("sa");
- case 0x32: return qsl("tn");
- case 0x59: return qsl("sd");
- case 0x5B: return qsl("si");
- case 0x1B: return qsl("sk");
- case 0x24: return qsl("sl");
- case 0x0A: return qsl("es");
- case 0x41: return qsl("sw");
- case 0x1D: return qsl("sv");
- case 0x28: return qsl("tg");
- case 0x49: return qsl("ta");
- case 0x44: return qsl("tt");
- case 0x4A: return qsl("te");
- case 0x1E: return qsl("th");
- case 0x51: return qsl("bo");
- case 0x73: return qsl("ti");
- case 0x1F: return qsl("tr");
- case 0x42: return qsl("tk");
- case 0x22: return qsl("uk");
- case 0x20: return qsl("ur");
- case 0x80: return qsl("ug");
- case 0x43: return qsl("uz");
- case 0x2A: return qsl("vi");
- case 0x52: return qsl("cy");
- case 0x88: return qsl("wo");
- case 0x78: return qsl("ii");
- case 0x6A: return qsl("yo");
- }
- return QString::fromLatin1(DefaultLanguage);
- }
-}*/
-
QString psCurrentLanguage() {
-/* int chCount = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SNAME, 0, 0);
- if (chCount && chCount < 128) {
- WCHAR wstrLocale[128];
- int len = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SNAME, wstrLocale, chCount);
- if (!len) return QString::fromLatin1(DefaultLanguage);
- QString locale = QString::fromStdWString(std::wstring(wstrLocale));
- QRegularExpressionMatch m = QRegularExpression("(^|[^a-z])([a-z]{2})-").match(locale);
- if (m.hasMatch()) {
- return m.captured(2);
- }
- }
- chCount = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ILANGUAGE, 0, 0);
- if (chCount && chCount < 128) {
- WCHAR wstrLocale[128];
- int len = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ILANGUAGE, wstrLocale, chCount), lngId = 0;
- if (len < 5) return QString::fromLatin1(DefaultLanguage);
-
- for (int i = 0; i < 4; ++i) {
- WCHAR ch = wstrLocale[i];
- lngId *= 16;
- if (ch >= WCHAR('0') && ch <= WCHAR('9')) {
- lngId += (ch - WCHAR('0'));
- } else if (ch >= WCHAR('A') && ch <= WCHAR('F')) {
- lngId += (10 + ch - WCHAR('A'));
- } else {
- return QString::fromLatin1(DefaultLanguage);
- }
- }
- return langById(lngId);
- }
- return QString::fromLatin1(DefaultLanguage);*/
- return QString("en");
+ QString lng = objc_currentLang();
+ return lng.isEmpty() ? QString::fromLatin1(DefaultLanguage) : lng;
}
QString psAppDataPath() {
- /*static const int maxFileLen = MAX_PATH * 10;
- WCHAR wstrPath[maxFileLen];
- if (GetEnvironmentVariable(L"APPDATA", wstrPath, maxFileLen)) {
- QDir appData(QString::fromStdWString(std::wstring(wstrPath)));
- return appData.absolutePath() + "/" + QString::fromWCharArray(AppName) + "/";
- }*/
- return QString();
+ return objc_appDataPath();
}
QString psCurrentExeDirectory(int argc, char *argv[]) {
@@ -1485,81 +1241,20 @@ void psDoCleanup() {
}
int psCleanup() {
- /*__try
- {
- psDoCleanup();
- }
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- return 0;
- }*/
+ psDoCleanup();
return 0;
}
void psDoFixPrevious() {
- /*try {
- static const int bufSize = 4096;
- DWORD checkType, checkSize = bufSize * 2;
- WCHAR checkStr[bufSize];
-
- QString appId = QString::fromStdWString(AppId);
- QString newKeyStr1 = QString("Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\%1_is1").arg(appId);
- QString newKeyStr2 = QString("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\%1_is1").arg(appId);
- QString oldKeyStr1 = QString("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\%1_is1").arg(appId);
- QString oldKeyStr2 = QString("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\%1_is1").arg(appId);
- HKEY newKey1, newKey2, oldKey1, oldKey2;
- LSTATUS newKeyRes1 = RegOpenKeyEx(HKEY_CURRENT_USER, newKeyStr1.toStdWString().c_str(), 0, KEY_READ, &newKey1);
- LSTATUS newKeyRes2 = RegOpenKeyEx(HKEY_CURRENT_USER, newKeyStr2.toStdWString().c_str(), 0, KEY_READ, &newKey2);
- LSTATUS oldKeyRes1 = RegOpenKeyEx(HKEY_LOCAL_MACHINE, oldKeyStr1.toStdWString().c_str(), 0, KEY_READ, &oldKey1);
- LSTATUS oldKeyRes2 = RegOpenKeyEx(HKEY_LOCAL_MACHINE, oldKeyStr2.toStdWString().c_str(), 0, KEY_READ, &oldKey2);
-
- bool existNew1 = (newKeyRes1 == ERROR_SUCCESS) && (RegQueryValueEx(newKey1, L"InstallDate", 0, &checkType, (BYTE*)checkStr, &checkSize) == ERROR_SUCCESS); checkSize = bufSize * 2;
- bool existNew2 = (newKeyRes2 == ERROR_SUCCESS) && (RegQueryValueEx(newKey2, L"InstallDate", 0, &checkType, (BYTE*)checkStr, &checkSize) == ERROR_SUCCESS); checkSize = bufSize * 2;
- bool existOld1 = (oldKeyRes1 == ERROR_SUCCESS) && (RegQueryValueEx(oldKey1, L"InstallDate", 0, &checkType, (BYTE*)checkStr, &checkSize) == ERROR_SUCCESS); checkSize = bufSize * 2;
- bool existOld2 = (oldKeyRes2 == ERROR_SUCCESS) && (RegQueryValueEx(oldKey2, L"InstallDate", 0, &checkType, (BYTE*)checkStr, &checkSize) == ERROR_SUCCESS); checkSize = bufSize * 2;
-
- if (newKeyRes1 == ERROR_SUCCESS) RegCloseKey(newKey1);
- if (newKeyRes2 == ERROR_SUCCESS) RegCloseKey(newKey2);
- if (oldKeyRes1 == ERROR_SUCCESS) RegCloseKey(oldKey1);
- if (oldKeyRes2 == ERROR_SUCCESS) RegCloseKey(oldKey2);
-
- if (existNew1 || existNew2) {
- oldKeyRes1 = existOld1 ? RegDeleteKey(HKEY_LOCAL_MACHINE, oldKeyStr1.toStdWString().c_str()) : ERROR_SUCCESS;
- oldKeyRes2 = existOld2 ? RegDeleteKey(HKEY_LOCAL_MACHINE, oldKeyStr2.toStdWString().c_str()) : ERROR_SUCCESS;
- }
-
- QString userDesktopLnk, commonDesktopLnk;
- WCHAR userDesktopFolder[MAX_PATH], commonDesktopFolder[MAX_PATH];
- HRESULT userDesktopRes = SHGetFolderPath(0, CSIDL_DESKTOPDIRECTORY, 0, SHGFP_TYPE_CURRENT, userDesktopFolder);
- HRESULT commonDesktopRes = SHGetFolderPath(0, CSIDL_COMMON_DESKTOPDIRECTORY, 0, SHGFP_TYPE_CURRENT, commonDesktopFolder);
- if (SUCCEEDED(userDesktopRes)) {
- userDesktopLnk = QString::fromWCharArray(userDesktopFolder) + "\\Telegram.lnk";
- }
- if (SUCCEEDED(commonDesktopRes)) {
- commonDesktopLnk = QString::fromWCharArray(commonDesktopFolder) + "\\Telegram.lnk";
- }
- QFile userDesktopFile(userDesktopLnk), commonDesktopFile(commonDesktopLnk);
- if (QFile::exists(userDesktopLnk) && QFile::exists(commonDesktopLnk) && userDesktopLnk != commonDesktopLnk) {
- bool removed = QFile::remove(commonDesktopLnk);
- }
- } catch (...) {
- }*/
}
int psFixPrevious() {
- /*__try
- {
- psDoFixPrevious();
- }
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- return 0;
- }*/
+ psDoFixPrevious();
return 0;
}
bool psCheckReadyUpdate() {
- /*QString readyPath = cWorkingDir() + qsl("tupdates/ready");
+ QString readyPath = cWorkingDir() + qsl("tupdates/ready");
if (!QDir(readyPath).exists()) {
return false;
}
@@ -1573,8 +1268,8 @@ bool psCheckReadyUpdate() {
PsUpdateDownloader::clearAll();
return false;
}
- DWORD versionNum;
- if (fVersion.read((char*)&versionNum, sizeof(DWORD)) != sizeof(DWORD)) {
+ VerInt versionNum;
+ if (fVersion.read((char*)&versionNum, sizeof(VerInt)) != sizeof(VerInt)) {
LOG(("Update Error: cant read version from file '%1'").arg(versionPath));
PsUpdateDownloader::clearAll();
return false;
@@ -1587,19 +1282,25 @@ bool psCheckReadyUpdate() {
}
}
+#ifdef Q_OS_WIN
QString curUpdater = (cExeDir() + "Updater.exe");
QFileInfo updater(cWorkingDir() + "tupdates/ready/Updater.exe");
+#elif defined Q_OS_MAC
+ QString curUpdater = (cExeDir() + "Telegram.app/Contents/Frameworks/Updater");
+ QFileInfo updater(cWorkingDir() + "tupdates/ready/Telegram.app/Contents/Frameworks/Updater");
+#endif
if (!updater.exists()) {
QFileInfo current(curUpdater);
if (!current.exists()) {
PsUpdateDownloader::clearAll();
return false;
}
- if (CopyFile(current.absoluteFilePath().toStdWString().c_str(), updater.absoluteFilePath().toStdWString().c_str(), TRUE) == FALSE) {
+ if (!QFile(current.absoluteFilePath()).copy(updater.absoluteFilePath())) {
PsUpdateDownloader::clearAll();
return false;
}
}
+#ifdef Q_OS_WIN
if (CopyFile(updater.absoluteFilePath().toStdWString().c_str(), curUpdater.toStdWString().c_str(), FALSE) == FALSE) {
PsUpdateDownloader::clearAll();
return false;
@@ -1607,34 +1308,27 @@ bool psCheckReadyUpdate() {
if (DeleteFile(updater.absoluteFilePath().toStdWString().c_str()) == FALSE) {
PsUpdateDownloader::clearAll();
return false;
- }*/
- return false; // TODO
+ }
+#elif defined Q_OS_MAC
+ QFileInfo to(curUpdater);
+ QDir().mkpath(to.absolutePath());
+ if (!objc_moveFile(updater.absoluteFilePath(), curUpdater)) {
+ PsUpdateDownloader::clearAll();
+ return false;
+ }
+#endif
+ return true;
}
void psPostprocessFile(const QString &name) {
- /*std::wstring zoneFile = QDir::toNativeSeparators(name).toStdWString() + L":Zone.Identifier";
- HANDLE f = CreateFile(zoneFile.c_str(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
- if (f == INVALID_HANDLE_VALUE) { // :(
- return;
- }
-
- const char data[] = "[ZoneTransfer]\r\nZoneId=3\r\n";
-
- DWORD written = 0;
- BOOL result = WriteFile(f, data, sizeof(data), &written, NULL);
- CloseHandle(f);
-
- if (!result || written != sizeof(data)) { // :(
- return;
- }*/
}
void psOpenFile(const QString &name, bool openWith) {
- objc_openFile(name.toUtf8().constData(), openWith);
+ objc_openFile(name, openWith);
}
void psShowInFolder(const QString &name) {
- objc_showInFinder(name.toUtf8().constData(), QFileInfo(name).absolutePath().toUtf8().constData());
+ objc_showInFinder(name, QFileInfo(name).absolutePath());
}
void psFinish() {
@@ -1642,69 +1336,15 @@ void psFinish() {
}
void psExecUpdater() {
- /*QString targs = qsl("-update");
- if (cFromAutoStart()) targs += qsl(" -autostart");
- if (cDebug()) targs += qsl(" -debug");
-
- QString updater(QDir::toNativeSeparators(cExeDir() + "Updater.exe")), wdir(QDir::toNativeSeparators(cWorkingDir()));
-
- DEBUG_LOG(("Application Info: executing %1 %2").arg(cExeDir() + "Updater.exe").arg(targs));
- HINSTANCE r = ShellExecute(0, 0, updater.toStdWString().c_str(), targs.toStdWString().c_str(), wdir.isEmpty() ? 0 : wdir.toStdWString().c_str(), SW_SHOWNORMAL);
- if (long(r) < 32) {
- DEBUG_LOG(("Application Error: failed to execute %1, working directory: '%2', result: %3").arg(updater).arg(wdir).arg(long(r)));
+ if (!objc_execUpdater()) {
QString readyPath = cWorkingDir() + qsl("tupdates/ready");
PsUpdateDownloader::deleteDir(readyPath);
- }*/
+ }
}
void psExecTelegram() {
- /*QString targs = qsl("-noupdate -tosettings");
- if (cFromAutoStart()) targs += qsl(" -autostart");
- if (cDebug()) targs += qsl(" -debug");
- if (cDataFile() != (cTestMode() ? qsl("data_test") : qsl("data"))) targs += qsl(" -key \"") + cDataFile() + '"';
-
- QString telegram(QDir::toNativeSeparators(cExeDir() + "Telegram.exe")), wdir(QDir::toNativeSeparators(cWorkingDir()));
-
- DEBUG_LOG(("Application Info: executing %1 %2").arg(cExeDir() + "Telegram.exe").arg(targs));
- HINSTANCE r = ShellExecute(0, 0, telegram.toStdWString().c_str(), targs.toStdWString().c_str(), wdir.isEmpty() ? 0 : wdir.toStdWString().c_str(), SW_SHOWNORMAL);
- if (long(r) < 32) {
- DEBUG_LOG(("Application Error: failed to execute %1, working directory: '%2', result: %3").arg(telegram).arg(wdir).arg(long(r)));
- }*/
+ objc_execTelegram();
}
void psAutoStart(bool start, bool silent) {
- /*WCHAR startupFolder[MAX_PATH];
- HRESULT hres = SHGetFolderPath(0, CSIDL_STARTUP, 0, SHGFP_TYPE_CURRENT, startupFolder);
- if (SUCCEEDED(hres)) {
- QString lnk = QString::fromWCharArray(startupFolder) + "\\Telegram.lnk";
- if (start) {
- IShellLink* psl;
- hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
- if (SUCCEEDED(hres)) {
- IPersistFile* ppf;
-
- QString exe = QDir::toNativeSeparators(QDir(cExeDir()).absolutePath() + "//Telegram.exe"), dir = QDir::toNativeSeparators(QDir(cWorkingDir()).absolutePath());
- psl->SetArguments(L"-autostart");
- psl->SetPath(exe.toStdWString().c_str());
- psl->SetWorkingDirectory(dir.toStdWString().c_str());
- psl->SetDescription(L"Telegram autorun link.\nYou can disable autorun in Telegram settings.");
-
- hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
-
- if (SUCCEEDED(hres)) {
- hres = ppf->Save(lnk.toStdWString().c_str(), TRUE);
- ppf->Release();
- } else {
- if (!silent) LOG(("App Error: could not create interface IID_IPersistFile %1").arg(hres));
- }
- psl->Release();
- } else {
- if (!silent) LOG(("App Error: could not create instance of IID_IShellLink %1").arg(hres));
- }
- } else {
- QFile::remove(lnk);
- }
- } else {
- if (!silent) LOG(("App Error: could not get CSIDL_STARTUP folder %1").arg(hres));
- }*/
}
diff --git a/Telegram/SourceFiles/pspecific_mac_p.h b/Telegram/SourceFiles/pspecific_mac_p.h
index c6edd93498..b11bfc561c 100644
--- a/Telegram/SourceFiles/pspecific_mac_p.h
+++ b/Telegram/SourceFiles/pspecific_mac_p.h
@@ -24,14 +24,14 @@ public:
PsMacWindowPrivate();
- void setWindowBadge(const char *utf8str);
+ void setWindowBadge(const QString &str);
void startBounce();
void holdOnTop(WId winId);
void showOverAll(WId winId);
void activateWnd(WId winId);
- void showNotify(unsigned long long peer, const char *utf8title, const char *subtitle, const char *utf8msg);
- void clearNotifies(unsigned long long peer = 0);
+ void showNotify(uint64 peer, const QString &title, const QString &subtitle, const QString &msg);
+ void clearNotifies(uint64 peer = 0);
void enableShadow(WId winId);
@@ -48,10 +48,20 @@ public:
};
-void objc_debugShowAlert(const char *utf8str);
-void objc_outputDebugString(const char *utf8str);
+void objc_debugShowAlert(const QString &str);
+void objc_outputDebugString(const QString &str);
int64 objc_idleTime();
-void objc_showInFinder(const char *utf8file, const char *utf8path);
-void objc_openFile(const char *utf8file, bool openwith);
+void objc_showInFinder(const QString &file, const QString &path);
+void objc_openFile(const QString &file, bool openwith);
void objc_finish();
+bool objc_execUpdater();
+void objc_execTelegram();
+
+void objc_activateProgram();
+bool objc_moveFile(const QString &from, const QString &to);
+void objc_deleteDir(const QString &dir);
+
+QString objc_appDataPath();
+QString objc_currentCountry();
+QString objc_currentLang();
diff --git a/Telegram/SourceFiles/pspecific_mac_p.mm b/Telegram/SourceFiles/pspecific_mac_p.mm
index 5a0611fd35..3f3fbf7f2a 100644
--- a/Telegram/SourceFiles/pspecific_mac_p.mm
+++ b/Telegram/SourceFiles/pspecific_mac_p.mm
@@ -26,21 +26,8 @@ Copyright (c) 2014 John Preston, https://tdesktop.com
class QNSString {
public:
- QNSString(const QString &str) : _str([[NSString alloc] initWithUTF8String:str.toUtf8().constData()]) {
+ QNSString(const QString &str) : _str([NSString stringWithUTF8String:str.toUtf8().constData()]) {
}
- QNSString &operator=(const QNSString &other) {
- if (this != &other) {
- [_str release];
- _str = [other._str copy];
- }
- return *this;
- }
- QNSString(const QNSString &other) : _str([other._str copy]) {
- }
- ~QNSString() {
- [_str release];
- }
-
NSString *s() {
return _str;
}
@@ -163,10 +150,8 @@ PsMacWindowPrivate::PsMacWindowPrivate() : data(new PsMacWindowData(this)) {
[center setDelegate:data->notifyHandler];
}
-void PsMacWindowPrivate::setWindowBadge(const char *utf8str) {
- NSString *badgeString = [[NSString alloc] initWithUTF8String:utf8str];
- [[NSApp dockTile] setBadgeLabel:badgeString];
- [badgeString release];
+void PsMacWindowPrivate::setWindowBadge(const QString &str) {
+ [[NSApp dockTile] setBadgeLabel:QNSString(str).s()];
}
void PsMacWindowPrivate::startBounce() {
@@ -190,25 +175,15 @@ void PsMacWindowPrivate::activateWnd(WId winId) {
[wnd orderFront:wnd];
}
-void PsMacWindowPrivate::showNotify(unsigned long long peer, const char *utf8title, const char *utf8subtitle, const char *utf8msg) {
+void PsMacWindowPrivate::showNotify(uint64 peer, const QString &title, const QString &subtitle, const QString &msg) {
NSUserNotification *notification = [[NSUserNotification alloc] init];
- NSDictionary *uinfo = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithUnsignedLongLong:peer],@"peer",[NSNumber numberWithUnsignedLongLong:cInstance()],@"inst",nil];
- [notification setUserInfo:uinfo];
- [uinfo release];
+ [notification setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedLongLong:peer],@"peer",[NSNumber numberWithUnsignedLongLong:cInstance()],@"inst",nil]];
- NSString *title = [[NSString alloc] initWithUTF8String:utf8title];
- [notification setTitle:title];
- [title release];
-
- NSString *subtitle = [[NSString alloc] initWithUTF8String:utf8subtitle];
- [notification setSubtitle:subtitle];
- [subtitle release];
+ [notification setTitle:QNSString(title).s()];
+ [notification setSubtitle:QNSString(subtitle).s()];
+ [notification setInformativeText:QNSString(msg).s()];
- NSString *msg = [[NSString alloc] initWithUTF8String:utf8msg];
- [notification setInformativeText:msg];
- [msg release];
-
[notification setHasReplyButton:YES];
[notification setSoundName:nil];
@@ -238,18 +213,12 @@ void PsMacWindowPrivate::clearNotifies(unsigned long long peer) {
}
}
-void objc_debugShowAlert(const char *utf8str) {
- NSString *text = [[NSString alloc] initWithUTF8String: utf8str];
- NSAlert *alert = [NSAlert alertWithMessageText:@"Debug Message" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"%@", text];
- [alert runModal];
- [alert release];
- [text release];
+void objc_debugShowAlert(const QString &str) {
+ [[NSAlert alertWithMessageText:@"Debug Message" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"%@", QNSString(str).s()] runModal];
}
-void objc_outputDebugString(const char *utf8str) {
- NSString *text = [[NSString alloc] initWithUTF8String:utf8str];
- NSLog(@"%@", text);
- [text release];
+void objc_outputDebugString(const QString &str) {
+ NSLog(@"%@", QNSString(str).s());
}
PsMacWindowPrivate::~PsMacWindowPrivate() {
@@ -306,11 +275,8 @@ int64 objc_idleTime() { // taken from https://github.com/trueinteractions/tint/i
return (result == err) ? -1 : int64(result);
}
-void objc_showInFinder(const char *utf8file, const char *utf8path) {
- NSString *file = [[NSString alloc] initWithUTF8String:utf8file], *path = [[NSString alloc] initWithUTF8String:utf8path];
- [[NSWorkspace sharedWorkspace] selectFile:file inFileViewerRootedAtPath:path];
- [file release];
- [path release];
+void objc_showInFinder(const QString &file, const QString &path) {
+ [[NSWorkspace sharedWorkspace] selectFile:QNSString(file).s() inFileViewerRootedAtPath:QNSString(path).s()];
}
@interface NSURL(CompareUrls)
@@ -456,8 +422,8 @@ void objc_showInFinder(const char *utf8file, const char *utf8path) {
@end
-void objc_openFile(const char *utf8file, bool openwith) {
- NSString *file = [[NSString alloc] initWithUTF8String:utf8file];
+void objc_openFile(const QString &f, bool openwith) {
+ NSString *file = QNSString(f).s();
if (openwith || [[NSWorkspace sharedWorkspace] openFile:file] == NO) {
@try {
NSURL *url = [NSURL fileURLWithPath:file];
@@ -558,7 +524,7 @@ void objc_openFile(const char *utf8file, bool openwith) {
[openPanel setAllowsMultipleSelection:NO];
[openPanel setResolvesAliases:YES];
[openPanel setTitle:objc_lang(lng_mac_choose_app).s()];
- [openPanel setMessage:[objc_lang(lng_mac_choose_text).s() stringByReplacingOccurrencesOfString:@"{file}" withString:name]];
+ [openPanel setMessage:[[objc_lang(lng_mac_choose_text).s() stringByReplacingOccurrencesOfString:@"{file}" withString:name] stringByAppendingFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]]];
NSArray *appsPaths = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationDirectory inDomains:NSLocalDomainMask];
if ([appsPaths count]) [openPanel setDirectoryURL:[appsPaths firstObject]];
@@ -606,3 +572,93 @@ void objc_finish() {
objcLang.clear();
}
}
+
+BOOL _execUpdater(BOOL update = YES) {
+ NSString *path = @"", *args = @"";
+ @try {
+ path = [[NSBundle mainBundle] bundlePath];
+ if (!path) {
+ LOG(("Could not get bundle path!!"));
+ return NO;
+ }
+ path = [path stringByAppendingString:@"/Contents/Frameworks/Updater"];
+
+ NSMutableArray *args = [[NSMutableArray alloc] initWithObjects:@"-workpath", QNSString(cWorkingDir()).s(), @"-tosettings", @"-procid", nil];
+ [args addObject:[NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]]];
+ if (!update) [args addObject:@"-noupdate"];
+ if (cFromAutoStart()) [args addObject:@"-autostart"];
+ if (cDebug()) [args addObject:@"-debug"];
+ if (cDataFile() != (cTestMode() ? qsl("data_test") : qsl("data"))) {
+ [args addObject:@"-key"];
+ [args addObject:QNSString(cDataFile()).s()];
+ }
+
+ DEBUG_LOG(("Application Info: executing %1 %2").arg(QString::fromUtf8([path cStringUsingEncoding:NSUTF8StringEncoding])).arg(QString::fromUtf8([[args componentsJoinedByString:@" "] cStringUsingEncoding:NSUTF8StringEncoding])));
+ if (![NSTask launchedTaskWithLaunchPath:path arguments:args]) {
+ LOG(("Task not launched while executing %1 %2").arg(QString::fromUtf8([path cStringUsingEncoding:NSUTF8StringEncoding])).arg(QString::fromUtf8([[args componentsJoinedByString:@" "] cStringUsingEncoding:NSUTF8StringEncoding])));
+ return NO;
+ }
+ }
+ @catch (NSException *exception) {
+ LOG(("Exception caught while executing %1 %2").arg(QString::fromUtf8([path cStringUsingEncoding:NSUTF8StringEncoding])).arg(QString::fromUtf8([args cStringUsingEncoding:NSUTF8StringEncoding])));
+ return NO;
+ }
+ @finally {
+ }
+ return YES;
+}
+
+bool objc_execUpdater() {
+ return !!_execUpdater();
+}
+
+void objc_execTelegram() {
+ _execUpdater(NO);
+}
+
+void objc_activateProgram() {
+ [NSApp activateIgnoringOtherApps:YES];
+}
+
+bool objc_moveFile(const QString &from, const QString &to) {
+ NSString *f = QNSString(from).s(), *t = QNSString(to).s();
+ if ([[NSFileManager defaultManager] fileExistsAtPath:t]) {
+ NSData *data = [NSData dataWithContentsOfFile:f];
+ if (data) {
+ if ([data writeToFile:t atomically:YES]) {
+ if ([[NSFileManager defaultManager] removeItemAtPath:f error:nil]) {
+ return true;
+ }
+ }
+ }
+ } else {
+ if ([[NSFileManager defaultManager] moveItemAtPath:f toPath:t error:nil]) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void objc_deleteDir(const QString &dir) {
+ [[NSFileManager defaultManager] removeItemAtPath:QNSString(dir).s() error:nil];
+}
+
+QString objc_appDataPath() {
+ NSURL *url = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil];
+ if (url) {
+ return QString::fromUtf8([[url path] fileSystemRepresentation]) + '/' + QString::fromWCharArray(AppName) + '/';
+ }
+ return QString();
+}
+
+QString objc_currentCountry() {
+ NSLocale *currentLocale = [NSLocale currentLocale]; // get the current locale.
+ NSString *countryCode = [currentLocale objectForKey:NSLocaleCountryCode];
+ return countryCode ? QString::fromUtf8([countryCode cStringUsingEncoding:NSUTF8StringEncoding]) : QString();
+}
+
+QString objc_currentLang() {
+ NSLocale *currentLocale = [NSLocale currentLocale]; // get the current locale.
+ NSString *currentLang = [currentLocale objectForKey:NSLocaleLanguageCode];
+ return currentLang ? QString::fromUtf8([currentLang cStringUsingEncoding:NSUTF8StringEncoding]) : QString();
+}
diff --git a/Telegram/SourceFiles/settings.cpp b/Telegram/SourceFiles/settings.cpp
index 411d7d42b5..7fd4066fc7 100644
--- a/Telegram/SourceFiles/settings.cpp
+++ b/Telegram/SourceFiles/settings.cpp
@@ -74,10 +74,13 @@ uint64 gInstance = 0.;
#ifdef Q_OS_WIN
DBIPlatform gPlatform = dbipWindows;
+QUrl gUpdateURL = QUrl(qsl("http://tdesktop.com/win/tupdates/current"));
#elif defined Q_OS_MAC
DBIPlatform gPlatform = dbipMac;
+QUrl gUpdateURL = QUrl(qsl("http://tdesktop.com/mac/tupdates/current"));
#elif defined Q_OS_LINUX
DBIPlatform gPlatform = dbipLinux;
+QUrl gUpdateURL = QUrl(qsl("http://tdesktop.com/linux/tupdates/current"));
#else
#error Unknown platform
#endif
diff --git a/Telegram/SourceFiles/settings.h b/Telegram/SourceFiles/settings.h
index 52bb4708d9..48572950f7 100644
--- a/Telegram/SourceFiles/settings.h
+++ b/Telegram/SourceFiles/settings.h
@@ -138,5 +138,6 @@ DeclareSetting(bool, CustomNotifies);
DeclareReadSetting(uint64, Instance);
DeclareReadSetting(DBIPlatform, Platform);
+DeclareReadSetting(QUrl, UpdateURL);
void settingsParseArgs(int argc, char *argv[]);
diff --git a/Telegram/SourceFiles/stdafx.h b/Telegram/SourceFiles/stdafx.h
index 49b2f0e362..6ac7aec176 100644
--- a/Telegram/SourceFiles/stdafx.h
+++ b/Telegram/SourceFiles/stdafx.h
@@ -34,7 +34,11 @@ Copyright (c) 2014 John Preston, https://tdesktop.com
#include
#include
+#ifdef Q_OS_WIN // use Lzma SDK for win
#include
+#else
+#include
+#endif
#if defined Q_OS_WIN
#define _NEED_WIN_GENERATE_DUMP
diff --git a/Telegram/SourceFiles/window.cpp b/Telegram/SourceFiles/window.cpp
index 3356d70037..7d0f6e4db2 100644
--- a/Telegram/SourceFiles/window.cpp
+++ b/Telegram/SourceFiles/window.cpp
@@ -450,6 +450,8 @@ bool Window::eventFilter(QObject *obj, QEvent *evt) {
if (App::main()) {
App::main()->mainStateChanged(state);
}
+ } else if (obj == this && (evt->type() == QEvent::Move || evt->type() == QEvent::Resize)) {
+ psUpdatedPosition();
}
return PsMainWindow::eventFilter(obj, evt);
}
diff --git a/Telegram/Telegram.pro b/Telegram/Telegram.pro
index f21d06e913..1f9496cf2c 100644
--- a/Telegram/Telegram.pro
+++ b/Telegram/Telegram.pro
@@ -194,6 +194,3 @@ LIBS += ./../../Libraries/libexif-0.6.20/libexif/.libs/libexif.a
RESOURCES += \
./SourceFiles/telegram.qrc
-CONFIG(debug, debug|release) {
- DEFINES += _DEBUG
-}
diff --git a/Telegram/Telegram.xcodeproj/project.pbxproj b/Telegram/Telegram.xcodeproj/project.pbxproj
index aa926d49c0..835dd6d1df 100644
--- a/Telegram/Telegram.xcodeproj/project.pbxproj
+++ b/Telegram/Telegram.xcodeproj/project.pbxproj
@@ -202,6 +202,13 @@
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
+ 07084688195445A700B5AE3A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 07084684195445A600B5AE3A /* Updater.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 07084678195445A600B5AE3A;
+ remoteInfo = Updater;
+ };
07C3AF22194335970016CFF1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6DB9C3763D02B1415CD9D565 /* Project object */;
@@ -226,6 +233,7 @@
060A694B42A4555240009936 /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtga.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_plugin_qtga.pri"; sourceTree = ""; };
06E379415713F34B83F99C35 /* app.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = app.cpp; path = SourceFiles/app.cpp; sourceTree = ""; };
07055CC3194EE85B0008DEF6 /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcrypto.a; path = "./../../Libraries/openssl-xcode/libcrypto.a"; sourceTree = ""; };
+ 07084684195445A600B5AE3A /* Updater.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Updater.xcodeproj; sourceTree = SOURCE_ROOT; };
075EB50EB07CF69FD62FB8DF /* /usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sql_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.3.0/mkspecs/modules/qt_lib_sql_private.pri"; sourceTree = ""; };
0771C4C94B623FC34BF62983 /* intro.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = intro.cpp; path = SourceFiles/intro/intro.cpp; sourceTree = ""; };
07C3AF24194335ED0016CFF1 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Telegram/Images.xcassets; sourceTree = SOURCE_ROOT; };
@@ -652,6 +660,14 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ 07084685195445A600B5AE3A /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 07084689195445A700B5AE3A /* Updater */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
130BDDB6FC4D60CF394D95AF /* GeneratedFiles */ = {
isa = PBXGroup;
children = (
@@ -1139,6 +1155,7 @@
E8C543AB96796ECAA2E65C57 /* Telegram */ = {
isa = PBXGroup;
children = (
+ 07084684195445A600B5AE3A /* Updater.xcodeproj */,
2EB56BE3C2D93CDAB0C52E67 /* Sources */,
25B08E2869634E9BCBA333A2 /* Generated Sources */,
74B182DB50CB5611B5C1C297 /* Supporting Files */,
@@ -1198,6 +1215,12 @@
mainGroup = E8C543AB96796ECAA2E65C57 /* Telegram */;
productRefGroup = FE0A091FDBFB3E9C31B7A1BD /* Products */;
projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = 07084685195445A600B5AE3A /* Products */;
+ ProjectRef = 07084684195445A600B5AE3A /* Updater.xcodeproj */;
+ },
+ );
projectRoot = "";
targets = (
7CCA95B9FCAD34D929431AD6 /* Telegram */,
@@ -1207,6 +1230,16 @@
};
/* End PBXProject section */
+/* Begin PBXReferenceProxy section */
+ 07084689195445A700B5AE3A /* Updater */ = {
+ isa = PBXReferenceProxy;
+ fileType = "compiled.mach-o.executable";
+ path = Updater;
+ remoteRef = 07084688195445A700B5AE3A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
/* Begin PBXResourcesBuildPhase section */
07C3AF25194336160016CFF1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
@@ -1476,7 +1509,7 @@
./../../Libraries/QtStatic/qtbase/include,
./SourceFiles,
./GeneratedFiles,
- ./../../Libraries/lzma/C,
+ /usr/local/include,
"./../../Libraries/libexif-0.6.20",
"/usr/local/Qt-5.3.0/include",
"/usr/local/Qt-5.3.0/include/QtMultimedia",
@@ -1512,6 +1545,7 @@
"-Wall",
"-W",
"-fPIE",
+ "-D_WITH_DEBUG",
"-DQT_MULTIMEDIA_LIB",
"-DQT_WIDGETS_LIB",
"-DQT_NETWORK_LIB",
@@ -1532,6 +1566,7 @@
"-Wall",
"-W",
"-fPIE",
+ "-D_WITH_DEBUG",
"-DQT_MULTIMEDIA_LIB",
"-DQT_WIDGETS_LIB",
"-DQT_NETWORK_LIB",
@@ -1558,6 +1593,7 @@
"-L/usr/local/Qt-5.3.0/plugins/imageformats",
"-lz",
"-lm",
+ "-llzma",
);
PRODUCT_NAME = Telegram;
QT_LIBRARY_SUFFIX = "";
@@ -1596,7 +1632,7 @@
./../../Libraries/QtStatic/qtbase/include,
./SourceFiles,
./GeneratedFiles,
- ./../../Libraries/lzma/C,
+ /usr/local/include,
"./../../Libraries/libexif-0.6.20",
"/usr/local/Qt-5.3.0/include",
"/usr/local/Qt-5.3.0/include/QtMultimedia",
@@ -1681,6 +1717,7 @@
"-L/usr/local/Qt-5.3.0/plugins/imageformats",
"-lz",
"-lm",
+ "-llzma",
);
PRODUCT_NAME = Telegram;
QT_LIBRARY_SUFFIX = _debug;
diff --git a/Telegram/Updater.xcodeproj/project.pbxproj b/Telegram/Updater.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..bc88eefa7b
--- /dev/null
+++ b/Telegram/Updater.xcodeproj/project.pbxproj
@@ -0,0 +1,237 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 070846A619544CDD00B5AE3A /* updater_osx.m in Sources */ = {isa = PBXBuildFile; fileRef = 070846A519544CDD00B5AE3A /* updater_osx.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 07084676195445A600B5AE3A /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 07084678195445A600B5AE3A /* Updater */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Updater; sourceTree = BUILT_PRODUCTS_DIR; };
+ 070846A519544CDD00B5AE3A /* updater_osx.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = updater_osx.m; path = SourceFiles/_other/updater_osx.m; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 07084675195445A600B5AE3A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 0708466F195445A600B5AE3A = {
+ isa = PBXGroup;
+ children = (
+ 0708467A195445A600B5AE3A /* Updater */,
+ 07084679195445A600B5AE3A /* Products */,
+ );
+ sourceTree = "";
+ };
+ 07084679195445A600B5AE3A /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 07084678195445A600B5AE3A /* Updater */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 0708467A195445A600B5AE3A /* Updater */ = {
+ isa = PBXGroup;
+ children = (
+ 070846A519544CDD00B5AE3A /* updater_osx.m */,
+ );
+ path = Updater;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 07084677195445A600B5AE3A /* Updater */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 07084681195445A600B5AE3A /* Build configuration list for PBXNativeTarget "Updater" */;
+ buildPhases = (
+ 07084674195445A600B5AE3A /* Sources */,
+ 07084675195445A600B5AE3A /* Frameworks */,
+ 07084676195445A600B5AE3A /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Updater;
+ productName = Updater;
+ productReference = 07084678195445A600B5AE3A /* Updater */;
+ productType = "com.apple.product-type.tool";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 07084670195445A600B5AE3A /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0510;
+ };
+ buildConfigurationList = 07084673195445A600B5AE3A /* Build configuration list for PBXProject "Updater" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 0708466F195445A600B5AE3A;
+ productRefGroup = 07084679195445A600B5AE3A /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 07084677195445A600B5AE3A /* Updater */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 07084674195445A600B5AE3A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 070846A619544CDD00B5AE3A /* updater_osx.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 0708467F195445A600B5AE3A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Telegram.app/Contents/Frameworks";
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.9;
+ OBJROOT = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)IntermediateUpdater";
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_CFLAGS = "-D_DEBUG";
+ SDKROOT = macosx;
+ SYMROOT = ../Mac;
+ };
+ name = Debug;
+ };
+ 07084680195445A600B5AE3A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Telegram.app/Contents/Frameworks";
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.9;
+ OBJROOT = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)IntermediateUpdater";
+ SDKROOT = macosx;
+ SYMROOT = ../Mac;
+ };
+ name = Release;
+ };
+ 07084682195445A600B5AE3A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 07084683195445A600B5AE3A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 07084673195445A600B5AE3A /* Build configuration list for PBXProject "Updater" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 0708467F195445A600B5AE3A /* Debug */,
+ 07084680195445A600B5AE3A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 07084681195445A600B5AE3A /* Build configuration list for PBXNativeTarget "Updater" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 07084682195445A600B5AE3A /* Debug */,
+ 07084683195445A600B5AE3A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 07084670195445A600B5AE3A /* Project object */;
+}
diff --git a/Telegram/packer_plugin_import.cpp b/Telegram/packer_plugin_import.cpp
new file mode 100644
index 0000000000..7c0d095425
--- /dev/null
+++ b/Telegram/packer_plugin_import.cpp
@@ -0,0 +1,13 @@
+// This file is autogenerated by qmake. It imports static plugin classes for
+// static plugins specified using QTPLUGIN and QT_PLUGIN_CLASS. variables.
+#include
+Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)
+Q_IMPORT_PLUGIN(QDDSPlugin)
+Q_IMPORT_PLUGIN(QICNSPlugin)
+Q_IMPORT_PLUGIN(QICOPlugin)
+Q_IMPORT_PLUGIN(QJp2Plugin)
+Q_IMPORT_PLUGIN(QMngPlugin)
+Q_IMPORT_PLUGIN(QTgaPlugin)
+Q_IMPORT_PLUGIN(QTiffPlugin)
+Q_IMPORT_PLUGIN(QWbmpPlugin)
+Q_IMPORT_PLUGIN(QWebpPlugin)