From 47f6eeb8c562e1ccca4c6a1c973564246bc31027 Mon Sep 17 00:00:00 2001 From: Ron Pedde Date: Sun, 26 Feb 2006 08:48:23 +0000 Subject: [PATCH] more adds from win32-branch --- win32/config.h | 151 ++++++++++++++ win32/messages.mc | 28 +++ win32/mt-daapd.rc | 101 +++++++++ win32/mt-daapd.vcproj | 71 ++++++- win32/nsi/mt-daapd-example.conf | 307 ++++++++++++++++++++++++++++ win32/nsi/mt-daapd.nsi | 190 +++++++++++++++++ win32/nsi/servicelib.nsh | 348 ++++++++++++++++++++++++++++++++ win32/resource.h | 27 +++ 8 files changed, 1217 insertions(+), 6 deletions(-) create mode 100644 win32/config.h create mode 100644 win32/messages.mc create mode 100644 win32/mt-daapd.rc create mode 100644 win32/nsi/mt-daapd-example.conf create mode 100644 win32/nsi/mt-daapd.nsi create mode 100644 win32/nsi/servicelib.nsh create mode 100644 win32/resource.h diff --git a/win32/config.h b/win32/config.h new file mode 100644 index 00000000..4d227660 --- /dev/null +++ b/win32/config.h @@ -0,0 +1,151 @@ +/* config.h. Generated by configure. */ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define to 1 if you have the `atoll' function. */ +#define HAVE_ATOLL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_FLAC_METADATA_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_GETOPT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ID3TAG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `FLAC' library (-lFLAC). */ +/* #undef HAVE_LIBFLAC */ + +/* Define to 1 if you have the `id3tag' library (-lid3tag). */ +#define HAVE_LIBID3TAG 1 + +/* Define to 1 if you have the `ogg' library (-logg). */ +/* #undef HAVE_LIBOGG */ + +/* Define to 1 if you have the `sqlite' library (-lsqlite). */ +#define HAVE_LIBSQLITE 1 + +/* Define to 1 if you have the `sqlite3' library (-lsqlite3). */ +/* #define HAVE_LIBSQLITE3 1 */ + +/* Define to 1 if you have the `vorbis' library (-lvorbis). */ +/* #undef HAVE_LIBVORBIS */ + +/* Define to 1 if you have the `vorbisfile' library (-lvorbisfile). */ +/* #undef HAVE_LIBVORBISFILE */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OGG_OGG_H */ + +/* Define to 1 if you have the `select' function. */ +#define HAVE_SELECT 1 + +/* Define to 1 if you have the `socket' function. */ +#define HAVE_SOCKET 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SQLITE3_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SQLITE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasestr' function. */ +/* #define HAVE_STRCASESTR 1 */ + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strsep' function. */ +#define HAVE_STRSEP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYSLOG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_FILIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_TIME_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have that is POSIX.1 compatible. */ +/* #define HAVE_SYS_WAIT_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_TAGLIB_TAG_C_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_TERMIO_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_UNISTD_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_VORBIS_CODEC_H */ + +/* Name of package */ +#define PACKAGE "mt-daapd" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "" + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE void + +/* Define to 1 if the `setpgrp' function takes no argument. */ +/* #undef SETPGRP_VOID */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Version number of package */ +#define VERSION "cvs-win32-afu" + +#include "win32.h" diff --git a/win32/messages.mc b/win32/messages.mc new file mode 100644 index 00000000..3ef6e7e0 --- /dev/null +++ b/win32/messages.mc @@ -0,0 +1,28 @@ +;#ifndef __MESSAGES_H__ +;#define __MESSAGES_H__ +; +; +; // Eventlog messages? What's this rubbish? I'll just make a +; // single message so I can reduce the eventlog api to syslog(3). +; // Perhaps this isn't as win32ish as it could be. :) +; + +LanguageNames = + ( + English = 0x0409:Messages_ENU + ) + + +;//////////////////////////////////////// +;// Events +;// + +MessageId = +1 +SymbolicName = EVENT_MSG +Language = English +%1 +. + +; +;#endif //__MESSAGES_H__ +; \ No newline at end of file diff --git a/win32/mt-daapd.rc b/win32/mt-daapd.rc new file mode 100644 index 00000000..9c088adb --- /dev/null +++ b/win32/mt-daapd.rc @@ -0,0 +1,101 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#include ""res/Messages.rc""\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,3,0,0 + PRODUCTVERSION 0,3,0,0 + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "http://www.mt-daapd.org" + VALUE "CompanyName", "Ron Pedde" + VALUE "FileDescription", "Multi-Threaded DAAP Server" + VALUE "FileVersion", "0, 3, 0, 0" + VALUE "InternalName", "mt-daapd" + VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" + VALUE "OriginalFilename", "mt-daapd.exe" + VALUE "ProductName", "mt-daapd" + VALUE "ProductVersion", "0, 3, 0, 0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#include "res/Messages.rc" +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/win32/mt-daapd.vcproj b/win32/mt-daapd.vcproj index e5f5b30c..7a026a45 100644 --- a/win32/mt-daapd.vcproj +++ b/win32/mt-daapd.vcproj @@ -36,6 +36,7 @@ AdditionalDependencies="zlib.lib libid3tag.lib gnu_regex.lib pthreadVC2.lib wsock32.lib sqlite3.lib sqlite.lib dnssd.lib" OutputFile="$(OutDir)/mt-daapd.exe" LinkIncremental="2" + AdditionalLibraryDirectories="" IgnoreDefaultLibraryNames="LIBC" GenerateDebugInformation="TRUE" ProgramDatabaseFile="$(OutDir)/mt-daapd.pdb" @@ -50,7 +51,8 @@ + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="C:\working\projects\win32\include"/> + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="C:\working\projects\win32\include"/> - - @@ -144,7 +145,7 @@ RelativePath="..\src\err.c"> + RelativePath="..\src\getopt.c"> @@ -206,6 +207,12 @@ + + + + @@ -220,12 +227,24 @@ + + + + + + + + @@ -235,6 +254,12 @@ + + + + @@ -243,7 +268,41 @@ Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> + + + + + + + + + + + + + + + + diff --git a/win32/nsi/mt-daapd-example.conf b/win32/nsi/mt-daapd-example.conf new file mode 100644 index 00000000..662fd84e --- /dev/null +++ b/win32/nsi/mt-daapd-example.conf @@ -0,0 +1,307 @@ +# $Id$ +# +# This is the mt-daapd config file. +# +# If you have problems or questions with the format of this file, +# direct your questions to rpedde@users.sourceforge.net. +# +# You can also check the website at http://mt-daapd.sourceforge.net, +# as there is a growing documentation library there, peer-supported +# forums and possibly more. +# + + +# +# web_root (required) +# +# Location of the admin web pages. +# +# If you installed from .RPM, .deb, or tarball with --prefix=/usr, then +# this is correct. +# +# If you installed from tarball without --prefix=/usr, then the correct +# path is probably /usr/local/share/mt-daapd/admin-root. +# + +web_root admin-root + +# +# port (required) +# +# What port to listen on. It is possible to use a different +# port, but this is the default iTunes port +# + +port 9999 + +# +# admin_pw (required) +# +# This is the password to the administrative pages +# + +admin_pw mt-daapd + + +# +# db_type (required) +# +# This is what kind of backend database to store the song +# info in. Valid choices are "sqlite" and "sqlite3". +# + +db_type sqlite + +# +# db_parms +# +# This is any extra information the db needs to connect. +# in the case of sqlite and sqlite3, this is the name +# of the directory to store the database in +# +# If you installed from RPM or .deb, this path likely already +# exists. If not, then you must create it. The directory itself +# must be writable by the "runas" user. +# + +db_parms . + +# +# mp3_dir (required) +# +# Location of the mp3 files to share. Note that because the +# files are stored in the database by inode, these must be +# in the same physical filesystem. +# + +mp3_dir c:\documents and settings + +# +# servername (required) +# +# This is both the name of the server as advertised +# via rendezvous, and the name of the database +# exported via DAAP. Also know as "What shows up in iTunes". +# + +servername mt-daapd + +# +# runas (required) +# +# This is the user to drop privs to if running as +# root. If mt-daapd is not started as root, this +# configuration option is ignored. Notice that this +# must be specified whether the server is running +# as root or not. +# + +runas nobody + +# +# playlist (optional) +# +# This is the location of a playlist file. +# This is for Apple-style "Smart Playlists" +# See the mt-daapd.playlist file in the +# contrib directory for syntax and examples +# +# This doesn't control static playlists... these +# are controlled with the "process_m3u" directive +# below. +# + +playlist /etc/mt-daapd.playlist + +# +# password (optional) +# +# This is the password required to listen to MP3 files +# i.e. the password that iTunes prompts for +# + +#password mp3 + +# +# extensions (optional) +# +# These are the file extensions that the daap server will +# try to index and serve. By default, it only indexes and +# serves .mp3 files. It can also server .m4a and .m4p files, +# and just about any other files, really. Unfortunately, while +# it can *attempt* to serve other files (.ogg?), iTunes won't +# play them. Perhaps this would be useful on Linux with +# Rhythmbox, once it understands daap. (hurry up!) +# +# Failing that, one can use server-side conversion to transcode +# non-standard (.ogg, .flac) music to wav on the server side. +# See the ssc_* options below. +# + +extensions .mp3,.m4a,.m4p + +# +# ssc_codectypes (optional) +# +# List of codectypes for files that the daap server should +# perform internal format conversion and present to clients +# as WAV files. The file extensions that these codectypes correspond +# to must also be present in 'extensions' +# configuration value, or files are not probed in the first +# place. +# +# Valid codectypes: +# +# mp4a - for AAC (.aac, .mp4, .m4a, .m4p) +# mpeg - for mp3 +# wav - for wav +# wma - for wma +# ogg - for ogg +# flac - for flac (.flac, .fla) +# mpc for musepack (.mpc, .mpp, .mp+) +# alac for alac (.m4a) +# + +#ssc_codectypes ogg,flac,alac + +# +# ssc_prog (optional) +# +# Program that is used in server side format conversion. +# Program must accept following command line syntax: +# ssc_prog filename offset length ... +# Parameter filename is the real name of the file that is +# to be converted and streamed, offset is number of bytes +# that are skipped from the beginning of the _output_ file +# before streaming is started, length is length of the song +# in seconds (or zero). All other possible arguments must +# be ignored. The resulting wav file (or the rest of +# the file after initial seek) is written to the standard +# output by the ssc_prog program. This is typically +# a script that is a front end for different conversion tools +# handling different formats. +# + +#ssc_prog /etc/mt-daapd-ssc-script + +# +# logfile (optional) +# +# This is the file to log to. If this is not configured, +# then it will log to the syslog. +# +# Not that the -d switch will control the log verbosity. +# By default, it runs at log level 1. Log level 9 will churn +# out scads of useless debugging information. Values in between +# will vary the amount of logging you get. +# + +#logfile /var/log/mt-daapd.log + +# +# art_filename (optional) +# +# There is experimental support thanks to Hiren Joshi +# (hirenj@mooh.org) for dynamically adding art to the id3v2 +# header as it is streamed (!!). If you were using a music system +# like zina or andromeda, for example, with cover art called +# "_folderOpenImage.jpg", you could use the parameter +# art_file _folderOpenImage.jpg and if the file _folderOpenImage.jpg +# was located in the same folder as the .mp3 file, it would appear +# in iTunes. Cool, eh? +# + +#art_filename _folderOpenImage.jpg + +# +# rescan_interval +# +# How often to check the file system to see if any mp3 files +# have been added or removed. +# +# if not specified, the default is 0, which disables background scanning. +# +# If background rescanning is disabled, a scan can still be forced from the +# "status" page of the administrative web interface +# +# Setting a rescan_interval lower than the time it takes to rescan +# won't hurt anything, it will just waste CPU, and make connect times +# to the daap server longer. +# +# + +#rescan_interval 300 + +# always_scan +# +# The default behavior is not not do background rescans of the +# filesystem unless there are clients connected. The thought is to +# allow the drives to spin down unless they are in use. This might be +# of more importance in IDE drives that aren't designed to be run +# 24x7. Forcing a scan through the web interface will always work +# though, even if no users are connected. + +# always_scan 0 + +# +# process_m3u +# +# By default m3u processing is turned off, since most m3u files +# sitting around in peoples mp3 directories have bad paths, and +# I hear about it. :) +# +# If you are sure your m3u files have good paths (i.e. unixly pathed, +# with relative paths relative to the directory the m3u is in), then +# you can turn on m3u processing by setting this directive to 1. +# +# I'm not sure "unixly" is a word, but you get the idea. +# + +# process_m3u 0 + +# +# scan_type +# +# +# This sets how aggressively mp3 files should be scanned to determine +# file length. There are three values: +# +# 0 (Normal) +# Just scan the first mp3 frame to try and calculate size. This will +# be accurate for most files, but VBR files without an Xing tag will +# probably have wildly inaccurate file times. This is the default. +# +# 1 (Aggressive) +# This checks the bitrates of 10 frames in the middle of the song. +# This will still be inaccurate for VBR files without an Xing tag, +# but they probably won't be quite as inaccurate as 0. This takes +# more time, obviously, although the time hit will only happen the +# first time you scan a particular file. +# +# 2 (Painfully aggressive) +# This walks through the entire song, counting the number of frames. +# This should result in accurate song times, but will take the most +# time. Again, this will only have to be incurred the first time +# the file is indexed. +# + +scan_type 2 + +# +# compress +# +# Whether to use gzip content-encoding when transferring playlists etc. +# This was contributed as a patch by Ciamac Moallemi just prior to the 0.2.1 +# release, and as such, hasn't gotten as much testing as other features. +# +# This feature should substantially speed up transfers of large databases +# and playlists. +# +# It will eventually default to 1, but currently it defaults to 0. +# + +# compress 0 + + + + diff --git a/win32/nsi/mt-daapd.nsi b/win32/nsi/mt-daapd.nsi new file mode 100644 index 00000000..68f5c97d --- /dev/null +++ b/win32/nsi/mt-daapd.nsi @@ -0,0 +1,190 @@ +; $Id$ +; Script generated by the HM NIS Edit Script Wizard. + +; HM NIS Edit Wizard helper defines +!define PRODUCT_NAME "mt-daapd" +!define PRODUCT_SERVICE "Multi-Threaded DAAP Daemon" +!define /date DATEVER "%Y%m%d" +!define PRODUCT_VERSION "cvs-${DATEVER}" +!define PRODUCT_PUBLISHER "Ron Pedde" +!define PRODUCT_WEB_SITE "http://www.mt-daapd.org" +!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\mt-daapd.exe" +!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" +!define PRODUCT_UNINST_ROOT_KEY "HKLM" + +; MUI 1.67 compatible ------ +!include "MUI.nsh" +!include "servicelib.nsh" + +; MUI Settings +!define MUI_ABORTWARNING +!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" +!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" + +; Welcome page +!insertmacro MUI_PAGE_WELCOME +; License page +!insertmacro MUI_PAGE_LICENSE "..\..\admin-root\gpl-license.txt" +; Directory page +!insertmacro MUI_PAGE_DIRECTORY +; Instfiles page +!insertmacro MUI_PAGE_INSTFILES +; Finish page +!insertmacro MUI_PAGE_FINISH + +; Uninstaller pages +!insertmacro MUI_UNPAGE_INSTFILES + +; Language files +!insertmacro MUI_LANGUAGE "English" + +; MUI end ------ + +Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" +OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}.exe" +InstallDir "$PROGRAMFILES\mt-daapd" +InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" +ShowInstDetails show +ShowUnInstDetails show + +Section "MainSection" SEC01 + SetOutPath "$INSTDIR" + SetOverwrite ifnewer + File "..\Release\mt-daapd.exe" + File "..\..\..\win32\dll\gnu_regex.dll" + File "..\..\..\win32\dll\pthreadVC2.dll" + File "..\..\..\win32\dll\sqlite.dll" + File "..\..\..\win32\dll\zlib.dll" + + SetOutPath "$INSTDIR\admin-root" + File "..\..\admin-root\thanks.html" + File "..\..\admin-root\status.html" + File "..\..\admin-root\smartpopup.html" + File "..\..\admin-root\smart.js" + File "..\..\admin-root\smart.html" + File "..\..\admin-root\required.gif" + File "..\..\admin-root\playlist.js" + File "..\..\admin-root\playlist.html" + File "..\..\admin-root\mt-daapd.png" + File "..\..\admin-root\mt-daapd.js" + File "..\..\admin-root\mt-daapd.css" + File "..\..\admin-root\linkTransparent.gif" + File "..\..\admin-root\linkOpaque.gif" + File "..\..\admin-root\index.html" + File "..\..\admin-root\hdr.html" + File "..\..\admin-root\gpl-license.txt" + File "..\..\admin-root\gpl-license.html" + File "..\..\admin-root\ftr.html" + File "..\..\admin-root\feedback.html" + File "..\..\admin-root\favicon.ico" + File "..\..\admin-root\DAAPApplet-0.1.jar" + File "..\..\admin-root\CREDITS" + File "..\..\admin-root\config-update.html" + File "..\..\admin-root\config.html" + File "..\..\admin-root\aspl-license.txt" + File "..\..\admin-root\aspl-license.html" + File "..\..\admin-root\applet.html" + SetOutPath "$INSTDIR" + File "mt-daapd-example.conf" + SetOverwrite off + CopyFiles "$INSTDIR\mt-daapd-example.conf" "$INSTDIR\mt-daapd.conf" +SectionEnd + +Section -AdditionalIcons + WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" + CreateDirectory "$SMPROGRAMS\mt-daapd" + CreateShortCut "$SMPROGRAMS\mt-daapd\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" + CreateShortCut "$SMPROGRAMS\mt-daapd\Uninstall.lnk" "$INSTDIR\uninst.exe" + CreateShortCut "$SMPROGRAMS\mt-daapd\Debug Mode.lnk" "$INSTDIR\mt-daapd.exe" "-d9 -f" + CreateShortCut "$SMPROGRAMS\mt-daapd\Config File.lnk" "notepad.exe" "$INSTDIR\mt-daapd.conf" +SectionEnd + +Section -Post + WriteUninstaller "$INSTDIR\uninst.exe" + WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\mt-daapd.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\mt-daapd.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" + ExecWait "$INSTDIR\mt-daapd.exe -i" +; !insertmacro SERVICE "create" "${PRODUCT_SERVICE}" "path=$INSTDIR\mt-daapd.exe;autostart=1;interact=0;shortname=mt-daapd;" +SectionEnd + + +Function un.onUninstSuccess + HideWindow + MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer." +FunctionEnd + +Function un.onInit + MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name) and all of its components?" IDYES +2 + Abort +FunctionEnd + +Section Uninstall +; !undef UN +; !define UN "un." +; !insertmacro SERVICE "running" "${PRODUCT_SERVICE}" "" +; IntCmp $0 0 lbl_check_install +; !insertmacro SERVICE "stop" "${PRODUCT_SERVICE}" "" + +; lbl_check_install: +; !insertmacro SERVICE "installed" "${PRODUCT_SERVICE}" "" +; IntCmp $0 0 lbl_svc_done +; !insertmacro SERVICE "uninstall" "${PRODUCT_SERVICE}" "" + +; lbl_svc_done: + + ExecWait "net stop mt-daapd" + ExecWait "$INSTDIR\mt-daapd.exe -u" + Delete "$INSTDIR\${PRODUCT_NAME}.url" + Delete "$INSTDIR\uninst.exe" + Delete "$INSTDIR\gnu_regex.dll" + Delete "$INSTDIR\pthreadVC2.dll" + Delete "$INSTDIR\sqlite.dll" + Delete "$INSTDIR\zlib.dll" + Delete "$INSTDIR\mt-daapd-example.conf" + Delete "$INSTDIR/admin-root\applet.html" + Delete "$INSTDIR/admin-root\aspl-license.html" + Delete "$INSTDIR/admin-root\aspl-license.txt" + Delete "$INSTDIR/admin-root\config.html" + Delete "$INSTDIR/admin-root\config-update.html" + Delete "$INSTDIR/admin-root\CREDITS" + Delete "$INSTDIR/admin-root\DAAPApplet-0.1.jar" + Delete "$INSTDIR/admin-root\favicon.ico" + Delete "$INSTDIR/admin-root\feedback.html" + Delete "$INSTDIR/admin-root\ftr.html" + Delete "$INSTDIR/admin-root\gpl-license.html" + Delete "$INSTDIR/admin-root\gpl-license.txt" + Delete "$INSTDIR/admin-root\hdr.html" + Delete "$INSTDIR/admin-root\index.html" + Delete "$INSTDIR/admin-root\linkOpaque.gif" + Delete "$INSTDIR/admin-root\linkTransparent.gif" + Delete "$INSTDIR/admin-root\mt-daapd.css" + Delete "$INSTDIR/admin-root\mt-daapd.js" + Delete "$INSTDIR/admin-root\mt-daapd.png" + Delete "$INSTDIR/admin-root\playlist.html" + Delete "$INSTDIR/admin-root\playlist.js" + Delete "$INSTDIR/admin-root\required.gif" + Delete "$INSTDIR/admin-root\smart.html" + Delete "$INSTDIR/admin-root\smart.js" + Delete "$INSTDIR/admin-root\smartpopup.html" + Delete "$INSTDIR/admin-root\status.html" + Delete "$INSTDIR/admin-root\thanks.html" + Delete "$INSTDIR\mt-daapd.exe" + + Delete "$SMPROGRAMS\mt-daapd\Uninstall.lnk" + Delete "$SMPROGRAMS\mt-daapd\Website.lnk" + Delete "$SMPROGRAMS\mt-daapd\Config File.lnk" + Delete "$SMPROGRAMS\mt-daapd\Debug Mode.lnk" + + RMDir "$SMPROGRAMS\mt-daapd" + RMDir "$INSTDIR/admin-root" + RMDir "$INSTDIR" + + DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" + DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" + SetAutoClose true +SectionEnd \ No newline at end of file diff --git a/win32/nsi/servicelib.nsh b/win32/nsi/servicelib.nsh new file mode 100644 index 00000000..96d94102 --- /dev/null +++ b/win32/nsi/servicelib.nsh @@ -0,0 +1,348 @@ +; NSIS SERVICE LIBRARY - servicelib.nsh +; Version 1.3 - January 5th, 2006 +; Questions/Comments - dselkirk@hotmail.com +; +; Description: +; Provides an interface to window services +; +; Inputs: +; action - systemlib action ie. create, delete, start, stop, pause, +; continue, installed, running, status +; name - name of service to manipulate +; param - action parameters; usage: var1=value1;var2=value2;...etc. +; (don't forget to add a ';' after the last value!) +; +; Actions: +; create - creates a new windows service +; Parameters: +; path - path to service executable +; autostart - automatically start with system ie. 1|0 +; interact - interact with the desktop ie. 1|0 +; machine - machine name where to install service +; user - user that runs the service +; password - password of the above user +; +; delete - deletes a windows service +; start - start a stopped windows service +; stop - stops a running windows service +; pause - pauses a running windows service +; continue - continues a paused windows service +; installed - is the provided service installed +; Parameters: +; action - if true then invokes the specified action +; running - is the provided service running +; Parameters: +; action - if true then invokes the specified action +; status - check the status of the provided service +; +; If run from uninstall define "UN" as "un." gefore running. +; +; Usage: +; Method 1: +; Push "action" +; Push "name" +; Push "param" +; Call Service +; Pop $0 ;response +; +; Method 2: +; !insertmacro SERVICE "action" "name" "param" +; +; History: +; 1.0 - 09/15/2003 - Initial release +; 1.1 - 09/16/2003 - Changed &l to i, thx brainsucker +; 1.2 - 02/29/2004 - Fixed documentation. + +!ifndef SERVICELIB + !define SERVICELIB + + !define SC_MANAGER_ALL_ACCESS 0x3F + !define SERVICE_ALL_ACCESS 0xF01FF + + !define SERVICE_CONTROL_STOP 1 + !define SERVICE_CONTROL_PAUSE 2 + !define SERVICE_CONTROL_CONTINUE 3 + + !define SERVICE_STOPPED 0x1 + !define SERVICE_START_PENDING 0x2 + !define SERVICE_STOP_PENDING 0x3 + !define SERVICE_RUNNING 0x4 + !define SERVICE_CONTINUE_PENDING 0x5 + !define SERVICE_PAUSE_PENDING 0x6 + !define SERVICE_PAUSED 0x7 + + !ifndef UN + !define UN "" + !endif + + !macro SERVICE ACTION NAME PARAM + Push '${ACTION}' + Push '${NAME}' + Push '${PARAM}' + Call ${UN}Service + !macroend + + !macro FUNC_GETPARAM + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Exch 8 + Pop $1 ;name + Exch 8 + Pop $2 ;source + StrCpy $0 "" + StrLen $7 $2 + StrCpy $3 0 + lbl_loop: + IntCmp $3 $7 0 0 lbl_done + StrLen $4 "$1=" + StrCpy $5 $2 $4 $3 + StrCmp $5 "$1=" 0 lbl_next + IntOp $5 $3 + $4 + StrCpy $3 $5 + lbl_loop2: + IntCmp $3 $7 0 0 lbl_done + StrCpy $6 $2 1 $3 + StrCmp $6 ";" 0 lbl_next2 + IntOp $6 $3 - $5 + StrCpy $0 $2 $6 $5 + Goto lbl_done + lbl_next2: + IntOp $3 $3 + 1 + Goto lbl_loop2 + lbl_next: + IntOp $3 $3 + 1 + Goto lbl_loop + lbl_done: + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch 2 + Pop $6 + Pop $7 + Exch $0 + !macroend + + !macro CALL_GETPARAM VAR NAME DEFAULT LABEL + Push $1 + Push ${NAME} + Call ${UN}GETPARAM + Pop $6 + StrCpy ${VAR} "${DEFAULT}" + StrCmp $6 "" "${LABEL}" 0 + StrCpy ${VAR} $6 + !macroend + + !macro FUNC_SERVICE UN + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Exch 8 + Pop $1 ;param + Exch 8 + Pop $2 ;name + Exch 8 + Pop $3 ;action + ;$0 return + ;$4 OpenSCManager + ;$5 OpenService + + + StrCpy $0 "false" + System::Call 'advapi32::OpenSCManagerA(n, n, i ${SC_MANAGER_ALL_ACCESS}) i.r4' + IntCmp $4 0 lbl_done + StrCmp $3 "create" lbl_create + System::Call 'advapi32::OpenServiceA(i r4, t r2, i ${SERVICE_ALL_ACCESS}) i.r5' + IntCmp $5 0 lbl_done + + lbl_select: + StrCmp $3 "delete" lbl_delete + StrCmp $3 "start" lbl_start + StrCmp $3 "stop" lbl_stop + StrCmp $3 "pause" lbl_pause + StrCmp $3 "continue" lbl_continue + StrCmp $3 "installed" lbl_installed + StrCmp $3 "running" lbl_running + StrCmp $3 "status" lbl_status + Goto lbl_done + + ; create service + lbl_create: + Push $R1 ;machine + Push $R2 ;user + Push $R3 ;password + Push $R4 ;interact + Push $R5 ;autostart + Push $R6 ;path + Push $R7 ;shortname + + !insertmacro CALL_GETPARAM $R1 "machine" "n" "lbl_machine" + lbl_machine: + + !insertmacro CALL_GETPARAM $R2 "user" "n" "lbl_user" + lbl_user: + + !insertmacro CALL_GETPARAM $R3 "password" "n" "lbl_password" + lbl_password: + + !insertmacro CALL_GETPARAM $R4 "interact" "0x10" "lbl_interact" + StrCpy $6 0x10 + IntCmp $R4 0 +2 + IntOp $6 $6 | 0x100 + StrCpy $R4 $6 + lbl_interact: + + !insertmacro CALL_GETPARAM $R5 "autostart" "0x3" "lbl_autostart" + StrCpy $6 0x3 + IntCmp $R5 0 +2 + StrCpy $6 0x2 + StrCpy $R5 $6 + lbl_autostart: + + !insertmacro CALL_GETPARAM $R6 "path" "n" "lbl_path" + lbl_path: + + !insertmacro CALL_GETPARAM $R7 "shortname" r2 "lbl_shortname" + lbl_shortname: + + System::Call 'advapi32::CreateServiceA(i r4, t r7, t r2, i ${SERVICE_ALL_ACCESS}, \ + i R4, i R5, i 0, t R6, n, n, R1, R2, R3) i.r6' + Pop $R7 + Pop $R6 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + StrCmp $6 0 lbl_done lbl_good + + ; delete service + lbl_delete: + System::Call 'advapi32::DeleteService(i r5) i.r6' + StrCmp $6 0 lbl_done lbl_good + + ; start service + lbl_start: + System::Call 'advapi32::StartServiceA(i r5, i 0, i 0) i.r6' + StrCmp $6 0 lbl_done lbl_good + + ; stop service + lbl_stop: + Push $R1 + System::Call '*(i,i,i,i,i,i,i) i.R1' + System::Call 'advapi32::ControlService(i r5, i ${SERVICE_CONTROL_STOP}, i $R1) i' + System::Free $R1 + Pop $R1 + StrCmp $6 0 lbl_done lbl_good + + ; pause service + lbl_pause: + Push $R1 + System::Call '*(i,i,i,i,i,i,i) i.R1' + System::Call 'advapi32::ControlService(i r5, i ${SERVICE_CONTROL_PAUSE}, i $R1) i' + System::Free $R1 + Pop $R1 + StrCmp $6 0 lbl_done lbl_good + + ; continue service + lbl_continue: + Push $R1 + System::Call '*(i,i,i,i,i,i,i) i.R1' + System::Call 'advapi32::ControlService(i r5, i ${SERVICE_CONTROL_CONTINUE}, i $R1) i' + System::Free $R1 + Pop $R1 + StrCmp $6 0 lbl_done lbl_good + + ; is installed + lbl_installed: + !insertmacro CALL_GETPARAM $7 "action" "" "lbl_good" + StrCpy $3 $7 + Goto lbl_select + + ; is service running + lbl_running: + Push $R1 + System::Call '*(i,i,i,i,i,i,i) i.R1' + System::Call 'advapi32::QueryServiceStatus(i r5, i $R1) i' + System::Call '*$R1(i, i.r6)' + System::Free $R1 + Pop $R1 + IntFmt $6 "0x%X" $6 + StrCmp $6 ${SERVICE_RUNNING} 0 lbl_done + !insertmacro CALL_GETPARAM $7 "action" "" "lbl_good" + StrCpy $3 $7 + Goto lbl_select + + lbl_status: + Push $R1 + System::Call '*(i,i,i,i,i,i,i) i.R1' + System::Call 'advapi32::QueryServiceStatus(i r5, i $R1) i' + System::Call '*$R1(i, i .r6)' + System::Free $R1 + Pop $R1 + IntFmt $6 "0x%X" $6 + StrCpy $0 "running" + IntCmp $6 ${SERVICE_RUNNING} lbl_done + StrCpy $0 "stopped" + IntCmp $6 ${SERVICE_STOPPED} lbl_done + StrCpy $0 "start_pending" + IntCmp $6 ${SERVICE_START_PENDING} lbl_done + StrCpy $0 "stop_pending" + IntCmp $6 ${SERVICE_STOP_PENDING} lbl_done + StrCpy $0 "running" + IntCmp $6 ${SERVICE_RUNNING} lbl_done + StrCpy $0 "continue_pending" + IntCmp $6 ${SERVICE_CONTINUE_PENDING} lbl_done + StrCpy $0 "pause_pending" + IntCmp $6 ${SERVICE_PAUSE_PENDING} lbl_done + StrCpy $0 "paused" + IntCmp $6 ${SERVICE_PAUSED} lbl_done + StrCpy $0 "unknown" + + lbl_good: + StrCpy $0 "true" + lbl_done: + IntCmp $5 0 +2 + System::Call 'advapi32::CloseServiceHandle(i r5) n' + IntCmp $4 0 +2 + System::Call 'advapi32::CloseServiceHandle(i r4) n' + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch 3 + Pop $5 + Pop $7 + Pop $6 + Exch $0 + !macroend + + Function Service + !insertmacro FUNC_SERVICE "" + FunctionEnd + + Function un.Service + !insertmacro FUNC_SERVICE "un." + FunctionEnd + + Function GetParam + !insertmacro FUNC_GETPARAM + FunctionEnd + + Function un.GetParam + !insertmacro FUNC_GETPARAM + FunctionEnd + +!endif \ No newline at end of file diff --git a/win32/resource.h b/win32/resource.h new file mode 100644 index 00000000..f1f455ae --- /dev/null +++ b/win32/resource.h @@ -0,0 +1,27 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by mt-daapd.rc +// +#define IDS_PROJNAME 100 +#define IDR_WMDMLOGGER 101 +#define IDS_LOG_SEV_INFO 201 +#define IDS_LOG_SEV_WARN 202 +#define IDS_LOG_SEV_ERROR 203 +#define IDS_LOG_DATETIME 204 +#define IDS_LOG_SRCNAME 205 +#define IDS_DEF_LOGFILE 301 +#define IDS_DEF_MAXSIZE 302 +#define IDS_DEF_SHRINKTOSIZE 303 +#define IDS_DEF_LOGENABLED 304 +#define IDS_MUTEX_TIMEOUT 401 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 201 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif