diff options
29 files changed, 118 insertions, 64 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 09a6f4c..65eea47 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,6 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") include (CheckIncludeFile) find_package(Qt4 REQUIRED COMPONENTS QTGUI QT3SUPPORT) find_package(LibXml2 REQUIRED) -find_package(ALSA REQUIRED) find_package(LibMagic REQUIRED) find_package(LibSndfile REQUIRED) find_package(Readline REQUIRED) @@ -35,11 +34,23 @@ endif (COMMONCPP_FOUND) include_directories(${LIBXML2_INCLUDE_DIR} ${QT_QT3SUPPORT_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_INCLUDE_DIR}) +if (WITH_ALSA) + find_package(ALSA) + + if (ALSA_FOUND) + message(STATUS "libasound OK") + set(HAVE_LIBASOUND TRUE) + else (ALSA_FOUND) + message(FATAL_ERROR "libasound not found!") + endif (ALSA_FOUND) +endif (WITH_ALSA) + if (WITH_ZRTP) find_package(Zrtpcpp) if (ZRTPCPP_FOUND) message(STATUS "libzrtpcpp OK") + set(HAVE_ZRTP TRUE) include_directories(${ZRTPCPP_INCLUDE_DIR}) else (ZRTPCPP_FOUND) @@ -76,6 +87,7 @@ if (WITH_SPEEX) if (SPEEX_FOUND) message(STATUS "Speex OK") + set(HAVE_SPEEX TRUE) include_directories(${SPEEX_INCLUDE_DIR}) else (SPEEX_FOUND) @@ -88,6 +100,7 @@ if (WITH_ILBC) if (ILBC_FOUND) message(STATUS "iLBC OK") + set(HAVE_ILBC TRUE) include_directories(${ILBC_INCLUDE_DIR}) else (ILBC_FOUND) diff --git a/cmake/FindSpeex.cmake b/cmake/FindSpeex.cmake index ff801fa..7a9c2d4 100644 --- a/cmake/FindSpeex.cmake +++ b/cmake/FindSpeex.cmake @@ -1,9 +1,11 @@ FIND_PATH(SPEEX_INCLUDE_DIR speex/speex.h) -FIND_LIBRARY(SPEEX_LIBRARIES NAMES speex) +FIND_LIBRARY(SPEEX_LIBRARY NAMES speex) +FIND_LIBRARY(SPEEXDSP_LIBRARY NAMES speexdsp) -IF(SPEEX_INCLUDE_DIR AND SPEEX_LIBRARIES) +IF(SPEEX_INCLUDE_DIR AND SPEEX_LIBRARY AND SPEEXDSP_LIBRARY) SET(SPEEX_FOUND TRUE) -ENDIF(SPEEX_INCLUDE_DIR AND SPEEX_LIBRARIES) + SET(SPEEX_LIBRARIES ${SPEEX_LIBRARY} ${SPEEXDSP_LIBRARY}) +ENDIF(SPEEX_INCLUDE_DIR AND SPEEX_LIBRARY AND SPEEXDSP_LIBRARY) IF(SPEEX_FOUND) IF (NOT Speex_FIND_QUIETLY) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e849385..a3c939f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -77,7 +77,7 @@ add_subdirectory(gui) target_link_libraries(twinkle-console -lpthread -lresolv ${LibMagic_LIBRARY} ${LIBXML2_LIBRARIES} ${Readline_LIBRARY} ${ILBC_LIBRARIES} ${SPEEX_LIBRARIES} ${ZRTPCPP_LIBRARIES} ${CCRTP_LIBRARIES} ${COMMONCPP_LIBRARIES} ${UCOMMON_LIBRARIES} ${LIBSNDFILE_LIBRARY} - ${Boost_LIBRARIES}) + ${Boost_LIBRARIES} ${ALSA_LIBRARY}) install(TARGETS twinkle-console DESTINATION bin) diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 5879488..27eaf71 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -136,6 +136,6 @@ add_executable(twinkle ${TWINKLE_GUI-SRCS}) target_link_libraries(twinkle -lpthread -lresolv ${LibMagic_LIBRARY} ${LIBXML2_LIBRARIES} ${Readline_LIBRARY} ${ILBC_LIBRARIES} ${SPEEX_LIBRARIES} ${ZRTPCPP_LIBRARIES} ${CCRTP_LIBRARIES} ${COMMONCPP_LIBRARIES} ${UCOMMON_LIBRARIES} ${LIBSNDFILE_LIBRARY} - ${Boost_LIBRARIES} Qt4::QtGui Qt4::Qt3Support) + ${Boost_LIBRARIES} Qt4::QtGui Qt4::Qt3Support ${ALSA_LIBRARY}) install(TARGETS twinkle DESTINATION bin) diff --git a/src/gui/addresscardform.ui b/src/gui/addresscardform.ui index 6bddf60..f29ee6e 100644 --- a/src/gui/addresscardform.ui +++ b/src/gui/addresscardform.ui @@ -183,7 +183,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>firstNameLineEdit</tabstop> <tabstop>infixNameLineEdit</tabstop> diff --git a/src/gui/authenticationform.ui b/src/gui/authenticationform.ui index dde4191..d335245 100644 --- a/src/gui/authenticationform.ui +++ b/src/gui/authenticationform.ui @@ -264,7 +264,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>usernameLineEdit</tabstop> <tabstop>passwordLineEdit</tabstop> diff --git a/src/gui/buddyform.ui b/src/gui/buddyform.ui index 5ad5bff..a4806dc 100644 --- a/src/gui/buddyform.ui +++ b/src/gui/buddyform.ui @@ -174,7 +174,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>nameLineEdit</tabstop> <tabstop>phoneLineEdit</tabstop> diff --git a/src/gui/diamondcardprofileform.ui b/src/gui/diamondcardprofileform.ui index 50c2ba6..d05c707 100644 --- a/src/gui/diamondcardprofileform.ui +++ b/src/gui/diamondcardprofileform.ui @@ -15,7 +15,7 @@ </property> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>nameLineEdit</tabstop> <tabstop>accountIdLineEdit</tabstop> diff --git a/src/gui/getaddressform.ui b/src/gui/getaddressform.ui index 74a8d12..e8c525a 100644 --- a/src/gui/getaddressform.ui +++ b/src/gui/getaddressform.ui @@ -313,7 +313,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>addressListView</tabstop> <tabstop>sipOnlyCheckBox</tabstop> diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index c6a95d3..c383472 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2111,33 +2111,53 @@ bool t_gui::cb_ask_user_to_redirect_request(t_user *user_config, return permission; } -bool t_gui::cb_ask_credentials(t_user *user_config, const string &realm, string &username, - string &password) +bool t_gui::do_cb_ask_credentials(t_user *user_config, const string &realm, string &username, + string &password) { QString user(username.c_str()); QString passwd(password.c_str()); - - lock(); - + AuthenticationForm *af = new AuthenticationForm(mainWindow, "authentication", true); MEMMAN_NEW(af); if (!af->exec(user_config, QString(realm.c_str()), user, passwd)) { MEMMAN_DELETE(af); delete af; - unlock(); return false; } - + username = user.ascii(); password = passwd.ascii(); MEMMAN_DELETE(af); delete af; - - unlock(); + return true; } +bool t_gui::cb_ask_credentials(t_user *user_config, const string &realm, string &username, + string &password) +{ + bool retval; + QMetaObject::invokeMethod(this, "do_cb_ask_credentials", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(bool, retval), Q_ARG(t_user*, user_config), + Q_ARG(const string&, realm), Q_ARG(string&, username), + Q_ARG(string&, password)); + + return retval; +} + +bool t_gui::do_cb_ask_user_to_redirect_invite(t_user *user_config, const t_url &destination, + const string &display) +{ + // TODO +} + +bool t_gui::do_cb_ask_user_to_redirect_request(t_user *user_config, const t_url &destination, + const string &display, t_method method) +{ + // TODO +} + void t_gui::cb_ask_user_to_refer(t_user *user_config, const t_url &refer_to_uri, const string &refer_to_display, const t_url &referred_by_uri, diff --git a/src/gui/gui.h b/src/gui/gui.h index 9c0cb3b..e184e67 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -401,6 +401,13 @@ private slots: * function should be called every second. */ void updateTimersMessageSessions(); + + bool do_cb_ask_user_to_redirect_invite(t_user *user_config, const t_url &destination, + const string &display); + bool do_cb_ask_user_to_redirect_request(t_user *user_config, const t_url &destination, + const string &display, t_method method); + bool do_cb_ask_credentials(t_user *user_config, const string &realm, string &username, + string &password); }; #endif diff --git a/src/gui/historyform.ui b/src/gui/historyform.ui index 4a7d5c6..68d4edd 100644 --- a/src/gui/historyform.ui +++ b/src/gui/historyform.ui @@ -320,7 +320,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>historyListView</tabstop> <tabstop>cdrTextEdit</tabstop> diff --git a/src/gui/inviteform.ui b/src/gui/inviteform.ui index cc4705d..0860744 100644 --- a/src/gui/inviteform.ui +++ b/src/gui/inviteform.ui @@ -265,7 +265,7 @@ With this option you request your SIP provider to hide your identity from the ca </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>inviteComboBox</tabstop> <tabstop>subjectLineEdit</tabstop> diff --git a/src/gui/logviewform.ui b/src/gui/logviewform.ui index ead6233..c52ee45 100644 --- a/src/gui/logviewform.ui +++ b/src/gui/logviewform.ui @@ -72,7 +72,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>logTextEdit</tabstop> <tabstop>clearPushButton</tabstop> diff --git a/src/gui/mphoneform.cpp b/src/gui/mphoneform.cpp index 74c9b71..a31b846 100644 --- a/src/gui/mphoneform.cpp +++ b/src/gui/mphoneform.cpp @@ -226,15 +226,20 @@ void MphoneForm::init() menu->insertSeparator(); +#ifdef ENABLE_DIAMONCARD // Diamondcard menu menu->insertItem("Diamondcard", Diamondcard); + menu->insertSeparator(); +#endif - // Exit application when user selects Quit from the tray menu - connect(sysTray, SIGNAL(quitSelected()), - this, SLOT(fileExit())); + fileExitAction->addTo(menu); sysTray->show(); } + +#ifndef ENABLE_DIAMONDCARD + Diamondcard->menuAction()->setVisible(false); +#endif } void MphoneForm::destroy() @@ -640,11 +645,11 @@ void MphoneForm::updateLineStatus(int line) break; case LSSUB_ESTABLISHED: if (phone->has_line_media(line)) { - statLabel->setPixmap(qPixmapFromMimeSource( - "stat_established.png")); + statLabel->setPixmap(QPixmap( + ":/icons/images/stat_established.png")); } else { - statLabel->setPixmap(qPixmapFromMimeSource( - "stat_established_nomedia.png")); + statLabel->setPixmap(QPixmap( + ":/icons/images/stat_established_nomedia.png")); } statLabel->show(); break; @@ -950,8 +955,8 @@ void MphoneForm::updateRegStatus() statRegLabel->setPixmap(QPixmap(":/icons/images/reg_failed.png")); } else if (num_registered > 0) { // Some users are registered - statRegLabel->setPixmap(qPixmapFromMimeSource( - "twinkle16.png")); + statRegLabel->setPixmap(QPixmap( + ":/icons/images/twinkle16.png")); } else if (num_failed > 0) { // Some users failed, none are registered statRegLabel->setPixmap(QPixmap(":/icons/images/reg_failed.png")); @@ -1023,12 +1028,12 @@ void MphoneForm::flashMWI() { if (mwiFlashStatus) { mwiFlashStatus = false; - statMWILabel->setPixmap(qPixmapFromMimeSource( - "mwi_none16.png")); + statMWILabel->setPixmap(QPixmap( + ":/icons/images/mwi_none16.png")); } else { mwiFlashStatus = true; - statMWILabel->setPixmap(qPixmapFromMimeSource( - "mwi_new16.png")); + statMWILabel->setPixmap(QPixmap( + ":/icons/images/mwi_new16.png")); } } @@ -1092,24 +1097,24 @@ void MphoneForm::updateMwi() // Set MWI icon if (mwi_new_msgs) { - statMWILabel->setPixmap(qPixmapFromMimeSource( - "mwi_new16.png")); + statMWILabel->setPixmap(QPixmap( + ":/icons/images/mwi_new16.png")); mwiFlashStatus = true; // Start the flash MWI timer to flash the indicator tmrFlashMWI.start(1000); } else if (mwi_failure) { tmrFlashMWI.stop(); - statMWILabel->setPixmap(qPixmapFromMimeSource( - "mwi_failure16.png")); + statMWILabel->setPixmap(QPixmap( + ":/icons/images/mwi_failure16.png")); } else if (mwi_known) { tmrFlashMWI.stop(); - statMWILabel->setPixmap(qPixmapFromMimeSource( - "mwi_none16.png")); + statMWILabel->setPixmap(QPixmap( + ":/icons/images/mwi_none16.png")); } else { tmrFlashMWI.stop(); - statMWILabel->setPixmap(qPixmapFromMimeSource( - "mwi_none16_dis.png")); + statMWILabel->setPixmap(QPixmap( + ":/icons/images/mwi_none16_dis.png")); } // Set tool tip @@ -1198,12 +1203,12 @@ void MphoneForm::updateServicesStatus() statAaLabel->setPixmap(QPixmap(":/icons/images/auto_answer.png")); } else if (num_auto_answer > 0) { // Some users enabled auto answer - statAaLabel->setPixmap(qPixmapFromMimeSource( - "auto_answer.png")); + statAaLabel->setPixmap(QPixmap( + ":/icons/images/auto_answer.png")); } else { // No users enabeld auto answer - statAaLabel->setPixmap(qPixmapFromMimeSource( - "auto_answer-disabled.png")); + statAaLabel->setPixmap(QPixmap( + ":/icons/images/auto_answer-disabled.png")); } // Set tool tip with detailed info for multiple users. @@ -1393,7 +1398,7 @@ void MphoneForm::updateSysTrayStatus() icon_name += "_dis.png"; } - sysTray->setIcon(qPixmapFromMimeSource(icon_name)); + sysTray->setIcon(QPixmap(":/icons/images/" + icon_name)); } // Update menu status based on the number of active users @@ -1428,7 +1433,9 @@ void MphoneForm::updateMenuStatus() this, SLOT(srvAutoAnswer())); } +#ifdef ENABLE_DIAMONDCARD updateDiamondcardMenu(); +#endif } void MphoneForm::updateDiamondcardMenu() diff --git a/src/gui/mphoneform.ui b/src/gui/mphoneform.ui index cdaad13..0034164 100644 --- a/src/gui/mphoneform.ui +++ b/src/gui/mphoneform.ui @@ -1783,7 +1783,7 @@ </actiongroup> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <customwidgets> <customwidget> <class>Q3MainWindow</class> diff --git a/src/gui/redirectform.ui b/src/gui/redirectform.ui index 2f5f619..020d8e7 100644 --- a/src/gui/redirectform.ui +++ b/src/gui/redirectform.ui @@ -216,7 +216,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>contact1LineEdit</tabstop> <tabstop>contact2LineEdit</tabstop> diff --git a/src/gui/selectnicform.ui b/src/gui/selectnicform.ui index d915d44..4da5e07 100644 --- a/src/gui/selectnicform.ui +++ b/src/gui/selectnicform.ui @@ -148,7 +148,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <connections> <connection> <sender>okPushButton</sender> diff --git a/src/gui/selectprofileform.cpp b/src/gui/selectprofileform.cpp index d72ece2..43b6ff8 100644 --- a/src/gui/selectprofileform.cpp +++ b/src/gui/selectprofileform.cpp @@ -71,6 +71,10 @@ void SelectProfileForm::languageChange() void SelectProfileForm::init() { user_config = 0; + +#ifndef ENABLE_DIAMONDCARD + diamondcardPushButton->hide(); +#endif } void SelectProfileForm::destroy() diff --git a/src/gui/selectprofileform.ui b/src/gui/selectprofileform.ui index 71c0da6..1b3df44 100644 --- a/src/gui/selectprofileform.ui +++ b/src/gui/selectprofileform.ui @@ -239,7 +239,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>profileListView</tabstop> <tabstop>newPushButton</tabstop> diff --git a/src/gui/selectuserform.ui b/src/gui/selectuserform.ui index 21a76e7..87d723e 100644 --- a/src/gui/selectuserform.ui +++ b/src/gui/selectuserform.ui @@ -125,7 +125,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>userListView</tabstop> <tabstop>selectPushButton</tabstop> diff --git a/src/gui/sendfileform.ui b/src/gui/sendfileform.ui index 8ba2cce..e835631 100644 --- a/src/gui/sendfileform.ui +++ b/src/gui/sendfileform.ui @@ -144,7 +144,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>subjectLineEdit</tabstop> <tabstop>fileLineEdit</tabstop> diff --git a/src/gui/srvredirectform.ui b/src/gui/srvredirectform.ui index 07efe07..be9b4a4 100644 --- a/src/gui/srvredirectform.ui +++ b/src/gui/srvredirectform.ui @@ -597,7 +597,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>cfTabWidget</tabstop> <tabstop>cfAlwaysCheckBox</tabstop> diff --git a/src/gui/syssettingsform.ui b/src/gui/syssettingsform.ui index 2af1e4d..ffc1974 100644 --- a/src/gui/syssettingsform.ui +++ b/src/gui/syssettingsform.ui @@ -1438,7 +1438,7 @@ Depending on your SIP provider the network might provide ring back tone or an an </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>categoryListBox</tabstop> <tabstop>guiUseSystrayCheckBox</tabstop> diff --git a/src/gui/termcapform.ui b/src/gui/termcapform.ui index adaf134..02a38d2 100644 --- a/src/gui/termcapform.ui +++ b/src/gui/termcapform.ui @@ -161,7 +161,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>partyLineEdit</tabstop> <tabstop>addressToolButton</tabstop> diff --git a/src/gui/transferform.ui b/src/gui/transferform.ui index 04b02ba..7674837 100644 --- a/src/gui/transferform.ui +++ b/src/gui/transferform.ui @@ -178,7 +178,7 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <includes> <include location="local">qstring.h</include> <include location="local">sockets/url.h</include> diff --git a/src/gui/userprofileform.ui b/src/gui/userprofileform.ui index 5e28b38..3226ef9 100644 --- a/src/gui/userprofileform.ui +++ b/src/gui/userprofileform.ui @@ -4712,7 +4712,7 @@ Sollicited message waiting indication as specified by RFC 3842. </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>displayLineEdit</tabstop> <tabstop>usernameLineEdit</tabstop> diff --git a/src/gui/wizardform.ui b/src/gui/wizardform.ui index 44d7b5c..ed48358 100644 --- a/src/gui/wizardform.ui +++ b/src/gui/wizardform.ui @@ -273,7 +273,7 @@ This field is mandatory.</string> </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <pixmapfunction></pixmapfunction> <tabstops> <tabstop>serviceProviderComboBox</tabstop> <tabstop>displayLineEdit</tabstop> diff --git a/twinkle_config.h.in b/twinkle_config.h.in index 3daa7ae..f578b9c 100644 --- a/twinkle_config.h.in +++ b/twinkle_config.h.in @@ -1,10 +1,11 @@ -#cmakedefine WITH_SPEEX -#cmakedefine WITH_ILBC -#cmakedefine WITH_ZRTP +#cmakedefine HAVE_SPEEX +#cmakedefine HAVE_ILBC +#cmakedefine HAVE_ZRTP #cmakedefine HAVE_UNISTD_H #cmakedefine HAVE_LINUX_TYPES_H #cmakedefine HAVE_LINUX_ERRQUEUE_H +#cmakedefine HAVE_LIBASOUND #define VERSION "${PRODUCT_VERSION}" #define VERSION_DATE "${PRODUCT_DATE}" |