From 180cc2eb5aed3325ed98fc8ebfb3befbf8fefe14 Mon Sep 17 00:00:00 2001 From: Julien BLACHE Date: Wed, 1 Apr 2009 14:48:27 +0200 Subject: [PATCH] Get rid of win32 code --- src/Makefile.am | 3 +- src/os-win32.c | 581 --------------- src/os-win32.h | 65 -- src/os.h | 6 +- src/plugins/ssc-wma.cpp | 354 ---------- src/plugins/w32-event.c | 74 -- src/rend-win32.c | 234 ------- src/w32-eventlog.c | 128 ---- src/w32-eventlog.h | 32 - src/w32-service.c | 292 -------- src/w32-service.h | 32 - src/win32.h | 101 --- win32/FireflyShell/AboutPage.cpp | 146 ---- win32/FireflyShell/AboutPage.h | 75 -- win32/FireflyShell/AdvancedPage.cpp | 159 ----- win32/FireflyShell/AdvancedPage.h | 87 --- win32/FireflyShell/ConfigPage.cpp | 93 --- win32/FireflyShell/ConfigPage.h | 70 -- win32/FireflyShell/DosPath.cpp | 173 ----- win32/FireflyShell/DosPath.h | 51 -- win32/FireflyShell/FireflyShell.DEU.rc | Bin 20912 -> 0 bytes win32/FireflyShell/FireflyShell.cpp | 394 ----------- win32/FireflyShell/FireflyShell.exe.manifest | 15 - win32/FireflyShell/FireflyShell.h | 158 ----- win32/FireflyShell/FireflyShell.rc | 294 -------- win32/FireflyShell/FireflyShell.vcproj | 339 --------- win32/FireflyShell/FireflyShellDEU.vcproj | 204 ------ win32/FireflyShell/FireflyShellFRA.rc | Bin 21468 -> 0 bytes win32/FireflyShell/FireflyShellFRA.vcproj | 204 ------ win32/FireflyShell/FireflyShellITA.rc | Bin 20610 -> 0 bytes win32/FireflyShell/FireflyShellITA.vcproj | 204 ------ win32/FireflyShell/FireflyShellJPN.rc | Bin 20610 -> 0 bytes win32/FireflyShell/FireflyShellJPN.vcproj | 204 ------ win32/FireflyShell/FireflyShellNLD.rc | Bin 20738 -> 0 bytes win32/FireflyShell/FireflyShellNLD.vcproj | 204 ------ win32/FireflyShell/FireflyShellSWE.rc | Bin 20652 -> 0 bytes win32/FireflyShell/FireflyShellSWE.vcproj | 204 ------ win32/FireflyShell/IniFile.h | 68 -- win32/FireflyShell/LogPage.cpp | 109 --- win32/FireflyShell/LogPage.h | 46 -- win32/FireflyShell/MainDlg.cpp | 121 ---- win32/FireflyShell/MainDlg.h | 56 -- win32/FireflyShell/NotifyIcon.cpp | 296 -------- win32/FireflyShell/NotifyIcon.h | 96 --- win32/FireflyShell/README.txt | 17 - win32/FireflyShell/ServerEvents.cpp | 142 ---- win32/FireflyShell/ServerEvents.h | 55 -- win32/FireflyShell/ServiceControl.cpp | 250 ------- win32/FireflyShell/ServiceControl.h | 174 ----- win32/FireflyShell/VersionInfo.cpp | 111 --- win32/FireflyShell/VersionInfo.h | 46 -- .../localizations/dutch/dutch.ini | Bin 7192 -> 0 bytes .../localizations/dutch/dutch.lws | Bin 246 -> 0 bytes .../localizations/french/french.ini | Bin 7922 -> 0 bytes .../localizations/french/french.lws | Bin 248 -> 0 bytes .../localizations/german/german.ini | Bin 7366 -> 0 bytes .../localizations/german/german.lws | Bin 250 -> 0 bytes .../localizations/italian/italian.ini | Bin 7570 -> 0 bytes .../localizations/italian/italian.lws | Bin 250 -> 0 bytes .../localizations/japanese/japanese.ini | Bin 5972 -> 0 bytes .../localizations/japanese/japanese.lws | Bin 252 -> 0 bytes .../localizations/swedish/swedish.ini | Bin 7106 -> 0 bytes .../localizations/swedish/swedish.lws | Bin 250 -> 0 bytes win32/FireflyShell/res/FireflyShell.ico | Bin 35670 -> 0 bytes win32/FireflyShell/res/ShellRunning.ico | Bin 35670 -> 0 bytes win32/FireflyShell/res/ShellStopped.ico | Bin 35670 -> 0 bytes win32/FireflyShell/res/logo.bmp | Bin 38678 -> 0 bytes win32/FireflyShell/resource.h | 70 -- win32/FireflyShell/singleton.h | 49 -- win32/FireflyShell/stdafx.cpp | 21 - win32/FireflyShell/stdafx.h | 80 --- win32/FireflyShell/version.h.templ | 13 - win32/FireflyShell/version.rc | 44 -- win32/config.h.templ | 160 ----- win32/ff.ico | Bin 35670 -> 0 bytes win32/messages.mc | 28 - win32/mt-daapd-res.h | 17 - win32/mt-daapd.rc.templ | 110 --- win32/mt-daapd.sln | 97 --- win32/mt-daapd.vcproj | 495 ------------- win32/nsi/AccessControl.dll | Bin 9216 -> 0 bytes win32/nsi/SimpleFC.dll | Bin 168448 -> 0 bytes win32/nsi/firefly.log | 1 - win32/nsi/localizations/Dutch.nsh | 29 - win32/nsi/localizations/English.nsh | 29 - win32/nsi/localizations/French.nsh | 30 - win32/nsi/localizations/German.nsh | 29 - win32/nsi/localizations/Italian.nsh | 30 - win32/nsi/localizations/Japanese.nsh | 29 - win32/nsi/localizations/Swedish.nsh | 29 - win32/nsi/manifest.xml | 12 - win32/nsi/mapping.ini | 3 - win32/nsi/mt-daapd-example.conf | 298 -------- win32/nsi/mt-daapd.nsi.templ | 662 ------------------ win32/nsi/nsSCM.dll | Bin 5632 -> 0 bytes win32/out-daap/out-daap.def | 4 - win32/out-daap/out-daap.rc.templ | 103 --- win32/out-daap/out-daap.vcproj | 243 ------- win32/out-daap/resource.h | 14 - win32/rsp-res.h | 15 - win32/rsp.def | 5 - win32/rsp.rc.templ | 103 --- win32/rsp.vcproj | 239 ------- win32/ssc-ffmpeg-res.h | 14 - win32/ssc-ffmpeg.def | 4 - win32/ssc-ffmpeg.rc.templ | 103 --- win32/ssc-ffmpeg.vcproj | 221 ------ win32/ssc-wma/resource.h | 14 - win32/ssc-wma/ssc-wma.def | 4 - win32/ssc-wma/ssc-wma.rc.templ | 103 --- win32/ssc-wma/ssc-wma.vcproj | 221 ------ win32/svcctrl/resource.h | 23 - win32/svcctrl/small.ico | Bin 23558 -> 0 bytes win32/svcctrl/stdafx.cpp | 8 - win32/svcctrl/stdafx.h | 39 -- win32/svcctrl/svcctrl.cpp | 140 ---- win32/svcctrl/svcctrl.exe.manifest | 10 - win32/svcctrl/svcctrl.h | 3 - win32/svcctrl/svcctrl.ico | Bin 23558 -> 0 bytes win32/svcctrl/svcctrl.rc | 89 --- win32/svcctrl/svcctrl.sln | 20 - win32/svcctrl/svcctrl.vcproj | 249 ------- win32/versionize.bat | 19 - win32/w32-event-res.h | 15 - win32/w32-event.def | 4 - win32/w32-event.rc.templ | 103 --- win32/w32-event.vcproj | 225 ------ 127 files changed, 2 insertions(+), 11487 deletions(-) delete mode 100644 src/os-win32.c delete mode 100644 src/os-win32.h delete mode 100644 src/plugins/ssc-wma.cpp delete mode 100644 src/plugins/w32-event.c delete mode 100644 src/rend-win32.c delete mode 100644 src/w32-eventlog.c delete mode 100644 src/w32-eventlog.h delete mode 100644 src/w32-service.c delete mode 100644 src/w32-service.h delete mode 100644 src/win32.h delete mode 100644 win32/FireflyShell/AboutPage.cpp delete mode 100644 win32/FireflyShell/AboutPage.h delete mode 100644 win32/FireflyShell/AdvancedPage.cpp delete mode 100644 win32/FireflyShell/AdvancedPage.h delete mode 100644 win32/FireflyShell/ConfigPage.cpp delete mode 100644 win32/FireflyShell/ConfigPage.h delete mode 100644 win32/FireflyShell/DosPath.cpp delete mode 100644 win32/FireflyShell/DosPath.h delete mode 100644 win32/FireflyShell/FireflyShell.DEU.rc delete mode 100644 win32/FireflyShell/FireflyShell.cpp delete mode 100644 win32/FireflyShell/FireflyShell.exe.manifest delete mode 100644 win32/FireflyShell/FireflyShell.h delete mode 100644 win32/FireflyShell/FireflyShell.rc delete mode 100644 win32/FireflyShell/FireflyShell.vcproj delete mode 100644 win32/FireflyShell/FireflyShellDEU.vcproj delete mode 100644 win32/FireflyShell/FireflyShellFRA.rc delete mode 100644 win32/FireflyShell/FireflyShellFRA.vcproj delete mode 100644 win32/FireflyShell/FireflyShellITA.rc delete mode 100644 win32/FireflyShell/FireflyShellITA.vcproj delete mode 100644 win32/FireflyShell/FireflyShellJPN.rc delete mode 100644 win32/FireflyShell/FireflyShellJPN.vcproj delete mode 100644 win32/FireflyShell/FireflyShellNLD.rc delete mode 100644 win32/FireflyShell/FireflyShellNLD.vcproj delete mode 100644 win32/FireflyShell/FireflyShellSWE.rc delete mode 100644 win32/FireflyShell/FireflyShellSWE.vcproj delete mode 100644 win32/FireflyShell/IniFile.h delete mode 100644 win32/FireflyShell/LogPage.cpp delete mode 100644 win32/FireflyShell/LogPage.h delete mode 100644 win32/FireflyShell/MainDlg.cpp delete mode 100644 win32/FireflyShell/MainDlg.h delete mode 100644 win32/FireflyShell/NotifyIcon.cpp delete mode 100644 win32/FireflyShell/NotifyIcon.h delete mode 100644 win32/FireflyShell/README.txt delete mode 100644 win32/FireflyShell/ServerEvents.cpp delete mode 100644 win32/FireflyShell/ServerEvents.h delete mode 100644 win32/FireflyShell/ServiceControl.cpp delete mode 100644 win32/FireflyShell/ServiceControl.h delete mode 100644 win32/FireflyShell/VersionInfo.cpp delete mode 100644 win32/FireflyShell/VersionInfo.h delete mode 100644 win32/FireflyShell/localizations/dutch/dutch.ini delete mode 100644 win32/FireflyShell/localizations/dutch/dutch.lws delete mode 100644 win32/FireflyShell/localizations/french/french.ini delete mode 100644 win32/FireflyShell/localizations/french/french.lws delete mode 100644 win32/FireflyShell/localizations/german/german.ini delete mode 100644 win32/FireflyShell/localizations/german/german.lws delete mode 100644 win32/FireflyShell/localizations/italian/italian.ini delete mode 100644 win32/FireflyShell/localizations/italian/italian.lws delete mode 100644 win32/FireflyShell/localizations/japanese/japanese.ini delete mode 100644 win32/FireflyShell/localizations/japanese/japanese.lws delete mode 100644 win32/FireflyShell/localizations/swedish/swedish.ini delete mode 100644 win32/FireflyShell/localizations/swedish/swedish.lws delete mode 100644 win32/FireflyShell/res/FireflyShell.ico delete mode 100644 win32/FireflyShell/res/ShellRunning.ico delete mode 100644 win32/FireflyShell/res/ShellStopped.ico delete mode 100644 win32/FireflyShell/res/logo.bmp delete mode 100644 win32/FireflyShell/resource.h delete mode 100644 win32/FireflyShell/singleton.h delete mode 100644 win32/FireflyShell/stdafx.cpp delete mode 100644 win32/FireflyShell/stdafx.h delete mode 100644 win32/FireflyShell/version.h.templ delete mode 100644 win32/FireflyShell/version.rc delete mode 100644 win32/config.h.templ delete mode 100644 win32/ff.ico delete mode 100644 win32/messages.mc delete mode 100644 win32/mt-daapd-res.h delete mode 100644 win32/mt-daapd.rc.templ delete mode 100644 win32/mt-daapd.sln delete mode 100644 win32/mt-daapd.vcproj delete mode 100644 win32/nsi/AccessControl.dll delete mode 100644 win32/nsi/SimpleFC.dll delete mode 100644 win32/nsi/firefly.log delete mode 100644 win32/nsi/localizations/Dutch.nsh delete mode 100644 win32/nsi/localizations/English.nsh delete mode 100644 win32/nsi/localizations/French.nsh delete mode 100644 win32/nsi/localizations/German.nsh delete mode 100644 win32/nsi/localizations/Italian.nsh delete mode 100644 win32/nsi/localizations/Japanese.nsh delete mode 100644 win32/nsi/localizations/Swedish.nsh delete mode 100644 win32/nsi/manifest.xml delete mode 100644 win32/nsi/mapping.ini delete mode 100644 win32/nsi/mt-daapd-example.conf delete mode 100644 win32/nsi/mt-daapd.nsi.templ delete mode 100644 win32/nsi/nsSCM.dll delete mode 100644 win32/out-daap/out-daap.def delete mode 100644 win32/out-daap/out-daap.rc.templ delete mode 100644 win32/out-daap/out-daap.vcproj delete mode 100644 win32/out-daap/resource.h delete mode 100644 win32/rsp-res.h delete mode 100644 win32/rsp.def delete mode 100644 win32/rsp.rc.templ delete mode 100644 win32/rsp.vcproj delete mode 100644 win32/ssc-ffmpeg-res.h delete mode 100644 win32/ssc-ffmpeg.def delete mode 100644 win32/ssc-ffmpeg.rc.templ delete mode 100644 win32/ssc-ffmpeg.vcproj delete mode 100644 win32/ssc-wma/resource.h delete mode 100644 win32/ssc-wma/ssc-wma.def delete mode 100644 win32/ssc-wma/ssc-wma.rc.templ delete mode 100644 win32/ssc-wma/ssc-wma.vcproj delete mode 100644 win32/svcctrl/resource.h delete mode 100644 win32/svcctrl/small.ico delete mode 100644 win32/svcctrl/stdafx.cpp delete mode 100644 win32/svcctrl/stdafx.h delete mode 100644 win32/svcctrl/svcctrl.cpp delete mode 100644 win32/svcctrl/svcctrl.exe.manifest delete mode 100644 win32/svcctrl/svcctrl.h delete mode 100644 win32/svcctrl/svcctrl.ico delete mode 100644 win32/svcctrl/svcctrl.rc delete mode 100644 win32/svcctrl/svcctrl.sln delete mode 100644 win32/svcctrl/svcctrl.vcproj delete mode 100644 win32/versionize.bat delete mode 100644 win32/w32-event-res.h delete mode 100644 win32/w32-event.def delete mode 100644 win32/w32-event.rc.templ delete mode 100644 win32/w32-event.vcproj diff --git a/src/Makefile.am b/src/Makefile.am index cf980f87..aef72a82 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -80,6 +80,5 @@ EXTRA_DIST = rend-howl.c rend-posix.c rend-osx.c scan-mpc.c \ scan-ogg.c scan-flac.c db-sql.c db-sql.h \ db-sql-sqlite2.h db-sql-sqlite2.c \ db-sql-sqlite3.h db-sql-sqlite3.c \ - w32-eventlog.c w32-eventlog.h w32-service.c w32-service.h \ - os-win32.h os-win32.c win32.h db-gdbm.c db-gdbm.h \ + db-gdbm.c db-gdbm.h \ ff-plugins.h ff-dbstruct.h upnp.c upnp.h ff-plugin-events.h diff --git a/src/os-win32.c b/src/os-win32.c deleted file mode 100644 index 75958e88..00000000 --- a/src/os-win32.c +++ /dev/null @@ -1,581 +0,0 @@ -/* $Id$ - * - */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include "daapd.h" -#include "win32.h" -#include "err.h" -#include "os-win32.h" -#include "plugin.h" -#include "w32-eventlog.h" -#include "w32-service.h" -#include "util.h" - -/* Globals */ -static WSADATA w32_wsadata; -static os_serviceflag = 0; -static pthread_t os_service_tid; -static os_initialized=0; -static pthread_mutex_t os_mutex=PTHREAD_MUTEX_INITIALIZER; -static char *os_drive_maps[26]; -static int os_maps_init=0; - - -/* Forwards */ -static void _os_socket_startup(void); -static void _os_socket_shutdown(void); -static void _os_lock(void); -static void _os_unlock(void); -static BOOL WINAPI _os_cancelhandler(DWORD dwCtrlType); -char *_os_filepath(char *file); - - -extern int gettimeout(struct timeval end,struct timeval *timeoutp); - -/* Globals */ -char os_config_file[PATH_MAX]; -/* "official" os interface functions */ - -/** - * initialize the os-specific stuff. this would include - * backgrounding (or starting as service), setting up - * signal handlers (or ctrl-c handlers), etc - * - * @param background whether or not to start in background (service) - * @param runas we'll ignore this, as it's a unix thang - * @returns TRUE on success, FALSE otherwise - */ -int os_init(int foreground, char *runas) { - int err; - char *inifile; - char drive_buffer[4]; - char drive_map[PATH_MAX]; - int drive_letter; - - inifile=_os_filepath("mapping.ini"); - DPRINTF(E_LOG,L_MISC,"Building drive mapping table from %s\n",inifile); - for(drive_letter = 'a'; drive_letter <= 'z'; drive_letter++) { - sprintf(drive_buffer,"%c",drive_letter); - GetPrivateProfileString("mapping",drive_buffer,"",drive_map,PATH_MAX,inifile); - if(strlen(drive_map)) { - os_drive_maps[drive_letter - 'a'] = strdup(drive_map); - DPRINTF(E_LOG,L_MISC,"Mapped %c to %s\n",drive_letter,drive_map); - } else { - os_drive_maps[drive_letter - 'a'] = NULL; - } - } - os_maps_init=1; - free(inifile); - - if(!foreground) { - /* startup as service */ - os_serviceflag = 1; - if((err=pthread_create(&os_service_tid,NULL,service_startup,NULL))) { - DPRINTF(E_LOG,L_MISC,"Could not spawn thread: %s\n",strerror(err)); - return FALSE; - } - } else { - /* let's set a ctrl-c handler! */ - SetConsoleCtrlHandler(_os_cancelhandler,TRUE); - } - return TRUE; -} - -/** - * wait for signals - * - * don't care about signals on win32, so we'll just sleep - */ -void os_wait(int seconds) { - Sleep(seconds * 1000); -} -/** - * shutdown the system-specific stuff started in os_init. - */ -void os_deinit(void) { - if(os_serviceflag) { - /* then we need to stop the service */ - SetConsoleCtrlHandler(_os_cancelhandler,FALSE); - service_shutdown(0); - } -} - -/** - * open the syslog (eventlog) - */ -int os_opensyslog(void) { - elog_register(); - return elog_init(); -} - -/** - * close the syslog (eventlog) - */ -int os_closesyslog(void) { - return elog_deinit(); -} - -/** - * write a message to the syslog - * - * @param level what level of message (1-10) - * @param msg message to write - * @return TRUE on success, FALSE otherwise - */ -int os_syslog(int level, char *msg) { - return elog_message(level, msg); -} - -/** - * change the owner of a file to a specific user. This is - * ignored on windows - */ -extern int os_chown(char *path, char *user) { - return TRUE; -} - - -int os_signal_server(int what) { - /* this could really control the service somehow */ - fprintf(stderr,"This function is unimplemented on win32\n"); - exit(-1); -} - -int os_register(void) { - service_register(); - elog_register(); - - return TRUE; -} - -int os_unregister(void) { - service_unregister(); - elog_unregister(); - - return TRUE; -} - -static BOOL WINAPI _os_cancelhandler(DWORD dwCtrlType) { - DPRINTF(E_LOG,L_MISC,"Shutting down with a console event\n"); - config.stop = 1; - return TRUE; -} - -/* from the gnu c library */ -char *os_strsep(char **stringp, const char *delim) { - char *begin, *end; - - begin = *stringp; - if (begin == NULL) - return NULL; - - /* A frequent case is when the delimiter string contains only one - character. Here we don't need to call the expensive `strpbrk' - function and instead work using `strchr'. */ - if (delim[0] == '\0' || delim[1] == '\0') { - char ch = delim[0]; - - if (ch == '\0') { - end = NULL; - } else { - if (*begin == ch) - end = begin; - else if (*begin == '\0') - end = NULL; - else - end = strchr (begin + 1, ch); - } - } else { - /* Find the end of the token. */ - end = strpbrk (begin, delim); - } - - if (end) { - /* Terminate the token and set *STRINGP past NUL character. */ - *end++ = '\0'; - *stringp = end; - } else { - /* No more delimiters; this is the last token. */ - *stringp = NULL; - } - return begin; -} - -/** - * get uid of current user. this is really stubbed, as it's only used - * as a check during startup (it fails normally if you run non-root, as it means - * that it can't drop privs, can't write pidfile, etc) - */ -int os_getuid(void) { - return 0; -} - - -int os_gettimeofday (struct timeval *tv, struct timezone* tz) { - union { - long long ns100; /*time since 1 Jan 1601 in 100ns units */ - FILETIME ft; - } now; - - GetSystemTimeAsFileTime (&now.ft); - tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL); - tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL); - - if(tz) { - tz->tz_minuteswest = _timezone; - } - return (0); -} - - -/** - * initialize winsock - */ -void _os_socket_startup(void) { - WORD minver; - int err; - - minver = MAKEWORD( 2, 2 ); - - err = WSAStartup( minver, &w32_wsadata ); - if ( err != 0 ) { - DPRINTF(E_FATAL,L_MISC,"Could not initialize winsock\n"); - } -} - -/** - * deinitialize winsock - */ -void _os_socket_shutdown(void) { - WSACleanup(); -} - -/* COMPAT FUNCTIONS */ - - -/* can't be worse then strerror */ -char *os_strerror (int error_no) { - static char buf[500]; - - if (error_no == 0) - error_no = GetLastError (); - - buf[0] = '\0'; - if (!FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, - error_no, - 0, /* choose most suitable language */ - buf, sizeof (buf), NULL)) - sprintf (buf, "w32 error %u", error_no); - return buf; -} - -/** - * get the default config path. there might be an argument to be made - * for using the install path as determined by registry, but might - * just be easiest to grab the directory the executable is running from - * - * @returns path to config file (from static buffer) - */ -char *os_configpath(void) { - char *config_path = _os_filepath("mt-daapd.conf"); - char *working_path = _os_filepath(""); - - strcpy(os_config_file,config_path); - free(config_path); - - if(_chdir(working_path) == -1) { - DPRINTF(E_LOG,L_MISC,"Could not chdir to %s... using c:\\\n",working_path); - if(_chdir("c:\\") == -1) { - DPRINTF(E_FATAL,L_MISC,"Could not chdir to c:\\... aborting\n"); - } - } - free(working_path); - - DPRINTF(E_DBG,L_MISC,"Using config file %s\n",os_config_file); - return os_config_file; -} - -char *_os_filepath(char *file) { - char drive[_MAX_DRIVE]; - char dir[_MAX_DIR]; - char path[PATH_MAX]; - - GetModuleFileName(NULL,path,PATH_MAX); - _splitpath(path,drive,dir,NULL,NULL); - _makepath(path,drive,dir,NULL,NULL); - strcat(path,file); - return strdup(path); -} - - -/** - * get the path of the executable. Caller must free. - * - */ -char *os_apppath(char *junk) { - char app_path[PATH_MAX]; - - GetModuleFileName(NULL,app_path,PATH_MAX); - return strdup(app_path); -} - - -/** - * Determine if an address is local or not - * - * @param hostaddr the address to test for locality - */ -int os_islocaladdr(char *hostaddr) { - char hostname[256]; - struct hostent *ht; - int index; - - DPRINTF(E_DBG,L_MISC,"Checking if %s is local\n",hostaddr); - if(strncmp(hostaddr,"127.",4) == 0) - return TRUE; - - gethostname(hostname, sizeof(hostname)); - ht=gethostbyname(hostname); - - index=0; - while(ht->h_addr_list[index] != NULL) { -/* - if(memcmp(&hostaddr,h_addr_list[index],4) == 0) - return TRUE; -*/ - if(strcmp(inet_ntoa(*(struct in_addr *)ht->h_addr_list[index]),hostaddr) == 0) { - DPRINTF(E_DBG,L_MISC,"Yup!\n"); - return TRUE; - } - index++; - } - - DPRINTF(E_DBG,L_MISC,"Nope!\n"); - return FALSE; -} - - -/** - * Lock the mutex. This is used for initialization stuff, among - * other things (?) - */ -void _os_lock(void) { - int err; - - if((err=pthread_mutex_lock(&os_mutex))) { - DPRINTF(E_FATAL,L_MISC,"Cannot lock mutex\n"); - } -} - -/** - * Unlock the os mutex - */ -void _os_unlock(void) { - int err; - - if((err=pthread_mutex_unlock(&os_mutex))) { - DPRINTF(E_FATAL,L_MISC,"Cannot unlock mutex\n"); - } -} - -/** - * load a loadable library - */ -void *os_loadlib(char **pe, char *path) { - void *retval; - UINT old_mode; - - old_mode = SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS); - retval = (void*)LoadLibrary(path); - if(!retval) { - if(pe) *pe = strdup(os_strerror(0)); - } - SetErrorMode(old_mode); - return retval; -} - -void *os_libfunc(char **pe, void *handle, char *function) { - void *retval; - char *e; - - retval = GetProcAddress((HMODULE)handle, function); - if(!retval) { - if(pe) { - *pe = strdup(os_strerror(0)); - e = *pe; - while((e[strlen(e) - 1] == '\n') || (e[strlen(e)-1] == '\r')) - e[strlen(e)-1] = '\0'; - } - } - return retval; -} - -int os_unload(void *handle) { - FreeLibrary(handle); - return TRUE; -} - -// Unicody stuff - -/* opendir/closedir/readdir emulation taken from emacs. Thanks. :) */ -DIR *os_opendir(char *filename) { - DIR *dirp; - - /* Opening is done by FindFirstFile. However, a read is inherent to - this operation, so we defer the open until read time. */ - - if (!(dirp = (DIR *) malloc (sizeof (DIR)))) - return NULL; - - dirp->dir_find_handle = INVALID_HANDLE_VALUE; - dirp->dd_fd = 0; - dirp->dd_loc = 0; - dirp->dd_size = 0; - - strncpy (dirp->dir_pathname, filename,PATH_MAX); - dirp->dir_pathname[PATH_MAX] = '\0'; - - return dirp; -} - -void os_closedir(DIR *dirp) { - /* If we have a find-handle open, close it. */ - if (dirp->dir_find_handle != INVALID_HANDLE_VALUE) { - FindClose(dirp->dir_find_handle); - } - free((char *) dirp); -} - - -int os_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result) { - char filename[PATH_MAX + 1]; - WCHAR utf16[PATH_MAX + 1]; - int ln; - - if (dirp->dir_find_handle == INVALID_HANDLE_VALUE) { - /* If we aren't dir_finding, do a find-first, otherwise do a find-next. */ - strncpy (filename, dirp->dir_pathname,PATH_MAX - 3); - ln = (int) strlen (filename) - 1; - if(filename[ln] != '\\') - strcat (filename, "\\"); - strcat (filename, "*"); - - /* filename is utf-8... let's convert to unicode */ - util_utf8toutf16((unsigned char *)&utf16,sizeof(utf16),filename,(int)strlen(filename)); - - dirp->dir_find_handle = FindFirstFileW(utf16, &dirp->dir_find_data); - - if (dirp->dir_find_handle == INVALID_HANDLE_VALUE) { - *result=NULL; - return 2; - } - } else { - if (!FindNextFileW(dirp->dir_find_handle, &dirp->dir_find_data)) { - *result = NULL; - return 0; - } - } - - /* Emacs never uses this value, so don't bother making it match - value returned by stat(). */ - entry->d_ino = 1; - - memset(entry->d_name,0,MAXNAMLEN+1); - util_utf16toutf8(entry->d_name,MAXNAMLEN+1, - (unsigned char *)&dirp->dir_find_data.cFileName, - (int)wcslen(dirp->dir_find_data.cFileName)*2); - entry->d_namlen = (int) strlen (entry->d_name); - - entry->d_reclen = sizeof (struct dirent) - MAXNAMLEN + 3 + - entry->d_namlen - entry->d_namlen % 4; - - entry->d_type = 0; - if(dirp->dir_find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - entry->d_type |= DT_DIR; - } else if(dirp->dir_find_data.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) { - entry->d_type |= DT_REG; - } - - /* - if (dir_is_fat) - _strlwr (dir_static.d_name); - else if (!NILP (Vw32_downcase_file_names)) { - register char *p; - for (p = dir_static.d_name; *p; p++) - if (*p >= 'a' && *p <= 'z') - break; - if (!*p) - _strlwr (dir_static.d_name); - } - */ - *result = entry; - return 0; -} - -/** - * this is now pretty close to a true realpath implementation - */ -char *os_realpath(const char *pathname, char *resolved_path) { - char *ptr; - WCHAR utf16_rel_path[PATH_MAX+1]; - WCHAR utf16_path[PATH_MAX+1]; - char *mapped_path; - - /* need to take the utf-8 and convert to utf-16, then _fullpath, then back */ - util_utf8toutf16((unsigned char *)&utf16_rel_path,PATH_MAX * sizeof(WCHAR),(char*)pathname,(int)strlen(pathname)); - if(!_wfullpath(utf16_path,utf16_rel_path,PATH_MAX)) { - DPRINTF(E_FATAL,L_MISC,"Could not realpath %s\n",pathname); - } - util_utf16toutf8((unsigned char *)resolved_path,PATH_MAX,(unsigned char *)&utf16_path, - util_utf16_byte_len((unsigned char *)utf16_path)); - - ptr = resolved_path; - while(*ptr) { -// *ptr = tolower(*ptr); - if(*ptr == '/') - *ptr = '\\'; - ptr++; - } - - while(resolved_path[strlen(resolved_path)-1] == '\\') { - resolved_path[strlen(resolved_path)-1] = '\x0'; - } - - /* convert drive letter to unc path? */ - if((resolved_path[0] != '\\')&&(os_maps_init)){ - if((mapped_path = os_drive_maps[tolower(resolved_path[0]) - 'a'])) { - /* replace the x:\ with the path */ - memmove(&resolved_path[strlen(mapped_path)],&resolved_path[3],strlen(resolved_path)-2); /* get the null */ - memcpy(resolved_path,mapped_path,strlen(mapped_path)); - } - } - - return &resolved_path[0]; -} - - -int os_stat(const char *path, struct _stat *sb) { - WCHAR utf16_path[PATH_MAX+1]; - - memset(utf16_path,0,sizeof(utf16_path)); - util_utf8toutf16((unsigned char *)&utf16_path,PATH_MAX * 2,(char*)path,(int)strlen(path)); - - return _wstat(utf16_path,sb); -} - -int os_lstat(const char *path, struct _stat *sb) { - return os_stat(path,sb); -} - - diff --git a/src/os-win32.h b/src/os-win32.h deleted file mode 100644 index 028f6c29..00000000 --- a/src/os-win32.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * $Id$ - * - * os glue stuff, for functions that vary too greatly between - * win32 and unix - */ - -#ifndef _OS_WIN32_H_ -#define _OS_WIN32_H_ - -#include "stdlib.h" - -#define MAXNAMLEN 255 -#define DIRBLKSIZ 512 -#define PATHSEP '\\' -#define PATHSEP_STR "\\" -#define S_ISDIR(a) ((a) & S_IFDIR) - -struct timezone { - int tz_minuteswest; - int tz_dsttime; -}; - -#define DT_DIR 1 -#define DT_REG 2 -#define DT_LNK 4 - -#define W_OK 2 -#define R_OK 4 - -struct dirent { /* data from readdir() */ - - long d_ino; /* inode number of entry */ - unsigned short d_reclen; /* length of this record */ - unsigned short d_namlen; /* length of string in d_name */ - int d_type; /* flags */ - char d_name[MAXNAMLEN+1]; /* name of file */ -}; - -typedef struct { - int dd_fd; /* file descriptor */ - int dd_loc; /* offset in block */ - int dd_size; /* amount of valid data */ - char dd_buf[DIRBLKSIZ]; /* directory block */ - HANDLE dir_find_handle; - char dir_pathname[PATH_MAX+1]; - WIN32_FIND_DATAW dir_find_data; -} DIR; - -/* win32-specific functions -- set up service, etc */ -extern int os_register(void); -extern int os_unregister(void); -extern char *os_configpath(void); -extern int os_getuid(void); - -/* missing win32 functions */ -extern char *os_strsep(char **stringp, const char *delim); -extern char *os_realpath(const char *pathname, char *resolved_path); -extern int os_gettimeofday (struct timeval *tv, struct timezone* tz); -extern int os_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result); -extern void os_closedir(DIR *dirp); -extern DIR *os_opendir(char *filename); -extern char *os_strerror (int error_no); - -#endif /* _OS_WIN32_H_ */ diff --git a/src/os.h b/src/os.h index b084cd1a..df37f512 100644 --- a/src/os.h +++ b/src/os.h @@ -49,10 +49,6 @@ extern int os_islocaladdr(char *hostaddr); extern char *os_apppath(char *parm); extern int os_signal_server(int what); /* signal a running server */ -#ifdef WIN32 -# include "os-win32.h" -#else -# include "os-unix.h" -#endif +#include "os-unix.h" #endif diff --git a/src/plugins/ssc-wma.cpp b/src/plugins/ssc-wma.cpp deleted file mode 100644 index ada31dd4..00000000 --- a/src/plugins/ssc-wma.cpp +++ /dev/null @@ -1,354 +0,0 @@ -/* - * $Id: $ - * - * Win32-only transcoder for WMA using the Windows Media Format SDK. - */ - -#define _WIN32_DCOM - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include - -#include -#include -#include - - -#include "ff-plugins.h" - -#ifndef TRUE -# define TRUE 1 -# define FALSE 0 -#endif - -typedef struct tag_ssc_handle { - int state; - IWMSyncReader *pReader; - int errnum; - - int duration; - char wav_header[44]; - int wav_offset; - - INSSBuffer *pBuffer; - BYTE *pdata; - DWORD data_len; - int offset; - - DWORD channels; - DWORD sample_rate; - WORD bits_per_sample; -} SSCHANDLE; - -#define STATE_DONE 0 -#define STATE_OPEN 1 -#define STATE_STREAMOPEN 2 - -#define SSC_WMA_E_SUCCESS 0 -#define SSC_WMA_E_NOCOM 1 -#define SSC_WMA_E_NOREADER 2 -#define SSC_WMA_E_OPEN 3 -#define SSC_WMA_E_READ 4 - -char *_ssc_wma_errors[] = { - "Success", - "Could not initialize COM", - "Could not create WMA reader", - "Could not open file", - "Error while reading file" -}; - - - -/* Forwards */ -void *ssc_wma_init(void); -void ssc_wma_deinit(void *pv); -int ssc_wma_open(void *pv, MP3FILE *pmp3); -int ssc_wma_close(void *pv); -int ssc_wma_read(void *pv, char *buffer, int len); -char *ssc_wma_error(void *pv); - -/* Globals */ -PLUGIN_TRANSCODE_FN _ptfn = { - ssc_wma_init, - ssc_wma_deinit, - ssc_wma_open, - ssc_wma_close, - ssc_wma_read, - ssc_wma_error -}; - -PLUGIN_INFO _pi = { - PLUGIN_VERSION, /* version */ - PLUGIN_TRANSCODE, /* type */ - "ssc-wma/" VERSION, /* server */ - NULL, /* output fns */ - NULL, /* event fns */ - &_ptfn, /* fns */ - NULL, /* rend info */ - "wma,wmal,wmap,wmav" /* codeclist */ -}; - -/** - * return the string representation of the last error - */ -char *ssc_wma_error(void *pv) { - SSCHANDLE *handle = (SSCHANDLE*)pv; - - return _ssc_wma_errors[handle->errnum]; -} - -PLUGIN_INFO *plugin_info(void) { - return &_pi; -} - -void *ssc_wma_init(void) { - SSCHANDLE *handle; - HRESULT hr; - - hr = CoInitializeEx(NULL,COINIT_MULTITHREADED); - if(FAILED(hr)) { - pi_log(E_INF,"Could not initialize COM, Error code: 0x%08X\n",hr); - return NULL; - } - - handle=(SSCHANDLE *)malloc(sizeof(SSCHANDLE)); - if(handle) { - memset(handle,0,sizeof(SSCHANDLE)); - } - - return (void*)handle; -} - -void ssc_wma_deinit(void *vp) { - SSCHANDLE *handle = (SSCHANDLE *)vp; - ssc_wma_close(handle); - - if(handle) { - free(handle); - CoUninitialize(); - } - - return; -} - -int ssc_wma_open(void *vp, MP3FILE *pmp3) { - SSCHANDLE *handle = (SSCHANDLE*)vp; - HRESULT hr = S_OK; - WCHAR fname[PATH_MAX]; - DWORD byte_count; - char *file; - char *codec; - int duration; - - file = pmp3->path; - codec = pmp3->codectype; - duration = pmp3->song_length; - - if(!handle) - return FALSE; - - handle->state = STATE_DONE; - handle->duration = duration; - handle->errnum = SSC_WMA_E_OPEN; - - hr = WMCreateSyncReader(NULL,0,&handle->pReader); - if(FAILED(hr)) { - pi_log(E_INF,"Could not create WMA reader. Error code: 0x%08X\n",hr); - handle->errnum = SSC_WMA_E_NOREADER; - return FALSE; - } - - /* convert file name to wchar */ - MultiByteToWideChar(CP_UTF8,0,file,-1,fname,sizeof(fname)/sizeof(fname[0])); - - hr = handle->pReader->Open(fname); - if(FAILED(hr)) { - pi_log(E_INF,"Could not open file. Error code: 0x%08X\n",hr); - return FALSE; - } - handle->state=STATE_OPEN; - - hr = handle->pReader->SetRange(0,0); - if(FAILED(hr)) { - pi_log(E_INF,"Could not set range. Error code: 0x%08X\n",hr); - return FALSE; - } - - hr = handle->pReader->SetReadStreamSamples(1,0); - if(FAILED(hr)) { - pi_log(E_INF,"Could not stream samples. Error code: 0x%08X\n",hr); - return FALSE; - } - - handle->channels = 2; - handle->bits_per_sample = 16; - handle->sample_rate = 44100; - - IWMOutputMediaProps *pprops; - hr = handle->pReader->GetOutputFormat(0,0,&pprops); - if(FAILED(hr)) { - pi_log(E_LOG,"Could not get output format for %s\n",file); - return TRUE; /* we'll assume 44100/16/2 */ - } - - hr = pprops->GetMediaType(NULL,&byte_count); - if(FAILED(hr)) { - pi_log(E_LOG,"Could not get media type for %s\n",file); - return TRUE; - } - - WM_MEDIA_TYPE *ptype = (WM_MEDIA_TYPE*)calloc(byte_count,1); - if(!ptype) { - pi_log(E_FATAL,"ssc_wma_open: malloc\n"); - } - - hr = pprops->GetMediaType(ptype, &byte_count); - if(FAILED(hr)) { - free(ptype); - return TRUE; - } - - /* now get sample info */ - if(ptype->formattype == WMFORMAT_WaveFormatEx) { - WAVEFORMATEX *pformat = (WAVEFORMATEX*)ptype->pbFormat; - handle->channels = pformat->nChannels; - handle->sample_rate = pformat->nSamplesPerSec; - handle->bits_per_sample = pformat->wBitsPerSample; - } - - free(ptype); - - return TRUE; -} - -int ssc_wma_close(void *vp) { - SSCHANDLE *handle = (SSCHANDLE *)vp; - - if(!handle) - return TRUE; - - if(handle->state >= STATE_OPEN) { - handle->pReader->Close(); - } - - if(handle->pReader) - handle->pReader->Release(); - handle->pReader = NULL; - - handle->state = STATE_DONE; - return TRUE; -} - - - -int ssc_wma_read(void *vp, char *buffer, int len) { - SSCHANDLE *handle = (SSCHANDLE *)vp; - int bytes_returned = 0; - int bytes_to_copy; - HRESULT hr; - - unsigned int channels, sample_rate, bits_per_sample; - unsigned int byte_rate, block_align, duration; - - QWORD sample_time=0, sample_duration=0; - DWORD sample_len=0, flags=0, output_number=0; - - /* if we have not yet sent the header, let's do that first */ - if(handle->wav_offset != sizeof(handle->wav_header)) { - /* still have some to send */ - if(!handle->wav_offset) { - /* Should pull this from format info in the wma file */ - channels = handle->channels; - sample_rate = handle->sample_rate; - bits_per_sample = handle->bits_per_sample; - - if(handle->duration) - duration = handle->duration; - - sample_len = ((bits_per_sample * sample_rate * channels / 8) * (duration/1000)); - byte_rate = sample_rate * channels * bits_per_sample / 8; - block_align = channels * bits_per_sample / 8; - - pi_log(E_DBG,"Channels.......: %d\n",channels); - pi_log(E_DBG,"Sample rate....: %d\n",sample_rate); - pi_log(E_DBG,"Bits/Sample....: %d\n",bits_per_sample); - - memcpy(&handle->wav_header[0],"RIFF",4); - *((unsigned int*)(&handle->wav_header[4])) = 36 + sample_len; - memcpy(&handle->wav_header[8],"WAVE",4); - memcpy(&handle->wav_header[12],"fmt ",4); - *((unsigned int*)(&handle->wav_header[16])) = 16; - *((unsigned short*)(&handle->wav_header[20])) = 1; - *((unsigned short*)(&handle->wav_header[22])) = channels; - *((unsigned int*)(&handle->wav_header[24])) = sample_rate; - *((unsigned int*)(&handle->wav_header[28])) = byte_rate; - *((unsigned short*)(&handle->wav_header[32])) = block_align; - *((unsigned short*)(&handle->wav_header[34])) = bits_per_sample; - memcpy(&handle->wav_header[36],"data",4); - *((unsigned int*)(&handle->wav_header[40])) = sample_len; - } - - bytes_to_copy = sizeof(handle->wav_header) - handle->wav_offset; - if(len < bytes_to_copy) - bytes_to_copy = len; - - memcpy(buffer,&handle->wav_header[handle->wav_offset],bytes_to_copy); - handle->wav_offset += bytes_to_copy; - return bytes_to_copy; - } - - /* see if we have any leftover data */ - if(handle->data_len) { - bytes_returned = handle->data_len; - if(bytes_returned > len) { - bytes_returned = len; - } - - memcpy(buffer,handle->pdata + handle->offset,bytes_returned); - handle->offset += bytes_returned; - handle->data_len -= bytes_returned; - - if(!handle->data_len) { - handle->pBuffer->Release(); - handle->pBuffer = NULL; - } - - return bytes_returned; - } - - handle->offset = 0; - hr = handle->pReader->GetNextSample(1,&handle->pBuffer,&sample_time, &sample_duration, &flags, &output_number, NULL); - if(SUCCEEDED(hr)) { - hr = handle->pBuffer->GetBufferAndLength(&handle->pdata, &handle->data_len); - if(FAILED(hr)) { - pi_log(E_LOG,"Read error while transcoding file\n"); - handle->errnum = SSC_WMA_E_READ; - return -1; - } - -// pi_log(E_SPAM,"Read %d bytes\n",handle->data_len); - - bytes_returned = handle->data_len; - if(bytes_returned > len) - bytes_returned = len; - - memcpy(buffer,handle->pdata + handle->offset,bytes_returned); - handle->offset += bytes_returned; - handle->data_len -= bytes_returned; - - if(!handle->data_len) { - handle->pBuffer->Release(); - handle->pBuffer = NULL; - } - } else { - return 0; - } - - return bytes_returned; -} diff --git a/src/plugins/w32-event.c b/src/plugins/w32-event.c deleted file mode 100644 index acfcc01c..00000000 --- a/src/plugins/w32-event.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * $Id: $ - */ - -#include "compat.h" -#include "ff-plugins.h" - -/* Forwards */ -void plugin_handler(int, int, void *, int); - -#define PIPE_BUFFER_SIZE 4096 - -/* Globals */ -PLUGIN_EVENT_FN _pefn = { plugin_handler }; - -PLUGIN_INFO _pi = { - PLUGIN_VERSION, /* version */ - PLUGIN_EVENT, /* type */ - "w32-event/" VERSION, /* server */ - NULL, /* output fns */ - &_pefn, /* event fns */ - NULL, /* transocde fns */ - NULL, /* rend info */ - NULL /* codec list */ -}; - -typedef struct tag_plugin_msg { - int size; - int event_id; - int intval; - char vp[1]; -} PLUGIN_MSG; - - -PLUGIN_INFO *plugin_info(void) { - return &_pi; -} - -#define MAILSLOT_NAME "\\\\.\\mailslot\\FireflyMediaServer--67A72768-4154-417e-BFA0-FA9B50C342DE" -/** NO LOG IN HERE! We'll go into an endless loop. :) */ -void plugin_handler(int event_id, int intval, void *vp, int len) { - HANDLE h = CreateFile(MAILSLOT_NAME, GENERIC_WRITE, - FILE_SHARE_READ, NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - if (h != INVALID_HANDLE_VALUE) { - DWORD bytes_written; - const int packet_size = 12 + len; - unsigned char *buffer = (unsigned char *)malloc(packet_size); - if(!buffer) - return; - memset(buffer, 0, packet_size); - - buffer[0] = packet_size & 0xff; - buffer[1] = (packet_size >> 8) & 0xff; - buffer[2] = (packet_size >> 16) & 0xff; - buffer[3] = (packet_size >> 24) & 0xff; - - buffer[4] = event_id & 0xff; - buffer[5] = (event_id >> 8) & 0xff; - buffer[6] = (event_id >> 16) & 0xff; - buffer[7] = (event_id >> 24) & 0xff; - - buffer[8] = intval & 0xff; - buffer[9] = (intval >> 8) & 0xff; - buffer[10] = (intval >> 16) & 0xff; - buffer[11] = (intval >> 24) & 0xff; - - memcpy(buffer + 12, vp, len); - - /* If this fails then there's nothing we can do about it anyway. */ - WriteFile(h, buffer, packet_size, &bytes_written, NULL); - CloseHandle(h); - } -} diff --git a/src/rend-win32.c b/src/rend-win32.c deleted file mode 100644 index 2570ffbc..00000000 --- a/src/rend-win32.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - * $Id$ - * - * This is an implementation of rendezvous using the Bonjour (tm) - * for windows dns_sd.h implementation - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "daapd.h" -#include "dns_sd.h" -#include "err.h" - -/* Globals */ -pthread_t rend_tid; -static volatile int rend_stop_flag = 0; -//static volatile int rend_timeout = 100000000; /* select timeout */ -static volatile int rend_timeout=2; -static volatile int rend_count=0; -static pthread_mutex_t rend_mutex=PTHREAD_MUTEX_INITIALIZER; -typedef struct tag_rend_entry { - DNSServiceRef client; - struct tag_rend_entry *next; -} REND_ENTRY; -static REND_ENTRY rend_clients = { NULL, NULL }; - -/* Forwards */ -void *rend_mainthread(void *arg); -void DNSSD_API rend_reg_reply(DNSServiceRef client, const DNSServiceFlags flags, - DNSServiceErrorType errorCode, const char *name, - const char *regtype, const char *domain, void *context); - -/* Typedefs */ -typedef union { unsigned char b[2]; unsigned short NotAnInteger; } Opaque16; - - -/** - * initialize the rendezvous interface. - * - * @param user user to drop privs to (ignored) - * @returns 0 on success, -1 with errno set otherwise - */ -int rend_init(char *user) { - /* we'll throw off a handler thread when we register a name */ - return 0; -} - -/* FIXME */ -void rend_lock(void) { - if(pthread_mutex_lock(&rend_mutex)) - DPRINTF(E_FATAL,L_MISC,"Could not lock mutex\n"); -} - -void rend_unlock(void) { - pthread_mutex_unlock(&rend_mutex); -} - -/** - * main bonjourvous thread - * - * @param arg unused - */ -void *rend_mainthread(void *arg) { - /* this is pretty much right out of the old mdns stuff */ - int nfds; - fd_set readfds; - fd_set *which; - - struct timeval tv; - int result; - REND_ENTRY *current; - DNSServiceErrorType err = kDNSServiceErr_NoError; - - while (!rend_stop_flag) { - FD_ZERO(&readfds); - - rend_lock(); - nfds=1; - current = rend_clients.next; - while(current) { - if(current->client) { - if(DNSServiceRefSockFD(current->client) > nfds) - nfds = DNSServiceRefSockFD(current->client) + 1; - - FD_SET(DNSServiceRefSockFD(current->client),&readfds); - } - current = current->next; - } - rend_unlock(); - - tv.tv_sec = rend_timeout; - tv.tv_usec = 0; - - result = select(nfds, &readfds, (fd_set*)NULL, (fd_set*)NULL, &tv); - if (result > 0) { - rend_lock(); - current = rend_clients.next; - err=0; - while(current) { - if(current->client) { - if((!err) && (FD_ISSET(DNSServiceRefSockFD(current->client),&readfds))) { - err = DNSServiceProcessResult(current->client); - } - } - current = current->next; - } - rend_unlock(); - - if (err) { - DPRINTF(E_LOG,L_REND,"DNSServiceProcessResult returned %d\n", err); - rend_stop_flag = 1; - } - } else if (result == 0) { - DPRINTF(E_SPAM,L_REND,"rendezvous: tick!\n"); - -// myTimerCallBack(); - } else { - DPRINTF(E_INF,L_REND,"select() returned %d errno %d %s\n", result, errno, strerror(errno)); - if (errno != EINTR) rend_stop_flag = 1; - } - } - - rend_lock(); - while(current) { - if(current->client) - DNSServiceRefDeallocate(current->client); - current = current->next; - } - rend_unlock(); - return NULL; -} - - -/** - * check to see if rendezvous is running. - * - * @returns TRUE if running, FALSE otherwise - */ -int rend_running(void) { - return TRUE; -} - -/** - * stop rendezvous if it is running. There should really be a way - * to start it, would't one think? - * - * @returns TRUE if stopped, FALSE otherwise - */ -int rend_stop(void) { - return TRUE; -} - - -/** - * register a rendezvous name - * - * @param name long name to register (mt-daapd) - * @param type type to register (_daap._tcp) - * @param port port to register (3689) - * @param iface interface to register with (ignored) - * @returns TRUE if registered, FALSE otherwise - */ -int rend_register(char *name, char *type, int port, char *iface, char *txt) { - int err; - REND_ENTRY *pnew; - uint16_t port_netorder = htons((unsigned short)port); - - pnew = (REND_ENTRY *)malloc(sizeof(REND_ENTRY)); - if(!pnew) - return -1; - - rend_lock(); - pnew->client = NULL; - pnew->next = rend_clients.next; - rend_clients.next = pnew; - rend_unlock(); - - DPRINTF(E_INF,L_REND,"Registering %s as type (%s) on port %d\n", - name, type, port); - - DNSServiceRegister(&pnew->client,0,kDNSServiceInterfaceIndexAny,name,type,"local",NULL, - port_netorder,(uint16_t)strlen(txt),txt,rend_reg_reply, NULL); - - /* throw off a new thread work this */ - if(!rend_count) { - if((err=pthread_create(&rend_tid,NULL,rend_mainthread,NULL))) { - DPRINTF(E_LOG,L_REND,"Could not spawn thread: %s\n",strerror(err)); - errno=err; - return -1; - } - } - - rend_count++; - return 0; -} - -void DNSSD_API rend_reg_reply(DNSServiceRef client, const DNSServiceFlags flags, - DNSServiceErrorType errorCode, const char *name, - const char *regtype, const char *domain, void *context) -{ - DPRINTF(E_INF,L_REND,"Got a reply for %s.%s%s\n", name, regtype, domain); - switch (errorCode) { - case kDNSServiceErr_NoError: - DPRINTF(E_INF,L_REND,"Name now registered and active\n"); - break; - case kDNSServiceErr_NameConflict: - DPRINTF(E_FATAL,L_REND,"Rendezvous name in use, aborting...\n"); - break; - default: - DPRINTF(E_FATAL,L_REND,"Error %d\n", errorCode); - return; - } -} - -/** - * unregister a name - * - * unimplemented - */ -int rend_unregister(char *name, char *type, int port) { - return -1; -} diff --git a/src/w32-eventlog.c b/src/w32-eventlog.c deleted file mode 100644 index 695c2352..00000000 --- a/src/w32-eventlog.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - * $Id$ - * - * eventlog messages utility functions - * - * Copyright (C) 2005-2006 Ron Pedde (ron@pedde.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include - -#include "daapd.h" -#include "messages.h" - -static HANDLE elog_handle = NULL; - -/** - * register eventlog functions - * - * @returns TRUE if successful, FALSE otherwise - */ -int elog_register(void) { - HKEY reg_key = NULL; - DWORD err = 0; - char path[PATH_MAX]; - DWORD event_types; - - wsprintf(path,"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s", PACKAGE); - if((err=RegCreateKey(HKEY_LOCAL_MACHINE, path, ®_key)) != ERROR_SUCCESS) - return FALSE; - - GetModuleFileName(NULL, path, PATH_MAX); - - err=RegSetValueEx(reg_key, "EventMessageFile",0,REG_EXPAND_SZ,path,(DWORD)strlen(path) + 1); - if(err != ERROR_SUCCESS) { - RegCloseKey(reg_key); - return FALSE; - } - - event_types = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE; - err=RegSetValueEx(reg_key,"TypesSupported", 0, REG_DWORD, (BYTE*)&event_types, sizeof event_types ); - if(err != ERROR_SUCCESS) { - RegCloseKey(reg_key); - return FALSE; - } - - RegCloseKey(reg_key); - - return TRUE; -} - -/** - * FIXME: ENOTIMPL - */ -int elog_unregister(void) { - return TRUE; -} - -/** - * initialize the eventlog - * - * @returns TRUE if successful, FALSE otherwise - */ -int elog_init(void) { - elog_handle=RegisterEventSource(NULL, PACKAGE); - if(elog_handle == INVALID_HANDLE_VALUE) - return FALSE; - - return TRUE; -} - - -/** - * uninitialize the eventlog - * - * @returns TRUE - */ -int elog_deinit(void) { - DeregisterEventSource(elog_handle); - return TRUE; -} - -/** - * log a message to the event viewer - * - * @param level event level to log: 0=fatal, 3=warn, > info - * @returns TRUE on success, FALSE otherwise - */ - -int elog_message(int level, char *msg) { - WORD message_level = EVENTLOG_INFORMATION_TYPE; - int ret; - - if(level == 0) - message_level = EVENTLOG_ERROR_TYPE; - - ret = ReportEvent( - elog_handle, - message_level, - 0, - EVENT_MSG, - NULL, - 1, - 0, - &msg, - NULL); - - /* ReportEvent returns non-zero on success */ - return ret ? TRUE : FALSE; -} diff --git a/src/w32-eventlog.h b/src/w32-eventlog.h deleted file mode 100644 index fba2a1a1..00000000 --- a/src/w32-eventlog.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * $Id$ - * - * eventlog messages utility functions - * - * Copyright (C) 2005 Ron Pedde (ron.pedde@firstmarkcu.org) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _EVENTLOG_H_ -#define _EVENTLOG_H_ - -extern int elog_register(void); -extern int elog_unregister(void); -extern int elog_init(void); -extern int elog_deinit(void); -extern int elog_message(int level, char *msg); - -#endif /* _EVENTLOG_H_ */ diff --git a/src/w32-service.c b/src/w32-service.c deleted file mode 100644 index 6af55eab..00000000 --- a/src/w32-service.c +++ /dev/null @@ -1,292 +0,0 @@ -/* - * $Id$ - * - * simple service management functions - * - * Copyright (C) 2005 Ron Pedde (ron.pedde@firstmarkcu.org) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include - -#include "daapd.h" -#include "err.h" - -/* Forwards */ -BOOL service_update_status (DWORD,DWORD,DWORD,DWORD,DWORD); -void service_mainfunc(DWORD, LPTSTR *); -void service_init(void); -void service_handler(DWORD); - -/* Globals */ -SERVICE_STATUS_HANDLE service_status_handle = NULL; -HANDLE service_kill_event = NULL; -DWORD service_current_status; - -/** - * handle the stop, start, pause requests, etc. - * - * @param code action the SCM wants us to take - */ -void service_handler(DWORD code) { - switch(code) { - case SERVICE_CONTROL_INTERROGATE: - break; - - case SERVICE_CONTROL_SHUTDOWN: - // fallthrough - - case SERVICE_CONTROL_STOP: - service_update_status(SERVICE_STOP_PENDING, NO_ERROR, 0, 1, 5000); - SetEvent(service_kill_event); - return; - - default: - break; - } - service_update_status(service_current_status, NO_ERROR, 0, 0, 0); -} - -/** - * exit the service as gracefully as possible, returning the error - * level specified. I think there are some state machine problems - * here, but probably nothing fatal -- an unnecessary call to - * xfer_shutdown, maybe. That's about it. - * - * @param errorlevel errorlevel to return - */ -void service_shutdown(int errorlevel) { - DPRINTF(E_INF,L_MISC,"Service about to terminate with error %d\n",errorlevel); - - if(service_current_status != SERVICE_STOPPED) { - service_update_status(SERVICE_STOP_PENDING, NO_ERROR, 0, 1, 5000); - - config.stop = 1; - service_update_status(SERVICE_STOPPED,errorlevel,0,0,3000); - } - - if(service_kill_event) { - SetEvent(service_kill_event); - CloseHandle(service_kill_event); - } - -// exit(errorlevel); - /* we'll let the main process exit (or hang!) */ - Sleep(5000); - exit(1); -} - -/** - * The main for the service -- starts up the service and - * makes it run. This sits in a tight loop until the service - * is shutdown. If this function exits, it's because the - * service is stopping. - * - * @param argc argc as passed from SCM - * @param argv argv as passed from SCM - */ -void service_mainfunc(DWORD argc, LPTSTR *argv) { - BOOL success; - - service_current_status = SERVICE_STOPPED; - service_status_handle = RegisterServiceCtrlHandler(PACKAGE, - (LPHANDLER_FUNCTION) service_handler); - - if(!service_status_handle) { - service_shutdown(GetLastError()); - return; - } - - // Next Notify the Service Control Manager of progress - success = service_update_status(SERVICE_START_PENDING, NO_ERROR, 0, 1, 5000); - if (!success) { - service_shutdown(GetLastError()); - return; - } - - service_kill_event = CreateEvent (0, TRUE, FALSE, 0); - if(!service_kill_event) { - service_shutdown(GetLastError()); - return; - } - - // FIXME - // startup errors generate an ERR_FATAL, which exit()s in the - // logging code -- fine for console apps, not so good here. - // Generates ugly error messages from the service tool. - // (terminated unexpectedly). -// xfer_startup(); - - // The service is now running. Notify the SCM of this fact. - service_current_status = SERVICE_RUNNING; - success = service_update_status(SERVICE_RUNNING, NO_ERROR, 0, 0, 0); - if (!success) { - service_shutdown(GetLastError()); - return; - } - - // Now just wait for our killed service signal, and then exit, which - // terminates the service! - WaitForSingleObject (service_kill_event, INFINITE); - service_shutdown(0); -} - - -/** - * update the scm service status, so it can make pretty - * gui stupidness. light wrapper around SetServiceStatus - * - * If the visual studio editor wasn't so horribly useless - * and munge up the indents, I'd split these parameters - * into several lines, but Microsoft apparently can't build - * an editor that is as good as that made by volunteers. - * - * Those who do not understand Unix are condemned to reinvent - * it, poorly. -- Henry Spencer - * - * @param dwCurrentState new service state - * @param dwWin32ExitCode exit code if state is SERVICE_STOPPED - * @param dwServiceSpecificExitCode specified service exit code - * @param dwCheckPoint incremented value for long startups - * @param dwWaitHint how to before giving up on the service - * - * @returns result of SetServiceStatus - true on success - */ -BOOL service_update_status (DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint, DWORD dwWaitHint) { - BOOL success; - SERVICE_STATUS serviceStatus; - - service_current_status = dwCurrentState; - - serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - serviceStatus.dwCurrentState = dwCurrentState; - if (dwCurrentState == SERVICE_START_PENDING) { - serviceStatus.dwControlsAccepted = 0; - } else { - serviceStatus.dwControlsAccepted = - SERVICE_ACCEPT_STOP | - SERVICE_ACCEPT_SHUTDOWN; - } - - if (dwServiceSpecificExitCode == 0) { - serviceStatus.dwWin32ExitCode = dwWin32ExitCode; - } else { - serviceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; - } - - serviceStatus.dwServiceSpecificExitCode = dwServiceSpecificExitCode; - serviceStatus.dwCheckPoint = dwCheckPoint; - serviceStatus.dwWaitHint = dwWaitHint; - - success = SetServiceStatus (service_status_handle, &serviceStatus); - if (!success) { - SetEvent(service_kill_event); - } - return success; -} - -/** - * kick off the application when in service mdoe - suitable for threadprocing - */ -void *service_startup(void *arg) { - SERVICE_TABLE_ENTRY serviceTable[] = { - { PACKAGE, (LPSERVICE_MAIN_FUNCTION) service_mainfunc }, - { NULL, NULL } - }; - - BOOL success; - - // Register the service with the Service Control Manager - // If it were to fail, what would we do, anyway? - success = StartServiceCtrlDispatcher(serviceTable); - return NULL; -} - -/** - * install the service - */ -void service_register(void) { - SC_HANDLE scm; - SC_HANDLE svc; - char path[PATH_MAX]; - - GetModuleFileName(NULL, path, PATH_MAX ); - - if(!(scm = OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE))) { - DPRINTF(E_FATAL,L_MISC,"Cannot open service control manager\n"); - } - - svc = CreateService(scm,PACKAGE,SERVICENAME,SERVICE_ALL_ACCESS, - SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL, - path,0,0,0,0,0); - if(!svc) { - DPRINTF(E_FATAL,L_MISC,"Cannot create service: %d\n",GetLastError()); - } - - CloseServiceHandle(svc); - CloseServiceHandle(scm); - - DPRINTF(E_LOG,L_MISC,"Registered service successfully\n"); -} - - -/** - * uninstall the service - */ -void service_unregister(void) { - SC_HANDLE scm; - SC_HANDLE svc; - BOOL res; - SERVICE_STATUS status; - - if(!(scm = OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE))) { - DPRINTF(E_FATAL,L_MISC,"Cannot open service control manager: %d\n",GetLastError()); - } - - svc = OpenService(scm,PACKAGE,SERVICE_ALL_ACCESS | DELETE); - if(!svc) { - DPRINTF(E_FATAL,L_MISC,"Cannot open service: %d (is it installed??)\n",GetLastError()); - } - - res=QueryServiceStatus(svc,&status); - if(!res) { - DPRINTF(E_FATAL,L_MISC,"Cannot query service status: %d\n",GetLastError()); - } - - if(status.dwCurrentState != SERVICE_STOPPED) { - DPRINTF(E_LOG,L_MISC,"Stopping service...\n"); - ControlService(svc,SERVICE_CONTROL_STOP,&status); - // we should probably poll for service stoppage... - Sleep(2000); - } - - DPRINTF(E_LOG,L_MISC,"Deleting service...\n"); - res = DeleteService(svc); - - if(res) { - DPRINTF(E_LOG,L_MISC,"Deleted successfully\n"); - } else { - DPRINTF(E_FATAL,L_MISC,"Error deleting service: %d\n",GetLastError()); - } - - CloseServiceHandle(svc); - CloseServiceHandle(scm); -} - diff --git a/src/w32-service.h b/src/w32-service.h deleted file mode 100644 index f69c8c64..00000000 --- a/src/w32-service.h +++ /dev/null @@ -1,32 +0,0 @@ - -/* - * $Id$ - * - * simple service management functions - * - * Copyright (C) 2005 Ron Pedde (ron.pedde@firstmarkcu.org) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _SERVICE_H_ -#define _SERVICE_H_ - -extern void *service_startup(void *); -extern void service_shutdown(int); -extern void service_register(void); -extern void service_unregister(void); - -#endif /* _SERVICE_H_ */ diff --git a/src/win32.h b/src/win32.h deleted file mode 100644 index 824d4989..00000000 --- a/src/win32.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * $Id$ - * - * Win32 compatibility stuff - */ - -#ifndef _WIN32_H_ -#define _WIN32_H_ - -// Visual C++ 2005 has a secure CRT that generates oodles of warnings when unbounded -// C library functions are used. Disable this feature for the time being. -#if defined(_MSC_VER) -# if _MSC_VER >= 1400 -# define _CRT_SECURE_NO_DEPRECATE 1 -# define _CRT_NONSTDC_NO_DEPRECATE 1 -# endif -#endif - -// Don't pull in winsock... -#define WIN32_LEAN_AND_MEAN - -// Must include all these before defining the non-underscore versions -// otherwise the prototypes will go awry. -#include -//#include -#include -#include -#include -#include - -/* Type fixups */ -#define mode_t int -#define ssize_t int -//#define socklen_t int - -/* Consts */ -#define PIPE_BUF 256 /* What *should* this be on win32? */ -#define MAXDESC 512 /* http://msdn.microsoft.com/en-us/library/kdfaxaay.aspx */ -#define ETIME 101 -#define PATH_MAX 2048 /* it's clearly not _MAX_PATH... other projects seem to use 512 */ -#define MAX_NAME_LEN _MAX_PATH -#define EADDRINUSE WSAEADDRINUSE -#define S_IFLNK 0x1 - -#define HOST "unknown-windows-ick" -#define SERVICENAME "Firefly Media Server" - -#include "os-win32.h" - -#ifndef TRUE -# define TRUE 1 -# define FALSE 0 -#endif - -typedef UINT8 uint8_t; -typedef INT8 int8_t; -typedef UINT16 uint16_t; -typedef INT16 int16_t; -typedef UINT32 uint32_t; -typedef INT32 int32_t; -typedef UINT64 uint64_t; -typedef INT64 int64_t; - - -/* Funtion fixups */ -#define usleep Sleep -#define sleep(a) Sleep((a) * 1000) -#define mkdir(a,b) _mkdir((a)) -#define strtoll strtol /* FIXME: compat functions */ -#define atoll atol - -#define realpath os_realpath -#define strsep os_strsep - -#define strncasecmp strnicmp -#define strcasecmp stricmp -#define snprintf _snprintf -#define vsnprintf _vsnprintf -#define access _access - -#define readdir_r os_readdir_r -#define closedir os_closedir -#define opendir os_opendir - -#define getuid os_getuid -#define strerror os_strerror /* FIXME: get rid of posix errors */ - -/* override the uici stuff */ -// #define u_open os_opensocket -// #define u_accept os_acceptsocket - -/* privately implemented functions: @see os-win32.c */ -#define gettimeofday os_gettimeofday - - -#define CONFFILE os_configpath() - -extern char *os_configpath(void); - -#endif /* _WIN32_H_ */ - diff --git a/win32/FireflyShell/AboutPage.cpp b/win32/FireflyShell/AboutPage.cpp deleted file mode 100644 index db4c5fe1..00000000 --- a/win32/FireflyShell/AboutPage.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#include "stdafx.h" -#include "AboutPage.h" -#include "FireflyShell.h" -#include "VersionInfo.h" -#include "DosPath.h" - -LRESULT CAboutPage::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ - m_firefly_link.SubclassWindow(GetDlgItem(IDC_FIREFLYLINK)); - m_firefly_link.SetHyperLink(_T("http://forums.fireflymediaserver.org")); - - m_roku_link.SetHyperLink(_T("http://www.rokulabs.com")); - m_roku_link.SubclassWindow(GetDlgItem(IDC_ROKULINK)); - - - // Do this before we try and use the controls. - DoDataExchange(false); - - FillVersionList(); - - return 0; -} - -void CAboutPage::FillVersionList() -{ - CWaitCursor wait; - - m_versions.Empty(); - - // Initialise the list control - CString str; - str.LoadString(IDS_VERSIONINFO_DESCRIPTION); - m_list.AddColumn(str, SUBITEM_DESCRIPTION); - str.LoadString(IDS_VERSIONINFO_VERSION); - m_list.AddColumn(str, SUBITEM_VERSION, 1); - str.LoadString(IDS_VERSIONINFO_PATH); - m_list.AddColumn(str, SUBITEM_PATH, 2); - - m_list.SetColumnWidth(SUBITEM_DESCRIPTION, 40); - m_list.SetColumnWidth(SUBITEM_VERSION, 40); - - CDosPath server_path(GetApplication()->GetServiceBinaryPath()); - AddEntry(server_path.GetPath(), _T("Firefly server")); - AddEntry(CDosPath::AppPath().GetPath(), _T("FireflyShell")); - - CString plugins_path = server_path.GetPathOnly() + _T("plugins\\"); - CString plugins_pattern = plugins_path + _T("*.dll"); - WIN32_FIND_DATA find; - HANDLE hFind = FindFirstFile(plugins_pattern, &find); - if (hFind != INVALID_HANDLE_VALUE) - { - do - { - AddEntry(plugins_path + find.cFileName, CString(find.cFileName) + _T(" plugin")); - } while (FindNextFile(hFind, &find)); - FindClose(hFind); - } - - for(int i = 0; i < SUBITEM_COUNT; ++i) - { - m_list.SetColumnWidth(i, m_column_widths[i] + 16); - } -} - -void CAboutPage::AddEntry(const TCHAR *path, const TCHAR *fallback_description) -{ - VersionInfo vi; - - CString description = fallback_description; - CString version; - - if (vi.Open(path)) - { - description = vi.GetFileDescription(); - version = vi.GetFileVersion(); - } - - int item = m_list.GetItemCount(); - AddItem(item, SUBITEM_DESCRIPTION, description); - AddItem(item, SUBITEM_VERSION, version); - AddItem(item, SUBITEM_PATH, path); - - CString line; - line.Format(_T("%s\t%s\t%s\r\n"), description, version, path); - m_versions += line; -} - -void CAboutPage::AddItem(int item, int subitem, const TCHAR *text) -{ - m_list.AddItem(item, subitem, text); - const int width = m_list.GetStringWidth(text); - if (width > m_column_widths[subitem]) - m_column_widths[subitem] = width; -} - -LRESULT CAboutPage::OnCopy(WORD, WORD, HWND, BOOL &) -{ - if (OpenClipboard()) - { - const size_t len = m_versions.GetLength() * sizeof(TCHAR); - - HGLOBAL h = ::GlobalAlloc(GMEM_MOVEABLE, len); - if (h) - { - void *buffer = ::GlobalLock(h); - memcpy(buffer, static_cast(m_versions), len); - ::GlobalUnlock(h); - - EmptyClipboard(); -#if defined(UNICODE) - SetClipboardData(CF_UNICODETEXT, h); -#else - SetClipboardData(CF_TEXT, h); -#endif - } - CloseClipboard(); - } - return 0; -} - -LRESULT CAboutPage::OnCtlColorStatic(HDC hdc, HWND hwnd) -{ - if (GetDlgItem(IDC_LOGO) == hwnd) - { - HBRUSH brush = (HBRUSH)::GetStockObject(WHITE_BRUSH); - return (LRESULT)brush; - } - else - return 0; -} \ No newline at end of file diff --git a/win32/FireflyShell/AboutPage.h b/win32/FireflyShell/AboutPage.h deleted file mode 100644 index 8bb7f6ca..00000000 --- a/win32/FireflyShell/AboutPage.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#ifndef ABOUTPAGE_H -#define ABOUTPAGE_H 1 - -#include "resource.h" - -class CAboutPage : - public CPropertyPageImpl, - public CWinDataExchange -{ - typedef CPropertyPageImpl base; - CListViewCtrl m_list; - enum - { - SUBITEM_DESCRIPTION = 0, - SUBITEM_VERSION = 1, - SUBITEM_PATH = 2, - SUBITEM_COUNT = 3 - }; - - int m_column_widths[SUBITEM_COUNT]; - - CHyperLink m_roku_link; - CHyperLink m_firefly_link; - - // String version of information ready to write to the clipboard - CString m_versions; - -public: - CAboutPage() - { - ::ZeroMemory(m_column_widths, sizeof(m_column_widths)); - } - enum { IDD = IDD_PAGE_ABOUT }; - -private: - - // Message Handlers - BEGIN_MSG_MAP(CAboutPage) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_ID_HANDLER(IDC_COPY, OnCopy) - MSG_WM_CTLCOLORSTATIC(OnCtlColorStatic) - CHAIN_MSG_MAP(base) - END_MSG_MAP() - - BEGIN_DDX_MAP(CAboutPage) - DDX_CONTROL_HANDLE(IDC_VERSIONLIST, m_list) - END_DDX_MAP() - - LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); - LRESULT OnCopy(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnCtlColorStatic(HDC, HWND); - - void FillVersionList(); - void AddEntry(const TCHAR *path, const TCHAR *fallback_description); - - void AddItem(int item, int subitem, const TCHAR *text); -}; - -#endif // ABOUTPAGE_H \ No newline at end of file diff --git a/win32/FireflyShell/AdvancedPage.cpp b/win32/FireflyShell/AdvancedPage.cpp deleted file mode 100644 index a3e0646c..00000000 --- a/win32/FireflyShell/AdvancedPage.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/* -*(C) 2006 Roku LLC -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License Version 2 as published -* by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but -* without any warranty; without even the implied warranty of -* merchantability or fitness for a particular purpose. See the GNU General -* Public License for more details. -* -* Please read README.txt in the same directory as this source file for -* further license information. -*/ - -#include "stdafx.h" -#include "AdvancedPage.h" -#include "IniFile.h" -#include "FireflyShell.h" - -LRESULT CAdvancedPage::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ - CWaitCursor wait; - - IniFile ini(GetApplication()->GetConfigPath()); - m_server_port = ini.GetInteger(_T("general"), _T("port"), 9999); - - DoDataExchange(false); - m_port_spin.SetRange32(1, 65535); - - if(GetApplication()->IsServiceAutoStartEnabled()) - m_autostart_check.SetCheck(BST_CHECKED); - else - m_autostart_check.SetCheck(BST_UNCHECKED); - - if(GetApplication()->IsAppletAutoStartEnabled()) - m_autostart_icon_check.SetCheck(BST_CHECKED); - else - m_autostart_icon_check.SetCheck(BST_UNCHECKED); - - UpdateControls(); - - GetDlgItem(IDC_STARTSERVICE).SendMessage(BCM_SETSHIELD,0,TRUE); - GetDlgItem(IDC_STOPSERVICE).SendMessage(BCM_SETSHIELD,0,TRUE); - GetDlgItem(IDC_AUTOSTART).SendMessage(BCM_SETSHIELD,0,TRUE); - - GetApplication()->ServiceStatusSubscribe(this); - return 0; -} - -void CAdvancedPage::OnDestroy() { - GetApplication()->ServiceStatusUnsubscribe(this); -} - -void CAdvancedPage::UpdateControls() { - Service::Status status = GetApplication()->GetServiceStatus(); - UpdateControls(status); -} - -void CAdvancedPage::UpdateControls(Service::Status status) -{ - UINT state_id; - if (status.IsPending()) - { - state_id = IDS_SERVER_PENDING; - GetDlgItem(IDC_STARTSERVICE).ShowWindow(SW_HIDE); - GetDlgItem(IDC_STOPSERVICE).ShowWindow(SW_HIDE); - } - else if (status.IsRunning()) - { - state_id = IDS_SERVER_RUNNING; - GetDlgItem(IDC_STARTSERVICE).ShowWindow(SW_HIDE); - GetDlgItem(IDC_STOPSERVICE).ShowWindow(SW_SHOW); - } - else - { - state_id = IDS_SERVER_STOPPED; - GetDlgItem(IDC_STARTSERVICE).ShowWindow(SW_SHOW); - GetDlgItem(IDC_STOPSERVICE).ShowWindow(SW_HIDE); - } - - const bool can_configure = GetApplication()->CanConfigure(); - GetDlgItem(IDC_SERVERPORT).EnableWindow(can_configure); - GetDlgItem(IDC_PORTSPIN).EnableWindow(can_configure); - - // If we can't control the service then don't give the user - // the impression that we can. - const bool can_control = GetApplication()->CanControlService(); - GetDlgItem(IDC_STARTSERVICE).EnableWindow(can_control); - GetDlgItem(IDC_STOPSERVICE).EnableWindow(can_control); - GetDlgItem(IDC_AUTOSTART).EnableWindow(can_control); - - CString state; - state.LoadString(state_id); - if (!can_control) - { - CString s; - s.LoadString(IDS_NOT_ADMIN); - state += " "; - state += s; - } - - GetDlgItem(IDC_SERVERSTATE).SetWindowText(state); -} - -int CAdvancedPage::OnApply() -{ - CWaitCursor wait; - - ATLTRACE("CAdvancedPage::OnApply\n"); - - if (!DoDataExchange(true)) - return false; - - IniFile ini(GetApplication()->GetConfigPath()); - ini.SetInteger(_T("general"), _T("port"), m_server_port); - - GetApplication()->EnableServiceAutoStart(m_hWnd,m_autostart_check.GetCheck() == BST_CHECKED); - GetApplication()->EnableAppletAutoStart(m_hWnd,m_autostart_icon_check.GetCheck() == BST_CHECKED); - - // Incorrectly documented in WTL - return true; -} - -LRESULT CAdvancedPage::OnStartService(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ - GetApplication()->StartService(m_hWnd); - UpdateControls(); - return 0; -} - -LRESULT CAdvancedPage::OnStopService(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ - GetApplication()->StopService(m_hWnd); - UpdateControls(); - return 0; -} - -LRESULT CAdvancedPage::OnWebAdmin(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ - CWaitCursor wait; - - // Go to the config file because we might not have committed a change yet. - IniFile ini(GetApplication()->GetConfigPath()); - unsigned int port = ini.GetInteger(_T("general"), _T("port"), 9999); - - CString url; - url.Format(_T("http://localhost:%u/"), port); - - ::ShellExecute(m_hWnd, _T("open"), url, NULL, NULL, SW_SHOWNORMAL); - return 0; -} - -void CAdvancedPage::OnServiceStatus(Service::Status old_status, Service::Status new_status) -{ - UpdateControls(new_status); -} - diff --git a/win32/FireflyShell/AdvancedPage.h b/win32/FireflyShell/AdvancedPage.h deleted file mode 100644 index 0b9b0c14..00000000 --- a/win32/FireflyShell/AdvancedPage.h +++ /dev/null @@ -1,87 +0,0 @@ -/* -*(C) 2006 Roku LLC -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License Version 2 as published -* by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but -* without any warranty; without even the implied warranty of -* merchantability or fitness for a particular purpose. See the GNU General -* Public License for more details. -* -* Please read README.txt in the same directory as this source file for -* further license information. -*/ - -#ifndef ADVANCEDPAGE_H -#define ADVANCEDPAGE_H 1 - -#include "resource.h" -#include "ServiceControl.h" - -/// @todo Users shouldn't be able to paste non-numbers into the port number. - -class CAdvancedPage : - public CPropertyPageImpl, - public CWinDataExchange, - public ServiceStatusObserver -{ -public: - enum { IDD = IDD_PAGE_ADVANCED }; - -private: - typedef CPropertyPageImpl base; - - enum ServiceState - { - Pending = 0, - Running = 1, - Stopped = 2 - }; - - enum { TIMER_ID = 42 }; - - unsigned int m_server_port; - CUpDownCtrl m_port_spin; - CButton m_autostart_check; - CButton m_autostart_icon_check; - - void UpdateControls(Service::Status status); - void UpdateControls(); - - // ServiceStatusObserver - void OnServiceStatus(Service::Status old_status, Service::Status new_status); - - BEGIN_MSG_MAP(CAdvancedPage) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_HANDLER_EX(IDC_SERVERPORT, EN_CHANGE, OnChange) - COMMAND_ID_HANDLER(IDC_STARTSERVICE, OnStartService) - COMMAND_ID_HANDLER(IDC_STOPSERVICE, OnStopService) - COMMAND_ID_HANDLER(IDC_WEBADMIN, OnWebAdmin) - MSG_WM_DESTROY(OnDestroy) - CHAIN_MSG_MAP(base) - END_MSG_MAP() - - BEGIN_DDX_MAP(CAdvancedPage) - DDX_UINT(IDC_SERVERPORT, m_server_port); - DDX_CONTROL_HANDLE(IDC_PORTSPIN, m_port_spin); - DDX_CONTROL_HANDLE(IDC_AUTOSTART, m_autostart_check); - DDX_CONTROL_HANDLE(IDC_AUTOSTART_ICON, m_autostart_icon_check); - END_DDX_MAP() - - // MessageHandlers; - LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); - LRESULT OnStartService(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnStopService(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnWebAdmin(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - void OnDestroy(); - void OnTimer(UINT id, TIMERPROC proc); - int OnApply(); - void OnChange(UINT uCode, int nCtrlID, HWND hwndCtrl) { - // Lots of things could have changed. - SetModified(); - } -}; - -#endif // ADVANCEDPAGE_H \ No newline at end of file diff --git a/win32/FireflyShell/ConfigPage.cpp b/win32/FireflyShell/ConfigPage.cpp deleted file mode 100644 index ec264c37..00000000 --- a/win32/FireflyShell/ConfigPage.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#include "stdafx.h" -#include "ConfigPage.h" -#include "FireflyShell.h" -#include "IniFile.h" - -LRESULT CConfigPage::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ - CWaitCursor wait; - - IniFile ini(GetApplication()->GetConfigPath()); - - m_server_name = ini.GetString(_T("general"), _T("servername"), _T("Firefly media server")); - m_media_path = ini.GetString(_T("general"), _T("mp3_dir"), _T("C:\\Music")); - m_password = ini.GetString(_T("general"), _T("password"), _T("")); - - // Do this before we try and use the controls. - DoDataExchange(false); - - const bool enable_password = !m_password.IsEmpty(); - m_protect_checkbox.SetCheck(enable_password); - EnableControls(); - return 0; -} - -void CConfigPage::EnableControls() -{ - const bool enable = GetApplication()->CanConfigure(); - GetDlgItem(IDC_SERVERNAME).EnableWindow(enable); - GetDlgItem(IDC_PATH).EnableWindow(enable); - GetDlgItem(IDC_PROTECT).EnableWindow(enable); - GetDlgItem(IDC_BROWSE).EnableWindow(enable); - - const bool enable_password = (m_protect_checkbox.GetCheck() != 0) && enable; - GetDlgItem(IDC_PASSWORD).EnableWindow(enable_password); - //GetDlgItem(IDC_PASSWORD_PROMPT).EnableWindow(enable_password); -} - -int CConfigPage::OnApply() -{ - CWaitCursor wait; - - ATLTRACE("CConfigPage::OnApply\n"); - if (!DoDataExchange(true)) - return false; - - IniFile ini(GetApplication()->GetConfigPath()); - ini.SetString(_T("general"), _T("servername"), m_server_name); - ini.SetString(_T("general"), _T("mp3_dir"), m_media_path); - ini.SetString(_T("general"), _T("password"), m_password); - - // Incorrectly documented in WTL - return true; -} - -LRESULT CConfigPage::OnBrowse(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ - CFolderDialog folder; - - // Who cares if it fails. - DoDataExchange(true); - - folder.SetInitialFolder(m_media_path); - - if (folder.DoModal() == IDOK) - { - m_media_path = folder.GetFolderPath(); - DoDataExchange(false); - } - - return 0; -} - -void CConfigPage::OnClickProtect(UINT uCode, int nCtrlID, HWND hwndCtrl) -{ - EnableControls(); - SetModified(); -} \ No newline at end of file diff --git a/win32/FireflyShell/ConfigPage.h b/win32/FireflyShell/ConfigPage.h deleted file mode 100644 index 5a5f8640..00000000 --- a/win32/FireflyShell/ConfigPage.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#ifndef CONFIGPAGE_H -#define CONFIGPAGE_H 1 - -#include "resource.h" - -class CMainDlg; - -class CConfigPage : - public CPropertyPageImpl, - public CWinDataExchange -{ - typedef CPropertyPageImpl base; - -public: - enum { IDD = IDD_PAGE_BASIC }; - -private: - CString m_media_path; - CString m_server_name; - CString m_password; - CButton m_protect_checkbox; - - void EnableControls(); - - BEGIN_MSG_MAP(thisClass) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_ID_HANDLER(IDC_BROWSE, OnBrowse) - COMMAND_HANDLER_EX(IDC_PROTECT, BN_CLICKED, OnClickProtect) - COMMAND_HANDLER_EX(IDC_PASSWORD, EN_CHANGE, OnChange) - COMMAND_HANDLER_EX(IDC_SERVERNAME, EN_CHANGE, OnChange) - COMMAND_HANDLER_EX(IDC_PATH, EN_CHANGE, OnChange) - CHAIN_MSG_MAP(base) - END_MSG_MAP() - - BEGIN_DDX_MAP(CConfigPage) - DDX_TEXT(IDC_PATH, m_media_path); - DDX_TEXT(IDC_SERVERNAME, m_server_name); - DDX_TEXT(IDC_PASSWORD, m_password); - DDX_CONTROL_HANDLE(IDC_PROTECT, m_protect_checkbox); - END_DDX_MAP() - - // Message handlers - LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); - LRESULT OnBrowse(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - void OnClickProtect(UINT uCode, int nCtrlID, HWND hwndCtrl); - int OnApply(); - void OnChange(UINT uCode, int nCtrlID, HWND hwndCtrl) - { - // Lots of things could have changed. - SetModified(); - } -}; - -#endif // CONFIGPAGE_H \ No newline at end of file diff --git a/win32/FireflyShell/DosPath.cpp b/win32/FireflyShell/DosPath.cpp deleted file mode 100644 index 5eb770e6..00000000 --- a/win32/FireflyShell/DosPath.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* - * (C) 1997, 2006 Mike Crowe - * - * License: Do what you like with it except claim that you wrote it. - */ - -#include "stdafx.h" -#include "dospath.h" -#include -#include - -CDosPath::CDosPath(const TCHAR *pszPath, int nFlags) -{ - SetPath(pszPath, nFlags); -} - -CDosPath::CDosPath(const CDosPath &old) -{ - m_drive = old.m_drive; - m_dir = old.m_dir; - m_file = old.m_file; - m_ext = old.m_ext; -} - -CDosPath &CDosPath::operator=(const CDosPath &old) -{ - m_drive = old.m_drive; - m_dir = old.m_dir; - m_file = old.m_file; - m_ext = old.m_ext; - return *this; -} - -CDosPath::~CDosPath() -{ -} - -void CDosPath::SplitPath(const TCHAR *path) -{ -#if USE_SECURE - _tsplitpath_s(path, m_drive.GetBufferSetLength(_MAX_DRIVE), _MAX_DRIVE, - m_dir.GetBufferSetLength(_MAX_DIR), _MAX_DIR, - m_file.GetBufferSetLength(_MAX_FNAME), _MAX_FNAME, - m_ext.GetBufferSetLength(_MAX_EXT), _MAX_EXT); -#else - _tsplitpath(path, m_drive.GetBufferSetLength(_MAX_DRIVE), - m_dir.GetBufferSetLength(_MAX_DIR), - m_file.GetBufferSetLength(_MAX_FNAME), - m_ext.GetBufferSetLength(_MAX_EXT)); -#endif - - m_ext.ReleaseBuffer(); - m_file.ReleaseBuffer(); - m_dir.ReleaseBuffer(); - m_drive.ReleaseBuffer(); -} - -void CDosPath::SetPath(const TCHAR *pszPath, int nFlags) -{ - if (nFlags & PATH_ONLY) - { - CString temp(pszPath); - temp += '\\'; - SplitPath(temp); - } - else - SplitPath(pszPath); -} - -CDosPath &CDosPath::operator|=(CDosPath &fullpath) -{ - if (m_drive.IsEmpty()) - { -// TRACE1("Inserting drive %s\n", fullpath.m_szDrive); - m_drive = fullpath.m_drive; - } - if (m_dir.IsEmpty()) - { -// TRACE1("Inserting directory %s\n", fullpath.m_szDir); - m_dir = fullpath.m_dir; - } - if (m_file.IsEmpty()) - { -// TRACE1("Inserting file %s\n", fullpath.m_szFile); - m_file = fullpath.m_file; - } - if (m_ext.IsEmpty()) - { -// TRACE1("Inserting extension %s\n", fullpath.m_szExt); - m_ext = fullpath.m_ext; - } - return *this; -} - -CDosPath CDosPath::operator|(CDosPath &fullpath) -{ - CDosPath temp(GetPath()); - temp |= fullpath; - return temp; -} - -CString CDosPath::GetPath() const -{ - CString temp; -#if USE_SECURE - _tmakepath_s(temp.GetBufferSetLength(_MAX_PATH), _MAX_PATH, m_drive, m_dir, m_file, m_ext); -#else - _tmakepath(temp.GetBufferSetLength(_MAX_PATH), m_drive, m_dir, m_file, m_ext); -#endif - temp.ReleaseBuffer(); - return temp; -} - -CString CDosPath::GetPathOnly() const -{ - CString temp; -#if USE_SECURE - _tmakepath_s(temp.GetBufferSetLength(_MAX_PATH), _MAX_PATH, m_drive, m_dir, NULL, NULL); -#else - _tmakepath(temp.GetBufferSetLength(_MAX_PATH), m_drive, m_dir, NULL, NULL); -#endif - temp.ReleaseBuffer(); - return temp; -} - -CDosPath CDosPath::CurrentPath() -{ - TCHAR szBuffer[_MAX_PATH]; - _tgetcwd(szBuffer, _MAX_PATH); - return CDosPath(szBuffer, PATH_ONLY); -} - -CDosPath CDosPath::AppPath() -{ - TCHAR szBuffer[_MAX_PATH]; -#ifdef _MFC - GetModuleFileName(AfxGetApp()->m_hInstance, szBuffer, _MAX_PATH); -#else - GetModuleFileName(GetModuleHandle(NULL), szBuffer, _MAX_PATH); -#endif - return CDosPath(szBuffer); -} - -CDosPath CDosPath::WindowsPath() -{ - TCHAR szBuffer[_MAX_PATH]; - GetWindowsDirectory(szBuffer, _MAX_PATH); - return CDosPath(szBuffer, PATH_ONLY); -} - -#ifdef MAKE_EXE -#include - -void main(int ac, char *av[]) -{ - if (ac != 3) - { - printf("Usage: dospath incomplete complete\n"); - return; - } - CDosPath a = av[1]; - CDosPath b = av[2]; - a |= b; - printf("%s |= %s = %s\n", av[1], av[2], (const char *) a.GetPath()); - printf("\n\n\n\n"); - a = CDosPath::CurrentPath(); - printf("Current = %s\n", (const char *)a.GetPath()); - a = CDosPath::AppPath(); - printf("App = %s\n", (const char *)a.GetPath()); - a = CDosPath::TempPath(); - printf("Temp = %s\n", (const char *)a.GetPath()); -} -#endif diff --git a/win32/FireflyShell/DosPath.h b/win32/FireflyShell/DosPath.h deleted file mode 100644 index 0704efff..00000000 --- a/win32/FireflyShell/DosPath.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * (C) 1997, 2006 Mike Crowe - * - * License: Do what you like with it except claim that you wrote it. - */ - -#ifndef DOSPATH_H -#define DOSPATH_H - -class CDosPath -{ - CString m_drive; - CString m_dir; - CString m_file; - CString m_ext; - - void SplitPath(const TCHAR *buffer); - -public: - enum { PATH_ONLY = 1 }; - - CDosPath(const TCHAR *pszPath, int nFlags = 0); - CDosPath(const CDosPath &old); - ~CDosPath(); - - CDosPath &operator|=(CDosPath &fullpath); - CDosPath operator|(CDosPath &fullpath); - - CDosPath &operator=(const CDosPath &old); - CString GetPath() const; - CString GetPathOnly() const; - void SetPath(const TCHAR *pszBuffer, int nFlags = 0); - - static CDosPath CurrentPath(); - static CDosPath AppPath(); - static CDosPath TempPath(); -#ifdef _WINDOWS - static CDosPath WindowsPath(); -#endif - - CString GetFile() - { - return m_file; - } - CString GetExt() - { - return m_ext; - } -}; - -#endif // DOSPATH_H \ No newline at end of file diff --git a/win32/FireflyShell/FireflyShell.DEU.rc b/win32/FireflyShell/FireflyShell.DEU.rc deleted file mode 100644 index dfb41f345458b807a15af32f25163d6a624758e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20912 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 diff --git a/win32/FireflyShell/FireflyShell.cpp b/win32/FireflyShell/FireflyShell.cpp deleted file mode 100644 index b2690d92..00000000 --- a/win32/FireflyShell/FireflyShell.cpp +++ /dev/null @@ -1,394 +0,0 @@ -/* -*(C) 2006 Roku LLC -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License Version 2 as published -* by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but -* without any warranty; without even the implied warranty of -* merchantability or fitness for a particular purpose. See the GNU General -* Public License for more details. -* -* Please read README.txt in the same directory as this source file for -* further license information. -*/ - -#include "stdafx.h" - -#include - -#include "resource.h" -#include "FireflyShell.h" -#include "DosPath.h" -#include "ServiceControl.h" -#include "MainDlg.h" -#include "ServerEvents.h" -#include "IniFile.h" - -CAppModule _Module; - -#define RUN_KEY _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run") -#define RUN_VALUE _T("FireflyShell") - -Application::Application() -: m_dlg(NULL), m_server_events(&m_icon) -{ - CDosPath path = CDosPath::AppPath(); - SetCurrentDirectory(path.GetPathOnly()); - CDosPath filename(_T("mt-daapd.conf")); - filename |= path; - m_config_path = filename.GetPath(); - ATLTRACE("Config path: %s\n", (const TCHAR *)m_config_path); - - - // Dump an ini file with drive mappings - CDosPath mapfile(_T("mapping.ini")); - mapfile |= path; - m_ini_path = mapfile.GetPath(); - - /* Load the proper language dll, if possible */ - LANGID lidDefault = GetUserDefaultLangID(); - int iBaseLanguage = lidDefault & 0xFF; - iBaseLanguage = GetPrivateProfileInt(_T("shell"),_T("lang_id"),iBaseLanguage,m_ini_path); - - TCHAR tempPath[24]; - wsprintf(tempPath,_T("FireflyShell-%02x.dll"),iBaseLanguage); - CDosPath langlib(tempPath); - langlib |= path; - - HMODULE hLangDLL; - if((hLangDLL=LoadLibrary(langlib.GetPath())) != NULL) { - _AtlBaseModule.SetResourceInstance(hLangDLL); - } - - TCHAR inbuffer[4]; - TCHAR outbuffer[2048]; /* as max_path is unreliable */ - DWORD size; - UNIVERSAL_NAME_INFO * puni = (UNIVERSAL_NAME_INFO *) &outbuffer; - - for(int x='A'; x<='Z'; x++) { - wsprintf(inbuffer,_T("%c:\\"),x); - memset(outbuffer,0,sizeof(outbuffer)); - size = sizeof(outbuffer); - WNetGetUniversalName(inbuffer,UNIVERSAL_NAME_INFO_LEVEL,outbuffer, - &size); - wsprintf(inbuffer,_T("%c"),x); - WritePrivateProfileString(_T("mapping"),inbuffer,puni->lpUniversalName, - mapfile.GetPath()); - } - - - // We don't care if this fails. We can deal with that later. - m_service.Open(_T("Firefly Media Server")); - - CheckCanConfigure(); - - m_unique_name = GenerateUniqueName(); - m_registered_activation_message = ::RegisterWindowMessage(m_unique_name); -} - -Application::~Application() -{ - ATLASSERT(m_dlg == NULL); -} - -void Application::CheckCanConfigure() -{ - IniFile ini(m_config_path); - m_configurable = ini.IsWritable(); -} - -int Application::Run(LPCTSTR lpstrCmdLine, int nCmdShow) -{ - if (ActivatePreviousInstance(lpstrCmdLine, nCmdShow)) - { - ATLTRACE(_T("Already running\n")); - return 0; - } - - CMessageLoop theLoop; - _Module.AddMessageLoop(&theLoop); - - if (!m_icon.Create()) - { - ATLTRACE(_T("Icon creation failed!\n")); - return 0; - } - - EnableServerEvents(true); - - if (ShowDialogAtStart(lpstrCmdLine, nCmdShow)) - Configure(false); - - int nRet = theLoop.Run(); - - EnableServerEvents(false); - - m_icon.Destroy(); - - _Module.RemoveMessageLoop(); - return nRet; -} - -void Application::Exit() -{ - if (m_dlg) - { - m_dlg->DestroyWindow(); - } - ::PostQuitMessage(0); -} - -void Application::Configure(bool move_window) -{ - if (m_dlg) - { - m_dlg->ShowWindow(SW_RESTORE); - SetForegroundWindow(m_dlg->m_hWnd); - } - else - { - CheckCanConfigure(); - - // Other people may need to talk to the dialog while it exists. - CMainDlg dlg(move_window); - m_dlg = &dlg; - dlg.DoModal(); - m_dlg = NULL; - } -} - -void Application::StartService(HWND hwndParent) -{ - CWaitCursor wc; - ATLASSERT(m_service.CanControl()); - if (!m_service.CanControl()) - return; - - if (!m_service.StartAndWait()) - { - MessageBox(hwndParent, IDS_SERVERSTARTFAIL, MB_OK); - } -} - -void Application::StopService(HWND hwndParent) -{ - CWaitCursor wc; - ATLASSERT(m_service.CanControl()); - if (!m_service.CanControl()) - return; - - if (!m_service.StopAndWait()) - { - MessageBox(hwndParent, IDS_SERVERSTOPFAIL, MB_OK); - } -} - -void Application::RestartService(HWND hwndParent) -{ - CWaitCursor wc; - StopService(hwndParent); - StartService(hwndParent); -} - -bool Application::ShowDialogAtStart(LPCTSTR cmdline, int nCmdShow) -{ - if ((cmdline[0] == '-') && (cmdline[1] == 'q')) - return false; - - switch (nCmdShow) - { - case SW_RESTORE: - case SW_SHOW: - case SW_SHOWMAXIMIZED: - case SW_SHOWNORMAL: - case SW_SHOWDEFAULT: - case SW_MAX: - return true; - - default: - return false; - } -} - -BOOL CALLBACK Application::StaticWindowSearcher(HWND hwnd, LPARAM lparam) -{ - DWORD result; - LRESULT ok = ::SendMessageTimeout(hwnd, - static_cast(lparam), - 0, 0, - SMTO_BLOCK | - SMTO_ABORTIFHUNG, - 200, - &result); - if (ok == 0) - return TRUE; // ignore this and continue - - // If we get the magic response then we must have found our Window - // so we can give up. - if (result == lparam) - return FALSE; - else - return TRUE; -} - -bool Application::ActivatePreviousInstance(LPCTSTR lpstrCmdLine, int nCmdShow) -{ - HANDLE h = ::CreateMutex(NULL, TRUE, m_unique_name); - const bool running = (GetLastError() == ERROR_ALREADY_EXISTS); - - if (h != NULL) - { - ::ReleaseMutex(h); - } - - // It seems that getting the other window to activate itself does - // actually work even though Windows anti-focus-stealing stuff - // could try and stop it. - if (running && ShowDialogAtStart(lpstrCmdLine, nCmdShow)) - { - EnumWindows(StaticWindowSearcher, m_registered_activation_message); - return true; - } - - return running; -} - -CString Application::GenerateUniqueName() -{ - // We need to allow one instance to run per desktop. See - // http://www.codeproject.com/cpp/avoidmultinstance.asp - - // First start with some application unique - CString s(_T("Firefly-67A72768-4154-417e-BFA0-FA9B50C342DE")); - - // Now append something desktop unique - DWORD len; - HDESK desktop = GetThreadDesktop(GetCurrentThreadId()); - BOOL result = GetUserObjectInformation(desktop, UOI_NAME, NULL, 0, &len); - DWORD err = ::GetLastError(); - if(!result && err == ERROR_INSUFFICIENT_BUFFER) - { /* NT/2000/XP */ - LPBYTE data = new BYTE[len]; - result = GetUserObjectInformation(desktop, UOI_NAME, data, len, &len); - s += _T("-"); - s += (LPCTSTR)data; - delete [ ] data; - } /* NT/2000/XP */ - else - { /* Win9x */ - s += _T("-Win9x"); - } /* Win9x */ - return s; -} - -void Application::EnableServerEvents(bool b) -{ - if (b) - m_server_events.Start(); - else - m_server_events.Stop(); -} - -CString Application::MakeRunKeyValue() -{ - CString required_path("\""); - required_path += CDosPath::AppPath().GetPath(); - required_path += "\" -q"; - return required_path; -} - -void Application::EnableServiceAutoStart(HWND hwnd, bool enable) { - int required_startup = enable ? SERVICE_AUTO_START : SERVICE_DEMAND_START; - - if (m_service.GetStartup() != required_startup) { - if (!m_service.ConfigureStartup(required_startup)) { - MessageBox(hwnd, IDS_FAILED_CONFIGURE_SERVICE, MB_OK); - } - } -} - -void Application::EnableAppletAutoStart(HWND hwnd, bool enable) { - HKEY hkey; - LONG result = ::RegOpenKeyEx(HKEY_CURRENT_USER, RUN_KEY, 0, KEY_SET_VALUE | STANDARD_RIGHTS_WRITE, &hkey); - if (result == ERROR_SUCCESS) { - if (enable) { - // We need to quote it because the path may contain spaces. - CString str = MakeRunKeyValue(); - result = RegSetValueEx(hkey, RUN_VALUE, 0UL, REG_SZ, reinterpret_cast(static_cast(str)), (str.GetLength() + 1) * sizeof(TCHAR)); - } else { - result = RegDeleteValue(hkey, RUN_VALUE); - if (result == ERROR_FILE_NOT_FOUND) - result = 0; - } - - if (result != ERROR_SUCCESS) { - ATLTRACE("Error:%u\n", result); - MessageBox(hwnd, IDS_FAILED_CONFIGURE_STARTUP, MB_OK); - } - } -} - -bool Application::IsServiceAutoStartEnabled() const { - return (m_service.GetStartup() == SERVICE_AUTO_START); -} - -bool Application::IsAppletAutoStartEnabled() const { - bool run_result = false; - HKEY hkey; - if (::RegOpenKeyEx(HKEY_CURRENT_USER, RUN_KEY, 0, KEY_QUERY_VALUE | STANDARD_RIGHTS_READ, &hkey) == ERROR_SUCCESS) - { - DWORD dwType, cbData; - TCHAR buffer[_MAX_PATH + 1]; - cbData = (_MAX_PATH + 1) * sizeof(TCHAR); - if (::RegQueryValueEx(hkey, RUN_VALUE, NULL, &dwType, reinterpret_cast(buffer), &cbData) == ERROR_SUCCESS) - { - CString path(buffer, cbData - sizeof(TCHAR)); - ATLTRACE("Registry run key path: %s\n", (const TCHAR *)path); - - if (path == MakeRunKeyValue()) - run_result = true; - else - { - // It's there - but it isn't us that it will start. - - // But from the user's perspective, it *is* us, so to make the perception - // match the setting, we'll make this true, rather than some indeterminate - // thing which nobody understands. -- Ron - - run_result = true; - } - } - else - { - // The key doesn't exist. - run_result = false; - } - } - else - run_result = false; - - return run_result; -} - -int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow) -{ - // this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used - ::DefWindowProc(NULL, 0, 0, 0L); - - AtlInitCommonControls(ICC_BAR_CLASSES); // add flags to support other controls - - HRESULT hRes = _Module.Init(NULL, hInstance); - ATLASSERT(SUCCEEDED(hRes)); - - int nRet; - { - // Application object is destroyed prior to undoing everything above. - Application app; - nRet = app.Run(lpstrCmdLine, nCmdShow); - } - - _Module.Term(); - return nRet; -} diff --git a/win32/FireflyShell/FireflyShell.exe.manifest b/win32/FireflyShell/FireflyShell.exe.manifest deleted file mode 100644 index f0d52335..00000000 --- a/win32/FireflyShell/FireflyShell.exe.manifest +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/win32/FireflyShell/FireflyShell.h b/win32/FireflyShell/FireflyShell.h deleted file mode 100644 index 1071108f..00000000 --- a/win32/FireflyShell/FireflyShell.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#ifndef FIREFLYSHELL_H -#define FIREFLYSHELL_H 1 - -#include "singleton.h" -#include "NotifyIcon.h" -#include "ServiceControl.h" -#include -#include -#include "ServerEvents.h" - -class CMainDlg; - -/// The main application. Not a window. -class Application : public Singleton -{ - CNotifyIcon m_icon; - CMainDlg *m_dlg; - CString m_config_path; - CString m_ini_path; - Service m_service; - ServiceStatusMonitor m_service_monitor; - ServerEvents m_server_events; - CString m_unique_name; - UINT m_registered_activation_message; - bool m_configurable; - - /// Returns true if a previous instance was found. Only - /// actually activates a previous instance if nCmdShow - /// indicates so. - bool ActivatePreviousInstance(LPCTSTR cmdline, int nCmdShow); - - /// Helper for ActivatePreviousInstance. - static BOOL CALLBACK Application::StaticWindowSearcher(HWND hwnd, LPARAM lparam); - - /// Generate a unique name that can be used to detect multiple instances. - static CString GenerateUniqueName(); - - // Depending on how the application was launched we display the dialog or not. - static bool ShowDialogAtStart(LPCTSTR cmdline, int nCmdShow); - - static CString MakeRunKeyValue(); - -public: - Application(); - ~Application(); - - /// Gets the application going - int Run(LPCTSTR lpstrCmdLine, int nCmdShow); - - /// mt-daapd.conf path - CString GetConfigPath() - { - return m_config_path; - } - - /// Registered message used to activate other instances - UINT GetRegisteredActivationMessage() const - { - return m_registered_activation_message; - } - - // Pass true to move the window so it is near the mouse - // cursor. - void Configure(bool move_window); - void Exit(); - - // Service control - void StartService(HWND hwndParent); - void StopService(HWND hwndParent); - void RestartService(HWND hwndParent); - - Service::Status GetServiceStatus() - { - Service::Status status; - if (m_service.IsOpen()) - { - m_service.GetStatus(&status); - } - return status; - } - - // Expensive - only do it just before displaying the dialog box. - void CheckCanConfigure(); - - // Cheap. - bool CanConfigure() const - { - // We need to both rewrite the config file and - // control the service if we're going to be - // useful. - return m_configurable && m_service.CanControl(); - } - - bool CanControlService() const - { - return m_service.CanControl(); - } - - void CheckServiceStatus() - { - m_service_monitor.Poll(&m_service); - } - - void ServiceStatusSubscribe(ServiceStatusObserver *obs) - { - m_service_monitor.Subscribe(obs); - } - - void ServiceStatusUnsubscribe(ServiceStatusObserver *obs) - { - m_service_monitor.Unsubscribe(obs); - } - - CString GetServiceBinaryPath() const - { - return m_service.GetBinaryPath(); - } - - /// Used to disable listening for events from the server when this user is - /// not active. - void EnableServerEvents(bool); - - /// Enable/disable automatic startup of service and FireflyShell. - void EnableAppletAutoStart(HWND, bool); - void EnableServiceAutoStart(HWND, bool); - - /// Reports 0 for disabled, 1 for enabled - bool IsAppletAutoStartEnabled() const; - bool IsServiceAutoStartEnabled() const; - - int MessageBox(HWND hwnd, UINT id, UINT flags) - { - CString title, text; - ATLVERIFY(title.LoadString(IDR_MAINFRAME)); - ATLVERIFY(text.LoadString(id)); - return ::MessageBox(hwnd, text, title, flags); - } -}; - -inline Application *GetApplication() { return Application::GetInstance(); } - -#endif // FIREFLYSHELL_H diff --git a/win32/FireflyShell/FireflyShell.rc b/win32/FireflyShell/FireflyShell.rc deleted file mode 100644 index 280a1fda..00000000 --- a/win32/FireflyShell/FireflyShell.rc +++ /dev/null @@ -1,294 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "atlres.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 ""atlres.h""\r\0" -END - -3 TEXTINCLUDE -BEGIN - "#ifndef APSTUDIO_INVOKED\r\n" - "#include ""version.rc""\r\n" - "#endif // !APSTUDIO_INVOKED\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MAINFRAME ICON "res\\FireflyShell.ico" -IDI_SHELL_RUNNING ICON "res\\shellrunning.ico" -IDI_SHELL_STOPPED ICON "res\\shellstopped.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_PAGE_ABOUT DIALOGEX 0, 0, 300, 228 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About" -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN - CTEXT "For help, tips and troubleshooting advice...",IDC_FIREFLYLINK,12,92,276,9,NOT WS_GROUP - GROUPBOX "Version information",IDC_STATIC,6,121,288,100 - CONTROL "",IDC_VERSIONLIST,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,12,132,276,68 - PUSHBUTTON "&Copy to Clipboard",IDC_COPY,192,203,96,14 - CONTROL 208,IDC_LOGO,"Static",SS_BITMAP | SS_CENTERIMAGE | SS_SUNKEN | WS_BORDER,6,7,288,73 - CTEXT "For information on Firefly compatible music players...",IDC_ROKULINK,12,106,276,9,NOT WS_GROUP -END - -IDD_PAGE_BASIC DIALOGEX 0, 0, 300, 230 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Library" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - LTEXT "Library &Name",IDC_STATIC,12,24,74,8 - EDITTEXT IDC_SERVERNAME,86,21,202,14,ES_AUTOHSCROLL - LTEXT "Media &Location",IDC_STATIC,12,61,74,8 - EDITTEXT IDC_PATH,86,57,202,14,ES_AUTOHSCROLL - PUSHBUTTON "&Browse...",IDC_BROWSE,228,76,60,14 - GROUPBOX "Security",IDC_STATIC,7,113,287,103 - CONTROL "&Protect Firefly media library with a password",IDC_PROTECT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,135,276,10 - LTEXT "Pass&word",IDC_STATIC,12,156,74,8 - EDITTEXT IDC_PASSWORD,86,154,114,14,ES_PASSWORD | ES_AUTOHSCROLL - LTEXT "You can limit access to your music library by assigning a password. If a password is assigned, only clients that provide the correct password will be able to play music from your library.",IDC_STATIC,12,180,276,26,SS_NOPREFIX -END - -IDD_PAGE_LOG DIALOGEX 0, 0, 300, 220 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Log" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - EDITTEXT IDC_LOG,6,6,288,189,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL | WS_HSCROLL - PUSHBUTTON "&Refresh",IDC_REFRESH,244,200,50,14 -END - -IDD_PAGE_ADVANCED DIALOGEX 0, 0, 300, 220 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Server" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Server Status",IDC_STATIC,6,7,288,82 - LTEXT "Current state of the server goes here",IDC_SERVERSTATE,12,28,199,25 - PUSHBUTTON "&Stop Server",IDC_STOPSERVICE,218,28,70,14 - CONTROL "&Start Firefly when Windows starts",IDC_AUTOSTART, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,59,252,10 - CONTROL "&Enable Firefly icon in system tray",IDC_AUTOSTART_ICON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,73,252,10 - GROUPBOX "Advanced",IDC_STATIC,6,93,288,61 - LTEXT "Server port number",IDC_STATIC,12,108,99,11 - EDITTEXT IDC_SERVERPORT,105,105,42,14,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_PORTSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,146,105,11,14 - LTEXT "You may need to change this if another program is already using this port.",IDC_STATIC,12,129,276,23 - GROUPBOX "Web administration",IDC_STATIC,6,159,288,54 - LTEXT "Firefly Media Server also provides a web administration interface.",IDC_STATIC,12,177,198,20 - PUSHBUTTON "&Open",IDC_WEBADMIN,218,177,70,14 - PUSHBUTTON "&Start Server",IDC_STARTSERVICE,218,28,70,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_PAGE_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 6 - RIGHTMARGIN, 294 - VERTGUIDE, 12 - VERTGUIDE, 131 - VERTGUIDE, 218 - VERTGUIDE, 288 - TOPMARGIN, 7 - BOTTOMMARGIN, 221 - END - - IDD_PAGE_BASIC, DIALOG - BEGIN - LEFTMARGIN, 6 - RIGHTMARGIN, 294 - VERTGUIDE, 12 - VERTGUIDE, 86 - VERTGUIDE, 131 - VERTGUIDE, 218 - VERTGUIDE, 288 - TOPMARGIN, 7 - BOTTOMMARGIN, 216 - END - - IDD_PAGE_LOG, DIALOG - BEGIN - LEFTMARGIN, 6 - RIGHTMARGIN, 294 - VERTGUIDE, 6 - VERTGUIDE, 12 - VERTGUIDE, 216 - VERTGUIDE, 288 - HORZGUIDE, 6 - HORZGUIDE, 214 - END - - IDD_PAGE_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 6 - RIGHTMARGIN, 294 - VERTGUIDE, 12 - VERTGUIDE, 105 - VERTGUIDE, 218 - VERTGUIDE, 288 - TOPMARGIN, 7 - BOTTOMMARGIN, 216 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -IDR_MAINFRAME ACCELERATORS -BEGIN - "N", ID_FILE_NEW, VIRTKEY, CONTROL - "O", ID_FILE_OPEN, VIRTKEY, CONTROL - "S", ID_FILE_SAVE, VIRTKEY, CONTROL - "P", ID_FILE_PRINT, VIRTKEY, CONTROL - "Z", ID_EDIT_UNDO, VIRTKEY, CONTROL - "X", ID_EDIT_CUT, VIRTKEY, CONTROL - "C", ID_EDIT_COPY, VIRTKEY, CONTROL - "V", ID_EDIT_PASTE, VIRTKEY, CONTROL - VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT - VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT - VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL - VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT - VK_F6, ID_NEXT_PANE, VIRTKEY - VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDM_CONTEXT MENU -BEGIN - POPUP "" - BEGIN - MENUITEM "&Configure Firefly Media Server...", ID_CONFIGURE - MENUITEM "E&xit", ID_EXIT - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDR_MAINFRAME "Firefly Media Server" - IDS_SERVER_RUNNING "The Firefly media server is currently running." - IDS_SERVER_STOPPED "The Firefly media server is not currently running." - IDS_SERVERSTARTFAIL "Failed to start Firefly Media Server." - IDS_SERVERSTOPFAIL "Failed to stop Firefly Media Server." - IDS_SERVER_PENDING "The Firefly media server is currently busy." - IDS_SERVER_START "&Start" - IDS_SERVER_STOP "&Stop" - IDS_SCAN_START "Scanning for media is in progress\n\nThis may take some time." - IDS_SCAN_STOP "Scanning for media is complete." - IDS_NOT_ADMIN "You must be logged in as a local administrator to start and stop the server." - IDS_QUERYSERVERRESTART "Changing the configuration will require a restart of the Firefly Media Server. Are you sure you want to do this?" - IDS_VERSIONINFO_DESCRIPTION "Description" - IDS_VERSIONINFO_VERSION "Version" - IDS_VERSIONINFO_PATH "Path" - IDS_FAILED_CONFIGURE_SERVICE "Failed to reconfigure service." -END - -STRINGTABLE -BEGIN - IDS_FAILED_CONFIGURE_STARTUP "Failed to reconfigure startup application." - IDS_LOG_NOLOG "Firefly server logging is not enabled." - IDS_LOG_OPENFAILED "Failed to open server log file '%s'." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (U.K.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDB_LOGO BITMAP "res\\logo.bmp" -#endif // English (U.K.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#ifndef APSTUDIO_INVOKED -#include "version.rc" -#endif // !APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/win32/FireflyShell/FireflyShell.vcproj b/win32/FireflyShell/FireflyShell.vcproj deleted file mode 100644 index 5b60eac7..00000000 --- a/win32/FireflyShell/FireflyShell.vcproj +++ /dev/null @@ -1,339 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/FireflyShell/FireflyShellDEU.vcproj b/win32/FireflyShell/FireflyShellDEU.vcproj deleted file mode 100644 index 137d93f8..00000000 --- a/win32/FireflyShell/FireflyShellDEU.vcproj +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/FireflyShell/FireflyShellFRA.rc b/win32/FireflyShell/FireflyShellFRA.rc deleted file mode 100644 index 3560540a0caf7fd9615476a76ad67bdab17b02d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21468 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 M%Z_`a7p?I9AD;=XPXGV_ diff --git a/win32/FireflyShell/FireflyShellFRA.vcproj b/win32/FireflyShell/FireflyShellFRA.vcproj deleted file mode 100644 index 930eaada..00000000 --- a/win32/FireflyShell/FireflyShellFRA.vcproj +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/FireflyShell/FireflyShellITA.rc b/win32/FireflyShell/FireflyShellITA.rc deleted file mode 100644 index 1303370ad37d239eaaed28d2fc4f1dac0c4cdf1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20610 zcmd^{`%fIn5y$)INckV;)`~BuAfLhSpCVWuhscA%l(23I+n^d`S7*lYBp2 zTTJ)t3_D}EyS1a$?(Dp}tE;~C=&GLi?|;4z--jZshxg$ioQ0EcuJ2*^sAD@ib{;Om z>u{vKe)yX{MR*t9hGTutbo`^XZ*=TTTkgBizXSa*v`1_2!>O*h7ycanq+Y&{+dDdX ztg}bD`c1sHH+KKM@N?+JtGV+|yzVgGN89sZ5VpfGyab}MaKbCZS zPT#6TCd&Y69*yoR`9FQ!a*7NY7vd8rI@Fjy4;RjLZ+E)3PF*3%9!vL*qE7y-(f(EP zz9($o3*Xhq`#jN}_mMl_WLoq__s@rA;m5RRTblAhdem1xd&1G0KD7I9eTv3AhiYR> zXx-CY8@m6yD-A!qlFDA#jR<`pTr!$9-Ls*4UTC`#@#;scl@(pFs&V}gX4Lbxu3Nae zr+USn&YE`Lk)^>Ry_1H#)_n)k6>zbq;~agf@y?2ZNBTOI=-3SFY%x9YFL{gGt{F~%|O!e)I= zA9dcO7d=yM%X;CJ@X^%!gB$dIc&!D>@nJL^k2p|rs(uu|2(@SOr0<30W9d1*wWm*W zD^)}n;TvgL)mv6+s+Y(e^B1Rq?;8lPy7*oSy&Rd_DKFG3%&4IcVb|6Z$Ai;{?7kSEuE)SX4-FcB8sy3m!U z@eU#}ys^o>&^D*bygPP|Na|d7+If&d>&T5h7z?c)=|eq$)mZ<%OILw`^+F#Q?k-|$IxgVnf`+cB2 z`!^^5@iexFWPa2gAb3$I0!d3cwj6Owo5VAAW?jb?WBV!YIlmk49O(Q&lnh39+0nl4 z7^p>N9%w>&J#&ujs6E6&jIMfZPxtOit{0N7;k~5mX&hNk_iwA!ZE?(Wds}+KOzKc~ z5D}#uxF3GiK0Vd@;J)azIYN$6-|LAlCu+SIX~Jpj0n2kL8-eY>17NL~dt8Y2BT<9i zoan=K=nL1qk=?^iy%kpZKr6ECO9IRK#|&**azQre@pGLg9-9fz;_qB|5+29B8J*n} z-7bX{-3uNDahy(hc@(sOjQrD6RF-;Atmv_L$Y`;gZe3G4!Onb?Y+sZ>4HV953%Zcc zY(yOV_TJ1M4kL|gS4aJ9AwHx%?1&3nlC5FK;@qLy?dcfSc}-NJ`OLiE%CitNbN`x- zfMvJ{Dz_qkK%SpLOID>N%zxpuBi%3ykG3QYdQTC{co)>NSu>Z&Z0wg&n@k>$bjwGD zPGFxGv>nEKbC1vqcO`eM*QI(hPuCZ6Ko#hJEg8JY_yQLP!UhyL9`1_@&|z|Tm`Q&U z*XJZBqH- z^oA(>Ae^KYEw`Cw(dR_XjBE$L=9Rr|c#57iVcqo=pS>lU$M1%4K}1ShhBvdw_k}#{ z1-&duN<I_lb0*jkmCoKNdYV8#!^%Fy=mN zw2#C`bnJ6R+r~~W2y@I~&Nc3F-Cu}Y#D~Cti?SFWa(FD7jQ=TzC;MgMnFHA$Vw#T; z@1>p2(ZtAS^}!EdH*FukkoGvq7vPNsag@xA4%BBM?Mmk&*uzrl_^DDG)7c)Fz>=Qp z^GRH*da*&|7T6~4n#rhi4QSf-q^CrMcuVpFGulrv-H-F3zAUlFJ7wJ2?8P5N&Y8Th z*D2p7>%w3(*1NT%&1GfypH+ShY}`cm(EvQ_uJo6f#r2-H(RC1E+fwtZ_n5`LJ*)7e zq;etYV+)S81tT9Keu;e#^dTxHVzy}KGG0$yoqF0Tvi4(qWO#ZnOYZYe+8jsPJsl&* zK(?~(JQ1$N>`-FufogmLm}1t=2%y3;1V-=AY7Lzre|i$5c&o~Im4V#CnLe&NRShr= zu^hv`u7Wy`GmIOS1)=wp8)ZGCca(PwcPu?QMTG>kt7`;%f2 zixa!VA6RBuhPs>2JO8NogPHm76L++Y08A1VH=Eb@8Q4?J3Ebna$GDWaxJ9ST`mu}G zX?}V|wQiV3dd#@WC?Y-69AC8YxLeW@uy6C|G?p@~@@v%(;wWq!7{k{-ioaODHdv+} zx+7akZ4j>izoFXlCYD40eX!jw_BoS{B{RYN(PpB|#ZnyPmd^aCML^7Hp9&A%{CGb` zTOiKz!ekh*`Pgb|{dg^_C=&&i^u5zrP-@vB?$4<#V|1sODADHtmM?i0wUxSCN^=`M zfji_7;8RIePJ!hue73;c(c;uuamhGFEK(Pzwuu@|K4+q1JYxJ5IYun7D}PFs%%W)W z>~NR6a;f_4#CSyp=Z}sMA6?1DW>R^4*oH$(8hPpMt5LPrEiCtzS0F5>__`ARkMn3x zw%sWCqq#-K224>w2IV=oChPvZFhXsJwJ*eFRV3$`$7ffw9+1quGS#2Sv3sgB#CF7R z;P_a!;Dh2bG^&{bkLE3lW;#sVozl?Ole>0eEj)K={9|?kAK5+}akY%;9Sga)O}#f+ zcGmdNa!T1`=n5Wl9(&5}c0(M)dq3d>xS?NnRX(ik^oYsfQ}IVtbK@@_xq3No|!e5lLY;4GOJ zDtyc%;r+uHFS`toupLdgIT>p{J0h=6l+Vf~5bm>~1KCP&&ngV_H8xYRl^2|$mVgJs zE80Bdo&J+;DrYrT&!^HrAC|wg>I3&$i;nX)Gl#j6^|RUWTqUb8S)X@B@4hI3BIbh3 z-mv|)F3xJVDbCzSV$UqDWkyRZ>p5ZOx7|2jwYX{aDz^YsfmxyF{H0pMJkMr~%;6@F z#_Tw8!~(noz?*R3}iuPBt2WO5*BO#wPR6IY)f_p@G2V}%4O-3)1k>}J}AUtQYw>h)Ng zT)X`q%W@CZwsQe$@xXOGG+q5bceKCWG^NY+%)aZcw+OsC+9$QwlDV{c;d-p3rTiqf zoR1*a6zA5sl*_u&*Dhr$0(CO@dNDCu8F5=oc=qT^)B0}m?P4L&t}d-xOj3t7;>fM= zQ^j7@w_SfNwB)w1tz4@)t*>30W4b2>aRYm2Unk$Q@*h+*BER=4zL>$PZg zFUDfK*Id6N3dv;Itdw^1xp#`(p6Kh+H`N;u(nM{yzPCH|%^VsHyPduVo%*I`MU+W? zuqq$+yN&y&7JYjrho>pX9I#HRuIH|OzwFd^U%fYtx%;^L9sBn6XSXr#olbpQ?V42s z^<3{F?;U9(YuP-*Qyq=z_f6zYE^C-Yq1LC(-pGYj$5HLGyPT~f zv5W@X`&IK1)3XnS?x)%E{4DvYi&_u9F7CKr^wrp`Xd{1powrWc8nTW!^`_TnExdKs z+AWDT)*;)PT-HFdHpHJfX`4YT*M`}1E*V^HA34Y~AB4 z-OCp}w(GnW$Y}p5TvGk#?FCi=Wc4KLjoVOOKmP8NvyPD`AeURfIF zzV%+#J*h@gUAOg*JQeybRy)x~EICy|ue5O%ejml7b+tn>0bV;zwHO)EBF9XhtZK>; zvIu4yo5uAId1*2QRFBzO2FX^NrHJh*R`GhRdm-<~o-;kvm@I-QSH`ESK(TfIlFpd# zu+^#@OUIJ0J8Ewi;QV~FriJRjwko%Lg4U0Gig-pMwgQ#aIc4Sf?+v&!j`-7ASQYA9 zybXbh6l(!jrHkd0e?6UHROOpayy{zLC7N2#k7Gl3qBQ-v?|L1{?<#3!rort_NjX$Lxjb3fmX$62X9+f(M)6W2zwupVD9@9-Fr zCxz?r;N(#?6^CAHr5?IzPR zAFNV>{` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/FireflyShell/FireflyShellJPN.rc b/win32/FireflyShell/FireflyShellJPN.rc deleted file mode 100644 index 1303370ad37d239eaaed28d2fc4f1dac0c4cdf1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20610 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/FireflyShell/FireflyShellNLD.rc b/win32/FireflyShell/FireflyShellNLD.rc deleted file mode 100644 index a069bae89c8f2f1d5b96c8938136c9d6588e6bd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20738 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 Zpsr5I;J8eODQCMviPT5E_lQ>b{vTB437Y@_ diff --git a/win32/FireflyShell/FireflyShellNLD.vcproj b/win32/FireflyShell/FireflyShellNLD.vcproj deleted file mode 100644 index 36467f8c..00000000 --- a/win32/FireflyShell/FireflyShellNLD.vcproj +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/FireflyShell/FireflyShellSWE.rc b/win32/FireflyShell/FireflyShellSWE.rc deleted file mode 100644 index 7d65d946a2162fc16cf4fea003e2398b5f5c4ac3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20652 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 diff --git a/win32/FireflyShell/FireflyShellSWE.vcproj b/win32/FireflyShell/FireflyShellSWE.vcproj deleted file mode 100644 index df5418cb..00000000 --- a/win32/FireflyShell/FireflyShellSWE.vcproj +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/FireflyShell/IniFile.h b/win32/FireflyShell/IniFile.h deleted file mode 100644 index 412dc4e8..00000000 --- a/win32/FireflyShell/IniFile.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#ifndef INIFILE_H -#define INIFILE_H -#include "DosPath.h" - -class IniFile -{ - CString m_path; - -public: - explicit IniFile(const CString &path) - : m_path(path) - { - } - - CString GetString(const TCHAR *section, const TCHAR *key, const TCHAR *defstring) - { - CString str; - ::GetPrivateProfileString(section, key, defstring, str.GetBuffer(512), 512, m_path); - str.ReleaseBuffer(); - return str; - } - - bool SetString(const TCHAR *section, const TCHAR *key, const TCHAR *value) - { - return ::WritePrivateProfileString(section, key, value, m_path) != 0; - } - - int GetInteger(const TCHAR *section, const TCHAR *key, int defvalue) - { - return ::GetPrivateProfileInt(section, key, defvalue, m_path); - } - - bool SetInteger(const TCHAR *section, const TCHAR *key, int value) - { - CString str; - str.Format(_T("%d"), value); - return ::WritePrivateProfileString(section, key, str, m_path) != 0; - } - - bool IsWritable() const - { - if (::WritePrivateProfileString(_T("Writability Test"), _T("Writability Test"), _T("Test"), m_path)) - { - // Remove it then. - ::WritePrivateProfileString(_T("Writability Test"), NULL, NULL, m_path); - return true; - } - else - return false; - } -}; -#endif // INIFILE_H diff --git a/win32/FireflyShell/LogPage.cpp b/win32/FireflyShell/LogPage.cpp deleted file mode 100644 index f31242f3..00000000 --- a/win32/FireflyShell/LogPage.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#include "stdafx.h" -#include "LogPage.h" -#include "FireflyShell.h" -#include "IniFile.h" - -LRESULT CLogPage::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ - LoadLog(); - return 0; -} - -LRESULT CLogPage::OnRefresh(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ - LoadLog(); - return 0; -} - -void CLogPage::LoadLog() -{ - CWaitCursor wait; - - const size_t MAX_LOG = 65000; - - IniFile ini(GetApplication()->GetConfigPath()); - - CString filename = ini.GetString(_T("general"), _T("logfile"), _T("")); - if (filename.IsEmpty()) - { - CString str; - str.LoadString(IDS_LOG_NOLOG); - GetDlgItem(IDC_LOG).SetWindowText(str); - } - else - { - FILE *fp = _tfopen(filename, _T("r")); - if (fp) - { - // Fathom the length - fseek(fp, 0, SEEK_END); - long len = ftell(fp); - if (len > MAX_LOG) - { - len = MAX_LOG; - fseek(fp, -len, SEEK_END); - } - else - { - fseek(fp, 0, SEEK_SET); - } - - char *buffer = new char[len + 1]; - size_t nread = fread(buffer, 1, len, fp); - ATLASSERT(nread < MAX_LOG); - buffer[nread] = 0; - fclose(fp); - - // Normalise the line endings. Not particularly efficient but - // it does work. It would be nice if we could cheaply tell - // CString to preallocate a certain size. - CString log(_T("Log file: ")); - log += filename; - log += _T("\r\n\r\n"); - - size_t n = 0; - while (n < nread) - { - switch (buffer[n]) - { - case '\r': - // Ignore - break; - case '\n': - log += _T("\r\n"); - break; - default: - log += buffer[n]; - break; - } - ++n; - } - - GetDlgItem(IDC_LOG).SetWindowText(log); - delete []buffer; - } - else - { - CString str; - str.Format(IDS_LOG_OPENFAILED, filename); - GetDlgItem(IDC_LOG).SetWindowText(str); - } - } -} - diff --git a/win32/FireflyShell/LogPage.h b/win32/FireflyShell/LogPage.h deleted file mode 100644 index 7e051be7..00000000 --- a/win32/FireflyShell/LogPage.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#ifndef LOGPAGE_H -#define LOGPAGE_H 1 - -#include "resource.h" - -class CLogPage : - public CPropertyPageImpl -{ - typedef CPropertyPageImpl base; - -public: - enum { IDD = IDD_PAGE_LOG }; - -private: - - // Message Handlers - BEGIN_MSG_MAP(CLogPage) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_HANDLER(IDC_REFRESH, BN_CLICKED, OnRefresh) - CHAIN_MSG_MAP(base) - END_MSG_MAP() - - LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); - LRESULT OnRefresh(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - - void LoadLog(); - -}; - -#endif // LOGPAGE_H \ No newline at end of file diff --git a/win32/FireflyShell/MainDlg.cpp b/win32/FireflyShell/MainDlg.cpp deleted file mode 100644 index d3ea0a61..00000000 --- a/win32/FireflyShell/MainDlg.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#include "stdafx.h" -#include "resource.h" - -#include "MainDlg.h" -#include "FireflyShell.h" - -CMainDlg::CMainDlg(bool move_window) - : m_window_move_required(move_window) -{ - this->AddPage(m_pageConfig); - this->AddPage(m_pageAdvanced); - this->AddPage(m_pageLog); - this->AddPage(m_pageAbout); - - ATLVERIFY(m_strTitle.LoadString(IDR_MAINFRAME)); - - this->SetTitle(m_strTitle); -} - -void CMainDlg::OnSheetInitialized() -{ - HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), - IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR); - SetIcon(hIcon, TRUE); - HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), - IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); - SetIcon(hIconSmall, FALSE); -} - -LRESULT CMainDlg::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) -{ - bool restart_service = false; - if (HIWORD(wParam) == BN_CLICKED) - { - const UINT id = LOWORD(wParam); - - if ((id == IDOK || id == ID_APPLY_NOW) - && GetDlgItem(ID_APPLY_NOW).IsWindowEnabled() - && GetApplication()->GetServiceStatus().IsRunning()) - { - CString title, text; - title.LoadString(IDR_MAINFRAME); - text.LoadString(IDS_QUERYSERVERRESTART); - if (MessageBox(text, title, MB_YESNO) != IDYES) - return 0; - restart_service = true; - } - } - - LRESULT result = base::OnCommand(uMsg, wParam, lParam, bHandled); - if (restart_service) - GetApplication()->RestartService(m_hWnd); - - return result; -} - -void CMainDlg::PositionWindow() -{ - POINT cursor_pt; - GetCursorPos(&cursor_pt); - - CRect desktop_rect; - if (SystemParametersInfo(SPI_GETWORKAREA, 0, &desktop_rect, 0)) - { - // Don't put it hard against the edge of the screen or task bar. - desktop_rect.DeflateRect(CSize(4, 4)); - - CRect window_rect; - GetWindowRect(&window_rect); - - // First move the window so that it's middle is at the cursor position. - CPoint pos; - - pos.x = cursor_pt.x - window_rect.Width()/2; - pos.y = cursor_pt.y - window_rect.Height()/2; - - // Now make that window appear on the work area but in case it doesn't fit prefer to fit the - // top left. - if (pos.x + window_rect.Width() > desktop_rect.right) - pos.x = desktop_rect.right - window_rect.Width(); - if (pos.y + window_rect.Height() > desktop_rect.bottom) - pos.y = desktop_rect.bottom - window_rect.Height(); - - if (pos.x < desktop_rect.left) - pos.x = desktop_rect.left; - if (pos.y < desktop_rect.top) - pos.y = desktop_rect.top; - - SetWindowPos(NULL, pos.x, pos.y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER); - } -} - -void CMainDlg::OnMove(CPoint pt) -{ - if (m_window_move_required) - { - // We don't want to recurse. - m_window_move_required = false; - PositionWindow(); - } - else - { - SetMsgHandled(false); - } -} \ No newline at end of file diff --git a/win32/FireflyShell/MainDlg.h b/win32/FireflyShell/MainDlg.h deleted file mode 100644 index 9484c21b..00000000 --- a/win32/FireflyShell/MainDlg.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#ifndef MAINDLG_H -#define MAINDLG_H 1 - -#include "ConfigPage.h" -#include "AdvancedPage.h" -#include "LogPage.h" -#include "AboutPage.h" - -class CMainDlg : public CPropertySheetImpl -{ - typedef CPropertySheetImpl base; - - CString m_strTitle; - - CConfigPage m_pageConfig; - CAdvancedPage m_pageAdvanced; - CLogPage m_pageLog; - CAboutPage m_pageAbout; - bool m_window_move_required; - - BEGIN_MSG_MAP(CMainDlg) - MESSAGE_HANDLER(WM_COMMAND, OnCommand) - MSG_WM_MOVE(OnMove) - CHAIN_MSG_MAP(base) - END_MSG_MAP() - - LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); - void OnMove(CPoint); - void PositionWindow(); - - void OnSheetInitialized(); - -public: - // Pass true if you want the window to be moved to near the mouse pointer. - // This is usually only the case if the window is displayed as a result of - // clicking on the shell notification icon. - CMainDlg(bool move_window); -}; - -#endif // MAINDLG_H \ No newline at end of file diff --git a/win32/FireflyShell/NotifyIcon.cpp b/win32/FireflyShell/NotifyIcon.cpp deleted file mode 100644 index fe008a48..00000000 --- a/win32/FireflyShell/NotifyIcon.cpp +++ /dev/null @@ -1,296 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#include "stdafx.h" -#include "resource.h" -#include "NotifyIcon.h" -#include "FireflyShell.h" - -CNotifyMsg::CNotifyMsg(UINT32 id, UINT32 intval, const CString &strval) { - this->id = id; - this->intval = intval; - this->strval = strval; -} - - -CNotifyIcon::CNotifyIcon() -{ - ZeroMemory(&m_nid, sizeof(NOTIFYICONDATA)); - m_nid.cbSize = sizeof(NOTIFYICONDATA); - m_nid.uID = ID_SHELLNOTIFY; - - m_running_icon = AtlLoadIcon(IDI_SHELL_RUNNING); - m_stopped_icon = AtlLoadIcon(IDI_SHELL_STOPPED); -} - -BOOL CNotifyIcon::Create() -{ - m_registered_activation_message = GetApplication()->GetRegisteredActivationMessage(); - - RECT rect = {0, 0, 0, 0}; - - // Hidden window. - if (base::Create(NULL, rect, _T("FireflyShellNotifyIconHidden"), WS_POPUP)) - { - m_nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP; - - InflictIconState(); - - //wcsncpy(niData.szTip, TEXT("Foo?"), sizeof(niData.szTip)); - m_nid.hWnd = m_hWnd; - m_nid.uCallbackMessage = PRIVATE_WM_NOTIFYICON; - - Shell_NotifyIcon(NIM_ADD, &m_nid); - - SetTimer(TIMER_ID, 5000, NULL); - - GetApplication()->ServiceStatusSubscribe(this); - - EnableUserSwitchNotifications(); - - return TRUE; - } - - return FALSE; -} - -void CNotifyIcon::Destroy() -{ - GetApplication()->ServiceStatusUnsubscribe(this); - KillTimer(TIMER_ID); - Shell_NotifyIcon(NIM_DELETE, &m_nid); - DestroyIcon(m_nid.hIcon); - - - base::DestroyWindow(); -} - -void CNotifyIcon::OnClose() -{ - // The only time this should happen is if something else explicitly - // sends us the message (such as the installer). We'll just - // exit completely. - GetApplication()->Exit(); -} - -void CNotifyIcon::PopupBalloon(CString &title, CString &text, DWORD flags) { - m_nid.uFlags |= NIF_INFO; - SafeStringCopy(m_nid.szInfoTitle, title, 64); - SafeStringCopy(m_nid.szInfo,text, 256); - m_nid.dwInfoFlags = flags; - m_nid.uTimeout = 10000; - Shell_NotifyIcon(NIM_MODIFY, &m_nid); -} - -void CNotifyIcon::PopupBalloon(UINT title_id, UINT text_id, DWORD flags) { - CString title, text; - title.LoadString(title_id); - text.LoadString(text_id); - - PopupBalloon(title, text, flags); -} - -void CNotifyIcon::Update() -{ - InflictIconState(); - // I suspect we'll need this line too. - // m_nid.uFlags &= ~NIF_INFO; - Shell_NotifyIcon(NIM_MODIFY, &m_nid); -} - -void CNotifyIcon::InflictIconState() -{ - // Will the icons leak? - Service::Status status = GetApplication()->GetServiceStatus(); - UINT state_id; - if (status.IsPending()) - { - state_id = IDS_SERVER_PENDING; - m_nid.hIcon = m_stopped_icon; // As good as any? - } - else if (status.IsRunning()) - { - state_id = IDS_SERVER_RUNNING; - m_nid.hIcon = m_running_icon; - } - else - { - state_id = IDS_SERVER_STOPPED; - m_nid.hIcon = m_stopped_icon; - } - - CString tip; - tip.LoadString(state_id); - SafeStringCopy(m_nid.szTip, tip, 64); -} - -void CNotifyIcon::OnServiceStatus(Service::Status old_status, Service::Status new_status) -{ - Update(); -} - -void CNotifyIcon::OnTimer(UINT id, TIMERPROC proc) -{ - if (id == TIMER_ID) - { - GetApplication()->CheckServiceStatus(); - } -} - -LRESULT CNotifyIcon::OnNotifyIconMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) -{ - switch (lParam) - { - case WM_LBUTTONDBLCLK: - GetApplication()->Configure(true); - bHandled = true; - return 0L; - case WM_RBUTTONDOWN: - case WM_CONTEXTMENU: - OnContextMenu(); - bHandled = true; - return 0L; - } - - return 0L; -} - -void CNotifyIcon::OnContextMenu() -{ - HMENU hMenu; - - HINSTANCE hInstance = _Module.GetResourceInstance(); - hMenu = ::LoadMenu(hInstance, MAKEINTRESOURCE(IDM_CONTEXT)); - - POINT pt; - GetCursorPos(&pt); - - // See TrackPopupMenu in MSDN. - SetForegroundWindow(m_hWnd); - //::SetForegroundWindow(m_hWnd); - HMENU hPopup = GetSubMenu(hMenu, 0); - ::SetMenuDefaultItem(hPopup, ID_CONFIGURE, FALSE); - TrackPopupMenu(hPopup, TPM_LEFTALIGN | TPM_BOTTOMALIGN, pt.x, pt.y, 0, m_hWnd, NULL); - ::PostMessage(m_hWnd, WM_NULL, 0, 0); - - ::DestroyMenu(hMenu); -} - -LRESULT CNotifyIcon::OnConfigure(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ - GetApplication()->Configure(true); - return 0; -} - -LRESULT CNotifyIcon::OnExit(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ - /// @todo - Application::GetInstance()->Exit(); - return 0; -} - -LRESULT CNotifyIcon::OnRegisteredActivation(UINT, WPARAM, LPARAM, BOOL &bHandled) -{ - ATLTRACE(_T("Activate\n")); - bHandled = true; - GetApplication()->Configure(false); - - // We return a magic number so that the caller knows we've been found - // and can give up. - return m_registered_activation_message; -} - -void CNotifyIcon::OnServerEvent(UINT32 id, UINT32 intval, const CString &strval) { - // Note that we're running on a different thread here. We need to punt - // the event over to the main thread using SendMessage. - CNotifyMsg *pMsgNew = new CNotifyMsg(id, intval,strval); - - switch (id) { - case 0: - case 1: - case 2: - SendMessage(WM_SERVEREVENT, id, (LPARAM) pMsgNew); - break; - default: - ATLASSERT(false); - break; - } -} - -LRESULT CNotifyIcon::OnServerEvent(UINT, WPARAM wparam, LPARAM lparam, BOOL &bHandled) { - CNotifyMsg *pMsgNotify = (CNotifyMsg *)lparam; - bHandled = true; - CString title; - - title.LoadString(IDR_MAINFRAME); - -// CString title, text; -// title.LoadString(title_id); - - switch (wparam) { - case 0: - if(pMsgNotify->GetIntval() == 0) - PopupBalloon(title,pMsgNotify->GetStrval()); - break; - case 1: - PopupBalloon(IDR_MAINFRAME, IDS_SCAN_START); - break; - case 2: - PopupBalloon(IDR_MAINFRAME, IDS_SCAN_STOP); - break; - } - delete(pMsgNotify); - return 0; -} - -void CNotifyIcon::EnableUserSwitchNotifications() -{ - HMODULE h = ::LoadLibrary(_T("WtsApi32.dll")); - if (h) - { - typedef BOOL (WINAPI *Proc)(HWND, DWORD); - Proc fn = reinterpret_cast(GetProcAddress(h, "WTSRegisterSessionNotification")); - if (fn) - { - (*fn)(m_hWnd, NOTIFY_FOR_THIS_SESSION); - } - ::FreeLibrary(h); - } -} - -LRESULT CNotifyIcon::OnSessionChange(UINT, WPARAM wparam, LPARAM, BOOL &bHandled) -{ - // Because only one process can get events through the mailslot we - // disconnect from it when the user uses XP fast user switching to - // switch to a different user. - switch (wparam) - { - case WTS_CONSOLE_CONNECT: - case WTS_REMOTE_CONNECT: - ATLTRACE("SESSION CONNECT\n"); - GetApplication()->EnableServerEvents(true); - break; - - case WTS_CONSOLE_DISCONNECT: - case WTS_REMOTE_DISCONNECT: - ATLTRACE("SESSION DISCONNECT\n"); - GetApplication()->EnableServerEvents(false); - break; - } - bHandled = true; - return 0; -} - diff --git a/win32/FireflyShell/NotifyIcon.h b/win32/FireflyShell/NotifyIcon.h deleted file mode 100644 index b809869c..00000000 --- a/win32/FireflyShell/NotifyIcon.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#ifndef NOTIFYICON_H -#define NOTIFYICON_H - -#include "ServiceControl.h" -#include "ServerEvents.h" - -class CNotifyMsg { - UINT32 id; - UINT32 intval; - CString strval; - -public: - CNotifyMsg(UINT32 id, UINT32 intval, const CString &strval); - CString &GetStrval(void) { return strval; }; - UINT32 GetIntval(void) { return intval; }; -}; - - -class CNotifyIcon - : public CWindowImpl, - public ServiceStatusObserver, - public ServerEvents::Observer -{ - typedef CWindowImpl base; - - NOTIFYICONDATA m_nid; - HICON m_running_icon; - HICON m_stopped_icon; - UINT m_registered_activation_message; - - enum { TIMER_ID = 43 }; - enum { WM_SERVEREVENT = WM_APP + 42 }; - - enum { PRIVATE_WM_NOTIFYICON = WM_USER + 42 }; - - BEGIN_MSG_MAP(CNotifyIcon) - MESSAGE_HANDLER(PRIVATE_WM_NOTIFYICON, OnNotifyIconMessage) - COMMAND_ID_HANDLER(ID_CONFIGURE, OnConfigure) - COMMAND_ID_HANDLER(ID_EXIT, OnExit) - MESSAGE_HANDLER(m_registered_activation_message, OnRegisteredActivation) - MESSAGE_HANDLER(WM_SERVEREVENT, OnServerEvent) - MESSAGE_HANDLER(WM_WTSSESSION_CHANGE, OnSessionChange) - MSG_WM_TIMER(OnTimer) - MSG_WM_CLOSE(OnClose) - END_MSG_MAP() - - // Message handlers - void OnContextMenu(); - LRESULT OnNotifyIconMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); - LRESULT OnConfigure(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnExit(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnRegisteredActivation(UINT, WPARAM, LPARAM, BOOL &bHandled); - LRESULT OnServerEvent(UINT, WPARAM, LPARAM, BOOL &bHandled); - LRESULT OnSessionChange(UINT, WPARAM, LPARAM, BOOL &bHandled); - void OnTimer(UINT id, TIMERPROC proc); - void OnClose(); - - void PopupBalloon(UINT title_id, UINT text_id, DWORD flags = NIIF_INFO); - void PopupBalloon(CString &title, CString &text, DWORD flags = NIIF_INFO); - - void InflictIconState(); - void Update(); - - // Terminal services stuff on XP. - void EnableUserSwitchNotifications(); - - // ServiceStatusObserver - void OnServiceStatus(Service::Status old_status, Service::Status new_status); - - // ServerEvents::Observer - void OnServerEvent(UINT32 id, UINT32 intval, const CString &str); - -public: - CNotifyIcon(); - BOOL Create(); - void Destroy(); - -}; - -#endif // NOTIFYICON_H \ No newline at end of file diff --git a/win32/FireflyShell/README.txt b/win32/FireflyShell/README.txt deleted file mode 100644 index 0c7fe06b..00000000 --- a/win32/FireflyShell/README.txt +++ /dev/null @@ -1,17 +0,0 @@ -The FireflyShell source code is distributed under the terms of the GNU -General Public License Version 2 as published by the Free Software -Foundation. You can find a copy of this license in the -admin-root/gpl-license.txt file. - -This program uses the Microsoft Windows Template Library which is released -under the Common Public License. The copyright holders of FireflyShell -explicitly grant the additional right to distribute binaries produced from -source code derived from FireflyShell that are linked with the Microsoft -Windows Template Library. - -Note that you may not be able to incorporate third party GNU General Public -Licensed code into FireflyShell and then distribute binaries unless you have -a similar additional right from the copyright holder. - -You can find the Windows Template Library at -http://sourceforge.net/projects/wtl/ diff --git a/win32/FireflyShell/ServerEvents.cpp b/win32/FireflyShell/ServerEvents.cpp deleted file mode 100644 index 100f8d38..00000000 --- a/win32/FireflyShell/ServerEvents.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#include "stdafx.h" -#include "ServerEvents.h" - -ServerEvents::ServerEvents(Observer *obs) : - m_thread(INVALID_HANDLE_VALUE), - m_mailslot(INVALID_HANDLE_VALUE), - m_obs(obs) -{ -} - -ServerEvents::~ServerEvents() -{ - ATLASSERT(m_mailslot == INVALID_HANDLE_VALUE); - ATLASSERT(m_thread == INVALID_HANDLE_VALUE); -} - -bool ServerEvents::Start() -{ - ATLASSERT(m_mailslot == INVALID_HANDLE_VALUE); - ATLASSERT(m_thread == INVALID_HANDLE_VALUE); - ATLASSERT(m_obs != NULL); - - m_mailslot = ::CreateMailslot(_T("\\\\.\\mailslot\\FireflyMediaServer--67A72768-4154-417e-BFA0-FA9B50C342DE"), 0, MAILSLOT_WAIT_FOREVER, NULL); - - if (m_mailslot != INVALID_HANDLE_VALUE) - { - //m_thread = ::CreateThread(NULL, 0, &StaticThreadProc, this, 0, &thread_id); - m_thread = (HANDLE)_beginthreadex(NULL, 0, &StaticThreadProc, this, 0, NULL); - if (m_thread == NULL) - { - // Failed - ATLTRACE("beginthreadex failed: %d\n", errno); - ::CloseHandle(m_mailslot); - m_mailslot = INVALID_HANDLE_VALUE; - return false; - } - } - else - { - return false; - } - - return true; -} - -void ServerEvents::Stop() -{ - ATLASSERT(m_mailslot != INVALID_HANDLE_VALUE); - ATLASSERT(m_thread != INVALID_HANDLE_VALUE); - - // Force the thread to give up. This could be done with a separate event - // and overlapped IO but this is cheap. - CloseHandle(m_mailslot); - m_mailslot = INVALID_HANDLE_VALUE; - - // Wait for it to finish. - WaitForSingleObject(m_thread, INFINITE); - CloseHandle(m_thread); - m_thread = INVALID_HANDLE_VALUE; -} - -//DWORD ServerEvents::StaticThreadProc(LPVOID param) -unsigned ServerEvents::StaticThreadProc(void *param) -{ - return reinterpret_cast(param)->ThreadProc(); -} - -DWORD ServerEvents::ThreadProc() -{ - const size_t BUFFER_SIZE = 65536; - void *buffer = operator new(BUFFER_SIZE); - - bool finished = false; - while (!finished) - { - DWORD bytes_read; - if (ReadFile(m_mailslot, buffer, BUFFER_SIZE, &bytes_read, NULL)) - { - TCHAR *b = (TCHAR *)buffer; - b[bytes_read/sizeof(TCHAR)] = 0; - ATLTRACE("%ls\n", b); - - OnEvent(buffer, bytes_read); - } - else - { - ATLTRACE("Read failed: error %d\n", GetLastError()); - finished = true; - } - } - return 0; -} - -void ServerEvents::OnEvent(const void *buffer, size_t bytes_received) -{ - const BYTE *received = reinterpret_cast(buffer); - - if (bytes_received >= 12) - { - UINT32 packet_size = received[0] | (received[1] << 8) | (received[2] << 16) | (received[3] << 24); - UINT32 id = received[4] | (received[5] << 8) | (received[6] << 16) | (received[7] << 24); - UINT32 intval = received[8] | (received[9] << 8) | (received[10] << 16) | (received[11] << 24); - - int string_length = static_cast(bytes_received) - 12; - - if ((packet_size < bytes_received) && (packet_size >= 12)) - string_length = packet_size - 12; - - CString str; - if (string_length > 0) - { -#ifdef UNICODE - // It might be less that string_length long after conversion but it shouldn't be more unless - // our codepage is extremely weird. - - str.ReleaseBuffer(MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, reinterpret_cast(received + 12), - string_length, str.GetBufferSetLength(string_length), string_length)); -#else - SafeStringCopy(str.GetBufferSetLength(string_length), received + 12, string_length); -#endif - str.ReleaseBuffer(string_length); - } - - m_obs->OnServerEvent(id, intval, str); - } -} \ No newline at end of file diff --git a/win32/FireflyShell/ServerEvents.h b/win32/FireflyShell/ServerEvents.h deleted file mode 100644 index ad369ba4..00000000 --- a/win32/FireflyShell/ServerEvents.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#ifndef SERVEREVENTS_H -#define SERVEREVENTS_H - -class ServerEvents -{ -public: - /// Note that the observer is called on the wrong thread. - class Observer - { - public: - virtual void OnServerEvent(UINT32 id, UINT32 intval, const CString &str) = 0; - }; - -private: - - HANDLE m_thread; - HANDLE m_mailslot; - Observer *m_obs; - - static unsigned __stdcall StaticThreadProc(void *); - DWORD ThreadProc(); - - void OnEvent(const void *buffer, size_t length); - -public: - ServerEvents(Observer *obs); - ~ServerEvents(); - - void SetObserver(Observer *obs) - { - ATLASSERT(m_obs == NULL); - m_obs = obs; - } - - bool Start(); - void Stop(); -}; - -#endif // SERVICE \ No newline at end of file diff --git a/win32/FireflyShell/ServiceControl.cpp b/win32/FireflyShell/ServiceControl.cpp deleted file mode 100644 index c2469925..00000000 --- a/win32/FireflyShell/ServiceControl.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* -*(C) 2006 Roku LLC -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License Version 2 as published -* by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but -* without any warranty; without even the implied warranty of -* merchantability or fitness for a particular purpose. See the GNU General -* Public License for more details. -* -* Please read README.txt in the same directory as this source file for -* further license information. -*/ - -#include "stdafx.h" -#include "ServiceControl.h" -#include "DosPath.h" - -bool Service::ExecHelper(const TCHAR *szAction) { - SHELLEXECUTEINFO si; - ZeroMemory(&si,sizeof(si)); - - si.cbSize = sizeof(si); - si.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS; - si.hwnd = NULL; - si.lpVerb = _T("open"); - - CDosPath path = CDosPath::AppPath(); - CString strPath = path.GetPathOnly(); - si.lpDirectory = static_cast(strPath); - - CDosPath filename = CDosPath(_T("svcctrl.exe")); - filename |= path; - CString strFilename = filename.GetPath(); - - si.lpFile = static_cast(strFilename); - - CString strParams; - strParams.Format(_T("%s \"%s\""),szAction,m_name); - si.lpParameters = static_cast(strParams); - - si.nShow = 0; - - if(!ShellExecuteEx(&si)) - return false; - - WaitForSingleObject(si.hProcess, INFINITE); - - DWORD dwResult; - GetExitCodeProcess(si.hProcess,&dwResult); - - if(dwResult) - return false; - - return true; -} - -bool Service::Open(const TCHAR *name) -{ - Close(); - - const DWORD USER_ACCESS = SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE | STANDARD_RIGHTS_READ; - - DWORD dwDesiredAccess = USER_ACCESS; - - m_sc_manager = ::OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, dwDesiredAccess); - - if (!m_sc_manager) - m_can_control = false; - else - m_can_control = true; - - if (m_sc_manager) { - m_sc_service = ::OpenService(m_sc_manager, name, dwDesiredAccess); - if (m_sc_service) { - m_name = name; - return true; - } - } - - Close(); - return false; -} - -void Service::Close() { - if (m_sc_service) { - ::CloseServiceHandle(m_sc_service); - m_sc_service = NULL; - } - if (m_sc_manager) { - ::CloseServiceHandle(m_sc_manager); - m_sc_manager = NULL; - } -} - -bool Service::GetStatus(Status *status) const -{ - if (::QueryServiceStatus(m_sc_service, status)) - return true; - else - return false; -} - -bool Service::Start() -{ - if (ExecHelper(_T("start"))) - return true; - else - return false; -} - -bool Service::StartAndWait() -{ - if (Start()) - { - Status status; - return WaitPending(&status, SERVICE_START_PENDING); - } - else - return false; -} - -bool Service::Stop() -{ - Status status; - if (ExecHelper(_T("stop"))) - return true; - else - return false; -} - -bool Service::StopAndWait() -{ - Status status; - if (Stop()) - return WaitPending(&status, SERVICE_STOP_PENDING); - else - return false; -} - -bool Service::WaitPending(Status *status, DWORD existing_state) -{ - ATLTRACE(_T("Enter Service::WaitPending\n")); - if (GetStatus(status)) - { - DWORD dwStartTickCount = GetTickCount(); - DWORD dwOldCheckPoint = status->dwCheckPoint; - - while (status->dwCurrentState == existing_state) - { - ATLTRACE(_T("Service::WaitPending in loop\n")); - DWORD dwWaitTime = status->dwWaitHint / 10; - if (dwWaitTime < 1000) - dwWaitTime = 1000; - else if (dwWaitTime > 10000) - dwWaitTime = 10000; - - ATLTRACE(_T("Sleeping\n")); - ::Sleep(dwWaitTime); - - if (!GetStatus(status)) - { - ATLTRACE(_T("Service::WaitPending - Failed to get status\n")); - return false; - } - - // If we haven't changed state yet then check to see that the - // service is actually making progress. - if (status->dwCurrentState == existing_state) - { - if (status->dwCheckPoint != dwOldCheckPoint) - { - // The service is making progress - dwStartTickCount = GetTickCount(); - dwOldCheckPoint = status->dwCheckPoint; - } - else if (GetTickCount() - dwStartTickCount > status->dwWaitHint) - { - ATLTRACE(_T("Service::WaitPending - No progress\n")); - /// Hmm. No progress - return false; - } - } - } - } - ATLTRACE(_T("Service::WaitPending success\n")); - return true; -} - -CString Service::GetBinaryPath() const -{ - CString path; - - DWORD bytes_required; - ::QueryServiceConfig(m_sc_service, NULL, 0, &bytes_required); - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - void *buffer = operator new(bytes_required); - LPQUERY_SERVICE_CONFIG config = reinterpret_cast(buffer); - - if (::QueryServiceConfig(m_sc_service, config, bytes_required, &bytes_required)) - { - path = config->lpBinaryPathName; - } - - delete buffer; - } - return path; -} - -DWORD Service::GetStartup() const -{ - DWORD result = 0xffffffff; - const size_t BUFFER_SIZE = 8192; - void *buffer = operator new(BUFFER_SIZE); - LPQUERY_SERVICE_CONFIG config = reinterpret_cast(buffer); - - DWORD bytes_required; - if (::QueryServiceConfig(m_sc_service, config, BUFFER_SIZE, &bytes_required)) - result = config->dwStartType; - - delete buffer; - return result; -} - -bool Service::ConfigureStartup(DWORD startup) { - if(startup != GetStartup()) { // don't boost privs if we don't need to - if(startup == SERVICE_AUTO_START) { - return ExecHelper(_T("auto")); - } else { - return ExecHelper(_T("manual")); - } - } - return true; -} - -void ServiceStatusMonitor::Poll(Service *service) -{ - Service::Status new_status; - if (service->GetStatus(&new_status)) - { - if (!m_service_status.IsValid() || (m_service_status != new_status)) - { - FireServiceStatus(m_service_status, new_status); - m_service_status = new_status; - } - } -} diff --git a/win32/FireflyShell/ServiceControl.h b/win32/FireflyShell/ServiceControl.h deleted file mode 100644 index 82798591..00000000 --- a/win32/FireflyShell/ServiceControl.h +++ /dev/null @@ -1,174 +0,0 @@ -/* -*(C) 2006 Roku LLC -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License Version 2 as published -* by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but -* without any warranty; without even the implied warranty of -* merchantability or fitness for a particular purpose. See the GNU General -* Public License for more details. -* -* Please read README.txt in the same directory as this source file for -* further license information. -*/ - -#ifndef SERVICECONTROL_H -#define SERVICECONTROL_H - -class Service -{ - SC_HANDLE m_sc_manager; - SC_HANDLE m_sc_service; - bool m_can_control; - CString m_name; - -public: - - class Status : public SERVICE_STATUS - { - bool WaitPending(); - - public: - Status() - { - SERVICE_STATUS *clearable_this = this; - ZeroMemory(clearable_this, sizeof(SERVICE_STATUS)); - } - - bool operator==(const Status &r) const - { - const SERVICE_STATUS *lhs = this; - const SERVICE_STATUS *rhs = &r; - return memcmp(lhs, rhs, sizeof(SERVICE_STATUS)) == 0; - } - - bool operator!=(const Status &r) const - { - const SERVICE_STATUS *lhs = this; - const SERVICE_STATUS *rhs = &r; - return memcmp(lhs, rhs, sizeof(SERVICE_STATUS)) != 0; - } - - void AssertValid() const - { - // If we've been written then this shouldn't be zero. - ATLASSERT(dwCurrentState != 0); - } - - bool IsValid() const - { - return dwCurrentState != 0; - } - - bool IsRunning() const - { - AssertValid(); - return dwCurrentState == SERVICE_RUNNING; - } - - bool IsStopped() const - { - AssertValid(); - return dwCurrentState == SERVICE_STOPPED; - } - - bool IsPaused() const - { - AssertValid(); - return dwCurrentState == SERVICE_PAUSED; - } - - bool IsPending() const - { - AssertValid(); - switch (dwCurrentState) - { - case SERVICE_CONTINUE_PENDING: - case SERVICE_PAUSE_PENDING: - case SERVICE_START_PENDING: - case SERVICE_STOP_PENDING: - return true; - default: - return false; - } - } - }; - - Service() : m_sc_manager(NULL), m_sc_service(NULL), m_can_control(false) {} - ~Service() { Close(); } - - bool IsOpen() const - { - return m_sc_service != NULL; - } - bool Open(const TCHAR *name); - void Close(); - - bool GetStatus(Status *status) const; - - bool Start(); - bool StartAndWait(); - bool Stop(); - bool StopAndWait(); - bool WaitPending(Status *status, DWORD existing_state); - bool PollPending(Status *status, DWORD existing_state); - - bool CanControl() const - { - // For the time being - need to deal with running as a user that can't control. - return IsOpen() && m_can_control; - } - - CString GetBinaryPath() const; - - /// Pass SERVICE_AUTO_START, SERVICE_BOOT_START, SERVICE_DEMAND_START, - /// SERVICE_DISABLED or SERVICE_SYSTEM_START. - bool ConfigureStartup(DWORD dwStartup); - DWORD GetStartup() const; - -private: - bool ExecHelper(const TCHAR *szAction); -}; - -class ServiceStatusObserver -{ -public: - virtual void OnServiceStatus(Service::Status old_status, Service::Status new_status) = 0; -}; - -class ServiceStatusMonitor -{ - Service::Status m_service_status; - std::vector m_service_observers; - - void FireServiceStatus(Service::Status old_status, Service::Status new_status) - { - std::vector::iterator i = m_service_observers.begin(); - while (i != m_service_observers.end()) - { - (*i)->OnServiceStatus(old_status, new_status); - ++i; - } - } - -public: - void Poll(Service *service); - void Subscribe(ServiceStatusObserver *obs) - { - m_service_observers.push_back(obs); - } - - void Unsubscribe(ServiceStatusObserver *obs) - { - std::vector::iterator i = std::find(m_service_observers.begin(), m_service_observers.end(), obs); - ATLASSERT(i != m_service_observers.end()); - if (i != m_service_observers.end()) - { - m_service_observers.erase(i); - } - } - -}; -#endif // SERVICECONTROL_H diff --git a/win32/FireflyShell/VersionInfo.cpp b/win32/FireflyShell/VersionInfo.cpp deleted file mode 100644 index 52f81597..00000000 --- a/win32/FireflyShell/VersionInfo.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#include "stdafx.h" -#include "VersionInfo.h" - -bool VersionInfo::Open(const TCHAR *filename) -{ - Close(); - - DWORD useless; - m_size = GetFileVersionInfoSize(filename, &useless); - if (m_size) - { - m_buffer = operator new(m_size); - ::ZeroMemory(m_buffer, m_size); - if (GetFileVersionInfo(filename, 0, static_cast(m_size), m_buffer)) - { - return IdentifySubBlock(); - } - else - Close(); - } - return false; -} - -bool VersionInfo::IdentifySubBlock() -{ - m_subblock.Empty(); - WORD required_langid = LANGIDFROMLCID(GetUserDefaultLCID()); - - UINT cbTranslate; - struct LANGANDCODEPAGE - { - WORD wLanguage; - WORD wCodePage; - } *lpTranslate; - - - if (VerQueryValue(m_buffer, _T("\\VarFileInfo\\Translation"), - reinterpret_cast(&lpTranslate), - &cbTranslate)) - { - // Try and find the user's language, but if we can't then just use the - // first one in the file. - int lang_index = -1; - for(unsigned i=0; i < (cbTranslate/sizeof(struct LANGANDCODEPAGE)); i++ ) - { - // If we have an exact match then great. - if (lpTranslate[i].wLanguage == required_langid) - { - lang_index = i; - break; - } - // Otherwise settle for a primary language match and keep looking - else if ((PRIMARYLANGID(lpTranslate[i].wLanguage) == PRIMARYLANGID(required_langid)) && (lang_index < 0)) - { - lang_index = i; - } - } - if (lang_index < 0) - { - ATLTRACE("Failed to find a matching language. Just using the first one.\n"); - lang_index = 0; - } - - m_subblock.Format(_T("\\StringFileInfo\\%04x%04x\\"), lpTranslate[lang_index].wLanguage, lpTranslate[lang_index].wCodePage); - return true; - } - return false; -} - -void VersionInfo::Close() -{ - if (m_buffer) - { - delete m_buffer; - m_buffer = NULL; - } -} - -CString VersionInfo::GetString(const TCHAR *name) const -{ - CString path = m_subblock + name; - - LPVOID buffer; - UINT cb; - if (VerQueryValue(m_buffer, const_cast(static_cast(path)), &buffer, &cb)) - { - return CString(static_cast(buffer), cb); - } - return CString(); -} - -//CString VersionInfo::GetStringFileVersion() -//{ -// VerQueryValue(m_buffer, -//} \ No newline at end of file diff --git a/win32/FireflyShell/VersionInfo.h b/win32/FireflyShell/VersionInfo.h deleted file mode 100644 index 222cf765..00000000 --- a/win32/FireflyShell/VersionInfo.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#ifndef VERSIONINFO_H -#define VERSIONINFO_H - -class VersionInfo -{ - size_t m_size; - void *m_buffer; - CString m_subblock; - - bool IdentifySubBlock(); - - CString GetString(const TCHAR *name) const; - -public: - VersionInfo() : m_size(0), m_buffer(NULL) {} - - bool Open(const TCHAR *filename); - void Close(); - - CString GetFileDescription() const - { - return GetString(_T("FileDescription")); - } - - CString GetFileVersion() const - { - return GetString(_T("FileVersion")); - } -}; -#endif // VERSIONINFO_H diff --git a/win32/FireflyShell/localizations/dutch/dutch.ini b/win32/FireflyShell/localizations/dutch/dutch.ini deleted file mode 100644 index bd1364b082b1170c75fe0afb121c414593f4c4c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7192 zcmcJT*=}1^6o&UT67OJDBE3NsAaPltq_dPZRnw-W0UyDW6H=4>LJe(pnm) zQMyc%w3i;_pCxDJH1*T2#>e^(XS3$9A{|HRJbg~RG}Tj2@2BZVBLltlwP&}HB32%y zKQpbKX!Y}o#e0JOle}&qs(YgTRJ4&}U+?fdN;~2+%uie=8l6azy>zCxsn+&261vLN$*;<^d<9V$WVW5p~ueAMaT4Qrw_9&HRF6X!S;`_Qeg(hcoTB z^gh<^Bi%2wFQRZo`7jl|apo{D-DQ>np6|7DC~G(h@nr0p%y?W!sV@so7SJI&3$4Xc zZD!d&0| zxH9KGk7W0;e)te?T5EElCpq_Zwa=L;^7hh!X7Ob&`-1(J>3R0$SmP&Jah7R<1FXBy z9FcpF--FXdree8!nrCgzDyWZFgIL-o_yIndo|DAp4nQnPlmaf|~PL9LE|9o>bDJOP8nP z+*#Pg+MBsf#25Rwxmwe8NmirtN_r&;!A;wEEzft6)$3RpvEQb2-R`nuB>#Hlx@^a@ zrK9zLZ_$q6$J!>t0do{?69f+t!)Y|i13f(=yXDf3hP7AVh zBj5YW+Q|R*N@B;n-;3%^C}x^Btt>QumV_6wED=F{#Ty_b7R0BZ1Re(!z}L@tJt$FU zBD?CiALQP|v4VHO+d!Xgm-0Z=dg?i;J&U>+P|*m7B&J6t0ROPBd%T@2yQ`YzJ zw2GR5CLky}6Dw3Q_g(Yd6Lo|5Jk?ra4(S4iY>hymwl(N_z^>X_Z3_kFzSEi$+257e zl@Q8%vKjsWuX)ECbW7&*MN+vVyQ)(|T2N{%>c((7CRdMAjk-B&ZfNR$z`KW;hP|{Z zYhc~$sn}nk39=%EJ!XAP6N_TsphllS9MLzh2V5_GCtkx6$9bOmjiigZ(0MySuh{S^ ztMwIu1>LD)k$I6N)Gf{vNKXXXUPKbHhQDmPL-9lMqb8<@*@wta=D2zu=o!Q>(S52B zI=9`-!*woVASebFMg%?A4m3N-{E=*={p3h55huqQAxq%HIBRV;S3q|S$mKYR{y02R z=I7RimJKTi7fDaRDrBj(~U zda8Pj-@W3|EZzcFYfP&xSL%F?W?1z1oJF=Rp5%#~iZfXIEO2{!f#s`>&s;6&?!${Q zLe?7fjHKWbk?A=9snML%-f@oO=nx#GXdNd9pX^JlSYsl_5l)XWk#6jWsCFjS+O|(4 z%V|rsbrw=d1Et6cV;I`lZ;v&`Ihx+lmyY5z=$b<`73Pd~Ck1AgG&NT{OFXv6vuz_pFGS;jk`1Ubt z+iuQs-7#?6{r^@@Vs#l5FH*8I;{5KUY=0rVs+w4e+j1?r+NK_H>e}P%3`7fix<>$` z_~Pk4b9a`n^Ag;SB7GwDm`Y5y2jYN=$YI*XCC+tVueIf^d@tI}5kHhvQEPlYabFhS zV;sA2dIodoG9o`d3Xh@-tiR}TItvQO2s$uQIIGLcX8w- z2o3tsA@PKTcv?ns>rT&2$90go!SS))=6f?x*(YCDFxSPp*F;VvnfG{YtG4&U_RzwD z)K#B}2Et^%b%!?8pXDj@eFyITGR3zKpNFh%@zq^Q&KaP@+}+EM=kYb)sQ^;)tW`@Z09b86Z~(|rJoVkUH|v#hxDWV50jt1%e~+~9$Cfj diff --git a/win32/FireflyShell/localizations/dutch/dutch.lws b/win32/FireflyShell/localizations/dutch/dutch.lws deleted file mode 100644 index fc01937cbaa68217a7ff0c2211313e90f529da3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 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 diff --git a/win32/FireflyShell/localizations/german/german.ini b/win32/FireflyShell/localizations/german/german.ini deleted file mode 100644 index 0115d37fb91ed5601adf619cc193e521fc8cf730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7366 zcmb`L+ip`w6o%)zQs2Qss<|ojAoUVefe@ND1%v~oq*X;?C$ZuK^&u%dU!S2@z2q5s zh1&k#{Cj!Nww+)OiX3~-o>}v+)4$ftfBzn&t#n6!chjCekMy*k9_YK1eoddIPtrBL zyOwTM-yXSNjqvS}2h|AQ9(h=e@a>UKHNv+?o>U`zd*o>~!na4BRU>>ea*(#uu2Aj? z~^x6>qz(?y!5Ub>n8jJ&NibGj0t?yP?+UbWpv#)(7`ivH6+d?$b+(WJGNy3iSGvip#$n9(Iv1ag#|5J@l zwOcO@^)%Dm=Nd8U<+UBX8D=bl#rm#RPV}^|b<=c~ckNdaTN*o)%zir8hk0%NFR?z5 zZXUtE?ev#$9&1K()q+5>wBT+nXC?$mUaW>R2~{@ zPFQnU&mSv!pg7F(kP3oRy*ZPdVV2s`6IQhC+Ua3KI!LG4({Hr$m1dQiKhpEDF!VI% zbm7&lY_GZGu;WypRsVJ*jaXP`iHnR7zy6ewb%mN}1WBx#UgF*7ic6wyDCzjj*jw^S zy%rrlm$Zwl&DHz#BqegFt!$3{Tl$Sw=lQ=QtsG&;dUn%ljFTao%3y9pm~(6^$1j?C z=fCv~nn1dxs5qAeM)Dj{ST5 zi;N-n$X_skm)Y3jF#qo6To~neF?$d@HN)6m$6AFwZ&q4vj)eRplK4cv5#8)h?ltAN zWbrpbjKx^j5>H=_5Hya89U*2F`8|-%#5j7qs5Bl)irH~2f16v$+p+$bHKj?Wuny>%!$8a)=S z3++#aH1*xfc&S%r`gXdn-_!zUQvF=#&+SUblFcIqn({2;>iJ`N-ShT@l;8G5nOAM~ z31ivO_QeNY5p(b(jQ1p4hAM&8Pc;eyhs3BXZP}u%Truv^nw7}rqs&Y&R@C!OB^w_Q z>AZ^_n)&}C??T3nB!!yK8Y6Gcd|1u&Jgi@HX>(@DRO=))-`kR=XTkuN&$CWH3*}svB_{Aal|K3jSQ7T2M}co(;Fozm zSyN^utI9s-Fn2rdZu*KvkOnKQ_B}TxjXb43t?P^E4$bu-u{^3FJcW(jOCDwHMDVP_ zdz#~XxoXrk5Vo1i-}rZwoKV35*UO$$ZkAqS9q zCN3T6&-rKjQ%k6OQD43k~tuI{vU`?ye^3wbq_x zY50UF0#zWO0+bfQX6$mJc~}aBM#2*v?XqU%B}jadV6J`Dm0Y-Uo@2l=LEYCgv+#7( zQ0AgFEN$=6)nmm~bhZW687Xyzji{$4aSp-qL{vmMoEK{yFOER)5CtRc?M@19+?AYU z4e)wI>p&wt&Fdc3=aY zJ6)=zXU?*9hw1=`eXokRw9R95s3<+jS%!UxDWsqW)+ctnb8YDZb#-@D2_G*`rRJw# zG@miyJhGbDK+>lDSX5wF|K`auD%xr{+0Kzu?n&gbGr0K+bazz={}8h1&Ts3PII*6i zYTkjm)qUL%>`Kpj`n9Dz7rH<$Z>(ZCF?L zlEKjMciGr>GSf0f_ZKI)<{4pgKfvExmG@jBI5C7jV}#C$jE^kiJXmMfx0UAGniUl& za{kXnY}Ngyb(_eW)4amx0CEQp!5FSkaK)yYmFRy{LOexD_t#OG2zOpP?gMd@8B74IDr(&J&q)6*ny%P1qI$nL= z>*T1X6AaWo&%m&7lJ7dbf1Kdq9x^auucJ73*8pdsB~SIOkGYKgx?~sf!rez5XYYar zyk&m|BTUmT8s)Pu1V$ZwAbCLl3p3Hd^9!!#*Sl#lP(MUBJ6r5#W^y#dT?!{`5Yf$2 z8$lc0ocr%!ahRE#wu$D{wm^e*9aHI-X8eVhsLk$qX5uw^V5$!H@1bWi>S|A|c2vkD z-iDRUsPSl1o-JNyThQf|QTQ?OPlUgY(f8M4weo+sy(7PU3(~av$HKj8ee#to!#7uH z)x3o$8G+Nb`xJ9qeQqLFkn3}Cu$ns*XPr-JLlLF5ov`d?KIQ+cgagG- iX3SGR9+kFV?_PO}bIKhA>w7CMBJ>-n)LiJLY_2csaVhBl diff --git a/win32/FireflyShell/localizations/italian/italian.ini b/win32/FireflyShell/localizations/italian/italian.ini deleted file mode 100644 index 8279b3edc93188a41184b7a3da231187338c29ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7570 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 diff --git a/win32/FireflyShell/localizations/italian/italian.lws b/win32/FireflyShell/localizations/italian/italian.lws deleted file mode 100644 index f65e9953a1dc20589fc494679e6969f2b39916b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250 zcmb7;K?{OF6okLC&|g{d2Y3)6SP+Bs=%u1m*erBA_~)zH#h`0E=DlU+&CYwjEF%w| zcn%a~7*)IW9Rm{=t~eHIdcB>>h&{6*q2wrkhousNyOqa_b(%plnxhc5_c7<+G)qJN jlUZ=r#f#Fm>#rwfaZcBH!Nz_QmyyPeN@^`kQogPa1Xd~| diff --git a/win32/FireflyShell/localizations/japanese/japanese.ini b/win32/FireflyShell/localizations/japanese/japanese.ini deleted file mode 100644 index 65a69d2b6f8cd02a207408f031a0fd43335afa6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5972 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 diff --git a/win32/FireflyShell/localizations/japanese/japanese.lws b/win32/FireflyShell/localizations/japanese/japanese.lws deleted file mode 100644 index 7c0b1f30dfeb3ef800901ddf70e0298fb1881feb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 zcmb7<%?g505QV>W(5py2fGZ&|!XmeBDsF$6iq*oGuRg_S9m5$eXXczU_x(z#Xn68q zOF~R!6=Pp;p(Svnq$B6-yR;(N15+lf*r`8}l8IhjaFuHYK5$nN=~9V)e?27qo3~`6 l|1UM6HlZ_bHoERjs=X}ukKiSJzsbeShmFi>E?OsF)dy%~Dv|&I diff --git a/win32/FireflyShell/localizations/swedish/swedish.ini b/win32/FireflyShell/localizations/swedish/swedish.ini deleted file mode 100644 index 06ebbdb5dad1d48bdb159c3479d7fd1623f35c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7106 zcmcJU+iqJ$6o%&-iFdFf;ohK1AaPlt^pL6|X(HSc1cVajWD+~U&VjsNpMfW6U!j-4 z|INRbXSNTGONF9(@4aSb&07CD&h($Zchh=$q`xO=Q~!R{*Ne2RXD|JlzD!@FHI1#M z2hG!z=M9CYDccQ&rztxPg{LXKhQia7R}F=yDQ_AIPg8zwC_JI;rpM`-q}-I0PbKl2 zshr*PFpblBx=E9CnC|C4OU}qydY2CLH%@!gG4IfohUe)b-KI{u)LTd2XK5hHzP|Rf z;-HbCn|{bM2jUMO<_|RYOm8nmIc?TmOr`Hi!jWd~YvfR~HZ*^%wtKnxE=6Rk@d3H4SG)sA{z2JK(4oAY`toaI@yTbEA zqQ4vQs}b%= z-rH;`X3grhRq^lXeVnfIZ%25sGrN8eSM&(JVdWo1J<^Ipjh{@le3`X8kTjqJqD9-D zXxM*|rZ?ijE}isRdX2QVJr5hks>yVh!fBCKBiUp8QBGjBSgsm{@b>m@?HPdvbMX3( zBE8^Pb6^xJ&CW1~^&A~n;^H;ivOq|l@kld4@qVM*>XMvjC7Qg; zF@lEn*Ht6{C%k%I23u@HavCKtzDQqdKGI)ggt0uah*sx9-Pw<*JJ%ocMzWnT03Yi| z#=`pQNum*e_LL5KFYEWvj+y=Mtv4ra`Q0905V4oA7(#7 zYHWNaKDR=4EX`w2s%7Y~d`B|;?2h(9qAqsCXJW@wy-&0!m}A>g<*emqmXg?V#_gu( zdM7g)*N2T3XpLpz7jww_i?}RXS!SQhmY%gKzPy`HovXX5*XKgadV#iAwCC((y{J&Z zV@E5f65Y8vvAHDAlg;|F&{(=&$}--kCqFvX$T(+;l6mUfhc)qPGSEmIhO#&-fnqL>iauG4JJG-<}(BzG${3crD&{YBuTG?As#_yqE{drf<5_;jDX$AA>`8AJfDmcvC!B1Y=^P0d8}vUK%N-602=mc zcO3Uc>!_EczAPFi10q4qk7`D)17~+|{Vatmm*pkzqDMRbml{S^akX;~H7gf2BDzXE z5D6mp7>&p}Z8Yd@$X7L5ZGvBsH4Mshu+ z!@JBnhBe3}`=TOeon5@vQh|!?Yo632Q)YWMEVG?8SvG^JhBu%AdzeqVg70h89kTm! z+lUw?i-t^I4-Ets%R_H)rJd;H>kQlxl^&_s0UWRcxOLv^GGPrp@q#suf#=>5V`2TL5$z)hPN#RZ$^T5$Otts+)Z0LXFb;$ zEY7UXNP)0VcvOC}0<~e$S*)%_b@r~Sx=(;@PR3xilHbM6wtu3^_Gk7IOT4b{YuV;Z zQgVv02D|FfU+7H!OgcW*+q%xPoYq6zuEyicVLmk_xU7jc^XTjAS<&YQT92mwR(lAD z`K(${EY-ZuS)lueEGWL37Ki34}F)SLCo9svUnj?s_S&5wQ z8|~l9gYaN$Nv2Z2yXX4}BDTAAsa?LWqyTu}43 zriG-L=jT0XoiFNHMzn$iepqwjvIU4B3LS~;{=)%ZXzI}8@6DN4`5_?DNm~Y|0&7ki( zYA#3O<$Ko9fliW25uL}HDyq*gh1YUvkhkv8e8%}jRQ|n?)|NUtL9zj-R&o~Ehc~h~ zZ*5I%%e%CQou~_Rx_E1x0{j*Eos%lnvFM3(>_2P!8uPXvgazumJ)fEO#hsh(&|#M6 zmUap|_ViwAjk|t#-AL^7#s4GaIAaiY{jahXU;lh5BPxBrK@}mQjOph}>pRg!Fa3X0EY38pS(FYGUP1! Yqu*4m?BVY7ze(Sw@AU6MiZ`(S7e`Id(f|Me diff --git a/win32/FireflyShell/localizations/swedish/swedish.lws b/win32/FireflyShell/localizations/swedish/swedish.lws deleted file mode 100644 index ec5f9b1194fa84f7e43916dc38c85a9a191aca60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250 zcmb7BWe?Oy3K}HcRJPPD*Q!Zj(%RnMn>W`wHr4h_5l|tDo6kT diff --git a/win32/FireflyShell/res/FireflyShell.ico b/win32/FireflyShell/res/FireflyShell.ico deleted file mode 100644 index eeb5a025080c41cabcb83c2346da4648b53c7251..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35670 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 DnHjPq diff --git a/win32/FireflyShell/res/ShellRunning.ico b/win32/FireflyShell/res/ShellRunning.ico deleted file mode 100644 index eeb5a025080c41cabcb83c2346da4648b53c7251..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35670 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 DnHjPq diff --git a/win32/FireflyShell/res/ShellStopped.ico b/win32/FireflyShell/res/ShellStopped.ico deleted file mode 100644 index aa20e5182636e7f9c7c6a40e3d7943d7d7727aab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35670 zcmeI5eTbabb;hq_JGM*77~_7V4H`kzMiGXQ-4ALiJi=h1{!z9V8w#y?3xzZWshhN5 zR4|^GQl+KPtgu5VsOlR^C`Jz1l1jq(kIq)$1X82{{}qeYs}d?`9Wv^-QoDZpd)~Qs z_U@f~-+AX_cjZ>sdG_3U&U2n~&Yjua$+9~#<}UM5vwy$A-fv#L-XbQs`m}lZ<(ExS6y~+pUNf)1{S!@K3@&4gVbci}0`1T@U;N z@Q=ek0sjpA3w76HPQpJ8{~Y{_@UOtHxgK)~{$==A;a`J)1Afi*@O(J{j)N2641k}$ z9#dX|e;NK&_}AdyfS8vZ%>7vW!l&od?d?BO|l0RD0KJV(nj@Gpq}F#LTy z+Ya(5uR%NFL-4!spMn28{FmUr0{=YxOYkqlzY6~v z{2TC}fd3r)7vZ0U{|5ZG;opSM=M>N9lIL^D^SR{tdmzPOdv?LfPB6AbIgAOT zT^Jq{6o5M!w+dAt7Iq2~nPV~ALO_srPPK2C_gnw<@h`UC`>Xp}-@ks}+O6wX2Dd){C&OD^^BcGJnNPm|gXXUH zdHL}HFI&*~oigXk{Knm7d9yW9ORrOS2~)jR(d!|tquy&1Uc8JK$>yj2=s)j#&*mkE z_mbw$_w4^e-?Q~Pyvg@%J|E4gFRhw?&p&NGr%xce^mSPNQ}2D+{Id1y^TvnE`#It_ zA3bKC`P!jz&VlNa@tApaoflx%->OeErvr`S!mVGvETh@r%ZM z=WmSphu`CIh4X%!FW}?|`Z{|QWoXK!Hc$F9rQvQ@AK`VkcPdSC_cif-;YjIZ2ftsJ4b zk&(L&$~iC~XBD);96gY-(8|f43wrGII1a%)bH{QDwAx^Xo}ezYabBa;h|a$Wx32Fj(CSX% z*JL#)7h<9*XwuM{E9cdgKP(9-$Z*Aw1Mkc`yQC~ z_>^#bta}xd?g)d-BiXHm$WbT^H%?^Xr_tgMsCy;!XSVd73BIL!D1KzD8=lIbEAF@%phD zdmc9y5Bt!4tyrj+FkX0isXkJE<%W8(bGyDqa(>kfXY2-AVcf5;*;^i8`%U0Dg%=BF z>=Nq%*)ZmxrBO~nmexS3S~(w+@MrYraXEh6^)f&&#_ic&i<)|hIUU(Lu6hXhey;XC z;ChW%T($9Bam~0{!}ISTHM?{Qi&Ra;%LwF80N;J1D%kGbRKkeRM4P7jn8S;HLViR<#5)g8#+1?ylF^gth!5fu2E_9?Ef(XY=%wwZP>(9Ig; ziBnF&fOyN(DgwUFO?z}aU!y-qzSHq-FX*e}oK4Zz<1AhZ;q0znVRK}iFSJ=rOkAhY zpTdLdube{^EBMO@>iX!wPu)RkcGZ{WI!N_W5K}L*DUSS#*Xh_?%y{MOqUhpR%^0#o zj(1g0K&mFZaOF6n=;Qb6hWjj$m(uh7$_@1jPfzp82@aQfoJau@X#=&sag2X{a_+g8pg ziEfQ<*!LRTc0^0QVg{X1x5;@pMc=!FZNt~i?qdBZ+F^g<>n;kQx?y}L&YcFe>>bQJ zzqEIv=VfX3=ueMTtHB+tZB1Y0D6a{~yDjfvVCQx-OuK_VM7whAOi-<5J!Z?$8PZQD zGDF=RtlQydon8DkP|aoZz6^~lGP|2Ab_eRcv%vh)CjYj$gSy%MJ6NY*-F4sgzBT@M zmpgt_yVrNnWcHd_2yI(Arw;C#OF;29Xs8cu&sR@y^9&;KQ#2F_wb<^=uV?|Zs4}Rfr&S0i8)MH-rN}8 zC#Jl`OtKt(E4Sf2WaP&3UN8}RcUif4kC`c!*FV)tSzbp~%e_@a%HG|O=khJxnCo^I z+MCuttKG19DLYNCx?WvuUJ2b-@`gKlr-$*wqQ^xKiyk2RwmZ&lOuh|IMbrnqPsCyH zYrwrvM9zB--dX>jZy;y*6!!XFQhm+h->Dg9>0uG>GWuVn{%+*f&A1!&7p<|Q{df5M z)XxysK_6^_(psJ6SG)sgWF9QN{}z4pfa_KLHi7s(p!^wU@n@JdcN<^zhoDKnDUR}` zLsPSYl$mp?8g23hAl1`6e(6bfhMu6##ILkF2X?)bfw?0FK8of7uy5vDY-k@ zyPIu>8LIv>dTx@t8@)H_!`->FF2~u_`~z=J$K6S*dalPh8|xvQp|{JuyPj0Hu6M<< zL~m|}HgWBp<|1|zoj#ClqNBPku*eMS4Qti)qnAfozpkc>6@h+O&z;3{IWfD^P)B;1r`7lJe7|2~07o-+z!11t z!QS=P#ES27L))8CE3;Z*p7WPB?s|9qb*;aM)KjjTZ!Hp+hVse?`U$?P8?&mn8p)Gi zHNxJdu>uMZ>bV@{ImCF%lizWi-Hd34HDc!>d7VhE`fLS$@rGa!#4^sVkI*U>t6M~J zV!UZS)l*OEt&Xd>c&@(z`!-m$ew|&+*#cjkrs9q(TgOesT)ukiBsAn#+;M$7z~8cY zs~)GYzEoZ37tiTA-z?VU%Bsgsq;BTb@c9G$t$^R-Tm(M#BaO9)Uor8AiP*GR`s9@! zq|=FLslLw}aBc-WUJl`*#_%2trXW{$&eL>vUaIpdYRuJ=f;a*&q z8(Q_$nWCk*cwugnb78f!Ab-HQWn*E#v9oki_0(G@p(VfKsoW-h)$T_$2KZVa)^F(R zM)LjI>TwN-=TJ<^@$;wc)oY9+e+z{D#?H&^C)P{Kr@HDfHN$$t{-rSlsX9C1S3T9$ zeaa3%tWNB{W4@I{eoS*2zAp9rK4LRyCZ98HpY75NsuSzQpFzFr9OKpbc6x?X?}?sp zS1adZW30d(f^vzFo^)sF1FpYv4vo=ohZ*E2*~n%lKgv&`Ml0*SNC zvOt+#Nu4&!t~9Y=k-8Zcluo3Neqm_z8%LvmW2U^`wo2JV4-;;eKM~k_$A)d;y0z~2yGFkk$G__%Kfj$;{XSO@3!%Et5A@4+)xBEF zHFMVQY3&C`!T9&I9^|ml%E_Jw^Aw$@PAX^C`YD}x{Y~o6tKBp&)kD+#30|A$Le~QY zCODptZFJ>$8$XB&s4PG^g*m<%%}c(le!bdo7B$GkzTCM zG~a-{;4Z=*s-F|B!CL`gKdL>g#yn! z1*c2Z+(&HAV#d1SuUPaGxtsX?y8b@wK^jf(K8xrUi5}FWU)SIJJ&5O@ORKkz72G*i z+iAvnkk7?q*41oTo;$0apS#I9^R(93i!%T&SNh74-=WVwR@e8fz{xybhy9v&R?OEa zIF}v<9yiv5Un{onTCFV55m!D}tIvKN6kyZyXY4~=aY~CY7M{Bv*Vk&{A9^wAxwvAR z-dUQfKz^rRuvfl2r)(Ea=^^uSI_#yPxbN4#51eLUIRk9V^RESG#}BQmQCc18JC5`^ z-dQonTV-E(XZZ&}Im*}GKReCPh8ohztcK5(PqArG&5p;L)!IIJr)j-zq-XWu->1KC5gRV4hc&NG;c0Gqe!sTccZe_ALqAfZhi@IAKW$ad8}(Vv zfr1A6hu7W-&1E^*J8rGewzUyO&7O9Dq+#oMy$yb(fRfO*XkqnJ825K^Y-e93Df)Y~ zExcq()8jACdez^P>BkcLf%`ed(R(=5uAJx?u=9^v+{@q2S3l(${SE!3i1)Yk{8QLt z4PQ_DASRt0-LYSL`GlVbp8>xKj)NZn@_QN_xA@#;6@L`l2VBoKe4F#H0_9Y7Y|pQ8 z{w?c2jQtm&-1oru?cUdV9^Y7l{XbgHA7K9$@FS)Cf2>b={{+4c{=@os6N3CxKpL9m z0r2PGpTXCFa^3~feH-ip;ywxf6)66@Kt4S_viAesmG*xMjskr>I|9A{z6+%DGk~XM z{tcizP@cQj-)8?6APwcI&RHOxOW-HL4}o6*7lC+w{;zOW&KH3+KM#Hwya3e09|QIA z32+kpERcqK-1z6qtGT7|C2$b@A<)^!cR1^Ar1dzEhI`(8j=j&-UXP)`r%4t2D)uP& z9{78pe8FjO$p0IJIy&odifM{A6?be_SoLFgK>3tRdv<>*Y)vUReQew+2t>p z{CszZv2XLxiymV?$Hhp*W0zxbNHd-slg z>nHzYZ{NOU-~0KO?9H1u?Dgx{?A5DR?5Dr`5BuV8|6?y-zGN?6ykP%${|)=ipa09A zKYz}iJ$uIf`uA_x)2C0_lP6EuhYugvXTSItd-=z& z*bjd7o=vAyRfz51tpZyG9$bNH`&pa<bS)NmIhm7Fi)}hW`pRetcpI5NXJdg>pB&Xu^x`}{uZFZkm?{$sUod=j8 zS4*j6KRIwvB-b5ml7q`D{%M*ij%5sQHT6`ayG+}}V;NCIHXmpAK?aZUg-#om8)jH+ z8BWD}s&>ZFsCcGzs;#NGx7t+phFV+3P0>V>t9JzcSFqa{=~mJ__G^-SD6<_%-zEe@A(04YVYMKWmt&();}baqt!;b}sPPRTPE1T-iqqLJRD!XE zn;@-*4uqx5JOo)|J@391G9qF_0~yygu@k_CLXyWA5?cm10P|fQG2MaUq{;BK$pS?3 z`@te0rn_P+&4b~>Cq?9uhcyW4gz#>VWLEGWhlA{v z>dHg!P&7Ab=s%-y6pr0p7s$YBTN0SHpJgqR2kAzPTKao|{T1@J%gp05#VC%6Rht6o z+w)}snp^bt=)w|tpi$U?!4DV61EwVUHh8Xps@f1ly%Lsi+R_a4p&d5dG_jwfb9&^>5Zrsy;|Jl9=+V3JfYm{pPt>%fb%!H5Z0i;>&GzUv0UE$vazYQn zBl6gr@>v~Y&W@(}F4#C%c0Sj7UxQ=xDIgS5lje=r+IinMo`;3NPQh)`+Nl@-(qb?l z&3nChZ0zru$1dx8<9R^i8pFD6qCp0f@qy$vkJ&)CfXQJPNvj63={%rK@KM|jB?V4J z7sz>7T(4^ypaFY&=w0R~S~ZYO=K-!nKFbBi2{vy6ts!*E0g{Jf=FDe}osYT95V6pW z$+=DE0mcWPRDq@5-UO*C3gi&kh*(_`_8lUjmBcoF#r5KW?D$*cH;>P+phd{Ni7=R8 zdy_nX4F?3sd6fp@~i)?&)575FS^j-sc!ifj~vXgP}FVI1g|oN*f1UC#_8o zAq)Z{G)w^r;Rph0F`_>R4D7hNJz;{nkEK2aAkvI$1`@^* z0uowRiIiYQ>)}*`jlcG$d#z&hcoS+ zib@&Wy$zcSL&IfXG=2 z#CCs;_Z1f(gvYJfC@Q|uUP4_u=&vs9A|f(Rsu&MQhqQ+dt7Kn;D$$f$a9nYWqfdml zIGj$509i90=ur=e3%Zhsnil^Gw+}Ej@ZK?)0)zbmIc0|WSbuI9;={=d^FTNnfaFiG z9;AH`nSF5!c|g&TDUWxi=1ydfJ!ZK{d_q* zpl5=a7_TZ!x=NgiN-J*k;U<9uR1+ry#KD2KLdYaA%R)Ic2RD}oawQVm587Y(%TmG! z4+1d?OCZw(4rCZMLqJzImj|>1G@6T=LAxn(DvB(mQzQVy;NV@>pno#j<*%ll+f6}k z>kt{41R|XE*;pRPm1yjIU11o}oeNol$VkdbC#_GUf#{_sh~eQ3>SX)|991(D z#t=FWw)F}GfJY5R^o5m=)DAieej1*B?nEL6xX4GWJ|K4n#IPPG9xxpp>U#L=G-xT& z6axgdML@9ql@1uuOPz{lgop#dI8LyCMYzArd{_xSndL8l01vDbLk&G3hPVykLDGr? zp(L`Oz3cLXX;$%w`W4bZ5o()dV9*A@2DuU@|1T_p(=N-l5Q+o&SEPH`1ybTqv=x*A z=r;mlhG)DVk$PD8e3b|!ZgJcN-G0g*a_+C7DFTV)r?jgltL<-Pq)I(oX6JFJ8Q6S= zLtZtYK&pumUnW<}w|YDW90Z71QOpF=oku+$qQO-QrAK1_f)$edy1)=-uQq}T$T~Oi zFk?Q|){f|fJf?O)7Xb$dzLnXKD1l%c7>G3C^MIszz|4}2oc56xf_S@VU`ce+PjiaF{MDI7yC_1bEznA!d3TlV;2>9eEm#kNIg(ez-4= z#m7w!SNO%_eJ>+(o4unmut{}DUJLNxUEJ~IC26rH8}+?^adifTqt|kd(2Q3i2>?mr zP(aX&J?Rz#JPJp?oVs<56Xek~(?ohtY!8SR!)a3Tkatq`RJ@`!Qq-sW_EWDJ`q zArkuBY(g?h0on41@xYI@(sqW#?7RJ06bZOqWE7M~=+0XnAyve=(Cf~lL%A_)a-U6O zcX#0QYt2BmJYqbQBP9CR=U(7%tF-~LXMFD#G`T+Xj@>g zQFU9OKpJF1j*i=ip=RxCvaPKl&xK!F6_4&cmVHwV18LelY8^q`Nm1h;MY78Z5F_5B zEt~+&aAiE)9VPa$&kUfR2?6meOI+I;dy8=RN;j94i2Sss4#u>vZgpbVqOPzA=&^RhP9HkL>#VF7-d2wUjAxp%kVk5B#tOwS1zlwk ztaCQ4zZ1g~UIL--wV4{CZ#2Vln5gl4m15{(uCxfHKs+2(#ozlpN&lFMoj*A^^h;nX z6+;18Z4t_5y#XAk5i|v(Yo*)vp=2u=L++Z4@Fp7k+R(0r(-xw5zz^b;ZZ1pQKI3w2 z3bvX>n$VB-ID>_A==kO{sz{<7*!>u$;^JG|e`dEIUWFy8mw#Zb)-Ef49f~<^;m;Lh ztQlB*&w~qp7|}c`MeA}!TF5FL$kLTBhZpN&65cz@7*2a2hh6$AbHD9(LIHRWifHd2 zZ2EtXO6agYm-Chc57QIc^{LW^mn2EV{?_P*S9D{Fe||`IC(z#NF2mT{n3`@(K_`d7 ib;IlXMmOQcRBsatI_(dx;rFOV^TUto-)*k}k^ckT>~-G& diff --git a/win32/FireflyShell/resource.h b/win32/FireflyShell/resource.h deleted file mode 100644 index b32a4f1e..00000000 --- a/win32/FireflyShell/resource.h +++ /dev/null @@ -1,70 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by FireflyShell.rc -// -#define IDR_MAINFRAME 128 -#define IDS_SERVER_RUNNING 129 -#define IDS_SERVER_STOPPED 130 -#define IDS_SERVERSTARTFAIL 131 -#define IDS_SERVERSTOPFAIL 132 -#define IDS_SERVER_PENDING 133 -#define IDS_SERVER_START 134 -#define IDS_SERVER_STOP 135 -#define IDS_SCAN_START 136 -#define IDS_SCAN_STOP 137 -#define IDS_NOT_ADMIN 138 -#define IDS_QUERYSERVERRESTART 139 -#define IDS_VERSIONINFO_DESCRIPTION 140 -#define IDS_VERSIONINFO_VERSION 141 -#define IDS_VERSIONINFO_PATH 142 -#define IDS_FAILED_CONFIGURE_SERVICE 143 -#define IDS_FAILED_CONFIGURE_STARTUP 144 -#define IDS_LOG_NOLOG 145 -#define IDS_LOG_OPENFAILED 146 -#define IDD_PAGE_BASIC 201 -#define IDD_PAGE_ADVANCED 202 -#define IDD_PAGE_LOG 203 -#define IDD_PAGE_ABOUT 204 -#define IDI_SHELL_STOPPED 207 -#define IDB_LOGO 208 -#define IDC_SERVERNAME 1000 -#define IDC_PATH 1001 -#define IDC_BROWSE 1002 -#define IDI_SHELL_RUNNING 1003 -#define IDM_CONTEXT 1003 -#define IDC_LOG 1003 -#define ID_CONFIGURE 1004 -#define IDC_PROTECT 1004 -#define IDC_PASSWORD 1005 -#define IDC_PASSWORD_PROMPT 1006 -#define ID_EXIT 1007 -#define IDC_PORTSPIN 1007 -#define IDC_STARTSERVICE 1008 -#define IDC_SERVERPORT 1009 -#define IDC_STOPSERVICE 1010 -#define IDC_SERVERSTATE 1011 -#define IDC_AUTOSTART 1012 -#define IDC_WEBADMIN 1013 -#define IDC_WEBSITE 1014 -#define IDC_AUTOSTART2 1014 -#define IDC_AUTOSTART_ICON 1014 -#define IDC_VERSIONLIST 1015 -#define IDC_COPY 1016 -#define IDC_REFRESH 1018 -#define IDC_LOGO 1019 -#define IDC_FIREFLYLINK 1020 -#define IDC_FIREFLYLINK2 1021 -#define IDC_ROKULINK 1021 -#define IDI_SHIELD 1022 -#define ID_SHELLNOTIFY 4242 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 209 -#define _APS_NEXT_COMMAND_VALUE 32773 -#define _APS_NEXT_CONTROL_VALUE 1023 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/win32/FireflyShell/singleton.h b/win32/FireflyShell/singleton.h deleted file mode 100644 index bb6bcc25..00000000 --- a/win32/FireflyShell/singleton.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#ifndef SINGLETON_H -#define SINGLETON_H - -template -class Singleton -{ - static T *sm_instance; - -public: - Singleton() - { - T *instance = static_cast(this); - ATLASSERT(sm_instance == NULL); - sm_instance = instance; - } - - virtual ~Singleton() - { - ATLASSERT(sm_instance != NULL); - sm_instance = NULL; - } - - static T *GetInstance() - { - ATLASSERT(sm_instance != NULL); - return sm_instance; - } -}; - -template -T *Singleton::sm_instance; - -#endif // SINGLETON_H \ No newline at end of file diff --git a/win32/FireflyShell/stdafx.cpp b/win32/FireflyShell/stdafx.cpp deleted file mode 100644 index cfd0a5d3..00000000 --- a/win32/FireflyShell/stdafx.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#include "stdafx.h" - -#if (_ATL_VER < 0x0700) -#include -#endif //(_ATL_VER < 0x0700) diff --git a/win32/FireflyShell/stdafx.h b/win32/FireflyShell/stdafx.h deleted file mode 100644 index fd905143..00000000 --- a/win32/FireflyShell/stdafx.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - *(C) 2006 Roku LLC - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License Version 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * without any warranty; without even the implied warranty of - * merchantability or fitness for a particular purpose. See the GNU General - * Public License for more details. - * - * Please read README.txt in the same directory as this source file for - * further license information. - */ - -#pragma once - -// Change these values to use different versions -#define WINVER 0x0400 -#define _WIN32_WINNT 0x0600 -#define _WIN32_IE 0x0500 -#define _RICHEDIT_VER 0x0100 - -#define _UNICODE -#define UNICODE - -// Visual C++ 2005's new secure string operations and deprecation -#define USE_SECURE 0 -#if defined(_MSC_VER) -#if _MSC_VER >= 1400 -#undef USE_SECURE -#define USE_SECURE 1 -#define _CRT_SECURE_NO_DEPRECATE -#endif // _MSC_VER >= 1400 -#endif // defined(_MSC_VER) - -#include -#include - -extern CAppModule _Module; - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// WtsApi32.h is only in the latest platform SDK. Don't rely -// on everyone having it. -#if !defined(NOTIFY_FOR_THIS_SESSION) -#define NOTIFY_FOR_THIS_SESSION 0 -#endif - -#if _MSC_VER >= 1400 -#if defined _M_IX86 - #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") -#elif defined _M_IA64 - #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") -#elif defined _M_X64 - #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") -#else - #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") -#endif -#endif - -inline void SafeStringCopy(TCHAR *dest, const TCHAR *source, size_t len) -{ -#if USE_SECURE - _tcsncpy_s(dest, len, source, len); -#else - _tcsncpy(dest, source, len); - dest[len - 1] = 0; -#endif -} \ No newline at end of file diff --git a/win32/FireflyShell/version.h.templ b/win32/FireflyShell/version.h.templ deleted file mode 100644 index ea909e8f..00000000 --- a/win32/FireflyShell/version.h.templ +++ /dev/null @@ -1,13 +0,0 @@ -/* Version number of package */ -#define VERSION_MAJOR 1 -#define VERSION_MID 0 -#define VERSION_MINOR 0 -#define VERSION_BUILD $WCREV$ - -#define VERSION_LOCAL "$WCMODS? (LOCAL):$" -#define BUILD_DATE "$WCNOW$" -#define REPO_DATE "$WCDATE$" - -#define VERSION_STRIZE2(x) #x -#define VERSION_STRIZE(x) VERSION_STRIZE2(x) -#define VERSION_STRING VERSION_STRIZE(VERSION_MAJOR) "." VERSION_STRIZE(VERSION_MID) " svn-" VERSION_STRIZE(VERSION_BUILD) VERSION_LOCAL diff --git a/win32/FireflyShell/version.rc b/win32/FireflyShell/version.rc deleted file mode 100644 index 6e57b2ac..00000000 --- a/win32/FireflyShell/version.rc +++ /dev/null @@ -1,44 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// -// Version -// -#include "version.h" -#include "winver.h" - -#ifndef APSTUDIO_INVOKED - -VS_VERSION_INFO VERSIONINFO - FILEVERSION VERSION_MAJOR, VERSION_MID, VERSION_MINOR, VERSION_BUILD - PRODUCTVERSION VERSION_MAJOR, VERSION_MID, VERSION_MINOR, VERSION_BUILD - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS VS_FF_DEBUG -#else - FILEFLAGS 0x0L -#endif - FILEOS VOS_NT_WINDOWS32 - FILETYPE VFT_APP - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "Roku LLC" - VALUE "FileDescription", "FireflyShell" - VALUE "FileVersion", VERSION_STRING - VALUE "InternalName", "FireflyShell" - VALUE "LegalCopyright", "Copyright 2006 Roku LLC" - VALUE "OriginalFilename", "FireflyShell.exe" - VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", VERSION_STRING - VALUE "Comments", "Build date: " BUILD_DATE "\r\nRepository date: " REPO_DATE "\r\n" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif //APSTUDIO_INVOKED diff --git a/win32/config.h.templ b/win32/config.h.templ deleted file mode 100644 index 37d20d72..00000000 --- a/win32/config.h.templ +++ /dev/null @@ -1,160 +0,0 @@ -/* 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 "Firefly Media Server" - -/* 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 - -/* */ -#define HAVE_SQL - -#define HAVE_ICONV -#define ICONV_CONST const - - -/* Version number of package */ -#define VERSION "svn-$WCREV$" -#define BUILD_DATE "$WCNOW$" -#define REPO_DATE "$WCDATE$" - -#include "win32.h" diff --git a/win32/ff.ico b/win32/ff.ico deleted file mode 100644 index eeb5a025080c41cabcb83c2346da4648b53c7251..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35670 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 DnHjPq diff --git a/win32/messages.mc b/win32/messages.mc deleted file mode 100644 index 3ef6e7e0..00000000 --- a/win32/messages.mc +++ /dev/null @@ -1,28 +0,0 @@ -;#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-res.h b/win32/mt-daapd-res.h deleted file mode 100644 index d3ef9c3e..00000000 --- a/win32/mt-daapd-res.h +++ /dev/null @@ -1,17 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by mt-daapd.rc -// -#define IDI_APPICON 5 -#define IDI_ICON1 201 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 202 -#define _APS_NEXT_COMMAND_VALUE 32768 -#define _APS_NEXT_CONTROL_VALUE 201 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/win32/mt-daapd.rc.templ b/win32/mt-daapd.rc.templ deleted file mode 100644 index 825b8c8c..00000000 --- a/win32/mt-daapd.rc.templ +++ /dev/null @@ -1,110 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "mt-daapd-res.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include - -///////////////////////////////////////////////////////////////////////////// -#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 - "mt-daapd-res.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 1,0,0,$WCREV$ - PRODUCTVERSION 1,0,0,$WCREV$ - 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.fireflymediaserver.org" - VALUE "CompanyName", "Ron Pedde" - VALUE "FileDescription", "Firefly Service" - VALUE "FileVersion", "1.0 svn-$WCREV$" - VALUE "InternalName", "firefly" - VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" - VALUE "OriginalFilename", "firefly.exe" - VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", "1.0 svn-$WCREV$" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_APPICON ICON "ff.ico" -#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.sln b/win32/mt-daapd.sln deleted file mode 100644 index 3f24731a..00000000 --- a/win32/mt-daapd.sln +++ /dev/null @@ -1,97 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mt-daapd", "mt-daapd.vcproj", "{CB40C666-11D7-456B-B774-BCA42F675BB5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rsp", "rsp.vcproj", "{68CCEA19-503F-4894-8AE3-B1673FDEA920}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "w32-event", "w32-event.vcproj", "{E60F90F1-A1E5-49D8-A565-B990CA4BA860}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ssc-ffmpeg", "ssc-ffmpeg.vcproj", "{DA27D6F4-7E9F-40CA-AC5C-480DC81A1C56}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FireflyShell", "FireflyShell\FireflyShell.vcproj", "{ED38F171-854B-4EA3-B3A0-7681648969FC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ssc-wma", "ssc-wma\ssc-wma.vcproj", "{C1EF5133-DFB3-4FEC-B999-3655DBB14785}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "out-daap", "out-daap\out-daap.vcproj", "{C1EF5133-DFB3-4FEC-B999-3655DBB14786}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FireflyShellFRA", "FireflyShell\FireflyShellFRA.vcproj", "{819028A4-ED43-4A51-9E32-DC8559ADEBB6}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FireflyShellNLD", "FireflyShell\FireflyShellNLD.vcproj", "{5D6F19F6-6A71-4960-BFB3-BF545D02ACBD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FireflyShellDEU", "FireflyShell\FireflyShellDEU.vcproj", "{9B035724-EAD7-48C5-BBAF-91FFAA3CA55F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FireflyShellJPN", "FireflyShell\FireflyShellJPN.vcproj", "{59618041-38FA-4D80-B00B-113417259E6D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FireflyShellSWE", "FireflyShell\FireflyShellSWE.vcproj", "{D8109A27-5CB3-4888-B62A-F83BB3B1D41F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FireflyShellITA", "FireflyShell\FireflyShellITA.vcproj", "{E8F129E2-CABC-4FCD-9A9E-CDE338F4B1D0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "svcctrl", "svcctrl\svcctrl.vcproj", "{C49A74DC-C9A3-4562-9BA1-F903AADE87C2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {CB40C666-11D7-456B-B774-BCA42F675BB5}.Debug|Win32.ActiveCfg = Debug|Win32 - {CB40C666-11D7-456B-B774-BCA42F675BB5}.Debug|Win32.Build.0 = Debug|Win32 - {CB40C666-11D7-456B-B774-BCA42F675BB5}.Release|Win32.ActiveCfg = Release|Win32 - {CB40C666-11D7-456B-B774-BCA42F675BB5}.Release|Win32.Build.0 = Release|Win32 - {68CCEA19-503F-4894-8AE3-B1673FDEA920}.Debug|Win32.ActiveCfg = Debug|Win32 - {68CCEA19-503F-4894-8AE3-B1673FDEA920}.Debug|Win32.Build.0 = Debug|Win32 - {68CCEA19-503F-4894-8AE3-B1673FDEA920}.Release|Win32.ActiveCfg = Release|Win32 - {68CCEA19-503F-4894-8AE3-B1673FDEA920}.Release|Win32.Build.0 = Release|Win32 - {E60F90F1-A1E5-49D8-A565-B990CA4BA860}.Debug|Win32.ActiveCfg = Debug|Win32 - {E60F90F1-A1E5-49D8-A565-B990CA4BA860}.Debug|Win32.Build.0 = Debug|Win32 - {E60F90F1-A1E5-49D8-A565-B990CA4BA860}.Release|Win32.ActiveCfg = Release|Win32 - {E60F90F1-A1E5-49D8-A565-B990CA4BA860}.Release|Win32.Build.0 = Release|Win32 - {DA27D6F4-7E9F-40CA-AC5C-480DC81A1C56}.Debug|Win32.ActiveCfg = Debug|Win32 - {DA27D6F4-7E9F-40CA-AC5C-480DC81A1C56}.Debug|Win32.Build.0 = Debug|Win32 - {DA27D6F4-7E9F-40CA-AC5C-480DC81A1C56}.Release|Win32.ActiveCfg = Release|Win32 - {DA27D6F4-7E9F-40CA-AC5C-480DC81A1C56}.Release|Win32.Build.0 = Release|Win32 - {ED38F171-854B-4EA3-B3A0-7681648969FC}.Debug|Win32.ActiveCfg = Debug|Win32 - {ED38F171-854B-4EA3-B3A0-7681648969FC}.Debug|Win32.Build.0 = Debug|Win32 - {ED38F171-854B-4EA3-B3A0-7681648969FC}.Release|Win32.ActiveCfg = Release|Win32 - {ED38F171-854B-4EA3-B3A0-7681648969FC}.Release|Win32.Build.0 = Release|Win32 - {C1EF5133-DFB3-4FEC-B999-3655DBB14785}.Debug|Win32.ActiveCfg = Debug|Win32 - {C1EF5133-DFB3-4FEC-B999-3655DBB14785}.Debug|Win32.Build.0 = Debug|Win32 - {C1EF5133-DFB3-4FEC-B999-3655DBB14785}.Release|Win32.ActiveCfg = Release|Win32 - {C1EF5133-DFB3-4FEC-B999-3655DBB14785}.Release|Win32.Build.0 = Release|Win32 - {C1EF5133-DFB3-4FEC-B999-3655DBB14786}.Debug|Win32.ActiveCfg = Debug|Win32 - {C1EF5133-DFB3-4FEC-B999-3655DBB14786}.Debug|Win32.Build.0 = Debug|Win32 - {C1EF5133-DFB3-4FEC-B999-3655DBB14786}.Release|Win32.ActiveCfg = Release|Win32 - {C1EF5133-DFB3-4FEC-B999-3655DBB14786}.Release|Win32.Build.0 = Release|Win32 - {819028A4-ED43-4A51-9E32-DC8559ADEBB6}.Debug|Win32.ActiveCfg = Debug|Win32 - {819028A4-ED43-4A51-9E32-DC8559ADEBB6}.Debug|Win32.Build.0 = Debug|Win32 - {819028A4-ED43-4A51-9E32-DC8559ADEBB6}.Release|Win32.ActiveCfg = Release|Win32 - {819028A4-ED43-4A51-9E32-DC8559ADEBB6}.Release|Win32.Build.0 = Release|Win32 - {5D6F19F6-6A71-4960-BFB3-BF545D02ACBD}.Debug|Win32.ActiveCfg = Debug|Win32 - {5D6F19F6-6A71-4960-BFB3-BF545D02ACBD}.Debug|Win32.Build.0 = Debug|Win32 - {5D6F19F6-6A71-4960-BFB3-BF545D02ACBD}.Release|Win32.ActiveCfg = Release|Win32 - {5D6F19F6-6A71-4960-BFB3-BF545D02ACBD}.Release|Win32.Build.0 = Release|Win32 - {9B035724-EAD7-48C5-BBAF-91FFAA3CA55F}.Debug|Win32.ActiveCfg = Debug|Win32 - {9B035724-EAD7-48C5-BBAF-91FFAA3CA55F}.Debug|Win32.Build.0 = Debug|Win32 - {9B035724-EAD7-48C5-BBAF-91FFAA3CA55F}.Release|Win32.ActiveCfg = Release|Win32 - {9B035724-EAD7-48C5-BBAF-91FFAA3CA55F}.Release|Win32.Build.0 = Release|Win32 - {59618041-38FA-4D80-B00B-113417259E6D}.Debug|Win32.ActiveCfg = Debug|Win32 - {59618041-38FA-4D80-B00B-113417259E6D}.Debug|Win32.Build.0 = Debug|Win32 - {59618041-38FA-4D80-B00B-113417259E6D}.Release|Win32.ActiveCfg = Release|Win32 - {59618041-38FA-4D80-B00B-113417259E6D}.Release|Win32.Build.0 = Release|Win32 - {D8109A27-5CB3-4888-B62A-F83BB3B1D41F}.Debug|Win32.ActiveCfg = Debug|Win32 - {D8109A27-5CB3-4888-B62A-F83BB3B1D41F}.Debug|Win32.Build.0 = Debug|Win32 - {D8109A27-5CB3-4888-B62A-F83BB3B1D41F}.Release|Win32.ActiveCfg = Release|Win32 - {D8109A27-5CB3-4888-B62A-F83BB3B1D41F}.Release|Win32.Build.0 = Release|Win32 - {E8F129E2-CABC-4FCD-9A9E-CDE338F4B1D0}.Debug|Win32.ActiveCfg = Debug|Win32 - {E8F129E2-CABC-4FCD-9A9E-CDE338F4B1D0}.Debug|Win32.Build.0 = Debug|Win32 - {E8F129E2-CABC-4FCD-9A9E-CDE338F4B1D0}.Release|Win32.ActiveCfg = Release|Win32 - {E8F129E2-CABC-4FCD-9A9E-CDE338F4B1D0}.Release|Win32.Build.0 = Release|Win32 - {C49A74DC-C9A3-4562-9BA1-F903AADE87C2}.Debug|Win32.ActiveCfg = Debug|Win32 - {C49A74DC-C9A3-4562-9BA1-F903AADE87C2}.Debug|Win32.Build.0 = Debug|Win32 - {C49A74DC-C9A3-4562-9BA1-F903AADE87C2}.Release|Win32.ActiveCfg = Release|Win32 - {C49A74DC-C9A3-4562-9BA1-F903AADE87C2}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/win32/mt-daapd.vcproj b/win32/mt-daapd.vcproj deleted file mode 100644 index 7087f7ed..00000000 --- a/win32/mt-daapd.vcproj +++ /dev/null @@ -1,495 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/nsi/AccessControl.dll b/win32/nsi/AccessControl.dll deleted file mode 100644 index 0fe0c1e0e1df766fa1422a8df747f78ede292135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9216 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 F{s-d3NI?Jq diff --git a/win32/nsi/SimpleFC.dll b/win32/nsi/SimpleFC.dll deleted file mode 100644 index a9ad7b87b56d949d75b4c0f7ea2883bfa734aed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168448 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

?0--EDr}#kh zpkgs0j$n>?2e+chFn^<85QhfsDK5yX8bFpU31zjxhl{vGXq`st zPC>9^QuDJoMuT^7PxM3P8i)WaRtjoFgYIhPT^Ota7GlRcFdQJp)Tq_w(Z#Gib%0jId;FX;1Dg!my&&xo8=k_zO1ys7FEIyp*!T!B7FKg+&R3XD4d!HNyIU3 zyYV-pE5w^QPbY00YWJr<6i>T41v^J{kObN2FMrcev>)qD72<_Y_9xNd48_6z=TUs7 zhT?&|TcSH&_Y=p=SkaEw(43v$S~-F`lK4gXWAhA#VStV^hzpLteRY$FvgAejCP9zL zPms>E3P9}xpdIdx2LJjPBvnMDvH4~_`M{}V7}tY%ZCPaz-=BTjZ&^s1Lb*$}2xmlu z%nFh$thRcq%?WFRbmdKV!SBWa@r*$ceAIe}~91`pmyWdm}fKu&|^Rj~>mh`L*K@ zHyvNzn`Hm&<^VV4R3b_H?LP}GCo?o5*`U#{Gb8y(f?h;3>5p`A)$xqk?eV_toaoBv z6RmIxh*P)a*)w*=o30wfDdD4c=eF6ahxT$hCEwp^8)RhVB#{l{*ebx9@c4un#a}LR zk~lDkdFlv&2G!S}#9Fg7NUZDO4hbNQ?MLg+%8cjV1*D<=JodvBQd`YY3}}V^CM~qZ zuUXo~lh7_|Q@xf%UjO6-j#Ss#xcZ{%Zgz9bw_?U=?PAk=V~e+<~#@U@d|?j!Z=z?H8rs>Dk1I?KgLM)Y9_IhTf^XMoRx5@UpMPi>Le6kI zCzKp&8EJ~m_6f?@QKfFP;mF->`wd^DL`NFhZwMkBA?V0^`&QT(DfGS+S@f}FA^&a? zIkITtT;1JibW*WTLvVI%$;nSM+Wvtum&SB6L;(Y9TXb98>- zy6;J?`~H0_>%K=QW1n?j+SyO%%}X^+OF!mUBUaMNz=8LJwE(tDNT{iMDRV|Fezd^y zHw&furb)Q7&hWU2v$AB)57H(rGa8t zo-rq@G^Q<#OG4xnppf< z1c3ncv_xZA1EUKXtNnR6$DfPT$`=L*O3e~NMsL7xamZ-q$Ornz5)=(##bZDEAz5@u zmb8qDyiHQo6hL+^Wr``+B3Z`b#|tP;gZuDhHWRo7)NVVYw6dHAn*2opG*;J?ʨ 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 diff --git a/win32/nsi/firefly.log b/win32/nsi/firefly.log deleted file mode 100644 index c44c15fa..00000000 --- a/win32/nsi/firefly.log +++ /dev/null @@ -1 +0,0 @@ -# Firefly Log File diff --git a/win32/nsi/localizations/Dutch.nsh b/win32/nsi/localizations/Dutch.nsh deleted file mode 100644 index 53020f86..00000000 --- a/win32/nsi/localizations/Dutch.nsh +++ /dev/null @@ -1,29 +0,0 @@ -!define LANG "DUTCH" - -!insertmacro LANG_STRING PRODUCT_NAME "Firefly Media Server" - -; Install strings -!insertmacro LANG_STRING STRING_BONJOUR_ERROR "Bonjour voor Windows service niet gevonden. Installeer eerst Apple's Bonjour voor Windows." -!insertmacro LANG_STRING STRING_STOPPING_SERVICE "Service wordt gestopt..." -!insertmacro LANG_STRING STRING_WAITING_FOR_STOP "Wacht tot de service gestopt is ($9)" - -; Strings for the application install directory panel -!insertmacro LANG_STRING STRING_DESTFOLDER "Bestemmingsfolder" -!insertmacro LANG_STRING STRING_DESTDETAIL "Setup zal ${PRODUCT_NAME} installeren in de volgende folder.$\r$\n$\r$\nOm in een andere folder te installeren, klik Doorzoek en selecteer een andere folder. Klik Volgende om door te gaan." - -; Strings for the music path directory panel -!insertmacro LANG_STRING STRING_MUSICTITLE "Kies Muziek Locatie" -!insertmacro LANG_STRING STRING_MUSICHEADER "Kies folder met music om te delen." -!insertmacro LANG_STRING STRING_MUSICFOLDER "Muziek Folder" -!insertmacro LANG_STRING STRING_MUSICDETAIL "Setup zal de muziek in de folder$\r$\n$\r$\nOm in een andere folder te delen, klik Doorzoek en selecteer een andere folder. Klik Installeer om de installatie te starten." - -; These are for the startmenu shortcuts -!insertmacro LANG_BOTHSTRING STRING_WEBSITE "Website" -!insertmacro LANG_BOTHSTRING STRING_UNINSTALL "Deinstalleer" -!insertmacro LANG_BOTHSTRING STRING_DEBUG_MODE "Debug Modus" -!insertmacro LANG_BOTHSTRING STRING_FF_CONFIGURATION "Firefly Configuratie" -!insertmacro LANG_BOTHSTRING STRING_ADV_CONFIG "Advanceerde Configuratie" - -; Uninstall Strings -!insertmacro LANG_UNSTRING STRING_UNINSTALLED "$(^Name) was succesvol verwijderd van uw computer." -!insertmacro LANG_UNSTRING STRING_AREYOUSURE "Bent u zeker dat u $(^Name) wilt verwijderen en al zijn componenten?" diff --git a/win32/nsi/localizations/English.nsh b/win32/nsi/localizations/English.nsh deleted file mode 100644 index 25d61534..00000000 --- a/win32/nsi/localizations/English.nsh +++ /dev/null @@ -1,29 +0,0 @@ -!define LANG "ENGLISH" - -!insertmacro LANG_STRING PRODUCT_NAME "Firefly Media Server" - -; Install strings -!insertmacro LANG_STRING STRING_BONJOUR_ERROR "Bonjour for Windows service not found. Please install Apple's Bonjour for Windows." -!insertmacro LANG_STRING STRING_STOPPING_SERVICE "Stopping Service..." -!insertmacro LANG_STRING STRING_WAITING_FOR_STOP "Waiting for service stop ($9)" - -; Strings for the application install directory panel -!insertmacro LANG_STRING STRING_DESTFOLDER "Destination Folder" -!insertmacro LANG_STRING STRING_DESTDETAIL "Setup will install ${PRODUCT_NAME} in the following folder.$\r$\n$\r$\nTo install in a different folder, click Browse and select another folder. Click Next to continue." - -; Strings for the music path directory panel -!insertmacro LANG_STRING STRING_MUSICTITLE "Choose Music Location" -!insertmacro LANG_STRING STRING_MUSICHEADER "Choose the folder containing music to share." -!insertmacro LANG_STRING STRING_MUSICFOLDER "Music Folder" -!insertmacro LANG_STRING STRING_MUSICDETAIL "Setup will share the music in the following folder.$\r$\n$\r$\nTo share a different folder, click Browse and select another folder. Click Install to start the installation." - -; These are for the startmenu shortcuts -!insertmacro LANG_BOTHSTRING STRING_WEBSITE "Website" -!insertmacro LANG_BOTHSTRING STRING_UNINSTALL "Uninstall" -!insertmacro LANG_BOTHSTRING STRING_DEBUG_MODE "Debug Mode" -!insertmacro LANG_BOTHSTRING STRING_FF_CONFIGURATION "Firefly Configuration" -!insertmacro LANG_BOTHSTRING STRING_ADV_CONFIG "Advanced Configuration" - -; Uninstall Strings -!insertmacro LANG_UNSTRING STRING_UNINSTALLED "$(^Name) was successfully removed from your computer." -!insertmacro LANG_UNSTRING STRING_AREYOUSURE "Are you sure you want to completely remove $(^Name) and all of its components?" diff --git a/win32/nsi/localizations/French.nsh b/win32/nsi/localizations/French.nsh deleted file mode 100644 index 0b05b756..00000000 --- a/win32/nsi/localizations/French.nsh +++ /dev/null @@ -1,30 +0,0 @@ -!define LANG "FRENCH" - -!insertmacro LANG_STRING PRODUCT_NAME "Firefly Media Server" - -; Install strings -!insertmacro LANG_STRING STRING_BONJOUR_ERROR "Le service Bonjour pour Windows n'a pas t trouv. Veuillez installer le service Bonjour de Apple Pour Windows." -!insertmacro LANG_STRING STRING_STOPPING_SERVICE "Arrter le service..." -!insertmacro LANG_STRING STRING_WAITING_FOR_STOP "Attente de l'arrt du service ($9)" - -; Strings for the application install directory panel -!insertmacro LANG_STRING STRING_DESTFOLDER "Dossier de Destination" -!insertmacro LANG_STRING STRING_DESTDETAIL "Le programme d'installation va installer ${PRODUCT_NAME} dans le dossier suivant.$\r$\n$\r$\nPour l'installer dans un dossier diffrent, cliquez sur Parcourir et slectionner un autre dossier. Cliquez sur Suivant pour continuer." - -; Strings for the music path directory panel -!insertmacro LANG_STRING STRING_MUSICTITLE "Choisissez l'emplacement de la Musique" -!insertmacro LANG_STRING STRING_MUSICHEADER "Choisissez le dossier contenant la musique partager." -!insertmacro LANG_STRING STRING_MUSICFOLDER "Dossier de Musique" -!insertmacro LANG_STRING STRING_MUSICDETAIL "Le programme d'installation va partager la musique du dossier suivant.$\r$\n$\r$\nPour partager un dossier diffrent, cliquez sur Parcourir et slectionnez un autre dossier. Cliquez sur Installer pour dmarrer l'installation." - -; These are for the startmenu shortcuts -!insertmacro LANG_BOTHSTRING STRING_WEBSITE "Site Web" -!insertmacro LANG_BOTHSTRING STRING_UNINSTALL "Dsinstaller" -!insertmacro LANG_BOTHSTRING STRING_DEBUG_MODE "Mode Debug" -!insertmacro LANG_BOTHSTRING STRING_FF_CONFIGURATION "Configuration de Firefly" -!insertmacro LANG_BOTHSTRING STRING_ADV_CONFIG "Configuration Avance" - -; Uninstall Strings -!insertmacro LANG_UNSTRING STRING_UNINSTALLED "$(^Name) a t supprim avec succs de votre ordinateur." -!insertmacro LANG_UNSTRING STRING_AREYOUSURE "tes-vous sr de vouloir supprimer dfinitivement $(^Name) et tous ses composants?" - diff --git a/win32/nsi/localizations/German.nsh b/win32/nsi/localizations/German.nsh deleted file mode 100644 index 1d482186..00000000 --- a/win32/nsi/localizations/German.nsh +++ /dev/null @@ -1,29 +0,0 @@ -!define LANG "GERMAN" - -!insertmacro LANG_STRING PRODUCT_NAME "Firefly Media Server" - -; Install strings -!insertmacro LANG_STRING STRING_BONJOUR_ERROR "Der Bonjour-Dienst fr Windows konnte nicht gefunden werden. Bitte installieren Sie Apples Bonjour fr Windows." -!insertmacro LANG_STRING STRING_STOPPING_SERVICE "Beende Dienst..." -!insertmacro LANG_STRING STRING_WAITING_FOR_STOP "Warte, bis Dienst beendet ist ($9)" - -; Strings for the application install directory panel -!insertmacro LANG_STRING STRING_DESTFOLDER "Zielpfad" -!insertmacro LANG_STRING STRING_DESTDETAIL "Setup wird ${PRODUCT_NAME} in folgenden Ordner installieren:$\r$\n$\r$\nUm in einen anderen Ordner als den ausgewhlten zu installieren, klicken Sie Durchsuchen und whlen Sie einen anderen Ordner aus. Drcken Sie Weiter, um fortzufahren." - -; Strings for the music path directory panel -!insertmacro LANG_STRING STRING_MUSICTITLE "Whlen Sie den Pfad zu Ihrer Musiksammlung" -!insertmacro LANG_STRING STRING_MUSICHEADER "Whlen Sie den Pfad zu den Musikdateien, die Sie freigeben mchten." -!insertmacro LANG_STRING STRING_MUSICFOLDER "Musik-Ordner" -!insertmacro LANG_STRING STRING_MUSICDETAIL "Das Setup wird die Musik in folgenden Ordnern freigeben.$\r$\n$\r$\nUm in einen anderen Ordner als den ausgewhlten freizugeben, klicken Sie Durchsuchen und whlen Sie einen anderen Ordner aus. Drcken Sie Installieren um den Installationsvorgang zu beginnen." - -; These are for the startmenu shortcuts -!insertmacro LANG_BOTHSTRING STRING_WEBSITE "Website" -!insertmacro LANG_BOTHSTRING STRING_UNINSTALL "Deinstallieren" -!insertmacro LANG_BOTHSTRING STRING_DEBUG_MODE "Debug Modus" -!insertmacro LANG_BOTHSTRING STRING_FF_CONFIGURATION "Firefly Konfiguration" -!insertmacro LANG_BOTHSTRING STRING_ADV_CONFIG "Erweiterte Konfiguration" - -; Uninstall Strings -!insertmacro LANG_UNSTRING STRING_UNINSTALLED "$(^Name) wurde erfolgreich von Ihrem Computer entfernt." -!insertmacro LANG_UNSTRING STRING_AREYOUSURE "Sind Sie sicher, dass sie $(^Name) und damit alle Komponenten von Ihrem Computer entfernen wollen?" diff --git a/win32/nsi/localizations/Italian.nsh b/win32/nsi/localizations/Italian.nsh deleted file mode 100644 index d4a584db..00000000 --- a/win32/nsi/localizations/Italian.nsh +++ /dev/null @@ -1,30 +0,0 @@ -!define LANG "ITALIAN" - -!insertmacro LANG_STRING PRODUCT_NAME "Firefly Media Server" - -; Install strings -!insertmacro LANG_STRING STRING_BONJOUR_ERROR "Il servizio Bonjour per Windows non disponibile. Installare Apple Bonjour per Windows." -!insertmacro LANG_STRING STRING_STOPPING_SERVICE "Arresto del servizio in corso..." -!insertmacro LANG_STRING STRING_WAITING_FOR_STOP "Attesa per l'arresto del servizio ($9)" - -; Strings for the application install directory panel -!insertmacro LANG_STRING STRING_DESTFOLDER "Cartella di destinazione" -!insertmacro LANG_STRING STRING_DESTDETAIL "Setup installer ${PRODUCT_NAME} nella seguente cartella.$\r$\n$\r$\nPer installare in una cartella differente, fare click su Sfoglia e selezionare un'altra cartella. Fare click su Prossimo per continuare." - -; Strings for the music path directory panel -!insertmacro LANG_STRING STRING_MUSICTITLE "Scelta della libreria musicale" -!insertmacro LANG_STRING STRING_MUSICHEADER "Scegliere la cartella contenente la musica da condividere." -!insertmacro LANG_STRING STRING_MUSICFOLDER "Cartella con la musica" -!insertmacro LANG_STRING STRING_MUSICDETAIL "Firefly condivider la musica nella cartella seguente.$\r$\n$\r$\nPer condividere una cartella differente, fare click su Sfoglia e selezionare un'altra cartella. Fare click su Installa per iniziare." - -; These are for the startmenu shortcuts -!insertmacro LANG_BOTHSTRING STRING_WEBSITE "Sito web" -!insertmacro LANG_BOTHSTRING STRING_UNINSTALL "Disinstalla" -!insertmacro LANG_BOTHSTRING STRING_DEBUG_MODE "Modalit Debug" -!insertmacro LANG_BOTHSTRING STRING_FF_CONFIGURATION "Configurazione di Firefly" -!insertmacro LANG_BOTHSTRING STRING_ADV_CONFIG "Configurazione Avanzata" - -; Uninstall Strings -!insertmacro LANG_UNSTRING STRING_UNINSTALLED "$(^Name) stato rimosso dal tuo computer con successo." -!insertmacro LANG_UNSTRING STRING_AREYOUSURE "Sei sicuro di volere rimuovere completamente $(^Name) con tutti i relativi componenti?" - diff --git a/win32/nsi/localizations/Japanese.nsh b/win32/nsi/localizations/Japanese.nsh deleted file mode 100644 index 7332ced6..00000000 --- a/win32/nsi/localizations/Japanese.nsh +++ /dev/null @@ -1,29 +0,0 @@ -!define LANG "JAPANESE" - -!insertmacro LANG_STRING PRODUCT_NAME "Firefly Media Server" - -; Install strings -!insertmacro LANG_STRING STRING_BONJOUR_ERROR "WindowsBonjourT[rX‚܂BAppleЂWindowsBonjourCXg[ĂB" -!insertmacro LANG_STRING STRING_STOPPING_SERVICE "T[rX~..." -!insertmacro LANG_STRING STRING_WAITING_FOR_STOP "T[rX̒~ҋ@ ($9)" - -; Strings for the application install directory panel -!insertmacro LANG_STRING STRING_DESTFOLDER "CXg[tH_" -!insertmacro LANG_STRING STRING_DESTDETAIL "ZbgAbv ${PRODUCT_NAME} ̃tH_ɃCXg[܂B$\r$\n$\r$\ñtH_ɃCXg[ɂ́AuQƁv{^NbNāÃtH_IĂBɂ́Auցv{^NbNĂB" - -; Strings for the music path directory panel -!insertmacro LANG_STRING STRING_MUSICTITLE "~[WbN̏ꏊ̑I" -!insertmacro LANG_STRING STRING_MUSICHEADER "L~[WbNtH_IĂB" -!insertmacro LANG_STRING STRING_MUSICFOLDER "~[WbNtH_" -!insertmacro LANG_STRING STRING_MUSICDETAIL "ZbgAbṽ͎tH_ɂ~[WbNL܂B$\r$\n$\r$\ñtH_Lɂ́AuQƁv{^NbNāÃtH_IĂBCXg[Jnɂ́AuCXg[v{^NbNĂB" - -; These are for the startmenu shortcuts -!insertmacro LANG_BOTHSTRING STRING_WEBSITE "EFuTCg" -!insertmacro LANG_BOTHSTRING STRING_UNINSTALL "ACXg[" -!insertmacro LANG_BOTHSTRING STRING_DEBUG_MODE "fobO[h" -!insertmacro LANG_BOTHSTRING STRING_FF_CONFIGURATION "Fireflyݒ" -!insertmacro LANG_BOTHSTRING STRING_ADV_CONFIG "ڍׂ̐ݒ" - -; Uninstall Strings -!insertmacro LANG_UNSTRING STRING_UNINSTALLED "$(^Name)𐳏ɃACXg[邱Ƃł܂B" -!insertmacro LANG_UNSTRING STRING_AREYOUSURE "{$(^Name)SɃACXg[Ă낵łH" diff --git a/win32/nsi/localizations/Swedish.nsh b/win32/nsi/localizations/Swedish.nsh deleted file mode 100644 index 8e3208a0..00000000 --- a/win32/nsi/localizations/Swedish.nsh +++ /dev/null @@ -1,29 +0,0 @@ -!define LANG "SVENSKA" - -!insertmacro LANG_STRING PRODUCT_NAME "Firefly Media Server" - -; Install strings -!insertmacro LANG_STRING STRING_BONJOUR_ERROR "Bonjour fr Windows tjnsten kan inte hittas. Var vnlig installera Apple's Bonjour fr Windows." -!insertmacro LANG_STRING STRING_STOPPING_SERVICE "Stannar tjnsten..." -!insertmacro LANG_STRING STRING_WAITING_FOR_STOP "Vntar p att tjnsten ska stanna ($9)" - -; Strings for the application install directory panel -!insertmacro LANG_STRING STRING_DESTFOLDER "Destination" -!insertmacro LANG_STRING STRING_DESTDETAIL "Installations programmet kommer installera ${PRODUCT_NAME} i fljande mapp.$\r$\n$\r$\nFr att installera i en annan map, klicka Blddra och vlj en annan map. Klicka p Nsta fr att fortstta." - -; Strings for the music path directory panel -!insertmacro LANG_STRING STRING_MUSICTITLE "Vlj musik mapp" -!insertmacro LANG_STRING STRING_MUSICHEADER "Vlj mappen som innehller musik att dela ut." -!insertmacro LANG_STRING STRING_MUSICFOLDER "Musik Mapp" -!insertmacro LANG_STRING STRING_MUSICDETAIL "Installationen kommer dela ut musiken i fljande mapp.$\r$\n$\r$\nFr att dela ut en annan mapp, klicka Blddra och vlj en annan mapp. Klicka Installera fr att starta installationen." - -; These are for the startmenu shortcuts -!insertmacro LANG_BOTHSTRING STRING_WEBSITE "Websida" -!insertmacro LANG_BOTHSTRING STRING_UNINSTALL "Avinstallera" -!insertmacro LANG_BOTHSTRING STRING_DEBUG_MODE "Debug Lge" -!insertmacro LANG_BOTHSTRING STRING_FF_CONFIGURATION "Firefly Konfiguration" -!insertmacro LANG_BOTHSTRING STRING_ADV_CONFIG "Avancerad Konfiguration" - -; Uninstall Strings -!insertmacro LANG_UNSTRING STRING_UNINSTALLED "$(^Name) r fullstndigt avinstallerad frn din dator." -!insertmacro LANG_UNSTRING STRING_AREYOUSURE "r du sker p att du vill avinstallera $(^Name) och alla dess komponenter?" diff --git a/win32/nsi/manifest.xml b/win32/nsi/manifest.xml deleted file mode 100644 index daceea20..00000000 --- a/win32/nsi/manifest.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - diff --git a/win32/nsi/mapping.ini b/win32/nsi/mapping.ini deleted file mode 100644 index ec613989..00000000 --- a/win32/nsi/mapping.ini +++ /dev/null @@ -1,3 +0,0 @@ -# Map drive letters to unc paths so that the service -# can better locate user paths -[mapping] diff --git a/win32/nsi/mt-daapd-example.conf b/win32/nsi/mt-daapd-example.conf deleted file mode 100644 index 0879a566..00000000 --- a/win32/nsi/mt-daapd-example.conf +++ /dev/null @@ -1,298 +0,0 @@ -# This is the Firefly Media Server config file. -# -# Note that any changes made to this file will require the server to be -# shut down and restarted -# -# - - -[general] -# -# 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 (optional) -# -# This is the password to the administrative pages -# -# If it is blank, then no password is required from localhost, -# but nobody can connect from an outside machine (for admin -# pages). -# -# If it is set, then passwords are required for admin pages -# from both localhost and external hosts -# - -# admin_pw = - - -# -# db_type (required) -# -# This is what kind of backend database to store the song -# info in. Valid choices are "sqlite" and "sqlite3". -# -# sqlite seems to be more stable. - -db_type=sqlite3 - -# -# 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:\mp3 - -# -# 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=Firefly Media Server - -# -# 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. -# -# This is a leftover from the port from unix -- it's -# not used on windows, but still hanging around, like -# an appendix. -# - -runas=nobody - -# -# 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,.wma,.flac,.ogg - -# -# 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 (in sec) 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 = 600 - -# 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 = 1 - -# -# 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 = 1 - -# -# 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 0 - -# -# Truncate -# -# should the server truncate the log files on startup. -# Defaults to zero -truncate = 1 - -[plugins] -plugin_dir = plugins -plugins = rsp.dll,w32-event.dll - - - diff --git a/win32/nsi/mt-daapd.nsi.templ b/win32/nsi/mt-daapd.nsi.templ deleted file mode 100644 index 9a9d1c3b..00000000 --- a/win32/nsi/mt-daapd.nsi.templ +++ /dev/null @@ -1,662 +0,0 @@ -; $Id$ -; Script generated by the HM NIS Edit Script Wizard. - -; Update for Vista -RequestExecutionLevel admin - -; HM NIS Edit Wizard helper defines -!define PRODUCT_NAME "Firefly Media Server" -!define PRODUCT_SERVICE "Firefly Media Server" -!define /date DATEVER "%Y%m%d" -!define PRODUCT_VERSION "svn-$WCREV$" -!define PRODUCT_PUBLISHER "Ron Pedde" -!define PRODUCT_WEB_SITE "http://www.fireflymediaserver.org" -!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\firefly.exe" -!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" -!define PRODUCT_UNINST_ROOT_KEY "HKLM" - -!define PROJROOT "..\..\.." - -!define MTDROOT "..\.." -!define MTD_SOURCE "${MTDROOT}\win32\Release" -!define CONFIG_SOURCE "${MTDROOT}\win32\FireflyShell\Release" -!define DLL_SOURCE "${PROJROOT}\win32\dll" -!define ADMIN_ROOT "${MTDROOT}\admin-root" -!define REDIST_SOURCE "${PROJROOT}\win32\redist" - -!include "FileFunc.nsh" -!insertmacro GetParameters -!insertmacro GetOptionsS - -; MUI 1.67 compatible ------ -!include "MUI.nsh" - -; MUI Settings -;!define MUI_WELCOMEFINISHPAGE_BITMAP "ffsetup4.bmp" -!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 -!define MUI_PAGE_CUSTOMFUNCTION_LEAVE LicensePost -!insertmacro MUI_PAGE_LICENSE "${ADMIN_ROOT}\gpl-license.txt" -; Directory page -!define MUI_PAGE_CUSTOMFUNCTION_PRE DirectoryPre -!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirectoryShow -!define MUI_PAGE_CUSTOMFUNCTION_LEAVE DirectoryLeave -!insertmacro MUI_PAGE_DIRECTORY - -; Music Directory Page -!define MUI_PAGE_CUSTOMFUNCTION_PRE DirectoryPre -!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirectoryShow -!define MUI_PAGE_CUSTOMFUNCTION_LEAVE DirectoryLeave -!insertmacro MUI_PAGE_DIRECTORY - -; Instfiles page -!insertmacro MUI_PAGE_INSTFILES -; Finish page -!insertmacro MUI_PAGE_FINISH - -; Uninstaller pages -!insertmacro MUI_UNPAGE_INSTFILES - -; MUI end ------ -!macro LANG_LOAD LANGLOAD - !insertmacro MUI_LANGUAGE "${LANGLOAD}" -; !verbose - !include "localizations\${LANGLOAD}.nsh" -; !verbose on - !undef LANG -!macroend - -!macro LANG_STRING NAME VALUE - LangString "${NAME}" "${LANG_${LANG}}" "${VALUE}" -!macroend - -!macro LANG_UNSTRING NAME VALUE - !insertmacro LANG_STRING "un.${NAME}" "${VALUE}" -!macroend - -!macro LANG_BOTHSTRING NAME VALUE - !insertmacro LANG_STRING "${NAME}" "${VALUE}" - !insertmacro LANG_UNSTRING "${NAME}" "${VALUE}" -!macroend - - -!insertmacro LANG_LOAD "English" -!insertmacro LANG_LOAD "French" -!insertmacro LANG_LOAD "Dutch" -!insertmacro LANG_LOAD "German" -!insertmacro LANG_LOAD "Japanese" -!insertmacro LANG_LOAD "Swedish" -!insertmacro LANG_LOAD "Italian" - -Name "${PRODUCT_NAME}" -Icon "..\ff.ico" -UninstallIcon "..\ff.ico" -OutFile "${PRODUCT_NAME} (${PRODUCT_VERSION}).exe" -InstallDir "$PROGRAMFILES\${PRODUCT_NAME}\" -InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" -ShowInstDetails show -ShowUnInstDetails show - -Section -Pre - !include WinMessages.nsh - FindWindow $0 "" "FireflyShellNotifyIconHidden" - SendMessage $0 ${WM_CLOSE} 0 0 - - nsSCM::QueryStatus "Bonjour Service" - Pop $0 - Pop $1 - - StrCmp $0 "success" lbl_got_bonjour - MessageBox MB_OK "$(STRING_BONJOUR_ERROR)" - Quit - - lbl_got_bonjour: - - IntOp $9 0 + 0 - - nsSCM::QueryStatus "${PRODUCT_NAME}" - Pop $0 - Pop $1 - - StrCmp $0 "success" lbl_stop_service - goto lbl_continue - - lbl_stop_service: - DetailPrint "$(STRING_STOPPING_SERVICE)" - nsSCM::Stop "$(PRODUCT_NAME)" - - lbl_wait_stop: - Sleep 1000 - nsSCM::QueryStatus "$(PRODUCT_NAME)" - Pop $0 - Pop $1 - -; DetailPrint $0 - StrCmp $0 "success" lbl_check_status - goto lbl_continue - - lbl_check_status: - IntCmp $1 1 lbl_continue lbl_wait_stop lbl_wait_stop - - lbl_continue: - ; should really loop until service stops... - DetailPrint "$(STRING_WAITING_FOR_STOP)" - - IntOp $9 $9 + 1 - IntCmp $9 10 +1 +1 lbl_done_pre - - Sleep 1500 - Delete $2\firefly.exe - IfErrors lbl_continue - - lbl_done_pre: - -SectionEnd - -Section "MainSection" SEC01 - SetOutPath "$2" - - IfFileExists "$SMPROGRAMS\${PRODUCT_NAME}" HasProgramItems - goto NoProgramItems - -HasProgramItems: - Delete "$SMPROGRAMS\${PRODUCT_NAME}\*" - -NoProgramItems: - SetOverwrite on - File "${MTD_SOURCE}\firefly.exe" - File "${CONFIG_SOURCE}\FireflyShell.exe" - Delete "$2\FireflyShell.exe.manifest" - File "${CONFIG_SOURCE}\FireflyShell-0c.dll" - File "${CONFIG_SOURCE}\FireflyShell-07.dll" - File "${CONFIG_SOURCE}\FireflyShell-13.dll" - File "${CONFIG_SOURCE}\FireflyShell-1d.dll" - File "${CONFIG_SOURCE}\FireflyShell-11.dll" - File "${CONFIG_SOURCE}\FireflyShell-10.dll" - File "${CONFIG_SOURCE}\svcctrl.exe" - File "${DLL_SOURCE}\gnu_regex.dll" - File "${DLL_SOURCE}\pthreadVC2.dll" - File "${DLL_SOURCE}\sqlite.dll" - File "${DLL_SOURCE}\sqlite3.dll" - File "${DLL_SOURCE}\zlib1.dll" - File "${DLL_SOURCE}\avutil.dll" - File "${DLL_SOURCE}\avcodec.dll" - File "${DLL_SOURCE}\avformat.dll" - File "${DLL_SOURCE}\libFLAC.dll" - File "${DLL_SOURCE}\iconv.dll" - File "${DLL_SOURCE}\charset.dll" - - SetOutPath "$2\plugins" - File "${MTD_SOURCE}\rsp.dll" - File "${MTD_SOURCE}\out-daap.dll" - File "${MTD_SOURCE}\w32-event.dll" - File "${MTD_SOURCE}\ssc-ffmpeg.dll" - File "${MTD_SOURCE}\ssc-wma.dll" - - SetOutPath "$2\admin-root" - File "${ADMIN_ROOT}\thanks.html" - File "${ADMIN_ROOT}\about.html" - File "${ADMIN_ROOT}\status.js" - 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}\ff_logo_sm.gif" - File "${ADMIN_ROOT}\firefly.js" - File "${ADMIN_ROOT}\firefly.css" - File "${ADMIN_ROOT}\index.css" - File "${ADMIN_ROOT}\config.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}\config.js" - File "${ADMIN_ROOT}\config.xml" - File "${ADMIN_ROOT}\zlib-license.txt" - File "${ADMIN_ROOT}\zlib-license.html" - File "${ADMIN_ROOT}\xiph-license.txt" - File "${ADMIN_ROOT}\xiph-license.html" - File "${ADMIN_ROOT}\apache-2.0.txt" - File "${ADMIN_ROOT}\apache-2.0.html" - File "${ADMIN_ROOT}\applet.html" - File "${ADMIN_ROOT}\spinner.gif" - File "${ADMIN_ROOT}\spinner_stopped.gif" - File "${ADMIN_ROOT}\util.js" - File "${ADMIN_ROOT}\pngfix.js" - File "${ADMIN_ROOT}\no_access.html" - SetOutPath "$2\admin-root\lib-js" - File "${ADMIN_ROOT}\lib-js\prototype.js" - File "${ADMIN_ROOT}\lib-js\rico.js" - SetOutPath "$2\admin-root\lib-js\script.aculo.us" - File "${ADMIN_ROOT}\lib-js\script.aculo.us\builder.js" - File "${ADMIN_ROOT}\lib-js\script.aculo.us\controls.js" - File "${ADMIN_ROOT}\lib-js\script.aculo.us\dragdrop.js" - File "${ADMIN_ROOT}\lib-js\script.aculo.us\effects.js" - File "${ADMIN_ROOT}\lib-js\script.aculo.us\scriptaculous.js" - File "${ADMIN_ROOT}\lib-js\script.aculo.us\slider.js" - File "${ADMIN_ROOT}\lib-js\script.aculo.us\unittest.js" - SetOutPath "$2" - IfFileExists "$2\mapping.ini" HasMap - File "mapping.ini" - -HasMap: - IfFileExists "$2\firefly.log" HasLog - File "firefly.log" - -HasLog: - File "mt-daapd-example.conf" - IfFileExists "$2\mt-daapd.conf" HasConf - SetOverwrite off - CopyFiles "$2\mt-daapd-example.conf" "$2\mt-daapd.conf" - WriteINIStr "$2\mt-daapd.conf" "general" "mp3_dir" $3 - -HasConf: - WriteINIStr "$2\mt-daapd.conf" "plugins" "plugin_dir" "plugins" - WriteINIStr "$2\mt-daapd.conf" "plugins" "plugins" "" - ReadINIStr $0 "$2\mt-daapd.conf" "general" "rescan_interval" - StrCmp $0 "" rescan_set rescan_skip - rescan_set: - WriteINIStr "$2\mt-daapd.conf" "general" "rescan_interval" "600" - rescan_skip: - - ReadINIStr $0 "$2\mt-daapd.conf" "general" "logfile" - StrCmp $0 "" logfile_set logfile_skip - - logfile_set: - WriteINIStr "$2\mt-daapd.conf" "general" "logfile" "firefly.log" - logfile_skip: - - ; Check for default exts - ReadINIStr $0 "$2\mt-daapd.conf" "general" "extensions" - StrCmp $0 ".mp3,.m4a,.m4p" ext_set ext_skip - - ext_set: - WriteINIStr "$2\mt-daapd.conf" "general" "extensions" ".mp3,.m4a,.m4p,.wma" - - ext_skip: - - ; Check for truncate - ReadINIStr $0 "$2\mt-daapd.conf" "general" "truncate" - StrCmp $0 "" trunc_set trunc_skip - - trunc_set: - WriteINIStr "$2\mt-daapd.conf" "general" "truncate" "1" - - trunc_skip: - WriteINIStr "$2\mt-daapd.conf" "general" "db_type" "sqlite3" - AccessControl::SetOnFile "$2\mt-daapd.conf" "Everyone" "FullAccess" - AccessControl::SetOnFile "$2\mapping.ini" "Everyone" "FullAccess" - AccessControl::SetOnFile "$2\firefly.log" "Everyone" "FullAccess" - SetAutoClose False -SectionEnd - -Section -AdditionalIcons - WriteIniStr "$2\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" - CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\$(STRING_WEBSITE).lnk" "$2\${PRODUCT_NAME}.url" - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\$(STRING_UNINSTALL).lnk" "$2\uninst.exe" - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\$(STRING_DEBUG_MODE).lnk" "$2\firefly.exe" "-d9 -f" - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\$(STRING_FF_CONFIGURATION).lnk" "$2\FireflyShell.exe" - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\$(STRING_ADV_CONFIG).lnk" "notepad.exe" "$2\mt-daapd.conf" - - Delete "$SMPROGRAMS\Startup\Firefly Configuration.lnk" - -SectionEnd - -!include "LogicLib.nsh" -!define UNINSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall" -!define APP_KEY "{A49F249F-0C91-497F-86DF-B2585E8E76B7}" -Section -VCRedistributable - ReadRegStr $R0 HKLM "${UNINSTALL_KEY}\${APP_KEY}\" "DisplayName" - ${If} ${Errors} - # reg value doesn't exist (ie, needs installed) - SetOutPath "$2\" - File "${REDIST_SOURCE}\WindowsInstaller-KB893803-v2-x86.exe" - File "${REDIST_SOURCE}\VCRedist_x86.exe" - ExecWait '"$2\WindowsInstaller-KB893803-v2-x86.exe" /quiet /norestart' - ExecWait '"$2\VCRedist_x86.exe" /Q' - ${EndIf} -SectionEnd - -Section -Post - WriteUninstaller "$2\uninst.exe" - WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$2\firefly.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$2\uninst.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$2\firefly.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}" - - DeleteRegValue HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "FireflyShell" - - ${GetParameters} $R0 - ClearErrors - ${GetOptionsS} $R0 "/N" $R1 - - IfErrors 0 +2 ; Skip the write if we have the /N option - WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "FireflyShell" '"$2\FireflyShell.exe" -q' - -; ExecWait "$2\firefly.exe -i" - - nsSCM::Install "${PRODUCT_NAME}" "${PRODUCT_SERVICE}" 16 2 "$2\firefly.exe" "" "Bonjour Service" "" "" - Pop $0 - Pop $1 - - StrCmp $0 "success" lbl_install_success - IntCmp $1 1073 lbl_install_success ; service already exists - MessageBox MB_OK "Error installing service: $1" - - lbl_install_success: -; ExecWait 'netsh firewall add allowedprogram "$2\firefly.exe" "${PRODUCT_NAME}" enable' -; Use the SimpleFC plugin - - SimpleFC::IsFirewallServiceRunning - Pop $0 - Pop $1 - - intcmp $1 0 lbl_no_fw ; if 0, then skip fw config - SimpleFC::AddApplication "Firefly Media Server" "$2\Firefly.exe" 0 2 "" 1 - - lbl_no_fw: - nsSCM::Start "${PRODUCT_NAME}" - ${GetParameters} $R0 - ClearErrors - ${GetOptionsS} $R0 "/N" $R1 - - IfErrors 0 +2 ; Skip the run if we have the /N option - Exec '"$2\FireflyShell.exe" -q' -SectionEnd - - -Function un.onUninstSuccess - HideWindow - MessageBox MB_ICONINFORMATION|MB_OK "$(un.STRING_UNINSTALLED)" -FunctionEnd - -Function un.onInit - MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(un.STRING_AREYOUSURE)" IDYES +2 - Abort -FunctionEnd - -Function .onInit -; Must set $INSTDIR here to avoid adding ${PRODUCT_NAME} to the end of the -; path when user selects a new directory using the 'Browse' button. - StrCpy $INSTDIR "$PROGRAMFILES\${PRODUCT_NAME}" - StrCpy $2 "$PROGRAMFILES\${PRODUCT_NAME}" - StrCpy $3 "$DOCUMENTS\My Music" - IfSilent lbl_skip_lang - - Push "" - Push ${LANG_ENGLISH} - Push English - Push ${LANG_FRENCH} - Push French - Push ${LANG_DUTCH} - Push Dutch - Push ${LANG_GERMAN} - Push German - Push ${LANG_JAPANESE} - Push Japanese - Push ${LANG_SWEDISH} - Push Swedish - Push ${LANG_ITALIAN} - Push Italian - ; more - Push A - LangDLL::LangDialog "Installer Language" "Please select the language of the installer" - Pop $LANGUAGE - StrCmp $LANGUAGE "cancel" 0 +2 - Abort - - lbl_skip_lang: - -FunctionEnd - -Function LicensePost - StrCpy $9 "0" -FunctionEnd - -Function DirectoryPre - StrCmp $9 "0" OK - ;Skip 2nd (Music) Directory Page if conf file Exists - IfFileExists "$2\mt-daapd.conf" "" OK - Abort -OK: -FunctionEnd - - -Function DirectoryShow - StrCmp $9 "0" AppDirectoryPage - StrCmp $9 "1" MusicDirectoryPage - -AppDirectoryPage: - StrCpy $9 "1" - !insertmacro MUI_INNERDIALOG_TEXT 1041 "$(STRING_DESTFOLDER)" - !insertmacro MUI_INNERDIALOG_TEXT 1019 "$PROGRAMFILES\${PRODUCT_NAME}\" - !insertmacro MUI_INNERDIALOG_TEXT 1006 "$(STRING_DESTDETAIL)" - Goto EndDirectoryShow - -MusicDirectoryPage: - StrCpy $9 "2" - !insertmacro MUI_HEADER_TEXT "$(STRING_MUSICTITLE)" "$(STRING_MUSICHEADER)" - !insertmacro MUI_INNERDIALOG_TEXT 1041 "$(STRING_MUSICFOLDER)" - !insertmacro MUI_INNERDIALOG_TEXT 1019 "$DOCUMENTS\My Music" - !insertmacro MUI_INNERDIALOG_TEXT 1006 "$(STRING_MUSICDETAIL)" -EndDirectoryShow: -FunctionEnd - -Function DirectoryLeave - StrCmp $9 "1" SaveInstallDir - StrCmp $9 "2" SaveMusicDir - Goto EndDirectoryLeave - -SaveInstallDir: - StrCpy $2 $INSTDIR - Goto EndDirectoryLeave - -SaveMusicDir: -; Push $INSTDIR -; Call GetParent -; Pop $3 - StrCpy $3 $INSTDIR - -EndDirectoryLeave: -FunctionEnd - -Function .onVerifyInstDir - StrCmp $9 "2" DataPath All - -DataPath: -;all valid if UNC - StrCpy $R2 $INSTDIR 2 - StrCmp $R2 "\\" PathOK - -All: -; Invalid path if root - Push $INSTDIR - call GetRoot - Pop $R1 - StrCmp $R1 $INSTDIR "" PathOK - Abort - -PathOK: -FunctionEnd - -;-------------------------------- -;Helper Functions - -; GetParent -; input, top of stack (e.g. C:\Program Files\Poop) -; output, top of stack (replaces, with e.g. C:\Program Files) -; modifies no other variables. -; -; Usage: -; Push "C:\Program Files\Directory\Whatever" -; Call GetParent -; Pop $R0 -; ; at this point $R0 will equal "C:\Program Files\Directory" -Function GetParent - - Exch $R0 - Push $R1 - Push $R2 - Push $R3 - - StrCpy $R1 0 - StrLen $R2 $R0 - - loop: - IntOp $R1 $R1 + 1 - IntCmp $R1 $R2 get 0 get - StrCpy $R3 $R0 1 -$R1 - StrCmp $R3 "\" get - Goto loop - - get: - StrCpy $R0 $R0 -$R1 - - Pop $R3 - Pop $R2 - Pop $R1 - Exch $R0 - -FunctionEnd - -Function GetRoot - Exch $0 - Push $1 - Push $2 - Push $3 - Push $4 - - StrCpy $1 $0 2 - StrCmp $1 "\\" UNC - StrCpy $0 $1 - Goto done - -UNC: - StrCpy $2 3 - StrLen $3 $0 - loop: - IntCmp $2 $3 "" "" loopend - StrCpy $1 $0 1 $2 - IntOp $2 $2 + 1 - StrCmp $1 "\" loopend loop - loopend: - StrCmp $4 "1" +3 - StrCpy $4 1 - Goto loop - IntOp $2 $2 - 1 - StrCpy $0 $0 $2 - -done: - Pop $4 - Pop $3 - Pop $2 - Pop $1 - Exch $0 -FunctionEnd - -Section Uninstall - SetAutoClose false - - !include WinMessages.nsh - close_loop: - FindWindow $0 "" "FireflyShellNotifyIconHidden" - - IntCmp $0 0 close_done - SendMessage $0 ${WM_QUIT} 0 0 - SendMessage $0 ${WM_CLOSE} 0 0 - SendMessage $0 ${WM_DESTROY} 0 0 - Sleep 125 - Goto close_loop - close_done: - - IntOp $9 0 + 0 - - nsSCM::QueryStatus "${PRODUCT_NAME}" - Pop $0 - Pop $1 - - StrCmp $0 "success" un_lbl_stop_service - goto un_lbl_continue - - un_lbl_stop_service: - DetailPrint "$(STRING_STOPPING_SERVICE)" - nsSCM::Stop "$(PRODUCT_NAME)" - - un_lbl_wait_stop: - Sleep 1000 - nsSCM::QueryStatus "$(PRODUCT_NAME)" - Pop $0 - Pop $1 - -; DetailPrint $0 - StrCmp $0 "success" un_lbl_check_status - goto un_lbl_continue - - un_lbl_check_status: - IntCmp $1 1 un_lbl_continue un_lbl_wait_stop un_lbl_wait_stop - - un_lbl_continue: - ; should really loop until service stops... - DetailPrint "$(STRING_WAITING_FOR_STOP)" - - IntOp $9 $9 + 1 - IntCmp $9 10 +1 +1 un_lbl_done_pre - - Sleep 1500 - Delete "$INSTDIR\firefly.exe" - IfErrors un_lbl_continue - - un_lbl_done_pre: - Sleep 1000 - nsSCM::Remove "${PRODUCT_NAME}" - - Pop $0 - StrCmp $0 "success" lbl_continue_uninstall - - MessageBox MB_OK "Error Uninstalling service: $1" - - lbl_continue_uninstall: - - Delete "$INSTDIR\admin-root\lib-js\script.aculo.us\*" - RMDir "$INSTDIR\admin-root\lib-js\script.aculo.us" - - Delete "$INSTDIR\admin-root\lib-js\*" - RMDir "$INSTDIR\admin-root\lib-js" - - Delete "$INSTDIR\admin-root\*" - RMDir "$INSTDIR\admin-root" - - Delete "$INSTDIR\plugins\*" - RMDir "$INSTDIR\plugins" - - Delete "$INSTDIR\*" - RMDir "$INSTDIR" - - Delete "$SMPROGRAMS\${PRODUCT_NAME}\*" - RMDir "$SMPROGRAMS\${PRODUCT_NAME}" - RMDir "$INSTDIR" - - DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" - DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" - SetAutoClose false -SectionEnd diff --git a/win32/nsi/nsSCM.dll b/win32/nsi/nsSCM.dll deleted file mode 100644 index 067a6d158ebe079302be055f1bae7ae2c7ac90b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5632 zcmeHLZ){W76+bU={tz5uz@aGx)hTAs6-ADppI=g-wUamuEh#1@34t!fB!=J_JAHmH zfJT~R4^MO6TyfVdcGXIy7tGdli?U=G-p+l0 zl6ZpB4^uU%TdR=@3 zU>LPKZ2)A-U7H6$zU$y;4A=k~K4Z9w4;|)lTq5xid?ePnAdtsq1K3l=bqDz%VkN<# zLbX|f{etGfGN{tbU=`6jkcj;f?LbbDEzo2;l>K2Ii+5dwK zv`ROIZoGg%q-Lw+GmD#XlPyZJ)QX+dYzefrzhpr+Sz3Wlp-dL=vgm2Dfn{PnauVZ0 z*5eO*o;l~U{Nl`OAG9mu(v?8+8)kVqjwjL`yftyP?AUoMn}AYoCllX9{seLA@f+4z z`D0WP>q?0sMv1F@en1%)`^`{xOu{imFe~E|L&&8Py^5mv)Mnsn93lzbsj3=&62)NdNft`_S^cjz7 z*0i$mFDl&HeycvSwm(a_tTJBPZ=R^lbu!Z~PvbFBlcR^L@cEbvjCyw<)7CEc;UzWL zT|+?!J(fuKl?`sH-5{6-?X}?Dc%J)I2Nd?G$(B#*&Nk)bE}{7p`)7banIYM=*i+Y?E7cpL-J1d{LXWa|o|U-$Zm?)UIjO1s0J7)a_LlLD6c6 zS>RF38Y0=y(^zk~p%a-~iZWc7YPC#Xc__W+5B}kNl^OL97pcrSzvP=4E}nkxp|Ld= zw)@d(m{No(MVRbSs4{esC1t^=C0h=pY^IaGsfBnKYbn7}$`t0L`tE7b_l=YuVX^GQ z{wWY1R?64o3Q3N!C!;DtDk(MIk}5P-T*i&N&ww@8E*B z7fX{kxn~DX^(*C@3=iU2bB+^fhuuV{18u`4gR>4HHoS`(ym^=}7`(YtsHv+fJ5y38 z&N_~kh_kf=1>%Gwvr3!|5^*09+cTx&toP^+akg<_n>fLad}zua$y^|w)}p5rhtAl6 zm5;x7bcHl-`1*=C%MMhg8b&TOz2UD+`L6lH6e2Vu!geg5d8i!vG@$MyybARQatL+o z^J5iCD_5wDEed_tD}^USE+olh0RV*7ZCIWmt$|P|7RN;Y;MI%q%@YI&lW?a6HVU z1o4J>%M5R0!$3{{8o?JO@YZ3zLY*DuYe+`Bjyim`+_C*HaJryA5{ridA+GO0SLkcOXm=!pUx`r9g@U}H_5!?4 z1^6Jx>vmq)LT&2}Mdw6dpgtDmxmZM30kl%vg%Ec{mvJ^P!~qUNLnsoO^9(-CPknPR z8r&b^a3ya;o7caUc2;#qA^=0wmPl-GFyf7nPpR+fQX>~alq;z%A-*XX=Y3j|^YSBc zp6lv8f?f&?KI(<9`&ypzH5ndX%{vtDy~*UM>gdMtub7Fwy{00*QFY!+#V^5RC`wo7KR!M&o=C1JrV) zC8s5HFxD3WHPQHt^^&Rg+ZUbzd{5%PKKI*~HUoIB$^TGG9Tko>jz=Ag!{dlL4m*xJ zrX0(v*H(L~!`0ue{&n@c)g{jLPTKi|v)TEy^PA4I&I`^f&c8bU=G;Kn(@)WRX^xiY z@6$h`U!i|TpQkU;@6#XA|D!z!aF*6m6gL#5!V74=R zm@qTIq?i|(H<;ftzi0l){F(WLxy9tWE$&M9SKT%42KOHKe)qHPL+&5AUv-~$r`;Fb zAG`nIzUf}ZKFC(HHEcb*m2G7YvfpBd*yq_7*`Kh#WZz`3v!AfjY+lWmc6aX?_ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/out-daap/resource.h b/win32/out-daap/resource.h deleted file mode 100644 index 86393a63..00000000 --- a/win32/out-daap/resource.h +++ /dev/null @@ -1,14 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by out-daap.rc - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/win32/rsp-res.h b/win32/rsp-res.h deleted file mode 100644 index 7d485439..00000000 --- a/win32/rsp-res.h +++ /dev/null @@ -1,15 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by w32-event.rc -// - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/win32/rsp.def b/win32/rsp.def deleted file mode 100644 index 8ff0e27f..00000000 --- a/win32/rsp.def +++ /dev/null @@ -1,5 +0,0 @@ -LIBRARY rsp - -EXPORTS - plugin_info - diff --git a/win32/rsp.rc.templ b/win32/rsp.rc.templ deleted file mode 100644 index 0afc893d..00000000 --- a/win32/rsp.rc.templ +++ /dev/null @@ -1,103 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "rsp-res.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 - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,$WCREV$ - PRODUCTVERSION 1,0,0,$WCREV$ - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", "http://www.fireflymediaserver.org" - VALUE "CompanyName", "Ron Pedde" - VALUE "FileDescription", "RSP Output Plugin" - VALUE "FileVersion", "1.0 svn-$WCREV$" - VALUE "InternalName", "rsp" - VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" - VALUE "OriginalFilename", "rsp.dll" - VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", "1.0 svn-$WCREV$" - 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. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/win32/rsp.vcproj b/win32/rsp.vcproj deleted file mode 100644 index ed9b637b..00000000 --- a/win32/rsp.vcproj +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/ssc-ffmpeg-res.h b/win32/ssc-ffmpeg-res.h deleted file mode 100644 index 63c78f09..00000000 --- a/win32/ssc-ffmpeg-res.h +++ /dev/null @@ -1,14 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by ssc-ffmpeg.rc - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/win32/ssc-ffmpeg.def b/win32/ssc-ffmpeg.def deleted file mode 100644 index 48977aa4..00000000 --- a/win32/ssc-ffmpeg.def +++ /dev/null @@ -1,4 +0,0 @@ -LIBRARY ssc-ffmpeg -EXPORTS - plugin_info - diff --git a/win32/ssc-ffmpeg.rc.templ b/win32/ssc-ffmpeg.rc.templ deleted file mode 100644 index eb59187b..00000000 --- a/win32/ssc-ffmpeg.rc.templ +++ /dev/null @@ -1,103 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "ssc-ffmpeg-res.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include - -///////////////////////////////////////////////////////////////////////////// -#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 - "ssc-ffmpeg-res.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,$WCREV$ - PRODUCTVERSION 1,0,0,$WCREV$ - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", "http://www.fireflymediaserver.org" - VALUE "CompanyName", "Ron Pedde" - VALUE "FileDescription", "FFMPEG Transcoder Plugin" - VALUE "FileVersion", "1.0 svn-$WCREV$" - VALUE "InternalName", "ssc-ffmpeg" - VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" - VALUE "OriginalFilename", "ssc-ffmpeg.dll" - VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", "1.0 svn-$WCREV$" - 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. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/win32/ssc-ffmpeg.vcproj b/win32/ssc-ffmpeg.vcproj deleted file mode 100644 index 5efdf593..00000000 --- a/win32/ssc-ffmpeg.vcproj +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/ssc-wma/resource.h b/win32/ssc-wma/resource.h deleted file mode 100644 index 14ba8665..00000000 --- a/win32/ssc-wma/resource.h +++ /dev/null @@ -1,14 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by ssc-wma.rc - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/win32/ssc-wma/ssc-wma.def b/win32/ssc-wma/ssc-wma.def deleted file mode 100644 index f1415257..00000000 --- a/win32/ssc-wma/ssc-wma.def +++ /dev/null @@ -1,4 +0,0 @@ -LIBRARY ssc-wma -EXPORTS - plugin_info - diff --git a/win32/ssc-wma/ssc-wma.rc.templ b/win32/ssc-wma/ssc-wma.rc.templ deleted file mode 100644 index 6df9881c..00000000 --- a/win32/ssc-wma/ssc-wma.rc.templ +++ /dev/null @@ -1,103 +0,0 @@ -// 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 - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,$WCREV$ - PRODUCTVERSION 1,0,0,$WCREV$ - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", "http://www.fireflymediaserver.org" - VALUE "CompanyName", "Ron Pedde" - VALUE "FileDescription", "WMA Transcoder Plugin" - VALUE "FileVersion", "1.0 svn-$WCREV$" - VALUE "InternalName", "ssc-wma" - VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" - VALUE "OriginalFilename", "ssc-wma.dll" - VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", "1.0 svn-$WCREV$" - 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. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/win32/ssc-wma/ssc-wma.vcproj b/win32/ssc-wma/ssc-wma.vcproj deleted file mode 100644 index a7bb21e4..00000000 --- a/win32/ssc-wma/ssc-wma.vcproj +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/svcctrl/resource.h b/win32/svcctrl/resource.h deleted file mode 100644 index 7105d43a..00000000 --- a/win32/svcctrl/resource.h +++ /dev/null @@ -1,23 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by svcctrl.rc -// -#define IDD_SVCCTRL_DIALOG 102 -#define IDS_APP_TITLE 103 -#define IDI_SVCCTRL 107 -#define IDI_SMALL 108 -#define IDC_SVCCTRL 109 -#define IDR_MAINFRAME 128 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 129 -#define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 110 -#endif -#endif diff --git a/win32/svcctrl/small.ico b/win32/svcctrl/small.ico deleted file mode 100644 index d551aa3aaf80adf9b7760e2eb8de95a5c3e53df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23558 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 - -// C RunTime Header Files -#include -#include -#include -#include - - -// TODO: reference additional headers your program requires here diff --git a/win32/svcctrl/svcctrl.cpp b/win32/svcctrl/svcctrl.cpp deleted file mode 100644 index bae24668..00000000 --- a/win32/svcctrl/svcctrl.cpp +++ /dev/null @@ -1,140 +0,0 @@ -// svcctrl.cpp : Defines the entry point for the application. -// - -#include "stdafx.h" -#include "svcctrl.h" - -#define MAX_LOADSTRING 100 - -#define E_SVC_SUCCESS 0 -#define E_SVC_BADARGS 1 -#define E_SVC_NORIGHTS 2 -#define E_SVC_CANTSTART 3 -#define E_SVC_CANTSTOP 4 -#define E_SVC_CANTCONFIG 5 - -// Global Variables: -HINSTANCE hInst; // current instance - -// code re-use via cut and paste. woohoo. This from fellow.sourceforge.net - -/*===========================================================================*/ -/* Command line conversion routines */ -/*===========================================================================*/ - -/* Returns the first character in the next argument */ - -char *winDrvCmdLineGetNextFirst(char *lpCmdLine) { - while (*lpCmdLine == ' ' && *lpCmdLine != '\0') - lpCmdLine++; - return (*lpCmdLine == '\0') ? NULL : lpCmdLine; -} - - -/* Returns the first character after the next argument */ - -char *winDrvCmdLineGetNextEnd(char *lpCmdLine) { - int InString = FALSE; - - while (((*lpCmdLine != ' ') && (*lpCmdLine != '\0')) || - (InString && (*lpCmdLine != '\0'))) { - if (*lpCmdLine == '\"') - InString = !InString; - lpCmdLine++; - } - return lpCmdLine; -} - -/* Returns an argv vector and takes argc as a pointer parameter */ -/* Must free memory argv on exit */ - -char **winDrvCmdLineMakeArgv(char *lpCmdLine, int *argc) { - int elements = 0, i; - char *tmp; - char **argv; - char *argstart, *argend; - - tmp = winDrvCmdLineGetNextFirst(lpCmdLine); - if (tmp != 0) { - while ((tmp = winDrvCmdLineGetNextFirst(tmp)) != NULL) { - tmp = winDrvCmdLineGetNextEnd(tmp); - elements++; - } - } - argv = (char **) malloc(4*(elements + 2)); - argv[0] = "svcctrl.exe"; - argend = lpCmdLine; - for (i = 1; i <= elements; i++) { - argstart = winDrvCmdLineGetNextFirst(argend); - argend = winDrvCmdLineGetNextEnd(argstart); - if (*argstart == '\"') - argstart++; - if (*(argend - 1) == '\"') - argend--; - *argend++ = '\0'; - argv[i] = argstart; - } - argv[elements + 1] = NULL; - *argc = elements + 1; - return argv; -} - -int APIENTRY _tWinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPTSTR lpCmdLine, - int nCmdShow) { - - char *cmdline = _strdup(lpCmdLine); - char **argv; - int items; - int retval=0; - - SC_HANDLE scm; - SC_HANDLE svc; - - SERVICE_STATUS status; - - UNREFERENCED_PARAMETER(hPrevInstance); - UNREFERENCED_PARAMETER(lpCmdLine); - - argv=winDrvCmdLineMakeArgv(cmdline,&items); - if(items != 3) - return E_SVC_BADARGS; - - - if(!(scm = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS))) { - return E_SVC_NORIGHTS; - } - - if(!(svc = OpenService(scm, argv[2],SC_MANAGER_ALL_ACCESS))) { - CloseServiceHandle(scm); - return E_SVC_NORIGHTS; - } - - if(!strcmp(argv[1],"start")) { - if(!StartService(svc,0,NULL)) { - retval = E_SVC_CANTSTART; - } - } - - if(!strcmp(argv[1],"stop")) { - if(!ControlService(svc,SERVICE_CONTROL_STOP,&status)) { - retval = E_SVC_CANTSTOP; - } - } - - if(!strcmp(argv[1],"manual")) { - if (!ChangeServiceConfig(svc, SERVICE_NO_CHANGE, SERVICE_DEMAND_START, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) - retval = E_SVC_CANTCONFIG; - } - - if(!strcmp(argv[1],"auto")) { - if (!ChangeServiceConfig(svc, SERVICE_NO_CHANGE, SERVICE_AUTO_START, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) - retval = E_SVC_CANTCONFIG; - } - - - CloseServiceHandle(svc); - CloseServiceHandle(scm); - return retval; -} diff --git a/win32/svcctrl/svcctrl.exe.manifest b/win32/svcctrl/svcctrl.exe.manifest deleted file mode 100644 index 53be49b0..00000000 --- a/win32/svcctrl/svcctrl.exe.manifest +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/win32/svcctrl/svcctrl.h b/win32/svcctrl/svcctrl.h deleted file mode 100644 index e60f2eb7..00000000 --- a/win32/svcctrl/svcctrl.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "resource.h" diff --git a/win32/svcctrl/svcctrl.ico b/win32/svcctrl/svcctrl.ico deleted file mode 100644 index d551aa3aaf80adf9b7760e2eb8de95a5c3e53df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23558 zcmeI430zgx+QuJHKtxbe5gbu*030B5$VyGcDGSFOalkY&2LuvC5pp(7&2XNl96=@z zNXGH2`|DO#nx)3nwUq43A>_N=+wHsYe$U#6ePmShD&p^B>2uySylbs@uYIPy&-w#c zpc-6UYC)x+ErDgUwQ8BlZ7hIURRB*7exZ#T}AXG2* z=^weGTI5~Inq#r?3QZRh5>Vvy7AqDy*^i;1p6BY7;LQSXZ{;g>M z?fm5AM!1uJ~14CP5-;mbWJGeF0 z_iurN!(6GBI54yo4h(CB{j~e(6Em$hj*V=Fqpvo{5$e#07L+U2`wvFkn8s8S#Efo= z^|!}o{tozLT1|Z7UlaSMxZ(5FgK^Rilm(Khv|vko7i5X}36?lI))Ggklas69 zVxSe$=33+10BfA^v%)uXY;b;dHGCaV4e6oPadwt1PEE7L#SjO4G`kKy33kG#^P1yK zcx(J^Ra<Ti+?95-JJvGIWK0JnTs;vs^DcXy)=jK$w z=lme~e0CM~SM61i7E+Zy6!Vv8(?YCpX|5H%3$bS21{dbq;8I96Tne>C8jm-9o*mM| z?2r~#1K&~U^BwT@ygK+I#1UDG8sIO%&iE*}A+E1$jbGNa!S(fRas9ovxba>)TBY{5 zxxo`Rq9|oIDtY0?rjE#1t!!u9+}s5>w|2#i&D55z%y+}h?JrQ>af9~O4zA^n9=Nr$ z7jEt9gPXg&@$23JxV49(y|Q~4emOiI-)H_6dH=qKoBYhlq5e+&PW_AegZf|U-_)N} z9@RJC3MS7vp?yXL1qC4>AOQaU{+Kjr5++WZhzS!Wz}MFoW5Wxo&I+1!G$zZHn#$;`!98-<yjHIyy#~ zd!^|5sm6LSF)_!K%8;V#rWzZU(N_%@(#Q5Ewg{KRHI95 zY?=LIo2D9@#Ky*zb^O>SmHu~IE44l?Dgh-;K81z)WLJ`;4wqn z_ZrZ%LmzL?wy3kD_lL%jZ@l`n*YIJJ=8o?=KVm^dc=tK8XTNSrUK1xwofb5!|4WPJ z4;&O=5uecStt8`&$o&U)@7lX>*XEsj-g|fBj_upFZrx%^n^vq{{r0M5OP8-%`Odni z4ek1_pUw~WS3(xf3w~KkBmDdVRSL~dfr0)bOf7sI@n%@?lm1=c0pd4Z&T02Hm@RH2 z)we;5{I7(S*0d0%twR;wLsA|##n-X4buN70s`TsBg@MbpxknH6!QPjfV-K~P+VA6v z_lLE?{$Xwi?eB?&gE}IlpC>|?5A<%2&;edpIl33d4IhkA?7Qcs#@NdnYWsbf({dao zjuAS*69M!eGt37G)4CyX#*2ub-V>ij1>vuo!mzs+z)KgL@b7{zHqOE48v-$!zJ3#Y zv6uJbc6$T6dQ*KU=65px!K_Y5n$a2Cr*_9zn`Ys&O+gqt+y{pT0q+l>1_JwOKM87w zj|1D|zXCjwI@=4Ewok|DRTFSw+Z#B)bq3CDnTav%mol33yacQq;D9qB?)YqOTV(8< zhO{02IO`82u>Hs|UYpK$#ksIn_%f8&v3sW=YtK}ip9y^Z1~r3H`B~I#;2iDQ=@jeE zsP;Kl_%^%|E=9QF`(^IPTIr6TH*`S`ui5^ww+}9?dJfr}dg8{OA;>xEhiiu?LYUzwb+T)8Ci=PAZtkjWKvm68X{|HBivlm3|Y&X;^sP6+GhB5eJk92w>5I2 z+$j(Ix}hC1827D>9dK(?2jp()h@8zG@!QT$$l2N%x3+e|?QJ|JOre?J8PhnJ%Ni~CLrzWB&44|iS%zyB8@if zn`DaR3m@|O^QyPhwX#dzrgIKY+OQIBHLeiIw|EP z&VT0+jvL~&)rdRJe}-vnAIJ6*Q-ZDH1N-*w-gRv2&ZLw99b3D3xO=#{xw*T!wQ+Oz@bGBcd0?|n&$#sN_2S8-lrFX#RqEa{~iIg60Iwp0)kazxeJo zgX#N&>G3k(9Zpk`k46?8yGp_NR9<~gx%0b2>EBc6h6N*s;*a0{2Wy6O#7ZA8q(u55 zXmAg#9`ZC+QBk9x#nSQpa4CKpR!sCp#>stnXRBl-)qQFW^fsryy=(Z?FI2AS<5;lV$HB*W zpm$$$hhFu3THa~z+qYL;AE$u>2QZl)2G;Ru)3f^vUAny3rOUHDp6~jct50i}CXE|6 zZPK7&qvp+?vT*b1+^M5y`wmZgdAPT0`%H^xiXL6DvWOu*60xx;u6V#Q2{0r8adCy( zEn;IuV&g28p4jI>W#CW53OF&!CsAr~RottogHM>&s@S>DKq|7h|3SD9 zqF9XiYwfgmNUJRFhY%(1o6xLY)@?;QKJMM%9Zv1};>0~2!r#}0zp0zW`xNH9UeDj( zg}=XRQtjm}{_d~Eq+;bB6m$ICmr^L!lH$^jp`^CQQOEr>=J>f^rrg)^KRssd^D)QI zeLuo|80KTp^Sb>{=X%)v)pLRSmCW&T|B@EJinpT1Tyzb%m&zPJ_g4w`z?hFg`Rd1_ z>Wj7&9jm;{DmLy1Gsn+8Vp@!PtSTNouWWh8cdz+W{M_4Sj-PwjDs;R>k4LR3_uiS~ z=YBll{weJklr8FC(aI`*?jJPA&pn00ytW2@1pNNmFr)z)}MRaMZIsT^P*Jr zd{v~ficiI=V%Fb3xlf-prc}}2|5bcSDrP-?@&@_Qn~c8Rs-)*Df-M*%`H0H+%lZ72 zvi{EGQOr#h;dxS84CWx2AwMJBn{b$~fyU%&3N}@!=X}9qDHtRuG5tUm68j-~fkG1sqOUyGmYlwPgb z2OYaS`ssnHnDzL{f$7y1HvU2ZvOsRl96y=1qRkb)O#V)fzZuy)A>;K#iJYK%{YIx)`7mahDM1B1t%cm9kaZNYkD4X_DC9qd+$8->B5TQhB} zPLpFP(T5^y$$V8IA1dTRh5V#84>?gGBg(O=3b|S#mnh^Cg)FI%vsB;THmdl^aSGW> zA@3;U9fcgEkcSj)tKX)y|CMyJ9 zWMGAisgNZVGNwZIRLI7bES?uKuA0cIN->306SAtME58p}SdPK5N}H!(y?QQ$SPR)# zEw=cH;9p8myVEOE~ZJrY}3iIg?0rP&%LTBp=}8h@I%TXv<9-xUO`%}-uWt5a*E=2Z6^)Nip$4?6}mrb=W3r9pMm{N(?%I<=0f{ZX!iK0oKQ1d^EdG#^%`N>O4Lp#&)lc_BC`N?cbBh&ou z$Ha>#mE4>Z3XbJ2L!+Nt++W%XmzCnEDKwe#1XEVN#&9kX7z*Ba>aDt~p(O7d58 ztNMbLMIj4qo}V1Gs?t)?V|bWl{j*<9L>}8bKN)V*HyMT)&Xn7jpKpqbGz6zmVk@{(S%;moMb= zg`B=PIy$QPUCF}>xq2agFXZoq+`W*w*DN`FAuBIr%G&-D!IW`F9}` zFJ#_@jJ%MQmz-@~sV+i3UdYL7B1xFE+kg*rC_sn}}eaYVo*?J*YFZ>$;!oOJ{ z{QCgB-)1FF4i?imzkPZz{4Rvr{h7I>sgUu{%LsSK%b0JUml0-1RnN;GSP!(-+jpO%JopO`B((dnpK-(&yRaUJ6F; zchnE_k$Wv1f4{oG;*T$8Vx5|ss!Wf01@yO_$nuNBLZ4Gvb)Vu6x9f7RD3t3{RPFna z@~=**zWfUs8kYPPZCSL4e)B1xT|TXnSM+U>y|{O?8%m4vtzIr_BVKg5vCP}`*3dR} z&a!{N#n>%>kU18z!$Q_q$meQ#RW3=oZ=knFmg=8&V&`qOUg~p1N&lWwnpHmPb9YW3 zw+z)kIP(xwOMAJX5{|A*v__uZdtvV;w2rOkgeCCc1i z#a5Q%Amc3IgIa3+fBIm(x&OWTs_~Un|HxNN{coH$#m{POUDev^Dy>e{FMhe1Y5iiu zZ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/win32/versionize.bat b/win32/versionize.bat deleted file mode 100644 index eb30de43..00000000 --- a/win32/versionize.bat +++ /dev/null @@ -1,19 +0,0 @@ -@echo off - -set SUBWC="c:\program files\tortoisesvn\bin\subwcrev.exe" -if not exist %SUBWC% set SUBWC=copy - -echo Fixing version info... -%SUBWC% %0\..\.. %0\..\config.h.templ %0\..\config.h -%SUBWC% %0\..\.. %0\..\nsi\mt-daapd.nsi.templ %0\..\nsi\mt-daapd.nsi -%SUBWC% %0\..\.. %0\..\ssc-ffmpeg.rc.templ %0\..\ssc-ffmpeg.rc -%SUBWC% %0\..\.. %0\..\mt-daapd.rc.templ %0\..\mt-daapd.rc -%SUBWC% %0\..\.. %0\..\rsp.rc.templ %0\..\rsp.rc -%SUBWC% %0\..\.. %0\..\w32-event.rc.templ %0\..\w32-event.rc -%SUBWC% %0\..\.. %0\..\FireflyShell\version.h.templ %0\..\FireflyShell\version.h -%SUBWC% %0\..\.. %0\..\ssc-wma\ssc-wma.rc.templ %0\..\ssc-wma\ssc-wma.rc -%SUBWC% %0\..\.. %0\..\out-daap\out-daap.rc.templ %0\..\out-daap\out-daap.rc - -if exist %0\..\do_sig.cmd.templ %SUBWC% %0\..\.. %0\..\do_sig.cmd.templ %0\..\do_sig.cmd - - diff --git a/win32/w32-event-res.h b/win32/w32-event-res.h deleted file mode 100644 index 7d485439..00000000 --- a/win32/w32-event-res.h +++ /dev/null @@ -1,15 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by w32-event.rc -// - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/win32/w32-event.def b/win32/w32-event.def deleted file mode 100644 index b604ead9..00000000 --- a/win32/w32-event.def +++ /dev/null @@ -1,4 +0,0 @@ -LIBRARY w32-event -EXPORTS - plugin_info - diff --git a/win32/w32-event.rc.templ b/win32/w32-event.rc.templ deleted file mode 100644 index 8120fa52..00000000 --- a/win32/w32-event.rc.templ +++ /dev/null @@ -1,103 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "w32-event-res.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 - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,$WCREV$ - PRODUCTVERSION 1,0,0,$WCREV$ - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", "http://www.fireflymediaserver.org" - VALUE "CompanyName", "Ron Pedde" - VALUE "FileDescription", "Win32 Event Plugin" - VALUE "FileVersion", "1.0 svn-$WCREV$" - VALUE "InternalName", "w32-event" - VALUE "LegalCopyright", "Copyright (C) 2006 Ron Pedde" - VALUE "OriginalFilename", "w32-event.dll" - VALUE "ProductName", "Firefly Media Server" - VALUE "ProductVersion", "1.0 svn-$WCREV$" - 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. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/win32/w32-event.vcproj b/win32/w32-event.vcproj deleted file mode 100644 index e3aaeb0c..00000000 --- a/win32/w32-event.vcproj +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -