summaryrefslogtreecommitdiff
path: root/plugins/PackUpdater
diff options
context:
space:
mode:
authorVadim Dashevskiy <watcherhd@gmail.com>2012-10-01 16:32:58 +0000
committerVadim Dashevskiy <watcherhd@gmail.com>2012-10-01 16:32:58 +0000
commit57ccd87ca32f96f1554e6e99931c3a9559577d6e (patch)
tree203eafbd852b64aa6f3044b03e29b0d4429aa75c /plugins/PackUpdater
parent49efea8b90dcb2ffef878a18a926218a12a76c9e (diff)
PackUpdater is coming back
git-svn-id: http://svn.miranda-ng.org/main/trunk@1748 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/PackUpdater')
-rw-r--r--plugins/PackUpdater/Docs/Readme_eng.txt145
-rw-r--r--plugins/PackUpdater/Docs/Readme_rus.txt145
-rw-r--r--plugins/PackUpdater/Docs/Templates/Autoexec_PackUpdater.ini10
-rw-r--r--plugins/PackUpdater/Docs/Templates/File1.ini25
-rw-r--r--plugins/PackUpdater/Docs/ToDo.txt2
-rw-r--r--plugins/PackUpdater/PackUpdater_10.vcxproj199
-rw-r--r--plugins/PackUpdater/PackUpdater_10.vcxproj.filters70
-rw-r--r--plugins/PackUpdater/Res/BtnClose.icobin0 -> 2550 bytes
-rw-r--r--plugins/PackUpdater/Res/BtnOk.icobin0 -> 2550 bytes
-rw-r--r--plugins/PackUpdater/Res/Delete.icobin0 -> 2550 bytes
-rw-r--r--plugins/PackUpdater/Res/Menu.icobin0 -> 894 bytes
-rw-r--r--plugins/PackUpdater/Resource.rc196
-rw-r--r--plugins/PackUpdater/Src/Common.h136
-rw-r--r--plugins/PackUpdater/Src/Events.cpp82
-rw-r--r--plugins/PackUpdater/Src/Notifications.cpp678
-rw-r--r--plugins/PackUpdater/Src/Notifications.h72
-rw-r--r--plugins/PackUpdater/Src/Options.cpp480
-rw-r--r--plugins/PackUpdater/Src/PackUpdater.cpp108
-rw-r--r--plugins/PackUpdater/Src/Utils.cpp490
-rw-r--r--plugins/PackUpdater/Version.h20
-rw-r--r--plugins/PackUpdater/Version.rc42
-rw-r--r--plugins/PackUpdater/packupdater-translation.txt69
-rw-r--r--plugins/PackUpdater/resource.h77
23 files changed, 3046 insertions, 0 deletions
diff --git a/plugins/PackUpdater/Docs/Readme_eng.txt b/plugins/PackUpdater/Docs/Readme_eng.txt
new file mode 100644
index 0000000000..8dc336f00a
--- /dev/null
+++ b/plugins/PackUpdater/Docs/Readme_eng.txt
@@ -0,0 +1,145 @@
+==================
+Pack Updater 0.1.0
+==================
+
+Miranda IM plugin that do automatic or manual Miranda packs update.
+
+Plugin maybe interesting for packs author, which wants do update of their pack automatically.
+
+0. Changelog
+1. How to use?
+2. How it works?
+3. Copyrights and other
+
+
+-----------------
+0. Changelog
+-----------------
+
+0.1.0
++ now not installed files are not updated
++ added an additional parameter "Force" in the description of the file. With it you an update not installed files
+* Changed FileType parameter type
+
+0.0.9
+* Fixed order in update list
+
+0.0.8
++ Added Icolib support
+
+0.0.7
++ disabled or not existed plugins not updated and not downloaded
++ added FileType 5. It ia as type 4 but without restart
+
+0.0.6
+* All updates shows in one list
+* Fixed bug with no updating files
+* Changeg version comparing algorithm
+
+0.0.5
++ Added x64 version
++ Added Netlib support
++ Added ability to update plugins, icons and other miranda files
++ Added ability to clear folder with downloaded updates
++ Added hotkeys support (Customize-Hotkeys-Pack Updater) as default set Ctrl+F10
++ Added Popup plus actions support
+! Fixed frizing when downloaded files
+* If extension of downloaded file is ".html" it will be opened in browser
+* Fixed activation Apply button even you not change anything
+* Changed name of plugin. now it us PackUpdater
+* Plugin is Unicode now
+* Changed storing format on server - all information about all files stored in one file
+* In Pack for all files - one url for chexking
+* Fixed logic in popups
+- ZeroUpdate.ini not needed anymore, all settings storing in profile
+
+0.0.4
++ Added partly support of popups
+
+0.0.3
++ Added support of Folders plugin
++ Added ability to translate description of update from langpack
+* Changed new version detection
+
+0.0.2
++ Added support of path for dowloaded updates
++ Added ability don't start update automatically
+
+0.0.1
++ Pre-release
+
+--------------------
+1. How to use?
+--------------------
+
+Import settings from Autoexec_PackUpdater.ini to profile and for server (file1.ini) are in Tamplates folder. Probably full langpack in this folder too.
+
+1. Add in your langpack_*.txt strings needed for plugin.
+
+Variables in Autoexec_PackUpdater.ini:
+
+ FileCount - number of files for witch needs to check updates. Plugin supports checking for several files, but most time is only one (Pack setup file)
+
+ AutoUpdate - Check updates automatically with Miranda startup. configured in Events->Pack updates
+
+ File_VersionURL - URL where saved file with infirmation about versions of all files (file1.ini)
+
+[File_x_] (where x - serial number file, begining from 1)
+
+ CurrentVersion - sets 1.0.0 (or another what you wants) and don't change any more
+
+ LastVersion - the same
+
+
+3. Create file with infirmation about versions (file1.ini). One for all checked files
+
+
+Options of file1.ini:
+
+Handle [FileInfo_х], where х - serial number file, begining from 1 (must be equal with number in profile)
+
+
+FileVersion - Current file version (Version of new pack file)
+
+Message - Description that user see when plugin found new version
+
+DownloadURL - URL of Update file
+
+DiskFileName - Name of file saved on user computer.
+
+FileType - type of file. Defines final destination of file. (1 - pack, 2 - plugin (will be installed into Plugins), 3 - icon (will be installed into Icons), 4 - files in miranda root (e.g. langpack, dbtool))
+
+Descr - description witch shows in update list.
+
+InfoURL - Optional. If it writed, message box that user see have button "See information", click on it open this URL.
+
+AdvFolder - Optional. If it writed, set subfolder in folder defined FileType.
+
+Force - Optional. If it writed, the file will be offered for renewal, even if you do not installed.
+
+4. Download file with infirmation and updates on server.
+
+
+--------------------
+2. How it works?
+--------------------
+
+Plugin has two modes: silent and normal. silent is used when checking for updates on startup, normal - click menu item.
+First, plugin downloads file version information and compares the "local" (File_x_CurrentVersion from profile) version with the "remote"
+(FileVersion). If they differ, that:
+a). When you work in silent mode plugin checks the value LastVersion and if it differs from the FileVersion, shows the message about the update.
+if not - there are no messages.
+b). When working in normal mode plugin displays a message in any case.
+If a user downloaded the update, but decided it just did not install, update is still considered to be established.
+
+
+---------------------
+3. Copyrights and other
+---------------------
+
+Plugin written by ZERO_BiT, continued development by Mataes.
+The author is not liable for any damages, the explicit or implied, caused by this plugin. Also wanted to ask not to delete the original copyright.
+
+For questions contacts:
+ e-mail: mataes2007@gmail.com
+ icq: 4618898 \ No newline at end of file
diff --git a/plugins/PackUpdater/Docs/Readme_rus.txt b/plugins/PackUpdater/Docs/Readme_rus.txt
new file mode 100644
index 0000000000..f469d7c07f
--- /dev/null
+++ b/plugins/PackUpdater/Docs/Readme_rus.txt
@@ -0,0 +1,145 @@
+==================
+Pack Updater 0.1.0
+==================
+
+Плагин для Miranda IM, выполняющий автоматическое обновление сборок (паков).
+
+Плагин расчитан, в первую очередь, на создателей паков, которые хотят автоматизировать процесс обновления своих сборок.
+
+0. История версий
+1. Как использовать?
+2. Как оно работает?
+3. Копирайты и прочее
+
+
+-----------------
+0. История версий
+-----------------
+
+0.1.0
++ теперь отсутствующие файлы не обновляются
++ добавлен дополнительный параметр Force в описании файла. С ним можно обновлять отсутсвующие файлы
+* изменен тип параметра FileType
+
+0.0.9
+* Исправлен баг с порядком в списке обновлений
+
+0.0.8
++ Добавлена поддержка Icolib
+
+0.0.7
++ Отключенные или неустановленные плагины большен не обновляются и не загружаются
++ Тип файлов 5. точно такой же как 4, только без перезапуска
+
+0.0.6
+* Все обновления показываются в окне одним списком
+* Поправлен баг с необновлением файлов
+* Изменен алгоритм сравнения версий
+
+0.0.5
++ Добавлена x64 версия
++ Добавлена поддержка Netlib
++ Добавлена возможность обновлять плагины, иконки, ленгпак и прочие компоненты миранды
++ Добавлена возможность очищать папку со скаченными обновлениями
++ Добавлена поддержка горячих клавиш (Тонкая настройка-Горячие клавиши-Обновление сборки) по умолчанию Ctrl+F10
++ Добавлена поддержка действий плагина Popup plus
+! Исправлено замерзание миранды при загрузке файлов
+* Если расширение скачиваемого файла ".html", то он откроется в браузере
+* Исправлен баг с Активацией кнопки применить на странице Всплывающие окна-Обновление сборки
+* Изменено название плагина, теперь - это PackUpdater
+* Теперь плагин стал юникодным
+* Изменен формат хранения данных на сервере - все в одном файле
+* В сборке для разных файлов - одна ссылка
+* Исправлена логика всплывающих окон
+- Убран ZeroUpdate.ini, все настройки теперь в профиле
+
+0.0.4
++ Добавлена частичная поддержка всплывающих окон
+
+0.0.3
++ Добавлена поддержка плагина Folders
++ Добавлена возможность переводить описание файла для загрузки
+* Исправлен показ окна с обновление, даже если версия на сервере меньше текущей
+
+0.0.2
++ Добавлена поддержка путей для сохранения апдейтов
++ Добавлена возможность отключения автоматического запуска скачанного апдейта
+
+0.0.1
++ Собственно, пре-релиз.
+
+--------------------
+1. Как использовать?
+--------------------
+
+Шаблоны всех файлов лежат в папке Templates.
+
+1. Имортируем настройки их Autoexec_PackUpdater.ini в профиль и добавляем в лангпак блок с переводом.
+
+Поясню опции:
+
+ FileCount - количество файлов, для которых нужно проверять апдейты. Плагин поддерживает проверку нескольких файлов, однако чаще всего бавает достаточно одного (сетапа сборки)
+
+ AutoUpdate - Проверять ли апдейты при запуске Миранды. Настраивается в опциях, в разделе События->Обновление сборки
+
+ File_VersionURL - Урл, по которому лежит файл с информацией о версиях для всех файлов(см. дальше)
+
+[File_x_] (где x - порядковый номер файла, начиная с 1)
+
+ CurrentVersion - изначально выставляем в 1.0.0 (или любое другое значение) и больше не трогаем
+
+ LastVersion - то же самое
+
+
+3. Создаём файлы с информацией о версиях (один для всех проверяемых файлов)
+
+
+Описание опций:
+
+Заголовок [FileInfo_х], где х - номер файла, начиная с 1 (должен совпадать с номером, импортированным в профиль)
+
+
+FileVersion - Текущая версия файла (т. е. та, на которую обновляемся)
+
+Message - Сообщение, которое выводит плагин при нахождении этого апдейта
+
+DownloadURL - Урл, по которому лежит собственно файл апдейта (сетап)
+
+DiskFileName - Имя файла на диске.
+
+FileType - тип файла. Определяет конечное его расположение. (1 - сборка, 2 - плагин (будет установлен в папку Plugins), 3 - иконка (будет установлен в папку Icons), 4 - файлы в корне миранды (на пример, langpack, dbtool))
+
+Descr - описание, которое будет выводится в окне обновления.
+
+InfoURL - Опционально. Если присутствует, то в окошке уведомления появляется кнопочка "Смотреть инфо", при нажатии на которую в новом окне откроется эта страница
+
+AdvFolder - Опционально. Если присутствует, то задает подпапку в папке определяемой типом файла.
+
+Force - Опционально. Если присутствует, то файл будет предложен для обновления, даже если отсутствует.
+
+4. Заливаем файл с инфой о версиях и апдейты на сервер.
+
+
+--------------------
+2. Как оно работает?
+--------------------
+
+У плагина есть два режима работы: тихий и обычный. Тихий используется при проверке апдейтов при запуске, обычный - при выборе пункта меню.
+Сначала плагин скачивает файл с информацией о версиях и сравнивает "локальную" (File_x_CurrentVersion из профиля) версию с "удалённой" (FileVersion). Если они отличаются, то:
+а). При работе в тихом режиме плагин проверяет значение LastVersion и если оно отличается от FileVersion, выдаёт сообщение об обновлении, если нет -
+сообщений об отсутствии обновлений не будет.
+б). При работе в обычном режиме плагин выдаёт сообщение в любом случае.
+Если юзер скачал апдейт, но решил сразу его не устанавливать, апдейт всё равно считается установленным.
+
+
+---------------------
+3. Копирайты и прочее
+---------------------
+
+Плагин написал товарищЪ ZERO_BiT, продолжил развитие Mataes.
+Автор не несёт никакой ответственности за ущерб, явный или подразумеваемый, нанесённый этим плагином.
+Также хотелось бы попросить не удалять оригинальный копирайт.
+
+По вопросам обращаться
+ на мыло: mataes2007@gmail.com
+ в аську: 4618898 \ No newline at end of file
diff --git a/plugins/PackUpdater/Docs/Templates/Autoexec_PackUpdater.ini b/plugins/PackUpdater/Docs/Templates/Autoexec_PackUpdater.ini
new file mode 100644
index 0000000000..9375457441
--- /dev/null
+++ b/plugins/PackUpdater/Docs/Templates/Autoexec_PackUpdater.ini
@@ -0,0 +1,10 @@
+[PackUpdater]
+AutoUpdate=b1
+File_VersionURL=uhttp://mataes.googlecode.com/files/Test5.ini
+FileCount=d3
+File_1_CurrentVersion=u0.0.0
+File_1_LastVersion=u0.0.0
+File_2_CurrentVersion=u0.0.0
+File_2_LastVersion=u0.0.0
+File_3_CurrentVersion=u0.0.0
+File_3_LastVersion=u0.0.0 \ No newline at end of file
diff --git a/plugins/PackUpdater/Docs/Templates/File1.ini b/plugins/PackUpdater/Docs/Templates/File1.ini
new file mode 100644
index 0000000000..311c75b3c0
--- /dev/null
+++ b/plugins/PackUpdater/Docs/Templates/File1.ini
@@ -0,0 +1,25 @@
+[FileInfo_1]
+FileVersion = 0.0.1
+Message = "Test Pack"
+DownloadURL = "http://mataes.googlecode.com/files/Miranda%20IM%20Mataes%20Pack%20v0.8.3.exe"
+DiskFileName = "Miranda IM Mataes Pack v0.8.3.exe"
+InfoURL = "http://miranda-planet.com/forum/index.php?showtopic=6121"
+Descr="Test1"
+FileType=1
+Force=1
+
+[FileInfo_2]
+FileVersion = 0.0.1
+Message = "Test Plugin"
+DownloadURL = "http://mataes.googlecode.com/files/Test_Plugin.dll"
+DiskFileName = "Test_plugin.dll"
+Descr="Test2"
+FileType=2
+
+[FileInfo_3]
+FileVersion = 0.0.1
+Message = "Test Icon"
+DownloadURL = "http://mataes.googlecode.com/files/Test_Icon.dll"
+DiskFileName = "Test_Icon.dll"
+Descr="Test3"
+FileType=3 \ No newline at end of file
diff --git a/plugins/PackUpdater/Docs/ToDo.txt b/plugins/PackUpdater/Docs/ToDo.txt
new file mode 100644
index 0000000000..50100bcc4c
--- /dev/null
+++ b/plugins/PackUpdater/Docs/ToDo.txt
@@ -0,0 +1,2 @@
+1. add second variant of update - external app.
+2. add updater support (maybe). \ No newline at end of file
diff --git a/plugins/PackUpdater/PackUpdater_10.vcxproj b/plugins/PackUpdater/PackUpdater_10.vcxproj
new file mode 100644
index 0000000000..0c6f92f423
--- /dev/null
+++ b/plugins/PackUpdater/PackUpdater_10.vcxproj
@@ -0,0 +1,199 @@
+п»ї<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectName>PackUpdater</ProjectName>
+ <ProjectGuid>{20413125-4D68-4751-8062-DDA026DDABF1}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\Plugins\</OutDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Configuration)64\Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\Obj\$(ProjectName)\</IntDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\Plugins\</OutDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Configuration)64\Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\Obj\$(ProjectName)\</IntDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary>true</IgnoreImportLibrary>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;PACKUPDATER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <DisableSpecificWarnings>4996</DisableSpecificWarnings>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>Common.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <AdditionalLibraryDirectories>$(SolutionDir)\lib</AdditionalLibraryDirectories>
+ </Link>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>..\..\include\msapi</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;_USRDLL;PACKUPDATER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <WarningLevel>Level3</WarningLevel>
+ <DisableSpecificWarnings>4996</DisableSpecificWarnings>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>Common.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <AdditionalLibraryDirectories>$(SolutionDir)\lib</AdditionalLibraryDirectories>
+ </Link>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>..\..\include\msapi</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;PACKUPDATER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <WarningLevel>Level3</WarningLevel>
+ <DisableSpecificWarnings>4996</DisableSpecificWarnings>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>Common.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <AdditionalManifestDependencies>
+ </AdditionalManifestDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalLibraryDirectories>$(SolutionDir)\lib</AdditionalLibraryDirectories>
+ </Link>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>..\..\include\msapi</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;_USRDLL;PACKUPDATER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <WarningLevel>Level3</WarningLevel>
+ <DisableSpecificWarnings>4996</DisableSpecificWarnings>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>Common.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalLibraryDirectories>$(SolutionDir)\lib</AdditionalLibraryDirectories>
+ </Link>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>..\..\include\msapi</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ResourceCompile Include="Resource.rc" />
+ <ResourceCompile Include="Version.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="Resource.h" />
+ <ClInclude Include="Src\Common.h" />
+ <ClInclude Include="Src\Notifications.h" />
+ <ClInclude Include="Version.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="Src\Events.cpp" />
+ <ClCompile Include="Src\Notifications.cpp" />
+ <ClCompile Include="Src\Options.cpp" />
+ <ClCompile Include="Src\PackUpdater.cpp">
+ <PrecompiledHeader>Create</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="Src\Utils.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="res\btnClose.ico" />
+ <None Include="res\btnOk.ico" />
+ <None Include="res\delete.ico" />
+ <None Include="res\menu.ico" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/plugins/PackUpdater/PackUpdater_10.vcxproj.filters b/plugins/PackUpdater/PackUpdater_10.vcxproj.filters
new file mode 100644
index 0000000000..87e02ef233
--- /dev/null
+++ b/plugins/PackUpdater/PackUpdater_10.vcxproj.filters
@@ -0,0 +1,70 @@
+п»ї<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="Resource.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ <ResourceCompile Include="Version.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="Resource.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="Version.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="Src\Common.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="Src\Notifications.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="Src\Notifications.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="Src\Options.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="Src\PackUpdater.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="Src\Utils.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="Src\Events.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="res\menu.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\delete.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\btnOk.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\btnClose.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/plugins/PackUpdater/Res/BtnClose.ico b/plugins/PackUpdater/Res/BtnClose.ico
new file mode 100644
index 0000000000..f0d688b8de
--- /dev/null
+++ b/plugins/PackUpdater/Res/BtnClose.ico
Binary files differ
diff --git a/plugins/PackUpdater/Res/BtnOk.ico b/plugins/PackUpdater/Res/BtnOk.ico
new file mode 100644
index 0000000000..c83612c147
--- /dev/null
+++ b/plugins/PackUpdater/Res/BtnOk.ico
Binary files differ
diff --git a/plugins/PackUpdater/Res/Delete.ico b/plugins/PackUpdater/Res/Delete.ico
new file mode 100644
index 0000000000..eea851da19
--- /dev/null
+++ b/plugins/PackUpdater/Res/Delete.ico
Binary files differ
diff --git a/plugins/PackUpdater/Res/Menu.ico b/plugins/PackUpdater/Res/Menu.ico
new file mode 100644
index 0000000000..8f8fdb5258
--- /dev/null
+++ b/plugins/PackUpdater/Res/Menu.ico
Binary files differ
diff --git a/plugins/PackUpdater/Resource.rc b/plugins/PackUpdater/Resource.rc
new file mode 100644
index 0000000000..3f4039b06c
--- /dev/null
+++ b/plugins/PackUpdater/Resource.rc
@@ -0,0 +1,196 @@
+// 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
+
+/////////////////////////////////////////////////////////////////////////////
+// Русский (Россия) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
+LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+#pragma code_page(1251)
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_MENU ICON "res/menu.ico"
+IDI_DELETE ICON "res/delete.ico"
+IDI_OK ICON "res/btnOk.ico"
+IDI_CANCEL ICON "res/btnClose.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_UPDATE DIALOGEX 0, 0, 241, 203
+STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Updates found!"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "Update",IDOK,24,187,50,14
+ DEFPUSHBUTTON "View info",IDC_INFO,84,187,66,14,WS_DISABLED | NOT WS_TABSTOP
+ PUSHBUTTON "Cancel",IDCANCEL,160,187,50,14
+ CTEXT "PackUpdater has detected updated versions\nof the following Miranda components:",IDC_UPDATETEXT,9,9,217,22
+ CONTROL "",IDC_LIST_UPDATES,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,9,37,217,105
+ GROUPBOX "Description",IDC_DESCR,9,142,217,43
+ EDITTEXT IDC_MESSAGE,12,152,212,30,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_BORDER | WS_VSCROLL
+END
+
+IDD_DOWNLOAD DIALOGEX 0, 0, 172, 39
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_SYSMENU
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ CONTROL "",IDC_PB,"msctls_progress32",WS_BORDER,7,23,158,9
+ CTEXT "Downloading...",IDC_LABEL,7,7,158,12
+END
+
+IDD_POPUPDUMMI DIALOGEX 65526, 65526, 1, 1
+STYLE DS_ABSALIGN | DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_SYSMENU
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+END
+
+IDD_OPT_UPDATENOTIFY DIALOGEX 0, 0, 258, 174
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Pack update options",IDC_STATIC,2,32,253,63
+ CONTROL "On startup",IDC_UPDATEONSTARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,44,52,10
+ CONTROL "Remind about not installed pack update",IDC_REMINDER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,72,198,10
+ GROUPBOX "Hotkey",IDC_STATIC,2,0,253,26
+ CONTROL "Go to Customize -> Hotkeys to change the hotkey",IDC_LINK_HOTKEY,"Hyperlink",WS_TABSTOP,9,11,199,10
+ GROUPBOX "Notifications",IDC_NOTIFY2,1,95,253,76
+ CONTROL "Message boxes",IDC_MSG_BOXES2,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,111,79,10
+ CONTROL "Errors",IDC_ERRORS2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,124,57,10
+ CONTROL "Info messages",IDC_INFO_MESSAGES2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,137,80,10
+ CONTROL "Progress dialogs",IDC_PROGR_DLG2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,151,80,10
+ CONTROL "Every",IDC_UPDATEONPERIOD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,58,52,10
+ EDITTEXT IDC_PERIOD,65,56,28,14,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED
+ CONTROL "",IDC_PERIODSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_DISABLED,92,56,10,15
+ COMBOBOX IDC_PERIODMEASURE,114,56,58,30,CBS_DROPDOWNLIST | CBS_SORT | WS_DISABLED | WS_VSCROLL | WS_TABSTOP
+ CONTROL "(but only once a day)",IDC_ONLYONCEADAY,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,92,44,161,10
+END
+
+IDD_POPUP DIALOGEX 0, 0, 316, 182
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Notifications",IDC_NOTIFY,1,0,172,79
+ CONTROL "Message boxes (*)",IDC_MSG_BOXES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,19,79,10
+ CONTROL "Errors",IDC_ERRORS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,32,57,10
+ CONTROL "Info messages",IDC_INFO_MESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,45,80,10
+ CONTROL "Progress dialogs",IDC_PROGR_DLG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,59,80,10
+ CTEXT "Back",IDC_STATIC,90,8,24,8
+ CTEXT "Text",IDC_STATIC,116,8,24,8
+ CONTROL "",IDC_MSG_BOXES_BG,"ColourPicker",WS_TABSTOP,90,17,24,12
+ CONTROL "",IDC_MSG_BOXES_TX,"ColourPicker",WS_TABSTOP,116,17,24,12
+ CONTROL "",IDC_ERR_BG,"ColourPicker",WS_TABSTOP,90,31,24,12
+ CONTROL "",IDC_ERR_TX,"ColourPicker",WS_TABSTOP,116,31,24,12
+ CONTROL "",IDC_INFO_MESSAGES_BG,"ColourPicker",WS_TABSTOP,90,44,24,12
+ CONTROL "",IDC_INFO_MESSAGES_TX,"ColourPicker",WS_TABSTOP,116,44,24,12
+ CONTROL "",IDC_PROGR_DLG_BG,"ColourPicker",WS_TABSTOP,90,58,24,12
+ CONTROL "",IDC_PROGR_DLG_TX,"ColourPicker",WS_TABSTOP,116,58,24,12
+ GROUPBOX "Colours",IDC_COLORS,178,0,133,44,WS_GROUP
+ CONTROL "Use cus&tom colors",IDC_USEOWNCOLORS,"Button",BS_AUTORADIOBUTTON | BS_MULTILINE | BS_NOTIFY,186,8,122,13
+ CONTROL "Use &Windows colours",IDC_USEWINCOLORS,"Button",BS_AUTORADIOBUTTON | BS_MULTILINE | BS_NOTIFY,186,30,121,13
+ CONTROL "Use Pop&up colours",IDC_USEPOPUPCOLORS,"Button",BS_AUTORADIOBUTTON | BS_MULTILINE | BS_NOTIFY,186,19,102,13
+ PUSHBUTTON "Preview",IDC_PREVIEW,189,104,57,12
+ GROUPBOX "Click action",IDC_STATIC,1,83,145,67,WS_GROUP
+ COMBOBOX IDC_LC,6,103,127,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_RC,6,130,127,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "On left click",IDC_STATIC,8,94,121,8
+ LTEXT "On right click",IDC_STATIC,8,120,121,8
+ GROUPBOX "Timeout",IDC_STATIC,178,45,133,51
+ EDITTEXT IDC_TIMEOUT_VALUE,194,59,32,12,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER
+ CONTROL "",IDC_TIMEOUT_VALUE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,215,59,12,12
+ CTEXT "0 = Default",IDC_STATIC_DEFAULT,250,56,55,8
+ CTEXT "-1 = Infinite",IDC_STATIC_INFINITE,249,66,54,8
+ LTEXT "Sec",IDC_STATIC_SEC,230,61,17,8
+ LTEXT "* Needs popup actions to be enabled",IDC_STATIC,4,156,190,8
+ LTEXT "Not sets for ""Message boxes""",IDC_STATIC,185,80,123,8
+ CONTROL "",IDC_MSG_BOXES_MSG,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,153,19,8,10
+ CONTROL "",IDC_ERRORS_MSG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,153,32,8,10
+ CONTROL "",IDC_INFO_MESSAGES_MSG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,153,45,8,10
+ CONTROL "",IDC_PROGR_DLG_MSG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,153,59,8,10
+ CTEXT "Boxes",IDC_STATIC,146,8,23,8
+ CTEXT "PopUps",IDC_STATIC,7,9,79,8
+END
+
+
+#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
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_UPDATE, DIALOG
+ BEGIN
+ BOTTOMMARGIN, 201
+ END
+
+ IDD_OPT_UPDATENOTIFY, DIALOG
+ BEGIN
+ BOTTOMMARGIN, 95
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+#endif // Русский (Россия) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/plugins/PackUpdater/Src/Common.h b/plugins/PackUpdater/Src/Common.h
new file mode 100644
index 0000000000..3e38692d49
--- /dev/null
+++ b/plugins/PackUpdater/Src/Common.h
@@ -0,0 +1,136 @@
+/*
+Copyright (C) 2010 Mataes
+
+This is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this file; see the file license.txt. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+*/
+
+#define MIRANDA_VER 0x0A00
+
+// Windows Header Files:
+#include <time.h>
+#include <stdio.h>
+#include <windows.h>
+#include <Windowsx.h>
+#include "vector" // stl vector header
+#include <Shlobj.h>
+
+// Miranda header files
+#include "win2k.h"
+#include <newpluginapi.h>
+#include <m_clist.h>
+#include <m_skin.h>
+#include <m_langpack.h>
+#include <m_options.h>
+#include <m_database.h>
+#include <m_utils.h>
+#include <m_system.h>
+#include <m_popup.h>
+#include <m_hotkeys.h>
+#include <m_netlib.h>
+#include <m_icolib.h>
+
+#include <m_folders.h>
+#include "m_popup2.h"
+
+#include "..\version.h"
+#include "..\resource.h"
+#include "Notifications.h"
+
+#define MODNAME "PackUpdater"
+#define MODULEA "Pack Updater"
+#define MODULEW L"Pack Updater"
+#define DEFAULT_UPDATES_FOLDER L"Pack Updates"
+typedef std::wstring tString;
+#define MODULE MODULEW
+
+struct FILEURL
+{
+ TCHAR tszDownloadURL[2048];
+ TCHAR tszDiskPath[MAX_PATH];
+};
+
+struct FILEINFO
+{
+ TCHAR tszCurVer[16];
+ TCHAR tszNewVer[16];
+ TCHAR tszLastVer[16];
+ TCHAR tszAdvFolder[256];
+ TCHAR tszInfoURL[2048];
+ TCHAR tszMessage[5000];
+ TCHAR tszDescr[256];
+ FILEURL File;
+ BOOL enabled;
+ BYTE FileType;
+ INT FileNum;
+ BYTE Force;
+};
+
+struct PackUpdaterIconList
+{
+ char* szIconName;
+ TCHAR* tszDescr;
+ int IconID;
+};
+
+#define DEFAULT_REMINDER 1
+#define DEFAULT_UPDATEONSTARTUP 1
+#define DEFAULT_ONLYONCEADAY 0
+#define DEFAULT_UPDATEONPERIOD 0
+#define DEFAULT_PERIOD 1
+#define DEFAULT_PERIODMEASURE 1
+#define DEFAULT_FILECOUNT 0
+#define DEFAULT_FILETYPE 0 //0 - not defined, 1 - pack, 2 - plugin, 3 - icon, 4 - files in miranda root (e.g. langpack, dbtool), 5 - same as 4 without restart
+
+#define IDINFO 3
+#define IDDOWNLOAD 4
+#define IDDOWNLOADALL 5
+
+using std::wstring;
+using namespace std;
+
+extern HINSTANCE hInst;
+extern INT FileCount, CurrentFile, Number, UpdatesCount, Period;
+extern BOOL Silent, DlgDld;
+extern BYTE Reminder, UpdateOnStartup, UpdateOnPeriod, OnlyOnceADay, PeriodMeasure;
+extern TCHAR tszRoot[MAX_PATH], tszDialogMsg[2048];
+extern FILEINFO* pFileInfo;
+extern FILEURL* pFileUrl;
+extern HANDLE CheckThread, hOnPreShutdown, hOptHook, hLoadHook;
+extern MYOPTIONS MyOptions;
+extern aPopups PopupsList[POPUPS];
+extern LPCTSTR Title, Text;
+extern HANDLE Timer;
+
+VOID InitPopupList();
+VOID LoadOptions();
+BOOL NetlibInit();
+VOID IcoLibInit();
+VOID NetlibUnInit();
+INT ModulesLoaded(WPARAM wParam, LPARAM lParam);
+INT_PTR MenuCommand(WPARAM wParam,LPARAM lParam);
+INT_PTR EmptyFolder(WPARAM wParam,LPARAM lParam);
+INT OnPreShutdown(WPARAM wParam, LPARAM lParam);
+INT OptInit(WPARAM wParam, LPARAM lParam);
+VOID DoCheck(INT iFlag, INT iFlag2);
+BOOL DownloadFile(LPCTSTR tszURL, LPCTSTR tszLocal);
+VOID show_popup(HWND hDlg, LPCTSTR Title, LPCTSTR Text, INT Number, INT ActType);
+VOID DlgDownloadProc();
+INT_PTR CALLBACK DlgUpdate(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+INT_PTR CALLBACK DlgMsgPop(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+void __stdcall ExitMe(void*);
+void __stdcall RestartMe(void*);
+BOOL AllowUpdateOnStartup();
+VOID InitTimer(); \ No newline at end of file
diff --git a/plugins/PackUpdater/Src/Events.cpp b/plugins/PackUpdater/Src/Events.cpp
new file mode 100644
index 0000000000..eef80fc3f4
--- /dev/null
+++ b/plugins/PackUpdater/Src/Events.cpp
@@ -0,0 +1,82 @@
+/*
+Copyright (C) 2010 Mataes
+
+This is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this file; see the file license.txt. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+*/
+
+#include "common.h"
+
+HANDLE Timer;
+BOOL Silent;
+
+int ModulesLoaded(WPARAM wParam, LPARAM lParam)
+{
+ UnhookEvent(hLoadHook);
+ Silent = true;
+ HOTKEYDESC hkd = {0};
+ hkd.cbSize = sizeof(hkd);
+ hkd.dwFlags = HKD_TCHAR;
+ hkd.pszName = "Check for pack updates";
+ hkd.ptszDescription = _T("Check for pack updates");
+ hkd.ptszSection = _T("Pack Updater");
+ hkd.pszService = MODNAME"/CheckUpdates";
+ hkd.DefHotKey = HOTKEYCODE(HOTKEYF_CONTROL, VK_F10) | HKF_MIRANDA_LOCAL;
+ hkd.lParam = FALSE;
+ Hotkey_Register(&hkd);
+
+ if (AllowUpdateOnStartup())
+ DoCheck(UpdateOnStartup, (int)CheckThread);
+
+ Timer = CreateWaitableTimer(NULL, FALSE, NULL);
+ InitTimer();
+
+ return 0;
+}
+
+INT_PTR MenuCommand(WPARAM wParam,LPARAM lParam)
+{
+ Silent = false;
+ DoCheck(1, (int)CheckThread);
+ return 0;
+}
+
+INT_PTR EmptyFolder(WPARAM wParam,LPARAM lParam)
+{
+ SHFILEOPSTRUCT file_op = {
+ NULL,
+ FO_DELETE,
+ tszRoot,
+ _T(""),
+ FOF_NOERRORUI |
+ FOF_SILENT,
+ false,
+ 0,
+ _T("") };
+ if (lParam)
+ file_op.fFlags |= FOF_NOCONFIRMATION;
+ SHFileOperation(&file_op);
+ return 0;
+}
+
+INT OnPreShutdown(WPARAM wParam, LPARAM lParam)
+{
+ CancelWaitableTimer(Timer);
+ CloseHandle(Timer);
+
+ UnhookEvent(hOptHook);
+ UnhookEvent(hOnPreShutdown);
+ return 0;
+} \ No newline at end of file
diff --git a/plugins/PackUpdater/Src/Notifications.cpp b/plugins/PackUpdater/Src/Notifications.cpp
new file mode 100644
index 0000000000..5c336358a4
--- /dev/null
+++ b/plugins/PackUpdater/Src/Notifications.cpp
@@ -0,0 +1,678 @@
+/*
+Copyright (C) 2010 Mataes
+
+This is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this file; see the file license.txt. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+*/
+
+#include "common.h"
+
+HWND hDlgDld = NULL;
+INT UpdatesCount = 0;
+
+void PopupAction(HWND hWnd, BYTE action)
+{
+ switch (action)
+ {
+ case PCA_CLOSEPOPUP:
+ break;
+ case PCA_DONOTHING:
+ return;
+ }//end* switch
+ PUDeletePopUp(hWnd);
+}
+
+static INT_PTR CALLBACK PopupDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case UM_POPUPACTION:
+ {
+ if (HIWORD(wParam) == BN_CLICKED)
+ {
+ LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)PUGetPluginData(hDlg);
+
+ if (pmpd)
+ {
+ switch (LOWORD(wParam))
+ {
+ case IDYES:
+ {
+ if (IsWindow(pmpd->hDialog))
+ EndDialog(pmpd->hDialog, LOWORD(wParam));
+ PUDeletePopUp(hDlg);
+ break;
+ }
+ case IDNO:
+ {
+ if (IsWindow(pmpd->hDialog))
+ EndDialog(pmpd->hDialog, LOWORD(wParam));
+ PUDeletePopUp(hDlg);
+ break;
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case UM_FREEPLUGINDATA:
+ {
+ LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)PUGetPluginData(hDlg);
+ if (pmpd > 0)
+ mir_free(pmpd);
+ return TRUE; //TRUE or FALSE is the same, it gets ignored.
+ }
+ break;
+
+ default:
+ break;
+ }
+ return DefWindowProc(hDlg, uMsg, wParam, lParam);
+}
+
+static INT_PTR CALLBACK PopupDlgProc2(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_COMMAND:
+ {
+ PopupAction(hDlg, MyOptions.LeftClickAction);
+ break;
+ }
+ case WM_CONTEXTMENU:
+ {
+ PopupAction(hDlg, MyOptions.RightClickAction);
+ break;
+ }
+ case UM_FREEPLUGINDATA:
+ {
+ LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)PUGetPluginData(hDlg);
+ if (pmpd > 0)
+ mir_free(pmpd);
+ return TRUE; //TRUE or FALSE is the same, it gets ignored.
+ }
+ break;
+ }
+ return DefWindowProc(hDlg, uMsg, wParam, lParam);
+}
+
+static VOID MakePopupAction(POPUPACTION &pa, INT id)
+{
+ pa.cbSize = sizeof(POPUPACTION);
+ pa.flags = PAF_ENABLED;
+ pa.wParam = MAKEWORD(id, BN_CLICKED);
+ pa.lParam = 0;
+ switch (id)
+ {
+ case IDYES:
+ {
+ pa.lchIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)"btn_ok");
+ strncpy_s(pa.lpzTitle, MODNAME"/Yes", SIZEOF(pa.lpzTitle));
+ }
+ break;
+ case IDNO:
+ {
+ pa.lchIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)"btn_cancel");
+ strncpy_s(pa.lpzTitle, MODNAME"/No", SIZEOF(pa.lpzTitle));
+ }
+ break;
+ }
+}
+
+VOID show_popup(HWND hDlg, LPCTSTR Title, LPCTSTR Text, int Number, int ActType)
+{
+ POPUPDATAT_V2 pd;
+ LPMSGPOPUPDATA pmpd;
+ pmpd = (LPMSGPOPUPDATA)mir_alloc(sizeof(MSGPOPUPDATA));
+ if (pmpd)
+ {
+ ZeroMemory(&pd, sizeof(pd));
+ pd.cbSize = sizeof(POPUPDATAT_V2);
+ pd.lchContact = NULL; //(HANDLE)wParam;
+ pd.lchIcon = LoadSkinnedIcon(PopupsList[Number].Icon);
+ lstrcpyn(pd.lptzText, Text, SIZEOF(pd.lptzText));
+ lstrcpyn(pd.lptzContactName, Title, SIZEOF(pd.lptzContactName));
+ switch (MyOptions.DefColors)
+ {
+ case byCOLOR_WINDOWS:
+ pd.colorBack = GetSysColor(COLOR_BTNFACE);
+ pd.colorText = GetSysColor(COLOR_WINDOWTEXT);
+ break;
+ case byCOLOR_OWN:
+ pd.colorBack = PopupsList[Number].colorBack;
+ pd.colorText = PopupsList[Number].colorText;
+ break;
+ case byCOLOR_POPUP:
+ pd.colorBack = pd.colorText = 0;
+ break;
+ }//end* switch
+ if (Number == 0 && ActType != 0)
+ pd.PluginWindowProc = (WNDPROC)PopupDlgProc;
+ else
+ pd.PluginWindowProc = (WNDPROC)PopupDlgProc2;
+ pd.PluginData = pmpd;
+ if (Number == 0)
+ pd.iSeconds = -1;
+ else
+ pd.iSeconds = MyOptions.Timeout;
+ pd.hNotification = NULL;
+ pd.lpActions = pmpd->pa;
+ }
+ pmpd->hDialog = hDlg;
+ switch (ActType)
+ {
+ case 0:
+ break;
+ case 1:
+ {
+ MakePopupAction(pmpd->pa[pd.actionCount++], IDYES);
+ MakePopupAction(pmpd->pa[pd.actionCount++], IDNO);
+ }
+ break;
+ }
+
+ CallService(MS_POPUP_ADDPOPUPT, (WPARAM) &pd, APF_NEWDATA);
+}
+
+INT_PTR CALLBACK DlgDownload(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ SetWindowText(GetDlgItem(hDlg, IDC_LABEL), tszDialogMsg);
+ SetWindowLongPtr(GetDlgItem(hDlg, IDC_PB), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hDlg, IDC_PB), GWL_STYLE) | PBS_MARQUEE);
+ SendMessage(GetDlgItem(hDlg, IDC_PB), PBM_SETMARQUEE, 1, 50);
+ return TRUE;
+ }//end* switch
+ return FALSE;
+}
+
+INT_PTR CALLBACK DlgDownloadPop(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ Number = 3;
+ show_popup(hDlg, Title, Text, Number, 0);
+ return TRUE;
+ } // end* WM_INITDIALOG:
+ } // end* switch (uMsg)
+ return FALSE;
+}
+
+static void __stdcall CreateDownloadDialog(void*)
+{
+ if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL,MODNAME, "Popups3", DEFAULT_POPUP_ENABLED))
+ hDlgDld = CreateDialog(hInst, MAKEINTRESOURCE(IDD_POPUPDUMMI), NULL, DlgDownloadPop);
+ else if (DBGetContactSettingByte(NULL,MODNAME, "Popups3M", DEFAULT_MESSAGE_ENABLED))
+ {
+ lstrcpyn(tszDialogMsg, Text, SIZEOF(tszDialogMsg));
+ hDlgDld = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DOWNLOAD), NULL, DlgDownload);
+ }
+}
+
+static void __stdcall DestroyDownloadDialog(void*)
+{
+ DestroyWindow(hDlgDld);
+}
+
+void DlgDownloadProc()
+{
+ CallFunctionAsync(CreateDownloadDialog, 0);
+ if (!DownloadFile(pFileUrl->tszDownloadURL, pFileUrl->tszDiskPath))
+ {
+ Title = TranslateT("Pack Updater");
+ Text = TranslateT("An error occured while downloading the update.");
+ if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL, MODNAME, "Popups1", DEFAULT_POPUP_ENABLED))
+ {
+ Number = 1;
+ show_popup(0, Title, Text, Number, 0);
+ }
+ else if (DBGetContactSettingByte(NULL, MODNAME, "Popups1M", DEFAULT_MESSAGE_ENABLED))
+ MessageBox(NULL, Text, Title, MB_ICONSTOP);
+ }
+ CallFunctionAsync(DestroyDownloadDialog, 0);
+}
+
+INT_PTR CALLBACK DlgUpdate(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ HWND hwndList = GetDlgItem(hDlg, IDC_LIST_UPDATES);
+
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault( hDlg );
+ SetWindowLongPtr(hDlg, GWLP_USERDATA, 0);
+ SendMessage(hwndList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);
+
+ LVCOLUMN lvc = {0};
+ // Initialize the LVCOLUMN structure.
+ // The mask specifies that the format, width, text, and
+ // subitem members of the structure are valid.
+ lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+ lvc.fmt = LVCFMT_LEFT;
+
+ lvc.iSubItem = 0;
+ lvc.pszText = TranslateT("Component Name");
+ lvc.cx = 145; // width of column in pixels
+ ListView_InsertColumn(hwndList, 0, &lvc);
+
+ lvc.iSubItem = 1;
+ lvc.pszText = TranslateT("Current Version");
+ lvc.cx = 95; // width of column in pixels
+ ListView_InsertColumn(hwndList, 1, &lvc);
+
+ lvc.iSubItem = 2;
+ lvc.pszText = TranslateT("New Version");
+ lvc.cx = 82; // width of column in pixels
+ ListView_InsertColumn(hwndList, 2, &lvc);
+
+ //enumerate plugins, fill in list
+ //bool one_enabled = false;
+ ListView_DeleteAllItems(hwndList);
+
+ LVITEM lvI = {0};
+
+ // Some code to create the list-view control.
+ // Initialize LVITEM members that are common to all
+ // items.
+ lvI.mask = LVIF_TEXT | LVIF_PARAM | LVIF_NORECOMPUTE;// | LVIF_IMAGE;
+
+ vector<FILEINFO> &todo = *(vector<FILEINFO> *)lParam;
+ for (int i = 0; i < (int)todo.size(); ++i)
+ {
+ lvI.mask = LVIF_TEXT | LVIF_PARAM;// | LVIF_IMAGE;
+ lvI.iSubItem = 0;
+ lvI.lParam = (LPARAM)&todo[i];
+ lvI.pszText = todo[i].tszDescr;
+ lvI.iItem = i;
+ ListView_InsertItem(hwndList, &lvI);
+
+ lvI.mask = LVIF_TEXT;// | LVIF_IMAGE;
+
+ lvI.iSubItem = 1;
+ lvI.pszText = todo[i].tszCurVer;
+ ListView_SetItem(hwndList, &lvI);
+
+ lvI.iSubItem = 2;
+ lvI.pszText = todo[i].tszNewVer;
+ ListView_SetItem(hwndList, &lvI);
+
+ // remember whether the user has decided not to update this component with this particular new version
+ /*char stored_setting[256];
+ char* descr = mir_t2a(todo[i].tszDescr);
+ mir_snprintf(stored_setting, 256, "DisabledVer%s", descr);
+ mir_free(descr);
+ DBVARIANT dbv;
+ bool check = todo[i].enabled;
+ if (!DBGetContactSettingTString(0, MODNAME, stored_setting, &dbv))
+ {
+ if (dbv.ptszVal && lstrcmp(dbv.ptszVal, todo[i].tszNewVer) == 0)
+ check = false;
+ else
+ DBDeleteContactSetting(0, MODNAME, stored_setting);
+ DBFreeVariant(&dbv);
+ }
+ one_enabled |= check;*/
+ ListView_SetCheckState(hwndList, lvI.iItem, true);
+ todo[i].enabled = true;
+ }
+ HWND hwOk = GetDlgItem(hDlg, IDOK);
+ EnableWindow(hwOk, true/*one_enabled ? TRUE : FALSE*/);
+ // do this after filling list - enables 'ITEMCHANGED' below
+ SetWindowLongPtr(hDlg, GWLP_USERDATA, lParam);
+ Utils_RestoreWindowPositionNoSize(hDlg,0,MODNAME,"ConfirmWindow");
+ //if (!IsUserAnAdmin())
+ //SendDlgItemMessage(hDlg, IDOK, BCM_SETSHIELD, 0, TRUE);
+ return TRUE;
+ }
+ case WM_NOTIFY:
+ {
+ if (((LPNMHDR) lParam)->hwndFrom == hwndList)
+ {
+ switch (((LPNMHDR) lParam)->code)
+ {
+ case LVN_ITEMCHANGED:
+ {
+ if (GetWindowLongPtr(hDlg, GWLP_USERDATA))
+ {
+ NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam;
+
+ LVITEM lvI = {0};
+
+ lvI.iItem = nmlv->iItem;
+ lvI.iSubItem = 0;
+ lvI.mask = LVIF_PARAM;
+ ListView_GetItem(hwndList, &lvI);
+
+ vector<FILEINFO> &todo = *(vector<FILEINFO> *)GetWindowLongPtr(hDlg, GWLP_USERDATA);
+ if ((nmlv->uNewState ^ nmlv->uOldState) & LVIS_STATEIMAGEMASK)
+ {
+ todo[lvI.iItem].enabled = ListView_GetCheckState(hwndList, nmlv->iItem);
+
+ /*char stored_setting[256];
+ mir_snprintf(stored_setting, 256, "DisabledVer%s", ((UpdateInternal *)lvI.lParam)->update.szComponentName);
+
+ if (((UpdateInternal *)lvI.lParam)->update_options.enabled)
+ DBDeleteContactSetting(0, "Updater", stored_setting); // user has re-enabled update to this version - remove setting from db
+ else
+ DBWriteContactSettingString(0, "Updater", stored_setting, ((UpdateInternal *)lvI.lParam)->newVersion);
+ //ListView_SetItem(hwndList, &lvI);
+ */
+
+ bool enableOk = false;
+ for(int i=0; i<(int)todo.size(); ++i)
+ {
+ if(todo[i].enabled)
+ {
+ enableOk = true;
+ break;
+ }
+ }
+ HWND hwOk = GetDlgItem(hDlg, IDOK);
+ EnableWindow(hwOk, enableOk ? TRUE : FALSE);
+ }
+ if (nmlv->uNewState & LVIS_SELECTED)
+ {
+ if (lstrcmp(todo[lvI.iItem].tszInfoURL, _T("")))
+ EnableWindow(GetDlgItem(hDlg, IDC_INFO), TRUE);
+ else
+ EnableWindow(GetDlgItem(hDlg, IDC_INFO), FALSE);
+ SetDlgItemText(hDlg, IDC_MESSAGE, TranslateTS(todo[lvI.iItem].tszMessage));
+ /*char stored_setting[256];
+ char* descr = mir_t2a(todo[lvI.iItem].tszDescr);
+ mir_snprintf(stored_setting, 256, "DisabledVer%s", descr);
+ mir_free(descr);
+ DBVARIANT dbv;
+ if (!DBGetContactSettingTString(0, MODNAME, stored_setting, &dbv))
+ {
+ if(dbv.ptszVal && lstrcmp(dbv.ptszVal, todo[lvI.iItem].tszNewVer) == 0)
+ CheckDlgButton(hDlg, IDC_DONOTREMIND, BST_CHECKED);
+ else
+ DBDeleteContactSetting(0, MODNAME, stored_setting);
+ DBFreeVariant(&dbv);
+ }
+ else
+ CheckDlgButton(hDlg, IDC_DONOTREMIND, BST_UNCHECKED);
+ */
+
+ }
+ }
+ break;
+ }
+ }
+ }
+ break;
+ }
+ case WM_COMMAND:
+ {
+ if (HIWORD( wParam ) == BN_CLICKED)
+ {
+ switch(LOWORD(wParam))
+ {
+ case IDOK:
+ {
+ vector<FILEINFO> &todo = *(vector<FILEINFO> *)GetWindowLongPtr(hDlg, GWLP_USERDATA);
+ ShowWindow(hDlg, SW_HIDE);
+ TCHAR tszBuff[2048] = {0}, tszFileDest[MAX_PATH] = {0}, tszFilePathDest[MAX_PATH] = {0}, tszFilePathBack[MAX_PATH] = {0}, tszFileName[MAX_PATH] = {0};
+ TCHAR* tszExt = NULL;
+ char szKey[64] = {0};
+ vector<int> arFileType;
+ vector<tString> arFilePath;
+ vector<tString> arFileName;
+ vector<tString> arAdvFolder;
+ vector<tString> arExt;
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+
+ SetWindowLongPtr(hDlg, GWLP_USERDATA, 0);
+ Utils_SaveWindowPosition(hDlg, NULL, MODNAME, "ConfirmWindow");
+ /*DBWriteContactSettingByte(NULL, "Updater", "DefaultConfAll", IsDlgButtonChecked(hwndDlg, IDC_CHK_CONFALL) ? 1 : 0);
+ DBWriteContactSettingByte(NULL, "Updater", "NoInstall", IsDlgButtonChecked(hwndDlg, IDC_CHK_NOINSTALL) ? 1 : 0);
+
+ if (IsDlgButtonChecked(hDlg, IDC_CHK_CONFALL))
+ EndDialog(hDlg, CD_CONFALL);
+ else if (IsDlgButtonChecked(hDlg, IDC_CHK_NOINSTALL))
+ EndDialog(hDlg, CD_NOINSTALL);
+ else
+ */
+
+ arFileType.clear();
+ arFilePath.clear();
+ arFileName.clear();
+ arAdvFolder.clear();
+ arExt.clear();
+ for(int i=0; i<(int)todo.size(); ++i)
+ {
+ if(todo[i].enabled)
+ {
+ switch (todo[i].FileType)
+ {
+ case 1:
+ mir_sntprintf(tszFileDest, SIZEOF(tszFileDest), _T("%s\\Pack"), tszRoot);
+ CreateDirectory(tszFileDest, NULL);
+ break;
+ case 2:
+ mir_sntprintf(tszFileDest, SIZEOF(tszFileDest), _T("%s\\Plugins"), tszRoot);
+ CreateDirectory(tszFileDest, NULL);
+ break;
+ case 3:
+ mir_sntprintf(tszFileDest, SIZEOF(tszFileDest), _T("%s\\Icons"), tszRoot);
+ CreateDirectory(tszFileDest, NULL);
+ break;
+ case 4:
+ mir_sntprintf(tszFileDest, SIZEOF(tszFileDest), _T("%s\\Others"), tszRoot);
+ CreateDirectory(tszFileDest, NULL);
+ break;
+ case 5:
+ mir_sntprintf(tszFileDest, SIZEOF(tszFileDest), _T("%s\\Others"), tszRoot);
+ CreateDirectory(tszFileDest, NULL);
+ break;
+ default:
+ lstrcpyn(tszFileDest, tszRoot, SIZEOF(tszFileDest));
+ break;
+ }//end * switch (todo[i].FileType)
+ mir_sntprintf(tszBuff, SIZEOF(tszBuff), _T("%s\\Backups"), tszRoot);
+ CreateDirectory(tszBuff, NULL);
+ lstrcpyn(tszFileName, todo[i].File.tszDiskPath, SIZEOF(tszFileName));
+ mir_sntprintf(todo[i].File.tszDiskPath, SIZEOF(todo[i].File.tszDiskPath), _T("%s\\%s"), tszFileDest, tszFileName);
+ UpdatesCount++;
+
+ tszExt = &todo[i].File.tszDownloadURL[lstrlen(todo[i].File.tszDownloadURL)-5];
+ if (lstrcmp(tszExt, _T(".html")) == 0)
+ {
+ char* szUrl = mir_t2a(todo[i].File.tszDownloadURL);
+ CallService(MS_UTILS_OPENURL, TRUE, (LPARAM)szUrl);
+ mir_free(szUrl);
+ }
+ else
+ {
+ // download update
+ pFileUrl = &todo[i].File;
+ Title = TranslateT("Pack Updater");
+ if (todo[i].FileType == 1)
+ Text = TranslateT("Downloading pack updates...");
+ else
+ Text = TranslateT("Downloading update...");
+ DlgDownloadProc();
+ if (!DlgDld)
+ {
+ if (UpdatesCount)
+ UpdatesCount--;
+ continue;
+ }
+ }
+ lstrcpyn(todo[i].tszCurVer, todo[i].tszNewVer, SIZEOF(todo[i].tszCurVer));
+ mir_snprintf(szKey, SIZEOF(szKey), "File_%d_CurrentVersion", todo[i].FileNum);
+ DBWriteContactSettingTString(NULL, MODNAME, szKey, todo[i].tszCurVer);
+ arFileType.push_back(todo[i].FileType);
+ arFilePath.push_back(todo[i].File.tszDiskPath);
+ arFileName.push_back(tszFileName);
+ arAdvFolder.push_back(todo[i].tszAdvFolder);
+ arExt.push_back(tszExt);
+ if (todo[i].FileType == 1)
+ i = (int)todo.size();
+ }
+ }
+
+ if (UpdatesCount > 1 && lstrcmp(arExt[0].c_str(), _T(".html")) != 0)
+ lstrcpyn(tszBuff, TranslateT("Downloads complete. Start updating? All your data will be saved and Miranda IM will be closed."), SIZEOF(tszBuff));
+ else if (UpdatesCount == 1 && lstrcmp(arExt[0].c_str(), _T(".html")) != 0)
+ lstrcpyn(tszBuff, TranslateT("Download complete. Start updating? All your data will be saved and Miranda IM will be closed."), SIZEOF(tszBuff));
+ if (UpdatesCount > 0 && lstrcmp(arExt[0].c_str(), _T(".html")) != 0)
+ {
+ INT rc = -1;
+ Title = TranslateT("Pack Updater");
+ Text = tszBuff;
+ if (ServiceExists(MS_POPUP_ADDPOPUPEX) && ServiceExists(MS_POPUP_REGISTERACTIONS) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL,MODNAME, "Popups0", DEFAULT_POPUP_ENABLED) && (DBGetContactSettingDword(NULL, "PopUp", "Actions", 0) & 1))
+ rc = DialogBox(hInst, MAKEINTRESOURCE(IDD_POPUPDUMMI), NULL, DlgMsgPop);
+ else
+ rc = MessageBox(NULL, tszBuff, Title, MB_YESNO | MB_ICONQUESTION);
+ if (rc == IDYES)
+ {
+ for (int i = 0; i < UpdatesCount; i++)
+ {
+ TCHAR* tszUtilRootPlug = NULL;
+ TCHAR* tszUtilRootIco = NULL;
+ TCHAR* tszUtilRoot = NULL;
+
+ switch (arFileType[i])
+ {
+ case 0:
+ break;
+ case 1:
+ if (Reminder == 2)
+ DBWriteContactSettingByte(NULL, MODNAME, "Reminder", 1);
+ memset(&si, 0, sizeof(STARTUPINFO));
+ memset(&pi, 0, sizeof(PROCESS_INFORMATION));
+ si.cb = sizeof(STARTUPINFO);
+ CreateProcess(arFilePath[i].c_str(), _T(""), NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
+ i = UpdatesCount;
+ CallFunctionAsync(ExitMe, 0);
+ break;
+ case 2:
+ tszUtilRootPlug = Utils_ReplaceVarsT(_T("%miranda_path%\\Plugins"));
+ if (lstrcmp(arAdvFolder[i].c_str(), _T("")) == 0)
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s"), tszUtilRootPlug, arFileName[i].c_str());
+ else
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s\\%s"), tszUtilRootPlug, arAdvFolder[i].c_str(), arFileName[i].c_str());
+ mir_sntprintf(tszFilePathBack, SIZEOF(tszFilePathBack), _T("%s\\Backups\\%s"), tszRoot, arFileName[i].c_str());
+ MoveFile(tszFilePathDest, tszFilePathBack);
+ MoveFile(arFilePath[i].c_str(), tszFilePathDest);
+ mir_free(tszUtilRootPlug);
+ if (i == UpdatesCount - 1)
+ CallFunctionAsync(RestartMe, 0);
+ break;
+ case 3:
+ tszUtilRootIco = Utils_ReplaceVarsT(_T("%miranda_path%\\Icons"));
+ if (lstrcmp(arAdvFolder[i].c_str(), _T("")) == 0)
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s"), tszUtilRootIco, arFileName[i].c_str());
+ else
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s\\%s"), tszUtilRootIco, arAdvFolder[i].c_str(), arFileName[i].c_str());
+ mir_sntprintf(tszFilePathBack, SIZEOF(tszFilePathBack), _T("%s\\Backups\\%s"), tszRoot, arFileName[i].c_str());
+ MoveFile(tszFilePathDest, tszFilePathBack);
+ MoveFile(arFilePath[i].c_str(), tszFilePathDest);
+ mir_free(tszUtilRootIco);
+ if (i == UpdatesCount - 1)
+ CallFunctionAsync(RestartMe, 0);
+ break;
+ case 4:
+ tszUtilRoot = Utils_ReplaceVarsT(_T("%miranda_path%"));
+ if (lstrcmp(arAdvFolder[i].c_str(), _T("")) == 0)
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s"), tszUtilRoot, arFileName[i].c_str());
+ else
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s\\%s"), tszUtilRoot, arAdvFolder[i].c_str(), arFileName[i].c_str());
+ mir_sntprintf(tszFilePathBack, SIZEOF(tszFilePathBack), _T("%s\\Backups\\%s"), tszRoot, arFileName[i].c_str());
+ MoveFile(tszFilePathDest, tszFilePathBack);
+ MoveFile(arFilePath[i].c_str(), tszFilePathDest);
+ mir_free(tszUtilRoot);
+ if (i == UpdatesCount - 1)
+ CallFunctionAsync(RestartMe, 0);
+ break;
+ case 5:
+ tszUtilRoot = Utils_ReplaceVarsT(_T("%miranda_path%"));
+ if (lstrcmp(arAdvFolder[i].c_str(), _T("")) == 0)
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s"), tszUtilRoot, arFileName[i].c_str());
+ else
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s\\%s"), tszUtilRoot, arAdvFolder[i].c_str(), arFileName[i].c_str());
+ mir_sntprintf(tszFilePathBack, SIZEOF(tszFilePathBack), _T("%s\\Backups\\%s"), tszRoot, arFileName[i].c_str());
+ MoveFile(tszFilePathDest, tszFilePathBack);
+ MoveFile(arFilePath[i].c_str(), tszFilePathDest);
+ mir_free(tszUtilRoot);
+ break;
+ }//end* switch (arFileType[i])
+ }//end* for (int i = 0; i < UpdatesCount; i++)
+ }//end* if (IDYES == MessageBox(NULL, tszBuff, Title, MB_YESNO | MB_ICONQUESTION))
+ else
+ {//reminder for not installed pack update
+ if (Reminder && (UpdatesCount == 1) && (arFileType[0] == 1))
+ DBWriteContactSettingByte(NULL, MODNAME, "Reminder", 2);
+ mir_sntprintf(tszBuff, SIZEOF(tszBuff), TranslateT("You have chosen not to install the pack update immediately.\nYou can install it manually from this location:\n\n%s"), arFilePath[0].c_str());
+ Title = TranslateT("Pack Updater");
+ Text = tszBuff;
+ if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL, MODNAME, "Popups2", DEFAULT_POPUP_ENABLED))
+ {
+ Number = 2;
+ show_popup(0, Title, Text, Number, 0);
+ }
+ else if (DBGetContactSettingByte(NULL, MODNAME, "Popups2M", DEFAULT_MESSAGE_ENABLED))
+ MessageBox(NULL, Text, Title, MB_ICONINFORMATION);
+ }
+ }//end* if (UpdatesCount > 0)
+
+ EndDialog(hDlg, IDOK);
+ return TRUE;
+ }
+ case IDCANCEL:
+ {
+ SetWindowLongPtr(hDlg, GWLP_USERDATA, 0);
+ Utils_SaveWindowPosition(hDlg, NULL, MODNAME, "ConfirmWindow");
+ EndDialog(hDlg, IDCANCEL);
+ return TRUE;
+ }
+ case IDC_INFO:
+ {
+ int sel = ListView_GetSelectionMark(hwndList);
+ vector<FILEINFO> &todo = *(vector<FILEINFO> *)GetWindowLongPtr(hDlg, GWLP_USERDATA);
+ char* szUrl = mir_t2a(todo[sel].tszInfoURL);
+ CallService(MS_UTILS_OPENURL, TRUE, (LPARAM)szUrl);
+ mir_free(szUrl);
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+INT_PTR CALLBACK DlgMsgPop(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ Number = 0;
+ show_popup(hDlg, Title, Text, Number, 1);
+ return TRUE;
+ } // end* WM_INITDIALOG:
+ } // end* switch (uMsg)
+ ShowWindow(hDlg, SW_HIDE);
+ return FALSE;
+} \ No newline at end of file
diff --git a/plugins/PackUpdater/Src/Notifications.h b/plugins/PackUpdater/Src/Notifications.h
new file mode 100644
index 0000000000..09bc77a810
--- /dev/null
+++ b/plugins/PackUpdater/Src/Notifications.h
@@ -0,0 +1,72 @@
+/*
+Copyright (C) 2010 Mataes
+
+This is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this file; see the file license.txt. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+*/
+
+#define POPUPS 4
+
+//=== Objects =====
+//This one is used to easily tie status id, icon, text...
+typedef struct
+{
+ int ID;
+ int Icon;
+ COLORREF colorBack;
+ COLORREF colorText;
+} aPopups;
+
+typedef struct _MSGPOPUPDATA
+{
+ POPUPACTION pa[4];
+ HWND hDialog;
+}
+MSGPOPUPDATA, *LPMSGPOPUPDATA;
+
+#define DEFAULT_POPUP_LCLICK 1
+#define DEFAULT_POPUP_RCLICK 0
+#define DEFAULT_POPUP_ENABLED 1
+#define DEFAULT_MESSAGE_ENABLED 1
+#define DEFAULT_TIMEOUT_VALUE 0
+
+#define COLOR_BG_FIRSTDEFAULT RGB(173,206,247)
+#define COLOR_BG_SECONDDEFAULT RGB(255,189,189)
+#define COLOR_TX_DEFAULT RGB(0,0,0)
+
+#define byCOLOR_OWN 0x1
+#define byCOLOR_WINDOWS 0x2
+#define byCOLOR_POPUP 0x3
+#define DEFAULT_COLORS byCOLOR_POPUP
+
+// Actions on popup click
+#define PCA_CLOSEPOPUP 0 // close popup
+#define PCA_DONOTHING 1 // do nothing
+
+//===== Options flags
+typedef struct tagMYOPTIONS {
+ BYTE DefColors;
+ BYTE LeftClickAction;
+ BYTE RightClickAction;
+ int Timeout;
+} MYOPTIONS;
+
+static struct {
+ TCHAR *Text;
+ int Action;
+} PopupActions[] = {
+ _T("Close popup"), PCA_CLOSEPOPUP,
+ _T("Do nothing"), PCA_DONOTHING
+};
diff --git a/plugins/PackUpdater/Src/Options.cpp b/plugins/PackUpdater/Src/Options.cpp
new file mode 100644
index 0000000000..b147660816
--- /dev/null
+++ b/plugins/PackUpdater/Src/Options.cpp
@@ -0,0 +1,480 @@
+/*
+Copyright (C) 2010 Mataes
+
+This is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this file; see the file license.txt. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+*/
+
+#include "common.h"
+
+WNDPROC g_pOldProc;
+
+LRESULT CALLBACK MyEditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_KEYDOWN:
+ SendMessage(GetParent(GetParent(hwnd)), PSM_CHANGED, 0, 0);
+ break;
+ }
+ return CallWindowProc (g_pOldProc, hwnd, message, wParam, lParam);
+}
+
+INT_PTR CALLBACK UpdateNotifyOptsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ WORD i = 0;
+ char str[20] = {0};
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hwndDlg);
+ CheckDlgButton(hwndDlg, IDC_UPDATEONSTARTUP, (int)UpdateOnStartup);
+ CheckDlgButton(hwndDlg, IDC_ONLYONCEADAY, (int)OnlyOnceADay);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ONLYONCEADAY), UpdateOnStartup);
+ CheckDlgButton(hwndDlg, IDC_UPDATEONPERIOD, (int)UpdateOnPeriod);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_PERIOD), UpdateOnPeriod);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_PERIODSPIN), UpdateOnPeriod);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), UpdateOnPeriod);
+
+ SendDlgItemMessage(hwndDlg, IDC_PERIODSPIN, UDM_SETRANGE, 0, MAKELONG(99, 1));
+ SendDlgItemMessage(hwndDlg, IDC_PERIODSPIN, UDM_SETPOS, 0, (LPARAM)Period);
+
+ Edit_LimitText(GetDlgItem(hwndDlg, IDC_PERIOD), 2);
+ g_pOldProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PERIOD), GWLP_WNDPROC, (LONG)MyEditProc);
+
+ ComboBox_InsertString(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), 0, TranslateT("hours"));
+ ComboBox_InsertString(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), 1, TranslateT("days"));
+ ComboBox_SetCurSel(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), PeriodMeasure);
+
+ CheckDlgButton(hwndDlg, IDC_REMINDER, (int)Reminder);
+ if (ServiceExists(MS_POPUP_ADDPOPUP))
+ {
+ ShowWindow(GetDlgItem(hwndDlg, IDC_NOTIFY2), SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg, IDC_MSG_BOXES2), SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg, IDC_ERRORS2), SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg, IDC_INFO_MESSAGES2), SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg, IDC_PROGR_DLG2), SW_HIDE);
+ }
+ else
+ {
+ for (i = 1; i < POPUPS; i++)
+ {
+ mir_snprintf(str, SIZEOF(str), "Popups%dM", i);
+ CheckDlgButton(hwndDlg, (i+1029), (DBGetContactSettingByte(NULL, MODNAME, str, DEFAULT_MESSAGE_ENABLED)) ? BST_CHECKED: BST_UNCHECKED);
+ }
+ }
+ return TRUE;
+ }
+
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wParam))
+ {
+ case IDC_UPDATEONSTARTUP:
+ {
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ONLYONCEADAY), IsDlgButtonChecked(hwndDlg, IDC_UPDATEONSTARTUP));
+ }
+ break;
+ case IDC_ONLYONCEADAY:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case IDC_UPDATEONPERIOD:
+ {
+ BOOL value = IsDlgButtonChecked(hwndDlg, IDC_UPDATEONPERIOD);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_PERIOD), value);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_PERIODSPIN), value);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), value);
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+ break;
+ case IDC_PERIODMEASURE:
+ if (HIWORD(wParam) == CBN_SELCHANGE)
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case IDC_REMINDER:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case IDC_LINK_HOTKEY:
+ {
+ OPENOPTIONSDIALOG ood = {0};
+ ood.cbSize = sizeof(ood);
+ ood.pszGroup = "Customize";
+ ood.pszPage = "Hotkeys";
+ CallService( MS_OPT_OPENOPTIONS, 0, (LPARAM)&ood );
+ return (true);
+ }
+ case IDC_MSG_BOXES2:
+ case IDC_ERRORS2:
+ case IDC_INFO_MESSAGES2:
+ case IDC_PROGR_DLG2:
+ if ((HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == EN_CHANGE) && (HWND)lParam == GetFocus())
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+ break;
+ }
+ case WM_NOTIFY:
+ {
+ NMHDR *hdr = (NMHDR *)lParam;
+ if(hdr && hdr->code == UDN_DELTAPOS)
+ {
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+ if (hdr && hdr->code == PSN_APPLY)
+ {
+ UpdateOnStartup = IsDlgButtonChecked(hwndDlg, IDC_UPDATEONSTARTUP);
+ OnlyOnceADay = IsDlgButtonChecked(hwndDlg, IDC_ONLYONCEADAY);
+
+ UpdateOnPeriod = IsDlgButtonChecked(hwndDlg, IDC_UPDATEONPERIOD);
+
+ char buffer[3] = {0};
+ Edit_GetText(GetDlgItem(hwndDlg, IDC_PERIOD), (LPWSTR)&buffer, 2);
+ Period = atoi(buffer);
+
+ PeriodMeasure = ComboBox_GetCurSel(GetDlgItem(hwndDlg, IDC_PERIODMEASURE));
+
+ InitTimer();
+
+ DBWriteContactSettingByte(NULL, MODNAME, "UpdateOnStartup", UpdateOnStartup);
+ DBWriteContactSettingByte(NULL, MODNAME, "OnlyOnceADay", OnlyOnceADay);
+ DBWriteContactSettingByte(NULL, MODNAME, "UpdateOnPeriod", UpdateOnPeriod);
+ DBWriteContactSettingDword(NULL, MODNAME, "Period", Period);
+ DBWriteContactSettingByte(NULL, MODNAME, "PeriodMeasure", PeriodMeasure);
+ Reminder = IsDlgButtonChecked(hwndDlg, IDC_REMINDER);
+ DBWriteContactSettingByte(NULL, MODNAME, "Reminder", Reminder);
+ if (!ServiceExists(MS_POPUP_ADDPOPUP))
+ {
+ for (i = 1; i < POPUPS; i++)
+ {
+ mir_snprintf(str, SIZEOF(str), "Popups%dM", i);
+ DBWriteContactSettingByte(NULL, MODNAME, str, (BYTE)(IsDlgButtonChecked(hwndDlg, (i+1029))));
+ }
+ }
+ }
+ break;
+ }
+ }//end* switch (msg)
+ return FALSE;
+}
+
+INT_PTR CALLBACK DlgPopUpOpts(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ WORD i = 0;
+ char str[20] = {0}, str2[20] = {0};
+
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hdlg);
+ //Colors
+ if (MyOptions.DefColors == byCOLOR_OWN)
+ {
+ CheckDlgButton(hdlg, IDC_USEOWNCOLORS, BST_CHECKED);
+ CheckDlgButton(hdlg, IDC_USEPOPUPCOLORS, BST_UNCHECKED);
+ CheckDlgButton(hdlg, IDC_USEWINCOLORS, BST_UNCHECKED);
+ }
+ if (MyOptions.DefColors == byCOLOR_WINDOWS)
+ {
+ CheckDlgButton(hdlg, IDC_USEOWNCOLORS, BST_UNCHECKED);
+ CheckDlgButton(hdlg, IDC_USEPOPUPCOLORS, BST_UNCHECKED);
+ CheckDlgButton(hdlg, IDC_USEWINCOLORS, BST_CHECKED);
+ }
+ if (MyOptions.DefColors == byCOLOR_POPUP)
+ {
+ CheckDlgButton(hdlg, IDC_USEOWNCOLORS, BST_UNCHECKED);
+ CheckDlgButton(hdlg, IDC_USEPOPUPCOLORS, BST_CHECKED);
+ CheckDlgButton(hdlg, IDC_USEWINCOLORS, BST_UNCHECKED);
+ }
+ SendDlgItemMessage(hdlg, (42071), CPM_SETCOLOUR, 0, PopupsList[0].colorBack);
+ SendDlgItemMessage(hdlg, (41071), CPM_SETCOLOUR, 0, PopupsList[0].colorText);
+ for (i = 1; i < POPUPS; i++)
+ {
+ SendDlgItemMessage(hdlg, (i+42071), CPM_SETCOLOUR, 0, PopupsList[i].colorBack);
+ SendDlgItemMessage(hdlg, (i+41071), CPM_SETCOLOUR, 0, PopupsList[i].colorText);
+ EnableWindow(GetDlgItem(hdlg, (i+42071)), (MyOptions.DefColors == byCOLOR_OWN));
+ EnableWindow(GetDlgItem(hdlg, (i+41071)), (MyOptions.DefColors == byCOLOR_OWN));
+ }
+ //Timeout
+ SendDlgItemMessage(hdlg, IDC_TIMEOUT_VALUE, EM_LIMITTEXT, 4, 0);
+ SendDlgItemMessage(hdlg, IDC_TIMEOUT_VALUE_SPIN, UDM_SETRANGE32, -1, 9999);
+ SetDlgItemInt(hdlg, IDC_TIMEOUT_VALUE, MyOptions.Timeout, TRUE);
+ //Mouse actions
+ for (i = 0; i < SIZEOF(PopupActions); i++)
+ {
+ SendMessage(GetDlgItem(hdlg, IDC_LC), CB_SETITEMDATA, SendMessage(GetDlgItem(hdlg, IDC_LC), CB_ADDSTRING, 0, (LPARAM)TranslateTS(PopupActions[i].Text)), PopupActions[i].Action);
+ SendMessage(GetDlgItem(hdlg, IDC_RC), CB_SETITEMDATA, SendMessage(GetDlgItem(hdlg, IDC_RC), CB_ADDSTRING, 0, (LPARAM)TranslateTS(PopupActions[i].Text)), PopupActions[i].Action);
+ }
+ SendDlgItemMessage(hdlg, IDC_LC, CB_SETCURSEL, MyOptions.LeftClickAction, 0);
+ SendDlgItemMessage(hdlg, IDC_RC, CB_SETCURSEL, MyOptions.RightClickAction, 0);
+ //Popups nitified
+ for (i = 0; i < POPUPS; i++)
+ {
+ mir_snprintf(str, SIZEOF(str), "Popups%d", i);
+ mir_snprintf(str2, SIZEOF(str2), "Popups%dM", i);
+ CheckDlgButton(hdlg, (i+40071), (DBGetContactSettingByte(NULL, MODNAME, str, DEFAULT_POPUP_ENABLED)) ? BST_CHECKED: BST_UNCHECKED);
+ CheckDlgButton(hdlg, (i+1024), (DBGetContactSettingByte(NULL, MODNAME, str2, DEFAULT_MESSAGE_ENABLED)) ? BST_CHECKED: BST_UNCHECKED);
+ if (IsDlgButtonChecked(hdlg, (i+40071)))
+ EnableWindow(GetDlgItem(hdlg, (i+1024)), FALSE);
+ else if (i > 0)
+ EnableWindow(GetDlgItem(hdlg, (i+1024)), TRUE);
+ }
+ if (!(DBGetContactSettingDword(NULL, "PopUp", "Actions", 0) & 1) || !ServiceExists(MS_POPUP_REGISTERACTIONS))
+ {
+ EnableWindow(GetDlgItem(hdlg, (40071)), FALSE);
+ EnableWindow(GetDlgItem(hdlg, (41071)), FALSE);
+ EnableWindow(GetDlgItem(hdlg, (42071)), FALSE);
+ }
+ else
+ {
+ EnableWindow(GetDlgItem(hdlg, (40071)), TRUE);
+ EnableWindow(GetDlgItem(hdlg, (41071)), (MyOptions.DefColors == byCOLOR_OWN));
+ EnableWindow(GetDlgItem(hdlg, (42071)), (MyOptions.DefColors == byCOLOR_OWN));
+ }
+ return TRUE;
+ }
+ case WM_SHOWWINDOW:
+ if (!(DBGetContactSettingDword(NULL, "PopUp", "Actions", 0) & 1) || !ServiceExists(MS_POPUP_REGISTERACTIONS))
+ {
+ EnableWindow(GetDlgItem(hdlg, (40071)), FALSE);
+ EnableWindow(GetDlgItem(hdlg, (41071)), FALSE);
+ EnableWindow(GetDlgItem(hdlg, (42071)), FALSE);
+ }
+ else
+ {
+ EnableWindow(GetDlgItem(hdlg, (40071)), TRUE);
+ EnableWindow(GetDlgItem(hdlg, (41071)), (MyOptions.DefColors == byCOLOR_OWN));
+ EnableWindow(GetDlgItem(hdlg, (42071)), (MyOptions.DefColors == byCOLOR_OWN));
+ }
+ return TRUE;
+ case WM_COMMAND:
+ {
+ WORD idCtrl = LOWORD(wParam), wNotifyCode = HIWORD(wParam);
+ if (wNotifyCode == CPN_COLOURCHANGED)
+ {
+ if(idCtrl > 40070)
+ {
+ //It's a color picker change. idCtrl is the control id.
+ COLORREF color = SendDlgItemMessage(hdlg, idCtrl, CPM_GETCOLOUR, 0, 0);
+ int ctlID = idCtrl;
+ if ((ctlID > 41070) && (ctlID < 42070)) //It's 41071 or above => Text color.
+ PopupsList[ctlID-41071].colorText = color;
+ else if (ctlID > 42070)//Background color.
+ PopupsList[ctlID-42071].colorBack = color;
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ return TRUE;
+ }
+ }
+ if (wNotifyCode == CBN_SELCHANGE)
+ {
+ if (idCtrl == IDC_LC)
+ {
+ MyOptions.LeftClickAction = (BYTE)SendDlgItemMessage(hdlg, IDC_LC, CB_GETCURSEL, 0, 0);
+ }
+ else if(idCtrl == IDC_RC)
+ {
+ MyOptions.RightClickAction = (BYTE)SendDlgItemMessage(hdlg, IDC_RC, CB_GETCURSEL, 0, 0);
+ }
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ return TRUE;
+ }
+ switch(idCtrl)
+ {
+ case IDC_USEOWNCOLORS:
+ {
+ BOOL bEnableOthers = FALSE;
+ if (wNotifyCode != BN_CLICKED)
+ break;
+ MyOptions.DefColors = byCOLOR_OWN;
+ bEnableOthers = TRUE;
+ if (!(DBGetContactSettingDword(NULL, "PopUp", "Actions", 0) & 1) || !ServiceExists(MS_POPUP_REGISTERACTIONS))
+ {
+ EnableWindow(GetDlgItem(hdlg, (41071)), FALSE);
+ EnableWindow(GetDlgItem(hdlg, (42071)), FALSE);
+ }
+ else
+ {
+ EnableWindow(GetDlgItem(hdlg, (41071)), bEnableOthers);
+ EnableWindow(GetDlgItem(hdlg, (42071)), bEnableOthers);
+ }
+ for (i = 1; i < POPUPS; i++)
+ {
+ EnableWindow(GetDlgItem(hdlg, (i+42071)), bEnableOthers); //Background
+ EnableWindow(GetDlgItem(hdlg, (i+41071)), bEnableOthers); //Text
+ }
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+ case IDC_USEWINCOLORS:
+ {
+ BOOL bEnableOthers = FALSE;
+ if (wNotifyCode != BN_CLICKED)
+ break;
+ //Use Windows colors
+ MyOptions.DefColors = byCOLOR_WINDOWS;
+ bEnableOthers = FALSE;
+ for (i = 0; i < POPUPS; i++)
+ {
+ EnableWindow(GetDlgItem(hdlg, (i+42071)), bEnableOthers); //Background
+ EnableWindow(GetDlgItem(hdlg, (i+41071)), bEnableOthers); //Text
+ }
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+ case IDC_USEPOPUPCOLORS:
+ {
+ BOOL bEnableOthers = FALSE;
+ if (wNotifyCode != BN_CLICKED)
+ break;
+ //Use Popup colors
+ MyOptions.DefColors = byCOLOR_POPUP;
+ bEnableOthers = FALSE;
+ for (i = 0; i < POPUPS; i++)
+ {
+ EnableWindow(GetDlgItem(hdlg, (i+42071)), bEnableOthers); //Background
+ EnableWindow(GetDlgItem(hdlg, (i+41071)), bEnableOthers); //Text
+ }
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+ case IDC_PREVIEW:
+ {//Declarations and initializations
+ Title = TranslateT("Pack Updater");
+ Text = TranslateT("Test");
+ for (int i = 0; i < POPUPS; i++)
+ {
+ if ((!IsDlgButtonChecked(hdlg, (i+40071))) || (!IsWindowEnabled(GetDlgItem(hdlg, (i+40071)))))
+ continue;
+ show_popup(0, Title, Text, i, 0);
+ }
+ break;
+ }
+ case IDC_TIMEOUT_VALUE:
+ case IDC_MSG_BOXES:
+ case IDC_ERRORS:
+ {
+ if (!IsDlgButtonChecked(hdlg, IDC_ERRORS))
+ EnableWindow(GetDlgItem(hdlg, IDC_ERRORS_MSG), TRUE);
+ else
+ EnableWindow(GetDlgItem(hdlg, IDC_ERRORS_MSG), FALSE);
+ if ((HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == EN_CHANGE) && (HWND)lParam == GetFocus())
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+ case IDC_INFO_MESSAGES:
+ {
+ if (!IsDlgButtonChecked(hdlg, IDC_INFO_MESSAGES))
+ EnableWindow(GetDlgItem(hdlg, IDC_INFO_MESSAGES_MSG), TRUE);
+ else
+ EnableWindow(GetDlgItem(hdlg, IDC_INFO_MESSAGES_MSG), FALSE);
+ if ((HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == EN_CHANGE) && (HWND)lParam == GetFocus())
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+ case IDC_PROGR_DLG:
+ {
+ if (!IsDlgButtonChecked(hdlg, IDC_PROGR_DLG))
+ EnableWindow(GetDlgItem(hdlg, IDC_PROGR_DLG_MSG), TRUE);
+ else
+ EnableWindow(GetDlgItem(hdlg, IDC_PROGR_DLG_MSG), FALSE);
+ if ((HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == EN_CHANGE) && (HWND)lParam == GetFocus())
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+ case IDC_MSG_BOXES_MSG:
+ case IDC_ERRORS_MSG:
+ case IDC_INFO_MESSAGES_MSG:
+ case IDC_PROGR_DLG_MSG:
+ if ((HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == EN_CHANGE) && (HWND)lParam == GetFocus())
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ break;
+ }//end* switch(idCtrl)
+ break;
+ }//end* case WM_COMMAND:
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_RESET:
+ {
+ //Restore the options stored in memory.
+ LoadOptions();
+ InitPopupList();
+ return TRUE;
+ }
+ case PSN_APPLY:
+ {
+ //Text color
+ char szSetting[20] = {0};
+ DWORD ctlColor = 0;
+ for (i = 0; i <= POPUPS-1; i++)
+ {
+ ctlColor = SendDlgItemMessage(hdlg, (i+42071), CPM_GETCOLOUR, 0, 0);
+ PopupsList[i].colorBack = ctlColor;
+ mir_snprintf(szSetting, SIZEOF(szSetting), "Popups%iBg", i);
+ DBWriteContactSettingDword(NULL, MODNAME, szSetting, ctlColor);
+ ctlColor = SendDlgItemMessage(hdlg, (i+41071), CPM_GETCOLOUR, 0, 0);
+ PopupsList[i].colorText = ctlColor;
+ mir_snprintf(szSetting, SIZEOF(szSetting), "Popups%iTx", i);
+ DBWriteContactSettingDword(NULL, MODNAME, szSetting, ctlColor);
+ }
+ //Colors
+ DBWriteContactSettingByte(NULL, MODNAME, "DefColors", MyOptions.DefColors);
+ //Timeout
+ MyOptions.Timeout = GetDlgItemInt(hdlg, IDC_TIMEOUT_VALUE, 0, TRUE);
+ DBWriteContactSettingDword(NULL, MODNAME, "Timeout", MyOptions.Timeout);
+ //Left mouse click
+ DBWriteContactSettingByte(NULL, MODNAME, "LeftClickAction", MyOptions.LeftClickAction);
+ //Right mouse click
+ DBWriteContactSettingByte(NULL, MODNAME, "RightClickAction", MyOptions.RightClickAction);
+ //Notified popups
+ for (i = 0; i < POPUPS; i++)
+ {
+ mir_snprintf(str, SIZEOF(str), "Popups%d", i);
+ DBWriteContactSettingByte(NULL, MODNAME, str, (BYTE)(IsDlgButtonChecked(hdlg, (i+40071))));
+ mir_snprintf(str2, SIZEOF(str2), "Popups%dM", i);
+ DBWriteContactSettingByte(NULL, MODNAME, str2, (BYTE)(IsDlgButtonChecked(hdlg, (i+1024))));
+ }
+ return TRUE;
+ } //case PSN_APPLY
+ } // switch code
+ break; //End WM_NOTIFY
+ } //switch message
+return FALSE;
+}
+
+int OptInit(WPARAM wParam, LPARAM lParam)
+{
+ OPTIONSDIALOGPAGE odp = {0};
+ odp.cbSize = sizeof(odp);
+ odp.position = 100000000;
+ odp.hInstance = hInst;
+ odp.flags = ODPF_BOLDGROUPS | ODPF_TCHAR;
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_UPDATENOTIFY);
+ odp.ptszGroup = LPGENT("Events");
+ odp.ptszTitle = LPGENT("Pack Updater");
+ odp.pfnDlgProc = UpdateNotifyOptsProc;
+ Options_AddPage(wParam, &odp);
+
+ if (ServiceExists(MS_POPUP_ADDPOPUP)) {
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_POPUP);
+ odp.ptszGroup = LPGENT("PopUps");
+ odp.ptszTitle = LPGENT("Pack Updater");
+ odp.pfnDlgProc = DlgPopUpOpts;
+ Options_AddPage(wParam, &odp);
+ }
+ return 0;
+} \ No newline at end of file
diff --git a/plugins/PackUpdater/Src/PackUpdater.cpp b/plugins/PackUpdater/Src/PackUpdater.cpp
new file mode 100644
index 0000000000..1d58853c1c
--- /dev/null
+++ b/plugins/PackUpdater/Src/PackUpdater.cpp
@@ -0,0 +1,108 @@
+/*
+Copyright (C) 2010 Mataes
+
+This is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this file; see the file license.txt. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+*/
+
+#include "common.h"
+
+HINSTANCE hInst = NULL;
+
+HANDLE hOptHook = NULL, hLoadHook = NULL, hPackUpdaterFolder = NULL, hCheckUpdates = NULL, hEmptyFolder = NULL, hOnPreShutdown = NULL;
+TCHAR tszRoot[MAX_PATH] = {0};
+int hLangpack;
+
+PLUGININFOEX pluginInfoEx = {
+ sizeof(PLUGININFOEX),
+ __PLUGIN_NAME,
+ PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM),
+ __DESCRIPTION,
+ __AUTHOR,
+ __AUTHOREMAIL,
+ __COPYRIGHT,
+ __AUTHORWEB,
+ UNICODE_AWARE,
+ //{29517BE5-779A-48e5-8950-CB4DE1D43172}
+ {0x29517be5, 0x779a, 0x48e5, {0x89, 0x50, 0xcb, 0x4d, 0xe1, 0xd4, 0x31, 0x72}}
+};
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+ hInst = hinstDLL;
+ return TRUE;
+}
+
+extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ return &pluginInfoEx;
+}
+
+extern "C" __declspec(dllexport) int Load(void)
+{
+ CLISTMENUITEM mi;
+
+ mir_getLP(&pluginInfoEx);
+ TCHAR* tszFolder = Utils_ReplaceVarsT(_T("%miranda_userdata%\\"DEFAULT_UPDATES_FOLDER));
+ lstrcpyn(tszRoot, tszFolder, SIZEOF(tszRoot));
+ if (ServiceExists(MS_FOLDERS_REGISTER_PATH))
+ {
+ hPackUpdaterFolder = FoldersRegisterCustomPathT(MODULEA, "Pack Updater", MIRANDA_USERDATAT _T("\\")DEFAULT_UPDATES_FOLDER);
+ FoldersGetCustomPathT(hPackUpdaterFolder, tszRoot, MAX_PATH, _T(""));
+ }
+ mir_free(tszFolder);
+ LoadOptions();
+ InitPopupList();
+ NetlibInit();
+ IcoLibInit();
+
+ // Add cheking update menu item
+ hCheckUpdates = CreateServiceFunction(MODNAME"/CheckUpdates", MenuCommand);
+ ZeroMemory(&mi, sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.position = -0x7FFFFFFF;
+ mi.flags = CMIF_TCHAR;
+ mi.hIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)"check_update");
+ mi.ptszName = _T("Check for pack updates");
+ mi.pszService = MODNAME"/CheckUpdates";
+ Menu_AddMainMenuItem(&mi);
+ // Add empty updates folder menu item
+ hEmptyFolder = CreateServiceFunction(MODNAME"/EmptyFolder", EmptyFolder);
+ ZeroMemory(&mi, sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.position = -0x7FFFFFFF;
+ mi.flags = CMIF_TCHAR;
+ mi.hIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)"empty_folder");
+ mi.ptszName = _T("Clear pack updates folder");
+ mi.pszService = MODNAME"/EmptyFolder";
+ Menu_AddMainMenuItem(&mi);
+
+ // Add options hook
+ hOptHook = HookEvent(ME_OPT_INITIALISE, OptInit);
+ hLoadHook = HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded);
+ hOnPreShutdown = HookEvent(ME_SYSTEM_PRESHUTDOWN, OnPreShutdown);
+
+ return 0;
+}
+
+extern "C" __declspec(dllexport) int Unload(void)
+{
+ if (CheckThread)
+ CheckThread = NULL;
+ NetlibUnInit();
+ DestroyServiceFunction(hCheckUpdates);
+ DestroyServiceFunction(hEmptyFolder);
+ return 0;
+} \ No newline at end of file
diff --git a/plugins/PackUpdater/Src/Utils.cpp b/plugins/PackUpdater/Src/Utils.cpp
new file mode 100644
index 0000000000..6841316644
--- /dev/null
+++ b/plugins/PackUpdater/Src/Utils.cpp
@@ -0,0 +1,490 @@
+/*
+Copyright (C) 2010 Mataes
+
+This is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this file; see the file license.txt. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+*/
+
+#include "Common.h"
+
+vector<FILEINFO> Files;
+BOOL DlgDld;
+INT FileCount = 0, CurrentFile = 0, Number = 0;
+BYTE Reminder, AutoUpdate;
+BYTE UpdateOnStartup, UpdateOnPeriod, OnlyOnceADay, PeriodMeasure;
+INT Period;
+TCHAR tszDialogMsg[2048] = {0};
+FILEINFO* pFileInfo = NULL;
+FILEURL* pFileUrl = NULL;
+HANDLE CheckThread = NULL, hNetlibUser = NULL;
+MYOPTIONS MyOptions = {0};
+aPopups PopupsList[POPUPS];
+LPCTSTR Title = {0}, Text = {0};
+
+PackUpdaterIconList iconList[] =
+{
+ { "check_update", _T("Check for pack updates"), IDI_MENU },
+ { "empty_folder", _T("Clear pack updates folder"), IDI_DELETE },
+ { "btn_ok", _T("'Yes' Button"), IDI_OK },
+ { "btn_cancel", _T("'No' Button"), IDI_CANCEL }
+};
+
+VOID IcoLibInit()
+{
+ SKINICONDESC sid;
+ TCHAR destfile[MAX_PATH];
+
+ GetModuleFileName(hInst, destfile, MAX_PATH);
+
+ sid.cbSize = sizeof(sid);
+ sid.flags = SIDF_ALL_TCHAR;
+ sid.cx = sid.cy = 16;
+ sid.ptszDefaultFile = destfile;
+ sid.ptszSection = MODULE;
+
+ for (int i = 0; i < SIZEOF(iconList); i++)
+ {
+ sid.pszName = iconList[i].szIconName;
+ sid.ptszDescription = iconList[i].tszDescr;
+ sid.iDefaultIndex = -iconList[i].IconID;
+ Skin_AddIcon(&sid);
+ }
+}
+
+BOOL NetlibInit()
+{
+ NETLIBUSER nlu = {0};
+ nlu.cbSize = sizeof(nlu);
+ nlu.flags = NUF_OUTGOING | NUF_INCOMING | NUF_HTTPCONNS | NUF_TCHAR; // | NUF_HTTPGATEWAY;
+ nlu.ptszDescriptiveName = TranslateT("Pack Updater HTTP connection");
+ nlu.szSettingsModule = MODNAME;
+ hNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nlu);
+
+ return hNetlibUser != NULL;
+}
+
+VOID NetlibUnInit()
+{
+ Netlib_CloseHandle(hNetlibUser);
+ hNetlibUser = NULL;
+}
+
+VOID InitPopupList()
+{
+ int index = 0;
+ PopupsList[index].ID = index;
+ PopupsList[index].Icon = SKINICON_OTHER_MIRANDA;
+ PopupsList[index].colorBack = DBGetContactSettingDword(NULL, MODNAME, "Popups0Bg", COLOR_BG_FIRSTDEFAULT);
+ PopupsList[index].colorText = DBGetContactSettingDword(NULL, MODNAME, "Popups0Tx", COLOR_TX_DEFAULT);
+
+ index = 1;
+ PopupsList[index].ID = index;
+ PopupsList[index].Icon = SKINICON_OTHER_MIRANDA;
+ PopupsList[index].colorBack = DBGetContactSettingDword(NULL, MODNAME, "Popups1Bg", COLOR_BG_SECONDDEFAULT);
+ PopupsList[index].colorText = DBGetContactSettingDword(NULL, MODNAME, "Popups1Tx", COLOR_TX_DEFAULT);
+
+ index = 2;
+ PopupsList[index].ID = index;
+ PopupsList[index].Icon = SKINICON_OTHER_MIRANDA;
+ PopupsList[index].colorBack = DBGetContactSettingDword(NULL, MODNAME, "Popups2Bg", COLOR_BG_FIRSTDEFAULT);
+ PopupsList[index].colorText = DBGetContactSettingDword(NULL, MODNAME, "Popups2Tx", COLOR_TX_DEFAULT);
+
+ index = 3;
+ PopupsList[index].ID = index;
+ PopupsList[index].Icon = SKINICON_OTHER_MIRANDA;
+ PopupsList[index].colorBack = DBGetContactSettingDword(NULL, MODNAME, "Popups3Bg", COLOR_BG_SECONDDEFAULT);
+ PopupsList[index].colorText = DBGetContactSettingDword(NULL, MODNAME, "Popups3Tx", COLOR_TX_DEFAULT);
+}
+
+VOID LoadOptions()
+{
+ MyOptions.DefColors = DBGetContactSettingByte(NULL, MODNAME, "DefColors", DEFAULT_COLORS);
+ MyOptions.LeftClickAction= DBGetContactSettingByte(NULL, MODNAME, "LeftClickAction", DEFAULT_POPUP_LCLICK);
+ MyOptions.RightClickAction = DBGetContactSettingByte(NULL, MODNAME, "RightClickAction", DEFAULT_POPUP_RCLICK);
+ MyOptions.Timeout = DBGetContactSettingDword(NULL, MODNAME, "Timeout", DEFAULT_TIMEOUT_VALUE);
+ UpdateOnStartup = DBGetContactSettingByte(NULL, MODNAME, "UpdateOnStartup", DEFAULT_UPDATEONSTARTUP);
+ OnlyOnceADay = DBGetContactSettingByte(NULL, MODNAME, "OnlyOnceADay", DEFAULT_ONLYONCEADAY);
+ UpdateOnPeriod = DBGetContactSettingByte(NULL, MODNAME, "UpdateOnPeriod", DEFAULT_UPDATEONPERIOD);
+ Period = DBGetContactSettingDword(NULL, MODNAME, "Period", DEFAULT_PERIOD);
+ PeriodMeasure = DBGetContactSettingByte(NULL, MODNAME, "PeriodMeasure", DEFAULT_PERIODMEASURE);
+ Reminder = DBGetContactSettingByte(NULL, MODNAME, "Reminder", DEFAULT_REMINDER);
+ FileCount = DBGetContactSettingDword(NULL, MODNAME, "FileCount", DEFAULT_FILECOUNT);
+}
+
+BOOL DownloadFile(LPCTSTR tszURL, LPCTSTR tszLocal)
+{
+ HANDLE hFile = NULL;
+ DWORD dwBytes;
+
+ NETLIBHTTPREQUEST nlhr = {0};
+ nlhr.cbSize = sizeof(nlhr);
+ nlhr.requestType = REQUEST_GET;
+ nlhr.flags = NLHRF_DUMPASTEXT | NLHRF_HTTP11;
+ char* szUrl = mir_t2a(tszURL);
+ nlhr.szUrl = szUrl;
+ nlhr.headersCount = 4;
+ nlhr.headers=(NETLIBHTTPHEADER*)mir_alloc(sizeof(NETLIBHTTPHEADER)*nlhr.headersCount);
+ nlhr.headers[0].szName = "User-Agent";
+ nlhr.headers[0].szValue = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
+ nlhr.headers[1].szName = "Connection";
+ nlhr.headers[1].szValue = "close";
+ nlhr.headers[2].szName = "Cache-Control";
+ nlhr.headers[2].szValue = "no-cache";
+ nlhr.headers[3].szName = "Pragma";
+ nlhr.headers[3].szValue = "no-cache";
+
+ bool ret = false;
+ NETLIBHTTPREQUEST* pReply = NULL;
+ pReply = (NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM)hNetlibUser,(LPARAM)&nlhr);
+
+ if (pReply)
+ {
+ if ((200 == pReply->resultCode) && (pReply->dataLength > 0))
+ {
+ hFile = CreateFile(tszLocal, GENERIC_READ | GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+ WriteFile(hFile, pReply->pData, (DWORD)pReply->dataLength, &dwBytes, NULL);
+ ret = true;
+ }
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)pReply);
+ }
+
+ mir_free(szUrl);
+ mir_free(nlhr.headers);
+
+ if (hFile)
+ CloseHandle(hFile);
+ DlgDld = ret;
+ return ret;
+}
+
+VOID __stdcall ExitMe(void*)
+{
+ CallService("CloseAction", 0, 0);
+}
+
+VOID __stdcall RestartMe(void*)
+{
+ CallService("CloseAction", 0, 0);
+ CallService(MS_SYSTEM_RESTART, 0, 0);
+}
+
+BOOL Exists(LPCTSTR strName)
+{
+ return GetFileAttributes(strName) != INVALID_FILE_ATTRIBUTES;
+}
+
+BOOL IsPluginDisabled(TCHAR* filename)
+{
+ char* fname = mir_t2a(filename);
+ int res = DBGetContactSettingByte(NULL, "PluginDisable", fname, 0);
+ mir_free(fname);
+ return res;
+}
+
+INT getVer(const TCHAR* verStr)
+{
+ INT v1 = 0, v2 = 0, v3 = 0, v4 = 0;
+ _stscanf(verStr, _T("%d.%d.%d.%d"), &v1, &v2, &v3, &v4);
+ return v1*1000000 + v2*10000 + v3*1000 + v4;
+}
+
+static void CheckUpdates(void *)
+{
+ TCHAR tszBuff[2048] = {0}, tszFileInfo[30] = {0}, tszTmpIni[MAX_PATH] = {0};
+ char szKey[64] = {0};
+ INT upd_ret;
+ DBVARIANT dbVar = {0};
+ vector<FILEINFO> UpdateFiles;
+
+ if (!Exists(tszRoot))
+ CreateDirectory(tszRoot, NULL);
+ Files.clear();
+ Reminder = DBGetContactSettingByte(NULL, MODNAME, "Reminder", DEFAULT_REMINDER);
+ FileCount = DBGetContactSettingDword(NULL, MODNAME, "FileCount", DEFAULT_FILECOUNT);
+
+ // Load files info
+ DBGetContactSettingTString(NULL, MODNAME, "File_VersionURL", &dbVar);
+ if (lstrcmp(dbVar.ptszVal, NULL) == 0)// URL is not set
+ {
+ Title=TranslateT("Pack Updater");
+ Text = TranslateT("URL for checking updates not found.");
+ if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL, MODNAME, "Popups1", DEFAULT_POPUP_ENABLED))
+ {
+ Number = 1;
+ show_popup(0, Title, Text, Number, 0);
+ }
+ else if (DBGetContactSettingByte(NULL, MODNAME, "Popups1M", DEFAULT_MESSAGE_ENABLED))
+ MessageBox(NULL, Text, Title, MB_ICONSTOP);
+ DBFreeVariant(&dbVar);
+ CheckThread = NULL;
+ return;
+ }
+ // Download version info
+ pFileUrl = (FILEURL *)mir_alloc(sizeof(*pFileUrl));
+ lstrcpyn(pFileUrl->tszDownloadURL, dbVar.ptszVal, SIZEOF(pFileUrl->tszDownloadURL));
+ mir_sntprintf(tszBuff, SIZEOF(tszBuff), _T("%s\\tmp.ini"), tszRoot);
+ lstrcpyn(pFileUrl->tszDiskPath, tszBuff, SIZEOF(pFileUrl->tszDiskPath));
+ lstrcpyn(tszTmpIni, tszBuff, SIZEOF(tszTmpIni));
+ Title = TranslateT("Pack Updater");
+ Text = TranslateT("Downloading version info...");
+ DlgDownloadProc();
+ mir_free(pFileUrl);
+ if (!DlgDld)
+ {
+ CheckThread = NULL;
+ return;
+ }
+
+ for (CurrentFile = 0; CurrentFile < FileCount; CurrentFile++)
+ {
+ FILEINFO FileInfo = {_T(""), _T(""), _T(""), _T(""), _T(""), _T(""), _T(""), {_T(""), _T("")}};
+
+ dbVar.ptszVal = NULL;
+ mir_snprintf(szKey, SIZEOF(szKey), "File_%d_CurrentVersion", CurrentFile + 1);
+ DBGetContactSettingTString(NULL, MODNAME, szKey, &dbVar);
+ if (lstrcmp(dbVar.ptszVal, NULL) == 0)
+ {
+ DBFreeVariant(&dbVar);
+ lstrcpyn(FileInfo.tszCurVer, _T(""), SIZEOF(FileInfo.tszCurVer));
+ }
+ else
+ lstrcpyn(FileInfo.tszCurVer, dbVar.ptszVal, SIZEOF(FileInfo.tszCurVer));
+ dbVar.ptszVal = NULL;
+ mir_snprintf(szKey, SIZEOF(szKey), "File_%d_LastVersion", CurrentFile + 1);
+ DBGetContactSettingTString(NULL, MODNAME, szKey, &dbVar);
+ if (lstrcmp(dbVar.ptszVal, NULL) == 0)
+ {
+ DBFreeVariant(&dbVar);
+ lstrcpyn(FileInfo.tszLastVer, _T(""), SIZEOF(FileInfo.tszLastVer));
+ }
+ else
+ lstrcpyn(FileInfo.tszLastVer, dbVar.ptszVal, SIZEOF(FileInfo.tszLastVer));
+ Files.push_back(FileInfo);
+
+ // Read version info
+ mir_sntprintf(tszFileInfo, SIZEOF(tszFileInfo), _T("FileInfo_%d"), CurrentFile + 1);
+ GetPrivateProfileString(tszFileInfo, _T("FileVersion"), _T(""), Files[CurrentFile].tszNewVer, SIZEOF(Files[CurrentFile].tszNewVer), tszTmpIni);
+ GetPrivateProfileString(tszFileInfo, _T("Message"), _T(""), Files[CurrentFile].tszMessage, SIZEOF(Files[CurrentFile].tszMessage), tszTmpIni);
+ GetPrivateProfileString(tszFileInfo, _T("DownloadURL"), _T(""), Files[CurrentFile].File.tszDownloadURL, SIZEOF(Files[CurrentFile].File.tszDownloadURL), tszTmpIni);
+ GetPrivateProfileString(tszFileInfo, _T("AdvFolder"), _T(""), Files[CurrentFile].tszAdvFolder, SIZEOF(Files[CurrentFile].tszAdvFolder), tszTmpIni);
+ GetPrivateProfileString(tszFileInfo, _T("Descr"), _T(""), Files[CurrentFile].tszDescr, SIZEOF(Files[CurrentFile].tszDescr), tszTmpIni);
+ GetPrivateProfileString(tszFileInfo, _T("DiskFileName"), _T(""), tszBuff, MAX_PATH, tszTmpIni);
+
+ if (_tcsstr(tszBuff, _T("\\"))) //check update name
+ {
+ Title = TranslateT("Pack Updater");
+ Text = TranslateT("Name of Update's file is not supported.");
+ if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL, MODNAME, "Popups1", DEFAULT_POPUP_ENABLED))
+ {
+ Number = 1;
+ show_popup(0, Title, Text, Number, 0);
+ }
+ else if (DBGetContactSettingByte(NULL, MODNAME, "Popups1M", DEFAULT_MESSAGE_ENABLED))
+ MessageBox(NULL, Text, Title, MB_ICONINFORMATION);
+ continue;
+ } // end check update name
+ lstrcpyn(Files[CurrentFile].File.tszDiskPath, tszBuff, SIZEOF(Files[CurrentFile].File.tszDiskPath));
+ GetPrivateProfileString(tszFileInfo, _T("InfoURL"), _T(""), Files[CurrentFile].tszInfoURL, SIZEOF(Files[CurrentFile].tszInfoURL), tszTmpIni);
+ Files[CurrentFile].FileType = GetPrivateProfileInt(tszFileInfo, _T("FileType"), 0, tszTmpIni);
+ Files[CurrentFile].Force = GetPrivateProfileInt(tszFileInfo, _T("Force"), 0, tszTmpIni);
+ Files[CurrentFile].FileNum = CurrentFile+1;
+
+ if (Files[CurrentFile].FileType == 2)
+ {
+ TCHAR pluginFolgerName[MAX_PATH];
+ if (lstrcmp(Files[CurrentFile].tszAdvFolder, _T("")) == 0)
+ mir_sntprintf(tszBuff, SIZEOF(tszBuff), _T("Plugins\\%s"), Files[CurrentFile].File.tszDiskPath);
+ else
+ mir_sntprintf(tszBuff, SIZEOF(tszBuff), _T("Plugins\\%s\\%s"), Files[CurrentFile].tszAdvFolder, Files[CurrentFile].File.tszDiskPath);
+ CallService(MS_UTILS_PATHTOABSOLUTET, (WPARAM)tszBuff, (LPARAM)pluginFolgerName);
+ if ((IsPluginDisabled(Files[CurrentFile].File.tszDiskPath) || !Exists(pluginFolgerName))) //check if plugin disabled or not exists
+ continue;
+ }
+ // Compare versions
+ if (getVer(Files[CurrentFile].tszCurVer) < getVer(Files[CurrentFile].tszNewVer)) // Yeah, we've got new version.
+ {
+ TCHAR* tszSysRoot = Utils_ReplaceVarsT(_T("%SystemRoot%"));
+ TCHAR* tszProgFiles = Utils_ReplaceVarsT(_T("%ProgramFiles%"));
+
+ if (Files[CurrentFile].FileType != 1 && !IsUserAnAdmin() && (_tcsstr(tszRoot, tszSysRoot) || _tcsstr(tszRoot, tszProgFiles)))
+ {
+ MessageBox(NULL, TranslateT("Update is not possible!\nYou have no Administrator's rights.\nPlease run Miranda IM with Administrator's rights."), Title, MB_ICONINFORMATION);
+ DeleteFile(tszTmpIni);
+ CheckThread = NULL;
+ return;
+ } // user have not admin's rights
+ else
+ {
+ //добавить проверку на существование файла
+ TCHAR tszFilePathDest[MAX_PATH] = {0};
+ TCHAR* tszUtilRootPlug = NULL;
+ TCHAR* tszUtilRootIco = NULL;
+ TCHAR* tszUtilRoot = NULL;
+
+ switch (Files[CurrentFile].FileType)
+ {
+ case 0:
+ case 1:
+ break;
+ case 2:
+ tszUtilRootPlug = Utils_ReplaceVarsT(_T("%miranda_path%\\Plugins"));
+ if (lstrcmp(Files[CurrentFile].tszAdvFolder, _T("")) == 0)
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s"), tszUtilRootPlug, Files[CurrentFile].File.tszDiskPath);
+ else
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s\\%s"), tszUtilRootPlug, Files[CurrentFile].tszAdvFolder, Files[CurrentFile].File.tszDiskPath);
+ mir_free(tszUtilRootPlug);
+ break;
+ case 3:
+ tszUtilRootIco = Utils_ReplaceVarsT(_T("%miranda_path%\\Icons"));
+ if (lstrcmp(Files[CurrentFile].tszAdvFolder, _T("")) == 0)
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s"), tszUtilRootIco, Files[CurrentFile].File.tszDiskPath);
+ else
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s\\%s"), tszUtilRootIco, Files[CurrentFile].tszAdvFolder, Files[CurrentFile].File.tszDiskPath);
+ mir_free(tszUtilRootIco);
+ break;
+ case 4:
+ case 5:
+ tszUtilRoot = Utils_ReplaceVarsT(_T("%miranda_path%"));
+ if (lstrcmp(Files[CurrentFile].tszAdvFolder, _T("")) == 0)
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s"), tszUtilRoot, Files[CurrentFile].File.tszDiskPath);
+ else
+ mir_sntprintf(tszFilePathDest, SIZEOF(tszFilePathDest), _T("%s\\%s\\%s"), tszUtilRoot, Files[CurrentFile].tszAdvFolder, Files[CurrentFile].File.tszDiskPath);
+ mir_free(tszUtilRoot);
+ break;
+ }//end* switch (Files[CurrentFile].FileType)
+
+ if (Files[CurrentFile].Force || Exists(tszFilePathDest))
+ UpdateFiles.push_back(Files[CurrentFile]);
+ // Save last version
+ lstrcpyn(Files[CurrentFile].tszLastVer, Files[CurrentFile].tszNewVer, SIZEOF(Files[CurrentFile].tszLastVer));
+ mir_snprintf(szKey, SIZEOF(szKey), "File_%d_LastVersion", CurrentFile + 1);
+ DBWriteContactSettingTString(NULL, MODNAME, szKey, Files[CurrentFile].tszLastVer);
+ } // user have admin's rights
+ mir_free(tszSysRoot);
+ mir_free(tszProgFiles);
+ } // end compare versions
+ } //end checking all files in for ()
+
+ // Show dialog
+ if (UpdateFiles.size()>0)
+ upd_ret = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_UPDATE), GetDesktopWindow(), DlgUpdate, (LPARAM)&UpdateFiles);
+ DeleteFile(tszTmpIni);
+ if (upd_ret == IDCANCEL)
+ {
+ CheckThread = NULL;
+ return;
+ }
+ if (!UpdatesCount && !Silent)
+ {
+ Title = TranslateT("Pack Updater");
+ Text = TranslateT("No updates found.");
+ if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL, MODNAME, "Popups2", DEFAULT_POPUP_ENABLED))
+ {
+ Number = 2;
+ show_popup(0, Title, Text, Number, 0);
+ }
+ else if (DBGetContactSettingByte(NULL, MODNAME, "Popups2M", DEFAULT_MESSAGE_ENABLED))
+ MessageBox(NULL, Text, Title, MB_ICONINFORMATION);
+ }
+ if (!FileCount)
+ {
+ Title = TranslateT("Pack Updater");
+ Text = TranslateT("No files for update.");
+ if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL, MODNAME, "Popups2", DEFAULT_POPUP_ENABLED))
+ {
+ Number = 2;
+ show_popup(0, Title, Text, Number, 0);
+ }
+ else if (DBGetContactSettingByte(NULL, MODNAME, "Popups2M", DEFAULT_MESSAGE_ENABLED))
+ MessageBox(NULL, Text, Title, MB_ICONINFORMATION);
+ }
+ CheckThread = NULL;
+}//end* static void CheckUpdates(void *)
+
+void DoCheck(int iFlag, int iFlag2)
+{
+ if (iFlag2)
+ {
+ Title = TranslateT("Pack Updater");
+ Text = TranslateT("Update checking already started!");
+ if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL, MODNAME, "Popups2", DEFAULT_POPUP_ENABLED))
+ {
+ Number = 2;
+ show_popup(0, Title, Text, Number, 0);
+ }
+ else if (DBGetContactSettingByte(NULL, MODNAME, "Popups2M", DEFAULT_MESSAGE_ENABLED))
+ MessageBox(NULL, Text, Title, MB_ICONINFORMATION);
+ }
+ else if (iFlag)
+ {
+ CheckThread = mir_forkthread(CheckUpdates, 0);
+ DBWriteContactSettingDword(NULL, MODNAME, "LastUpdate", time(NULL));
+ }
+}
+
+BOOL AllowUpdateOnStartup()
+{
+ if(OnlyOnceADay)
+ {
+ time_t now = time(NULL);
+ time_t was = DBGetContactSettingDword(NULL, MODNAME, "LastUpdate", 0);
+
+ if((now - was) < 86400)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+LONG PeriodToMilliseconds(const INT period, BYTE& periodMeasure)
+{
+ LONG result = period * 1000;
+ switch(periodMeasure)
+ {
+ case 1:
+ // day
+ result *= 60 * 60 * 24;
+ break;
+
+ default:
+ // hour
+ if(periodMeasure != 0)
+ periodMeasure = 0;
+ result *= 60 * 60;
+ break;
+ }
+ return result;
+}
+
+VOID CALLBACK TimerAPCProc(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue)
+{
+ DoCheck(1, (int)CheckThread);
+}
+
+VOID InitTimer()
+{
+ CancelWaitableTimer(Timer);
+ if(UpdateOnPeriod)
+ {
+ LONG interval = PeriodToMilliseconds(Period, PeriodMeasure);
+
+ _int64 qwDueTime = -10000i64 * interval;
+
+ LARGE_INTEGER li = {0};
+ li.LowPart = (DWORD) ( qwDueTime & 0xFFFFFFFF );
+ li.HighPart = (LONG) ( qwDueTime >> 32 );
+
+ SetWaitableTimer(Timer, &li, interval, TimerAPCProc, NULL, 0);
+ }
+} \ No newline at end of file
diff --git a/plugins/PackUpdater/Version.h b/plugins/PackUpdater/Version.h
new file mode 100644
index 0000000000..f9cbee4412
--- /dev/null
+++ b/plugins/PackUpdater/Version.h
@@ -0,0 +1,20 @@
+#define __MAJOR_VERSION 0
+#define __MINOR_VERSION 0
+#define __RELEASE_NUM 1
+#define __BUILD_NUM 1
+
+#define __FILEVERSION_STRING __MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM
+#define __FILEVERSION_DOTS __MAJOR_VERSION.__MINOR_VERSION.__RELEASE_NUM.__BUILD_NUM
+
+#define __STRINGIFY_IMPL(x) #x
+#define __STRINGIFY(x) __STRINGIFY_IMPL(x)
+#define __VERSION_STRING __STRINGIFY(__FILEVERSION_DOTS)
+
+#define __PLUGIN_NAME "PackUpdater"
+#define __INTERNAL_NAME "PackUpdater"
+#define __FILENAME "PackUpdater.dll"
+#define __DESCRIPTION "Simple updater for Miranda IM premodified packs."
+#define __AUTHOR "Mataes, ZERO_BiT"
+#define __AUTHOREMAIL "mataes2007@gmail.com, zero-bit@mail.ru"
+#define __AUTHORWEB "http://mataes.googlecode.com/svn/Miranda/Plugins/PackUpdater/"
+#define __COPYRIGHT "© 2011 Mataes, 2007 ZERO_BiT"
diff --git a/plugins/PackUpdater/Version.rc b/plugins/PackUpdater/Version.rc
new file mode 100644
index 0000000000..d1da5e8d6a
--- /dev/null
+++ b/plugins/PackUpdater/Version.rc
@@ -0,0 +1,42 @@
+// Microsoft Visual C++ generated resource script.
+//
+#ifdef APSTUDIO_INVOKED
+#error this file is not editable by Microsoft Visual C++
+#endif //APSTUDIO_INVOKED
+
+#include "afxres.h"
+#include "version.h"
+
+#ifdef _WIN32
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+#endif //_WIN32
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION __FILEVERSION_STRING
+ PRODUCTVERSION __FILEVERSION_STRING
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x0L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "000004b0"
+ BEGIN
+ VALUE "FileDescription", __DESCRIPTION
+ VALUE "InternalName", __PLUGIN_NAME
+ VALUE "LegalCopyright", __COPYRIGHT
+ VALUE "OriginalFilename", __FILENAME
+ VALUE "ProductName", __PLUGIN_NAME
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0, 1200
+ END
+END
diff --git a/plugins/PackUpdater/packupdater-translation.txt b/plugins/PackUpdater/packupdater-translation.txt
new file mode 100644
index 0000000000..5945f1f25b
--- /dev/null
+++ b/plugins/PackUpdater/packupdater-translation.txt
@@ -0,0 +1,69 @@
+; Common strings that belong to many files
+;[Pack Updater]
+;[PopUps]
+
+; ../../plugins/PackUpdater/Resource.rc
+;[(but only once a day)]
+;[* Needs popup actions to be enabled]
+;[-1 = Infinite]
+;[0 = Default]
+;[Back]
+;[Boxes]
+;[Cancel]
+;[Click action]
+;[Colours]
+;[Description]
+;[Downloading...]
+;[Errors]
+;[Every]
+;[Go to Customize -> Hotkeys to change the hotkey]
+;[Hotkey]
+;[Info messages]
+;[Message boxes]
+;[Message boxes (*)]
+;[Not sets for \"Message boxes\"]
+;[Notifications]
+;[On left click]
+;[On right click]
+;[On startup]
+;[Pack update options]
+;[PackUpdater has detected updated versions\nof the following Miranda components:]
+;[Preview]
+;[Progress dialogs]
+;[Remind about not installed pack update]
+;[Sec]
+;[Text]
+;[Timeout]
+;[Update]
+;[Updates found!]
+;[Use &Windows colours]
+;[Use Pop&up colours]
+;[Use cus&tom colors]
+;[View info]
+
+; ../../plugins/PackUpdater/Src/Notifications.cpp
+;[An error occured while downloading the update.]
+;[Component Name]
+;[Current Version]
+;[Download complete. Start updating? All your data will be saved and Miranda IM will be closed.]
+;[Downloading pack updates...]
+;[Downloading update...]
+;[Downloads complete. Start updating? All your data will be saved and Miranda IM will be closed.]
+;[New Version]
+;[You have chosen not to install the pack update immediately.\nYou can install it manually from this location:\n\n%s]
+
+; ../../plugins/PackUpdater/Src/Options.cpp
+;[Events]
+;[Test]
+;[days]
+;[hours]
+
+; ../../plugins/PackUpdater/Src/Utils.cpp
+;[Downloading version info...]
+;[Name of Update's file is not supported.]
+;[No files for update.]
+;[No updates found.]
+;[Pack Updater HTTP connection]
+;[URL for checking updates not found.]
+;[Update checking already started!]
+;[Update is not possible!\nYou have no Administrator's rights.\nPlease run Miranda IM with Administrator's rights.]
diff --git a/plugins/PackUpdater/resource.h b/plugins/PackUpdater/resource.h
new file mode 100644
index 0000000000..fd3b5c14f0
--- /dev/null
+++ b/plugins/PackUpdater/resource.h
@@ -0,0 +1,77 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by Resource.rc
+//
+#define IDI_MENU 101
+#define IDD_UPDATE 102
+#define IDD_DOWNLOAD 103
+#define IDD_OPT_UPDATENOTIFY 104
+#define IDD_POPUP 105
+#define IDD_POPUPDUMMI 106
+#define IDI_DELETE 107
+#define IDI_OK 108
+#define IDI_CANCEL 109
+#define IDC_UPDATETEXT 1001
+#define IDC_CURVER 1002
+#define IDC_NEWVER 1003
+#define IDC_INFO 1004
+#define IDC_PB 1005
+#define IDC_LABEL 1006
+#define IDC_USEWINCOLORS 1007
+#define IDC_RC 1008
+#define IDC_USEPOPUPCOLORS 1009
+#define IDC_COLORS 1010
+#define IDC_STATIC_INFINITE 1011
+#define IDC_STATIC_DEFAULT 1012
+#define IDC_TIMEOUT_VALUE_SPIN 1013
+#define IDC_STATIC_SEC 1014
+#define IDC_LC 1015
+#define IDC_PREVIEW 1016
+#define IDC_TIMEOUT_VALUE 1017
+#define IDC_USEOWNCOLORS 1018
+#define IDC_ENABLEUPDATES 1019
+#define IDC_REMINDER 1020
+#define IDC_LIST_UPDATES 1021
+#define IDC_MESSAGE 1022
+#define IDC_DESCR 1023
+#define IDC_MSG_BOXES_MSG 1024
+#define IDC_ERRORS_MSG 1025
+#define IDC_INFO_MESSAGES_MSG 1026
+#define IDC_PROGR_DLG_MSG 1027
+#define IDC_SYSLINK1 1028
+#define IDC_LINK_HOTKEY 1028
+#define IDC_MSG_BOXES2 1029
+#define IDC_ERRORS2 1030
+#define IDC_INFO_MESSAGES2 1031
+#define IDC_PROGR_DLG2 1032
+#define IDC_NOTIFY2 1033
+#define IDC_NOTIFY 1034
+#define IDC_UPDATEONSTARTUP 1035
+#define IDC_ONLYONCEADAY 1036
+#define IDC_UPDATEONPERIOD 1037
+#define IDC_PERIOD 1038
+#define IDC_PERIODSPIN 1039
+#define IDC_PERIODMEASURE 1040
+#define IDC_MSG_BOXES 40071
+#define IDC_ERRORS 40072
+#define IDC_INFO_MESSAGES 40073
+#define IDC_PROGR_DLG 40074
+#define IDC_MSG_BOXES_TX 41071
+#define IDC_ERR_TX 41072
+#define IDC_INFO_MESSAGES_TX 41073
+#define IDC_PROGR_DLG_TX 41074
+#define IDC_MSG_BOXES_BG 42071
+#define IDC_ERR_BG 42072
+#define IDC_INFO_MESSAGES_BG 42073
+#define IDC_PROGR_DLG_BG 42074
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 110
+#define _APS_NEXT_COMMAND_VALUE 40075
+#define _APS_NEXT_CONTROL_VALUE 1041
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif