summaryrefslogtreecommitdiff
path: root/protocols/WebView
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2019-03-02 12:32:44 +0300
committerGeorge Hazan <ghazan@miranda.im>2019-03-02 12:32:55 +0300
commit931a7dc1ac0dbc7e6c1083583ced915e572f5b47 (patch)
tree9fe9a6448d44030e26aa7107ce16044ed413e0d0 /protocols/WebView
parentdd7d9954042254e66e3bbbec7195c6be8b1a0663 (diff)
all protocols (even virtual ones) moved to the Protocols folder
Diffstat (limited to 'protocols/WebView')
-rw-r--r--protocols/WebView/docs/changelog.txt6
-rw-r--r--protocols/WebView/docs/license.txt340
-rw-r--r--protocols/WebView/docs/readme.txt1000
-rw-r--r--protocols/WebView/docs/todo.txt3
-rw-r--r--protocols/WebView/res/Icon_14.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/alert.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/find.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/folder.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/markallread.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/options.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/ping.icobin0 -> 894 bytes
-rw-r--r--protocols/WebView/res/popup.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/show_hide.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/stick.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/stop.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/unstick.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/update.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/updateall.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/url.icobin0 -> 2550 bytes
-rw-r--r--protocols/WebView/res/version.rc9
-rw-r--r--protocols/WebView/res/web.icobin0 -> 894 bytes
-rw-r--r--protocols/WebView/res/webview.rc364
-rw-r--r--protocols/WebView/src/main.cpp285
-rw-r--r--protocols/WebView/src/resource.h139
-rw-r--r--protocols/WebView/src/stdafx.cxx18
-rw-r--r--protocols/WebView/src/stdafx.h36
-rw-r--r--protocols/WebView/src/version.h13
-rw-r--r--protocols/WebView/src/webview.cpp481
-rw-r--r--protocols/WebView/src/webview.h254
-rw-r--r--protocols/WebView/src/webview_alerts.cpp839
-rw-r--r--protocols/WebView/src/webview_cleanup.cpp797
-rw-r--r--protocols/WebView/src/webview_datawnd.cpp514
-rw-r--r--protocols/WebView/src/webview_getdata.cpp511
-rw-r--r--protocols/WebView/src/webview_opts.cpp1265
-rw-r--r--protocols/WebView/src/webview_services.cpp458
-rw-r--r--protocols/WebView/webview.vcxproj28
-rw-r--r--protocols/WebView/webview.vcxproj.filters4
37 files changed, 7364 insertions, 0 deletions
diff --git a/protocols/WebView/docs/changelog.txt b/protocols/WebView/docs/changelog.txt
new file mode 100644
index 0000000000..17987cc60e
--- /dev/null
+++ b/protocols/WebView/docs/changelog.txt
@@ -0,0 +1,6 @@
+-0.1.3.10
+-Made separate Unicode and ANSI versions of plugin.
+-Removed some old unneeded code.
+
+
+ \ No newline at end of file
diff --git a/protocols/WebView/docs/license.txt b/protocols/WebView/docs/license.txt
new file mode 100644
index 0000000000..f3790d8623
--- /dev/null
+++ b/protocols/WebView/docs/license.txt
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/protocols/WebView/docs/readme.txt b/protocols/WebView/docs/readme.txt
new file mode 100644
index 0000000000..59c5809488
--- /dev/null
+++ b/protocols/WebView/docs/readme.txt
@@ -0,0 +1,1000 @@
+***************************************
+* Webview Protocol Plugin by Bumper1 *
+***************************************
+
+
+
+About
+-----
+
+A plugin for Miranda IM which adds web pages as contacts to your contact list and can
+display text and/or changes within those pages in a window, as well as issue different types of
+alerts when changes occur.
+
+You need special status icons for this protocol, these icons are available here:
+http://www.miranda-im.org/download/details.php?action=viewfile&id=1274
+-------
+WARNING
+----------
+
+On a large site (approx ~50kbytes) with "clean up display" option enabled the processor
+may approach 100% until the tags are removed and text formatting is complete.
+To minimise this only select a section of the web page to be displayed (the larger
+the selection the longer it will take to remove the tags and format the text).
+
+
+Installation:
+
+Copy the dll file to your plugins folder like any other plugin, but if you want the ping fuction to work, copy psite.bat to the same folder as miranda32.exe
+
+Features
+--------
+Creates contacts on your Contact list representing web pages. A dialog displaying
+the text on that web page can be accessed through the contact menu of the contact
+that represents that web page.
+
+You can add more sites to the contact list using the Webview -> Add Contact
+item on the Main menu.
+You can update your Webview contacts all at once using the Webview -> Update All Webview
+Sites item on the Main menu.
+You can enable/disable timed updates of your contacts using the Webview -> Auto Update
+Enabled item on the Main menu.
+
+If you have the main menu items disabled and you have the TopToolbar plugin loaded Webview
+will load three buttons on the toolbar for Adding contacts, updating all Webview site and
+for enabling auto update.
+
+
+There are various options which you can set from each individual site/Webview contact on your
+contact list; you can set the name of the contact, the site URL, start string, end string, logging
+options, clean up of the display (removal of excess whitespace, tags and conversion of HTML
+character codes to displayable characters), and the action to take when double clicking on a
+contact (either open that site in a browser window or display site in the Webview data display
+window). You can adjust all these settings from the Contact Options item on each contact menu.
+The amount of white space removed can be set by the user for each contact.
+
+There is also an option to "Display whole web page"; if you use this option then it will
+display the whole web page in the data display window.
+If you use the option "Display between Start and End strings then you need to use
+unique strings on the web page to set the part of the page you want to display.
+
+The clean up display option stops tags being displayed in the data window.
+It also removes extra white space to help tidy up the display. The amount
+of white space removed can be set from options.
+
+You can also set various alerts on a contact by contact basis. You can set an alert to be
+issued if a certain string is present, if anything on the whole web page (or in the displayed
+portion of the web page) changes or you can have an alert issued only of a specific
+part of the web page changes.
+
+You can also set the method by which you want to be alerted on a contact by contact basis.
+You can set the alert to issue a popup using the PopUp plugin, open the data display
+window, display the alert using the OSD plugin or log to file.
+
+
+
+You can set the update interval, suppression of error messages, disabling of the main menu item
+(hiding main menu item requires a reboot for changes to be seen), whether to update data on
+Miranda startup, hiding/showing of the protocol icon on the status bar, updating data for a specfic
+site when its data display window is opened and text/background color all from the main
+Miranda Webview options. You can also set the text attributes.
+You can set an option to save the position of individual data display windows.
+
+You can set the error messages to be displayed using the PopUp
+plugin (or the OSD plugin if the Popup service isn't available).
+If you don't select errors to be displayed with the Popup plugin (or the OSD plugin), or neither
+the Popup or OSD plugins are loaded then the error is displayed using a balloon tip (if the OS
+supports it).
+
+When plugin is first installed the window updates once an hour.
+The timer can be set in options, setting timer to 0 disables updates
+( plugin will still do one update on start up even if timer=0).
+
+The "Update Data" button on the data window will re-download date from the specific website
+that data window uses.
+The "Stick to the front" button on the data window will allow or stop the display window
+staying on top of other windows.
+The "Find" button on the data window will allow you to find a word or phrase in the data
+window.
+
+You can copy, cut and delete text from the data display window as well
+as copy all, select all and clear all text by a drop down menu
+when you click with your right mouse key on the edit area of the data
+display window.
+
+The web page being available, down or lagging, server error returned or alert issued will all
+change the status icon on the contact list for the specific contact that even happened to.
+Online, offline, error and alert all have their own icon which can be set in Miranda's Icon
+options.
+
+N/A status icon means the site is offline or lagging.
+Away status icon means the server returned an error.
+Online status icon means site is working normally.
+Offline status icon means the protocol has been manually put offline.
+Occupied status icon means an alert has been issued for that site.
+DND status icon means plugin is downloading or processing data for that site.
+
+You can set the sound to be used when there is an alert in the Sounds section of Miranda
+Options.
+
+In PopUp options you can set the popup time out, various options for selecting the color of the
+popup and select left and right click options.
+
+You can view the complete source code for a web page if you set the Contact Options
+to display the whole web page, untick Clean Up Display then update (download)
+the data for that Webview contact.
+
+
+*****
+Here follow the essential settings you need to have
+right to get a result.
+*****
+
+There is an option in the contact options to put in the URL of the
+website you wish to display contents of.
+Note: Netlib doesn't support redirection, make sure you dont use
+plugin to monitor a site that does this because it will not work.
+
+There are two search string options which are used to find data on the
+web page. The first is the Start string, this is a string or sequences of tags and words in the source
+code of the web page where you wish to begin displaying data on your data window.
+The second is the End string, this is a string or sequences of tags and words in the source code of
+the web page where you wish to stop displaying data on your data window.
+Note: To find these display strings you should know how to look at the source code of
+the web page you are looking at. If you don't wish to use a browser to go find out what the
+source code looks the you can use the search strings like this:
+Start:<html
+End:</html>
+
+or
+Start:<HTML
+End:</HTML>
+
+If you do not want to have to use start and end strings you can select the option
+to display the whole site then the plugin will display the contents of the entire
+web page.
+
+There is a button to the Contact Options dialog to copy the display
+Start and End strings to the alert Start and End strings and set
+the event type to "Alert When A Specific Part of Web Page Changes".
+*****
+
+
+Requirements
+------------
+ - Miranda IM 0.7++
+(Popup plugin recommended
+ but not essential)
+
+Popup plugin is used for displaying error messages, but OSD plugin can also be used.
+
+
+To Do
+--------
+-Unicode support!!!
+-need to review the plugin documentation and see what needs to be added or removed from it.
+-window option to load cache into window and have it processed?
+-create webview group on contactlist and automatically add sites to it?
+-menu item to close all webview windows?
+
+
+
+Changelog
+----------
+0.0.1.0
+-Use SETI@Home 1.3.0.0 sources as
+ base code for Webview
+-Change icons
+-rename and remove various options
+ and DBKeys
+-Lets set some HTML headers to keep
+ some sites happy
+-Successfully displayed selected data from
+ a site using search strings
+0.0.2.0
+-Removed some old data window functions
+-Prevent users using an end string, thats present
+ in the data BEFORE the search string.
+-Created a dialog for displaying data,
+ discontinue using MessageBox()
+-Don't open another dialog if one is
+ already open
+-Update dialog automatically after download
+-Clear data in dialog only if new data exists
+-Display complete page if no search strings
+ set or if not present
+-Added back "stick to front" and "hide/show" features
+ to code.
+-Treat a destroyed window the same as a hidden
+ one in options and menus
+-Added back right-click menu and automove
+ to code(automove a little buggy)
+-Add hyperlink to dialog
+-Use dllname in titlebar
+-Add resize code
+-Added Multiwindow code(buggy)
+0.0.3.0
+-Back out displaying complete page if no search strings
+ set or if not present (results unpredictable)
+-Update hyperlink when changed in options
+-Back out code to allow automove to be used if
+ dragged with titlebar.Caused plugin to consume
+ all system resources when first minimized then attempted
+ to restore/maximise/close.
+-Make sure correct url value present before
+ opening it using the hyperlink
+-Removed option and key for disabling automove,
+ user can just drag with the titlebar
+-Removed all options and keys related to
+ saving to file, not really needed,
+ data can be copied and pasted from
+ data window.
+-Removed option for clearing old data.
+ Code now does this automatically if
+ needed
+-Removed common dialog library
+-#include <richedit.h>
+0.0.4.0
+-Got rid of the old data structures
+-Positioned the close button a little better
+-Check to see that Miranda version is at least
+ 0.3.2.0 before loading plugin
+-Added richedit control to dialog
+-Hotkeys working again
+-Backout Multiwindow code, much too buggy
+-Intermittant crash on startup.Cause seems
+ to be that popup service isn't threadsafe.
+ Don't call from thread, use a timer to call
+ an error function that will check for presence
+ of errors
+-Unregister then reset hotkeys after dialog is
+ created
+-Got rid of some old unused variables
+-rebase to 0x2d900000
+-Use modeless dialog instead of
+ MessageBox()
+-Make sure there isn't more than one error
+ dialog with same message created (assuming
+ user closes all the error messages)
+0.0.5.0
+-If the update interval is set to zero
+ don't activate the error reporting timer on
+ startup
+-Only do update on startup if interval is not
+ zero
+-If the update interval is changed to a value
+ other than zero then restart the error reporting
+ timer
+-Added advanced options to control displaying text
+ before or after the search strings
+-Got change background color option working
+-Error check is now run one minute after update
+-Added a button in advanced options to check
+ for errors
+-Make data dialog read only
+-Error timer not restarting with correct interval
+-Moved Load() to main.c
+-Added support for PluginUninstaller
+-Renamed license and readme to make
+ easier to uninstall
+-Got "use windows colors" option
+ working
+0.0.6.0
+-Replaced the right click menu with a button
+ on the data display window
+-Use main plugin icon for button
+-Improved code for setting background
+ color
+-Got text color working
+-Change memory usage depending
+ on data download size
+-Write downloaded data to the
+ database(maybe just a temporary
+ measure)
+-Clear display before write new data
+ to dialog
+-Don't allocate/free memory or use
+ download arrays if download unsuccessful
+-URL not showing on dialog after reboot
+-Initialise dialog with web data stored in
+ database
+-Cleaned up an icon
+-Removed writing data to database
+-Only free memory when new data available
+ and in Unload() so all functions can
+ access data
+0.0.7.0
+-Wrote basic data save to file function
+-Readded common dialog library and restored
+ the saving functions to similar level to
+ that in SETI@Home plugin
+-Changed the advanced search options a little
+ to avoid confusion.
+-got basic tag erasing code in place
+-Fixed crash in tag erasing code
+-Got tag with attributes erasing working
+-Support filtering both upper and lower
+ case tags
+-Remove excess whitespace
+-Improvments to background color code
+-small changes to text coloring code
+-Got rid of "Use windows colors" option
+-Put in an option to enable filtering
+ of tags and whitespace
+-Fixed crash while removing whitespace
+ if search strings were not found/set
+-Choice to enable using popup plugin or not
+ even if popup service exists
+-Fixed some error dialog bugs
+-Fixed automove, now works better
+ with titlebar, removed the easy move
+ feature for now
+-Don't save win size, position etc. when
+ window max'ed or min'ed, also don't
+ automove()
+-Save width of window
+-Fixed bug where the saved window size/position
+ wasn't being used
+-Save new window size/position after resizing
+-Holding down ctrl key while moving
+ data dialog disables automove
+-Load old NETLIBHTTPREQUEST struct
+ if Miranda version less than 0.3.3
+-Remove some old unneeded variables
+0.0.8.0
+-Warning on startup if Miranda version less than
+ 0.3.2
+-Disable "Use Popup Plugin" option if popup
+ service isn't loaded
+-Other small changes to Advanced Options
+-Resistered the webview protocol and
+ added basic services
+-Allow return to be allowed in the richedit
+ control with out closing the dialog
+-Add maximise and minimise buttons to data
+ dialog
+-Got rid of horizontal scroll bar on data
+ dialog, the richedit control automatically
+ wordwraps
+-Added contact to clist, make it name itself to
+ the same as the dllname
+-Don't add contact to list if a contact already
+ exists
+-Changed the minutes setting to spin control
+0.0.9.0
+-Change main menu items dynamically
+-Changed options dialog to make visually
+ better.Removed some options, changed others
+-Use balloon tip for error messages
+-Removed "use popup plugin option".
+ Plugin now uses the following 3 methods for
+ displaying errors(in decreasing priority)
+ *Balloon tip(if OS supports)
+ *popup plugin(if service loaded)
+ *Error dialog(if the neither balloon tip
+ or popup can be used)
+-If server is down but previously gave back
+ a server error then make sure the server error
+ is cleared before reporting that the server is down.
+-Control contact status by global status and protocol
+ status
+-Don't download data if current protocol status
+ is offline
+-Change contact status depending on download
+ *Download success = online
+ *server offline = n/a
+ *server error = away
+-Added item to contact menu to show/hide
+ data dialog
+-Treat <a> same as other tags for now
+-first public alpha release
+0.0.10.0
+-Remove support for 0.3.2 NetLib
+-Don't load plugin if Miranda version
+ less than 0.3.3
+-Remove hbrush, not used anymore
+-Fixed intermittant crash when contact
+ already exists
+-minor changes to options
+-added items to contact for update,stick to
+ front and open web page.
+-New icons for show/hide window om menu menu.
+-Dynamically change contact menu item text
+ and icons
+-Some changes to drop down menu
+-URLs now open webpage when clicked
+-Added new Unstick icon
+-Removed advanced search options.Search
+ strings are now always included in displayed
+ data (prior to tag filtering)
+-Added Webview Group to clist to hold
+ contacts generated by multiple instances
+ of the plugin
+0.0.11.0
+-make spin control work in the correct direction
+-Moved options to Network group
+-Dynamtically change text on data dialog
+ menu items
+-Remove stick to front and update data Main menu
+ items
+-Stop sending Content-Length header to sites
+-Moved save to file options from advanced
+ options dialog to options dialog
+-Removed check for errors option
+-Made logging to file an advanced option
+-Added multiple monitor support
+-Destroy data window when ME_SYSTEM_PRESHUTDOWN
+ event occurs
+-reduce disk I/O by storing colors,
+ window height and window position
+ in global variables.Variables only
+ read/written to DB on start/exit.
+-added copy/copy all/select all menu to right click
+0.0.12.0
+-Added size grip to data dialog
+-Added separate stick/unstick button to data dialog
+-Removed stick/unstick item from drop down menu
+-Made buttons into flat buttons
+-Make WM_CLOSE hide the data window instead of
+ destroying it.
+-Removed Update and Stick/Unstick contact menu
+ items
+-Moved main menu item position to the same place
+ as other protocols
+-Removed advanced option dialog for now
+-Updates to README
+0.0.13.0
+-Double clicking on contact opens web page in browser
+-Added some comments to menu items. Some menu items
+ will be removed in a future release, and other new
+ items will be added(new items are disabled for now)
+-New icons for Add user and Contact options menu items
+ and new icon for drop down menu button on data window
+-Added some more tags to the filter
+-Change (Latin, Numeric and some punctuation) HTML
+ character codes into characters.
+-Change data window caption to the URL.
+-Change contact name to the URL.
+0.0.14.0
+-Added icon to data window titlebar
+-Filter out some more tags
+-Added update button to data window
+-Removed drop down menu button (no
+ need for anymore, all of the functions
+ of it can be accessed from the data window)
+-Added Clear All, Paste, Cut and Delete
+ to right click menu
+-Fixed a bug where double clicking on any
+ contact from any protocol opened up
+ a page in a browser.. opps
+0.0.15.0
+-Added tooltips to buttons
+-added more tags to filter
+-Added contact options dialog (disabled
+ for now)
+-Crash when tag filter sometimes tries to write
+ outside of the array (hopefully fixed).
+-Crash with some sites crash if free
+ szInfo after tags are filtered
+ out(hopefully fixed)
+-Crash (possibly related to the crashes above),
+ no idea what causes it really but fixed by
+ a delay midway in the tag filtering function
+0.0.16.0
+-Added some more tags to filter
+-Opps..was dependant on other plugins
+ to load richedit into memory
+-Removed options in Miranda options
+ for hiding and sticking window to the
+ front(no longer needed because soon
+ will be moving to contact based options)
+0.0.17.0
+-Enabled the contact optons dialog
+-Removed Url, start string and start string
+ options from plugin options to the contact
+ options dialog
+-Store url, start string and start string
+ in the contact settings not in the plugin
+ module in the database.
+-reduced some crash risks
+-Added option to enable updating data on
+ Miranda startup
+0.0.18.0
+-possible crash when freeing memory in unload,
+ free in pre-shutdown instead (possibly isn't
+ the solution)
+-Enable the add contact menu item.
+-Some other changes to usage of malloc
+ and free
+-Small delay added before downloading data
+ on startup, also reduced a delay else
+ where in the code
+-Added code to check multiple sites
+-Some more code to try and avoid crashes
+-Change individual contact status to indicate
+ site status
+-Remove hotkeys (possibly temporarily)
+-Move save to file options to contact options
+0.0.19.0
+-More stability improvements
+-Stick to front option working again
+-Disable file save options in add contact dialog
+-Code cleanup
+0.0.20.0
+-URL sometimes corrupted
+-Got background and text color change options
+ working
+-Removed feature where timer set to zero stopped you
+ downloading data manually
+-Clear all data windows when changing text/background
+ color (possibly a temporary measure)
+-More code cleanup
+0.0.21.0
+-User can choose either to open web page
+ in a browser or opening the data window
+ as the action taken when double clicking
+ on a webview contact
+-Option to update data when data window
+ opened
+-Removed old show/hide contact menu item
+ and replaced with a new open/close menu item
+ with a new icon
+-New add contact icon and show more icons
+ on dialogs
+-Better handling of protocol/global status
+-Other minor fixes
+-Added a new contact option to add
+ contact/site name.
+-When adding a new site,if you leave the site name
+ blank then the site name will automatically be
+ the same as the sites URL
+0.0.22.0
+-Make an option to hide icon on status bar
+-show the icon again if there is a crash
+-Make the titlebar text of the contacts
+ data window the same as the name of the
+ contact
+-only look for end string further down
+ the page from the start string
+-Remove garbage from end of displayed
+ text
+0.0.23.0
+-Got the options on the data display window
+ working properly again
+-Fixed a bug where double clicking on a webview
+ contact sometimes opened a message window.
+-Cleaned up code
+0.0.24.0
+-Allow user to set separate double click action
+ for each webview contact from the contact options.
+-Updated icons.
+-Faster (and more stable) method for copying web data
+ into memory used.
+-Use Save As dialog instead of Open
+ to select log file.
+-Added a search button to Webview data window.
+ Search is pretty basic as yet but it shows you
+ the approximate area of the window where the search
+ keyword was found.
+-Use monospaced font in data window because its easier
+ to read text in window. Also made font bigger for the same
+ reason.
+-Status messages displayed on status bar of data window.
+-Code to remove more unsupported symbol codes and other
+ unwanted data from the data window when the clean
+ up display option is selected.
+-Updates to the README.
+0.0.25.0
+-The Find button now can find and highlight the
+ exact position of the requested word in the
+ data window.
+-The Find button's text search is no longer case
+ sensitive.
+-Status bar on data display window now tells you
+ the time the last update of data occured from
+ that window.
+-You can now set the exact amount of whitespace
+ to filter out of the data window display through
+ a trackerbar control in Miranda options.
+-Font face and size as well as attributes bold, italic
+ and underline can now be set from Miranda options.
+-Some stability fixes and slightly better support for
+ large sites.
+-Added more panes to the status bar.
+-Status bar on data display window now tells you
+ the number of bytes of data displayed in that
+ window and the number of bytes downloaded.
+-Fixed a bug which caused some of the text not to
+ be formatted correctly with larger sites.
+-Some other minor changes.
+0.0.26.0
+-Removed some spaces left in the formatted text by the
+ character code to symbol function.
+-Compiled code with some optimisations.
+-Added options to Miranda options to select
+ the method of tag filtering; accurate, fast
+ or dynamic filtering.
+-Moved Display Clean-up options to the contact
+ options dialog so you can set different options
+ for each site.
+-Moved options back to Plugins group.
+-Some bug fixes for the Add Contact/Contact
+ options window.
+-Fixed bug where part of the code regarded
+ a error reply from the server as a download
+ success.
+-Status messages for "Server down or lagging",
+ "Server replied with an error code" and "Download
+ successful now about to process data" added to
+ status bar messages on the data display window.
+-Some more tags added to tag filter
+-More changes to the README.
+0.0.27.0
+-Make sure the first letter of the plugin name
+ in options is always uppercase.
+-Error messages now show for each individual site
+ using either balloon message on the system tray
+ icon or using popup plugin if available. The
+ popup messages are better and that option is
+ recommended.
+-New Contact Options button added to the data
+ display window which replaces the Options menu item
+ on the contact menu.
+-Some changes to code that removes the parts of the webpage
+ that are supposed to remain hidden.
+-There is only one method of filtering now; the fast
+ filter. All options for choosing filter method removed.
+-Added Alert button to data display window.
+-There are two alert methods used for now; popup
+ plugin and sound file. There is one alert event
+ for now; string present in downloaded data.
+-Small problem with plugin's response to global
+ status changes fixed.
+0.0.28.0
+-Added some more translatable strings.
+-Fixed some bugs in and added some improvements
+ to the Alert Options dialog.
+-Log to file was removed from Contact Options
+ and is now an Alert option.
+0.0.29.0
+-Made the plugin information in the plugin listing
+ more descriptive.
+-Fixed bug with hyperlink on data display window by
+ making control a button.
+-Added cancel and Apply buttons to Add Webview Site,
+ Contact Options and Alert Options windows.
+-If the user does not supply a name when creating
+ a new webview contact then the plugin no longer just
+ uses the URL of the site as a name but requests
+ that the user supply a name. Using a URL as a
+ name just looked too messy.
+-When an alert is issued the date and time of the alert
+ is appended to the contact name.
+-The contact name in Contact Options is the contact name without
+ any alert time and date appended to it.
+-Fixed bug which where the presence of an ampersand in the
+ url caused letters to be underlined or missing in the
+ text of the url button on the data display window.
+-Removed the sound alert. Now you can instead set
+ a sound be played when an alert occurs from the
+ same Sounds group in options that other plugins
+ use.
+-Disabled the apply button on the add contact window.
+-Added more translatable strings including error
+ messages, menu items and status bar messages.
+-Fixed bug where the description of the amount
+ of white space removal was not showing in the
+ Add Webview Site window.
+-Other minor changes.
+0.0.30.0
+-Set the titlebar text of the display data window
+ to contact name without any alert time and date
+ appended to it.
+-Added event-type "Alert When The Web Page Change".
+ This produces a user-defined alert when the the
+ contents of a page change from what was on the page
+ when it was last checked. This option creates
+ a file on the users harddrive for every contact
+ this option is set for.
+-Update URL displayed on the data display window
+ if that URL is changed in Contact Options.
+-Fixed bug which caused buttons on data display
+ window not to work if URL was changed.
+-Use PUShowMessage to generate any popup error
+ messages.
+-Contact Options now requests that the user supply a name
+ for a contact if one is not already supplied.
+-Contact Options and Add Webview Site windows now check
+ to see if there are any invalid symbols in the contact name
+ (this is needed to make sure the file name is valid for the
+ cache file).
+-Change the titlebar text of the data display window when
+ the contact name is changed and the changes are applied (
+ used to work only if user pressed "Ok").
+-Made some more of the text on different windows titlebar's
+ translatable.Also made some changes to the code to allow
+ the translation of some of the dynamic strings which occur
+ on the data display windows status bar and in alert popups.
+-Added an alert type to open the data display window when
+ a user defined event occurs.
+-Fixed bug which caused the icon of the (Disable) Stick to the
+ Front button always to show the Disable icon when the
+ window was first opened by double clicking on a contact.
+0.0.31.0
+-Make sure the time and date is not appended to the contact
+ name on contact list UNLESS an alert has been issued.
+-Miranda Translator tool was not translating some strings
+ correctly even though they were translatable. Made changes
+ to the code to help the Translator extract the correct strings.
+-Make the appending of the time of the last alert to the contact
+ list name a contact option.
+-Added a Popup option dialog to the PopUps group in Miranda
+ options so users can set the color of the Alert popups separately
+ from the color of the data display window. The user can also set
+ the popup delay from this option dialog.
+-Added an option to Alert Options to allow the user to define whether
+ the date is added to the contact name as a suffix or a prefix.
+-increased thread safety for popups.
+-Added webview to the "KnownModules" list.
+-User can now control whether the time added to the contact name
+ is in 24 hour or 12 hour format.
+0.0.32.0
+-Made an install script for Miranda Installer.
+-Added an item to the Main menu to allow the user to update
+ all Webview sites at once.
+-Cleaned up indents in source code.
+-Fixed bug in the the code which removes unsupported character
+ code from the display.
+-Fixed bug in code which caused the plugin not to clean up the display
+ if one or more of the Start or End strings was not present on
+ the web page even if plugin didn't need to check for these strings.
+-Separated the sources out into smaller files.
+-There was no way of adding a new webview site if the user had disabled
+ the main menu items. Added options to take place of the main menu items
+ in the main Miranda options dialog and made sure these options are not
+ enabled unless the main menu is disabled.
+-Right clicking on a popup now opens the web site in a browser window.
+-Added "Only Update Window on Alert" to main Miranda options to prevent
+ contents of the data display window being overwritten if there
+ is not an alert.
+-Changed the automove function so it no longer moves the data display
+ window back on screen (if the user moves it off of it) but just
+ makes sure the position will be on screen the next time it is created.
+-If Miranda crashed on exit then the window colors were not being
+ saved; save colors when the color options are changed to prevent this
+ happening.
+-Added a main menu item to enable or disable automatic updates of webview
+ sites.
+-Increased time interval range from 0-99 minutes to 0-999 minutes.
+-Fixed some bugs in the the Popup options.
+-Added option to use the same colors in the alert popup as is
+ used in the data display window.
+-User can now set the left and right click popup actions from
+ popup options. User can set the actions to open data display window,
+ open web page or dismiss popup.
+0.1.0.0
+-First Beta release
+-Make sure the first letter of the Webview menu title on
+ the Main menu is uppercase.
+-Use the Miranda Find/Add Contacts dialog to add webview
+ sites to the contact list.
+-Use the URL to create a name for the contact.
+-Make sure the update button on the data display window
+ always can update the text in the window even if the
+ "Only Update Window on Alert" option ticked.
+-Fixed bug which caused an invalid window position to be written
+ to the database if data display window was minimised when
+ Miranda exited.
+-Make sure the site name in Contact options and on the data
+ display window's titlebar is the same as the contact name
+ on the contact list unless it has a date added to it.
+-If Miranda crashed on exit then the window position was not being
+ saved; save position when the window is closed to prevent this
+ happening.
+-On slower systems data display window was seen in a different
+ area of the screen when opened then it was seen to move to
+ the correct position on the screen. Put fixes in place to correct this.
+-Added an event type to test if a specific area of a webpage has changed
+-Fixed some bugs in the Alert Options dialog.
+-Fixed bug which caused update button to become disabled if the
+ user clicked the button when that site was already being downloaded.
+-Check for alerts BEFORE filtering cleaning up the text.
+-Added the option to display alerts using the OSD plugin.
+-Fixed a bug that caused the plugin to falsely report that
+ the monitored website had changed.
+-Make sure the Apply buttons on the Contact Options and the
+ Alert Options windows is disabled unless there is a change
+ made to the options.
+-If either the display or alert start/end strings aren't present on
+ on a site issue an alert.
+-Start/End string not present and invalid search parameter errors
+ now set the contact to Away status (just like server error codes).
+-Added a button to the Contact Options dialog to copy the display
+ Start and End strings to the alert Start and End strings and set
+ the event type to "Alert When A Specific Part of Web Page Changes".
+-If a server replies with an error code display the exact error code
+ returned.
+-Find/Add dialog was truncating URL's.
+-Added more compact Contact Options and Alert Options dialogs
+-Made the comboboxes in the Alert Options dialog translatable.
+-Some improvements to the code that fixes the underlined text
+ bug on the url button.
+-Disable both the Contact Options and the Alert Options button
+ when then either then Contact Options or the Alert Options
+ button is opened (need to do this to avoid a bug).
+-Allow user to have more than one contact with the same URL
+ if those contacts have different names. If more than one
+ contact has the same name and URL then issue a warning
+ when using buttons on those contacts data display window.
+-Allow user to add contacts with the same URL and an existing
+ Webview contact.
+-Append a random number to the contact name when it is created
+ to avoid creation of Webview contacts with the same name if
+ they are using the same URL.
+-Added a status bar message to tell the user that a site is currently
+ downloading if they try to update another site manually.
+-Error now display using either PopUp plugin or the OSD plugin
+ if the "display errors using PopUp plugin" option is selected.
+ The plugin tries to use the PopUp plugin first but if that service
+ is not available then it uses the OSD plugin (if plugin is loaded).
+-Removed some unneeded preshutdown code.
+-Removed support for Plugin Uninstaller (that plugin will not work in
+ Miranda 0.4 anyway).
+-Removed main Webview option control which was used to add new Webview
+ contacts (the user can easily do this through the main menu item or
+ by the Find/Add dialog if the main menu item is disabled).
+-Updates to the README.
+0.1.1.0
+-Some improvement to the code that converts HTML character entities to
+ symbols.
+-Remember contact previous status on startup.
+-Stop the User Details dialog from constantly displaying "...Updating...".
+--Button in the Contact Options dialog to copy the Start and End strings
+ was not setting the event type to "Alert When A Specific Part of Web Page Changes".
+-If "Update window only on Alert" option was ticked statusbar was always displaying
+ "processing data, please wait" if all the sites were updated at the same time. Corrected
+ and added another status message.
+-Make sure all existing Webview contacts are set to online status the first time this
+ version of Webview is loaded.
+-Added a control to the main options to allow the user to set a delay of up to 120
+ seconds before Webview updates on start-up.
+-Make sure the timed updates cannot occur until the update on start up is finished.
+-Don't log to file twice if both types of start/end strings are not present and there is an
+ alert to indicate this.
+-Automatically delete the cache file (if one exists) when deleting a Webview contact
+ or when alerts are disabled for that contact.
+-Webview now knows when a contact is renamed on the contact list.
+-Rename the cache file (if one exists) when a contact is renamed.
+-Added the option to save the position of individual data display windows.
+-Added some delays to make the plugin slightly less CPU usage intensive
+ during data download and processing.
+-Added an advanced option to disable the download protection code if
+ the user wishes to do this. This has the advantage of being able to
+ download more than one site at the same time but it also potentially
+ could cause corruption of data.
+-Fixed a bug in the main Webview options.
+-Display time/date in the logs and on the status bar in the
+ users own language.
+-Bug causing last letter in display to be sometimes repeated.
+ This isn't a complete fix but it should stop the worst cases.
+-Added option to Contact Options so user can choose to log
+ data to file in its raw state or with all the tags removed.
+-Added a new status (DND) to indicate the plugin is downloading or processing
+ data for a particular site.
+-Filter out (most) CSS attributes.
+-When part of the web page has changed, change the color of the text
+ and background (and select the text) in the part of the page you are
+ monitoring so that the user can find this portion of the page easier
+ within the larger body of the displayed text.
+-Made some more space for translation strings in options.
+-Fixed some bugs in the EraseBlock function which causes
+ the plugin to hang while processing data.
+-Data window too small when it opened the first time. Made
+ window bigger.
+-Use SkinAddNewSoundEx instead of SkinAddNewSound.
+-Prevent Miranda versions less than 0.4.0.0 from loading plugin.
+-Cleaned up code.
+-Added TopToolBar buttons for adding Webview sites,updating
+ all Webview sites and disabling/enabling auto update.
+-Only load TopToolBar buttons if Main Menu items are disabled.
+-0.1.3.1
+-added "prettier" icon resources.
+-Removed" Add Webview Site from main menu.
+-Added code to get ride of <style> </style>.
+-removed TopToolbar support
+-Added Contact Options and Contact Alert Options to the contact menu.
+-Moved from PLUGININFO to PLUGININFOEX structure
+-Moved Webview's options from "Plugins" to "Network" in Miranda's options page.
+-Improved language pack support.
+-Added menu item to open cache folder.
+-New icon for Update All main menu item and Open Web Page contact menu item.
+-Added main menu item to mark all sites read
+-Added contact menu item to update site data.
+-Added Contact Menu item to ping the web site to test if there is any issue with connectivity.
+-0.1.3.2
+-Fixed an old bug where a DB value was getting written to any contact which was double clicked
+ regardless of its protocol.
+-The URL of a Webview contact is now also the contact's "Web Page" in user details.
+-Stop displaying unneeded status icons on the status bar.
+-Removed BBCode from popups to make compatible with YAPP.
+-The progress of data processing is shown on the data window.
+-Added contact menu item to stop the data processing on a site.
+-0.1.3.3
+-Stopped translating some clist items that should not be translated except by the core.
+-Add random number to contacts name when contact is created, if its the same as the
+ name of another webview contact on the list.
+-When updating all sites, don't wait for one site to finish updating before updating
+ the next.
+-The contact's StatusMsg now reports the site updating, offline, online, alert issued and site errors.
+-Removed an old part of the data window that is no longer needed.
+-Added a button to the data window to allow the user to stop data processing.
+-Text in data window updates during data processing.
+-0.1.3.4
+-Backed out a change in the code which was causing false alerts. Contacts have to
+ wait for other sites to stop updating before updating themselves.
+-Smaller cache size.
+-0.1.3.5
+-Destroy services on exit.
+-Popup message when all sites have been updated.
+-If Miranda crashes, the status icon no longer reappears on the statusbar bar, if
+ the user had originally chosen to hide it.
+-0.1.3.6
+-Smaller dll size.
+-Swapped the stick and unstick icons.
+-Added option to Main Options to display site data in a Popup when there is an alert.
+-Show error message if psite.bat doesn't exist and user is attempting to ping a site.
+-Show error message if cache folder doesn't exist and user is attempting to open it.
+-0.1.3.7
+-Fixed a potential crash when updating contacts.
+-If user renames a contact to a name containing a forbidden character,
+ there is an error popup to inform them and the character is converted to a "_"
+ and a random number appended to the end of the name.
+ -0.1.3.8
+ -The "Update on Window Open" option has been changed to "Load Page on Window Open".
+This change means when the option is selected, the window will first of all attempt to
+load information into the window from the cache, and only if the cache file doesn't exist
+will it attempt to download the web page and display it.
+-Mark site as read when window is opened and window is set to load data on open.
+-0.1.3.9
+-Prevent a crash when "Add Contact" is used instead of "Find/Add Contact", and also when
+ "Find/Add Contact" is used incorrectly.
+- Opening a site in a browser window using double click, contact menu, the url button
+ on the data window or clicking on popups, all set the contacts status to online/read.
+-Added a counter to the Webview main menu, which shows how many minutes to the next update.
+-Changed the "Permanent" and "From Popup Plugin" options in popup options, from radio
+ buttons to buttons.
+-0.1.3.10
+-Made separate Unicode and ANSI versions of plugin.
+-Removed some old unneeded code.
+
+
+
+
+
+
+
+
+
+
+
+*********************
+Copyright
+---------
+Copyright (C) 2011 Vincent Joyce
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+
+
diff --git a/protocols/WebView/docs/todo.txt b/protocols/WebView/docs/todo.txt
new file mode 100644
index 0000000000..b28b04f643
--- /dev/null
+++ b/protocols/WebView/docs/todo.txt
@@ -0,0 +1,3 @@
+
+
+
diff --git a/protocols/WebView/res/Icon_14.ico b/protocols/WebView/res/Icon_14.ico
new file mode 100644
index 0000000000..e7577d004b
--- /dev/null
+++ b/protocols/WebView/res/Icon_14.ico
Binary files differ
diff --git a/protocols/WebView/res/alert.ico b/protocols/WebView/res/alert.ico
new file mode 100644
index 0000000000..86d8a9819a
--- /dev/null
+++ b/protocols/WebView/res/alert.ico
Binary files differ
diff --git a/protocols/WebView/res/find.ico b/protocols/WebView/res/find.ico
new file mode 100644
index 0000000000..49ce7340b6
--- /dev/null
+++ b/protocols/WebView/res/find.ico
Binary files differ
diff --git a/protocols/WebView/res/folder.ico b/protocols/WebView/res/folder.ico
new file mode 100644
index 0000000000..e9777a4596
--- /dev/null
+++ b/protocols/WebView/res/folder.ico
Binary files differ
diff --git a/protocols/WebView/res/markallread.ico b/protocols/WebView/res/markallread.ico
new file mode 100644
index 0000000000..1fd4064a75
--- /dev/null
+++ b/protocols/WebView/res/markallread.ico
Binary files differ
diff --git a/protocols/WebView/res/options.ico b/protocols/WebView/res/options.ico
new file mode 100644
index 0000000000..ddb72fb8ca
--- /dev/null
+++ b/protocols/WebView/res/options.ico
Binary files differ
diff --git a/protocols/WebView/res/ping.ico b/protocols/WebView/res/ping.ico
new file mode 100644
index 0000000000..2f9b702beb
--- /dev/null
+++ b/protocols/WebView/res/ping.ico
Binary files differ
diff --git a/protocols/WebView/res/popup.ico b/protocols/WebView/res/popup.ico
new file mode 100644
index 0000000000..f83a62a64c
--- /dev/null
+++ b/protocols/WebView/res/popup.ico
Binary files differ
diff --git a/protocols/WebView/res/show_hide.ico b/protocols/WebView/res/show_hide.ico
new file mode 100644
index 0000000000..afae803b69
--- /dev/null
+++ b/protocols/WebView/res/show_hide.ico
Binary files differ
diff --git a/protocols/WebView/res/stick.ico b/protocols/WebView/res/stick.ico
new file mode 100644
index 0000000000..a11221d6c6
--- /dev/null
+++ b/protocols/WebView/res/stick.ico
Binary files differ
diff --git a/protocols/WebView/res/stop.ico b/protocols/WebView/res/stop.ico
new file mode 100644
index 0000000000..b62ed82acf
--- /dev/null
+++ b/protocols/WebView/res/stop.ico
Binary files differ
diff --git a/protocols/WebView/res/unstick.ico b/protocols/WebView/res/unstick.ico
new file mode 100644
index 0000000000..edb7c1f4e7
--- /dev/null
+++ b/protocols/WebView/res/unstick.ico
Binary files differ
diff --git a/protocols/WebView/res/update.ico b/protocols/WebView/res/update.ico
new file mode 100644
index 0000000000..c6e4c359a7
--- /dev/null
+++ b/protocols/WebView/res/update.ico
Binary files differ
diff --git a/protocols/WebView/res/updateall.ico b/protocols/WebView/res/updateall.ico
new file mode 100644
index 0000000000..482bbf2826
--- /dev/null
+++ b/protocols/WebView/res/updateall.ico
Binary files differ
diff --git a/protocols/WebView/res/url.ico b/protocols/WebView/res/url.ico
new file mode 100644
index 0000000000..6baf15c3c5
--- /dev/null
+++ b/protocols/WebView/res/url.ico
Binary files differ
diff --git a/protocols/WebView/res/version.rc b/protocols/WebView/res/version.rc
new file mode 100644
index 0000000000..5a5ddd63ed
--- /dev/null
+++ b/protocols/WebView/res/version.rc
@@ -0,0 +1,9 @@
+// Microsoft Visual C++ generated resource script.
+//
+#ifdef APSTUDIO_INVOKED
+#error this file is not editable by Microsoft Visual C++
+#endif //APSTUDIO_INVOKED
+
+#include "..\src\version.h"
+
+#include "..\..\build\Version.rc"
diff --git a/protocols/WebView/res/web.ico b/protocols/WebView/res/web.ico
new file mode 100644
index 0000000000..2b5a44dbf9
--- /dev/null
+++ b/protocols/WebView/res/web.ico
Binary files differ
diff --git a/protocols/WebView/res/webview.rc b/protocols/WebView/res/webview.rc
new file mode 100644
index 0000000000..0d92123c31
--- /dev/null
+++ b/protocols/WebView/res/webview.rc
@@ -0,0 +1,364 @@
+//////////////////
+#include <windows.h>
+#include "..\src\resource.h"
+///////////////////
+
+
+
+
+/////////////////////////////
+////Icons
+/////////////////////////////
+
+IDI_SITE ICON DISCARDABLE "web.ico"
+IDI_STICK ICON DISCARDABLE "stick.ico"
+IDI_UNSTICK ICON DISCARDABLE "unstick.ico"
+IDI_URL ICON DISCARDABLE "url.ico"
+IDI_OPTIONS ICON DISCARDABLE "options.ico"
+IDI_UPDATE ICON DISCARDABLE "update.ico"
+IDI_SHOW_HIDE ICON DISCARDABLE "show_hide.ico"
+IDI_FIND ICON DISCARDABLE "find.ico"
+IDI_ALERT ICON DISCARDABLE "alert.ico"
+IDI_FOLDER ICON DISCARDABLE "folder.ico"
+IDI_UPDATEALL ICON DISCARDABLE "updateall.ico"
+IDI_MARKALLREAD ICON DISCARDABLE "markallread.ico"
+IDI_PING ICON DISCARDABLE "ping.ico"
+IDI_STOP ICON DISCARDABLE "stop.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+//////////////////////////
+//// Main Options
+///////////////////////////
+IDD_OPT DIALOGEX 0,0,280,231
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ //
+
+ GROUPBOX "Webview",IDC_STATIC,1,11,278,63,WS_GROUP
+ //
+ LTEXT "Update data every",IDC_STATIC,6,26,100,8
+ EDITTEXT IDC_TIME,84,26,28,12,ES_AUTOHSCROLL | ES_NUMBER
+ CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT |
+ UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS |
+ UDS_NOTHOUSANDS,125,11,7,11
+ LTEXT "minutes",IDC_STATIC,113,26,25,8
+ //
+ LTEXT "Delay update on start",IDC_STARTDELAYTXT,6,49,100,8
+ EDITTEXT IDC_START_DELAY,84,49,28,12,ES_AUTOHSCROLL | ES_NUMBER
+ CONTROL "Spin2",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT |
+ UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS |
+ UDS_NOTHOUSANDS,125,34,7,11
+ LTEXT "seconds",IDC_STDELAYSECTXT,113,49,36,8
+ //
+ CONTROL "Hide icon on status bar",IDC_HIDE_STATUS_ICON,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,150,20,128,8
+ CONTROL "Disable main menu items",IDC_DISABLEMENU,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,150,30,128,8
+ CONTROL "Load page on window open",IDC_UPDATE_ON_OPEN,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,150,40,128,8
+ CONTROL "Update data on startup",IDC_UPDATE_ONSTART,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,150,50,128,8
+ CONTROL "Only update window on alert",IDC_UPDATE_ONALERT,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,150,60,128,8
+
+///////////
+
+ GROUPBOX "Window appearance",IDC_STATIC,1,75,278,62
+ LTEXT "Background color:",IDC_STATIC,16,85,69,8
+ CONTROL "",IDC_BGCOLOR,"ColourPicker",WS_TABSTOP,85,85,20,8
+ LTEXT "Text color:",IDC_STATIC,16,95,69,8
+ CONTROL "",IDC_TXTCOLOR,"ColourPicker",WS_TABSTOP,85,95,20,8
+
+ COMBOBOX IDC_TYPEFACE,16,105,136,182,CBS_DROPDOWN | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_SCRIPT,58,120,72,68,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+
+ COMBOBOX IDC_FONTSIZE,16,120,40,69,CBS_DROPDOWN | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "Bold",IDC_FONT_BOLD,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,160,90,48,8
+ CONTROL "Italic",IDC_FONT_ITALIC,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,160,100,48,8
+ CONTROL "Underline",IDC_FONT_UNDERLINE,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,160,110,58,8
+ CONTROL "Save individual window positions",IDC_SAVE_INDIVID_POS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,132,122,146,8
+
+///////////
+ GROUPBOX "Error messages",IDC_STATIC,1,137,278,25
+ CONTROL "Suppress error messages",IDC_SUPPRESS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,16,149,113,8
+ CONTROL "Display using popup or OSD plugin",IDC_ERROR_POPUP,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,140,149,130,8
+//////////
+ GROUPBOX "Expert options",IDC_ADV_GRP,142,163,137,35,WS_GROUP
+ CONTROL "Disable download protection",IDC_NO_PROTECT,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,148,175,130,8
+ LTEXT "(not recommended)",IDC_NOT_RECOMND_TXT,148,185,122,8
+//////////
+ GROUPBOX "Display data in popup on alert",IDC_STATIC, 1, 164, 139, 34
+ CONTROL "Display data in popup", IDC_DATAPOPUP , "Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP, 16, 177, 120, 8
+/////
+ LTEXT "You may need to restart Miranda NG for this change to take effect.",IDC_RESTART,
+ 30,220,230,8,NOT WS_VISIBLE
+
+
+END
+
+///////////////////////////////////////////////////////////////////////////////////
+//data window
+////////////////
+IDD_DISPLAY_DATA DIALOGEX 0, 0, 212, 150
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP |
+ NOT WS_VISIBLE | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME |WS_MAXIMIZEBOX |
+ WS_MINIMIZEBOX
+EXSTYLE WS_EX_CONTROLPARENT
+CAPTION ""
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+
+BEGIN
+
+CONTROL "",IDC_UPDATE_BUTTON,"MButtonClass",WS_TABSTOP,5,1,16,14
+CONTROL "",IDC_STICK_BUTTON,"MButtonClass",WS_TABSTOP,25,1,16,14
+CONTROL "",IDC_FIND_BUTTON,"MButtonClass",WS_TABSTOP,45,1,16,14
+CONTROL "",IDC_OPTIONS_BUTTON,"MButtonClass",WS_TABSTOP,65,1,16,14
+CONTROL "",IDC_ALERT_BUTTON ,"MButtonClass",WS_TABSTOP,85,1,16,14
+CONTROL "",IDC_STOP ,"MButtonClass",WS_TABSTOP,105,1,16,14
+CONTROL "",IDC_OPEN_URL ,"MButtonClass",WS_TABSTOP,1,19,212,8
+CONTROL "",IDC_DATA,"RichEdit50W", ES_LEFT | ES_MULTILINE | ES_WANTRETURN | WS_CHILD | WS_VISIBLE | WS_VSCROLL, 1, 28, 209, 110
+CONTROL "", IDC_STATUSBAR, "msctls_statusbar32", SBARS_SIZEGRIP | WS_CHILD | WS_VISIBLE, 128, 4, 60, 12
+
+END
+
+
+///////////////////////////////////////////////////////////////////////
+///contact options
+//////////
+IDD_CONTACT_OPT DIALOGEX 0, 0, 367, 115
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+//
+ GROUPBOX "Webview",IDC_STATIC, 4, 1, 239, 44 ,WS_GROUP
+ RTEXT "Contact name:",IDC_STATIC,7, 14, 72, 8
+ EDITTEXT IDC_SITE_NAME, 80, 12, 158, 12 ,ES_AUTOHSCROLL
+ RTEXT "URL:",IDC_STATIC,7, 28, 72, 8
+ EDITTEXT IDC_URL, 80, 26, 158, 12,ES_AUTOHSCROLL
+ //
+ GROUPBOX "Display", IDC_STATIC, 245, 1, 120, 92,WS_GROUP
+ CONTROL "Between start and end strings",IDC_U_SE_STRINGS,"Button",
+ BS_AUTORADIOBUTTON, 249, 25, 113, 8
+ CONTROL "Whole web page",IDC_U_ALLSITE,"Button",
+ BS_AUTORADIOBUTTON, 249, 12, 113, 8
+ RTEXT "Start:",IDC_STATIC, 249, 39, 30, 8
+ EDITTEXT IDC_START, 280, 37, 70, 12 ,ES_AUTOHSCROLL
+ RTEXT "End:",IDC_STATIC,249, 53, 30, 8
+ EDITTEXT IDC_END, 280, 51, 70, 12 ,ES_AUTOHSCROLL
+ DEFPUSHBUTTON "Copy strings to alerts",IDC_CPY_STRINGS, 249, 66, 101, 12
+ //LTEXT "(pastes strings)",IDC_CPY_STR_TXT, 270, 81, 92, 8
+ //
+ GROUPBOX "Double click action",IDC_STATIC, 4, 47, 111, 47 ,WS_GROUP
+ CONTROL "Opens web page",IDC_DBLE_WEB,"Button",
+ BS_AUTORADIOBUTTON, 6, 68, 105, 8
+ CONTROL "Opens data window",IDC_DBLE_WIN,"Button",
+ BS_AUTORADIOBUTTON,6, 81, 105, 8
+ //
+ GROUPBOX "Display clean-up",IDC_STATIC, 117, 47, 126, 47 ,WS_GROUP
+ CONTROL "Remove HTML",IDC_CLEAN,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP, 120, 59, 100, 8
+ CONTROL "Slider1",IDC_RWSPACE,"msctls_trackbar32",TBS_BOTH |
+ TBS_NOTICKS | WS_TABSTOP,120, 70, 100, 8
+ LTEXT "",IDC_RWSPC_TEXT, 120, 81, 120, 8 ,WS_VISIBLE
+ //
+ DEFPUSHBUTTON "OK",IDOK, 207, 98, 50, 14
+ PUSHBUTTON "Cancel",IDC_OPT_CANCEL, 261, 98, 50, 14
+ PUSHBUTTON "Apply",IDC_OPT_APPLY, 315, 98, 50, 14
+
+
+END
+
+/////////////////////////////////////////////////////////////////////////////////////
+//find window
+//////
+IDD_FIND DIALOGEX 0, 0, 230, 46
+STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_CONTROLPARENT
+CAPTION "Find"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ EDITTEXT IDC_FINDWHAT,48,11,115,12,ES_AUTOHSCROLL
+ DEFPUSHBUTTON "&Find next",IDC_OK,173,7,50,14
+ PUSHBUTTON "Cancel",IDC_CANCEL,173,24,50,14
+ LTEXT "Find what:",IDC_STATIC,7,13,39,9
+ GROUPBOX "",IDC_STATIC,48,24,115,18
+ LTEXT "Search was completed.",IDC_SEARCH_COMPLETE,
+ 52,30,90,8,NOT WS_VISIBLE
+END
+
+
+
+///////////////////////////////////
+//Alert Options
+////////
+IDD_ALRT_OPT DIALOGEX 0, 0, 337, 185
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+
+BEGIN
+
+ GROUPBOX "Events and alerts",IDC_STATIC,3, 4, 331, 71,WS_GROUP
+ CONTROL "Enable alerts",IDC_ENABLE_ALERTS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP, 9, 13, 82, 13
+ CONTROL "Always log to file",IDC_ALWAYS_LOG,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP, 9, 25, 82, 13
+ //
+ GROUPBOX "",IDC_STATIC,7, 36, 324, 35 ,WS_GROUP
+ CONTROL "Add time and date of alert to contact name",IDC_ADD_DATE_NAME,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP, 9, 42, 235, 13
+ CONTROL "Use 24 hour time format instead of 12 hour",IDC_24_HOUR,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,9, 57, 235, 13
+ CONTROL "Add as prefix",IDC_PREFIX,"Button",
+ BS_AUTORADIOBUTTON, 248, 46, 82, 8
+ CONTROL "Add as suffix",IDC_SUFFIX,"Button",
+ BS_AUTORADIOBUTTON, 248, 58, 82, 8
+ //
+ RTEXT "Alert when:",IDC_STATIC, 120, 13, 63, 9
+ COMBOBOX IDC_EVENT_TYPE,184, 11, 147, 63 ,CBS_DROPDOWN |
+ WS_VSCROLL | WS_TABSTOP
+ RTEXT "Alert type:",IDC_STATIC, 120, 27, 63, 9
+ COMBOBOX IDC_ALERT_TYPE, 184, 26, 147, 67 ,CBS_DROPDOWN |
+ WS_VSCROLL | WS_TABSTOP
+ //
+ //////////
+ GROUPBOX "Test conditions",IDC_STATIC, 3, 77, 331, 58 ,WS_GROUP
+ //
+ GROUPBOX "Alert when string is present on web page",IDC_STATIC, 7, 85, 144, 44 ,WS_GROUP
+ RTEXT "String:",IDC_STATIC, 10, 99, 34, 8
+ EDITTEXT IDC_ALERT_STRING, 45, 97, 103, 12 ,ES_AUTOHSCROLL
+ //
+ GROUPBOX "Alert when specific area of web page changes",IDC_STATIC,155, 85, 176, 44 ,WS_GROUP
+ RTEXT "Start:",IDC_STATIC, 163, 97, 36, 8
+ EDITTEXT IDC_START2,200, 95, 126, 12,ES_AUTOHSCROLL
+ RTEXT "End:",IDC_STATIC, 163, 112, 36, 8
+ EDITTEXT IDC_END2,200, 110, 125, 12,ES_AUTOHSCROLL
+ //
+ /////////
+ //
+ GROUPBOX "Log to file",IDC_STATIC, 3, 137, 246, 37,WS_GROUP
+ RTEXT "Log file:",IDC_STATIC, 8, 148, 39, 9
+ EDITTEXT IDC_FILENAME, 48, 147, 174, 12,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_BROWSE, 228, 148, 15, 11
+ CONTROL "Append data to file",IDC_APPEND,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,8, 161, 132, 8
+ CONTROL "Save as raw data",IDC_SAVE_AS_RAW,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,141, 161, 106, 8
+
+ //
+
+ DEFPUSHBUTTON "OK",IDC_OK2, 276, 137, 50, 14
+ PUSHBUTTON "Cancel",IDC_ALERT_CANCEL, 276, 153, 50, 14
+ PUSHBUTTON "Apply",IDC_ALERT_APPLY, 276, 169, 50, 14
+ //
+
+
+
+
+END
+//////////////
+//popup options
+///////
+IDD_POPUP DIALOGEX 0, 0, 306, 183
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ ////
+ GROUPBOX "Popup delay",IDC_STATIC,8,5,150,54,WS_GROUP
+ //CONTROL "Delay",IDC_PD3,"Button",BS_AUTORADIOBUTTON,18,15,47,8
+ LTEXT "Delay",IDC_STATIC,18,15,47,8
+ EDITTEXT IDC_DELAY,65,15,31,9,ES_RIGHT | ES_AUTOHSCROLL |
+ ES_NUMBER | NOT WS_BORDER,WS_EX_STATICEDGE
+ LTEXT "seconds",IDC_STATIC,106,15,34,10
+ //CONTROL "From popup plugin",IDC_PD1,"Button",BS_AUTORADIOBUTTON,
+ // 18,30,110,12
+ CONTROL "From popup plugin",IDC_PD1,"MButtonClass",WS_TABSTOP,
+ 18,30,110,12
+ //CONTROL "Permanent",IDC_PD2,"Button",BS_AUTORADIOBUTTON,18,45,
+ // 110,12
+ CONTROL "Permanent",IDC_PD2,"MButtonClass",WS_TABSTOP,18,45,
+ 110,12
+
+ ////
+ CONTROL "Preview",IDC_PREVIEW,"MButtonClass",WS_TABSTOP,223,30,
+ 45,11,0x18000000L
+ ////
+ GROUPBOX "Colors",IDC_STATIC,8,60,270,60,WS_GROUP
+ CONTROL "Use custom colors",IDC_POP_USECUSTCOLORS,"Button",
+ BS_AUTORADIOBUTTON,18,70,111,13
+ CONTROL "Use Windows colors",IDC_POP_USEWINCOLORS,"Button",
+ BS_AUTORADIOBUTTON,18,85,121,13
+ CONTROL "Use same colors as data window", IDC_POP_USESAMECOLORS,"Button",
+ BS_AUTORADIOBUTTON,18,100,161,13
+
+ LTEXT "Background",IDC_STATIC,223,65,50,8,SS_CENTERIMAGE
+ LTEXT "Text",IDC_STATIC,147,65,50,8,SS_CENTERIMAGE
+ CONTROL "",IDC_POP_BGCOLOUR,"ColourPicker",WS_TABSTOP,223,75,35,11
+ CONTROL "",IDC_POP_TEXTCOLOUR,"ColourPicker",WS_TABSTOP,147,75,35,11
+ ////
+
+ GROUPBOX "Left click action",IDC_STATIC,8,125,120,54,WS_GROUP
+ CONTROL "Open data display window",IDC_LCLK_WINDOW,"Button",
+ BS_AUTORADIOBUTTON,18,135,100,8
+ CONTROL "Open web page",IDC_LCLK_WEB_PGE,"Button",
+ BS_AUTORADIOBUTTON,18,150,100,8
+ CONTROL "Dismiss popup",IDC_LCLK_DISMISS,"Button",
+ BS_AUTORADIOBUTTON,18,165,100,8
+
+
+ GROUPBOX "Right click action",IDC_STATIC,160,125,120,54,WS_GROUP
+ CONTROL "Open data display window",IDC_RCLK_WINDOW,"Button",
+ BS_AUTORADIOBUTTON,170,135,100,8
+ CONTROL "Open web page",IDC_RCLK_WEB_PGE,"Button",
+ BS_AUTORADIOBUTTON,170,150,100,8
+ CONTROL "Dismiss popup",IDC_RCLK_DISMISS,"Button",
+ BS_AUTORADIOBUTTON,170,165,100,8
+
+ //CONTROL "Use popup plugins notify popups",IDC_PUALERT,"Button",
+ // BS_AUTOCHECKBOX | WS_TABSTOP,16,185,130,8
+
+END
+
+
+
+
+
+/////////////////////////////
+
+///////////////
+//Menus
+///////////////
+
+IDR_CONTEXT MENU DISCARDABLE
+BEGIN
+ POPUP "Log"
+ BEGIN
+ MENUITEM "&Copy", IDM_COPY
+ MENUITEM "C&ut", IDM_CUT
+ MENUITEM "&Delete", IDM_DELETE
+ MENUITEM "&Paste", IDM_PASTE
+ MENUITEM SEPARATOR
+ MENUITEM "Co&py all", IDM_COPYALL
+ MENUITEM "&Select all", IDM_SELECTALL
+ MENUITEM "C&lear all", IDM_CLEAR_ALL
+
+ END
+END
diff --git a/protocols/WebView/src/main.cpp b/protocols/WebView/src/main.cpp
new file mode 100644
index 0000000000..d53964c0af
--- /dev/null
+++ b/protocols/WebView/src/main.cpp
@@ -0,0 +1,285 @@
+/*
+ * A plugin for Miranda IM which displays web page text in a window.
+ * Copyright (C) 2005 Vincent Joyce.
+ *
+ * Miranda IM: the free icq client for MS Windows
+ * Copyright (C) 2000-2 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "stdafx.h"
+#include "webview.h"
+
+MWindowList hWindowList;
+HNETLIBUSER hNetlibUser;
+HANDLE hHookDisplayDataAlert, hHookAlertPopup, hHookAlertWPopup, hHookErrorPopup, hHookAlertOSD;
+
+CMPlugin g_plugin;
+
+static HMODULE hRichEd = nullptr;
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+PLUGININFOEX pluginInfoEx = {
+ sizeof(PLUGININFOEX),
+ __PLUGIN_NAME,
+ PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM),
+ __DESCRIPTION,
+ __AUTHOR,
+ __COPYRIGHT,
+ __AUTHORWEB,
+ UNICODE_AWARE,
+ // {CD5427FB-5320-4f65-B4BF-86B7CF7B5087}
+ {0xcd5427fb, 0x5320, 0x4f65, {0xb4, 0xbf, 0x86, 0xb7, 0xcf, 0x7b, 0x50, 0x87}}
+};
+
+CMPlugin::CMPlugin() :
+ PLUGIN<CMPlugin>(MODULENAME, pluginInfoEx)
+{
+ RegisterProtocol(PROTOTYPE_PROTOCOL);
+ SetUniqueId("PreserveName");
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void InitServices()
+{
+ CreateProtoServiceFunction(MODULENAME, PS_GETCAPS, GetCaps);
+ CreateProtoServiceFunction(MODULENAME, PS_GETNAME, GetName);
+ CreateProtoServiceFunction(MODULENAME, PS_LOADICON, BPLoadIcon);
+ CreateProtoServiceFunction(MODULENAME, PS_SETSTATUS, SetStatus);
+ CreateProtoServiceFunction(MODULENAME, PS_GETSTATUS, GetStatus);
+ CreateProtoServiceFunction(MODULENAME, PS_BASICSEARCH, BasicSearch);
+ CreateProtoServiceFunction(MODULENAME, PS_ADDTOLIST, AddToList);
+ CreateProtoServiceFunction(MODULENAME, PSS_GETINFO, GetInfo);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void ChangeContactStatus(int con_stat)
+{
+ WORD status_code = 0;
+ if (con_stat == 0)
+ status_code = ID_STATUS_OFFLINE;
+ if (con_stat == 1)
+ status_code = ID_STATUS_ONLINE;
+ if (con_stat == 2)
+ status_code = ID_STATUS_AWAY;
+ if (con_stat == 3)
+ status_code = ID_STATUS_NA;
+
+ for (auto &hContact : Contacts(MODULENAME))
+ g_plugin.setWord(hContact, "Status", status_code);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_PROTOCOL, MIID_LAST };
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+int CMPlugin::Load()
+{
+ HookEvent(ME_CLIST_DOUBLECLICKED, Doubleclick);
+
+ hMenu = LoadMenu(g_plugin.getInst(), MAKEINTRESOURCE(IDR_CONTEXT));
+ hRichEd = LoadLibrary(L"Msftedit.dll");
+
+ /*TIMERS*/
+ if ((g_plugin.getDword(REFRESH_KEY, TIME) != 0)) {
+ timerId = SetTimer(nullptr, 0, ((g_plugin.getDword(REFRESH_KEY, TIME)) * MINUTE), timerfunc);
+ g_plugin.setDword(COUNTDOWN_KEY, 0);
+ Countdown = SetTimer(nullptr, 0, MINUTE, Countdownfunc);
+ }
+
+ InitialiseGlobals();
+
+ // register netlib handle
+ char tempNdesc[50];
+ mir_snprintf(tempNdesc, "%s connection settings", MODULENAME);
+
+ NETLIBUSER nlu = {};
+ nlu.flags = NUF_OUTGOING | NUF_HTTPCONNS;
+ nlu.szSettingsModule = MODULENAME;
+ nlu.szDescriptiveName.a = tempNdesc;
+ hNetlibUser = Netlib_RegisterUser(&nlu);
+
+ //protocol services
+ InitServices();
+
+ //add sound event to options
+ g_plugin.addSound("webviewalert", _A2W(MODULENAME), LPGENW("Alert event"));
+
+ //value is 1 if menu is disabled
+ g_plugin.setByte(MENU_IS_DISABLED_KEY, 1);
+
+ CMenuItem mi(&g_plugin);
+ mi.flags = CMIF_UNICODE;
+ if ( g_plugin.getByte(MENU_OFF, 0)) {
+ //value is 0 if menu is enabled
+ g_plugin.setByte(MENU_IS_DISABLED_KEY, 0);
+
+ mi.root = g_plugin.addRootMenu(MO_MAIN, _A2W(MODULENAME), 20200001);
+ Menu_ConfigureItem(mi.root, MCI_OPT_UID, "403BE07B-7954-4F3E-B318-4301571776B8");
+
+ /*DISABLE WEBVIEW*/
+ SET_UID(mi, 0xdedeb697, 0xfc10, 0x4622, 0x8b, 0x97, 0x74, 0x39, 0x32, 0x68, 0xa7, 0x7b);
+ CreateServiceFunction("DisableWebview", AutoUpdateMCmd);
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_SITE));
+ if (g_plugin.getByte(DISABLE_AUTOUPDATE_KEY, 0))
+ mi.name.w = LPGENW("Auto update disabled");
+ else
+ mi.name.w = LPGENW("Auto update enabled");
+ mi.pszService = "DisableWebview";
+ hMenuItem1 = Menu_AddMainMenuItem(&mi);
+
+ // Update all webview contacts
+ SET_UID(mi, 0xf324ede, 0xfdf, 0x498a, 0x8f, 0x49, 0x6d, 0x2a, 0x9f, 0xda, 0x58, 0x6);
+ CreateServiceFunction("UpdateAll", UpdateAllMenuCommand);
+ mi.position = 500090002;
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_UPDATEALL));
+ mi.name.w = LPGENW("Update all Webview sites");
+ mi.pszService = "UpdateAll";
+ Menu_AddMainMenuItem(&mi);
+
+ // Mark All Webview Sites As Read
+ SET_UID(mi, 0x1fa5fa21, 0x2ee1, 0x4372, 0xae, 0x3e, 0x3b, 0x96, 0xac, 0xd, 0xe8, 0x49);
+ CreateServiceFunction("MarkAllSitesRead", MarkAllReadMenuCommand);
+ mi.position = 500090099;
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_MARKALLREAD));
+ mi.name.w = LPGENW("Mark all Webview sites as read");
+ mi.pszService = "MarkAllSitesRead";
+ Menu_AddMainMenuItem(&mi);
+
+ // open cache directory
+ SET_UID(mi, 0xfed046a8, 0xaae5, 0x4cbe, 0xa8, 0xc, 0x3c, 0x50, 0x3e, 0x3e, 0x9b, 0x15);
+ CreateServiceFunction("OpenCacheFolder", OpenCacheDir);
+ mi.position = 500090099;
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_FOLDER));
+ mi.name.w = LPGENW("Open cache folder");
+ mi.pszService = "OpenCacheFolder";
+ Menu_AddMainMenuItem(&mi);
+
+ // Countdown test
+ SET_UID(mi, 0xbb1a94a9, 0xca63, 0x4966, 0x98, 0x48, 0x8b, 0x3f, 0x9d, 0xac, 0x6a, 0x10);
+ CreateServiceFunction("Countdown", CountdownMenuCommand);
+ mi.flags |= CMIF_KEEPUNTRANSLATED;
+ wchar_t countername[100];
+ mir_snwprintf(countername, TranslateT("%d minutes to update"), g_plugin.getDword(COUNTDOWN_KEY, 0));
+ mi.position = 600090099;
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_UPDATEALL));
+ mi.name.w = countername;
+ mi.pszService = "Countdown";
+ hMenuItemCountdown = Menu_AddMainMenuItem(&mi);
+ }
+
+ // contact menu
+ mi.flags = CMIF_UNICODE;
+
+ SET_UID(mi, 0xadc6a9a4, 0xdf7, 0x4f63, 0x89, 0x11, 0x8e, 0x42, 0x1d, 0xd6, 0x29, 0x31);
+ CreateServiceFunction("Open web page", WebsiteMenuCommand);
+ mi.position = 100;
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_URL));
+ mi.pszService = "Open web page";
+ mi.name.w = LPGENW("Open web page");
+ Menu_AddContactMenuItem(&mi, MODULENAME);
+
+ SET_UID(mi, 0x9d803e61, 0xc929, 0x4c6e, 0x9e, 0x7, 0x93, 0x0, 0xab, 0x14, 0x13, 0x50);
+ CreateServiceFunction("OpenClose Window", DataWndMenuCommand);
+ mi.pszService = "OpenClose Window";
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_SHOW_HIDE));
+ mi.name.w = LPGENW("Open/Close window");
+ Menu_AddContactMenuItem(&mi, MODULENAME);
+
+ SET_UID(mi, 0x3840cc71, 0xcc85, 0x448d, 0xb5, 0xc8, 0x1a, 0x7d, 0xfe, 0xf0, 0x8, 0x85);
+ mi.position = 2222220;
+ mi.pszService = "UpdateData";
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_UPDATE));
+ mi.name.w = LPGENW("Update data");
+ Menu_AddContactMenuItem(&mi, MODULENAME);
+
+ SET_UID(mi, 0xd1ab586c, 0x2c71, 0x429c, 0xb1, 0x79, 0x7b, 0x3a, 0x1d, 0x4a, 0xc1, 0x7d);
+ CreateServiceFunction("ContactOptions", CntOptionsMenuCommand);
+ mi.pszService = "ContactOptions";
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_OPTIONS));
+ mi.name.w = LPGENW("Contact options");
+ Menu_AddContactMenuItem(&mi, MODULENAME);
+
+ SET_UID(mi, 0xe4cda597, 0x9def, 0x4f54, 0x8a, 0xc6, 0x69, 0x3b, 0x5a, 0x7d, 0x77, 0xb6);
+ CreateServiceFunction("ContactAlertOpts", CntAlertMenuCommand);
+ mi.pszService = "ContactAlertOpts";
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_ALERT));
+ mi.name.w = LPGENW("Contact alert options");
+ Menu_AddContactMenuItem(&mi, MODULENAME);
+
+ SET_UID(mi, 0x63fdeed8, 0xf880, 0x423f, 0x95, 0xae, 0x20, 0x8c, 0x86, 0x3c, 0x5, 0xd8);
+ CreateServiceFunction("PingWebsite", PingWebsiteMenuCommand);
+ mi.pszService = "PingWebsite";
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_PING));
+ mi.name.w = LPGENW("Ping web site");
+ Menu_AddContactMenuItem(&mi, MODULENAME);
+
+ SET_UID(mi, 0x28fd36de, 0x6ce1, 0x43d0, 0xa1, 0x6e, 0x98, 0x71, 0x53, 0xe8, 0xc9, 0xf4);
+ CreateServiceFunction("StopDataProcessing", StpPrcssMenuCommand);
+ mi.pszService = "StopDataProcessing";
+ mi.hIcolibItem = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_STOP));
+ mi.name.w = LPGENW("Stop data processing");
+ Menu_AddContactMenuItem(&mi, MODULENAME);
+
+ hWindowList = WindowList_Create();
+
+ HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded);
+ HookEvent(ME_DB_CONTACT_SETTINGCHANGED, DBSettingChanged);
+ HookEvent(ME_DB_CONTACT_DELETED, SiteDeleted);
+ HookEvent(ME_OPT_INITIALISE, OptInitialise);
+
+ g_plugin.setByte(HAS_CRASHED_KEY, 1);
+ return 0;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+int CMPlugin::Unload()
+{
+ ChangeContactStatus(0);
+
+ KillTimer(nullptr, timerId);
+ KillTimer(nullptr, Countdown);
+
+ g_plugin.setByte(HAS_CRASHED_KEY, 0);
+ SavewinSettings();
+ if (hRichEd)
+ FreeLibrary(hRichEd);
+
+ if (hNetlibUser) {
+ Netlib_CloseHandle(hNetlibUser);
+ hNetlibUser = nullptr;
+ }
+
+ if (hHookDisplayDataAlert)
+ DestroyHookableEvent(hHookDisplayDataAlert);
+ if (hHookAlertPopup)
+ DestroyHookableEvent(hHookAlertPopup);
+ if (hHookAlertWPopup)
+ DestroyHookableEvent(hHookAlertWPopup);
+
+ if (h_font != nullptr)
+ DeleteObject(h_font);
+ if (hMenu)
+ DestroyMenu(hMenu);
+ WindowList_Destroy(hWindowList);
+ return 0;
+}
diff --git a/protocols/WebView/src/resource.h b/protocols/WebView/src/resource.h
new file mode 100644
index 0000000000..d0203c7cab
--- /dev/null
+++ b/protocols/WebView/src/resource.h
@@ -0,0 +1,139 @@
+#define UNI 1
+
+#define IDC_STATIC -1
+
+#define IDI_SITE 101
+#define IDI_STICK 102
+#define IDI_UNSTICK 103
+#define IDI_URL 104
+#define IDI_OPTIONS 105
+#define IDI_UPDATE 106
+#define IDI_SHOW_HIDE 107
+#define IDI_FIND 108
+#define IDI_ALERT 110
+#define IDI_FOLDER 111
+#define IDI_UPDATEALL 112
+#define IDI_MARKALLREAD 113
+#define IDI_PING 114
+#define IDI_STOP 115
+
+
+#define IDC_UPDATE_ONSTART 300
+#define IDC_DBLE_WEB 301
+#define IDC_DBLE_WIN 302
+#define IDC_UPDATE_ON_OPEN 303
+#define IDC_UPDATE_ONALERT 304
+
+#define IDD_OPT 443
+#define IDC_DISABLEMENU 446
+#define IDC_OPEN_WEBPAGE 447
+#define IDC_TIME 450
+
+#define IDC_BGCOLOR 451
+#define IDC_TXTCOLOR 452
+#define IDC_RESTART 453
+#define IDC_CLEAN 457
+#define IDC_SUPPRESS 458
+#define IDC_SPIN1 461
+#define IDC_HIDE_STATUS_ICON 464
+#define IDC_RWSPACE 465
+#define IDC_RWSPC_TEXT 466
+#define IDC_TYPEFACE 467
+#define IDC_FONT_BOLD 468
+#define IDC_FONT_ITALIC 469
+#define IDC_FONT_UNDERLINE 470
+#define IDC_FONTSIZE 471
+#define IDC_U_SE_STRINGS 475
+#define IDC_U_ALLSITE 476
+#define IDC_ERROR_POPUP 477
+#define IDC_START_DELAY 480
+#define IDC_SPIN2 481
+#define IDC_STARTDELAYTXT 482
+#define IDC_STDELAYSECTXT 483
+#define IDC_SAVE_INDIVID_POS 484
+#define IDC_ADV_GRP 485
+#define IDC_NO_PROTECT 486
+#define IDC_NOT_RECOMND_TXT 487
+#define IDC_SCRIPT 488
+#define IDC_DATAPOPUP 489
+
+#define IDR_CONTEXT 500
+#define IDM_CUT 501
+#define IDM_PASTE 502
+#define IDM_DELETE 503
+#define IDM_CLEAR_ALL 504
+#define IDM_COPY 505
+#define IDM_COPYALL 506
+#define IDM_SELECTALL 507
+
+#define IDC_SITE_NAME 551
+#define IDC_ERR_CHK 552
+#define IDC_APPEND 554
+#define IDC_FILENAME 555
+#define IDC_BROWSE 556
+#define IDC_SAVE_AS_RAW 557
+//#define IDC_AGENT 557//temp
+
+#define IDD_DISPLAY_DATA 600
+#define IDC_OPEN_URL 601
+#define IDC_DATA 602
+#define IDC_UPDATE_BUTTON 603
+#define IDC_STICK_BUTTON 604
+#define IDC_FIND_BUTTON 605
+#define IDC_STATUSBAR 606
+#define IDC_OPTIONS_BUTTON 607
+#define IDC_ALERT_BUTTON 608
+//#define IDC_HIDDEN_URL 609
+#define IDC_STOP 609
+
+#define IDC_ERRORMSG 620
+
+#define IDD_CONTACT_OPT 700
+#define IDC_END 701
+#define IDC_START 702
+#define IDC_URL 703
+#define IDC_OPT_CANCEL 704
+#define IDC_OPT_APPLY 705
+#define IDC_CPY_STRINGS 706
+
+
+#define IDD_FIND 750
+#define IDC_FINDWHAT 751
+#define IDC_OK 752
+#define IDC_CANCEL 753
+#define IDC_SEARCH_COMPLETE 754
+
+#define IDD_ALRT_OPT 801
+#define IDC_ENABLE_ALERTS 802
+#define IDC_OK2 803
+#define IDC_ALERT_STRING 804
+#define IDC_ALERT_TYPE 807
+#define IDC_EVENT_TYPE 808
+#define IDC_ALERT_CANCEL 809
+#define IDC_ALERT_APPLY 810
+#define IDC_START2 811
+#define IDC_END2 812
+#define IDC_ADD_DATE_NAME 813
+#define IDC_DELAY 814
+#define IDC_PREFIX 815
+#define IDC_SUFFIX 816
+#define IDC_24_HOUR 817
+#define IDC_ALWAYS_LOG 818
+
+#define IDD_POPUP 850
+#define IDC_POP_BGCOLOUR 851
+#define IDC_POP_TEXTCOLOUR 852
+#define IDC_PD1 853
+#define IDC_PD2 854
+//#define IDC_PD3 855
+#define IDC_PREVIEW 856
+#define IDC_POP_USEWINCOLORS 857
+#define IDC_POP_USESAMECOLORS 858
+#define IDC_POP_USECUSTCOLORS 859
+#define IDC_LCLK_WINDOW 860
+#define IDC_LCLK_WEB_PGE 861
+#define IDC_LCLK_DISMISS 862
+#define IDC_RCLK_WINDOW 863
+#define IDC_RCLK_WEB_PGE 864
+#define IDC_RCLK_DISMISS 865
+//#define IDC_PUALERT 866
diff --git a/protocols/WebView/src/stdafx.cxx b/protocols/WebView/src/stdafx.cxx
new file mode 100644
index 0000000000..1b563fc866
--- /dev/null
+++ b/protocols/WebView/src/stdafx.cxx
@@ -0,0 +1,18 @@
+/*
+Copyright (C) 2012-19 Miranda NG team (https://miranda-ng.org)
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation version 2
+of the License.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "stdafx.h" \ No newline at end of file
diff --git a/protocols/WebView/src/stdafx.h b/protocols/WebView/src/stdafx.h
new file mode 100644
index 0000000000..91a1ac63c1
--- /dev/null
+++ b/protocols/WebView/src/stdafx.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <windows.h>
+#include <shlwapi.h>
+#include <Richedit.h>
+#include <Commctrl.h>
+
+#include <ctype.h>
+#include <io.h>
+#include <locale.h>
+#include <process.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <wchar.h>
+
+#include <newpluginapi.h>
+#include <m_system.h>
+#include <m_clist.h>
+#include <m_clist.h>
+#include <m_database.h>
+#include <m_protocols.h>
+#include <m_protosvc.h>
+#include <m_button.h>
+#include <m_utils.h>
+#include <m_skin.h>
+#include <m_genmenu.h>
+#include <m_icolib.h>
+#include <m_options.h>
+#include <m_popup.h>
+#include <m_netlib.h>
+#include <m_langpack.h>
+#include <m_findadd.h>
+
+#include "resource.h"
+#include "version.h"
diff --git a/protocols/WebView/src/version.h b/protocols/WebView/src/version.h
new file mode 100644
index 0000000000..c2030de835
--- /dev/null
+++ b/protocols/WebView/src/version.h
@@ -0,0 +1,13 @@
+#define __MAJOR_VERSION 0
+#define __MINOR_VERSION 1
+#define __RELEASE_NUM 3
+#define __BUILD_NUM 2
+
+#include <stdver.h>
+
+#define __PLUGIN_NAME "Webview"
+#define __FILENAME "Webview.dll"
+#define __DESCRIPTION "Adds web pages as contacts to your contact list and can display text and/or issue change alerts from those pages in a window."
+#define __AUTHOR "Vincent Joyce"
+#define __AUTHORWEB "https://miranda-ng.org/p/WebView/"
+#define __COPYRIGHT "© 2011 Vincent Joyce"
diff --git a/protocols/WebView/src/webview.cpp b/protocols/WebView/src/webview.cpp
new file mode 100644
index 0000000000..87e5baf4a1
--- /dev/null
+++ b/protocols/WebView/src/webview.cpp
@@ -0,0 +1,481 @@
+/*
+* A plugin for Miranda IM which displays web page text in a window Copyright
+* (C) 2005 Vincent Joyce.
+*
+* Miranda IM: the free icq client for MS Windows Copyright (C) 2000-2
+* Richard Hughes, Roland Rabien & Tristan Van de Vreede
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the Free
+* Software Foundation; either version 2 of the License, or (at your option)
+* any later version.
+*
+* This program is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* for more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program; if not, write to the Free Software Foundation, Inc., 59
+* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "stdafx.h"
+#include "webview.h"
+
+char* WndClass = "WEBWnd";
+WNDCLASSEX wincl;
+MSG messages;
+DWORD winheight;
+int StartUpDelay = 0;
+
+int Xposition, Yposition;
+int WindowHeight, WindowWidth;
+COLORREF BackgoundClr, TextClr;
+
+UINT_PTR timerId;
+UINT_PTR Countdown;
+LOGFONT g_lf;
+HFONT h_font;
+HMENU hMenu;
+int bpStatus;
+HGENMENU hMenuItem1;
+HGENMENU hMenuItemCountdown;
+
+/*****************************************************************************/
+void ChangeMenuItem1()
+{
+ // Enable or Disable auto updates
+ LPCTSTR ptszName;
+ if (!g_plugin.getByte(DISABLE_AUTOUPDATE_KEY, 0))
+ ptszName = LPGENW("Auto update enabled");
+ else
+ ptszName = LPGENW("Auto update disabled");
+
+ Menu_ModifyItem(hMenuItem1, ptszName, LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_SITE)));
+}
+
+/*****************************************************************************/
+void ChangeMenuItemCountdown()
+{
+ // countdown
+ HICON hIcon = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_UPDATEALL));
+
+ wchar_t countername[100];
+ mir_snwprintf(countername, TranslateT("%d minutes to update"), g_plugin.getDword(COUNTDOWN_KEY, 0));
+
+ Menu_ModifyItem(hMenuItemCountdown, countername, hIcon, CMIF_KEEPUNTRANSLATED);
+}
+
+/*****************************************************************************/
+static int CALLBACK EnumFontsProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX*, int, LPARAM lParam)
+{
+ if (!IsWindow((HWND)lParam))
+ return FALSE;
+ if (SendMessage((HWND)lParam, CB_FINDSTRINGEXACT, -1, (LPARAM)lpelfe->elfLogFont.lfFaceName) == CB_ERR)
+ SendMessage((HWND)lParam, CB_ADDSTRING, 0, (LPARAM)lpelfe->elfLogFont.lfFaceName);
+ return TRUE;
+}
+
+void FillFontListThread(void *param)
+{
+ HDC hdc = GetDC((HWND)param);
+
+ LOGFONT lf = { 0 };
+ g_lf.lfCharSet = DEFAULT_CHARSET;
+ g_lf.lfFaceName[0] = 0;
+ g_lf.lfPitchAndFamily = 0;
+ EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumFontsProc, (LPARAM)GetDlgItem((HWND)param, IDC_TYPEFACE), 0);
+ ReleaseDC((HWND)param, hdc);
+}
+
+/*****************************************************************************/
+void TxtclrLoop()
+{
+ for (auto &hContact : Contacts(MODULENAME)) {
+ HWND hwndDlg = WindowList_Find(hWindowList, hContact);
+ SetDlgItemText(hwndDlg, IDC_DATA, L"");
+ InvalidateRect(hwndDlg, nullptr, 1);
+ }
+}
+
+/*****************************************************************************/
+void BGclrLoop()
+{
+ for (auto &hContact : Contacts(MODULENAME)) {
+ HWND hwndDlg = (WindowList_Find(hWindowList, hContact));
+ SetDlgItemText(hwndDlg, IDC_DATA, L"");
+ SendDlgItemMessage(hwndDlg, IDC_DATA, EM_SETBKGNDCOLOR, 0, BackgoundClr);
+ InvalidateRect(hwndDlg, nullptr, 1);
+ }
+}
+
+/*****************************************************************************/
+void StartUpdate(void*)
+{
+ StartUpDelay = 1;
+ Sleep(((g_plugin.getDword(START_DELAY_KEY, 0)) * SECOND));
+
+ for (auto &hContact : Contacts(MODULENAME))
+ GetData((void*)hContact);
+
+ StartUpDelay = 0;
+}
+
+/*****************************************************************************/
+void ContactLoop(void*)
+{
+ if (StartUpDelay == 0) {
+ for (auto &hContact : Contacts(MODULENAME)) {
+ GetData((void*)hContact);
+ Sleep(10); // avoid 100% CPU
+ }
+ }
+
+ WAlertPopup(NULL, TranslateT("All Webview sites have been updated."));
+}
+
+/*****************************************************************************/
+INT_PTR MarkAllReadMenuCommand(WPARAM, LPARAM)
+{
+ ChangeContactStatus(1);
+ return 0;
+}
+
+/*****************************************************************************/
+void InitialiseGlobals(void)
+{
+ Xposition = g_plugin.getDword(Xpos_WIN_KEY, 0);
+ Yposition = g_plugin.getDword(Ypos_WIN_KEY, 0);
+
+ if (Yposition == -32000)
+ Yposition = 100;
+
+ if (Xposition == -32000)
+ Xposition = 100;
+
+ BackgoundClr = g_plugin.getDword(BG_COLOR_KEY, Def_color_bg);
+ TextClr = g_plugin.getDword(TXT_COLOR_KEY, Def_color_txt);
+
+ WindowHeight = g_plugin.getDword(WIN_HEIGHT_KEY, Def_win_height);
+ WindowWidth = g_plugin.getDword(WIN_WIDTH_KEY, Def_win_width);
+}
+
+/*****************************************************************************/
+int Doubleclick(WPARAM wParam, LPARAM)
+{
+ MCONTACT hContact = wParam;
+ char *szProto = GetContactProto(hContact);
+ if (mir_strcmp(MODULENAME, szProto))
+ return 0;
+
+ int action = g_plugin.getByte(hContact, DBLE_WIN_KEY, 1);
+ if (action == 0) {
+ ptrW url(g_plugin.getWStringA(hContact, "URL"));
+ Utils_OpenUrlW(url);
+
+ g_plugin.setWord(hContact, "Status", ID_STATUS_ONLINE);
+ }
+ else if (action == 1) {
+ HWND hwndDlg = WindowList_Find(hWindowList, hContact);
+ if (hwndDlg) {
+ SetForegroundWindow(hwndDlg);
+ SetFocus(hwndDlg);
+ }
+ else {
+ hwndDlg = CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_DISPLAY_DATA), nullptr, DlgProcDisplayData, (LPARAM)hContact);
+ HWND hTopmost = g_plugin.getByte(hContact, ON_TOP_KEY, 0) ? HWND_TOPMOST : HWND_NOTOPMOST;
+ SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)((HICON)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_STICK), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0)));
+
+ if (g_plugin.getByte(SAVE_INDIVID_POS_KEY, 0))
+ SetWindowPos(hwndDlg, hTopmost,
+ g_plugin.getDword(hContact, "WVx", 100), // Xposition,
+ g_plugin.getDword(hContact, "WVy", 100), // Yposition,
+ g_plugin.getDword(hContact, "WVwidth", 412), // WindowWidth,
+ g_plugin.getDword(hContact, "WVheight", 350), 0); // WindowHeight,
+ else
+ SetWindowPos(hwndDlg, HWND_TOPMOST, Xposition, Yposition, WindowWidth, WindowHeight, 0);
+ }
+
+ ShowWindow(hwndDlg, SW_SHOW);
+ SetActiveWindow(hwndDlg);
+
+ if (g_plugin.getByte(UPDATE_ON_OPEN_KEY, 0)) {
+ if (g_plugin.getByte(hContact, ENABLE_ALERTS_KEY, 0))
+ mir_forkthread(ReadFromFile, (void*)hContact);
+ else
+ mir_forkthread(GetData, (void*)hContact);
+ g_plugin.setWord(hContact, "Status", ID_STATUS_ONLINE);
+ }
+ }
+
+ return 1;
+}
+
+/*****************************************************************************/
+int SendToRichEdit(HWND hWindow, char *truncated, COLORREF rgbText, COLORREF rgbBack)
+{
+ DBVARIANT dbv;
+ DWORD bold = 0;
+ DWORD italic = 0;
+ DWORD underline = 0;
+
+ SetDlgItemText(hWindow, IDC_DATA, L"");
+
+ CHARFORMAT2 cfFM;
+ memset(&cfFM, 0, sizeof(cfFM));
+ cfFM.cbSize = sizeof(CHARFORMAT2);
+ cfFM.dwMask = CFM_COLOR | CFM_CHARSET | CFM_FACE | ENM_LINK | ENM_MOUSEEVENTS | CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_SIZE;
+
+ if (g_plugin.getByte(FONT_BOLD_KEY, 0))
+ bold = CFE_BOLD;
+
+ if (g_plugin.getByte(FONT_ITALIC_KEY, 0))
+ italic = CFE_ITALIC;
+
+ if (g_plugin.getByte(FONT_UNDERLINE_KEY, 0))
+ underline = CFE_UNDERLINE;
+
+ cfFM.dwEffects = bold | italic | underline;
+
+ if (!g_plugin.getWString(FONT_FACE_KEY, &dbv)) {
+ mir_wstrcpy(cfFM.szFaceName, dbv.pwszVal);
+ db_free(&dbv);
+ }
+ else mir_wstrcpy(cfFM.szFaceName, Def_font_face);
+
+ HDC hDC = GetDC(hWindow);
+ cfFM.yHeight = (BYTE)MulDiv(abs(g_lf.lfHeight), 120, GetDeviceCaps(GetDC(hWindow), LOGPIXELSY)) * (g_plugin.getByte(FONT_SIZE_KEY, 14));
+ ReleaseDC(hWindow, hDC);
+
+ cfFM.bCharSet = g_plugin.getByte(FONT_SCRIPT_KEY, 0);
+ cfFM.bPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
+ cfFM.crTextColor = rgbText;
+ cfFM.crBackColor = rgbBack;
+ SendDlgItemMessage(hWindow, IDC_DATA, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)& cfFM);
+
+ SendDlgItemMessage(hWindow, IDC_DATA, EM_SETSEL, 0, -1);
+ SendDlgItemMessageA(hWindow, IDC_DATA, EM_REPLACESEL, FALSE, (LPARAM)truncated);
+ SendDlgItemMessage(hWindow, IDC_DATA, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cfFM);
+ return 1;
+}
+
+/*****************************************************************************/
+void CALLBACK timerfunc(HWND, UINT, UINT_PTR, DWORD)
+{
+ g_plugin.setByte(HAS_CRASHED_KEY, 0);
+
+ if (!(g_plugin.getByte(OFFLINE_STATUS, 1)))
+ if (!(g_plugin.getByte(DISABLE_AUTOUPDATE_KEY, 0)))
+ mir_forkthread(ContactLoop);
+
+ g_plugin.setDword(COUNTDOWN_KEY, 0);
+}
+
+/*****************************************************************************/
+void CALLBACK Countdownfunc(HWND, UINT, UINT_PTR, DWORD)
+{
+ DWORD timetemp = g_plugin.getDword(COUNTDOWN_KEY, 100);
+ if (timetemp <= 0) {
+ timetemp = g_plugin.getDword(REFRESH_KEY, TIME);
+ g_plugin.setDword(COUNTDOWN_KEY, timetemp);
+ }
+
+ g_plugin.setDword(COUNTDOWN_KEY, timetemp - 1);
+
+ ChangeMenuItemCountdown();
+}
+
+/*****************************************************************************/
+
+int OptInitialise(WPARAM wParam, LPARAM)
+{
+ OPTIONSDIALOGPAGE odp = {};
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT);
+ odp.szGroup.a = LPGEN("Network");
+ odp.szTitle.a = MODULENAME;
+ odp.pfnDlgProc = DlgProcOpt;
+ odp.flags = ODPF_BOLDGROUPS;
+ g_plugin.addOptions(wParam, &odp);
+
+ // if popup service exists
+ if ((ServiceExists(MS_POPUP_ADDPOPUPW))) {
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_POPUP);
+ odp.szGroup.a = LPGEN("Popups");
+ odp.pfnDlgProc = DlgPopUpOpts;
+ g_plugin.addOptions(wParam, &odp);
+ }
+ return 0;
+}
+
+/*****************************************************************************/
+void FontSettings(void)
+{
+ g_lf.lfHeight = 16;
+ g_lf.lfWidth = 0;
+ g_lf.lfEscapement = 0;
+ g_lf.lfOrientation = 0;
+ g_lf.lfWeight = FW_NORMAL;
+ g_lf.lfItalic = FALSE;
+ g_lf.lfUnderline = FALSE;
+ g_lf.lfStrikeOut = 0;
+ g_lf.lfCharSet = ANSI_CHARSET;
+ g_lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
+ g_lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
+ g_lf.lfQuality = DEFAULT_QUALITY;
+ g_lf.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
+ mir_wstrcpy(g_lf.lfFaceName, Def_font_face);
+}
+
+/*****************************************************************************/
+int ModulesLoaded(WPARAM, LPARAM)
+{
+ hHookDisplayDataAlert = CreateHookableEvent(ME_DISPLAYDATA_ALERT);
+ HookEvent(ME_DISPLAYDATA_ALERT, DataWndAlertCommand);
+
+ hHookAlertPopup = CreateHookableEvent(ME_POPUP_ALERT);
+ HookEvent(ME_POPUP_ALERT, PopupAlert);
+
+ hHookErrorPopup = CreateHookableEvent(ME_POPUP_ERROR);
+ HookEvent(ME_POPUP_ERROR, ErrorMsgs);
+
+ hHookAlertOSD = CreateHookableEvent(ME_OSD_ALERT);
+ HookEvent(ME_OSD_ALERT, OSDAlert);
+
+ FontSettings();
+ h_font = CreateFontIndirect(&g_lf);
+
+ // get data on startup
+ if (g_plugin.getByte(UPDATE_ONSTART_KEY, 0))
+ mir_forkthread(StartUpdate);
+
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR DataWndMenuCommand(WPARAM wParam, LPARAM)
+{
+ MCONTACT hContact = wParam;
+ HWND hwndDlg = WindowList_Find(hWindowList, hContact);
+ if (hwndDlg != nullptr) {
+ DestroyWindow(hwndDlg);
+ return 0;
+ }
+
+ HWND hTopmost = g_plugin.getByte(hContact, ON_TOP_KEY, 0) ? HWND_TOPMOST : HWND_NOTOPMOST;
+ hwndDlg = CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_DISPLAY_DATA), nullptr, DlgProcDisplayData, (LPARAM)hContact);
+ SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_STICK), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
+ if (g_plugin.getByte(SAVE_INDIVID_POS_KEY, 0))
+ SetWindowPos(hwndDlg, hTopmost,
+ g_plugin.getDword(hContact, "WVx", 100), // Xposition,
+ g_plugin.getDword(hContact, "WVy", 100), // Yposition,
+ g_plugin.getDword(hContact, "WVwidth", 100), // WindowWidth,
+ g_plugin.getDword(hContact, "WVheight", 100), 0); // WindowHeight,
+ else
+ SetWindowPos(hwndDlg, HWND_TOPMOST, Xposition, Yposition, WindowWidth, WindowHeight, 0);
+
+ ShowWindow(hwndDlg, SW_SHOW);
+ SetActiveWindow(hwndDlg);
+
+ if (g_plugin.getByte(UPDATE_ON_OPEN_KEY, 0)) {
+ if (g_plugin.getByte(hContact, ENABLE_ALERTS_KEY, 0))
+ mir_forkthread(ReadFromFile, (void*)hContact);
+ else
+ mir_forkthread(GetData, (void*)hContact);
+ g_plugin.setWord(hContact, "Status", ID_STATUS_ONLINE);
+ }
+
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR UpdateAllMenuCommand(WPARAM, LPARAM)
+{
+ mir_forkthread(ContactLoop);
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR AutoUpdateMCmd(WPARAM, LPARAM)
+{
+ if (g_plugin.getByte(DISABLE_AUTOUPDATE_KEY, 0))
+ g_plugin.setByte(DISABLE_AUTOUPDATE_KEY, 0);
+ else
+ g_plugin.setByte(DISABLE_AUTOUPDATE_KEY, 1);
+
+ ChangeMenuItem1();
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR AddContactMenuCommand(WPARAM, LPARAM)
+{
+ db_set_s(0, "FindAdd", "LastSearched", MODULENAME);
+ CallService(MS_FINDADD_FINDADD, 0, 0);
+ return 0;
+}
+
+/*****************************************************************************/
+int OnTopMenuCommand(WPARAM, LPARAM, MCONTACT singlecontact)
+{
+ int ontop = 0;
+ int done = 0;
+
+ if (((g_plugin.getByte(singlecontact, ON_TOP_KEY))) && done == 0) {
+ g_plugin.setByte(singlecontact, ON_TOP_KEY, 0);
+ ontop = 0;
+ done = 1;
+ }
+ if ((!(g_plugin.getByte(singlecontact, ON_TOP_KEY, 0))) && done == 0) {
+ g_plugin.setByte(singlecontact, ON_TOP_KEY, 1);
+ ontop = 1;
+ done = 1;
+ }
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR WebsiteMenuCommand(WPARAM wParam, LPARAM)
+{
+ MCONTACT hContact = wParam;
+ ptrW url(g_plugin.getWStringA(hContact, "URL"));
+ if (url)
+ Utils_OpenUrlW(url);
+
+ g_plugin.setWord(hContact, "Status", ID_STATUS_ONLINE);
+ return 0;
+}
+
+/*****************************************************************************/
+int UpdateMenuCommand(WPARAM, LPARAM, MCONTACT singlecontact)
+{
+ mir_forkthread(GetData, (void*)singlecontact);
+ return 0;
+}
+
+/*****************************************************************************/
+int ContactMenuItemUpdateData(WPARAM wParam, LPARAM lParam)
+{
+ UpdateMenuCommand(wParam, lParam, wParam);
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR CntOptionsMenuCommand(WPARAM wParam, LPARAM)
+{
+ DialogBoxParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_CONTACT_OPT), nullptr, DlgProcContactOpt, wParam);
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR CntAlertMenuCommand(WPARAM wParam, LPARAM)
+{
+ DialogBoxParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_ALRT_OPT), nullptr, DlgProcAlertOpt, wParam);
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR CountdownMenuCommand(WPARAM, LPARAM)
+{
+ return 0;
+}
diff --git a/protocols/WebView/src/webview.h b/protocols/WebView/src/webview.h
new file mode 100644
index 0000000000..e7bdd6c57b
--- /dev/null
+++ b/protocols/WebView/src/webview.h
@@ -0,0 +1,254 @@
+/*
+ * A plugin for Miranda IM which displays web page text in a window Copyright
+ * (C) 2005 Vincent Joyce.
+ *
+ * Miranda IM: the free icq client for MS Windows Copyright (C) 2000-2
+ * Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc., 59
+ * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#pragma once
+
+#define CFM_BACKCOLOR 0x04000000
+
+#define MODULENAME "WebView"
+
+#define MENU_OFF "DisableMenu"
+#define REFRESH_KEY "Refresh interval"
+#define ON_TOP_KEY "Always on top"
+#define OFFLINE_STATUS "OfflineOnBoot"
+#define URL_KEY "URL"
+#define START_STRING_KEY "Start_string"
+#define END_STRING_KEY "End_String"
+#define DBLE_WIN_KEY "Doub_click_win"
+#define HIDE_STATUS_ICON_KEY "Hide_Status_Icon"
+#define HAS_CRASHED_KEY "Has_Crashed"
+#define U_ALLSITE_KEY "UseAllTheWebsite"
+#define MENU_IS_DISABLED_KEY "MainMenuReallyDisabled"
+#define UPDATE_ONALERT_KEY "WND_UPDATE_OALERY_ONLY"
+#define DISABLE_AUTOUPDATE_KEY "Disable_Auto_Update"
+#define RWSPACE_KEY "level_of_wspace_removal"
+#define PRESERVE_NAME_KEY "PreserveName"
+#define CLEAR_DISPLAY_KEY "Remove_tags_whitespace"
+#define ALRT_S_STRING_KEY "ALRT_S_STRING"
+#define ALRT_E_STRING_KEY "ALRT_E_STRING"
+#define ALRT_INDEX_KEY "AlertIndex"
+#define EVNT_INDEX_KEY "EventIndex"
+#define START_DELAY_KEY "StartUpDelay"
+#define ALWAYS_LOG_KEY "AlwaysLogToFile"
+#define SAVE_INDIVID_POS_KEY "SaveIndividWinPos"
+#define NO_PROTECT_KEY "NoDownloadProtection"
+#define SAVE_AS_RAW_KEY "SaveAsRaw"
+#define FONT_SCRIPT_KEY "FontScript"
+#define STOP_KEY "StopProcessing"
+#define DATA_POPUP_KEY "DisplayDataPopup"
+#define COUNTDOWN_KEY "Countdown"
+
+#define MINUTE 60000
+#define SECOND 1000
+
+#define MS_UPDATE_ALL "Webview/UpdateAll"
+#define MS_ADD_SITE "Webview/AddSite"
+#define MS_AUTO_UPDATE "Webview/AutoUpdate"
+
+#define CACHE_FILE_KEY "Filename"
+
+#define Xpos_WIN_KEY "win_Xpos"
+#define Ypos_WIN_KEY "win_Ypos"
+#define BG_COLOR_KEY "BgColor"
+#define TXT_COLOR_KEY "TxtColor"
+#define WIN_HEIGHT_KEY "Height"
+#define SUPPRESS_ERR_KEY "Suppress error messages"
+#define WIN_WIDTH_KEY "Width"
+#define FILE_KEY "Filename"
+#define APPEND_KEY "Append"
+#define UPDATE_ONSTART_KEY "update_onboot"
+#define UPDATE_ON_OPEN_KEY "update_on_Window_open"
+#define FONT_FACE_KEY "FontFace"
+#define FONT_BOLD_KEY "FontBold"
+#define FONT_ITALIC_KEY "FontItalic"
+#define FONT_UNDERLINE_KEY "FontUnderline"
+#define FONT_SIZE_KEY "FontSize"
+#define ERROR_POPUP_KEY "UsePopupPlugin"
+#define ENABLE_ALERTS_KEY "EnableAlerts"
+#define ALERT_STRING_KEY "ALERTSTRING"
+#define ALERT_TYPE_KEY "Alert_Type"
+#define APND_DATE_NAME_KEY "AppendDateContact"
+#define POP_DELAY_KEY "PopUpDelay"
+#define POP_BG_CLR_KEY "PopBGClr"
+#define POP_TXT_CLR_KEY "PopTxtClr"
+#define POP_USEWINCLRS_KEY "PopUseWinClrs"
+#define CONTACT_PREFIX_KEY "PrefixDateContact"
+#define USE_24_HOUR_KEY "Use24hourformat"
+#define POP_USESAMECLRS_KEY "PopUseSameClrs"
+#define POP_USECUSTCLRS_KEY "PopUseCustomClrs"
+#define LCLK_WINDOW_KEY "LeftClkWindow"
+#define LCLK_WEB_PGE_KEY "LeftClkWebPage"
+#define LCLK_DISMISS_KEY "LeftClkDismiss"
+#define RCLK_WINDOW_KEY "RightClkWindow"
+#define RCLK_WEB_PGE_KEY "RightClkWebPage"
+#define RCLK_DISMISS_KEY "RightClkDismiss"
+
+#define TIME 60
+#define Def_color_bg 0x00ffffff
+#define Def_color_txt 0x00000000
+#define Def_font_face L"Courier"
+#define Def_font_size 14
+#define HK_SHOWHIDE 3001
+
+#define MAXSIZE1 250000
+#define MAXSIZE2 500000
+#define MAXSIZE3 1000000
+
+#define Def_win_height 152
+#define Def_win_width 250
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// lets get rid of some warnings
+
+void CodetoSymbol(char *truncated);
+void GetData(void *param);
+void FillFontListThread(void *);
+
+INT_PTR CALLBACK DlgProcDisplayData(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+INT_PTR CALLBACK DlgProcAlertOpt(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+INT_PTR CALLBACK DlgProcOpt(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+int DataWndAlertCommand(WPARAM wParam, LPARAM lParam);
+int PopupAlert(WPARAM wParam, LPARAM lParam);
+int ErrorMsgs(WPARAM wParam, LPARAM lParam);
+int OSDAlert(WPARAM wParam, LPARAM lParam);
+
+void ReadFromFile(void *hContact);
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// some globals for window settings
+
+extern int Xposition, Yposition, WindowHeight, WindowWidth;
+extern COLORREF BackgoundClr, TextClr;
+extern UINT_PTR timerId, Countdown;
+extern LOGFONT g_lf;
+extern HFONT h_font;
+extern HMENU hMenu;
+extern int bpStatus;
+extern HNETLIBUSER hNetlibUser;
+extern MWindowList hWindowList;
+extern HGENMENU hMenuItem1, hMenuItemCountdown;
+extern char optionsname[80];
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// lets get rid of some warnings
+
+void CALLBACK timerfunc(HWND, UINT, UINT_PTR, DWORD);
+void CALLBACK Countdownfunc(HWND, UINT, UINT_PTR, DWORD);
+void SavewinSettings(void);
+void ValidatePosition(HWND hwndDlg);
+int ModulesLoaded(WPARAM wParam, LPARAM lParam);
+wchar_t* FixButtonText(wchar_t *url, size_t len);
+int ContactMenuItemUpdateData (WPARAM wParam, LPARAM lParam);
+
+int Doubleclick(WPARAM wParam, LPARAM lParam);
+int DBSettingChanged(WPARAM wParam, LPARAM lParam);
+
+int SendToRichEdit(HWND hWindow, char *truncated, COLORREF rgbText, COLORREF rgbBack);
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Services
+
+INT_PTR GetCaps(WPARAM wParam, LPARAM lParam);
+INT_PTR GetName(WPARAM wParam, LPARAM lParam);
+INT_PTR BPLoadIcon(WPARAM wParam, LPARAM lParam); // BPLoadIcon
+
+INT_PTR SetStatus(WPARAM wParam, LPARAM lParam);
+INT_PTR GetStatus(WPARAM wParam, LPARAM lParam);
+
+INT_PTR BasicSearch(WPARAM wParam, LPARAM lParam);
+INT_PTR AddToList(WPARAM wParam, LPARAM lParam);
+INT_PTR GetInfo(WPARAM wParam, LPARAM lParam);
+
+INT_PTR OpenCacheDir(WPARAM wParam, LPARAM lParam);
+
+INT_PTR UpdateAllMenuCommand(WPARAM wParam, LPARAM lParam);
+INT_PTR CountdownMenuCommand(WPARAM wParam, LPARAM lParam);
+INT_PTR MarkAllReadMenuCommand(WPARAM wParam, LPARAM lParam);
+INT_PTR WebsiteMenuCommand(WPARAM wParam, LPARAM lParam);
+INT_PTR AddContactMenuCommand(WPARAM wParam, LPARAM lParam);
+INT_PTR CntOptionsMenuCommand(WPARAM wParam, LPARAM lParam);
+INT_PTR CntAlertMenuCommand(WPARAM wParam, LPARAM lParam);
+INT_PTR DataWndMenuCommand(WPARAM wParam, LPARAM lParam);
+INT_PTR PingWebsiteMenuCommand(WPARAM wParam, LPARAM lParam);
+INT_PTR StpPrcssMenuCommand(WPARAM wParam, LPARAM lParam);
+
+int UpdateMenuCommand(WPARAM wParam, LPARAM lParam, MCONTACT singlecontact);
+int OnTopMenuCommand(WPARAM wParam, LPARAM lParam, MCONTACT singlecontact);
+
+/////////////////////////////////////////////////////////////////////////////////////////
+void ChangeContactStatus(int con_stat);
+void InitialiseGlobals(void);
+void FontSettings(void);
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void Removewhitespace(char *truncated);
+void RemoveInvis(char *truncated, int AmountWspcRem);
+void RemoveTabs(char *truncated);
+void FastTagFilter(char *truncated);
+void EraseBlock(char *truncated);
+void EraseSymbols(char *truncated);
+int ProcessAlerts(MCONTACT hContact, char *truncated, char *tstr, char *contactname, int notpresent);
+
+INT_PTR CALLBACK DlgPopUpOpts(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam);
+INT_PTR CALLBACK DlgProcFind(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+int DataDialogResize(HWND hwndDlg, LPARAM lParam, UTILRESIZECONTROL * urc);
+int OptInitialise(WPARAM, LPARAM);
+
+void Filter(char *truncated);
+void TxtclrLoop();
+void BGclrLoop();
+void ContactLoop(void *dummy);
+void NumSymbols(char *truncated);
+
+INT_PTR AutoUpdateMCmd(WPARAM wParam, LPARAM lParam);
+INT_PTR CALLBACK DlgProcContactOpt(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+int SiteDeleted(WPARAM wParam, LPARAM lParam);
+
+int WErrorPopup(MCONTACT hContact, wchar_t *textdisplay);
+int WAlertPopup(MCONTACT hContact, wchar_t *displaytext);
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// wrappers
+
+extern HANDLE hHookDisplayDataAlert;
+#define ME_DISPLAYDATA_ALERT "Miranda/ALERT/DISPLAYDATA"
+
+extern HANDLE hHookAlertPopup;
+#define ME_POPUP_ALERT "Miranda/ALERT/POPUP"
+
+extern HANDLE hHookErrorPopup;
+#define ME_POPUP_ERROR "Miranda/ERROR/POPUP"
+
+extern HANDLE hHookAlertOSD;
+#define ME_OSD_ALERT "Miranda/ALERT/OSD"
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+struct CMPlugin : public PLUGIN<CMPlugin>
+{
+ CMPlugin();
+
+ int Load() override;
+ int Unload() override;
+};
diff --git a/protocols/WebView/src/webview_alerts.cpp b/protocols/WebView/src/webview_alerts.cpp
new file mode 100644
index 0000000000..1b068f099e
--- /dev/null
+++ b/protocols/WebView/src/webview_alerts.cpp
@@ -0,0 +1,839 @@
+/*
+* A plugin for Miranda IM which displays web page text in a window Copyright
+* (C) 2005 Vincent Joyce.
+*
+* Miranda IM: the free icq client for MS Windows Copyright (C) 2000-2
+* Richard Hughes, Roland Rabien & Tristan Van de Vreede
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the Free
+* Software Foundation; either version 2 of the License, or (at your option)
+* any later version.
+*
+* This program is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* for more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program; if not, write to the Free Software Foundation, Inc., 59
+* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "stdafx.h"
+#include "webview.h"
+
+/*****************************************************************************/
+int CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message) {
+ case WM_COMMAND:
+ case WM_CONTEXTMENU:
+ MCONTACT hContact = PUGetContact(hWnd);
+ ptrW url(g_plugin.getWStringA(hContact, URL_KEY));
+
+ if (message == WM_COMMAND) { // left click
+ if (hContact != NULL) {
+ // open data window
+ if (g_plugin.getByte(LCLK_WINDOW_KEY, 0)) {
+ NotifyEventHooks(hHookDisplayDataAlert, (int)hContact, 0);
+ mir_forkthread(GetData, (void*)hContact);
+ PUDeletePopup(hWnd);
+ }
+ // open url
+ if (g_plugin.getByte(LCLK_WEB_PGE_KEY, 0)) {
+ Utils_OpenUrlW(url);
+ PUDeletePopup(hWnd);
+ g_plugin.setWord(wParam, "Status", ID_STATUS_ONLINE);
+ }
+ // dismiss
+ if (g_plugin.getByte(LCLK_DISMISS_KEY, 1))
+ PUDeletePopup(hWnd);
+ }
+ else if (hContact == NULL)
+ PUDeletePopup(hWnd);
+ }
+ else if (message == WM_CONTEXTMENU) { // right click
+ if (hContact != NULL) {
+ // open datA window
+ if (g_plugin.getByte(RCLK_WINDOW_KEY, 0)) {
+ NotifyEventHooks(hHookDisplayDataAlert, (int)hContact, 0);
+ mir_forkthread(GetData, (void*)hContact);
+ PUDeletePopup(hWnd);
+ }
+ // open url
+ if (g_plugin.getByte(RCLK_WEB_PGE_KEY, 1)) {
+ Utils_OpenUrlW(url);
+ PUDeletePopup(hWnd);
+ g_plugin.setWord(wParam, "Status", ID_STATUS_ONLINE);
+ }
+ // dismiss
+ if (g_plugin.getByte(RCLK_DISMISS_KEY, 0))
+ PUDeletePopup(hWnd);
+ }
+ else if (hContact == NULL)
+ PUDeletePopup(hWnd);
+ }
+ break;
+ }
+
+ return DefWindowProc(hWnd, message, wParam, lParam);
+}
+
+/*****************************************************************************/
+int WDisplayDataAlert(MCONTACT hContact)
+{
+ NotifyEventHooks(hHookDisplayDataAlert, hContact, 0);
+ return 0;
+}
+
+/*****************************************************************************/
+int WAlertPopup(MCONTACT hContact, wchar_t *displaytext)
+{
+ NotifyEventHooks(hHookAlertPopup, hContact, (LPARAM)displaytext);
+ return 0;
+}
+
+/*****************************************************************************/
+int WErrorPopup(MCONTACT hContact, wchar_t *textdisplay)
+{
+ NotifyEventHooks(hHookErrorPopup, hContact, (LPARAM)textdisplay);
+ return 0;
+}
+
+/*****************************************************************************/
+int WAlertOSD(MCONTACT hContact, wchar_t *displaytext)
+{
+ NotifyEventHooks(hHookAlertOSD, hContact, (LPARAM)displaytext);
+ return 0;
+}
+
+/*****************************************************************************/
+int PopupAlert(WPARAM hContact, LPARAM lParam)
+{
+ POPUPDATAW ppd = { 0 };
+
+ if (hContact != 0)
+ mir_wstrncpy(ppd.lpwzContactName, ptrW(g_plugin.getWStringA(hContact, PRESERVE_NAME_KEY)), _countof(ppd.lpwzContactName));
+ else
+ mir_wstrcpy(ppd.lpwzContactName, _A2W(MODULENAME));
+
+ ppd.lchContact = hContact;
+ ppd.lchIcon = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_SITE));
+
+ wchar_t *displaytext = (wchar_t*)lParam;
+ if ((mir_wstrlen(displaytext) == MAX_SECONDLINE) || (mir_wstrlen(displaytext) > MAX_SECONDLINE))
+ mir_snwprintf(ppd.lpwzText, displaytext);
+ else if (mir_wstrlen(displaytext) < MAX_SECONDLINE)
+ mir_snwprintf(ppd.lpwzText, displaytext);
+
+ if (g_plugin.getByte(POP_USECUSTCLRS_KEY, 0)) {
+ ppd.colorBack = g_plugin.getDword(POP_BG_CLR_KEY, Def_color_bg);
+ ppd.colorText = g_plugin.getDword(POP_TXT_CLR_KEY, Def_color_txt);
+ }
+ else if (g_plugin.getByte(POP_USEWINCLRS_KEY, 0)) {
+ ppd.colorBack = GetSysColor(COLOR_BTNFACE);
+ ppd.colorText = GetSysColor(COLOR_WINDOWTEXT);
+ }
+ else if (g_plugin.getByte(POP_USESAMECLRS_KEY, 1)) {
+ ppd.colorBack = BackgoundClr;
+ ppd.colorText = TextClr;
+ }
+
+ ppd.PluginWindowProc = nullptr;
+ ppd.iSeconds = g_plugin.getDword(POP_DELAY_KEY, 0);
+
+ if (ServiceExists(MS_POPUP_ADDPOPUPW))
+ CallService(MS_POPUP_ADDPOPUPW, (WPARAM)&ppd, 0);
+
+ return 0;
+}
+
+/*****************************************************************************/
+int OSDAlert(WPARAM hContact, LPARAM lParam)
+{
+ char contactname[255], newdisplaytext[2000];
+ contactname[0] = 0;
+
+ if (hContact != NULL) {
+ DBVARIANT dbv;
+ if (!g_plugin.getString(hContact, PRESERVE_NAME_KEY, &dbv)) {
+ strncpy_s(contactname, _countof(contactname), dbv.pszVal, _TRUNCATE);
+ db_free(&dbv);
+ }
+ }
+ if (contactname[0] == 0)
+ strncpy_s(contactname, _countof(contactname), MODULENAME, _TRUNCATE);
+
+ char *displaytext = (char*)lParam;
+ mir_snprintf(newdisplaytext, "%s: %s", contactname, Translate(displaytext));
+
+ if (ServiceExists("OSD/Announce"))
+ CallService("OSD/Announce", (WPARAM)newdisplaytext, 0);
+
+ return 0;
+}
+
+/*****************************************************************************/
+int ErrorMsgs(WPARAM wParam, LPARAM lParam)
+{
+ MCONTACT hContact = wParam;
+ wchar_t newdisplaytext[2000], *displaytext = (wchar_t*)lParam;
+
+ if (g_plugin.getByte(SUPPRESS_ERR_KEY, 0))
+ return 0;
+
+ wchar_t *ptszContactName = Clist_GetContactDisplayName(hContact);
+ if (ServiceExists(MS_POPUP_ADDPOPUPW) && g_plugin.getByte(ERROR_POPUP_KEY, 0)) {
+ mir_snwprintf(newdisplaytext, L"%s\n%s", ptszContactName, displaytext);
+ PUShowMessageW(newdisplaytext, SM_WARNING);
+ }
+ else if (ServiceExists("OSD/Announce") && g_plugin.getByte(ERROR_POPUP_KEY, 0)) {
+ mir_snwprintf(newdisplaytext, L"%s: %s", ptszContactName, TranslateW(displaytext));
+ CallService("OSD/Announce", (WPARAM)newdisplaytext, 0);
+ }
+
+ Clist_TrayNotifyW(nullptr, ptszContactName, TranslateW(displaytext), NIIF_ERROR, 15000);
+ return 0;
+}
+
+/*****************************************************************************/
+void SaveToFile(MCONTACT hContact, char *truncated)
+{
+ char *mode;
+ if (!g_plugin.getByte(hContact, APPEND_KEY, 0))
+ mode = "w";
+ else
+ mode = "a";
+
+ char url[300]; url[0] = '\0';
+ DBVARIANT dbv;
+ if (!g_plugin.getString(hContact, URL_KEY, &dbv)) {
+ strncpy_s(url, _countof(url), dbv.pszVal, _TRUNCATE);
+ db_free(&dbv);
+ }
+
+ if (g_plugin.getString(hContact, FILE_KEY, &dbv))
+ return;
+
+ FILE *pfile = fopen(dbv.pszVal, mode);
+ if (pfile == nullptr)
+ WErrorPopup(hContact, TranslateT("Cannot write to file"));
+ else {
+ char timestring[128], timeprefix[32];
+ char temptime1[32], temptime2[32];
+
+ time_t ftime = time(0);
+ struct tm *nTime = localtime(&ftime);
+
+ mir_snprintf(timeprefix, " %s ", Translate("Last updated on"));
+ strftime(temptime1, 32, " %a, %b %d, %Y ", nTime);
+ strftime(temptime2, 32, " %I:%M %p.", nTime);
+ mir_snprintf(timestring, "(%s)%s\n%s,%s\n", MODULENAME, url, temptime1, temptime2);
+
+ fputs(timestring, pfile);
+ fwrite(truncated, mir_strlen(truncated), 1, pfile);
+ fputs("\n\n", pfile);
+ fclose(pfile);
+ }
+
+ db_free(&dbv);
+}
+
+/*****************************************************************************/
+int ProcessAlerts(MCONTACT hContact, char *truncated, char *tstr, char *contactname, int notpresent)
+{
+ char alertstring[255];
+ wchar_t displaystring[300];
+ FILE *pcachefile;
+ DBVARIANT tdbv;
+ int wasAlert = 0;
+
+ int statalertpos = 0, disalertpos = 0, statalertposend = 0;
+ char*alertpos;
+ char Alerttempstring[300], Alerttempstring2[300];
+ static char cachecompare[MAXSIZE1];
+ static char raw[MAXSIZE1];
+
+ int alertIndex = 0, eventIndex = 0;
+
+ char tempraw[MAXSIZE1];
+ memset(&tempraw, 0, sizeof(tempraw));
+ memset(&raw, 0, sizeof(raw));
+
+ strncpy(tempraw, truncated, _countof(tempraw));
+
+ memset(&alertstring, 0, sizeof(alertstring));
+ memset(&Alerttempstring, 0, sizeof(Alerttempstring));
+ memset(&Alerttempstring2, 0, sizeof(Alerttempstring2));
+ memset(&cachecompare, 0, sizeof(cachecompare));
+
+ // alerts
+ if (g_plugin.getByte(hContact, ENABLE_ALERTS_KEY, 0)) { // ALERTS
+ alertIndex = g_plugin.getByte(hContact, ALRT_INDEX_KEY, 0);
+ eventIndex = g_plugin.getByte(hContact, EVNT_INDEX_KEY, 0);
+ if (notpresent) {
+ if (alertIndex == 0) { // Popup
+ Sleep(1000);
+ WAlertPopup(hContact, TranslateT("Start/end strings not found or strings not set."));
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ else if (alertIndex == 1) { // log to file
+ if (!g_plugin.getString(hContact, FILE_KEY, &tdbv)) {
+ int AmountWspcRem = 0;
+
+ if (!g_plugin.getByte(hContact, SAVE_AS_RAW_KEY, 0)) {
+ CodetoSymbol(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseBlock(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ FastTagFilter(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ NumSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ AmountWspcRem = g_plugin.getByte(hContact, RWSPACE_KEY, 0);
+ RemoveInvis(tempraw, AmountWspcRem);
+ Sleep(100); // avoid 100% CPU
+
+ Removewhitespace(tempraw);
+ }
+
+ SaveToFile(hContact, tempraw);
+ db_free(&tdbv);
+
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ }
+ else if (alertIndex == 3) {
+ WAlertOSD(hContact, TranslateT("Alert start/end strings not found or strings not set."));
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ else if (eventIndex == 2) {
+ WDisplayDataAlert(hContact);
+
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+
+ HWND hwndDlg = (WindowList_Find(hWindowList, hContact));
+
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Start/end strings not found or strings not set."));
+ }
+ else MessageBox(nullptr, TranslateT("Start/end strings not found or strings not set."), _A2W(MODULENAME), MB_OK);
+ }
+
+ if (eventIndex == 0) { // string present
+ if (!g_plugin.getString(hContact, ALERT_STRING_KEY, &tdbv)) {
+ strncpy_s(alertstring, _countof(alertstring), tdbv.pszVal, _TRUNCATE);
+ db_free(&tdbv);
+
+ if ((strstr(tempraw, alertstring)) != nullptr) { // // ENDALERT EVENT:CHECK FOR STRING
+ // there was an alert
+ wasAlert = 1;
+
+ // play sound?
+ Skin_PlaySound("webviewalert");
+ //
+ if ((!notpresent)) {
+ if (alertIndex == 0) { // popup
+ mir_snwprintf(displaystring, L"%s \"%S\" %s.", Translate("The string"), alertstring, Translate("has been found on the web page"));
+ WAlertPopup(hContact, displaystring);
+
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ } //
+ else if (alertIndex == 1) {
+ if (!g_plugin.getString(hContact, FILE_KEY, &tdbv)) {
+ int AmountWspcRem = 0;
+ if (!g_plugin.getByte(hContact, SAVE_AS_RAW_KEY, 0)) {
+ CodetoSymbol(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseBlock(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ FastTagFilter(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ NumSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ AmountWspcRem = g_plugin.getByte(hContact, RWSPACE_KEY, 0);
+ RemoveInvis(tempraw, AmountWspcRem);
+ Sleep(100); // avoid 100% CPU
+
+ Removewhitespace(tempraw);
+ }
+ SaveToFile(hContact, tempraw);
+ db_free(&tdbv);
+
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ }
+ else if (alertIndex == 3) {
+ mir_snwprintf(displaystring, L"%s \"%s\" %s.", TranslateT("The string"), alertstring, TranslateT("has been found on the web page"));
+ WAlertOSD(hContact, displaystring);
+
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ else if (alertIndex == 2) {
+ WDisplayDataAlert(hContact);
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+
+ HWND hwndDlg = WindowList_Find(hWindowList, hContact);
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Download successful; about to process data..."));
+ }
+ else MessageBox(nullptr, TranslateT("Unknown alert type."), _A2W(MODULENAME), MB_OK);
+ }
+ }
+ }
+ }
+ else if (eventIndex == 1) { // webpage changed
+ // TEST GET NAME FOR CACHE
+ wchar_t cachepath[MAX_PATH], cachedirectorypath[MAX_PATH], newcachepath[MAX_PATH + 50];
+ GetModuleFileName(g_plugin.getInst(), cachepath, _countof(cachepath));
+ wchar_t *cacheend = wcsrchr(cachepath, '\\');
+ cacheend++;
+ *cacheend = '\0';
+
+ mir_snwprintf(cachedirectorypath, L"%s%S%S", cachepath, MODULENAME, "cache\\");
+ CreateDirectory(cachedirectorypath, nullptr);
+ mir_snwprintf(newcachepath, L"%s%S%S%S%S", cachepath, MODULENAME, "cache\\", contactname, ".txt");
+ // file exists?
+ if (_waccess(newcachepath, 0) != -1) {
+ if ((pcachefile = _wfopen(newcachepath, L"r")) == nullptr)
+ WErrorPopup((UINT_PTR)contactname, TranslateT("Cannot read from file"));
+ else {
+ memset(&cachecompare, 0, sizeof(cachecompare));
+ fread(cachecompare, sizeof(cachecompare), 1, pcachefile);
+ fclose(pcachefile);
+ }
+ }
+ // write to cache
+ if ((pcachefile = _wfopen(newcachepath, L"w")) == nullptr)
+ WErrorPopup((UINT_PTR)contactname, TranslateT("Cannot write to file 1"));
+ else {
+ fwrite(tempraw, mir_strlen(tempraw), 1, pcachefile); //smaller cache
+ fclose(pcachefile);
+ g_plugin.setWString(hContact, CACHE_FILE_KEY, newcachepath);
+ }
+ // end write to cache
+
+ if (strncmp(tempraw, cachecompare, mir_strlen(tempraw)) != 0) { //lets try this instead
+ // play sound?
+ Skin_PlaySound("webviewalert");
+ // there was an alert
+ wasAlert = 1;
+
+ if (!notpresent) {
+ if (alertIndex == 0) { // popup
+ WAlertPopup(hContact, TranslateT("The web page has changed."));
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ else if (alertIndex == 3) { // osd
+ WAlertOSD(hContact, TranslateT("The web page has changed."));
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ else if (alertIndex == 1) { // log
+ if (!g_plugin.getString(hContact, FILE_KEY, &tdbv)) {
+ int AmountWspcRem = 0;
+
+ if (!g_plugin.getByte(hContact, SAVE_AS_RAW_KEY, 0)) {
+ CodetoSymbol(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseBlock(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ FastTagFilter(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ NumSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ AmountWspcRem = g_plugin.getByte(hContact, RWSPACE_KEY, 0);
+ RemoveInvis(tempraw, AmountWspcRem);
+ Sleep(100); // avoid 100% CPU
+
+ Removewhitespace(tempraw);
+ }
+
+ SaveToFile(hContact, tempraw);
+ db_free(&tdbv);
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ }
+ else if (alertIndex == 2) { // window
+ WDisplayDataAlert(hContact);
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ else MessageBox(nullptr, TranslateT("Unknown alert type."), _A2W(MODULENAME), MB_OK);
+ }
+ }
+ }
+
+ if (eventIndex == 2) { // part of webpage changed
+ Alerttempstring[0] = Alerttempstring2[0] = 0;
+ if (!g_plugin.getString(hContact, ALRT_S_STRING_KEY, &tdbv)) {
+ strncpy_s(Alerttempstring, _countof(Alerttempstring), tdbv.pszVal, _TRUNCATE);
+ db_free(&tdbv);
+ }
+ if (!g_plugin.getString(hContact, ALRT_E_STRING_KEY, &tdbv)) {
+ strncpy_s(Alerttempstring2, _countof(Alerttempstring2), tdbv.pszVal, _TRUNCATE);
+ db_free(&tdbv);
+ }
+
+ // putting data into string
+ if (((strstr(tempraw, Alerttempstring)) != nullptr) && ((strstr(tempraw, Alerttempstring2)) != nullptr)) {
+ //start string
+ alertpos = strstr(tempraw, Alerttempstring);
+ statalertpos = alertpos - tempraw;
+
+ memset(&alertpos, 0, sizeof(alertpos));
+ //end string
+ alertpos = strstr(tempraw, Alerttempstring2);
+ statalertposend = alertpos - tempraw + (int)mir_strlen(Alerttempstring2);
+
+ if (statalertpos > statalertposend) {
+ memset(&tempraw, ' ', statalertpos);
+ memset(&alertpos, 0, sizeof(alertpos));
+ alertpos = strstr(tempraw, Alerttempstring2);
+ statalertposend = alertpos - tempraw + (int)mir_strlen(Alerttempstring2);
+ }
+
+ if (statalertpos < statalertposend) {
+ memset(&raw, 0, sizeof(raw));
+
+ //start string
+ alertpos = strstr(tempraw, Alerttempstring);
+ statalertpos = alertpos - tempraw;
+
+ //end string
+ alertpos = strstr(tempraw, Alerttempstring2);
+ statalertposend = alertpos - tempraw + (int)mir_strlen(Alerttempstring2);
+
+ if (statalertpos > statalertposend) {
+ memset(&tempraw, ' ', statalertpos);
+ memset(&alertpos, 0, sizeof(alertpos));
+ alertpos = strstr(tempraw, Alerttempstring2);
+ statalertposend = alertpos - tempraw + (int)mir_strlen(Alerttempstring2);
+ }
+ disalertpos = 0;
+
+ //write selected data to string
+ strncpy(raw, &tempraw[statalertpos], (statalertposend - statalertpos));
+ raw[(statalertposend - statalertpos)] = '\0';
+ }
+ } // end putting data into string
+ else { // start and/or end string not present
+ if (alertIndex == 0) { // popup
+ Sleep(1000);
+ WAlertPopup(hContact, TranslateT("Alert start/end strings not found or strings not set."));
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ else if (alertIndex == 1) { // LOG
+ if (!notpresent) { // dont log to file twice if both types of start/end strings not present
+ if (!g_plugin.getString(hContact, FILE_KEY, &tdbv)) {
+ int AmountWspcRem = 0;
+ if (!g_plugin.getByte(hContact, SAVE_AS_RAW_KEY, 0)) {
+ CodetoSymbol(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseBlock(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ FastTagFilter(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ NumSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ AmountWspcRem = g_plugin.getByte(hContact, RWSPACE_KEY, 0);
+ RemoveInvis(tempraw, AmountWspcRem);
+ Sleep(100); // avoid 100% CPU
+
+ Removewhitespace(tempraw);
+ }
+
+ SaveToFile(hContact, tempraw);
+ db_free(&tdbv);
+ // contactlist name
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ }
+ }
+ else if (alertIndex == 3) { // osd
+ WAlertOSD(hContact, TranslateT("Alert start/end strings not found or strings not set."));
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ else if (alertIndex == 2) { // window
+ WDisplayDataAlert(hContact);
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+
+ HWND hwndDlg = (WindowList_Find(hWindowList, hContact));
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Alert start/end strings not found or strings not set."));
+ }
+ else MessageBox(nullptr, TranslateT("Alert start/end strings not found or strings not set."), _A2W(MODULENAME), MB_OK);
+
+ g_plugin.setWord(hContact, "Status", ID_STATUS_AWAY);
+ }
+
+ ///////////////
+ if (((strstr(tempraw, Alerttempstring)) != nullptr) && ((strstr(tempraw, Alerttempstring2)) != nullptr)) {
+ // TEST GET NAME FOR CACHE
+ wchar_t cachepath[MAX_PATH], cachedirectorypath[MAX_PATH], newcachepath[MAX_PATH + 50];
+ GetModuleFileName(g_plugin.getInst(), cachepath, _countof(cachepath));
+ wchar_t *cacheend = wcsrchr(cachepath, '\\');
+ cacheend++;
+ *cacheend = '\0';
+
+ mir_snwprintf(cachedirectorypath, L"%s%S%S", cachepath, MODULENAME, "cache\\");
+ CreateDirectory(cachedirectorypath, nullptr);
+ mir_snwprintf(newcachepath, L"%s%S%S%S%S", cachepath, MODULENAME, "cache\\", contactname, ".txt");
+ // file exists?
+ if (_waccess(newcachepath, 0) != -1) {
+ if ((pcachefile = _wfopen(newcachepath, L"r")) == nullptr)
+ WErrorPopup((UINT_PTR)contactname, TranslateT("Cannot read from file"));
+ else {
+ memset(&cachecompare, 0, sizeof(cachecompare));
+ fread(cachecompare, sizeof(cachecompare), 1, pcachefile);
+ fclose(pcachefile);
+ }
+ }
+ // write to cache
+ if ((pcachefile = _wfopen(newcachepath, L"w")) == nullptr)
+ WErrorPopup((UINT_PTR)contactname, TranslateT("Cannot write to file 2"));
+ else {
+ fwrite(raw, mir_strlen(raw), 1, pcachefile); //smaller cache
+ g_plugin.setWString(hContact, CACHE_FILE_KEY, newcachepath);
+ fclose(pcachefile);
+ }
+ // end write to cache
+ if (strncmp(raw, cachecompare, (mir_strlen(raw))) != 0) { //lets try this instead
+ // play sound?
+ Skin_PlaySound("webviewalert");
+ // there was an alert
+ wasAlert = 1;
+
+ if (!notpresent) {
+ if (alertIndex == 0) { // popup
+ WAlertPopup(hContact, TranslateT("Specific part of the web page has changed."));
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ else if (alertIndex == 3) { // osd
+ WAlertOSD(hContact, TranslateT("Specific part of the web page has changed."));
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ else if (alertIndex == 1) { // log to file
+ if (!g_plugin.getString(hContact, FILE_KEY, &tdbv)) {
+ int AmountWspcRem = 0;
+ if (!g_plugin.getByte(hContact, SAVE_AS_RAW_KEY, 0)) {
+ CodetoSymbol(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseBlock(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ FastTagFilter(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ NumSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ AmountWspcRem = g_plugin.getByte(hContact, RWSPACE_KEY, 0);
+ RemoveInvis(tempraw, AmountWspcRem);
+ Sleep(100); // avoid 100% CPU
+
+ Removewhitespace(tempraw);
+ }
+
+ SaveToFile(hContact, tempraw);
+ db_free(&tdbv);
+ // contactlist name
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ }
+ else if (alertIndex == 2) { // window
+ WDisplayDataAlert(hContact);
+ // contactlist name//
+ if (g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0))
+ db_set_s(hContact, "CList", "MyHandle", tstr);
+ }
+ else MessageBox(nullptr, TranslateT("Unknown alert type."), _A2W(MODULENAME), MB_OK);
+ }
+ }
+ }
+ } // alert type
+ }
+ // end alerts
+
+ //if always log to file option is enabled do this
+ if (wasAlert && alertIndex != 1) { // dont do for log to file alert
+ if (g_plugin.getByte(hContact, ALWAYS_LOG_KEY, 0)) {
+ if (!g_plugin.getString(hContact, FILE_KEY, &tdbv)) {
+ int AmountWspcRem = 0;
+
+ if (!g_plugin.getByte(hContact, SAVE_AS_RAW_KEY, 0)) {
+ CodetoSymbol(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseBlock(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ FastTagFilter(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ NumSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ EraseSymbols(tempraw);
+ Sleep(100); // avoid 100% CPU
+
+ AmountWspcRem = g_plugin.getByte(hContact, RWSPACE_KEY, 0);
+ RemoveInvis(tempraw, AmountWspcRem);
+ Sleep(100); // avoid 100% CPU
+
+ Removewhitespace(tempraw);
+ }
+
+ SaveToFile(hContact, tempraw);
+ db_free(&tdbv);
+ }
+ }
+ }
+ strncpy(truncated, tempraw, mir_strlen(truncated));
+ return wasAlert;
+}
+
+/*****************************************************************************/
+int DataWndAlertCommand(WPARAM wParam, LPARAM)
+{
+ MCONTACT hContact = wParam;
+ if (WindowList_Find(hWindowList, hContact))
+ return 0;
+
+ HWND hwndDlg = CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_DISPLAY_DATA), nullptr, DlgProcDisplayData, hContact);
+ HWND hTopmost = g_plugin.getByte(hContact, ON_TOP_KEY, 0) ? HWND_TOPMOST : HWND_NOTOPMOST;
+ SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)((HICON)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_STICK), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0)));
+ if (g_plugin.getByte(SAVE_INDIVID_POS_KEY, 0))
+ SetWindowPos(hwndDlg, hTopmost,
+ g_plugin.getDword(hContact, "WVx", 100), // Xposition,
+ g_plugin.getDword(hContact, "WVy", 100), // Yposition,
+ g_plugin.getDword(hContact, "WVwidth", 100), // WindowWidth,
+ g_plugin.getDword(hContact, "WVheight", 100), 0); // WindowHeight,
+ else
+ SetWindowPos(hwndDlg, HWND_TOPMOST, Xposition, Yposition, WindowWidth, WindowHeight, 0);
+
+ ShowWindow(hwndDlg, SW_SHOW);
+ SetActiveWindow(hwndDlg);
+ return 0;
+}
+
+/*****************************************************************************/
+void ReadFromFile(void *param)
+{
+ MCONTACT hContact = (UINT_PTR)param;
+
+ DBVARIANT dbv;
+ char truncated[MAXSIZE1];
+ int AmountWspcRem = 0;
+ int fileexists = 0;
+
+ HWND hwndDlg = WindowList_Find(hWindowList, hContact);
+
+ char contactname[100]; contactname[0] = 0;
+ if (!db_get_s(hContact, "CList", "MyHandle", &dbv)) {
+ strncpy_s(contactname, _countof(contactname), dbv.pszVal, _TRUNCATE);
+ db_free(&dbv);
+ }
+
+ if (g_plugin.getString(hContact, CACHE_FILE_KEY, &dbv))
+ return;
+
+ FILE *pfile;
+ if ((pfile = fopen(dbv.pszVal, "r")) == nullptr) {
+ SendToRichEdit(hwndDlg, Translate("Cannot read from cache file"), TextClr, BackgoundClr);
+ fileexists = 0;
+ }
+ else {
+ fread(truncated, sizeof(truncated), 1, pfile);
+ fclose(pfile);
+ fileexists = 1;
+ }
+
+ db_free(&dbv);
+
+ if (fileexists) {
+ CodetoSymbol(truncated);
+ Sleep(100); // avoid 100% CPU
+
+ EraseBlock(truncated);
+ Sleep(100); // avoid 100% CPU
+
+ FastTagFilter(truncated);
+ Sleep(100); // avoid 100% CPU
+
+ NumSymbols(truncated);
+ Sleep(100); // avoid 100% CPU
+
+ EraseSymbols(truncated);
+ Sleep(100); // avoid 100% CPU
+
+ AmountWspcRem = g_plugin.getByte(hContact, RWSPACE_KEY, 0);
+ RemoveInvis(truncated, AmountWspcRem);
+ Sleep(100); // avoid 100% CPU
+
+ Removewhitespace(truncated);
+
+ SendToRichEdit(hwndDlg, truncated, TextClr, BackgoundClr);
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Loaded from cache"));
+ }
+}
diff --git a/protocols/WebView/src/webview_cleanup.cpp b/protocols/WebView/src/webview_cleanup.cpp
new file mode 100644
index 0000000000..af620f7351
--- /dev/null
+++ b/protocols/WebView/src/webview_cleanup.cpp
@@ -0,0 +1,797 @@
+/*
+* A plugin for Miranda IM which displays web page text in a window Copyright
+* (C) 2005 Vincent Joyce.
+*
+* Miranda IM: the free icq client for MS Windows Copyright (C) 2000-2
+* Richard Hughes, Roland Rabien & Tristan Van de Vreede
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the Free
+* Software Foundation; either version 2 of the License, or (at your option)
+* any later version.
+*
+* This program is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* for more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program; if not, write to the Free Software Foundation, Inc., 59
+* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "stdafx.h"
+#include "webview.h"
+
+// ///////////////////////
+// characters and symbols//
+// ///////////////////////
+
+#define AMOUNT3 164
+
+char*CharacterCodes[AMOUNT3] =
+{
+ "&quot;",
+ "&amp;",
+ "&lt;",
+ "&gt;",
+ "&nbsp;",
+ "&iexcl;",
+ "&cent;",
+ "&pound;",
+ "&curren;",
+ "&yen;",
+ "&brvbar",
+ "&sect;",
+ "&uml;",
+ "&copy;",
+ "&ordf;",
+ "&laquo;",
+ "&not;",
+ "&shy;",
+ "&reg;",
+ "&macr;",
+ "&deg;",
+ "&plusmn;",
+ "&sup2;",
+ "&sup3;",
+ "&acute;",
+ "&micro;",
+ "&para;",
+ "&middot;",
+ "&cedil;",
+ "&sup1;",
+ "&ordm;",
+ "&raquo;",
+ "&frac14;",
+ "&frac12;",
+ "&frac34;",
+ "&iquest;",
+ "&Agrave;",
+ "&Aacute;",
+ "&Acirc;",
+ "&Atilde;",
+ "&Auml;",
+ "&Aring;",
+ "&AElig;",
+ "&Ccedil;",
+ "&Egrave;",
+ "&Eacute;",
+ "&Ecirc;",
+ "&Euml;",
+ "&Igrave;",
+ "&Iacute;",
+ "&Icirc;",
+ "&Iuml;",
+ "&ETH;",
+ "&Ntilde;",
+ "&Ograve;",
+ "&Oacute;",
+ "&Ocirc;",
+ "&Otilde;",
+ "&Ouml;",
+ "&times;",
+ "&Oslash;",
+ "&Ugrave;",
+ "&Uacute;",
+ "&Ucirc;",
+ "&Uuml;",
+ "&Yacute;",
+ "&THORN;",
+ "&szlig;",
+ "&agrave;",
+ "&aacute;",
+ "&acirc;",
+ "&atilde;",
+ "&auml;",
+ "&aring;",
+ "&aelig;",
+ "&ccedil;",
+ "&egrave;",
+ "&eacute;",
+ "&ecirc;",
+ "&euml;",
+ "&igrave;",
+ "&iacute;",
+ "&icirc;",
+ "&iuml;",
+ "&eth;",
+ "&ntilde;",
+ "&ograve;",
+ "&oacute;",
+ "&ocirc;",
+ "&otilde;",
+ "&ouml;",
+ "&divide;",
+ "&oslash;",
+ "&ugrave;",
+ "&uacute;",
+ "&ucirc;",
+ "&uuml;",
+ "&yacute;",
+ "&thorn;",
+ "&yumil;",
+ "&#338;", // greater that 255, extra latin characters
+ "&#339;",
+ "&#352;",
+ "&#353;",
+ "&#376;",
+ "&#402;",
+ "&#710;",
+ "&#732;",
+ "&OElig;",
+ "&oelig;",
+ "&Scaron;",
+ "&scaron;",
+ "&Yuml;",
+ "&fnof;",
+ "&circ;",
+ "&tilde;",
+ "&#8211;", // Misc other characters
+ "&#8212;",
+ "&#8216;",
+ "&#8217;",
+ "&#8218;",
+ "&#8220;",
+ "&#8221;",
+ "&#8222;",
+ "&#8224;",
+ "&#8225;",
+ "&#8226;",
+ "&#8230;",
+ "&#8240;",
+ "&#8249;",
+ "&#8250;",
+ "&#8364;",
+ "&#8465;",
+ "&#8476;",
+ "&#8482;",
+ "&ndash;",
+ "&mdash;",
+ "&lsquo;",
+ "&rsquo;",
+ "&sbquo;",
+ "&ldquo;",
+ "&rdquo;",
+ "&bdquo;",
+ "&dagger;",
+ "&Dagger;",
+ "&bull;",
+ "&hellip;",
+ "&permil;",
+ "&lsaquo;",
+ "&rsaquo;",
+ "&euro;",
+ "&image;",
+ "&real;",
+ "&trade;",
+ "&ensp;",
+ "&emsp;",
+ "&thinsp;",
+ "&#8194;",
+ "&#8195;",
+ "&#8201;",
+ "&otilde;", // symbols without numeric code
+ "&iquest;",
+ "&brvbar;",
+ "&macr;"};
+
+char Characters[AMOUNT3] =
+{
+ '\"',
+ '&',
+ '<',
+ '>',
+ ' ',
+ '¡',
+ '¢',
+ '£',
+ '¤',
+ '¥',
+ '¦',
+ '§',
+ '¨',
+ '©',
+ 'ª',
+ '«',
+ '¬',
+ '­',
+ '®',
+ '¯',
+ '°',
+ '±',
+ '²',
+ '³',
+ '´',
+ 'µ',
+ '¶',
+ '·',
+ '¸',
+ '¹',
+ 'º',
+ '»',
+ '¼',
+ '½',
+ '¾',
+ '¿',
+ 'À',
+ 'Á',
+ 'Â',
+ 'Ã',
+ 'Ä',
+ 'Å',
+ 'Æ',
+ 'Ç',
+ 'È',
+ 'É',
+ 'Ê',
+ 'Ë',
+ 'Ì',
+ 'Í',
+ 'Î',
+ 'Ï',
+ 'Ð',
+ 'Ñ',
+ 'Ò',
+ 'Ó',
+ 'Ô',
+ 'Õ',
+ 'Ö',
+ '×',
+ 'Ø',
+ 'Ù',
+ 'Ú',
+ 'Û',
+ 'Ü',
+ 'Ý',
+ 'Þ',
+ 'ß',
+ 'à',
+ 'á',
+ 'â',
+ 'ã',
+ 'ä',
+ 'å',
+ 'æ',
+ 'ç',
+ 'è',
+ 'é',
+ 'ê',
+ 'ë',
+ 'ì',
+ 'í',
+ 'î',
+ 'ï',
+ 'ð',
+ 'ñ',
+ 'ò',
+ 'ó',
+ 'ô',
+ 'õ',
+ 'ö',
+ '÷',
+ 'ø',
+ 'ù',
+ 'ú',
+ 'û',
+ 'ü',
+ 'ý',
+ 'þ',
+ 'ÿ',
+ 'Œ', // greater than 255 extra latin characters
+ 'œ',
+ 'Š',
+ 'š',
+ 'Ÿ',
+ 'ƒ',
+ 'ˆ',
+ '˜',
+ 'Œ',
+ 'œ',
+ 'Š',
+ 'š',
+ 'Ÿ',
+ 'ƒ',
+ 'ˆ',
+ '˜',
+ '–',
+ '—', // misc other characters
+ '‘',
+ '’',
+ '‚',
+ '“',
+ '”',
+ '„',
+ '†',
+ '‡',
+ '•',
+ '…',
+ '‰',
+ '‹',
+ '›',
+ '€',
+ 'I',
+ 'R',
+ '™',
+ '–',
+ '—',
+ '‘',
+ '’',
+ '‚',
+ '“',
+ '”',
+ '„',
+ '†',
+ '‡',
+ '•',
+ '…',
+ '‰',
+ '‹',
+ '›',
+ '€',
+ 'I',
+ 'R',
+ '™',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ 'õ',
+ '¿',
+ '¦',
+ '¯'};
+
+/*****************************************************************************/
+void CodetoSymbol(char *truncated)
+{
+ int counter = 0;
+ int position = 0, recpos = 0;
+ static char *stringfrompos;
+
+ for (int n = 0; n < AMOUNT3; n++) {
+ while (true) { // loop forever
+ Sleep(1); // avoid 100% CPU
+
+ if ( strstr(truncated, CharacterCodes[n]) != nullptr) { // does character code exist?
+ stringfrompos = strstr(truncated, CharacterCodes[n]);
+
+ position = stringfrompos - truncated;
+ counter = 0;
+ while (counter != mir_strlen(CharacterCodes[n])) {
+ truncated[position + counter] = ' ';
+ counter++;
+ }
+
+ truncated[(position + counter) - 1] = Characters[n];
+ strncpy(&truncated[position], &truncated[position + mir_strlen(CharacterCodes[n])] - 1, mir_strlen(&truncated[position]) - 1);
+ } // end does character code exist?
+
+ if (recpos == position)
+ break; // break out of loop if doesn't find new character code
+
+ recpos = position;
+ } // end loop forever
+ } // for
+}
+
+/*****************************************************************************/
+void EraseBlock(char *truncated)
+{
+ int counter = 0;
+ int positionStart = 0, positionEnd = 0;
+ char *stringfrompos;
+ int BlockLength = 0;
+
+ char* tempraw = (char*)malloc(MAXSIZE1);
+ if (truncated)
+ strncpy(tempraw, truncated, MAXSIZE1);
+
+ // ///////////////////////////
+
+ while (true) {
+ Sleep(1); // avoid 100% CPU
+ // /get start and end of block
+
+ if (strstr(tempraw, "<!--") != nullptr) // does tag exist?
+ {
+ stringfrompos = strstr(tempraw, "<!--");
+ positionStart = stringfrompos - tempraw;
+ }
+
+ if (strstr(tempraw, "-->") != nullptr) // does tag exist?
+ {
+ stringfrompos = strstr(tempraw, "-->");
+ positionEnd = stringfrompos - tempraw;
+ }
+ BlockLength = (positionEnd - positionStart) + 3;
+
+ if ((strstr(tempraw, "<!--") == nullptr) || (strstr(tempraw, "-->") == nullptr))
+ break;
+
+ /////////////////////////////////////////
+
+ if (strstr(tempraw, "<!--") != nullptr)
+ for (counter = 0; counter < BlockLength; counter++)
+ tempraw[positionStart + counter] = ' ';
+
+ if ((positionStart == 0) && (positionEnd == 0))
+ break;
+ if (positionStart > positionEnd)
+ break;
+
+ positionStart = 0;
+ positionEnd = 0;
+ }
+
+ // ///////////////////////////
+ positionStart = 0;
+ positionEnd = 0;
+
+ // 2//
+ while (true) {
+ Sleep(1); // avoid 100% CPU
+ // /get start and end of block
+
+ if (((strstr(tempraw, "<script")) != nullptr) || (strstr(tempraw, "<SCRIPT") != nullptr)) // does
+ {
+ if (strstr(tempraw, "<script") != nullptr)
+ stringfrompos = strstr(tempraw, "<script");
+ else
+ stringfrompos = strstr(tempraw, "<SCRIPT");
+
+ positionStart = stringfrompos - tempraw;
+ }
+
+ if (((strstr(tempraw, "</script")) != nullptr) || (strstr(tempraw, "</SCRIPT") != nullptr)) // does
+ {
+ if (strstr(tempraw, "<script") != nullptr)
+ stringfrompos = strstr(tempraw, "</script");
+ else
+ stringfrompos = strstr(tempraw, "</SCRIPT");
+
+ positionEnd = stringfrompos - tempraw;
+ }
+ BlockLength = (positionEnd - positionStart) + 9;
+
+ if ((strstr(tempraw, "<script") != nullptr) && (strstr(tempraw, "</script") == nullptr))
+ break;
+
+ if ((strstr(tempraw, "<SCRIPT") != nullptr) && (strstr(tempraw, "</SCRIPT") == nullptr))
+ break;
+
+ ///////////////////////////////////////
+
+ if (((strstr(tempraw, "<script")) != nullptr) || ((strstr(tempraw, "<SCRIPT")) != nullptr))
+ for (counter = 0; counter < BlockLength; counter++)
+ tempraw[positionStart + counter] = ' ';
+
+ if ((positionStart == 0) && (positionEnd == 0))
+ break;
+ if (positionStart > positionEnd)
+ break;
+
+ positionStart = 0;
+ positionEnd = 0;
+ }
+
+ // ////
+ // 3//
+ while (true)
+ {
+ Sleep(1); // avoid 100% CPU
+ // /get start and end of block
+
+ if (((strstr(tempraw, "<style")) != nullptr) || (strstr(tempraw, "<STYLE") != nullptr)) // does
+ {
+ if (strstr(tempraw, "<style") != nullptr)
+ stringfrompos = strstr(tempraw, "<style");
+ else
+ stringfrompos = strstr(tempraw, "<STYLE");
+
+ positionStart = stringfrompos - tempraw;
+ }
+
+ if (((strstr(tempraw, "</style")) != nullptr) || (strstr(tempraw, "</STYLE") != nullptr)) // does
+ {
+ if (strstr(tempraw, "<style") != nullptr)
+ stringfrompos = strstr(tempraw, "</style");
+ else
+ stringfrompos = strstr(tempraw, "</STYLE");
+
+ positionEnd = stringfrompos - tempraw;
+ }
+ BlockLength = (positionEnd - positionStart) + 8;
+
+ if ((strstr(tempraw, "<style") != nullptr) && (strstr(tempraw, "</style") == nullptr))
+ break;
+
+ if ((strstr(tempraw, "<STYLE") != nullptr) && (strstr(tempraw, "</STYLE") == nullptr))
+ break;
+
+ ///////////////////////////////////////
+ if (((strstr(tempraw, "<style")) != nullptr) || ((strstr(tempraw, "<STYLE")) != nullptr))
+ for (counter = 0; counter < BlockLength; counter++)
+ tempraw[positionStart + counter] = ' ';
+
+ if ((positionStart == 0) && (positionEnd == 0))
+ break;
+ if (positionStart > positionEnd)
+ break;
+
+ positionStart = 0;
+ positionEnd = 0;
+ }
+
+ // 4//
+
+ while (true) {
+ Sleep(1); // avoid 100% CPU
+ // /get start and end of block
+ if (strstr(tempraw, "{") != nullptr) // does tag exist?
+ {
+ stringfrompos = strstr(tempraw, "{");
+ positionStart = stringfrompos - tempraw;
+ }
+
+ if (strstr(tempraw, "}") != nullptr) // does tag exist?
+ {
+ stringfrompos = strstr(tempraw, "}");
+ positionEnd = stringfrompos - tempraw;
+ }
+ BlockLength = (positionEnd - positionStart) + 1;
+
+ if ((strstr(tempraw, "}") == nullptr) || (strstr(tempraw, "{") == nullptr))
+ break;
+
+ /////////////////////////////////////////
+ if (strstr(tempraw, "{") != nullptr)
+ for (counter = 0; counter < BlockLength; counter++)
+ tempraw[positionStart + counter] = ' ';
+
+ if ((positionStart == 0) && (positionEnd == 0))
+ break;
+ if (positionStart > positionEnd)
+ break;
+
+ positionStart = 0;
+ positionEnd = 0;
+ }
+
+ // ///////////////////////////
+ positionStart = 0;
+ positionEnd = 0;
+
+ strncpy(truncated, tempraw, mir_strlen(truncated));
+ free(tempraw);
+}
+
+/*****************************************************************************/
+void EraseSymbols(char *truncated)
+{
+ int counter = 0;
+ int position = 0, recpos = 0;
+ char *stringfrompos;
+
+ char *tempraw = (char*)malloc(MAXSIZE1);
+ if (truncated)
+ strncpy(tempraw, truncated, MAXSIZE1);
+
+ // //////
+ while (true) {
+ Sleep(1); // avoid 100% CPU
+
+ /**/
+ counter = 0;
+ if ((strstr(tempraw, "&#")) != nullptr) {
+ stringfrompos = strstr(tempraw, "&#");
+ position = stringfrompos - tempraw;
+
+ while (true) {
+ tempraw[position + counter] = ' ';
+ counter++;
+ if (counter > 20)
+ break;
+ if (tempraw[position + counter] == ' ')
+ break;
+ }
+ if (tempraw[position + counter] == ';')
+ tempraw[position + counter] = ' ';
+ }
+ if (recpos == position)
+ break;
+ recpos = position;
+ }
+
+ strncpy(truncated, tempraw, mir_strlen(truncated));
+ free(tempraw);
+}
+
+/*****************************************************************************/
+void NumSymbols(char *truncated)
+{
+ int counter = 0;
+ int position = 0, recpos = 0;
+ char*stringfrompos;
+ char symbol[20];
+ int character;
+
+ char *tempraw = (char*)malloc(MAXSIZE1);
+ if (truncated)
+ strncpy(tempraw, truncated, MAXSIZE1);
+
+ while (true) {
+ Sleep(1); // avoid 100% CPU
+
+ counter = 0;
+
+ if ((strstr(tempraw, "&#")) != nullptr) {
+ stringfrompos = strstr(tempraw, "&#");
+ position = stringfrompos - tempraw;
+
+ while (true) {
+ if (counter > 1)
+ symbol[counter - 2] = tempraw[position + counter];
+
+ tempraw[position + counter] = ' ';
+ counter++;
+ if (counter > 20)
+ break;
+
+ if ((tempraw[position + counter] == ';')) {
+ symbol[counter - 2] = '\0';
+ character = atoi(symbol);
+
+ if (character > 0 && character < 256)
+ memset(&tempraw[position], character, 1);
+ break;
+ }
+ }
+
+ if (tempraw[position + counter] == ';')
+ tempraw[position + counter] = ' ';
+ }
+ if (recpos == position)
+ break;
+ recpos = position;
+ }
+
+ strncpy(truncated, tempraw, mir_strlen(truncated));
+ free(tempraw);
+}
+
+/*****************************************************************************/
+void FastTagFilter(char *truncated)
+{
+ char *tempraw = (char*)malloc(MAXSIZE1);
+ if (truncated)
+ strncpy(tempraw, truncated, MAXSIZE1);
+
+ for (int counter = 0; counter < mir_strlen(tempraw); counter++) {
+ if (tempraw[counter] == '<') {
+ while (tempraw[counter] != '>') {
+ if (counter >= mir_strlen(tempraw))
+ break;
+
+ tempraw[counter] = ' ';
+ counter++;
+ }
+ if (tempraw[counter] == '>')
+ tempraw[counter] = ' ';
+ }
+ }
+
+ strncpy(truncated, tempraw, mir_strlen(truncated));
+ free(tempraw);
+}
+
+/*****************************************************************************/
+void RemoveInvis(char *truncated, int AmountWspcRem)
+{
+ int erase = 0;
+ int RemovalLevel = 0;
+
+ char *tempraw = (char*)malloc(MAXSIZE1);
+ if (truncated)
+ strncpy(tempraw, truncated, MAXSIZE1);
+
+ switch (AmountWspcRem) {
+ case 1:
+ RemovalLevel = 80; // small
+ break;
+ case 2:
+ RemovalLevel = 30; // medium
+ break;
+ case 3:
+ RemovalLevel = 10; // large
+ break;
+ }
+
+ for (int counter = 0; counter < mir_strlen(tempraw); counter++) {
+ if (AmountWspcRem != 0 && AmountWspcRem != 4) {
+ if ((tempraw[counter] == '\n') || (tempraw[counter] == ' ') || (tempraw[counter] == '\r'))
+ erase = erase + 1;
+ else
+ erase = 0;
+
+ if (erase > RemovalLevel)
+ tempraw[counter] = ' ';
+ }
+
+ if (AmountWspcRem == 4)
+ if ((tempraw[counter] == '\n') || (tempraw[counter] == ' ') || (tempraw[counter] == '\r'))
+ tempraw[counter] = ' ';
+ } // end for
+
+ strncpy(truncated, tempraw, mir_strlen(truncated));
+ free(tempraw);
+}
+
+/*****************************************************************************/
+void RemoveTabs(char *truncated)
+{
+ char *tempraw = (char*)malloc(MAXSIZE1);
+ if (truncated)
+ strncpy(tempraw, truncated, MAXSIZE1);
+
+ for (int counter = 0; counter < mir_strlen(tempraw); counter++)
+ if (tempraw[counter] == '\t')
+ tempraw[counter] = ' ';
+
+ strncpy(truncated, tempraw, mir_strlen(truncated));
+ free(tempraw);
+}
+
+/*****************************************************************************/
+void Removewhitespace(char *truncated)
+{
+ int counter2 = 0;
+ int pos1 = 0, pos2 = 0;
+
+ for (int counter = 0; counter < mir_strlen(truncated); counter++) {
+ if (truncated[counter] == ' ' && truncated[counter + 1] == ' ') {
+ pos1 = counter + 1;
+ counter2 = counter;
+
+ while (truncated[counter2] == ' ')
+ counter2++;
+
+ pos2 = counter2;
+ strncpy(&truncated[pos1], &truncated[pos2], mir_strlen(&truncated[pos1]) - 1);
+ } // end if
+ } // end for
+}
+
+/*****************************************************************************/
+void Filter(char *truncated)
+{
+ char tempraw[MAXSIZE1];
+ strncpy(tempraw, truncated, _countof(tempraw));
+
+ for (int counter = 0; counter < mir_strlen(tempraw); counter++)
+ if ((tempraw[counter] == '\n') || (tempraw[counter] == '\r') || (tempraw[counter] == '\t'))
+ strncpy(&tempraw[counter], &tempraw[counter + 1], mir_strlen(&tempraw[counter]) - 1);
+
+ strncpy(truncated, tempraw, mir_strlen(truncated));
+}
diff --git a/protocols/WebView/src/webview_datawnd.cpp b/protocols/WebView/src/webview_datawnd.cpp
new file mode 100644
index 0000000000..dc8b414547
--- /dev/null
+++ b/protocols/WebView/src/webview_datawnd.cpp
@@ -0,0 +1,514 @@
+/*
+* A plugin for Miranda IM which displays web page text in a window Copyright
+* (C) 2005 Vincent Joyce.
+*
+* Miranda IM: the free icq client for MS Windows Copyright (C) 2000-2
+* Richard Hughes, Roland Rabien & Tristan Van de Vreede
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the Free
+* Software Foundation; either version 2 of the License, or (at your option)
+* any later version.
+*
+* This program is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* for more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program; if not, write to the Free Software Foundation, Inc., 59
+* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "stdafx.h"
+#include "webview.h"
+
+/*****************************************************************************/
+INT_PTR CALLBACK DlgProcFind(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ static char Searchstr[128];
+ static int loc;
+ static int oldloc;
+ static int startposition;
+ static int OLDstartposition;
+
+ HWND ParentHwnd = GetParent(hwndDlg);
+
+ switch (msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
+ SetWindowText(hwndDlg, TranslateT("Find"));
+ SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_FIND)));
+ return TRUE;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam)) {
+ case IDC_OK: // find Next
+ {
+ char NewSearchstr[128];
+ int location = 0;
+ int startsel = 0, endsel = 0;
+ char buff[MAXSIZE1];
+
+ memset(&NewSearchstr, 0, sizeof(NewSearchstr));
+
+ int len = GetWindowTextLength(GetDlgItem(ParentHwnd, IDC_DATA));
+
+ char *tempbuffer = (char*)malloc(len + 2);
+
+ GetDlgItemTextA(ParentHwnd, IDC_DATA, tempbuffer, len);
+ strncpy(buff, tempbuffer, _countof(buff));
+ free(tempbuffer);
+
+ Filter(buff);
+ CharUpperBuffA(buff, (int)mir_strlen(buff));
+
+ GetDlgItemTextA(hwndDlg, IDC_FINDWHAT, NewSearchstr, _countof(NewSearchstr));
+ CharUpperBuffA(NewSearchstr, (int)mir_strlen(NewSearchstr));
+
+ OLDstartposition = startposition;
+
+ if ((strstr(Searchstr, NewSearchstr)) != nullptr)
+ startposition = loc + (int)mir_strlen(Searchstr);
+ else {
+ oldloc = 0;
+ startposition = 0;
+ }
+
+ mir_strcpy(Searchstr, NewSearchstr);
+
+ if (!(startposition > (int)mir_strlen(buff)))
+ location = (strstr(buff + startposition, NewSearchstr)) - buff;
+
+ oldloc = loc;
+ loc = location;
+
+ if (loc == 0) {
+ ShowWindow(GetDlgItem(hwndDlg, IDC_SEARCH_COMPLETE), SW_SHOW);
+ loc = (strstr(buff, NewSearchstr)) - buff;
+ startsel = loc;
+ endsel = loc + (int)mir_strlen(NewSearchstr);
+ oldloc = 0;
+ startposition = 0;
+ }
+ else {
+ ShowWindow(GetDlgItem(hwndDlg, IDC_SEARCH_COMPLETE), SW_HIDE);
+ startsel = loc;
+ endsel = loc + (int)mir_strlen(NewSearchstr);
+ }
+
+ CHARRANGE sel2 = { startsel, endsel };
+ SendDlgItemMessage(ParentHwnd, IDC_DATA, EM_EXSETSEL, 0, (LPARAM)&sel2);
+ SetFocus(GetDlgItem(ParentHwnd, IDC_DATA));
+ }
+ return TRUE;
+
+ case WM_DESTROY:
+ case IDC_CANCEL:
+ EnableWindow(GetDlgItem(ParentHwnd, IDC_FIND_BUTTON), 1);
+ EnableWindow(ParentHwnd, 1);
+ DestroyWindow(hwndDlg);
+ }
+ break;
+ }
+ return FALSE;
+}
+
+/*****************************************************************************/
+
+static wchar_t tszSizeString[] = L"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+
+static MCONTACT FindContactByUrl(HWND hwndDlg)
+{
+ MCONTACT res = NULL;
+ wchar_t urltext[300], titlebartxt[300];
+ int contactcount = 0;
+
+ GetDlgItemText(hwndDlg, IDC_OPEN_URL, urltext, _countof(urltext));
+ GetWindowText(hwndDlg, titlebartxt, _countof(titlebartxt));
+
+ for (auto &hContact : Contacts(MODULENAME)) {
+ ptrW db1(g_plugin.getWStringA(hContact, URL_KEY));
+ ptrW db2(g_plugin.getWStringA(hContact, PRESERVE_NAME_KEY));
+
+ if (!mir_wstrcmp(urltext, db1) && !mir_wstrcmp(titlebartxt, db2)) {
+ contactcount++;
+ if (contactcount > 1) {
+ MessageBox(nullptr, TranslateT("ERROR: You have two or more Webview contacts with the same URL and contact name."), _A2W(MODULENAME), MB_OK);
+ return NULL;
+ }
+ res = hContact;
+ }
+ }
+ return res;
+}
+
+INT_PTR CALLBACK DlgProcDisplayData(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ DBVARIANT dbv;
+ RECT rc;
+ wchar_t url[300];
+ MCONTACT hContact;
+
+ switch (msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ {
+ MCONTACT hContact2 = lParam;
+
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)hContact2);
+ WindowList_Add(hWindowList, hwndDlg, hContact2);
+
+ url[0] = '\0';
+ if (!g_plugin.getWString(hContact2, URL_KEY, &dbv)) {
+ wcsncpy_s(url, dbv.pwszVal, _TRUNCATE);
+ db_free(&dbv);
+ }
+ SetDlgItemText(hwndDlg, IDC_OPEN_URL, FixButtonText(url, _countof(url)));
+
+ char preservename[100];
+ if (!g_plugin.getString(hContact2, PRESERVE_NAME_KEY, &dbv)) {
+ strncpy_s(preservename, _countof(preservename), dbv.pszVal, _TRUNCATE);
+ db_free(&dbv);
+ }
+ else preservename[0] = 0;
+ SetWindowTextA(hwndDlg, preservename);
+
+ SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_SITE)));
+
+ // //////
+ COLORREF colour = BackgoundClr;
+ COLORREF txtcolor;
+ SendDlgItemMessage(hwndDlg, IDC_DATA, EM_SETBKGNDCOLOR, 0, colour);
+
+ SendDlgItemMessage(hwndDlg, IDC_UPDATE_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_UPDATE), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
+ SendDlgItemMessage(hwndDlg, IDC_UPDATE_BUTTON, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Update data"), BATF_UNICODE);
+
+ SendDlgItemMessage(hwndDlg, IDC_FIND_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_FIND), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
+ SendDlgItemMessage(hwndDlg, IDC_FIND_BUTTON, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Find"), BATF_UNICODE);
+
+ SendDlgItemMessage(hwndDlg, IDC_OPTIONS_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_OPTIONS), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
+ SendDlgItemMessage(hwndDlg, IDC_OPTIONS_BUTTON, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Contact options"), BATF_UNICODE);
+
+ SendDlgItemMessage(hwndDlg, IDC_ALERT_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_ALERT), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
+ SendDlgItemMessage(hwndDlg, IDC_ALERT_BUTTON, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Alert options"), BATF_UNICODE);
+
+ SendDlgItemMessage(hwndDlg, IDC_STOP, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_STOP), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
+ SendDlgItemMessage(hwndDlg, IDC_STOP, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Stop processing"), BATF_UNICODE);
+
+ SendDlgItemMessage(hwndDlg, IDC_OPEN_URL, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Click here to open this URL in a browser window."), BATF_UNICODE);
+
+ if (!g_plugin.getByte(hContact2, ON_TOP_KEY)) {
+ SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_UNSTICK), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
+ SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Stick to the front"), BATF_UNICODE);
+ }
+ else {
+ SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_STICK), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
+ SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Disable stick to the front"), BATF_UNICODE);
+ }
+
+ SendDlgItemMessage(hwndDlg, IDC_DATA, WM_SETFONT, (WPARAM)h_font, 1);
+
+ txtcolor = TextClr;
+
+ SetDlgItemText(hwndDlg, IDC_DATA, L"");
+
+ InvalidateRect(hwndDlg, nullptr, 1);
+
+ SendDlgItemMessage(hwndDlg, IDC_DATA, EM_AUTOURLDETECT, 1, 0);
+ int mask = (int)SendDlgItemMessage(hwndDlg, IDC_DATA, EM_GETEVENTMASK, 0, 0);
+
+ SendDlgItemMessage(hwndDlg, IDC_DATA, EM_SETEVENTMASK, 0, mask | ENM_LINK | ENM_MOUSEEVENTS);
+
+ SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BUTTONSETASFLATBTN, 0, 0);
+ SendDlgItemMessage(hwndDlg, IDC_UPDATE_BUTTON, BUTTONSETASFLATBTN, 0, 0);
+ SendDlgItemMessage(hwndDlg, IDC_FIND_BUTTON, BUTTONSETASFLATBTN, 0, 0);
+ SendDlgItemMessage(hwndDlg, IDC_OPTIONS_BUTTON, BUTTONSETASFLATBTN, 0, 0);
+ SendDlgItemMessage(hwndDlg, IDC_ALERT_BUTTON, BUTTONSETASFLATBTN, 0, 0);
+ SendDlgItemMessage(hwndDlg, IDC_STOP, BUTTONSETASFLATBTN, 0, 0);
+
+ SendDlgItemMessage(hwndDlg, IDC_OPEN_URL, BUTTONSETASFLATBTN, 0, 0);
+
+ HDC hdc = GetDC(GetDlgItem(hwndDlg, IDC_STATUSBAR));
+ SelectObject(hdc, (HFONT)SendDlgItemMessage(hwndDlg, IDC_STATUSBAR, WM_GETFONT, 0, 0));
+ SIZE textSize;
+ GetTextExtentPoint32(hdc, tszSizeString, _countof(tszSizeString), &textSize);
+ int partWidth[2] = { textSize.cx, -1 };
+ ReleaseDC(GetDlgItem(hwndDlg, IDC_STATUSBAR), hdc);
+
+ SendDlgItemMessage(hwndDlg, IDC_STATUSBAR, SB_SETPARTS, _countof(partWidth), (LPARAM)partWidth);
+ SendDlgItemMessage(hwndDlg, IDC_STATUSBAR, SB_SETTEXT, 1 | SBT_OWNERDRAW, 0);
+
+ if (g_plugin.getByte(SAVE_INDIVID_POS_KEY, 0))
+ Utils_RestoreWindowPosition(hwndDlg, hContact2, MODULENAME, "WV");
+ }
+ break;
+
+ case WM_NOTIFY:
+ switch (((NMHDR *)lParam)->code) {
+ case EN_MSGFILTER:
+ switch (((MSGFILTER *)lParam)->msg) {
+ case WM_RBUTTONUP:
+ {
+ POINT pt;
+ CHARRANGE sel, all = { 0, -1 };
+
+ HMENU hSubMenu = GetSubMenu(hMenu, 0);
+ TranslateMenu(hSubMenu);
+ SendMessage(((NMHDR *)lParam)->hwndFrom, EM_EXGETSEL, 0, (LPARAM)& sel);
+
+ EnableMenuItem(hSubMenu, IDM_COPY, MF_ENABLED);
+ EnableMenuItem(hSubMenu, IDM_CUT, MF_ENABLED);
+ EnableMenuItem(hSubMenu, IDM_DELETE, MF_ENABLED);
+
+ if (sel.cpMin == sel.cpMax) {
+ EnableMenuItem(hSubMenu, IDM_COPY, MF_BYCOMMAND | MF_GRAYED);
+ EnableMenuItem(hSubMenu, IDM_CUT, MF_BYCOMMAND | MF_GRAYED);
+ EnableMenuItem(hSubMenu, IDM_DELETE, MF_BYCOMMAND | MF_GRAYED);
+ }
+ pt.x = (short)LOWORD(((ENLINK *)lParam)->lParam);
+ pt.y = (short)HIWORD(((ENLINK *)lParam)->lParam);
+ ClientToScreen(((NMHDR *)lParam)->hwndFrom, &pt);
+ switch (TrackPopupMenu(hSubMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, nullptr)) {
+ case IDM_COPY:
+ SendMessage(((NMHDR *)lParam)->hwndFrom, WM_COPY, 0, 0);
+ break;
+
+ case IDM_COPYALL:
+ SendMessage(((NMHDR *)lParam)->hwndFrom, EM_EXSETSEL, 0, (LPARAM)& all);
+ SendMessage(((NMHDR *)lParam)->hwndFrom, WM_COPY, 0, 0);
+ SendMessage(((NMHDR *)lParam)->hwndFrom, EM_EXSETSEL, 0, (LPARAM)& sel);
+ break;
+
+ case IDM_SELECTALL:
+ SendMessage(((NMHDR *)lParam)->hwndFrom, EM_EXSETSEL, 0, (LPARAM)& all);
+ break;
+
+ case IDM_CUT:
+ SendMessage(((NMHDR *)lParam)->hwndFrom, WM_CUT, 0, 0);
+ break;
+
+ case IDM_PASTE:
+ SendMessage(((NMHDR *)lParam)->hwndFrom, WM_PASTE, 0, 0);
+ break;
+
+ case IDM_DELETE:
+ SendMessage(((NMHDR *)lParam)->hwndFrom, WM_CLEAR, 0, 0);
+ break;
+
+ case IDM_CLEAR_ALL:
+ SetDlgItemTextA(hwndDlg, IDC_DATA, "");
+ SetFocus(GetDlgItem(hwndDlg, IDC_DATA));
+ break;
+ }
+ }
+ }
+ break;
+
+ case EN_LINK:
+ switch (((ENLINK *)lParam)->msg) {
+ case WM_RBUTTONDOWN:
+ case WM_LBUTTONUP:
+ CHARRANGE sel;
+ SendDlgItemMessage(hwndDlg, IDC_DATA, EM_EXGETSEL, 0, (LPARAM)& sel);
+ if (sel.cpMin != sel.cpMax)
+ break;
+
+ TEXTRANGEA tr;
+ tr.chrg = ((ENLINK *)lParam)->chrg;
+ tr.lpstrText = (char*)malloc(tr.chrg.cpMax - tr.chrg.cpMin + 8);
+
+ SendDlgItemMessage(hwndDlg, IDC_DATA, EM_GETTEXTRANGE, 0, (LPARAM)& tr);
+ if (strchr(tr.lpstrText, '@') != nullptr && strchr(tr.lpstrText, ':') == nullptr && strchr(tr.lpstrText, '/') == nullptr) {
+ memmove(tr.lpstrText + 7, tr.lpstrText, tr.chrg.cpMax - tr.chrg.cpMin + 1);
+ memcpy(tr.lpstrText, "mailto:", 7);
+ }
+
+ Utils_OpenUrl(tr.lpstrText);
+ SetFocus(GetDlgItem(hwndDlg, IDC_DATA));
+
+ free(tr.lpstrText);
+ break;
+ }
+ }
+ break; // notify
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam)) {
+ case IDC_OPEN_URL:
+ GetDlgItemText(hwndDlg, IDC_OPEN_URL, url, _countof(url));
+ Utils_OpenUrlW(url);
+ g_plugin.setWord(wParam, "Status", ID_STATUS_ONLINE);
+ break;
+
+ case IDC_UPDATE_BUTTON:
+ if (hContact = FindContactByUrl(hwndDlg)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE_BUTTON), 0);
+ UpdateMenuCommand(wParam, lParam, hContact);
+ }
+ break;
+
+ case IDC_STOP:
+ if (hContact = FindContactByUrl(hwndDlg))
+ g_plugin.setByte(hContact, STOP_KEY, 1);
+ break;
+
+ case IDC_STICK_BUTTON:
+ if (hContact = FindContactByUrl(hwndDlg))
+ OnTopMenuCommand(wParam, lParam, hContact);
+ {
+ wchar_t *ptszToolTip;
+ HWND hTopmost;
+ if (!g_plugin.getByte(hContact, ON_TOP_KEY, 0)) {
+ hTopmost = HWND_NOTOPMOST;
+ ptszToolTip = TranslateT("Stick to the front");
+ }
+ else {
+ hTopmost = HWND_TOPMOST;
+ ptszToolTip = TranslateT("Disable stick to the front");
+ }
+ SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(IDI_UNSTICK), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
+ SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BUTTONADDTOOLTIP, (WPARAM)ptszToolTip, BATF_UNICODE);
+ SetWindowPos(hwndDlg, hTopmost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
+ }
+ break;
+
+ case IDC_FIND_BUTTON:
+ {
+ HWND hwndFind = CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_FIND), hwndDlg, DlgProcFind, (LPARAM)wParam);
+ ShowWindow(hwndFind, SW_SHOW);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FIND_BUTTON), 0);
+ }
+ break;
+
+ case IDC_OPTIONS_BUTTON:
+ if (hContact = FindContactByUrl(hwndDlg))
+ DialogBoxParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_CONTACT_OPT), hwndDlg, DlgProcContactOpt, hContact);
+ break;
+
+ case IDC_ALERT_BUTTON:
+ if (hContact = FindContactByUrl(hwndDlg))
+ DialogBoxParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_ALRT_OPT), hwndDlg, DlgProcAlertOpt, hContact);
+ break;
+
+ case IDOK:
+ case IDCANCEL:
+ if (hwndDlg != nullptr)
+ DestroyWindow(hwndDlg);
+ return TRUE;
+ }
+ break;
+
+ case WM_CLOSE:
+ if (Yposition == -32000)
+ Yposition = 100;
+
+ if (Xposition == -32000)
+ Xposition = 100;
+
+ SavewinSettings();
+
+ if (hContact = FindContactByUrl(hwndDlg))
+ Utils_SaveWindowPosition(hwndDlg, hContact, MODULENAME, "WV");
+
+ if (hwndDlg != nullptr)
+ DestroyWindow(hwndDlg);
+ return 0;
+
+ case WM_DESTROY:
+ WindowList_Remove(hWindowList, hwndDlg);
+ return 0;
+
+ case WM_SIZE:
+ Utils_ResizeDialog(hwndDlg, g_plugin.getInst(), MAKEINTRESOURCEA(IDD_DISPLAY_DATA), DataDialogResize);
+ InvalidateRect(hwndDlg, nullptr, TRUE);
+
+ // global
+ GetWindowRect(hwndDlg, &rc);
+ Xposition = rc.left;
+ Yposition = rc.top;
+ WindowHeight = rc.bottom - rc.top;
+ WindowWidth = rc.right - rc.left;
+ break;
+
+ case WM_MOVE:
+ if (!IsIconic(hwndDlg) && !IsZoomed(hwndDlg)) {
+ GetWindowRect(hwndDlg, &rc);
+ // global
+ Xposition = rc.left;
+ Yposition = rc.top;
+ WindowHeight = rc.bottom - rc.top;
+ WindowWidth = rc.right - rc.left;
+
+ if ((GetAsyncKeyState(VK_CONTROL) & 0x8000))
+ break;
+
+ ValidatePosition(hwndDlg);
+ }
+ }
+ return FALSE;
+}
+
+/*****************************************************************************/
+
+int DataDialogResize(HWND, LPARAM, UTILRESIZECONTROL *urc)
+{
+ switch (urc->wId) {
+ case IDC_OPEN_URL:
+ return RD_ANCHORX_WIDTH | RD_ANCHORY_TOP;
+ case IDC_DATA:
+ return RD_ANCHORX_WIDTH | RD_ANCHORY_HEIGHT;
+ case IDC_STATUSBAR:
+ return RD_ANCHORX_WIDTH | RD_ANCHORX_RIGHT;
+
+ }
+ return RD_ANCHORX_LEFT | RD_ANCHORY_TOP;
+}
+
+/*****************************************************************************/
+
+void SavewinSettings(void)
+{
+ if (Yposition == -32000)
+ Yposition = 100;
+
+ if (Xposition == -32000)
+ Xposition = 100;
+
+ g_plugin.setDword(Xpos_WIN_KEY, Xposition);
+ g_plugin.setDword(Ypos_WIN_KEY, Yposition);
+
+ g_plugin.setDword(BG_COLOR_KEY, BackgoundClr);
+ g_plugin.setDword(TXT_COLOR_KEY, TextClr);
+ g_plugin.setDword(WIN_HEIGHT_KEY, WindowHeight);
+ g_plugin.setDword(WIN_WIDTH_KEY, WindowWidth);
+
+}
+
+/*****************************************************************************/
+void ValidatePosition(HWND)
+{
+ RECT r;
+ SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0);
+
+ POINT pt = { 0, 0 };
+ HMONITOR hMonitor = MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST); // always
+
+ MONITORINFO monitorInfo;
+ monitorInfo.cbSize = sizeof(MONITORINFO);
+ if (GetMonitorInfo(hMonitor, &monitorInfo))
+ memcpy(&r, &monitorInfo.rcMonitor, sizeof(RECT));
+
+ // /window going off right of screen*
+ if (Xposition + WindowWidth >= r.right)
+ Xposition = r.right - WindowWidth;
+
+ // window going off bottom of screen
+ if (Yposition + WindowHeight >= r.bottom)
+ Yposition = r.bottom - WindowHeight;
+
+ // window going off left of screen
+ if (Xposition >= r.right)
+ Xposition = 0;
+}
diff --git a/protocols/WebView/src/webview_getdata.cpp b/protocols/WebView/src/webview_getdata.cpp
new file mode 100644
index 0000000000..155f1be6c9
--- /dev/null
+++ b/protocols/WebView/src/webview_getdata.cpp
@@ -0,0 +1,511 @@
+/*
+* A plugin for Miranda IM which displays web page text in a window Copyright
+* (C) 2005 Vincent Joyce.
+*
+* Miranda IM: the free icq client for MS Windows Copyright (C) 2000-2
+* Richard Hughes, Roland Rabien & Tristan Van de Vreede
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the Free
+* Software Foundation; either version 2 of the License, or (at your option)
+* any later version.
+*
+* This program is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* for more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program; if not, write to the Free Software Foundation, Inc., 59
+* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "stdafx.h"
+#include "webview.h"
+
+int Startingup = 1;
+int AlreadyDownloading = 0;
+
+/*******************/
+void GetData(void *param)
+{
+ MCONTACT hContact = (DWORD_PTR)param;
+ int statpos = 0, dispos = 0, statposend = 0;
+ char*pos;
+ DBVARIANT dbv;
+ char tempstring[300], tempstring2[300];
+ int MallocSize = 0;
+ int DownloadSuccess = 0;
+ char*raw;
+ char truncated[MAXSIZE1];
+ char truncated2[MAXSIZE2];
+ int trunccount = 0;
+ char url[300];
+ unsigned long downloadsize = 0;
+ int AmountWspcRem = 0;
+ static char contactname[100];
+ int TherewasAlert = 0;
+ int PosButnClick = 0;
+ char tstr[128];
+ static char timestring[128];
+ int eventIndex = 0;
+ int location = 0;
+ int location2 = 0;
+
+ if (Startingup)
+ Sleep(2000);
+
+ HWND hwndDlg = (WindowList_Find(hWindowList, hContact));
+
+ Startingup = 0;
+
+ memset(&url, 0, sizeof(url));
+ memset(&contactname, 0, sizeof(contactname));
+ memset(&tempstring, 0, sizeof(tempstring));
+ memset(&tempstring2, 0, sizeof(tempstring2));
+ memset(&dbv, 0, sizeof(dbv));
+ memset(&tstr, 0, sizeof(tstr));
+ memset(&timestring, 0, sizeof(timestring));
+
+ g_plugin.setByte(hContact, STOP_KEY, 0);
+
+ if (g_plugin.getString(hContact, PRESERVE_NAME_KEY, &dbv)) {
+ if (!db_get_s(hContact, "CList", "MyHandle", &dbv)) {
+ g_plugin.setString(hContact, PRESERVE_NAME_KEY, dbv.pszVal);
+ db_free(&dbv);
+ }
+ }
+
+ if (!g_plugin.getString(hContact, PRESERVE_NAME_KEY, &dbv)) {
+ strncpy_s(contactname, _countof(contactname), dbv.pszVal, _TRUNCATE);
+ db_free(&dbv);
+ }
+
+ url[0] = '\0';
+
+ if (!Startingup)
+ g_plugin.setByte(HAS_CRASHED_KEY, 1);
+
+ if (!g_plugin.getString(hContact, START_STRING_KEY, &dbv)) {
+ strncpy_s(tempstring, _countof(tempstring), dbv.pszVal, _TRUNCATE);
+ db_free(&dbv);
+ }
+
+ if (!g_plugin.getString(hContact, END_STRING_KEY, &dbv)) {
+ strncpy_s(tempstring2, _countof(tempstring2), dbv.pszVal, _TRUNCATE);
+ db_free(&dbv);
+ }
+
+ if (!g_plugin.getString(hContact, URL_KEY, &dbv)) {
+ strncpy_s(url, _countof(url), dbv.pszVal, _TRUNCATE);
+ db_free(&dbv);
+ }
+
+ if (mir_strlen(url) < 3)
+ WErrorPopup(hContact, TranslateT("URL not supplied"));
+
+ NETLIBHTTPREQUEST nlhr = { sizeof(nlhr) };
+ nlhr.requestType = REQUEST_GET;
+ nlhr.flags = NLHRF_DUMPASTEXT;
+ nlhr.szUrl = url;
+ nlhr.headersCount = 2;
+
+ NETLIBHTTPHEADER headers[2];
+ headers[0].szName = "User-Agent";
+ headers[0].szValue = NETLIB_USER_AGENT;
+
+ headers[1].szName = "Content-Length";
+ headers[1].szValue = nullptr;
+
+ nlhr.headers = headers;
+
+ if ( g_plugin.getByte(NO_PROTECT_KEY, 0)) // disable
+ AlreadyDownloading = 0;
+
+ // //try site////
+ if (!AlreadyDownloading) { // not already downloading
+ if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_UPDATE_BUTTON)))
+ PosButnClick = 0;
+ else
+ PosButnClick = 1;
+ EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE_BUTTON), 1);
+
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Download in progress, please wait..."));
+ db_set_ws(hContact, "CList", "StatusMsg", TranslateT("Updating..."));
+ g_plugin.setWord(hContact, "Status", ID_STATUS_DND); // download
+
+ NETLIBHTTPREQUEST *nlhrReply = Netlib_HttpTransaction(hNetlibUser, &nlhr);
+ if (nlhrReply) {
+ if (nlhrReply->resultCode < 200 || nlhrReply->resultCode >= 300) {
+ g_plugin.setWord(hContact, "Status", ID_STATUS_AWAY);
+
+ wchar_t *statusText = TranslateT("The server replied with a failure code");
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, statusText);
+ WErrorPopup(hContact, statusText);
+ db_set_ws(hContact, "CList", "StatusMsg", statusText);
+ }
+ if (nlhrReply->dataLength) {
+ trunccount = 0;
+ downloadsize = (ULONG)mir_strlen(nlhrReply->pData);
+ strncpy_s(truncated2, nlhrReply->pData, _TRUNCATE);
+ AlreadyDownloading = 1;
+ } // END DATELENGTH
+ } // END REPLY
+
+ if (!nlhrReply) {
+ g_plugin.setWord(hContact, "Status", ID_STATUS_NA);
+
+ wchar_t *statusText = TranslateT("The server is down or lagging.");
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, statusText);
+ WErrorPopup(hContact, statusText);
+ db_set_ws(hContact, "CList", "StatusMsg", statusText);
+ }
+
+ if (!(nlhrReply))
+ DownloadSuccess = 0;
+
+ if ((nlhrReply) && (nlhrReply->resultCode < 200 || nlhrReply->resultCode >= 300))
+ DownloadSuccess = 0;
+ else if (nlhrReply)
+ DownloadSuccess = 1;
+
+ Netlib_FreeHttpRequest(nlhrReply);
+
+ if (DownloadSuccess)
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Download successful; about to process data..."));
+
+ // download successful
+ if (DownloadSuccess) {
+ // all the site
+ if (g_plugin.getByte(hContact, U_ALLSITE_KEY, 0) == 1)
+ mir_strncpy(truncated, truncated2, MAXSIZE1);
+ else { // use start and end string
+ // putting data into string
+ if (((strstr(truncated2, tempstring)) != nullptr) && ((strstr(truncated2, tempstring2)) != nullptr)) {
+ // start string
+ pos = strstr(truncated2, tempstring);
+ statpos = pos - truncated2;
+
+ memset(&pos, 0, sizeof(pos)); // XXX: looks bad.
+ // end string
+ pos = strstr(truncated2, tempstring2);
+ statposend = pos - truncated2 + (int)mir_strlen(tempstring2);
+
+ if (statpos > statposend) {
+ memset(&truncated2, ' ', statpos);
+ memset(&pos, 0, sizeof(pos)); // XXX: looks bad.
+ pos = strstr(truncated2, tempstring2);
+ statposend = pos - truncated2 + (int)mir_strlen(tempstring2);
+ }
+ if (statpos < statposend) {
+ memset(&raw, 0, sizeof(raw));
+
+ // get size for malloc
+ MallocSize = statposend - statpos;
+ raw = (char *) malloc(MallocSize + 1);
+
+ // start string
+ pos = strstr(truncated2, tempstring);
+ statpos = pos - truncated2;
+
+ // end string
+ pos = strstr(truncated2, tempstring2);
+ statposend = pos - truncated2 + (int)mir_strlen(tempstring2);
+
+ if (statpos > statposend) {
+ memset(&truncated2, ' ', statpos);
+ memset(&pos, 0, sizeof(pos)); // XXX
+ pos = strstr(truncated2, tempstring2);
+ statposend = pos - truncated2 + (int)mir_strlen(tempstring2);
+ }
+ dispos = 0;
+
+ strncpy(raw, &truncated2[statpos], MallocSize);
+ raw[MallocSize] = '\0';
+
+ trunccount = 0;
+
+ mir_strncpy(truncated, raw, MAXSIZE1);
+
+ free(raw);
+
+ DownloadSuccess = 1;
+ }
+ else if (g_plugin.getByte(hContact, U_ALLSITE_KEY, 0) == 0) {
+ wchar_t *szStatusText = TranslateT("Invalid search parameters.");
+ WErrorPopup(hContact, szStatusText);
+
+ DownloadSuccess = 0;
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, szStatusText);
+ g_plugin.setWord(hContact, "Status", ID_STATUS_AWAY);
+ }
+ } // end putting data into string
+ } // end use start and end strings
+ } // end download success
+
+ if (DownloadSuccess) { // download success
+ if (statpos == 0 && statposend == 0) {
+ if (g_plugin.getByte(hContact, U_ALLSITE_KEY, 0) == 0) {
+ wchar_t *statusText = TranslateT("Both search strings not found or strings not set.");
+ WErrorPopup(hContact, statusText);
+ db_set_ws(hContact, "CList", "StatusMsg", statusText);
+
+ DownloadSuccess = 0;
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, statusText);
+ TherewasAlert = ProcessAlerts(hContact, _T2A(statusText), contactname, contactname, 1);
+ g_plugin.setWord(hContact, "Status", ID_STATUS_AWAY);
+ }
+ }
+ } // end download success
+
+ if (DownloadSuccess) { // download success
+ char timeprefix[32];
+ char temptime1[32];
+ char timeat[16];
+ char temptime2[32];
+ char temptime[128];
+ time_t ftime;
+ struct tm *nTime;
+
+ if (!g_plugin.getString(hContact, PRESERVE_NAME_KEY, &dbv)) {
+ memset(&temptime, 0, sizeof(temptime));
+ memset(&tstr, 0, sizeof(tstr));
+ ftime = time(0);
+ nTime = localtime(&ftime);
+ // 12 hour
+ if (g_plugin.getByte(hContact, USE_24_HOUR_KEY, 0) == 0)
+ strftime(temptime, 128, "(%b %d,%I:%M %p)", nTime);
+ // 24 hour
+ if (g_plugin.getByte(hContact, USE_24_HOUR_KEY, 0) == 1)
+ strftime(temptime, 128, "(%b %d,%H:%M:%S)", nTime);
+
+ if (g_plugin.getByte(hContact, CONTACT_PREFIX_KEY, 1) == 1)
+ mir_snprintf(tstr, "%s %s", temptime, dbv.pszVal);
+ if (g_plugin.getByte(hContact, CONTACT_PREFIX_KEY, 1) == 0)
+ mir_snprintf(tstr, "%s %s", dbv.pszVal, temptime);
+ db_free(&dbv);
+ }
+ else {
+ db_get_ws(hContact, "CList", "MyHandle", &dbv);
+ memset(&temptime, 0, sizeof(temptime));
+ memset(&tstr, 0, sizeof(tstr));
+ ftime = time(0);
+ nTime = localtime(&ftime);
+ // 12 hour
+ if (g_plugin.getByte(hContact, USE_24_HOUR_KEY, 0) == 0)
+ strftime(temptime, 128, "(%b %d,%I:%M %p)", nTime);
+ // 24 hour
+ if (g_plugin.getByte(hContact, USE_24_HOUR_KEY, 0) == 1)
+ strftime(temptime, 128, "(%b %d,%H:%M:%S)", nTime);
+
+ g_plugin.setWString(hContact, PRESERVE_NAME_KEY, dbv.pwszVal);
+ if (g_plugin.getByte(hContact, CONTACT_PREFIX_KEY, 1) == 1)
+ mir_snprintf(tstr, "%s %s", temptime, dbv.pszVal);
+ if (g_plugin.getByte(hContact, CONTACT_PREFIX_KEY, 1) == 0)
+ mir_snprintf(tstr, "%s %s", dbv.pszVal, temptime);
+ db_free(&dbv);
+ }
+
+ ftime = time(0);
+ nTime = localtime(&ftime);
+
+ strncpy_s(timeprefix, _countof(timeprefix), Translate("Last updated on"), _TRUNCATE);
+ strncpy_s(timeat, _countof(timeat), Translate("at the time"), _TRUNCATE);
+ strftime(temptime1, 32, " %a, %b %d, %Y ", nTime);
+ strftime(temptime2, 32, " %I:%M %p.", nTime);
+ mir_snprintf(timestring, " %s %s%s%s", timeprefix, temptime1, timeat, temptime2);
+ } // end download success
+
+ if (DownloadSuccess) {
+ TherewasAlert = ProcessAlerts(hContact, truncated, tstr, contactname, 0);
+
+ // get range of text to be highlighted when part of change changes
+ if (TherewasAlert) {
+ // ////////////////////////
+ static char buff[MAXSIZE1];
+ char Alerttempstring[300], Alerttempstring2[300];
+
+ eventIndex = g_plugin.getByte(hContact, EVNT_INDEX_KEY, 0);
+ if (eventIndex == 2) {
+ strncpy(buff, truncated, _countof(buff));
+ Filter(buff);
+
+ if (!g_plugin.getString(hContact, ALRT_S_STRING_KEY, &dbv)) {
+ strncpy_s(Alerttempstring, _countof(Alerttempstring), dbv.pszVal, _TRUNCATE);
+ db_free(&dbv);
+ }
+ if (!g_plugin.getString(hContact, ALRT_E_STRING_KEY, &dbv)) {
+ strncpy_s(Alerttempstring2, _countof(Alerttempstring2), dbv.pszVal, _TRUNCATE);
+ db_free(&dbv);
+ }
+
+ // putting data into string
+ if (((strstr(buff, Alerttempstring)) != nullptr) && ((strstr(buff, Alerttempstring2)) != nullptr)) {
+ location = (strstr(buff, Alerttempstring)) - buff;
+ location2 = (strstr(buff, Alerttempstring2)) - buff;
+ }
+ }
+ }
+
+ if ((((strstr(truncated2, tempstring)) != nullptr) && ((strstr(truncated2, tempstring2)) != nullptr) && (g_plugin.getByte(hContact, U_ALLSITE_KEY, 0) == 0)) || (g_plugin.getByte(hContact, U_ALLSITE_KEY, 0) == 1)) {
+ RemoveTabs(truncated);
+
+ if ( g_plugin.getByte(hContact, CLEAR_DISPLAY_KEY, 0)) {
+ SendToRichEdit(hwndDlg, truncated, TextClr, BackgoundClr);
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Processing data (Stage 1)"));
+
+ if (g_plugin.getByte(hContact, STOP_KEY, 1) == 1) {
+LBL_Stop: wchar_t *statusText = TranslateT("Processing data stopped by user.");
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, statusText);
+ g_plugin.setByte(hContact, STOP_KEY, 0);
+ g_plugin.setWord(hContact, "Status", ID_STATUS_ONLINE);
+ db_set_ws(hContact, "CList", "StatusMsg", statusText);
+ AlreadyDownloading = 0;
+ return;
+ }
+
+ CodetoSymbol(truncated);
+ Sleep(100); // avoid 100% CPU
+
+ SendToRichEdit(hwndDlg, truncated, TextClr, BackgoundClr);
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Processing data (Stage 2)"));
+ if (g_plugin.getByte(hContact, STOP_KEY, 1) == 1)
+ goto LBL_Stop;
+
+ EraseBlock(truncated);
+ Sleep(100); // avoid 100% CPU
+
+ SendToRichEdit(hwndDlg, truncated, TextClr, BackgoundClr);
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Processing data (Stage 3)"));
+ if (g_plugin.getByte(hContact, STOP_KEY, 1) == 1)
+ goto LBL_Stop;
+
+ FastTagFilter(truncated);
+ Sleep(100); // avoid 100% CPU
+
+ SendToRichEdit(hwndDlg, truncated, TextClr, BackgoundClr);
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Processing data (Stage 4)"));
+ if (g_plugin.getByte(hContact, STOP_KEY, 1) == 1)
+ goto LBL_Stop;
+
+ NumSymbols(truncated);
+ Sleep(100); // avoid 100% CPU
+
+ SendToRichEdit(hwndDlg, truncated, TextClr, BackgoundClr);
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Processing data (Stage 5)"));
+ if (g_plugin.getByte(hContact, STOP_KEY, 1) == 1)
+ goto LBL_Stop;
+
+ EraseSymbols(truncated);
+ Sleep(100); // avoid 100% CPU
+
+ SendToRichEdit(hwndDlg, truncated, TextClr, BackgoundClr);
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Processing data (Stage 6)"));
+
+ AmountWspcRem = g_plugin.getByte(hContact, RWSPACE_KEY, 0);
+ if (g_plugin.getByte(hContact, STOP_KEY, 1) == 1)
+ goto LBL_Stop;
+
+ RemoveInvis(truncated, AmountWspcRem);
+ Sleep(100); // avoid 100% CPU
+
+ SendToRichEdit(hwndDlg, truncated, TextClr, BackgoundClr);
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Processing data (Stage 7)"));
+ if (g_plugin.getByte(hContact, STOP_KEY, 1) == 1)
+ goto LBL_Stop;
+
+ Removewhitespace(truncated);
+
+ SendToRichEdit(hwndDlg, truncated, TextClr, BackgoundClr);
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Processing data (Stage 8)"));
+
+ //data in popup
+ if (TherewasAlert)
+ if ( g_plugin.getByte(DATA_POPUP_KEY, 0))
+ WAlertPopup(hContact, _A2T(truncated));
+
+ if (g_plugin.getByte(hContact, STOP_KEY, 1) == 1)
+ goto LBL_Stop;
+
+ // removed any excess characters at the end.
+ if ((truncated[mir_strlen(truncated) - 1] == truncated[mir_strlen(truncated) - 2]) && (truncated[mir_strlen(truncated) - 2] == truncated[mir_strlen(truncated) - 3])) {
+ int counterx = 0;
+
+ while (true) {
+ counterx++;
+ if (truncated[mir_strlen(truncated) - counterx] != truncated[mir_strlen(truncated) - 1]) {
+ truncated[(mir_strlen(truncated) - counterx) + 2] = '\0';
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (TherewasAlert) {
+ g_plugin.setWord(hContact, "Status", ID_STATUS_OCCUPIED);
+ db_set_ws(hContact, "CList", "StatusMsg", TranslateT("Alert!"));
+ }
+ else {
+ g_plugin.setWord(hContact, "Status", ID_STATUS_ONLINE);
+ db_set_ws(hContact, "CList", "StatusMsg", TranslateT("Online"));
+ }
+ }
+
+ if (g_plugin.getByte(hContact, U_ALLSITE_KEY, 0) == 0) {
+ if (statpos > statposend)
+ DownloadSuccess = 0;
+ else if (statpos == 0 && statposend == 0)
+ DownloadSuccess = 0;
+ else
+ DownloadSuccess = 1;
+ }
+
+ AlreadyDownloading = 0;
+ } // end not already downloading
+
+ if (AlreadyDownloading)
+ SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("A site is already downloading, try again in a moment."));
+
+ if (DownloadSuccess) { // download success
+ char BytesString[128];
+
+ // update window if the update only on alert option isn't ticked or
+ // there was an alert or the update button was clicked
+ if ((!(g_plugin.getByte(UPDATE_ONALERT_KEY, 0))) || (TherewasAlert == 1) || (PosButnClick == 1)) {
+ SendToRichEdit(hwndDlg, truncated, TextClr, BackgoundClr);
+
+ if (TherewasAlert) {
+ // highlight text when part of change changes
+ if (eventIndex == 2) {
+ CHARRANGE sel2 = {location, location2};
+
+ SendDlgItemMessage(hwndDlg, IDC_DATA, EM_EXSETSEL, 0, (LPARAM)&sel2);
+ SetFocus(GetDlgItem(hwndDlg, IDC_DATA));
+
+ DWORD HiBackgoundClr = g_plugin.getDword(BG_COLOR_KEY, Def_color_bg);
+ DWORD HiTextClr = g_plugin.getDword(TXT_COLOR_KEY, Def_color_txt);
+
+ CHARFORMAT2 Format;
+ memset(&Format, 0, sizeof(Format));
+ Format.cbSize = sizeof(Format);
+ Format.dwMask = CFM_BOLD | CFM_COLOR | CFM_BACKCOLOR;
+ Format.dwEffects = CFE_BOLD;
+ Format.crBackColor = ((~HiBackgoundClr) & 0x00ffffff);
+ Format.crTextColor = ((~HiTextClr) & 0x00ffffff);
+ SendDlgItemMessage(hwndDlg, IDC_DATA, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&Format);
+ }
+ }
+
+ SetDlgItemTextA(hwndDlg, IDC_STATUSBAR, timestring);
+ sprintf(BytesString, "%s: %d | %s: %lu", (Translate("Bytes in display")), (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_DATA))), (Translate("Bytes downloaded")), downloadsize);
+
+ SendDlgItemMessage(hwndDlg, IDC_STATUSBAR, SB_SETTEXT, 1, (LPARAM)BytesString);
+ }
+ else SetDlgItemText(hwndDlg, IDC_STATUSBAR, TranslateT("Alert test conditions not met; press the refresh button to view content."));
+ }
+ EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE_BUTTON), 1);
+
+ if (!Startingup)
+ g_plugin.setByte(HAS_CRASHED_KEY, 0);
+}
diff --git a/protocols/WebView/src/webview_opts.cpp b/protocols/WebView/src/webview_opts.cpp
new file mode 100644
index 0000000000..0c51759b42
--- /dev/null
+++ b/protocols/WebView/src/webview_opts.cpp
@@ -0,0 +1,1265 @@
+/*
+* A plugin for Miranda IM which displays web page text in a window
+* Copyright (C) 2005 Vincent Joyce.
+*
+* Miranda IM: the free icq client for MS Windows Copyright (C) 2000-2
+* Richard Hughes, Roland Rabien & Tristan Van de Vreede
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the Free
+* Software Foundation; either version 2 of the License, or (at your option)
+* any later version.
+*
+* This program is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* for more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program; if not, write to the Free Software Foundation, Inc., 59
+* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "stdafx.h"
+#include "webview.h"
+
+const wchar_t *szTrackerBarDescr[] = {
+ LPGENW("No whitespace removal"),
+ LPGENW("Minimal level of whitespace removal"),
+ LPGENW("Medium level of whitespace removal"),
+ LPGENW("Large level of whitespace removal"),
+ LPGENW("Remove all whitespace")
+};
+
+static char *fontSizes[] = { "8", "10", "14", "16", "18", "20", "24", "28" };
+static wchar_t *AlertTypes[] = { LPGENW("Popup plugin"), LPGENW("Log to file"), LPGENW("Open data display window"), LPGENW("Use OSD plugin") };
+static wchar_t *EventTypes[] = { LPGENW("A string is present"), LPGENW("The web page changes"), LPGENW("A specific part of web page changes") };
+
+#define M_FILLSCRIPTCOMBO (WM_USER+16)
+
+wchar_t* FixButtonText(wchar_t *url, size_t len)
+{
+ wchar_t buttontext[256], stringbefore[256], newbuttontext[256];
+ wcsncpy_s(buttontext, url, _TRUNCATE);
+ wcsncpy_s(newbuttontext, url, _TRUNCATE);
+
+ if (wcschr(newbuttontext, '&') != nullptr) {
+ while (true) {
+ if (wcschr(newbuttontext, '&') == nullptr)
+ break;
+
+ wcsncpy_s(buttontext, newbuttontext, _TRUNCATE);
+ wchar_t *stringafter = wcschr(buttontext, '&');
+ int pos = (stringafter - buttontext);
+ int posbefore = (stringafter - buttontext) - 1;
+ int posafter = (stringafter - buttontext) + 1;
+ strdelw(stringafter, 1);
+ wcsncpy_s(stringbefore, pos, buttontext, _TRUNCATE);
+ mir_snwprintf(newbuttontext, L"%s!!%s", stringbefore, stringafter);
+
+ posafter = 0;
+ posbefore = 0;
+ }
+
+ while (true) {
+ if (wcschr(newbuttontext, '!') != nullptr) {
+ wchar_t *stringafter = wcschr(newbuttontext, '!');
+ int pos = (stringafter - newbuttontext);
+ newbuttontext[pos] = '&';
+ }
+ if (wcschr(newbuttontext, '!') == nullptr)
+ break;
+ }
+ }
+
+ wcsncpy_s(url, len, newbuttontext, _TRUNCATE);
+ return url;
+}
+
+/*****************************************************************************/
+static int CALLBACK EnumFontScriptsProc(ENUMLOGFONTEX * lpelfe, NEWTEXTMETRICEX*, int, LPARAM lParam)
+{
+ if (SendMessage((HWND)lParam, CB_FINDSTRINGEXACT, -1, (LPARAM)lpelfe->elfScript) == CB_ERR) {
+ int i = SendMessage((HWND)lParam, CB_ADDSTRING, 0, (LPARAM)lpelfe->elfScript);
+
+ SendMessage((HWND)lParam, CB_SETITEMDATA, i, lpelfe->elfLogFont.lfCharSet);
+ }
+ return TRUE;
+}
+
+/*****************************************************************************/
+// copied and modified from NewStatusNotify
+INT_PTR CALLBACK DlgPopUpOpts(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+
+ char str[512];
+ DWORD BGColour = 0;
+ DWORD TextColour = 0;
+ DWORD delay = 0;
+ static int test = 0;
+
+ switch (msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hdlg);
+
+ delay = g_plugin.getDword(POP_DELAY_KEY, 0);
+
+ // setting popup delay option
+ _itoa(delay, str, 10);
+ SetDlgItemTextA(hdlg, IDC_DELAY, str);
+
+ BGColour = g_plugin.getDword(POP_BG_CLR_KEY, Def_color_bg);
+ TextColour = g_plugin.getDword(POP_TXT_CLR_KEY, Def_color_txt);
+
+ // Colours. First step is configuring the colours.
+ SendDlgItemMessage(hdlg, IDC_POP_BGCOLOUR, CPM_SETCOLOUR, 0, BGColour);
+ SendDlgItemMessage(hdlg, IDC_POP_TEXTCOLOUR, CPM_SETCOLOUR, 0, TextColour);
+ // Second step is disabling them if we want to use default Windows
+ // ones.
+ CheckDlgButton(hdlg, IDC_POP_USEWINCOLORS, g_plugin.getByte(POP_USEWINCLRS_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hdlg, IDC_POP_USESAMECOLORS, g_plugin.getByte(POP_USESAMECLRS_KEY, 1) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hdlg, IDC_POP_USECUSTCOLORS, g_plugin.getByte(POP_USECUSTCLRS_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+
+ if (IsDlgButtonChecked(hdlg, IDC_POP_USEWINCOLORS) || IsDlgButtonChecked(hdlg, IDC_POP_USESAMECOLORS)) {
+ EnableWindow(GetDlgItem(hdlg, IDC_POP_BGCOLOUR), 0);
+ EnableWindow(GetDlgItem(hdlg, IDC_POP_TEXTCOLOUR), 0);
+ }
+
+ CheckDlgButton(hdlg, IDC_LCLK_WINDOW, g_plugin.getByte(LCLK_WINDOW_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hdlg, IDC_LCLK_WEB_PGE, g_plugin.getByte(LCLK_WEB_PGE_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hdlg, IDC_LCLK_DISMISS, g_plugin.getByte(LCLK_DISMISS_KEY, 1) ? BST_CHECKED : BST_UNCHECKED);
+
+ CheckDlgButton(hdlg, IDC_RCLK_WINDOW, g_plugin.getByte(RCLK_WINDOW_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hdlg, IDC_RCLK_WEB_PGE, g_plugin.getByte(RCLK_WEB_PGE_KEY, 1) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hdlg, IDC_RCLK_DISMISS, g_plugin.getByte(RCLK_DISMISS_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ return TRUE;
+
+ case WM_COMMAND:
+ // enable the "apply" button
+ if (HIWORD(wParam) == BN_CLICKED && GetFocus() == (HWND)lParam)
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ // These are simple clicks: we don't save, but we tell the Options Page
+ // to enable the "Apply" button.
+ switch (LOWORD(wParam)) {
+ case IDC_POP_BGCOLOUR: // Fall through
+ case IDC_POP_TEXTCOLOUR:
+ // select new colors
+ if (HIWORD(wParam) == CPN_COLOURCHANGED)
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case IDC_POP_USESAMECOLORS:
+ // use same color as data window - enable/disable color selection
+ // controls
+ EnableWindow(GetDlgItem(hdlg, IDC_POP_BGCOLOUR), !((BYTE)IsDlgButtonChecked(hdlg, IDC_POP_USESAMECOLORS)));
+ EnableWindow(GetDlgItem(hdlg, IDC_POP_TEXTCOLOUR), !((BYTE)IsDlgButtonChecked(hdlg, IDC_POP_USESAMECOLORS)));
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case IDC_POP_USEWINCOLORS:
+ // use window color - enable/disable color selection controls
+ EnableWindow(GetDlgItem(hdlg, IDC_POP_BGCOLOUR), !((BYTE)IsDlgButtonChecked(hdlg, IDC_POP_USEWINCOLORS)));
+ EnableWindow(GetDlgItem(hdlg, IDC_POP_TEXTCOLOUR), !((BYTE)IsDlgButtonChecked(hdlg, IDC_POP_USEWINCOLORS)));
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case IDC_POP_USECUSTCOLORS:
+ EnableWindow(GetDlgItem(hdlg, IDC_POP_BGCOLOUR), ((BYTE)IsDlgButtonChecked(hdlg, IDC_POP_USECUSTCOLORS)));
+ EnableWindow(GetDlgItem(hdlg, IDC_POP_TEXTCOLOUR), ((BYTE)IsDlgButtonChecked(hdlg, IDC_POP_USECUSTCOLORS)));
+ break;
+
+ case IDC_PD1:
+ SetDlgItemText(hdlg, IDC_DELAY, L"0");
+ break;
+ case IDC_PD2:
+ // Popup delay = permanent
+ SetDlgItemText(hdlg, IDC_DELAY, L"-1");
+ break;
+
+ case IDC_DELAY:
+ if (HIWORD(wParam) == EN_CHANGE)
+ test++;
+ if (test > 1) {
+ //CheckRadioButton(hdlg, IDC_PD1, IDC_PD3, IDC_PD3);
+ SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0);
+ }
+ break;
+
+ case IDC_PREVIEW:
+ wchar_t str3[512];
+ POPUPDATAW ppd = { 0 };
+
+ GetDlgItemText(hdlg, IDC_DELAY, str3, _countof(str3));
+
+ if (IsDlgButtonChecked(hdlg, IDC_POP_USECUSTCOLORS)) {
+ BGColour = (SendDlgItemMessage(hdlg, IDC_POP_BGCOLOUR, CPM_GETCOLOUR, 0, 0));
+ TextColour = (SendDlgItemMessage(hdlg, IDC_POP_TEXTCOLOUR, CPM_GETCOLOUR, 0, 0));
+ }
+ if (IsDlgButtonChecked(hdlg, IDC_POP_USEWINCOLORS)) {
+ BGColour = GetSysColor(COLOR_BTNFACE);
+ TextColour = GetSysColor(COLOR_WINDOWTEXT);
+ }
+ if (IsDlgButtonChecked(hdlg, IDC_POP_USESAMECOLORS)) {
+ BGColour = BackgoundClr;
+ TextColour = TextClr;
+ }
+ ppd.lchContact = NULL;
+ mir_wstrcpy(ppd.lpwzContactName, _A2W(MODULENAME));
+ ppd.lchIcon = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_SITE));
+ mir_wstrcpy(ppd.lpwzText, TranslateT("This is a preview popup."));
+ ppd.colorBack = BGColour;
+ ppd.colorText = TextColour;
+ ppd.PluginWindowProc = nullptr;
+ ppd.iSeconds = _wtol(str3);
+ // display popups
+ PUAddPopupW(&ppd);
+ }
+ break;
+
+ case WM_NOTIFY: // Here we have pressed either the OK or the APPLY button.
+ switch (((LPNMHDR)lParam)->code) {
+ case PSN_APPLY:
+ int popupdelayval = 0;
+ wchar_t str2[512];
+ GetDlgItemText(hdlg, IDC_DELAY, str2, _countof(str2));
+
+ popupdelayval = _wtol(str2);
+ g_plugin.setDword(POP_DELAY_KEY, popupdelayval);
+
+ g_plugin.setByte(LCLK_WINDOW_KEY, (BYTE)IsDlgButtonChecked(hdlg, IDC_LCLK_WINDOW));
+ g_plugin.setByte(LCLK_WEB_PGE_KEY, (BYTE)IsDlgButtonChecked(hdlg, IDC_LCLK_WEB_PGE));
+ g_plugin.setByte(LCLK_DISMISS_KEY, (BYTE)IsDlgButtonChecked(hdlg, IDC_LCLK_DISMISS));
+
+ g_plugin.setByte(RCLK_WINDOW_KEY, (BYTE)IsDlgButtonChecked(hdlg, IDC_RCLK_WINDOW));
+ g_plugin.setByte(RCLK_WEB_PGE_KEY, (BYTE)IsDlgButtonChecked(hdlg, IDC_RCLK_WEB_PGE));
+ g_plugin.setByte(RCLK_DISMISS_KEY, (BYTE)IsDlgButtonChecked(hdlg, IDC_RCLK_DISMISS));
+
+ g_plugin.setByte(POP_USECUSTCLRS_KEY, (BYTE)IsDlgButtonChecked(hdlg, IDC_POP_USECUSTCOLORS));
+ g_plugin.setByte(POP_USEWINCLRS_KEY, (BYTE)IsDlgButtonChecked(hdlg, IDC_POP_USEWINCOLORS));
+ g_plugin.setByte(POP_USESAMECLRS_KEY, (BYTE)IsDlgButtonChecked(hdlg, IDC_POP_USESAMECOLORS));
+
+ BGColour = (SendDlgItemMessage(hdlg, IDC_POP_BGCOLOUR, CPM_GETCOLOUR, 0, 0));
+ TextColour = (SendDlgItemMessage(hdlg, IDC_POP_TEXTCOLOUR, CPM_GETCOLOUR, 0, 0));
+
+ g_plugin.setDword(POP_BG_CLR_KEY, BGColour);
+ g_plugin.setDword(POP_TXT_CLR_KEY, TextColour);
+
+ test = 0;
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+/*****************************************************************************/
+INT_PTR CALLBACK DlgProcAlertOpt(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ HWND ParentHwnd;
+ DBVARIANT dbv;
+ int i;
+ int alertIndex = 0;
+ int eventIndex = 0;
+ static int test;
+ MCONTACT hContact;
+
+ ParentHwnd = GetParent(hwndDlg);
+
+ switch (msg) {
+ case WM_INITDIALOG:
+ test = 0;
+ TranslateDialogDefault(hwndDlg);
+ hContact = lParam;
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
+
+ SetWindowText(hwndDlg, TranslateT("Alert options"));
+
+ SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_ALERT)));
+
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 0);
+
+ if (!g_plugin.getWString(hContact, ALERT_STRING_KEY, &dbv)) {
+ SetDlgItemText(hwndDlg, IDC_ALERT_STRING, dbv.pwszVal);
+ db_free(&dbv);
+ }
+ if (!g_plugin.getWString(hContact, ALRT_S_STRING_KEY, &dbv)) {
+ SetDlgItemText(hwndDlg, IDC_START2, dbv.pwszVal);
+ db_free(&dbv);
+ }
+ if (!g_plugin.getWString(hContact, ALRT_E_STRING_KEY, &dbv)) {
+ SetDlgItemText(hwndDlg, IDC_END2, dbv.pwszVal);
+ db_free(&dbv);
+ }
+ CheckDlgButton(hwndDlg, IDC_ENABLE_ALERTS, g_plugin.getByte(hContact, ENABLE_ALERTS_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_ADD_DATE_NAME, g_plugin.getByte(hContact, APND_DATE_NAME_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_24_HOUR, g_plugin.getByte(hContact, USE_24_HOUR_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_ALWAYS_LOG, g_plugin.getByte(hContact, ALWAYS_LOG_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+
+ SetDlgItemText(hwndDlg, IDC_ALERT_TYPE, TranslateW(AlertTypes[g_plugin.getByte(hContact, ALRT_INDEX_KEY, 0)]));
+ SetDlgItemText(hwndDlg, IDC_EVENT_TYPE, TranslateW(EventTypes[g_plugin.getByte(hContact, EVNT_INDEX_KEY, 0)]));
+
+ for (i = 0; i < _countof(AlertTypes); i++)
+ SendDlgItemMessage(hwndDlg, IDC_ALERT_TYPE, CB_ADDSTRING, 0, (LPARAM)TranslateW(AlertTypes[i]));
+
+ for (i = 0; i < _countof(EventTypes); i++)
+ SendDlgItemMessage(hwndDlg, IDC_EVENT_TYPE, CB_ADDSTRING, 0, (LPARAM)TranslateW(EventTypes[i]));
+
+ if (g_plugin.getByte(hContact, ENABLE_ALERTS_KEY, 0)) {
+ CheckDlgButton(hwndDlg, IDC_ENABLE_ALERTS, BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_ADD_DATE_NAME, BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_24_HOUR, BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_PREFIX, BST_UNCHECKED);
+ }
+ EnableWindow(GetDlgItem(hwndDlg, IDC_EVENT_TYPE), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ADD_DATE_NAME), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+
+ if (IsDlgButtonChecked(hwndDlg, IDC_ADD_DATE_NAME)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_PREFIX), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SUFFIX), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_24_HOUR), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ }
+ else {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_PREFIX), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SUFFIX), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_24_HOUR), 0);
+ }
+
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_TYPE), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START2), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END2), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALWAYS_LOG), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+
+ if (!g_plugin.getString(hContact, EVNT_INDEX_KEY, &dbv)) {
+ eventIndex = g_plugin.getByte(hContact, EVNT_INDEX_KEY, 0);
+ db_free(&dbv);
+ }
+ if (!g_plugin.getString(hContact, ALRT_INDEX_KEY, &dbv)) {
+ alertIndex = g_plugin.getByte(hContact, ALRT_INDEX_KEY, 0);
+ db_free(&dbv);
+ }
+
+ // alerts
+ if (alertIndex == 0) // Popup
+ {
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 0);
+ }
+ }
+ else if (alertIndex == 1) // file
+ {
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 1);
+ }
+ }
+ else if (alertIndex == 2) // datawindow
+ {
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 0);
+ }
+ }
+ else if (alertIndex == 3) // osd
+ {
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 0);
+ }
+ }
+
+ // events
+ if (eventIndex == 0) // string is present
+ {
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START2), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END2), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), 1);
+ }
+ }
+ else if (eventIndex == 1) // webpage changed
+ {
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START2), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END2), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), 0);
+ }
+ }
+ else if (eventIndex == 2) // part of page changed
+ {
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START2), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END2), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), 0);
+ }
+ }
+
+ if (!g_plugin.getWString(hContact, FILE_KEY, &dbv)) {
+ SetDlgItemText(hwndDlg, IDC_FILENAME, dbv.pwszVal);
+ db_free(&dbv);
+ }
+
+ CheckDlgButton(hwndDlg, IDC_APPEND, g_plugin.getByte(hContact, APPEND_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_SAVE_AS_RAW, g_plugin.getByte(hContact, SAVE_AS_RAW_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+
+ if (g_plugin.getByte(hContact, CONTACT_PREFIX_KEY, 1) == 1)
+ CheckRadioButton(hwndDlg, IDC_PREFIX, IDC_SUFFIX, IDC_PREFIX);
+ else
+ CheckRadioButton(hwndDlg, IDC_PREFIX, IDC_SUFFIX, IDC_SUFFIX);
+
+ if (g_plugin.getByte(hContact, ALWAYS_LOG_KEY, 0)) {
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 1);
+ }
+ }
+ return TRUE;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam)) {
+ case IDC_BROWSE:
+ {
+ wchar_t szFileName[MAX_PATH];
+ GetDlgItemText(hwndDlg, IDC_FILENAME, szFileName, _countof(szFileName));
+
+ OPENFILENAME ofn = { 0 };
+ ofn.lStructSize = sizeof(ofn);
+ ofn.hwndOwner = hwndDlg;
+ ofn.hInstance = nullptr;
+ ofn.lpstrFilter = L"TEXT Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";
+ ofn.lpstrFile = szFileName;
+ ofn.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
+ ofn.nMaxFile = _countof(szFileName);
+ ofn.nMaxFileTitle = MAX_PATH;
+ ofn.lpstrDefExt = L"txt";
+ if (!GetSaveFileName(&ofn))
+ break;
+
+ SetDlgItemText(hwndDlg, IDC_FILENAME, szFileName);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 1);
+ }
+ break;
+
+ case IDC_ADD_DATE_NAME:
+ EnableWindow(GetDlgItem(hwndDlg, IDC_PREFIX), (IsDlgButtonChecked(hwndDlg, IDC_ADD_DATE_NAME)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SUFFIX), (IsDlgButtonChecked(hwndDlg, IDC_ADD_DATE_NAME)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_24_HOUR), (IsDlgButtonChecked(hwndDlg, IDC_ADD_DATE_NAME)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 1);
+ break;
+
+ case IDC_24_HOUR:
+ case IDC_SUFFIX:
+ case IDC_PREFIX:
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 1);
+ break;
+
+ case IDC_ALERT_STRING:
+ if (HIWORD(wParam) == EN_CHANGE)
+ test++;
+ if (test > 1)
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 1);
+ break;
+
+ case IDC_START2:
+ case IDC_END2:
+ if (HIWORD(wParam) == EN_CHANGE)
+ test++;
+ if (test > 3)
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 1);
+ break;
+
+ case IDC_APPEND:
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 1);
+ break;
+
+ case IDC_SAVE_AS_RAW:
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 1);
+ break;
+
+ case IDC_ENABLE_ALERTS:
+ hContact = (MCONTACT)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ADD_DATE_NAME), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+
+ if (IsDlgButtonChecked(hwndDlg, IDC_ADD_DATE_NAME)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_PREFIX), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SUFFIX), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_24_HOUR), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ }
+ else {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_PREFIX), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SUFFIX), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_24_HOUR), 0);
+ }
+
+ EnableWindow(GetDlgItem(hwndDlg, IDC_EVENT_TYPE), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_TYPE), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALWAYS_LOG), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+
+ eventIndex = g_plugin.getByte(hContact, EVNT_INDEX_KEY, 0);
+ alertIndex = g_plugin.getByte(hContact, ALRT_INDEX_KEY, 0);
+
+ if (eventIndex == 2) { // part of webpage changed
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START2), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END2), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ }
+ else {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START2), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END2), 0);
+ }
+
+ // ////////
+ if (alertIndex == 0) { // popup
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 0);
+
+ if (eventIndex == 2) // part of webpage changed
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), 0);
+ if (eventIndex == 1) // webpage changed
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), 0);
+ if (eventIndex == 0) // string present
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ }
+ }
+ else if (alertIndex == 1) { // log to file
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 1);
+
+ if (eventIndex == 1) // webpage changed
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), 0);
+ if (eventIndex == 0) // string present
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ }
+ else {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 0);
+ }
+ }
+ else if (alertIndex == 2) { // display window
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 0);
+
+ if (eventIndex == 1) // webpage changed
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), 0);
+ if (eventIndex == 0) // string present
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ }
+ }
+ else if (alertIndex == 3) { // osd
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 0);
+
+ if (eventIndex == 1) // webpage changed
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), 0);
+ if (eventIndex == 0) // string present
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+ }
+ }
+
+ if (eventIndex == 0) // string present
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)));
+
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 1);
+
+ if (IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG)) {
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 1);
+ }
+ else {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 0);
+ }
+ }
+ break;
+
+ case IDC_ALWAYS_LOG:
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), (IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), (IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), (IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), (IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG)));
+ break;
+
+ case IDC_ALERT_TYPE:
+ if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE) {
+ hContact = (MCONTACT)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+ alertIndex = SendDlgItemMessage(hwndDlg, IDC_ALERT_TYPE, CB_GETCURSEL, 0, 0);
+
+ if (HIWORD(wParam) == CBN_SELCHANGE) {
+ g_plugin.setByte(hContact, ALRT_INDEX_KEY, alertIndex);
+ if (alertIndex == 0) {
+ // PopUp
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 0);
+ }
+ else if (alertIndex == 1) {
+ // log to file
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 1);
+ }
+ else if (alertIndex == 2) {
+ // data window
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 0);
+ }
+ else if (alertIndex == 3) {
+ // OSD
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), 0);
+ }
+
+ if (IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_APPEND), (IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), (IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), (IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVE_AS_RAW), (IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG)));
+ }
+ }
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 1);
+ }
+ break;
+
+ case IDC_EVENT_TYPE:
+ if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE) {
+ hContact = (MCONTACT)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+ eventIndex = SendDlgItemMessage(hwndDlg, IDC_EVENT_TYPE, CB_GETCURSEL, 0, 0);
+
+ if (HIWORD(wParam) == CBN_SELCHANGE) {
+ g_plugin.setByte(hContact, EVNT_INDEX_KEY, eventIndex);
+ if (eventIndex == 0) {
+ // event when string is present
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START2), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END2), 0);
+ }
+ else if (eventIndex == 1) {
+ // event when web page changes
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START2), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END2), 0);
+ }
+ else if (eventIndex == 2) {
+ // event when part of web page changes
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_STRING), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START2), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END2), 1);
+ }
+ }
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 1);
+ }
+ break;
+
+ case IDC_ALERT_APPLY:
+ case IDC_OK2:
+ {
+ hContact = (MCONTACT)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+
+ eventIndex = g_plugin.getByte(hContact, EVNT_INDEX_KEY, 0);
+ alertIndex = g_plugin.getByte(hContact, ALRT_INDEX_KEY, 0);
+
+ g_plugin.setByte(hContact, ENABLE_ALERTS_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS));
+ g_plugin.setByte(hContact, APND_DATE_NAME_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_ADD_DATE_NAME));
+ g_plugin.setByte(hContact, USE_24_HOUR_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_24_HOUR));
+ g_plugin.setByte(hContact, ALWAYS_LOG_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG));
+
+ //if alerts is unticked delete the cache
+ if (!(IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)))
+ SiteDeleted(hContact, 0);
+
+ if (eventIndex == 0) // string present
+ if (!(GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ALERT_STRING))))
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ MessageBox(nullptr, TranslateT("You need to supply a search string."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+
+ if (eventIndex == 2) // part of web page changed
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ if (!(GetWindowTextLength(GetDlgItem(hwndDlg, IDC_START2)))) {
+ MessageBox(nullptr, TranslateT("You need to supply a start string."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ if (!(GetWindowTextLength(GetDlgItem(hwndDlg, IDC_END2)))) {
+ MessageBox(nullptr, TranslateT("You need to supply an end string."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ }
+
+ if (alertIndex == 1) // log to file
+ if (!(GetWindowTextLength(GetDlgItem(hwndDlg, IDC_FILENAME))))
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ MessageBox(nullptr, TranslateT("You need to supply a file name and path."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+
+ if (IsDlgButtonChecked(hwndDlg, IDC_ALWAYS_LOG))
+ if (!(GetWindowTextLength(GetDlgItem(hwndDlg, IDC_FILENAME))))
+ if (IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ALERTS)) {
+ MessageBox(nullptr, TranslateT("You need to supply a file name and path."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+
+ wchar_t buf[MAX_PATH];
+ GetDlgItemText(hwndDlg, IDC_FILENAME, buf, _countof(buf));
+ g_plugin.setWString(hContact, FILE_KEY, buf);
+
+ g_plugin.setByte(hContact, APPEND_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_APPEND));
+ g_plugin.setByte(hContact, SAVE_AS_RAW_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_SAVE_AS_RAW));
+
+ GetDlgItemText(hwndDlg, IDC_ALERT_STRING, buf, _countof(buf));
+ g_plugin.setWString(hContact, ALERT_STRING_KEY, buf);
+
+ GetDlgItemText(hwndDlg, IDC_START2, buf, _countof(buf));
+ g_plugin.setWString(hContact, ALRT_S_STRING_KEY, buf);
+
+ GetDlgItemText(hwndDlg, IDC_END2, buf, _countof(buf));
+ g_plugin.setWString(hContact, ALRT_E_STRING_KEY, buf);
+
+ g_plugin.setByte(hContact, CONTACT_PREFIX_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_PREFIX));
+
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_APPLY), 0);
+
+ if (LOWORD(wParam) == IDC_OK2)
+ EndDialog(hwndDlg, 1);
+ }
+ break;
+
+ case IDC_ALERT_CANCEL:
+ case IDC_CANCEL:
+ EndDialog(hwndDlg, 0);
+ }
+ }
+ return FALSE;
+}
+
+/*****************************************************************************/
+
+INT_PTR CALLBACK DlgProcContactOpt(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ DBVARIANT dbv;
+ wchar_t url[300];
+ HWND ParentHwnd = GetParent(hwndDlg);
+ static int test;
+ static int test2;
+ MCONTACT hContact;
+
+ switch (msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+
+ hContact = (MCONTACT)lParam;
+
+ test = 0;
+ test2 = 0;
+
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)hContact);
+
+ SetWindowText(hwndDlg, TranslateT("Contact options"));
+
+ SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_OPTIONS)));
+
+ EnableWindow(GetDlgItem(hwndDlg, IDC_OPT_APPLY), 0);
+
+ if (!g_plugin.getWString(hContact, URL_KEY, &dbv)) {
+ SetDlgItemText(hwndDlg, IDC_URL, dbv.pwszVal);
+ db_free(&dbv);
+ }
+ if (!g_plugin.getWString(hContact, START_STRING_KEY, &dbv)) {
+ SetDlgItemText(hwndDlg, IDC_START, dbv.pwszVal);
+ db_free(&dbv);
+ }
+ if (!g_plugin.getWString(hContact, END_STRING_KEY, &dbv)) {
+ SetDlgItemText(hwndDlg, IDC_END, dbv.pwszVal);
+ db_free(&dbv);
+ }
+ if (g_plugin.getWString(hContact, PRESERVE_NAME_KEY, &dbv)) {
+ db_free(&dbv);
+ db_get_ws(hContact, "CList", "MyHandle", &dbv);
+ g_plugin.setWString(hContact, PRESERVE_NAME_KEY, dbv.pwszVal);
+ db_free(&dbv);
+ }
+ if (!g_plugin.getWString(hContact, PRESERVE_NAME_KEY, &dbv)) {
+ SetDlgItemText(hwndDlg, IDC_SITE_NAME, dbv.pwszVal);
+ db_free(&dbv);
+ }
+
+ CheckDlgButton(hwndDlg, IDC_CLEAN, g_plugin.getByte(hContact, CLEAR_DISPLAY_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+
+ SendDlgItemMessage(hwndDlg, IDC_RWSPACE, TBM_SETRANGE, FALSE, MAKELONG(0, 4));
+ SendDlgItemMessage(hwndDlg, IDC_RWSPACE, TBM_SETPOS, TRUE, g_plugin.getByte(hContact, RWSPACE_KEY, 0));
+ SetDlgItemText(hwndDlg, IDC_RWSPC_TEXT, TranslateW(szTrackerBarDescr[SendDlgItemMessage(hwndDlg, IDC_RWSPACE, TBM_GETPOS, 0, 0)]));
+
+ EnableWindow(GetDlgItem(hwndDlg, IDC_RWSPACE), (IsDlgButtonChecked(hwndDlg, IDC_CLEAN)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_RWSPC_TEXT), (IsDlgButtonChecked(hwndDlg, IDC_CLEAN)));
+
+ if (g_plugin.getByte(hContact, DBLE_WIN_KEY, 1) == 1)
+ CheckRadioButton(hwndDlg, IDC_DBLE_WEB, IDC_DBLE_WIN, IDC_DBLE_WIN);
+ else
+ CheckRadioButton(hwndDlg, IDC_DBLE_WEB, IDC_DBLE_WIN, IDC_DBLE_WEB);
+
+ if (g_plugin.getByte(hContact, U_ALLSITE_KEY, 0) == 1) {
+ CheckRadioButton(hwndDlg, IDC_U_SE_STRINGS, IDC_U_ALLSITE, IDC_U_ALLSITE);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CPY_STRINGS), 0);
+ }
+ else {
+ CheckRadioButton(hwndDlg, IDC_U_SE_STRINGS, IDC_U_ALLSITE, IDC_U_SE_STRINGS);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CPY_STRINGS), 1);
+ //EnableWindow(GetDlgItem(hwndDlg, IDC_CPY_STR_TXT), 1);
+ }
+ break;
+
+ case WM_HSCROLL:
+ SetDlgItemText(hwndDlg, IDC_RWSPC_TEXT, TranslateW(szTrackerBarDescr[SendDlgItemMessage(hwndDlg, IDC_RWSPACE, TBM_GETPOS, 0, 0)]));
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_OPT_APPLY), 1);
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam)) {
+ case WM_CLOSE:
+ case IDCANCEL:
+ if (hwndDlg) {
+ DestroyWindow(hwndDlg);
+ hwndDlg = nullptr;
+ }
+ return TRUE;
+
+ case IDC_SITE_NAME:
+ case IDC_URL:
+ if (HIWORD(wParam) == EN_CHANGE)
+ test++;
+ if (test > 2)
+ EnableWindow(GetDlgItem(hwndDlg, IDC_OPT_APPLY), 1);
+ break;
+
+ case IDC_DBLE_WEB:
+ case IDC_DBLE_WIN:
+ EnableWindow(GetDlgItem(hwndDlg, IDC_OPT_APPLY), 1);
+ break;
+
+ case IDC_START:
+ case IDC_END:
+ if (HIWORD(wParam) == EN_CHANGE)
+ test2++;
+ if (test2 > 2)
+ EnableWindow(GetDlgItem(hwndDlg, IDC_OPT_APPLY), 1);
+ break;
+
+ case IDC_CPY_STRINGS:
+ {
+ wchar_t string[128];
+ hContact = (MCONTACT)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+
+ GetDlgItemText(hwndDlg, IDC_START, string, _countof(string));
+ g_plugin.setWString(hContact, ALRT_S_STRING_KEY, string);
+
+ GetDlgItemText(hwndDlg, IDC_END, string, _countof(string));
+ g_plugin.setWString(hContact, ALRT_E_STRING_KEY, string);
+
+ g_plugin.setWord(hContact, EVNT_INDEX_KEY, 2);
+ }
+ break;
+
+ case IDC_CLEAN:
+ EnableWindow(GetDlgItem(hwndDlg, IDC_RWSPACE), (IsDlgButtonChecked(hwndDlg, IDC_CLEAN)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_RWSPC_TEXT), (IsDlgButtonChecked(hwndDlg, IDC_CLEAN)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_OPT_APPLY), 1);
+ break;
+
+ case IDC_U_SE_STRINGS:
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START), (IsDlgButtonChecked(hwndDlg, IDC_U_SE_STRINGS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END), (IsDlgButtonChecked(hwndDlg, IDC_U_SE_STRINGS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CPY_STRINGS), (IsDlgButtonChecked(hwndDlg, IDC_U_SE_STRINGS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_OPT_APPLY), 1);
+ break;
+
+ case IDC_U_ALLSITE:
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START), (IsDlgButtonChecked(hwndDlg, IDC_U_SE_STRINGS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_END), (IsDlgButtonChecked(hwndDlg, IDC_U_SE_STRINGS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CPY_STRINGS), (IsDlgButtonChecked(hwndDlg, IDC_U_SE_STRINGS)));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_OPT_APPLY), 1);
+ break;
+
+ case IDC_OPT_APPLY:
+ case IDOK:
+ {
+ wchar_t str[128], contactname[128];
+ if (!GetWindowTextLength(GetDlgItem(hwndDlg, IDC_URL))) {
+ MessageBox(nullptr, TranslateT("You need to supply a URL."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ if (!GetWindowTextLength(GetDlgItem(hwndDlg, IDC_START))) {
+ if (IsDlgButtonChecked(hwndDlg, IDC_U_SE_STRINGS)) {
+ MessageBox(nullptr, TranslateT("You need to supply a start string."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ }
+ if (!GetWindowTextLength(GetDlgItem(hwndDlg, IDC_END))) {
+ if (IsDlgButtonChecked(hwndDlg, IDC_U_SE_STRINGS)) {
+ MessageBox(nullptr, TranslateT("You need to supply an end string."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ }
+ if (!GetWindowTextLength(GetDlgItem(hwndDlg, IDC_SITE_NAME))) {
+ MessageBox(nullptr, TranslateT("You need to supply a name for the contact."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+
+ GetDlgItemText(hwndDlg, IDC_SITE_NAME, contactname, _countof(contactname));
+ if (wcschr(contactname, '\\') != nullptr) {
+ MessageBox(nullptr, TranslateT("Invalid symbol present in contact name."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ if (wcschr(contactname, '/') != nullptr) {
+ MessageBox(nullptr, TranslateT("Invalid symbol present in contact name."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ if (wcschr(contactname, ':') != nullptr) {
+ MessageBox(nullptr, TranslateT("Invalid symbol present in contact name."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ if (wcschr(contactname, '*') != nullptr) {
+ MessageBox(nullptr, TranslateT("Invalid symbol present in contact name."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ if (wcschr(contactname, '?') != nullptr) {
+ MessageBox(nullptr, TranslateT("Invalid symbol present in contact name."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ if (wcschr(contactname, '\"') != nullptr) {
+ MessageBox(nullptr, TranslateT("Invalid symbol present in contact name."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ if (wcschr(contactname, '<') != nullptr) {
+ MessageBox(nullptr, TranslateT("Invalid symbol present in contact name."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ if (wcschr(contactname, '>') != nullptr) {
+ MessageBox(nullptr, TranslateT("Invalid symbol present in contact name."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+ if (wcschr(contactname, '|') != nullptr) {
+ MessageBox(nullptr, TranslateT("Invalid symbol present in contact name."), _A2W(MODULENAME), MB_OK);
+ break;
+ }
+
+ hContact = (MCONTACT)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+
+ GetDlgItemText(hwndDlg, IDC_URL, url, _countof(url));
+ g_plugin.setWString(hContact, URL_KEY, url);
+ g_plugin.setWString(hContact, "Homepage", url);
+
+ GetDlgItemText(hwndDlg, IDC_START, str, _countof(str));
+ g_plugin.setWString(hContact, START_STRING_KEY, str);
+
+ GetDlgItemText(hwndDlg, IDC_END, str, _countof(str));
+ g_plugin.setWString(hContact, END_STRING_KEY, str);
+
+ GetDlgItemText(hwndDlg, IDC_SITE_NAME, str, _countof(str));
+ db_set_ws(hContact, "CList", "MyHandle", str);
+
+ g_plugin.setByte(hContact, DBLE_WIN_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_DBLE_WIN));
+ g_plugin.setByte(hContact, U_ALLSITE_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_U_ALLSITE));
+
+ g_plugin.setByte(hContact, CLEAR_DISPLAY_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_CLEAN));
+ g_plugin.setByte(hContact, RWSPACE_KEY, (BYTE)(SendDlgItemMessage(hwndDlg, IDC_RWSPACE, TBM_GETPOS, 0, 0)));
+
+ SetDlgItemText(ParentHwnd, IDC_OPEN_URL, FixButtonText(url, _countof(url)));
+
+ SetWindowText(ParentHwnd, str);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_OPT_APPLY), 0);
+
+ if (LOWORD(wParam) == IDOK)
+ EndDialog(hwndDlg, 1);
+ }
+ break;
+
+ case IDC_OPT_CANCEL:
+ EndDialog(hwndDlg, 0);
+ }
+ break;
+ }
+ return FALSE;
+}
+
+/*****************************************************************************/
+INT_PTR CALLBACK DlgProcOpt(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ DWORD timerval, delaytime, oldcolor;
+ DBVARIANT dbv;
+ static int test = 0;
+ static int test2 = 0;
+
+ switch (uMsg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ {
+ test = 0;
+
+ SendDlgItemMessage(hwndDlg, IDC_SPIN1, UDM_SETRANGE, 0, MAKELONG(999, 0));
+ SendDlgItemMessage(hwndDlg, IDC_SPIN2, UDM_SETRANGE, 0, MAKELONG(120, 0));
+
+ SetDlgItemInt(hwndDlg, IDC_TIME, g_plugin.getDword(REFRESH_KEY, TIME), FALSE);
+ SetDlgItemInt(hwndDlg, IDC_START_DELAY, g_plugin.getWord(START_DELAY_KEY, 0), FALSE);
+
+ mir_forkthread(FillFontListThread, hwndDlg);
+
+ CheckDlgButton(hwndDlg, IDC_DISABLEMENU, g_plugin.getByte(MENU_OFF, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_SUPPRESS, g_plugin.getByte(SUPPRESS_ERR_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_UPDATE_ONSTART, g_plugin.getByte(UPDATE_ONSTART_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_UPDATE_ON_OPEN, g_plugin.getByte(UPDATE_ON_OPEN_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_HIDE_STATUS_ICON, g_plugin.getByte(HIDE_STATUS_ICON_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_FONT_BOLD, g_plugin.getByte(FONT_BOLD_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_FONT_ITALIC, g_plugin.getByte(FONT_ITALIC_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_FONT_UNDERLINE, g_plugin.getByte(FONT_UNDERLINE_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_ERROR_POPUP, g_plugin.getByte(ERROR_POPUP_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_UPDATE_ONALERT, g_plugin.getByte(UPDATE_ONALERT_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_SAVE_INDIVID_POS, g_plugin.getByte(SAVE_INDIVID_POS_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_NO_PROTECT, g_plugin.getByte(NO_PROTECT_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_DATAPOPUP, g_plugin.getByte(DATA_POPUP_KEY, 0) ? BST_CHECKED : BST_UNCHECKED);
+
+ if (!g_plugin.getWString(FONT_FACE_KEY, &dbv)) {
+ SetDlgItemText(hwndDlg, IDC_TYPEFACE, dbv.pwszVal);
+ db_free(&dbv);
+ }
+ else SetDlgItemText(hwndDlg, IDC_TYPEFACE, Def_font_face);
+
+ for (int i = 0; i < _countof(fontSizes); i++)
+ SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_ADDSTRING, 0, (LPARAM)fontSizes[i]);
+
+ SendMessage(hwndDlg, M_FILLSCRIPTCOMBO, wParam, 0);
+
+ SetDlgItemInt(hwndDlg, IDC_FONTSIZE, g_plugin.getByte(FONT_SIZE_KEY, 14), FALSE);
+
+ EnableWindow(GetDlgItem(hwndDlg, IDC_FIND_BUTTON), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_BUTTON), 0);
+
+ SendDlgItemMessage(hwndDlg, IDC_BGCOLOR, CPM_SETCOLOUR, 0, (BackgoundClr));
+ SendDlgItemMessage(hwndDlg, IDC_TXTCOLOR, CPM_SETCOLOUR, 0, (TextClr));
+
+ /*
+ * record bg value for later comparison
+ */
+ oldcolor = BackgoundClr;
+
+ if (g_plugin.getByte(SUPPRESS_ERR_KEY, 0)) {
+ CheckDlgButton(hwndDlg, IDC_SUPPRESS, BST_CHECKED);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ERROR_POPUP), 0);
+ }
+ else {
+ CheckDlgButton(hwndDlg, IDC_SUPPRESS, BST_UNCHECKED);
+ if ((ServiceExists(MS_POPUP_ADDPOPUPW) != 0))
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ERROR_POPUP), 1);
+ }
+
+ if (ServiceExists(MS_POPUP_ADDPOPUPW) == 0)
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ERROR_POPUP), 0);
+
+ if (g_plugin.getByte(UPDATE_ONSTART_KEY, 0)) {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START_DELAY), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SPIN2), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_STARTDELAYTXT), 1);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_STDELAYSECTXT), 1);
+ }
+ else {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START_DELAY), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SPIN2), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_STARTDELAYTXT), 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_STDELAYSECTXT), 0);
+ }
+ }
+ break;
+
+ case M_FILLSCRIPTCOMBO: // fill the script combo box and set the
+ // selection to the value for fontid wParam
+
+ {
+ LOGFONT lf = { 0 };
+ int i;
+ HDC hdc = GetDC(hwndDlg);
+
+ lf.lfCharSet = DEFAULT_CHARSET;
+ GetDlgItemText(hwndDlg, IDC_TYPEFACE, lf.lfFaceName, _countof(lf.lfFaceName));
+ lf.lfPitchAndFamily = 0;
+ SendDlgItemMessage(hwndDlg, IDC_SCRIPT, CB_RESETCONTENT, 0, 0);
+ EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumFontScriptsProc, (LPARAM)GetDlgItem(hwndDlg, IDC_SCRIPT), 0);
+ ReleaseDC(hwndDlg, hdc);
+ for (i = SendDlgItemMessage(hwndDlg, IDC_SCRIPT, CB_GETCOUNT, 0, 0) - 1; i >= 0; i--) {
+ if (SendDlgItemMessage(hwndDlg, IDC_SCRIPT, CB_GETITEMDATA, i, 0) == (BYTE)((g_plugin.getByte(FONT_SCRIPT_KEY, 0)))) {
+ SendDlgItemMessage(hwndDlg, IDC_SCRIPT, CB_SETCURSEL, i, 0);
+ break;
+ }
+ }
+ if (i < 0)
+ SendDlgItemMessage(hwndDlg, IDC_SCRIPT, CB_SETCURSEL, 0, 0);
+ }
+ break;
+
+ case WM_COMMAND:
+ if (HIWORD(wParam) == BN_CLICKED && GetFocus() == (HWND)lParam)
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+
+ switch (LOWORD(wParam)) {
+ case IDC_TXTCOLOR:
+ TextClr = SendDlgItemMessage(hwndDlg, IDC_TXTCOLOR, CPM_GETCOLOUR, 0, 0);
+ g_plugin.setDword(TXT_COLOR_KEY, TextClr);
+ if (HIWORD(wParam) == CPN_COLOURCHANGED) {
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ TxtclrLoop();
+ }
+ break;
+
+ case IDC_BGCOLOR:
+ BackgoundClr = SendDlgItemMessage(hwndDlg, IDC_BGCOLOR, CPM_GETCOLOUR, 0, 0);
+ g_plugin.setDword(BG_COLOR_KEY, BackgoundClr);
+ if (HIWORD(wParam) == CPN_COLOURCHANGED) {
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ BGclrLoop();
+ }
+ break;
+
+ case IDC_HIDE_STATUS_ICON:
+ ShowWindow(GetDlgItem(hwndDlg, IDC_RESTART), SW_SHOW);
+ break;
+
+ case IDC_SUPPRESS:
+ if ((ServiceExists(MS_POPUP_ADDPOPUPW) != 0))
+ EnableWindow(GetDlgItem(hwndDlg, IDC_ERROR_POPUP), (!(IsDlgButtonChecked(hwndDlg, IDC_SUPPRESS))));
+ break;
+
+ case IDC_UPDATE_ONSTART:
+ EnableWindow(GetDlgItem(hwndDlg, IDC_START_DELAY), ((IsDlgButtonChecked(hwndDlg, IDC_UPDATE_ONSTART))));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SPIN2), ((IsDlgButtonChecked(hwndDlg, IDC_UPDATE_ONSTART))));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_STARTDELAYTXT), ((IsDlgButtonChecked(hwndDlg, IDC_UPDATE_ONSTART))));
+ EnableWindow(GetDlgItem(hwndDlg, IDC_STDELAYSECTXT), ((IsDlgButtonChecked(hwndDlg, IDC_UPDATE_ONSTART))));
+ break;
+
+ case IDC_DISABLEMENU:
+ ShowWindow(GetDlgItem(hwndDlg, IDC_RESTART), SW_SHOW);
+ break;
+
+ case IDC_TYPEFACE:
+ SendMessage(hwndDlg, M_FILLSCRIPTCOMBO, wParam, 0);
+ case IDC_FONTSIZE:
+ case IDC_SCRIPT:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case IDC_START_DELAY:
+ if (HIWORD(wParam) == EN_CHANGE)
+ test++;
+ if (test > 1)
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case IDC_TIME:
+ if (HIWORD(wParam) == EN_CHANGE)
+ test2++;
+ if (test2 > 2)
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ } // end WM_COMMAND
+ break;
+
+ case WM_DESTROY:
+ test = 0;
+ test2 = 0;
+ break;
+
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->code) {
+ case PSN_APPLY:
+ g_plugin.setByte(MENU_OFF, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_DISABLEMENU));
+ g_plugin.setByte(SUPPRESS_ERR_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_SUPPRESS));
+ g_plugin.setByte(UPDATE_ONSTART_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_UPDATE_ONSTART));
+ g_plugin.setByte(UPDATE_ON_OPEN_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_UPDATE_ON_OPEN));
+ g_plugin.setByte(HIDE_STATUS_ICON_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_HIDE_STATUS_ICON));
+ g_plugin.setByte(FONT_BOLD_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_FONT_BOLD));
+ g_plugin.setByte(FONT_ITALIC_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_FONT_ITALIC));
+ g_plugin.setByte(FONT_UNDERLINE_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_FONT_UNDERLINE));
+ g_plugin.setByte(UPDATE_ONALERT_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_UPDATE_ONALERT));
+ g_plugin.setByte(SAVE_INDIVID_POS_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_SAVE_INDIVID_POS));
+ g_plugin.setByte(NO_PROTECT_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_NO_PROTECT));
+ g_plugin.setByte(DATA_POPUP_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_DATAPOPUP));
+
+ wchar_t str[100];
+ GetDlgItemText(hwndDlg, IDC_TYPEFACE, str, _countof(str));
+ g_plugin.setWString(FONT_FACE_KEY, str);
+
+ g_plugin.setByte(FONT_SIZE_KEY, (GetDlgItemInt(hwndDlg, IDC_FONTSIZE, nullptr, FALSE)));
+ g_plugin.setByte(FONT_SCRIPT_KEY, ((BYTE)SendDlgItemMessage(hwndDlg, IDC_SCRIPT, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_SCRIPT, CB_GETCURSEL, 0, 0), 0)));
+
+ g_plugin.setByte(ERROR_POPUP_KEY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_ERROR_POPUP));
+
+ timerval = GetDlgItemInt(hwndDlg, IDC_TIME, nullptr, FALSE);
+ g_plugin.setDword(REFRESH_KEY, timerval);
+ g_plugin.setDword(COUNTDOWN_KEY, timerval);
+
+
+ delaytime = GetDlgItemInt(hwndDlg, IDC_START_DELAY, nullptr, FALSE);
+ g_plugin.setDword(START_DELAY_KEY, delaytime);
+
+ BackgoundClr = (SendDlgItemMessage(hwndDlg, IDC_BGCOLOR, CPM_GETCOLOUR, 0, 0));
+ TextClr = (SendDlgItemMessage(hwndDlg, IDC_TXTCOLOR, CPM_GETCOLOUR, 0, 0));
+
+ if ((g_plugin.getDword(REFRESH_KEY, 0) != 0)) {
+ KillTimer(nullptr, timerId);
+ KillTimer(nullptr, Countdown);
+ timerId = SetTimer(nullptr, 0, ((g_plugin.getDword(REFRESH_KEY, 0)) * MINUTE), timerfunc);
+ Countdown = SetTimer(nullptr, 0, MINUTE, Countdownfunc);
+ }
+ if ((g_plugin.getDword(REFRESH_KEY, 0) == 0)) {
+ KillTimer(nullptr, timerId);
+ KillTimer(nullptr, Countdown);
+ }
+ test = 0;
+ }
+ break; // end apply
+ }
+
+ return 0;
+}
diff --git a/protocols/WebView/src/webview_services.cpp b/protocols/WebView/src/webview_services.cpp
new file mode 100644
index 0000000000..4957120181
--- /dev/null
+++ b/protocols/WebView/src/webview_services.cpp
@@ -0,0 +1,458 @@
+/*
+* A plugin for Miranda IM which displays web page text in a window Copyright
+* (C) 2005 Vincent Joyce.
+*
+* Miranda IM: the free icq client for MS Windows Copyright (C) 2000-2
+* Richard Hughes, Roland Rabien & Tristan Van de Vreede
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the Free
+* Software Foundation; either version 2 of the License, or (at your option)
+* any later version.
+*
+* This program is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* for more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program; if not, write to the Free Software Foundation, Inc., 59
+* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "stdafx.h"
+#include "webview.h"
+
+static int searchId = -1;
+
+/*****************************************************************************/
+static char szInvalidChars[] = { '\\', '/', ':', '*', '?', '\"', '<', '>', '|' };
+
+int DBSettingChanged(WPARAM wParam, LPARAM lParam)
+{
+ // We can't upload changes to NULL contact
+ MCONTACT hContact = wParam;
+ if (hContact == NULL)
+ return 0;
+
+ DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING *)lParam;
+ if (!strcmp(cws->szModule, "CList")) {
+ int invalidpresent = 0;
+
+ char *szProto = GetContactProto(hContact);
+ if (szProto == nullptr || strcmp(szProto, MODULENAME))
+ return 0;
+
+ // A contact is renamed
+ if (!strcmp(cws->szSetting, "MyHandle")) {
+ ptrW oldName(g_plugin.getWStringA(hContact, PRESERVE_NAME_KEY));
+ if (oldName == NULL)
+ return 0;
+
+ wchar_t nick[100];
+ ptrW oldnick(db_get_wsa(hContact, "CList", "MyHandle"));
+ if (oldnick != NULL)
+ wcsncpy_s(nick, oldnick, _TRUNCATE);
+ else
+ nick[0] = 0;
+
+ for (int i = 0; i < _countof(szInvalidChars); i++) {
+ wchar_t *p = wcschr(nick, szInvalidChars[i]);
+ if (p != nullptr) {
+ WErrorPopup((UINT_PTR)"ERROR", TranslateT("Invalid symbol present in contact name."));
+ *p = '_';
+ invalidpresent = 1;
+ }
+ }
+
+ if (invalidpresent) {
+ srand((unsigned)time(0));
+ wchar_t ranStr[7];
+ _itow((int)10000 * rand() / (RAND_MAX + 1.0), ranStr, 10);
+ mir_wstrcat(nick, ranStr);
+ }
+
+ if (wcschr(nick, '(') == nullptr) {
+ g_plugin.setWString(hContact, PRESERVE_NAME_KEY, nick);
+ g_plugin.setWString(hContact, "Nick", nick);
+ db_set_ws(hContact, "CList", "MyHandle", nick);
+ }
+
+ // TEST GET NAME FOR CACHE
+ wchar_t cachepath[MAX_PATH], cachedirectorypath[MAX_PATH];
+ GetModuleFileName(g_plugin.getInst(), cachepath, _countof(cachepath));
+ wchar_t *cacheend = wcsrchr(cachepath, '\\');
+ cacheend++;
+ *cacheend = '\0';
+ mir_snwprintf(cachedirectorypath, L"%s" _A2W(MODULENAME) L"cache\\", cachepath);
+ CreateDirectory(cachedirectorypath, nullptr);
+
+ wchar_t newcachepath[MAX_PATH + 50], renamedcachepath[MAX_PATH + 50];
+ mir_snwprintf(newcachepath, L"%s" _A2W(MODULENAME) L"cache\\%s.txt", cachepath, oldName);
+ mir_snwprintf(renamedcachepath, L"%s" _A2W(MODULENAME) L"cache\\%s.txt", cachepath, nick);
+
+ // file exists?
+ if (_waccess(newcachepath, 0) != -1) {
+ FILE *pcachefile = _wfopen(newcachepath, L"r");
+ if (pcachefile != nullptr) {
+ fclose(pcachefile);
+ if (mir_wstrcmp(newcachepath, renamedcachepath)) {
+ MoveFile(newcachepath, renamedcachepath);
+ g_plugin.setWString(hContact, CACHE_FILE_KEY, renamedcachepath);
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/*****************************************************************************/
+int SiteDeleted(WPARAM wParam, LPARAM)
+{
+ MCONTACT hContact = wParam;
+ if (mir_strcmp(GetContactProto(hContact), MODULENAME))
+ return 0;
+
+ ptrW contactName(g_plugin.getWStringA(hContact, PRESERVE_NAME_KEY));
+
+ // TEST GET NAME FOR CACHE
+ wchar_t cachepath[MAX_PATH], cachedirectorypath[MAX_PATH], newcachepath[MAX_PATH + 50];
+ GetModuleFileName(g_plugin.getInst(), cachepath, _countof(cachepath));
+ wchar_t *cacheend = wcsrchr(cachepath, '\\');
+ cacheend++;
+ *cacheend = '\0';
+
+ mir_snwprintf(cachedirectorypath, L"%s" _A2W(MODULENAME) L"cache\\", cachepath);
+ CreateDirectory(cachedirectorypath, nullptr);
+ mir_snwprintf(newcachepath, L"%s" _A2W(MODULENAME) L"cache\\%s.txt", cachepath, contactName);
+ // file exists?
+ if (_waccess(newcachepath, 0) != -1) {
+ FILE *pcachefile = _wfopen(newcachepath, L"r");
+ if (pcachefile != nullptr) {
+ fclose(pcachefile);
+ DeleteFile(newcachepath);
+ g_plugin.setString(hContact, CACHE_FILE_KEY, "");
+ }
+ }
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR OpenCacheDir(WPARAM, LPARAM)
+{
+ //GET NAME FOR CACHE
+ wchar_t cachepath[MAX_PATH], cachedirectorypath[MAX_PATH];
+ GetModuleFileName(g_plugin.getInst(), cachepath, _countof(cachepath));
+ wchar_t *cacheend = wcsrchr(cachepath, '\\');
+ cacheend++;
+ *cacheend = '\0';
+
+ mir_snwprintf(cachedirectorypath, L"%s" _A2W(MODULENAME) L"cache\\%s", cachepath, cacheend);
+
+ if (_waccess(cachedirectorypath, 0) != 0)
+ WErrorPopup((UINT_PTR)"ERROR", TranslateT("Cache folder does not exist."));
+ else
+ ShellExecute(nullptr, L"open", cachedirectorypath, nullptr, nullptr, SW_SHOWNORMAL);
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR PingWebsiteMenuCommand(WPARAM wParam, LPARAM)
+{
+ FILE *pfile = fopen("psite.bat", "r");
+ if (pfile == nullptr) {
+ WErrorPopup((UINT_PTR)"ERROR", TranslateT("Missing \"psite.bat\" file."));
+ return 0;
+ }
+
+ ptrW url(g_plugin.getWStringA(wParam, "URL"));
+ if (url == NULL)
+ return 0;
+
+ wchar_t Cnick[200], *Oldnick;
+ wcsncpy(Cnick, url, _countof(Cnick));
+ if ((Oldnick = wcsstr(Cnick, L"://")) != nullptr)
+ Oldnick += 3;
+ else
+ Oldnick = Cnick;
+
+ wchar_t *Nend = wcschr(Oldnick, '/');
+ if (Nend) *Nend = '\0';
+
+ ShellExecute(nullptr, L"open", L"psite.bat", Oldnick, nullptr, SW_HIDE);
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR StpPrcssMenuCommand(WPARAM wParam, LPARAM)
+{
+ g_plugin.setByte(wParam, STOP_KEY, 1);
+ return 0;
+}
+
+//=======================================================
+// GetCaps
+// =======================================================
+
+INT_PTR GetCaps(WPARAM wParam, LPARAM)
+{
+ switch (wParam) {
+ case PFLAGNUM_1:
+ return PF1_BASICSEARCH | PF1_ADDSEARCHRES | PF1_VISLIST;
+ case PFLAGNUM_2:
+ return g_plugin.getByte(HIDE_STATUS_ICON_KEY, 0) ? 0 : (PF2_ONLINE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_LIGHTDND | PF2_HEAVYDND);
+ case PFLAGNUM_3:
+ return 0;
+ case PFLAGNUM_4:
+ return PF4_NOCUSTOMAUTH | PF4_NOAUTHDENYREASON;
+ case PFLAGNUM_5:
+ return PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_LIGHTDND | PF2_HEAVYDND | PF2_FREECHAT | PF2_OUTTOLUNCH | PF2_ONTHEPHONE;
+ case PFLAG_UNIQUEIDTEXT:
+ return (INT_PTR)Translate("Site URL");
+ default:
+ return 0;
+ }
+}
+
+// =======================================================
+// GetName
+// =======================================================
+
+INT_PTR GetName(WPARAM wParam, LPARAM lParam)
+{
+ mir_strncpy((char*)lParam, MODULENAME, wParam);
+ return 0;
+}
+
+//=======================================================
+// SetStatus
+// =======================================================
+
+INT_PTR SetStatus(WPARAM wParam, LPARAM)
+{
+ int oldStatus = bpStatus;
+
+ if (wParam == ID_STATUS_ONLINE)
+ wParam = ID_STATUS_ONLINE;
+ else if (wParam == ID_STATUS_OFFLINE)
+ wParam = ID_STATUS_OFFLINE;
+ else
+ wParam = ID_STATUS_ONLINE;
+
+ // broadcast the message
+ bpStatus = wParam;
+
+ ProtoBroadcastAck(MODULENAME, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, wParam);
+
+ // Make sure no contact has offline status for any reason on first time run
+ if (g_plugin.getByte("FirstTime", 100) == 100) {
+ for (auto &hContact : Contacts(MODULENAME))
+ g_plugin.setWord(hContact, "Status", ID_STATUS_ONLINE);
+
+ g_plugin.setByte("FirstTime", 1);
+ }
+
+ g_plugin.setByte(OFFLINE_STATUS, bpStatus == ID_STATUS_OFFLINE);
+ return 0;
+}
+
+//=======================================================
+// GetStatus
+// =======================================================
+
+INT_PTR GetStatus(WPARAM, LPARAM)
+{
+ if (bpStatus == ID_STATUS_ONLINE)
+ return ID_STATUS_ONLINE;
+ if (bpStatus == ID_STATUS_AWAY)
+ return ID_STATUS_AWAY;
+ if (bpStatus == ID_STATUS_NA)
+ return ID_STATUS_NA;
+ if (bpStatus == ID_STATUS_OCCUPIED)
+ return ID_STATUS_OCCUPIED;
+ if (bpStatus == ID_STATUS_DND)
+ return ID_STATUS_DND;
+ return ID_STATUS_OFFLINE;
+}
+
+//=======================================================
+// BPLoadIcon
+// =======================================================
+
+INT_PTR BPLoadIcon(WPARAM wParam, LPARAM)
+{
+ UINT id;
+
+ switch (wParam & 0xFFFF) {
+ case PLI_PROTOCOL:
+ id = IDI_SITE;
+ break;
+ default:
+ return 0;
+ }
+ return (INT_PTR)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(id), IMAGE_ICON,
+ GetSystemMetrics(wParam & PLIF_SMALL ? SM_CXSMICON : SM_CXICON),
+ GetSystemMetrics(wParam & PLIF_SMALL ? SM_CYSMICON : SM_CYICON), 0);
+}
+
+/*****************************************************************************/
+static void __cdecl BasicSearchTimerProc(wchar_t *pszNick)
+{
+ PROTOSEARCHRESULT psr = { sizeof(psr) };
+ psr.flags = PSR_UNICODE;
+ psr.nick.w = pszNick;
+
+ // broadcast the search result
+ ProtoBroadcastAck(MODULENAME, NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)1, (LPARAM)&psr);
+ ProtoBroadcastAck(MODULENAME, NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)1, 0);
+
+ // exit the search
+ searchId = -1;
+ mir_free(pszNick);
+}
+
+INT_PTR BasicSearch(WPARAM, LPARAM lParam)
+{
+ if (searchId != -1)
+ return 0; // only one search at a time
+
+ searchId = 1;
+
+ // create a thread for the ID search
+ mir_forkThread<wchar_t>(BasicSearchTimerProc, mir_wstrdup((const wchar_t*)lParam));
+ return searchId;
+}
+
+/*****************************************************************************/
+INT_PTR AddToList(WPARAM, LPARAM lParam)
+{
+ PROTOSEARCHRESULT *psr = (PROTOSEARCHRESULT *)lParam;
+ DBVARIANT dbv;
+ int sameurl = 0;
+ int samename = 0;
+
+ if (psr == nullptr)
+ return 0;
+ if (psr->nick.w == nullptr) {
+ WErrorPopup((UINT_PTR)"ERROR", TranslateT("Please select site in Find/Add contacts..."));
+ return 0;
+ }
+ // if contact with the same ID was not found, add it
+ if (psr->cbSize != sizeof(PROTOSEARCHRESULT))
+ return NULL;
+ // search for existing contact
+ for (auto &hContact : Contacts(MODULENAME)) {
+ // check ID to see if the contact already exist in the database
+ if (g_plugin.getWString(hContact, "URL", &dbv))
+ continue;
+ if (!mir_wstrcmpi(psr->nick.w, dbv.pwszVal)) {
+ // remove the flag for not on list and hidden, thus make the
+ // contact visible
+ // and add them on the list
+ sameurl++;
+ if (db_get_b(hContact, "CList", "NotOnList", 1)) {
+ db_unset(hContact, "CList", "NotOnList");
+ db_unset(hContact, "CList", "Hidden");
+ }
+ }
+ db_free(&dbv);
+ }
+
+ MCONTACT hContact = db_add_contact();
+ Proto_AddToContact(hContact, MODULENAME);
+
+ /////////write to db
+ g_plugin.setByte(hContact, ON_TOP_KEY, 0);
+ g_plugin.setByte(hContact, DBLE_WIN_KEY, 1);
+ g_plugin.setString(hContact, END_STRING_KEY, "");
+ g_plugin.setByte(hContact, RWSPACE_KEY, 1);
+
+ //Convert url into a name for contact
+ wchar_t Cnick[255];
+ if (psr->nick.w != nullptr)
+ wcsncpy(Cnick, psr->nick.w, _countof(Cnick));
+ else
+ Cnick[0] = 0;
+
+ wchar_t *Oldnick = wcsstr(Cnick, L"://");
+ if (Oldnick != nullptr)
+ Oldnick += 3;
+ else
+ Oldnick = Cnick;
+
+ wchar_t *Newnick = wcsstr(Oldnick, L"www.");
+ if (Newnick != nullptr)
+ Newnick += 4;
+ else {
+ Newnick = wcsstr(Oldnick, L"WWW.");
+ if (Newnick != nullptr)
+ Newnick += 4;
+ else
+ Newnick = Oldnick;
+ }
+
+ wchar_t *Nend = wcschr(Newnick, '.');
+ if (Nend) *Nend = '\0';
+
+ for (auto &hContact2 : Contacts(MODULENAME)) {
+ if (!db_get_ws(hContact2, MODULENAME, PRESERVE_NAME_KEY, &dbv)) {
+ if (!mir_wstrcmpi(Newnick, dbv.pwszVal)) {
+ // remove the flag for not on list and hidden, thus make the
+ // contact visible
+ // and add them on the list
+ samename++;
+ if (db_get_b(hContact2, "CList", "NotOnList", 1)) {
+ db_unset(hContact2, "CList", "NotOnList");
+ db_unset(hContact2, "CList", "Hidden");
+ }
+ db_free(&dbv);
+ }
+ }
+ db_free(&dbv);
+ }
+
+ if ((sameurl > 0) || (samename > 0)) // contact has the same url or name as another contact, add rand num to name
+ {
+ srand((unsigned)time(0));
+
+ wchar_t ranStr[10];
+ _itow((int)10000 * rand() / (RAND_MAX + 1.0), ranStr, 10);
+ mir_wstrcat(Newnick, ranStr);
+ }
+ //end convert
+
+ db_set_ws(hContact, "CList", "MyHandle", Newnick);
+ g_plugin.setWString(hContact, PRESERVE_NAME_KEY, Newnick);
+ g_plugin.setWString(hContact, "Nick", Newnick);
+ g_plugin.setByte(hContact, CLEAR_DISPLAY_KEY, 1);
+ g_plugin.setString(hContact, START_STRING_KEY, "");
+ g_plugin.setWString(hContact, URL_KEY, psr->nick.w);
+ g_plugin.setWString(hContact, "Homepage", psr->nick.w);
+ g_plugin.setByte(hContact, U_ALLSITE_KEY, 1);
+ g_plugin.setWord(hContact, "Status", ID_STATUS_ONLINE);
+
+ // ignore status change
+ db_set_dw(hContact, "Ignore", "Mask", 8);
+
+ Sleep(2);
+
+ db_free(&dbv);
+
+
+ return (INT_PTR)hContact;
+}
+
+/*****************************************************************************/
+
+static void __cdecl AckFunc(void*)
+{
+ for (auto &hContact : Contacts(MODULENAME))
+ ProtoBroadcastAck(MODULENAME, hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE)1, 0);
+}
+
+INT_PTR GetInfo(WPARAM, LPARAM)
+{
+ mir_forkthread(AckFunc);
+ return 1;
+}
diff --git a/protocols/WebView/webview.vcxproj b/protocols/WebView/webview.vcxproj
new file mode 100644
index 0000000000..58927876e7
--- /dev/null
+++ b/protocols/WebView/webview.vcxproj
@@ -0,0 +1,28 @@
+<?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>WebView</ProjectName>
+ <ProjectGuid>{475ED6ED-C311-4188-ACB2-1C41830B22EE}</ProjectGuid>
+ </PropertyGroup>
+ <ImportGroup Label="PropertySheets">
+ <Import Project="$(ProjectDir)..\..\build\vc.common\plugin.props" />
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/protocols/WebView/webview.vcxproj.filters b/protocols/WebView/webview.vcxproj.filters
new file mode 100644
index 0000000000..fcae13a9d8
--- /dev/null
+++ b/protocols/WebView/webview.vcxproj.filters
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(ProjectDir)..\..\build\vc.common\common.filters" />
+</Project> \ No newline at end of file