From 960bb20ccd3c375bcfc8b642fcbe89feaf143b22 Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Mon, 2 Jul 2012 08:36:04 +0000 Subject: only add PasteIt, not adapted git-svn-id: http://svn.miranda-ng.org/main/trunk@712 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/PasteIt/Docs/PasteIt_langpack_polish.txt | 94 +++ plugins/PasteIt/Docs/PasteIt_licence.txt | 340 ++++++++ plugins/PasteIt/Docs/PasteIt_readme.txt | 49 ++ plugins/PasteIt/Docs/PasteIt_translate.txt | 94 +++ plugins/PasteIt/Options.cpp | 979 +++++++++++++++++++++++ plugins/PasteIt/Options.h | 72 ++ plugins/PasteIt/PasteIt.cpp | 596 ++++++++++++++ plugins/PasteIt/PasteIt.rc | 140 ++++ plugins/PasteIt/PasteIt.sln | 26 + plugins/PasteIt/PasteIt.vcxproj | 226 ++++++ plugins/PasteIt/PasteIt.vcxproj.filters | 94 +++ plugins/PasteIt/PasteToWeb.cpp | 577 +++++++++++++ plugins/PasteIt/PasteToWeb.h | 47 ++ plugins/PasteIt/PasteToWeb1.cpp | 393 +++++++++ plugins/PasteIt/PasteToWeb1.h | 40 + plugins/PasteIt/PasteToWeb2.cpp | 247 ++++++ plugins/PasteIt/PasteToWeb2.h | 38 + plugins/PasteIt/dllmain.cpp | 14 + plugins/PasteIt/icons/Paste.ico | Bin 0 -> 2550 bytes plugins/PasteIt/resource.h | 50 ++ plugins/PasteIt/stdafx.cpp | 8 + plugins/PasteIt/stdafx.h | 44 + plugins/PasteIt/targetver.h | 8 + plugins/PasteIt/version.h | 20 + plugins/PasteIt/version.rc | 37 + 25 files changed, 4233 insertions(+) create mode 100644 plugins/PasteIt/Docs/PasteIt_langpack_polish.txt create mode 100644 plugins/PasteIt/Docs/PasteIt_licence.txt create mode 100644 plugins/PasteIt/Docs/PasteIt_readme.txt create mode 100644 plugins/PasteIt/Docs/PasteIt_translate.txt create mode 100644 plugins/PasteIt/Options.cpp create mode 100644 plugins/PasteIt/Options.h create mode 100644 plugins/PasteIt/PasteIt.cpp create mode 100644 plugins/PasteIt/PasteIt.rc create mode 100644 plugins/PasteIt/PasteIt.sln create mode 100644 plugins/PasteIt/PasteIt.vcxproj create mode 100644 plugins/PasteIt/PasteIt.vcxproj.filters create mode 100644 plugins/PasteIt/PasteToWeb.cpp create mode 100644 plugins/PasteIt/PasteToWeb.h create mode 100644 plugins/PasteIt/PasteToWeb1.cpp create mode 100644 plugins/PasteIt/PasteToWeb1.h create mode 100644 plugins/PasteIt/PasteToWeb2.cpp create mode 100644 plugins/PasteIt/PasteToWeb2.h create mode 100644 plugins/PasteIt/dllmain.cpp create mode 100644 plugins/PasteIt/icons/Paste.ico create mode 100644 plugins/PasteIt/resource.h create mode 100644 plugins/PasteIt/stdafx.cpp create mode 100644 plugins/PasteIt/stdafx.h create mode 100644 plugins/PasteIt/targetver.h create mode 100644 plugins/PasteIt/version.h create mode 100644 plugins/PasteIt/version.rc diff --git a/plugins/PasteIt/Docs/PasteIt_langpack_polish.txt b/plugins/PasteIt/Docs/PasteIt_langpack_polish.txt new file mode 100644 index 0000000000..43342a5dfc --- /dev/null +++ b/plugins/PasteIt/Docs/PasteIt_langpack_polish.txt @@ -0,0 +1,94 @@ +;Paste It +;========== + +;To jest tylko częściowe tłumaczenie +;Należy go dodać do końca pliku langpack_polish.txt + +;Main +;------ +[Paste It] +Wklej To +[Uploads the text to web page and sends the URL to your friends.] +Umieszcza tekst na stronie www i wysyła link do twoich przyjaciół. +[Paste It - Select file] +Wklej To - Wybierz plik +[Paste It HTTP connections] +Wklej To połączenia HTTP + +;Error messages +;---------------- +[You've entered invalid codepage. Select codepage from combo box or enter correct number.] +Wprowadziłeś nieprawidłową stronę kodową. Wybierz ją z combo boxa lub wprowadź poprawną liczbę. +[Invalid codepage] +Nieprawidłowa strona kodowa +[You can only paste 1 file] +Możesz wkleić tylko 1 plik +[Cannot get data from clipboard] +Nie można pobrać danych ze schowka +[File size is %dKB, do you realy want to paste such large file?] +Rozmiar pliku wynosi %dKB, napewno chcesz wkleić tak duży plik? +[Cannot read file '%s'] +Nie można wczytać pliku '%s' +[File size is larger then 10MB, cannot be send] +Rozmiar pliku jest większy niż 10MB, nie może zostać wysłany +[Cannot open file '%s'] +Nie można otworzyć pliku '%s' +[File '%s' is empty] +Plik '%s' jest pusty +[Error during sending text to web page: %s] +Błąd podczas wysyłania tekstu do strony www: %s +[Error during sending text to web page] +Błąd podczas wysyłania tekstu do strony www +[Error during getting user key from web page: %s] +Błąd podczas pobierania klucza użytkownika ze strony www: %s + +;Options and Menus +;------------------- +[Paste from clipboard] +Wklej ze schowka +[Paste from file] +Wklej z pliku +[Default web page] +Domyślna strona www +[Default file encoding] +Domyślne kodowanie pliku +[Auto-detect UTF-8] +Auto-wykrywanie UTF-8 +[Show confirmation dialog box] +Pokaż okno potwierdzenia +[Web page settings] +Ustawienia strony www +[Web page to configure] +Strona www do konfiguracji +[Default formatting] +Domyślne formatowanie +[Auto-detect format from file extension] +Auto-wykrywanie formatu z rozszerzenia pliku +[Public paste] +Publiczna wklejka +[Paste expire date] +Data ważności wklejki +[Login as guest] +Zaloguj się jako gość +[User key] +Klucz użytkownika +[Get user key] +Pobierz klucz +[Configure formatting] +Konfiguruj formatowanie +[Download more] +Pobierz więcej +[Login to pastebin.com] +Logowanie do pastebin.com +[Encoding] +Kodowanie +[Recode] +Zmień kodowanie +[10 minutes] +10 munut +[1 hour] +1 godzina +[1 day] +1 dzień +[1 month] +1 miesiąc diff --git a/plugins/PasteIt/Docs/PasteIt_licence.txt b/plugins/PasteIt/Docs/PasteIt_licence.txt new file mode 100644 index 0000000000..7f1161073d --- /dev/null +++ b/plugins/PasteIt/Docs/PasteIt_licence.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. + + + Copyright (C) 19yy + + 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. + + , 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/plugins/PasteIt/Docs/PasteIt_readme.txt b/plugins/PasteIt/Docs/PasteIt_readme.txt new file mode 100644 index 0000000000..86f9f0c468 --- /dev/null +++ b/plugins/PasteIt/Docs/PasteIt_readme.txt @@ -0,0 +1,49 @@ +******** +Paste It +******** + +Description +=========== +Plugin uploads the text to web page and sends the URL to your friend. + +Main features +============= +- pastebin.com and wklej.to support +- paste text from clipboard +- paste file from clipboard +- choosing file using file dialog +- ability to set correct file encoding + +!!! Requirements !!! +==================== +Microsoft Visual C++ 2010 Redistributable Package + +Changelog +========= + +--- 1.0.0.3 --- +* fixed bad decoding characters from clipboard + +--- 1.0.0.2 --- +* increased size of few labels in options + +--- 1.0.0.1 --- +* support chat rooms +* fixed mispelling +* fixed bad decoding characters from clipboard +* increased size of few labels in options + +--- 1.0.0.0 --- ++ pastebin.com and wklej.to support ++ paste text from clipboard ++ paste file from clipboard ++ choosing file using file dialog ++ ability to set correct file encoding + +Author +====== +Krzysztof Kral + +email: programista@poczta.of.pl +www: http://programista.free.of.pl/miranda/ +svn: http://svn3.xp-dev.com/svn/PasteIt/ diff --git a/plugins/PasteIt/Docs/PasteIt_translate.txt b/plugins/PasteIt/Docs/PasteIt_translate.txt new file mode 100644 index 0000000000..02470cc6ff --- /dev/null +++ b/plugins/PasteIt/Docs/PasteIt_translate.txt @@ -0,0 +1,94 @@ +;Paste It +;========== + +;Main +;------ +[Paste It] +[Uploads the text to web page and sends the URL to your friends.] +[All Files (*.*)] +[Paste It - Select file] +[Paste It HTTP connections] + +;Codepages +;----------- +[Use default codepage] +[UTF-8] +[Thai] +[Japanese] +[Simplified Chinese] +[Korean] +[Traditional Chinese] +[Central European] +[Cyrillic] +[Cyrillic KOI8-R] +[Latin I] +[Greek] +[Turkish] +[Hebrew] +[Arabic] +[Baltic] +[Vietnamese] +[Korean (Johab)] +[UTF-7] +[UTF-16] +[UTF-16BE] + +;Error messages +;---------------- +[Error] +[You've entered invalid codepage. Select codepage from combo box or enter correct number.] +[Invalid codepage] +[You can only paste 1 file] +[Cannot get data from clipboard] +[File size is %dKB, do you realy want to paste such large file?] +[Are You sure?] +[Cannot read file '%s'] +[File size is larger then 10MB, cannot be send] +[Cannot open file '%s'] +[File '%s' is empty] +[Error during sending text to web page: %s] +[Error during sending text to web page] +[Error during getting user key from web page: %s] + +;Options and Menus +;------------------- +[Paste from clipboard] +[Paste from file] +[Default web page] +[Services] +[Main] +[Web page] +[Settings] +[Default file encoding] +[Auto-detect UTF-8] +[Show confirmation dialog box] +[Autosend download link to contact] +[Web page settings] +[Web page to configure] +[Configure] +[Default formatting] +[Auto-detect format from file extension] +[Public paste] +[Paste expire date] +[Login as guest] +[User key] +[Get user key] +[Configure formatting] +[OK] +[Cancel] +[Up] +[Down] +[Delete] +[Restore defaults] +[Download more] +[Login to pastebin.com] +[User name] +[Password] +[Format] +[Encoding] +[Recode] +[Never] +[10 minutes] +[1 hour] +[1 day] +[1 month] diff --git a/plugins/PasteIt/Options.cpp b/plugins/PasteIt/Options.cpp new file mode 100644 index 0000000000..799bc27e54 --- /dev/null +++ b/plugins/PasteIt/Options.cpp @@ -0,0 +1,979 @@ +/* +Paste It plugin +Copyright (C) 2011 Krzysztof Kral + +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 . +*/ + +#include "StdAfx.h" +#include "Options.h" +#include "resource.h" +#include "PasteToWeb.h" +#include "PasteToWeb1.h" + +extern HINSTANCE hInst; + +#define MODULE "PasteIt" + +Options *Options::instance; +extern PasteToWeb* pasteToWebs[PasteToWeb::pages]; + +struct TCpTable { + UINT cpId; + TCHAR *cpName; +} +cpTable[] = { + { CP_ACP, _T("Use default codepage") }, + { CP_UTF8, _T("UTF-8") }, + { 874, _T("Thai") }, + { 932, _T("Japanese") }, + { 936, _T("Simplified Chinese") }, + { 949, _T("Korean") }, + { 950, _T("Traditional Chinese") }, + { 1250, _T("Central European") }, + { 1251, _T("Cyrillic") }, + { 20866, _T("Cyrillic KOI8-R") }, + { 1252, _T("Latin I") }, + { 1253, _T("Greek") }, + { 1254, _T("Turkish") }, + { 1255, _T("Hebrew") }, + { 1256, _T("Arabic") }, + { 1257, _T("Baltic") }, + { 1258, _T("Vietnamese") }, + { 1361, _T("Korean (Johab)") }, + { CP_UTF7, _T("UTF-7") }, + { 1200, _T("UTF-16") }, + { 1201, _T("UTF-16BE") } +}; + +Options::Options() +{ + defWeb = 0; + codepage = CP_ACP; + autoUTF = true; + confDlg = true; + autoSend = false; + for(int i = 0 ; i < PasteToWeb::pages; ++i) + { + webOptions[i] = new WebOptions(i); + } +} + + +Options::~Options() +{ + for(int i = 0 ; i < PasteToWeb::pages; ++i) + { + delete webOptions[i]; + webOptions[i] = NULL; + } +} + +void DefWebPageChanged(); + +INT_PTR CALLBACK Options::DlgProcOptsMain(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + CheckDlgButton(hwndDlg, IDC_AUTOUTF, instance->autoUTF ? 1 : 0); + CheckDlgButton(hwndDlg, IDC_CONFDLG, instance->confDlg ? 1 : 0); + CheckDlgButton(hwndDlg, IDC_AUTOSEND, instance->autoSend ? 1 : 0); + + for(int i = 0; i < PasteToWeb::pages; ++i) + { + ComboBox_AddString(GetDlgItem(hwndDlg, IDC_WEBLIST), pasteToWebs[i]->GetName()); + } + + ComboBox_SetCurSel(GetDlgItem(hwndDlg, IDC_WEBLIST), instance->defWeb); + + InitCodepageCB(GetDlgItem(hwndDlg, IDC_CODEPAGE), instance->codepage); + return TRUE; + } + case WM_COMMAND: + { + if(LOWORD(wParam) == IDC_CODEPAGE) + { + if(HIWORD(wParam) == CBN_KILLFOCUS) + { + GetCodepageCB(GetDlgItem(hwndDlg, IDC_CODEPAGE), true, instance->codepage); + } + } + + if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam)==CBN_SELCHANGE || HIWORD(wParam)==CBN_EDITCHANGE) + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + return TRUE; + } + case WM_NOTIFY: + { + if(((LPNMHDR)lParam)->code == PSN_APPLY) + { + instance->codepage = GetCodepageCB(GetDlgItem(hwndDlg, IDC_CODEPAGE), false, instance->codepage); + instance->autoUTF = IsDlgButtonChecked(hwndDlg, IDC_AUTOUTF) ? true : false; + instance->confDlg = IsDlgButtonChecked(hwndDlg, IDC_CONFDLG) ? true : false; + instance->autoSend = IsDlgButtonChecked(hwndDlg, IDC_AUTOSEND) ? true : false; + instance->defWeb = ComboBox_GetCurSel(GetDlgItem(hwndDlg, IDC_WEBLIST)); + + DefWebPageChanged(); + + Options::instance->Save(); + } + return TRUE; + } + } + + return FALSE; +} + +class OptsPagesData +{ +public: + OptsPagesData() + : lastPage(0) + { + init = false; + for(int i = 0 ; i < PasteToWeb::pages; ++i) + { + webOptions[i] = Options::instance->webOptions[i]->Copy(); + } + } + + ~OptsPagesData() + { + for(int i = 0 ; i < PasteToWeb::pages; ++i) + { + delete webOptions[i]; + webOptions[i] = NULL; + } + } + + WebOptions* webOptions[PasteToWeb::pages]; + int lastPage; + bool init; +}; + +struct OptsConfigureData +{ + int page; + std::list tempFormats; +}; + +struct OptsLoginData +{ + std::wstring user; + std::wstring password; +}; + +void ReloadFormatsCombo(HWND hWnd, WebOptions* wo) +{ + while(ComboBox_DeleteString(hWnd, 0) > 0); + int sel = 0; + int i = 0; + for(std::list::iterator it = wo->formats.begin(); it != wo->formats.end(); ++it) + { + ComboBox_AddString(hWnd, it->name.c_str()); + if(it->id == wo->defFormatId) + sel = i; + ++i; + } + if(!wo->formats.empty()) + { + ComboBox_SetCurSel(hWnd, sel); + } +} + +void GetPagesSettings(HWND hwndDlg, OptsPagesData* optsPagesData) +{ + int selected = optsPagesData->lastPage; + int format = ComboBox_GetCurSel(GetDlgItem(hwndDlg, IDC_DEFFORMAT)); + if(format >= 0 && format < optsPagesData->webOptions[selected]->formats.size()) + { + for(std::list::iterator it = optsPagesData->webOptions[selected]->formats.begin(); it != optsPagesData->webOptions[selected]->formats.end(); ++it) + { + if(format-- <= 0) + { + optsPagesData->webOptions[selected]->defFormatId = it->id; + break; + } + } + } + + if(optsPagesData->webOptions[selected]->isSendFileName) + optsPagesData->webOptions[selected]->sendFileName = IsDlgButtonChecked(hwndDlg, IDC_AUTOFORMAT) ? true : false; + if(optsPagesData->webOptions[selected]->isPublicPaste) + optsPagesData->webOptions[selected]->publicPaste = IsDlgButtonChecked(hwndDlg, IDC_PUBLICPASTE) ? true : false; + if(optsPagesData->webOptions[selected]->isCombo1) + { + int sel = ComboBox_GetCurSel(GetDlgItem(hwndDlg, IDC_COMBO1)); + if(sel >= 0 && sel < optsPagesData->webOptions[selected]->combo1Values.size()) + { + for(std::list::iterator it = optsPagesData->webOptions[selected]->combo1Values.begin(); it != optsPagesData->webOptions[selected]->combo1Values.end(); ++it) + { + if(sel-- <= 0) + { + optsPagesData->webOptions[selected]->combo1 = it->id; + break; + } + } + } + } + if(optsPagesData->webOptions[selected]->isPublicPaste) + { + if(IsDlgButtonChecked(hwndDlg, IDC_GUEST)) + { + optsPagesData->webOptions[selected]->pastebinUserKey = _T(""); + } + else + { + TCHAR buf[100]; + Edit_GetText(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), buf, 100); + optsPagesData->webOptions[selected]->pastebinUserKey = buf; + } + } +} + +INT_PTR CALLBACK Options::DlgProcOptsPages(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + OptsPagesData* optsPagesData = new OptsPagesData(); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)optsPagesData); + + HWND btnhwnd = GetDlgItem(hwndDlg, IDC_PASTEBIN_LOGIN); + int btSize = Button_GetTextLength(btnhwnd); + if(btSize > 20) + { + SetWindowPos(btnhwnd, NULL, 0, 0, 115, 34, SWP_NOZORDER | SWP_NOMOVE | SWP_NOREPOSITION | SWP_NOACTIVATE | SWP_NOREDRAW); + } + + for(int i = 0; i < PasteToWeb::pages; ++i) + { + ComboBox_AddString(GetDlgItem(hwndDlg, IDC_WEBPAGE), pasteToWebs[i]->GetName()); + } + + ComboBox_SetCurSel(GetDlgItem(hwndDlg, IDC_WEBPAGE), 0); + ReloadFormatsCombo(GetDlgItem(hwndDlg, IDC_DEFFORMAT), optsPagesData->webOptions[0]); + if(optsPagesData->webOptions[0]->isSendFileName) + CheckDlgButton(hwndDlg, IDC_AUTOFORMAT, optsPagesData->webOptions[0]->sendFileName ? 1 : 0); + else + ShowWindow(GetDlgItem(hwndDlg,IDC_AUTOFORMAT),SW_HIDE); + + if(Options::instance->webOptions[0]->isPublicPaste) + CheckDlgButton(hwndDlg, IDC_PUBLICPASTE, Options::instance->webOptions[0]->publicPaste ? 1 : 0); + else + ShowWindow(GetDlgItem(hwndDlg,IDC_PUBLICPASTE),SW_HIDE); + + if(Options::instance->webOptions[0]->isCombo1) + { + int sel = 0; + int i = 0; + std::wstring &val = Options::instance->webOptions[0]->combo1; + HWND cb = GetDlgItem(hwndDlg, IDC_COMBO1); + for(std::list::iterator it = Options::instance->webOptions[0]->combo1Values.begin(); it != Options::instance->webOptions[0]->combo1Values.end(); ++it) + { + ComboBox_AddString(cb, it->name.c_str()); + if(val == it->id) + sel = i; + ++i; + } + ComboBox_SetCurSel(cb, sel); + Static_SetText(GetDlgItem(hwndDlg,IDC_COMBO1_DESC), Options::instance->webOptions[0]->combo1Desc.c_str()); + } + else + { + ShowWindow(GetDlgItem(hwndDlg,IDC_COMBO1),SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg,IDC_COMBO1_DESC),SW_HIDE); + } + + Edit_LimitText(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), 99); + if(Options::instance->webOptions[0]->isPastebin) + { + std::wstring pastebinUserKey = Options::instance->webOptions[0]->pastebinUserKey; + if(pastebinUserKey.empty()) + { + CheckDlgButton(hwndDlg, IDC_GUEST, TRUE); + Edit_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), FALSE); + Static_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY_DESC), FALSE); + Button_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_LOGIN), FALSE); + } + else + { + Edit_SetText(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), pastebinUserKey.c_str()); + } + } + else + { + ShowWindow(GetDlgItem(hwndDlg, IDC_GUEST), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY_DESC), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_PASTEBIN_LOGIN), SW_HIDE); + } + + optsPagesData->init = true; + return TRUE; + } + case WM_COMMAND: + { + OptsPagesData* optsPagesData = (OptsPagesData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_CONFIGURE) + { + GetPagesSettings(hwndDlg, optsPagesData); + OptsConfigureData d; + d.page = ComboBox_GetCurSel(GetDlgItem(hwndDlg, IDC_WEBPAGE)); + WebOptions* wo = optsPagesData->webOptions[d.page]; + d.tempFormats = wo->formats; + if(DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DLG_CONFIGURE), hwndDlg, DlgProcOptsConfigure, (LPARAM)&d) == IDOK) + { + wo->formats = d.tempFormats; + ReloadFormatsCombo(GetDlgItem(hwndDlg, IDC_DEFFORMAT), wo); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + } + else if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_PASTEBIN_LOGIN) + { + OptsLoginData d; + if(DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DLG_PASTEBIN_LOGIN), hwndDlg, DlgProcOptsLogin, (LPARAM)&d) == IDOK) + { + PasteToWeb1 *web = (PasteToWeb1*)pasteToWebs[optsPagesData->lastPage]; + Edit_SetText(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), web->GetUserKey(d.user, d.password).c_str()); + } + } + else if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_GUEST) + { + BOOL enabled = IsDlgButtonChecked(hwndDlg, IDC_GUEST) ? FALSE : TRUE; + Edit_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), enabled); + Static_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY_DESC), enabled); + Button_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_LOGIN), enabled); + } + else if(HIWORD(wParam) == CBN_SELCHANGE && LOWORD(wParam) == IDC_WEBPAGE) + { + GetPagesSettings(hwndDlg, optsPagesData); + optsPagesData->init = false; + optsPagesData->lastPage = ComboBox_GetCurSel(GetDlgItem(hwndDlg, IDC_WEBPAGE)); + ReloadFormatsCombo(GetDlgItem(hwndDlg, IDC_DEFFORMAT), optsPagesData->webOptions[optsPagesData->lastPage]); + if(optsPagesData->webOptions[optsPagesData->lastPage]->isSendFileName) + { + ShowWindow(GetDlgItem(hwndDlg,IDC_AUTOFORMAT),SW_SHOW); + CheckDlgButton(hwndDlg, IDC_AUTOFORMAT, optsPagesData->webOptions[optsPagesData->lastPage]->sendFileName ? 1 : 0); + } + else + ShowWindow(GetDlgItem(hwndDlg,IDC_AUTOFORMAT),SW_HIDE); + + if(optsPagesData->webOptions[optsPagesData->lastPage]->isPublicPaste) + { + ShowWindow(GetDlgItem(hwndDlg,IDC_PUBLICPASTE),SW_SHOW); + CheckDlgButton(hwndDlg, IDC_PUBLICPASTE, optsPagesData->webOptions[optsPagesData->lastPage]->publicPaste ? 1 : 0); + } + else + ShowWindow(GetDlgItem(hwndDlg,IDC_PUBLICPASTE),SW_HIDE); + + if(optsPagesData->webOptions[optsPagesData->lastPage]->isCombo1) + { + ShowWindow(GetDlgItem(hwndDlg,IDC_COMBO1),SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg,IDC_COMBO1_DESC),SW_SHOW); + int sel = 0; + int i = 0; + std::wstring &val = optsPagesData->webOptions[optsPagesData->lastPage]->combo1; + HWND cb = GetDlgItem(hwndDlg, IDC_COMBO1); + while(ComboBox_DeleteString(cb, 0) > 0); + for(std::list::iterator it = optsPagesData->webOptions[optsPagesData->lastPage]->combo1Values.begin(); it != optsPagesData->webOptions[optsPagesData->lastPage]->combo1Values.end(); ++it) + { + ComboBox_AddString(cb, it->name.c_str()); + if(val == it->id) + sel = i; + ++i; + } + ComboBox_SetCurSel(cb, sel); + SetWindowText(GetDlgItem(hwndDlg,IDC_COMBO1_DESC), optsPagesData->webOptions[optsPagesData->lastPage]->combo1Desc.c_str()); + } + else + { + ShowWindow(GetDlgItem(hwndDlg,IDC_COMBO1),SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg,IDC_COMBO1_DESC),SW_HIDE); + } + + + if(optsPagesData->webOptions[optsPagesData->lastPage]->isPastebin) + { + ShowWindow(GetDlgItem(hwndDlg, IDC_GUEST), SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY_DESC), SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg, IDC_PASTEBIN_LOGIN), SW_SHOW); + std::wstring pastebinUserKey = optsPagesData->webOptions[optsPagesData->lastPage]->pastebinUserKey; + if(pastebinUserKey.empty()) + { + CheckDlgButton(hwndDlg, IDC_GUEST, TRUE); + Edit_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), FALSE); + Static_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY_DESC), FALSE); + Button_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_LOGIN), FALSE); + } + else + { + CheckDlgButton(hwndDlg, IDC_GUEST, FALSE); + Edit_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), TRUE); + Static_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY_DESC), TRUE); + Button_Enable(GetDlgItem(hwndDlg, IDC_PASTEBIN_LOGIN), TRUE); + } + + Edit_SetText(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), pastebinUserKey.c_str()); + } + else + { + ShowWindow(GetDlgItem(hwndDlg, IDC_GUEST), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_PASTEBIN_KEY_DESC), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_PASTEBIN_LOGIN), SW_HIDE); + } + + optsPagesData->init = true; + } + + if (optsPagesData->init && ((HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) != IDC_CONFIGURE && LOWORD(wParam) != IDC_PASTEBIN_LOGIN) || (HIWORD(wParam)==CBN_SELCHANGE && LOWORD(wParam) != IDC_WEBPAGE) || HIWORD(wParam) == EN_CHANGE)) + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + return TRUE; + } + case WM_NOTIFY: + { + if(((LPNMHDR)lParam)->code == PSN_APPLY) + { + OptsPagesData* optsPagesData = (OptsPagesData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + GetPagesSettings(hwndDlg, optsPagesData); + for(int i = 0 ; i < PasteToWeb::pages; ++i) + { + *Options::instance->webOptions[i] = *optsPagesData->webOptions[i]; + } + + Options::instance->Save(); + } + return TRUE; + } + case WM_CLOSE: + { + OptsPagesData* optsPagesData = (OptsPagesData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + delete optsPagesData; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, NULL); + break; + } + } + + return FALSE; +} + +void SelectLbConfigure(HWND hwndDlg, int sel, OptsConfigureData* optsConfigureData) +{ + if(sel >= 0 && sel < optsConfigureData->tempFormats.size()) + { + Button_Enable(GetDlgItem(hwndDlg, IDC_DELETE), TRUE); + if(sel == 0) + Button_Enable(GetDlgItem(hwndDlg, IDC_UP), FALSE); + else + Button_Enable(GetDlgItem(hwndDlg, IDC_UP), TRUE); + if(sel + 1 == optsConfigureData->tempFormats.size()) + Button_Enable(GetDlgItem(hwndDlg, IDC_DOWN), FALSE); + else + Button_Enable(GetDlgItem(hwndDlg, IDC_DOWN), TRUE); + } + else + { + Button_Enable(GetDlgItem(hwndDlg, IDC_DELETE), FALSE); + Button_Enable(GetDlgItem(hwndDlg, IDC_UP), FALSE); + Button_Enable(GetDlgItem(hwndDlg, IDC_DOWN), FALSE); + } +} + +INT_PTR CALLBACK Options::DlgProcOptsConfigure(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + OptsConfigureData* optsConfigureData = (OptsConfigureData*)lParam; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + + HWND lb = GetDlgItem(hwndDlg, IDC_FORMATTING); + for(std::list::iterator it = optsConfigureData->tempFormats.begin(); it != optsConfigureData->tempFormats.end(); ++it) + { + ListBox_AddString(lb, it->name.c_str()); + } + + SelectLbConfigure(hwndDlg, -1, optsConfigureData); + return TRUE; + } + case WM_COMMAND: + { + if (HIWORD(wParam) == BN_CLICKED) + { + if (LOWORD(wParam) == IDOK) + { + EndDialog(hwndDlg, IDOK); + } + else if (LOWORD(wParam) == IDCANCEL) + { + EndDialog(hwndDlg, IDCANCEL); + } + else if (LOWORD(wParam) == IDC_DELETE) + { + HWND lb = GetDlgItem(hwndDlg, IDC_FORMATTING); + OptsConfigureData* optsConfigureData = (OptsConfigureData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + int sel = ListBox_GetCurSel(lb); + if(sel >= 0) + { + ListBox_DeleteString(lb, sel); + int i = sel; + for(std::list::iterator it = optsConfigureData->tempFormats.begin(); it != optsConfigureData->tempFormats.end(); ++it) + { + if(i-- <= 0) + { + optsConfigureData->tempFormats.erase(it); + ListBox_SetCurSel(lb, sel); + SelectLbConfigure(hwndDlg, sel, optsConfigureData); + break; + } + } + } + } + else if (LOWORD(wParam) == IDC_UP) + { + HWND lb = GetDlgItem(hwndDlg, IDC_FORMATTING); + OptsConfigureData* optsConfigureData = (OptsConfigureData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + int sel = ListBox_GetCurSel(lb); + if(sel > 0) + { + int i = sel; + for(std::list::iterator it = optsConfigureData->tempFormats.begin(); it != optsConfigureData->tempFormats.end(); ++it) + { + if(i-- <= 0) + { + PasteFormat pf = *it; + std::list::iterator prevIt = it; + --prevIt; + optsConfigureData->tempFormats.erase(it); + optsConfigureData->tempFormats.insert(prevIt, pf); + ListBox_DeleteString(lb, sel--); + ListBox_InsertString(lb, sel, pf.name.c_str()); + ListBox_SetCurSel(lb, sel); + SelectLbConfigure(hwndDlg, sel, optsConfigureData); + break; + } + } + } + } + else if (LOWORD(wParam) == IDC_DOWN) + { + HWND lb = GetDlgItem(hwndDlg, IDC_FORMATTING); + OptsConfigureData* optsConfigureData = (OptsConfigureData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + int sel = ListBox_GetCurSel(lb); + if(sel >= 0 && sel + 1 < optsConfigureData->tempFormats.size()) + { + int i = sel; + for(std::list::iterator it = optsConfigureData->tempFormats.begin(); it != optsConfigureData->tempFormats.end(); ++it) + { + if(i-- <= 0) + { + PasteFormat pf = *it; + std::list::iterator nextIt = it; + ++(++nextIt); + optsConfigureData->tempFormats.erase(it); + optsConfigureData->tempFormats.insert(nextIt, pf); + ListBox_DeleteString(lb, sel++); + ListBox_InsertString(lb, sel, pf.name.c_str()); + ListBox_SetCurSel(lb, sel); + SelectLbConfigure(hwndDlg, sel, optsConfigureData); + break; + } + } + } + } + else if(LOWORD(wParam) == IDC_DOWNLOAD) + { + OptsConfigureData* optsConfigureData = (OptsConfigureData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + HWND lb = GetDlgItem(hwndDlg, IDC_FORMATTING); + while(ListBox_DeleteString(lb, 0) > 0); + SelectLbConfigure(hwndDlg, -1, optsConfigureData); + optsConfigureData->tempFormats = pasteToWebs[optsConfigureData->page]->GetFormats(); + for(std::list::iterator it = optsConfigureData->tempFormats.begin(); it != optsConfigureData->tempFormats.end(); ++it) + { + ListBox_AddString(lb, it->name.c_str()); + } + } + else if(LOWORD(wParam) == IDC_RESTORE) + { + OptsConfigureData* optsConfigureData = (OptsConfigureData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + HWND lb = GetDlgItem(hwndDlg, IDC_FORMATTING); + while(ListBox_DeleteString(lb, 0) > 0); + SelectLbConfigure(hwndDlg, -1, optsConfigureData); + optsConfigureData->tempFormats = pasteToWebs[optsConfigureData->page]->GetDefFormats(); + for(std::list::iterator it = optsConfigureData->tempFormats.begin(); it != optsConfigureData->tempFormats.end(); ++it) + { + ListBox_AddString(lb, it->name.c_str()); + } + } + } + else if(HIWORD(wParam) == LBN_SELCHANGE && LOWORD(wParam) == IDC_FORMATTING) + { + OptsConfigureData* optsConfigureData = (OptsConfigureData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + int sel = ListBox_GetCurSel(GetDlgItem(hwndDlg, IDC_FORMATTING)); + SelectLbConfigure(hwndDlg, sel, optsConfigureData); + } + return TRUE; + } + case WM_VKEYTOITEM: + if(LOWORD(wParam) == VK_DELETE && (HWND)lParam == GetDlgItem(hwndDlg, IDC_FORMATTING)) + { + DlgProcOptsConfigure(hwndDlg, WM_COMMAND, MAKELONG(IDC_DELETE, BN_CLICKED), NULL); + return -2; + } + return -1; + case WM_NOTIFY: + { + return TRUE; + } + } + + return FALSE; +} + +INT_PTR CALLBACK Options::DlgProcOptsLogin(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + Edit_LimitText(GetDlgItem(hwndDlg, IDC_PASTEBIN_USER), 99); + Edit_LimitText(GetDlgItem(hwndDlg, IDC_PASTEBIN_PASSWORD), 99); + return TRUE; + } + case WM_COMMAND: + { + if (HIWORD(wParam) == BN_CLICKED) + { + if (LOWORD(wParam) == IDOK) + { + TCHAR buf[100]; + OptsLoginData* optsLoginData = (OptsLoginData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + Edit_GetText(GetDlgItem(hwndDlg, IDC_PASTEBIN_USER), buf, 100); + optsLoginData->user = buf; + Edit_GetText(GetDlgItem(hwndDlg, IDC_PASTEBIN_PASSWORD), buf, 100); + optsLoginData->password = buf; + EndDialog(hwndDlg, IDOK); + } + else if (LOWORD(wParam) == IDCANCEL) + { + EndDialog(hwndDlg, IDCANCEL); + } + } + return TRUE; + } + case WM_NOTIFY: + { + return TRUE; + } + } + + return FALSE; +} + +unsigned int Options::GetCodepageCB(HWND hwndCB, bool errorReport, unsigned int defCp) +{ + int selCpIdx = ComboBox_GetCurSel(hwndCB); + if(selCpIdx < 0) + { + TCHAR text[128]; + ComboBox_GetText(hwndCB, text, 128); + TCHAR * stopOn = NULL; + long cp = _tcstol(text, &stopOn, 10); + if(errorReport && (stopOn == text || *stopOn != '\0' || cp < 0 || cp > 0xffff)) + { + MessageBox(GetParent(hwndCB), TranslateT("You've entered invalid codepage. Select codepage from combo box or enter correct number."), TranslateT("Invalid codepage"), MB_OK | MB_ICONERROR); + SetFocus(hwndCB); + SetCodepageCB(hwndCB, defCp); + return defCp; + } + + return cp; + } + else return cpTable[selCpIdx].cpId; +} + +void Options::SetDefWeb(int web) +{ + defWeb = web; + DBWriteContactSettingWString(0, MODULE, "defWeb", pasteToWebs[web]->GetName()); + DefWebPageChanged(); +} + +void Options::InitCodepageCB(HWND hwndCB, unsigned int codepage) +{ + int cpCount = sizeof(cpTable) / sizeof(cpTable[0]); + int selCpIdx = -1; + for(int i = 0; i < cpCount; ++i) + { + ComboBox_AddString(hwndCB, TranslateTS(cpTable[i].cpName)); + if(cpTable[i].cpId == codepage) + selCpIdx = i; + } + + if(selCpIdx == -1) + { + TCHAR buf[10]; + _stprintf_s(buf, 10, _T("%d"), codepage); + ComboBox_SetText(hwndCB, buf); + } + else + { + ComboBox_SetCurSel(hwndCB, selCpIdx); + } + + ComboBox_LimitText(hwndCB, 127); +} + +void Options::SetCodepageCB(HWND hwndCB, unsigned int codepage) +{ + int cpCount = sizeof(cpTable) / sizeof(cpTable[0]); + int selCpIdx = -1; + for(int i = 0; i < cpCount; ++i) + { + if(cpTable[i].cpId == codepage) + selCpIdx = i; + } + + if(selCpIdx == -1) + { + TCHAR buf[10]; + _stprintf_s(buf, 10, _T("%d"), codepage); + ComboBox_SetText(hwndCB, buf); + } + else + { + ComboBox_SetCurSel(hwndCB, selCpIdx); + } +} + +int Options::InitOptions(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = {0}; + + odp.cbSize = sizeof(odp); + odp.position = 100000000; + odp.hInstance = hInst; + odp.flags = ODPF_BOLDGROUPS | ODPF_TCHAR; + odp.ptszTitle = LPGENT("Paste It"); + odp.ptszGroup = LPGENT("Services"); + + odp.ptszTab = LPGENT("Main"); + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_MAIN); + odp.pfnDlgProc = Options::DlgProcOptsMain; + CallService(MS_OPT_ADDPAGE, wParam, (LPARAM)&odp); + + odp.ptszTab = LPGENT("Web page"); + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_PAGES); + odp.pfnDlgProc = Options::DlgProcOptsPages; + CallService(MS_OPT_ADDPAGE, wParam, (LPARAM)&odp); + + return 0; +} + +void Options::Save() +{ + DBWriteContactSettingWString(0, MODULE, "defWeb", pasteToWebs[defWeb]->GetName()); + DBWriteContactSettingDword(0, MODULE, "codepage", codepage); + DBWriteContactSettingByte(0, MODULE, "autoUTF", autoUTF ? 1 : 0); + DBWriteContactSettingByte(0, MODULE, "confDlg", confDlg ? 1 : 0); + DBWriteContactSettingByte(0, MODULE, "autoSend", autoSend ? 1 : 0); + for(int i = 0 ; i < PasteToWeb::pages; ++i) + { + char buf[256]; + TCHAR* name = pasteToWebs[i]->GetName(); + int j = 0; + while(name[j]) + { + buf[j] = (char)name[j]; + ++j; + } + buf[j++] = '_'; + + strcpy_s(buf + j, 256 - j, "formats"); + std::wstring forms; + for(std::list::iterator it = webOptions[i]->formats.begin(); it != webOptions[i]->formats.end(); ++it) + { + forms += it->id + L'=' + it->name + L';'; + } + + DBWriteContactSettingWString(0, MODULE, buf, forms.c_str()); + + strcpy_s(buf + j, 256 - j, "defFormatId"); + DBWriteContactSettingWString(0, MODULE, buf, webOptions[i]->defFormatId.c_str()); + + if(webOptions[i]->isSendFileName) + { + strcpy_s(buf + j, 256 - j, "sendFileName"); + DBWriteContactSettingByte(0, MODULE, buf, webOptions[i]->sendFileName ? 1 : 0); + } + + if(webOptions[i]->isPublicPaste) + { + strcpy_s(buf + j, 256 - j, "publicPaste"); + DBWriteContactSettingByte(0, MODULE, buf, webOptions[i]->publicPaste ? 1 : 0); + } + + if(webOptions[i]->isCombo1) + { + strcpy_s(buf + j, 256 - j, "combo1"); + DBWriteContactSettingWString(0, MODULE, buf, webOptions[i]->combo1.c_str()); + } + + if(webOptions[i]->isPastebin) + { + strcpy_s(buf + j, 256 - j, "pastebinUserKey"); + DBWriteContactSettingWString(0, MODULE, buf, webOptions[i]->pastebinUserKey.c_str()); + } + } +} + +void Options::Load() +{ + DBVARIANT defWebV; + if(!DBGetContactSettingWString(0, MODULE, "defWeb", &defWebV)) + { + for(int i = 0; i < PasteToWeb::pages; ++i) + { + if(!wcscmp(pasteToWebs[i]->GetName(), defWebV.pwszVal)) + { + defWeb = i; + break; + } + } + DBFreeVariant(&defWebV); + } + codepage = DBGetContactSettingDword(0, MODULE, "codepage", CP_ACP); + autoUTF = DBGetContactSettingByte(0, MODULE, "autoUTF", 1) ? true : false; + confDlg = DBGetContactSettingByte(0, MODULE, "confDlg", 1) ? true : false; + autoSend = DBGetContactSettingByte(0, MODULE, "autoSend", 0) ? true : false; + for(int i = 0 ; i < PasteToWeb::pages; ++i) + { + char buf[256]; + TCHAR* name = pasteToWebs[i]->GetName(); + int j = 0; + while(name[j]) + { + buf[j] = (char)name[j]; + ++j; + } + buf[j++] = '_'; + + strcpy_s(buf + j, 256 - j, "formats"); + DBVARIANT forms; + if(!DBGetContactSettingWString(0, MODULE, buf, &forms)) + { + webOptions[i]->formats.clear(); + int k = 0; + wchar_t * id = forms.pwszVal; + wchar_t * name = NULL; + while(forms.pwszVal[k]) + { + if(forms.pwszVal[k] == L'=') + { + forms.pwszVal[k] = 0; + name = forms.pwszVal + k + 1; + } + else if(forms.pwszVal[k] == L';') + { + forms.pwszVal[k] = 0; + PasteFormat pf; + pf.id = id; + pf.name = name; + webOptions[i]->formats.push_back(pf); + id = forms.pwszVal + k + 1; + } + + ++k; + } + + DBFreeVariant(&forms); + } + + strcpy_s(buf + j, 256 - j, "defFormatId"); + DBVARIANT defForm; + if(!DBGetContactSettingWString(0, MODULE, buf, &defForm)) + { + webOptions[i]->defFormatId = defForm.pwszVal; + DBFreeVariant(&defForm); + } + + if(webOptions[i]->isSendFileName) + { + strcpy_s(buf + j, 256 - j, "sendFileName"); + webOptions[i]->sendFileName = DBGetContactSettingByte(0, MODULE, buf, 1) ? true : false; + } + + if(webOptions[i]->isPublicPaste) + { + strcpy_s(buf + j, 256 - j, "publicPaste"); + webOptions[i]->publicPaste = DBGetContactSettingByte(0, MODULE, buf, 0) ? true : false; + } + + if(webOptions[i]->isCombo1) + { + strcpy_s(buf + j, 256 - j, "combo1"); + DBVARIANT combo1; + if(!DBGetContactSettingWString(0, MODULE, buf, &combo1)) + { + webOptions[i]->combo1 = combo1.pwszVal; + DBFreeVariant(&combo1); + } + } + + if(webOptions[i]->isPastebin) + { + strcpy_s(buf + j, 256 - j, "pastebinUserKey"); + DBVARIANT pastebinUserKey; + if(!DBGetContactSettingWString(0, MODULE, buf, &pastebinUserKey)) + { + webOptions[i]->pastebinUserKey = pastebinUserKey.pwszVal; + DBFreeVariant(&pastebinUserKey); + } + } + } +} + +WebOptions::WebOptions(int serv) + :server(serv), + formats(pasteToWebs[serv]->GetDefFormats()), + sendFileName(true), + isSendFileName(true), + publicPaste(false), + isPublicPaste(false), + isCombo1(false), + isPastebin(false) +{ + defFormatId = formats.front().id; +} + + +WebOptions::~WebOptions() +{ +} + +WebOptions* WebOptions::Copy() +{ + return new WebOptions(*this); +} diff --git a/plugins/PasteIt/Options.h b/plugins/PasteIt/Options.h new file mode 100644 index 0000000000..9e58e44d7f --- /dev/null +++ b/plugins/PasteIt/Options.h @@ -0,0 +1,72 @@ +/* +Paste It plugin +Copyright (C) 2011 Krzysztof Kral + +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 . +*/ + +#pragma once +#include "PasteToWeb.h" + +class WebOptions +{ +public: + WebOptions(int serv); + virtual ~WebOptions(); + virtual WebOptions* Copy(); + int server; + bool isSendFileName; + bool isPublicPaste; + bool isCombo1; + std::list combo1Values; + std::wstring combo1Desc; + bool isPastebin; + + std::list formats; + std::wstring defFormatId; + bool sendFileName; + bool publicPaste; + std::wstring combo1; + std::wstring pastebinUserKey; +}; + +class Options +{ +public: + Options(); + ~Options(); + static int InitOptions(WPARAM wParam, LPARAM lParam); + + static INT_PTR CALLBACK DlgProcOptsMain(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); + static INT_PTR CALLBACK DlgProcOptsPages(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); + static INT_PTR CALLBACK DlgProcOptsConfigure(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); + static INT_PTR CALLBACK DlgProcOptsLogin(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); + + static void InitCodepageCB(HWND hwndCB, unsigned int codepage); + static void SetCodepageCB(HWND hwndCB, unsigned int codepage); + static unsigned int GetCodepageCB(HWND hwndCB, bool errorReport, unsigned int defCp); + + static Options *instance; + void Save(); + void Load(); + + int defWeb; + unsigned int codepage; + bool autoUTF; + bool confDlg; + bool autoSend; + void SetDefWeb(int web); + WebOptions* webOptions[PasteToWeb::pages]; +}; + diff --git a/plugins/PasteIt/PasteIt.cpp b/plugins/PasteIt/PasteIt.cpp new file mode 100644 index 0000000000..1ae7e1d7e9 --- /dev/null +++ b/plugins/PasteIt/PasteIt.cpp @@ -0,0 +1,596 @@ +/* +Paste It plugin +Copyright (C) 2011 Krzysztof Kral + +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 . +*/ + +#include "stdafx.h" +#include "PasteToWeb1.h" +#include "PasteToWeb2.h" +#include "version.h" +#include "resource.h" +#include "Options.h" + +// {1AAC15E8-DCEC-4050-B66F-2AA0E6120C22} +#define MIID_PASTEIT { 0x1aac15e8, 0xdcec, 0x4050, { 0xb6, 0x6f, 0x2a, 0xa0, 0xe6, 0x12, 0xc, 0x22 } } + +PLUGINLINK *pluginLink; +PasteToWeb* pasteToWebs[PasteToWeb::pages]; +std::map* contactWindows; +DWORD gMirandaVersion; + +extern HINSTANCE hInst; +HANDLE hModulesLoaded, hTabsrmmButtonPressed; +HANDLE g_hNetlibUser; +HANDLE hPrebuildContactMenu; +HANDLE hServiceContactMenu; +HGENMENU hContactMenu; +HGENMENU hWebPageMenus[PasteToWeb::pages]; +HANDLE hMainIcon; +HANDLE hOptionsInit; +HANDLE hWindowEvent = NULL; + +#define MODULE "PasteIt" +#define FROM_CLIPBOARD 10 +#define FROM_FILE 11 +#define DEF_PAGES_START 20 +#define MS_PASTEIT_CONTACTMENU "PasteIt/ContactMenu" + +PLUGININFOEX pluginInfo={ + sizeof(PLUGININFOEX), + __PLUGIN_NAME, + PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM), + __DESCRIPTION, + __AUTHOR, + __AUTHOREMAIL, + __COPYRIGHT, + __AUTHORWEB, + UNICODE_AWARE, + 0, + MIID_PASTEIT +}; + +MM_INTERFACE mmi = {0}; +XML_API xi = {0}; +int hLangpack = 0; + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + gMirandaVersion = mirandaVersion; + if (mirandaVersion < PLUGIN_MAKE_VERSION(0, 8, 0, 0)) + return NULL; + + return &pluginInfo; +} + +static const MUUID interfaces[] = {MIID_PASTEIT, MIID_LAST}; +extern "C" __declspec(dllexport) const MUUID* MirandaPluginInterfaces(void) +{ + return interfaces; +} + +std::wstring GetFile() +{ + TCHAR filter[512]; + _tcscpy_s(filter, 512, TranslateT("All Files (*.*)")); + memcpy(filter + _tcslen(filter), _T("\0*.*\0"), 6 * sizeof(TCHAR)); + TCHAR stzFilePath[1024]; + stzFilePath[0] = 0; + stzFilePath[1] = 0; + OPENFILENAME ofn = {0}; + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = 0; + ofn.lpstrFilter = filter; + ofn.nFilterIndex = 1; + ofn.lpstrFile = stzFilePath; + ofn.lpstrTitle = TranslateT("Paste It - Select file"); + ofn.nMaxFile = 1024; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_NOCHANGEDIR; + if(GetOpenFileName(&ofn)) + { + return stzFilePath; + } + + return L""; +} + +void PasteIt(HANDLE hContact, int mode) +{ + PasteToWeb* pasteToWeb = pasteToWebs[Options::instance->defWeb]; + if(mode == FROM_CLIPBOARD) + { + pasteToWeb->FromClipboard(); + } + else if(mode == FROM_FILE) + { + std::wstring file = GetFile(); + if(file.length() > 0) + { + pasteToWeb->FromFile(file); + } + else return; + } + else return; + + if(pasteToWeb->szFileLink[0] == 0 && pasteToWeb->error != NULL) + { + MessageBox(NULL, pasteToWeb->error, TranslateT("Error"), MB_OK | MB_ICONERROR); + } + else if(hContact != NULL && pasteToWeb->szFileLink[0] != 0) + { + char *szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if (szProto && (INT_PTR)szProto != CALLSERVICE_NOTFOUND) + { + BOOL isChat = DBGetContactSettingByte(hContact, szProto, "ChatRoom", 0); + if(Options::instance->autoSend) + { + if(!isChat) + { + DBEVENTINFO dbei = {0}; + dbei.cbSize = sizeof(dbei); + dbei.eventType = EVENTTYPE_MESSAGE; + dbei.flags = DBEF_SENT; + dbei.szModule = szProto; + dbei.timestamp = (DWORD)time(NULL); + dbei.cbBlob = (DWORD)strlen(pasteToWeb->szFileLink) + 1; + dbei.pBlob = (PBYTE)pasteToWeb->szFileLink; + CallService(MS_DB_EVENT_ADD, (WPARAM)hContact, (LPARAM)&dbei); + CallContactService(hContact, PSS_MESSAGE, 0, (LPARAM)pasteToWeb->szFileLink); + } + else + { + // PSS_MESSAGE is not compatible with chat rooms + // there are no simple method to send text to all users + // in chat room. + // First I check if protocol is unicode or ascii. + BOOL isUnicodePlugin = TRUE; + PROTOACCOUNT* protoAc = ProtoGetAccount(szProto); + if(protoAc != NULL) + { + // protoAc->ppro is abstract class, that contains + // methods implemented in protocol ddl`s segment. + // Method address in vptr table must be converted + // to hInstance of protocol dll. + PROTO_INTERFACE* protoInt = protoAc->ppro; + MEMORY_BASIC_INFORMATION mb; + INT_PTR *vptr = *(INT_PTR**)&protoAc->ppro; + INT_PTR *vtable = (INT_PTR *)*vptr; + if(VirtualQuery((void*)vtable[0], &mb, sizeof(MEMORY_BASIC_INFORMATION))) + { + typedef PLUGININFO * (__cdecl * Miranda_Plugin_Info) ( DWORD mirandaVersion ); + typedef PLUGININFOEX * (__cdecl * Miranda_Plugin_InfoEx) ( DWORD mirandaVersion ); + HINSTANCE hInst = (HINSTANCE)mb.AllocationBase; + // Now I can get PLUGININFOEX from protocol + Miranda_Plugin_Info info = (Miranda_Plugin_Info) GetProcAddress(hInst, "MirandaPluginInfo"); + Miranda_Plugin_InfoEx infoEx = (Miranda_Plugin_InfoEx) GetProcAddress(hInst, "MirandaPluginInfoEx"); + PLUGININFOEX* pi = NULL; + if(infoEx != NULL) + { + pi = infoEx(gMirandaVersion); + } + else if(info != NULL) + { + pi = (PLUGININFOEX*)info(gMirandaVersion); + } + + // If PLUGININFOEX flags contains UNICODE_AWARE, + // this mean that protocol is unicode. + if(pi != NULL && pi->cbSize >= sizeof(PLUGININFO)) + { + isUnicodePlugin = pi->flags & UNICODE_AWARE; + } + } + } + + // Next step is to get all protocol sessions and find + // one with correct hContact + GC_INFO gci = {0}; + GCDEST gcd = {0}; + GCEVENT gce = {0}; + int cnt = (int)CallService(MS_GC_GETSESSIONCOUNT, 0, (LPARAM)szProto); + for (int i = 0; i < cnt ; i++ ) + { + gci.iItem = i; + gci.pszModule = szProto; + gci.Flags = BYINDEX | HCONTACT | ID; + CallService(MS_GC_GETINFO, 0, (LPARAM)(GC_INFO *) &gci); + if (gci.hContact == hContact) + { + // In this place session was finded, gci.pszID contains + // session ID, but it is in unicode or ascii format, + // depends on protocol wersion + gcd.pszModule = szProto; + gcd.iType = GC_EVENT_SENDMESSAGE; + gcd.ptszID = gci.pszID; + gce.cbSize = sizeof(GCEVENT); + gce.pDest = &gcd; + gce.bIsMe = TRUE; + gce.dwFlags = isUnicodePlugin ? (GCEF_ADDTOLOG | GC_UNICODE) : GCEF_ADDTOLOG; + wchar_t* s = NULL; + if(isUnicodePlugin) + { + // If session ID is in unicode, text must be too in unicode + s = mir_a2u_cp(pasteToWeb->szFileLink, CP_ACP); + gce.ptszText = s; + } + else + { + // If session ID is in ascii, text must be too in ascii + gce.pszText = pasteToWeb->szFileLink; + } + gce.time = time(NULL); + CallService(MS_GC_EVENT, 0, (LPARAM)(GCEVENT *) &gce); + if(s != NULL) + mir_free(s); + break; + } + } + } + + // Send message to focus window + CallServiceSync(MS_MSG_SENDMESSAGE, (WPARAM)hContact, 0); + } + else + { + if(isChat) + { + // MS_MSG_SENDMESSAGE in incompatible with chat rooms, + // because it sends text to IDC_MESSAGE window, + // but in chat rooms is only IDC_CHAT_MESSAGE window. + // contactWindows map contains all opened hContact + // with assaigned to them chat windows. + // This map is prepared in ME_MSG_WINDOWEVENT event. + std::map::iterator it = contactWindows->find(hContact); + if(it != contactWindows->end()) + { + // it->second is imput window, so now I can send to them + // new text. Afterr all is sended MS_MSG_SENDMESSAGE + // to focus window. + SendMessage(it->second, EM_SETSEL, -1, SendMessage(it->second, WM_GETTEXTLENGTH, 0, 0)); + SendMessageA(it->second, EM_REPLACESEL, FALSE, (LPARAM)pasteToWeb->szFileLink); + CallServiceSync(MS_MSG_SENDMESSAGE, (WPARAM)hContact, NULL); + } + else + { + // If window do not exist, maybe it is not chat + CallServiceSync(MS_MSG_SENDMESSAGE, (WPARAM)hContact, (LPARAM)pasteToWeb->szFileLink); + } + } + else + { + CallServiceSync(MS_MSG_SENDMESSAGE, (WPARAM)hContact, (LPARAM)pasteToWeb->szFileLink); + } + } + } + } +} + +int TabsrmmButtonPressed(WPARAM wParam, LPARAM lParam) +{ + CustomButtonClickData *cbc = (CustomButtonClickData *)lParam; + HANDLE hContact = (HANDLE)wParam; + + if (!strcmp(cbc->pszModule, MODULE) && cbc->dwButtonId == 1 && hContact) + { + if (cbc->flags == BBCF_ARROWCLICKED) + { + HMENU hMenu = CreatePopupMenu(); + if (hMenu) + { + AppendMenu(hMenu, MF_STRING, FROM_CLIPBOARD, TranslateT("Paste from clipboard")); + AppendMenu(hMenu, MF_STRING, FROM_FILE, TranslateT("Paste from file")); + HMENU hDefMenu = CreatePopupMenu(); + for(int i = 0 ; i < PasteToWeb::pages; ++i) + { + UINT flags = MF_STRING; + if(Options::instance->defWeb == i) + flags |= MF_CHECKED; + + AppendMenu(hDefMenu, flags, DEF_PAGES_START + i, pasteToWebs[i]->GetName()); + } + + AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT_PTR)hDefMenu, TranslateT("Default web page")); + + POINT pt; + GetCursorPos(&pt); + HWND hwndBtn = WindowFromPoint(pt); + if (hwndBtn) + { + RECT rc; + GetWindowRect(hwndBtn, &rc); + SetForegroundWindow(cbc->hwndFrom); + int selected = TrackPopupMenu(hMenu, TPM_RETURNCMD, rc.left, rc.bottom, 0, cbc->hwndFrom, 0); + if (selected != 0) + { + if(selected >= DEF_PAGES_START) + { + Options::instance->SetDefWeb(selected - DEF_PAGES_START); + } + else + { + PasteIt(hContact, selected); + } + } + } + + DestroyMenu(hDefMenu); + DestroyMenu(hMenu); + } + } + else + { + PasteIt(hContact, FROM_CLIPBOARD); + } + } + + return 0; +} + +int PrebuildContactMenu(WPARAM wParam, LPARAM lParam) +{ + bool bIsContact = false; + + char *szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, wParam, 0); + if (szProto && (INT_PTR)szProto != CALLSERVICE_NOTFOUND) bIsContact = (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_IM) ? true : false; + + CLISTMENUITEM mi = {0}; + mi.cbSize = sizeof(mi); + mi.flags = CMIM_FLAGS; + + if (!bIsContact) mi.flags |= CMIF_HIDDEN; + else mi.flags &= ~CMIF_HIDDEN; + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hContactMenu, (LPARAM)&mi); + + return 0; +} + +INT_PTR ContactMenuService(WPARAM wParam, LPARAM lParam) +{ + if(lParam >= DEF_PAGES_START) + { + Options::instance->SetDefWeb(lParam - DEF_PAGES_START); + } + else + { + HANDLE hContact = (HANDLE)wParam; + PasteIt(hContact, lParam); + } + return 0; +} + +void InitIcolib() +{ + TCHAR stzFile[MAX_PATH]; + + SKINICONDESC sid = {0}; + sid.cbSize = sizeof(sid); + sid.cx = sid.cy = 16; + sid.ptszDefaultFile = stzFile; + sid.ptszSection = LPGENT("Paste It"); + sid.flags = SIDF_ALL_TCHAR; + + GetModuleFileName(hInst, stzFile, MAX_PATH); + + sid.pszName = "PasteIt_main"; + sid.ptszDescription = LPGENT("Paste It"); + sid.iDefaultIndex = -IDI_MENU; + hMainIcon = (HANDLE)CallService(MS_SKIN2_ADDICON, 0, (LPARAM)&sid); +} + +void InitMenuItems() +{ + CLISTMENUITEM mi = {0}; + CLISTMENUITEM mi2 = {0}; + + mi.cbSize = sizeof(mi); + mi.flags = CMIF_ROOTPOPUP | CMIF_ICONFROMICOLIB | CMIF_TCHAR; + mi.icolibItem = hMainIcon; + mi.position = 3000090005; + mi.ptszName = _T("Paste It"); + + hContactMenu = (HGENMENU)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi); + + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + mi.flags = CMIF_CHILDPOPUP | CMIF_ROOTHANDLE | CMIF_TCHAR; + mi.pszService = MS_PASTEIT_CONTACTMENU; + mi.hParentMenu = hContactMenu; + mi.popupPosition = FROM_CLIPBOARD; + mi.ptszName = _T("Paste from clipboard"); + CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi); + + mi.popupPosition = FROM_FILE; + mi.ptszName = _T("Paste from file"); + CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi); + + mi.popupPosition = DEF_PAGES_START - 1; + mi.ptszName = _T("Default web page"); + HGENMENU hDefWebMenu = (HGENMENU)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi); + + mi2.cbSize = sizeof(mi2); + mi2.pszService = MS_PASTEIT_CONTACTMENU; + mi2.hParentMenu = hDefWebMenu; + for(int i = 0 ; i < PasteToWeb::pages; ++i) + { + mi2.flags = CMIF_CHILDPOPUP | CMIF_ROOTHANDLE | CMIF_TCHAR; + if(Options::instance->defWeb == i) + mi2.flags |= CMIF_CHECKED; + mi2.ptszName = pasteToWebs[i]->GetName(); + mi2.popupPosition = mi2.position = DEF_PAGES_START + i; + hWebPageMenus[i] = (HGENMENU)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi2); + } + + hPrebuildContactMenu = HookEvent(ME_CLIST_PREBUILDCONTACTMENU, PrebuildContactMenu); +} + +void DefWebPageChanged() +{ + CLISTMENUITEM mi = {0}; + mi.cbSize = sizeof(mi); + + for (int i = 0; i < PasteToWeb::pages; i++) + { + mi.flags = CMIM_FLAGS; + if (Options::instance->defWeb == i) + { + mi.flags |= CMIF_CHECKED; + } + + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hWebPageMenus[i], (LPARAM)&mi); + } +} + +void InitTabsrmmButton() +{ + if (ServiceExists(MS_BB_ADDBUTTON)) + { + BBButton btn = {0}; + btn.cbSize = sizeof(btn); + btn.dwButtonID = 1; + btn.pszModuleName = MODULE; + btn.dwDefPos = 110; + btn.hIcon = hMainIcon; + btn.bbbFlags = BBBF_ISARROWBUTTON | BBBF_ISIMBUTTON | BBBF_ISLSIDEBUTTON | BBBF_CANBEHIDDEN | BBBF_ISCHATBUTTON; + btn.ptszTooltip = TranslateT("Paste It"); + CallService(MS_BB_ADDBUTTON, 0, (LPARAM)&btn); + if(hTabsrmmButtonPressed != NULL) + { + UnhookEvent(hTabsrmmButtonPressed); + } + + hTabsrmmButtonPressed = HookEvent(ME_MSG_BUTTONPRESSED, TabsrmmButtonPressed); + } +} + +void InitUpdater() +{ + if (ServiceExists(MS_UPDATE_REGISTER)) + { + Update update = {0}; + char szVersion[16]; + update.cbSize = sizeof(Update); + update.szComponentName = pluginInfo.shortName; + update.pbVersion = (BYTE *)CreateVersionStringPluginEx(&pluginInfo, szVersion); + update.cpbVersion = (int)strlen((char *)update.pbVersion); + +#ifdef _WIN64 + update.szUpdateURL = "http://programista.free.of.pl/miranda/PasteIt64.zip"; +#else + update.szUpdateURL = "http://programista.free.of.pl/miranda/PasteIt.zip"; +#endif + update.szVersionURL = "http://programista.free.of.pl/miranda/PasteItVersion.txt"; + update.pbVersionPrefix = (BYTE *)"Paste It "; + update.cpbVersionPrefix = (int)strlen((char *)update.pbVersionPrefix); + CallService(MS_UPDATE_REGISTER, 0, (WPARAM)&update); + } +} + +int WindowEvent(WPARAM wParam, MessageWindowEventData* lParam) +{ + if(lParam->uType == MSG_WINDOW_EVT_OPEN) + { + char *szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)lParam->hContact, 0); + if (szProto && (INT_PTR)szProto != CALLSERVICE_NOTFOUND) + { + if(DBGetContactSettingByte(lParam->hContact, szProto, "ChatRoom", 0)) + { + (*contactWindows)[lParam->hContact] = lParam->hwndInput; + } + } + } + else if(lParam->uType == MSG_WINDOW_EVT_CLOSE) + { + std::map::iterator it = contactWindows->find(lParam->hContact); + if(it != contactWindows->end()) + { + contactWindows->erase(it); + } + } + + return 0; +} + +int ModulesLoaded(WPARAM wParam, LPARAM lParam) +{ + InitIcolib(); + InitMenuItems(); + InitTabsrmmButton(); + InitUpdater(); + hWindowEvent = HookEvent(ME_MSG_WINDOWEVENT, (MIRANDAHOOK)WindowEvent); + + return 0; +} + +extern "C" int __declspec(dllexport) Load(PLUGINLINK *link) +{ + pluginLink = link; + mir_getMMI(&mmi); + mir_getXI(&xi); + mir_getLP(&pluginInfo); + NETLIBUSER nlu = {0}; + nlu.cbSize = sizeof(nlu); + nlu.flags = NUF_TCHAR | NUF_OUTGOING | NUF_HTTPCONNS; + nlu.szSettingsModule = MODULE; + nlu.ptszDescriptiveName = TranslateT("Paste It HTTP connections"); + g_hNetlibUser = ( HANDLE )CallService( MS_NETLIB_REGISTERUSER, 0, ( LPARAM )&nlu ); + + pasteToWebs[0] = new PasteToWeb1(); + pasteToWebs[0]->pageIndex = 0; + pasteToWebs[1] = new PasteToWeb2(); + pasteToWebs[1]->pageIndex = 1; + Options::instance = new Options(); + pasteToWebs[0]->ConfigureSettings(); + pasteToWebs[1]->ConfigureSettings(); + Options::instance->Load(); + hModulesLoaded = HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded); + hOptionsInit = HookEvent(ME_OPT_INITIALISE, Options::InitOptions); + hTabsrmmButtonPressed = NULL; + hServiceContactMenu = CreateServiceFunction(MS_PASTEIT_CONTACTMENU, ContactMenuService); + contactWindows = new std::map(); + return 0; +} + +extern "C" int __declspec(dllexport) Unload(void) +{ + UnhookEvent(hModulesLoaded); + UnhookEvent(hPrebuildContactMenu); + UnhookEvent(hOptionsInit); + if(hWindowEvent != NULL) + { + UnhookEvent(hWindowEvent); + } + DestroyServiceFunction(hServiceContactMenu); + Netlib_CloseHandle(g_hNetlibUser); + if(hTabsrmmButtonPressed != NULL) + { + UnhookEvent(hTabsrmmButtonPressed); + } + for(int i=0; i < PasteToWeb::pages; ++i) + { + if(pasteToWebs[i] != NULL) + { + delete pasteToWebs[i]; + pasteToWebs[i] = NULL; + } + } + if(Options::instance != NULL) + { + delete Options::instance; + Options::instance = NULL; + } + + delete contactWindows; + return 0; +} diff --git a/plugins/PasteIt/PasteIt.rc b/plugins/PasteIt/PasteIt.rc new file mode 100644 index 0000000000..e428a849ab --- /dev/null +++ b/plugins/PasteIt/PasteIt.rc @@ -0,0 +1,140 @@ +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +//#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +#include +#include + +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1250) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_OPT_MAIN DIALOGEX 0, 0, 285, 225 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Settings",IDC_STATIC,7,5,274,220 + COMBOBOX IDC_WEBLIST,134,20,135,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Default web page",IDC_STATIC,14,23,117,8 + COMBOBOX IDC_CODEPAGE,134,43,135,30,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + LTEXT "Default file encoding",IDC_STATIC,14,45,114,8 + CONTROL "Auto-detect UTF-8",IDC_AUTOUTF, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,66,236,10 + CONTROL "Show confirmation dialog box",IDC_CONFDLG, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,80,236,10 + CONTROL "Autosend download link to contact",IDC_AUTOSEND, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,94,236,10 +END + +IDD_OPT_PAGES DIALOGEX 0, 0, 285, 225 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Web page settings",IDC_STATIC,7,30,274,195 + COMBOBOX IDC_WEBPAGE,145,7,135,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Web page to configure",IDC_STATIC,14,10,125,8 + COMBOBOX IDC_DEFFORMAT,138,43,80,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE,223,43,50,14 + LTEXT "Default formatting",IDC_STATIC,14,45,120,8 + CONTROL "Auto-detect format from file extension",IDC_AUTOFORMAT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,66,236,10 + CONTROL "Public paste",IDC_PUBLICPASTE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,66,236,10 + COMBOBOX IDC_COMBO1,138,83,135,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "",IDC_COMBO1_DESC,14,86,120,8 + CONTROL "Login as guest",IDC_GUEST, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,236,10 + EDITTEXT IDC_PASTEBIN_KEY,138,123,135,12,WS_TABSTOP|ES_AUTOHSCROLL + LTEXT "User key",IDC_PASTEBIN_KEY_DESC,14,126,90,8 + PUSHBUTTON "Get user key",IDC_PASTEBIN_LOGIN,14,143,80,14, BS_MULTILINE +END + +IDD_DLG_CONFIGURE DIALOGEX 0, 0, 214, 178 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Configure formatting" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,120,159,40,14 + PUSHBUTTON "Cancel",IDCANCEL,164,159,40,14 + LISTBOX IDC_FORMATTING,10,10,150,144, WS_VSCROLL | LBS_WANTKEYBOARDINPUT + PUSHBUTTON "Up",IDC_UP,164,10,40,14 + PUSHBUTTON "Down",IDC_DOWN,164,26,40,14 + PUSHBUTTON "Delete",IDC_DELETE,164,42,40,14 + PUSHBUTTON "Restore defaults",IDC_RESTORE,164,90,40,28, BS_MULTILINE + PUSHBUTTON "Download more",IDC_DOWNLOAD,164,120,40,28, BS_MULTILINE +END + +IDD_DLG_PASTEBIN_LOGIN DIALOGEX 0, 0, 154, 60 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Login to pastebin.com" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + EDITTEXT IDC_PASTEBIN_USER,70,10,75,12,WS_TABSTOP|ES_AUTOHSCROLL + LTEXT "User name",IDC_STATIC,10,13,55,8 + EDITTEXT IDC_PASTEBIN_PASSWORD,70,25,75,12,WS_TABSTOP|ES_PASSWORD|ES_AUTOHSCROLL + LTEXT "Password",IDC_STATIC,10,28,55,8 + DEFPUSHBUTTON "OK",IDOK,60,40,40,14 + PUSHBUTTON "Cancel",IDCANCEL,104,40,40,14 +END + +IDD_DLG_FROM_CLIPBOARD DIALOGEX 0, 0, 214, 178 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Paste It" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,120,159,40,14 + PUSHBUTTON "Cancel",IDCANCEL,164,159,40,14 + EDITTEXT IDC_CLIPBOARD_DATA,10,10,194,129,WS_HSCROLL | WS_VSCROLL | ES_READONLY | ES_MULTILINE + COMBOBOX IDC_FORMAT,65,142,139,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Format",IDC_STATIC,10,144,50,8 +END + +IDD_DLG_FROM_FILE DIALOGEX 0, 0, 214, 208 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Paste It" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,120,189,40,14 + PUSHBUTTON "Cancel",IDCANCEL,164,189,40,14 + EDITTEXT IDC_FILE_PATH,10,10,194,12,ES_READONLY | ES_AUTOHSCROLL + EDITTEXT IDC_FILE_DATA,10,27,194,112,WS_HSCROLL | WS_VSCROLL | ES_READONLY | ES_MULTILINE + COMBOBOX IDC_CODEPAGE,65,142,139,30,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + LTEXT "Encoding",IDC_STATIC,10,144,50,8 + CONTROL "Auto-detect format from file extension",IDC_AUTOFORMAT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,159,180,10 + COMBOBOX IDC_FORMAT,65,172,139,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Format",IDC_FORMATTEXT,10,174,50,8 + PUSHBUTTON "Recode",IDC_RECODE,10,189,60,14 +END + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_MENU ICON "icons\\Paste.ico" +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + diff --git a/plugins/PasteIt/PasteIt.sln b/plugins/PasteIt/PasteIt.sln new file mode 100644 index 0000000000..45c1f9274a --- /dev/null +++ b/plugins/PasteIt/PasteIt.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PasteIt", "PasteIt.vcxproj", "{BAEBC482-CDA9-4053-A7D0-08222E85118E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BAEBC482-CDA9-4053-A7D0-08222E85118E}.Debug|Win32.ActiveCfg = Debug|Win32 + {BAEBC482-CDA9-4053-A7D0-08222E85118E}.Debug|Win32.Build.0 = Debug|Win32 + {BAEBC482-CDA9-4053-A7D0-08222E85118E}.Debug|x64.ActiveCfg = Debug|x64 + {BAEBC482-CDA9-4053-A7D0-08222E85118E}.Debug|x64.Build.0 = Debug|x64 + {BAEBC482-CDA9-4053-A7D0-08222E85118E}.Release|Win32.ActiveCfg = Release|Win32 + {BAEBC482-CDA9-4053-A7D0-08222E85118E}.Release|Win32.Build.0 = Release|Win32 + {BAEBC482-CDA9-4053-A7D0-08222E85118E}.Release|x64.ActiveCfg = Release|x64 + {BAEBC482-CDA9-4053-A7D0-08222E85118E}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/plugins/PasteIt/PasteIt.vcxproj b/plugins/PasteIt/PasteIt.vcxproj new file mode 100644 index 0000000000..0cb427047b --- /dev/null +++ b/plugins/PasteIt/PasteIt.vcxproj @@ -0,0 +1,226 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {BAEBC482-CDA9-4053-A7D0-08222E85118E} + Win32Proj + PasteIt + + + + DynamicLibrary + true + Unicode + Windows7.1SDK + + + DynamicLibrary + true + Unicode + Windows7.1SDK + + + DynamicLibrary + false + true + Unicode + v90 + + + DynamicLibrary + false + true + Unicode + Windows7.1SDK + + + + + + + + + + + + + + + + + + + true + obj\$(Platform)\$(Configuration)\ + C:\Miranda\Plugins\ + + + true + obj\$(Platform)\$(Configuration)\ + C:\Miranda Im\Plugins\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + obj\$(Platform)\$(Configuration)\ + + + false + obj\$(Platform)\$(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;PASTEIT_EXPORTS;%(PreprocessorDefinitions) + ..\..\include;%(AdditionalIncludeDirectories) + + + Windows + true + %(AdditionalDependencies) + + + ..\..\include\msapi;%(AdditionalIncludeDirectories) + + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;PASTEIT_EXPORTS;_WIN64;_AMD64_;%(PreprocessorDefinitions) + ..\..\include;%(AdditionalIncludeDirectories) + + + Windows + true + %(AdditionalDependencies) + + + ..\..\include\msapi;%(AdditionalIncludeDirectories) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;PASTEIT_EXPORTS;%(PreprocessorDefinitions) + ..\..\include;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + %(AdditionalDependencies) + + + ..\..\include\msapi;%(AdditionalIncludeDirectories) + + + if not exist "$(TargetDir)Docs\" mkdir "$(TargetDir)Docs\" +copy "$(ProjectDir)Docs\*.*" "$(TargetDir)Docs\" + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;PASTEIT_EXPORTS;_WIN64;_AMD64_;%(PreprocessorDefinitions) + ..\..\include;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + %(AdditionalDependencies) + + + ..\..\include\msapi;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + if not exist "$(TargetDir)Docs\" mkdir "$(TargetDir)Docs\" +copy "$(ProjectDir)Docs\*.*" "$(TargetDir)Docs\" + + + + + + + + + + + + + + + false + false + + + + + false + false + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + false + + + + + + + \ No newline at end of file diff --git a/plugins/PasteIt/PasteIt.vcxproj.filters b/plugins/PasteIt/PasteIt.vcxproj.filters new file mode 100644 index 0000000000..afdb460375 --- /dev/null +++ b/plugins/PasteIt/PasteIt.vcxproj.filters @@ -0,0 +1,94 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {e6bd3d70-0d30-4cf4-a284-c0fd38c83fa5} + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Resource Files + + + Resource Files + + + + + Resource Files + + + Resource Files\Docs + + + Resource Files\Docs + + + Resource Files\Docs + + + Resource Files\Docs + + + \ No newline at end of file diff --git a/plugins/PasteIt/PasteToWeb.cpp b/plugins/PasteIt/PasteToWeb.cpp new file mode 100644 index 0000000000..a7cc9a3b5f --- /dev/null +++ b/plugins/PasteIt/PasteToWeb.cpp @@ -0,0 +1,577 @@ +/* +Paste It plugin +Copyright (C) 2011 Krzysztof Kral + +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 . +*/ + +#include "StdAfx.h" +#include "PasteToWeb.h" +#include "Options.h" +#include "resource.h" + +extern HINSTANCE hInst; + +PasteToWeb::PasteToWeb() +{ +} + + +PasteToWeb::~PasteToWeb() +{ +} + +struct FromClipboardData +{ + std::wstring content; + int page; + std::wstring format; +}; + +struct FromFileData +{ + char* content; + int contentLen; + wchar_t* contentW; + UINT codepage; + std::wstring *fileName; + int page; + std::wstring format; + bool sendFileName; +}; + +INT_PTR CALLBACK DlgProcFromClipboard(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + FromClipboardData* data = (FromClipboardData*)lParam; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + int ts = 4; + Edit_SetTabStops(GetDlgItem(hwndDlg, IDC_CLIPBOARD_DATA), 1, &ts); + SetDlgItemText(hwndDlg, IDC_CLIPBOARD_DATA, data->content.c_str()); + int sel = 0; + int i = 0; + std::wstring &defFormat = Options::instance->webOptions[data->page]->defFormatId; + HWND cb = GetDlgItem(hwndDlg, IDC_FORMAT); + for(std::list::iterator it = Options::instance->webOptions[data->page]->formats.begin(); it != Options::instance->webOptions[data->page]->formats.end(); ++it) + { + ComboBox_AddString(cb, it->name.c_str()); + if(it->id == defFormat) + sel = i; + ++i; + } + if(!Options::instance->webOptions[data->page]->formats.empty()) + { + ComboBox_SetCurSel(cb, sel); + } + return TRUE; + } + case WM_COMMAND: + { + if (HIWORD(wParam) == BN_CLICKED) + { + if (LOWORD(wParam) == IDOK) + { + FromClipboardData *clipboardData = (FromClipboardData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + int sel = ComboBox_GetCurSel(GetDlgItem(hwndDlg, IDC_FORMAT)); + for(std::list::iterator it = Options::instance->webOptions[clipboardData->page]->formats.begin(); it != Options::instance->webOptions[clipboardData->page]->formats.end(); ++it) + { + if(sel-- <= 0) + { + clipboardData->format = it->id; + break; + } + } + + EndDialog(hwndDlg, IDC_BTN_OK); + } + else if (LOWORD(wParam) == IDCANCEL) + { + EndDialog(hwndDlg, IDCANCEL); + } + } + + break; + } + } + + return FALSE; +} + +void RecodeDlg(HWND hwndDlg) +{ + ShowWindow(GetDlgItem(hwndDlg,IDC_RECODE),SW_HIDE); + FromFileData *fromFileData = (FromFileData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + unsigned int cp = Options::GetCodepageCB(GetDlgItem(hwndDlg, IDC_CODEPAGE), false, fromFileData->codepage); + mir_free(fromFileData->contentW); + int cbLen = 0; + if(cp == 1200 || cp == 1201) + { + // UTF-16 + cbLen = fromFileData->contentLen / 2; + } + else + { + cbLen = MultiByteToWideChar( cp, 0, fromFileData->content, fromFileData->contentLen, NULL, 0 ); + } + + fromFileData->contentW = ( wchar_t* )mir_alloc( sizeof( wchar_t )*(cbLen+1)); + if ( fromFileData->contentW != NULL ) + { + if(cp == 1200) + { + memcpy_s(fromFileData->contentW, sizeof( wchar_t )*(cbLen+1), fromFileData->content, sizeof( wchar_t )*cbLen); + } + else if(cp == 1201) + { + for(int i = 0 ; i < cbLen; ++i) + { + fromFileData->contentW[i] = ((unsigned char)fromFileData->content[i*2] << 8) | (unsigned char)fromFileData->content[i*2 + 1]; + } + } + else + { + MultiByteToWideChar( cp, 0, fromFileData->content, fromFileData->contentLen, fromFileData->contentW, cbLen ); + } + + fromFileData->contentW[ cbLen ] = 0; + SetDlgItemText(hwndDlg, IDC_FILE_DATA, fromFileData->contentW); + } + else + { + SetDlgItemText(hwndDlg, IDC_FILE_DATA, _T("")); + } + + fromFileData->codepage = cp; +} + +INT_PTR CALLBACK DlgProcFromFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + FromFileData *fromFileData = (FromFileData*)lParam; + int ts = 4; + Edit_SetTabStops(GetDlgItem(hwndDlg, IDC_FILE_DATA), 1, &ts); + SetDlgItemText(hwndDlg, IDC_FILE_DATA, fromFileData->contentW); + SetDlgItemText(hwndDlg, IDC_FILE_PATH, fromFileData->fileName->c_str()); + Options::InitCodepageCB(GetDlgItem(hwndDlg, IDC_CODEPAGE), fromFileData->codepage); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + ShowWindow(GetDlgItem(hwndDlg,IDC_RECODE),SW_HIDE); + + int sel = 0; + int i = 0; + std::wstring &defFormat = Options::instance->webOptions[fromFileData->page]->defFormatId; + HWND cb = GetDlgItem(hwndDlg, IDC_FORMAT); + for(std::list::iterator it = Options::instance->webOptions[fromFileData->page]->formats.begin(); it != Options::instance->webOptions[fromFileData->page]->formats.end(); ++it) + { + ComboBox_AddString(cb, it->name.c_str()); + if(it->id == defFormat) + sel = i; + ++i; + } + if(!Options::instance->webOptions[fromFileData->page]->formats.empty()) + { + ComboBox_SetCurSel(cb, sel); + } + + if(Options::instance->webOptions[fromFileData->page]->isSendFileName) + { + bool sendFileName = Options::instance->webOptions[fromFileData->page]->sendFileName; + CheckDlgButton(hwndDlg, IDC_AUTOFORMAT, sendFileName ? 1 : 0); + Button_Enable(GetDlgItem(hwndDlg, IDC_FORMAT), sendFileName ? 0 : 1); + Button_Enable(GetDlgItem(hwndDlg, IDC_FORMATTEXT), sendFileName ? 0 : 1); + } + else + Button_Enable(GetDlgItem(hwndDlg, IDC_AUTOFORMAT), FALSE); + return TRUE; + } + case WM_COMMAND: + { + if (HIWORD(wParam) == BN_CLICKED) + { + if (LOWORD(wParam) == IDOK) + { + FromFileData *fromFileData = (FromFileData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + int sel = ComboBox_GetCurSel(GetDlgItem(hwndDlg, IDC_FORMAT)); + for(std::list::iterator it = Options::instance->webOptions[fromFileData->page]->formats.begin(); it != Options::instance->webOptions[fromFileData->page]->formats.end(); ++it) + { + if(sel-- <= 0) + { + fromFileData->format = it->id; + break; + } + } + + if(Options::instance->webOptions[fromFileData->page]->isSendFileName) + fromFileData->sendFileName = IsDlgButtonChecked(hwndDlg, IDC_AUTOFORMAT) ? true : false; + else + fromFileData->sendFileName = false; + + EndDialog(hwndDlg, IDC_BTN_OK); + } + else if (LOWORD(wParam) == IDCANCEL) + { + EndDialog(hwndDlg, IDCANCEL); + } + else if(LOWORD(wParam) == IDC_RECODE) + { + RecodeDlg(hwndDlg); + } + else if(LOWORD(wParam) == IDC_AUTOFORMAT) + { + UINT sendFileName = IsDlgButtonChecked(hwndDlg, IDC_AUTOFORMAT); + Button_Enable(GetDlgItem(hwndDlg, IDC_FORMAT), sendFileName ? 0 : 1); + Button_Enable(GetDlgItem(hwndDlg, IDC_FORMATTEXT), sendFileName ? 0 : 1); + } + } + else if(LOWORD(wParam) == IDC_CODEPAGE) + { + if(HIWORD(wParam) == CBN_SELCHANGE) + { + RecodeDlg(hwndDlg); + } + else if(HIWORD(wParam) == CBN_EDITCHANGE) + { + ShowWindow(GetDlgItem(hwndDlg,IDC_RECODE),SW_SHOW); + } + else if(HIWORD(wParam) == CBN_KILLFOCUS) + { + FromFileData *fromFileData = (FromFileData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + Options::GetCodepageCB(GetDlgItem(hwndDlg, IDC_CODEPAGE), true, fromFileData->codepage); + } + } + + break; + } + } + + return FALSE; +} + +void PasteToWeb::FromClipboard() +{ + szFileLink[0] = 0; + error = NULL; + std::wstring str; + BOOL isFile = 0; + if(OpenClipboard(NULL)) + { + HANDLE obj = GetClipboardData(CF_UNICODETEXT); + if(obj != NULL) + { + LPCWSTR wStr = (LPCWSTR)GlobalLock(obj); + str.append(wStr, wStr + wcslen(wStr)); + GlobalUnlock(obj); + // Sometimes clipboard CF_UNICODETEXT format returns only 2 characters, + // to fix this I check if CF_TEXT contains more characters, + // if this is true, this mean that CF_UNICODETEXT is invalid. + obj = GetClipboardData(CF_TEXT); + if(obj != NULL) + { + LPCSTR cStr = (LPCSTR)GlobalLock(obj); + if(strlen(cStr) > str.length()) + { + str = L""; + LPWSTR wStr = mir_a2u_cp(cStr, CP_ACP); + str.append(wStr, wStr + wcslen(wStr)); + mir_free(wStr); + } + GlobalUnlock(obj); + } + } + else + { + obj = GetClipboardData(CF_TEXT); + if(obj != NULL) + { + LPCSTR cStr = (LPCSTR)GlobalLock(obj); + LPWSTR wStr = mir_a2u_cp(cStr, CP_ACP); + str.append(wStr, wStr + wcslen(wStr)); + mir_free(wStr); + GlobalUnlock(obj); + } + else + { + obj = GetClipboardData(CF_HDROP); + if(obj != NULL) + { + LPDROPFILES df = (LPDROPFILES) GlobalLock(obj); + isFile = 1; + if(df->fWide) + { + // Unicode + WCHAR* file = (WCHAR*)((BYTE*)obj + df->pFiles); + size_t len = wcslen(file); + if(*(file + len + 1) == L'\0') + { + str.append(file, file + len); + } + else + { + error = TranslateT("You can only paste 1 file"); + } + } + else + { + // ANSI + char* file = (char*)obj + df->pFiles; + size_t len = strlen(file); + if(*(file + len + 1) == '\0') + { + LPWSTR wStr = mir_a2u_cp(file, CP_ACP); + str.append(wStr, wStr + wcslen(wStr)); + mir_free(wStr); + } + else + { + error = TranslateT("You can only paste 1 file"); + } + } + GlobalUnlock(obj); + } + } + } + + CloseClipboard(); + } + + if(str.length() > 0) + { + if(isFile) + FromFile(str); + else + { + FromClipboardData data; + data.content = str; + data.page = pageIndex; + if (Options::instance->confDlg && DialogBoxParam (hInst, MAKEINTRESOURCE(IDD_DLG_FROM_CLIPBOARD), 0, DlgProcFromClipboard, (LPARAM)&data) != IDC_BTN_OK) + return; + + SendToServer(str, L"", data.format); + } + } + else if(error == NULL) + { + error = TranslateT("Cannot get data from clipboard"); + } +} + +void PasteToWeb::FromFile(std::wstring file) +{ + error = NULL; + szFileLink[0] = 0; + HANDLE hFile = CreateFile(file.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + FromFileData fromFileData; + fromFileData.content = NULL; + fromFileData.contentLen = 0; + fromFileData.fileName = &file; + if(hFile != INVALID_HANDLE_VALUE) + { + LARGE_INTEGER fileSize; + if(GetFileSizeEx(hFile, &fileSize)) + { + if(fileSize.QuadPart <= 10485760LL) + { + if(fileSize.QuadPart > 512000LL) + { + _stprintf_s(bufErr, 1024, TranslateT("File size is %dKB, do you realy want to paste such large file?"), fileSize.LowPart / 1024); + if(MessageBox(NULL, bufErr, TranslateT("Are You sure?"), MB_YESNO | MB_ICONQUESTION) != IDYES) + { + CloseHandle(hFile); + return; + } + } + DWORD readed; + fromFileData.contentLen = fileSize.LowPart; + fromFileData.content = (char*)mir_alloc(fromFileData.contentLen); + if(!ReadFile(hFile, fromFileData.content, fromFileData.contentLen, &readed, NULL)) + { + mir_free(fromFileData.content); + fromFileData.content = NULL; + fromFileData.contentLen = 0; + _stprintf_s(bufErr, 1024, TranslateT("Cannot read file '%s'"), file.c_str()); + error = bufErr; + } + } + else + { + error = TranslateT("File size is larger then 10MB, cannot be send"); + } + } + + CloseHandle(hFile); + } + else + { + _stprintf_s(bufErr, 1024, TranslateT("Cannot open file '%s'"), file.c_str()); + error = bufErr; + } + + if(fromFileData.content != NULL) + { + int cbLen = 0; + bool isDefTranslation = true; + if(Options::instance->autoUTF) + { + isDefTranslation = false; + fromFileData.codepage = CP_UTF8; + cbLen = MultiByteToWideChar( fromFileData.codepage, MB_ERR_INVALID_CHARS, fromFileData.content, fromFileData.contentLen, NULL, 0 ); + if(cbLen == 0) + { + int errorN = GetLastError(); + if(errorN == ERROR_NO_UNICODE_TRANSLATION) + { + isDefTranslation = true; + } + } + } + + if(isDefTranslation) + { + fromFileData.codepage = Options::instance->codepage; + if(fromFileData.codepage == 1200 || fromFileData.codepage == 1201) + { + // UTF-16 + cbLen = fromFileData.contentLen / 2; + } + else + { + cbLen = MultiByteToWideChar( fromFileData.codepage, 0, fromFileData.content, fromFileData.contentLen, NULL, 0 ); + } + } + + if(cbLen > 0) + { + fromFileData.contentW = ( wchar_t* )mir_alloc( sizeof( wchar_t )*(cbLen+1)); + if ( fromFileData.contentW != NULL ) + { + if(fromFileData.codepage == 1200) + { + memcpy_s(fromFileData.contentW, sizeof( wchar_t )*(cbLen+1), fromFileData.content, sizeof( wchar_t )*cbLen); + } + else if(fromFileData.codepage == 1201) + { + for(int i = 0 ; i < cbLen; ++i) + { + fromFileData.contentW[i] = (fromFileData.content[i*2] << 8) | fromFileData.content[i*2 + 1]; + } + } + else + { + MultiByteToWideChar( fromFileData.codepage, 0, fromFileData.content, fromFileData.contentLen, fromFileData.contentW, cbLen ); + } + + fromFileData.contentW[ cbLen ] = 0; + fromFileData.page = pageIndex; + if (!Options::instance->confDlg || DialogBoxParam (hInst, MAKEINTRESOURCE(IDD_DLG_FROM_FILE), 0, DlgProcFromFile, (LPARAM)&fromFileData) == IDC_BTN_OK) + { + std::wstring fileName; + std::wstring::size_type pos1 = file.find_last_of(L'\\'); + std::wstring::size_type pos2 = file.find_last_of(L'/'); + if(pos2 > pos1 && pos2 < file.length()) + pos1 = pos2; + if(pos1 >= 0 && pos1 + 1 < file.length()) + fileName = file.substr(pos1 + 1); + else + fileName = file; + SendToServer(fromFileData.contentW, fromFileData.sendFileName ? fileName : L"", fromFileData.format); + } + mir_free(fromFileData.contentW); + } + } + else + { + _stprintf_s(bufErr, 1024, TranslateT("File '%s' is empty"), file.c_str()); + error = bufErr; + } + mir_free(fromFileData.content); + } +} + +extern HANDLE g_hNetlibUser; + +wchar_t* PasteToWeb::SendToWeb(char* url, std::map& headers, std::wstring content) +{ + wchar_t* resCont = NULL; + int cbLen = WideCharToMultiByte( CP_UTF8, 0, content.c_str(), -1, NULL, 0, NULL, NULL ); + char* contentBytes = ( char* )mir_alloc(cbLen); + if ( contentBytes == NULL ) + return resCont; + + WideCharToMultiByte( CP_UTF8, 0, content.c_str(), -1, contentBytes, cbLen, NULL, NULL ); + --cbLen; + + int nHeaders = 0; + for(std::map::iterator it = headers.begin(); it != headers.end(); ++it) + { + ++nHeaders; + } + + NETLIBHTTPREQUEST nlhr={0}; + NETLIBHTTPHEADER* httpHeaders = new NETLIBHTTPHEADER[nHeaders]; + nlhr.cbSize=sizeof(nlhr); + nlhr.requestType=REQUEST_POST; + nlhr.flags=NLHRF_NODUMPSEND|NLHRF_DUMPASTEXT|NLHPIF_HTTP11; + nlhr.szUrl=url; + nlhr.headers = httpHeaders; + nlhr.pData = contentBytes; + nlhr.dataLength = cbLen; + nHeaders = 0; + std::list mallBuf; + for(std::map::iterator it = headers.begin(); it != headers.end(); ++it) + { + char* b1 = new char[it->first.length() + 1]; + char* b2 = new char[it->second.length() + 1]; + strcpy_s(b1, it->first.length() + 1, it->first.c_str()); + strcpy_s(b2, it->second.length() + 1, it->second.c_str()); + httpHeaders[nHeaders].szName = b1; + httpHeaders[nHeaders].szValue = b2; + mallBuf.push_back(b1); + mallBuf.push_back(b2); + ++nHeaders; + } + + nlhr.headersCount = nHeaders; + NETLIBHTTPREQUEST* nlhrReply = (NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION,(WPARAM)g_hNetlibUser,(LPARAM)&nlhr); + if(nlhrReply != NULL) + { + if(nlhrReply->resultCode == 200) + { + int resLen = MultiByteToWideChar(CP_UTF8, 0, nlhrReply->pData, nlhrReply->dataLength, NULL, 0); + ++resLen; + resCont = ( wchar_t* )mir_alloc(resLen * sizeof(wchar_t)); + if ( resCont != NULL ) + { + resLen = MultiByteToWideChar( CP_UTF8, 0, nlhrReply->pData, nlhrReply->dataLength, resCont, resLen); + resCont[resLen] = 0; + } + } + + CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply); + } + delete httpHeaders; + for(std::list::iterator it = mallBuf.begin(); it != mallBuf.end(); ++it) + { + delete *it; + } + + mir_free(contentBytes); + return resCont; +} diff --git a/plugins/PasteIt/PasteToWeb.h b/plugins/PasteIt/PasteToWeb.h new file mode 100644 index 0000000000..51e2141790 --- /dev/null +++ b/plugins/PasteIt/PasteToWeb.h @@ -0,0 +1,47 @@ +/* +Paste It plugin +Copyright (C) 2011 Krzysztof Kral + +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 . +*/ + +#pragma once + +struct PasteFormat +{ + std::wstring id; + std::wstring name; +}; + +class PasteToWeb +{ +protected: + virtual void SendToServer(std::wstring str, std::wstring fileName, std::wstring format) = 0; + wchar_t* SendToWeb(char* url, std::map& headers, std::wstring content); + PasteToWeb(); + TCHAR bufErr[1024]; +public: + virtual ~PasteToWeb(); + char szFileLink[256]; + TCHAR* error; + void FromClipboard(); + void FromFile(std::wstring file); + virtual TCHAR* GetName() = 0; + virtual void ConfigureSettings() = 0; + int pageIndex; + virtual std::list GetFormats() = 0; + virtual std::list GetDefFormats() = 0; + static const int pages = 2; +}; + diff --git a/plugins/PasteIt/PasteToWeb1.cpp b/plugins/PasteIt/PasteToWeb1.cpp new file mode 100644 index 0000000000..bbdc2e1ba5 --- /dev/null +++ b/plugins/PasteIt/PasteToWeb1.cpp @@ -0,0 +1,393 @@ +/* +Paste It plugin +Copyright (C) 2011 Krzysztof Kral + +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 . +*/ + +#include "StdAfx.h" +#include "PasteToWeb1.h" +#include "Options.h" + +PasteFormat PasteToWeb1::formats[] = +{ + {L"4cs", L"4CS"}, + {L"6502acme", L"6502 ACME Cross Assembler"}, + {L"6502kickass", L"6502 Kick Assembler"}, + {L"6502tasm", L"6502 TASM/64TASS"}, + {L"abap", L"ABAP"}, + {L"actionscript", L"ActionScript"}, + {L"actionscript3", L"ActionScript 3"}, + {L"ada", L"Ada"}, + {L"algol68", L"ALGOL 68"}, + {L"apache", L"Apache Log"}, + {L"applescript", L"AppleScript"}, + {L"apt_sources", L"APT Sources"}, + {L"asm", L"ASM (NASM)"}, + {L"asp", L"ASP"}, + {L"autoconf", L"autoconf"}, + {L"autohotkey", L"Autohotkey"}, + {L"autoit", L"AutoIt"}, + {L"avisynth", L"Avisynth"}, + {L"awk", L"Awk"}, + {L"bascomavr", L"BASCOM AVR"}, + {L"bash", L"Bash"}, + {L"basic4gl", L"Basic4GL"}, + {L"bibtex", L"BibTeX"}, + {L"blitzbasic", L"Blitz Basic"}, + {L"bnf", L"BNF"}, + {L"boo", L"BOO"}, + {L"bf", L"BrainFuck"}, + {L"c", L"C"}, + {L"c_mac", L"C for Macs"}, + {L"cil", L"C Intermediate Language"}, + {L"csharp", L"C#"}, + {L"cpp", L"C++"}, + {L"cpp-qt", L"C++ (with QT extensions)"}, + {L"c_loadrunner", L"C: Loadrunner"}, + {L"caddcl", L"CAD DCL"}, + {L"cadlisp", L"CAD Lisp"}, + {L"cfdg", L"CFDG"}, + {L"chaiscript", L"ChaiScript"}, + {L"clojure", L"Clojure"}, + {L"klonec", L"Clone C"}, + {L"klonecpp", L"Clone C++"}, + {L"cmake", L"CMake"}, + {L"cobol", L"COBOL"}, + {L"coffeescript", L"CoffeeScript"}, + {L"cfm", L"ColdFusion"}, + {L"css", L"CSS"}, + {L"cuesheet", L"Cuesheet"}, + {L"d", L"D"}, + {L"dcs", L"DCS"}, + {L"delphi", L"Delphi"}, + {L"oxygene", L"Delphi Prism (Oxygene)"}, + {L"diff", L"Diff"}, + {L"div", L"DIV"}, + {L"dos", L"DOS"}, + {L"dot", L"DOT"}, + {L"e", L"E"}, + {L"ecmascript", L"ECMAScript"}, + {L"eiffel", L"Eiffel"}, + {L"email", L"Email"}, + {L"epc", L"EPC"}, + {L"erlang", L"Erlang"}, + {L"fsharp", L"F#"}, + {L"falcon", L"Falcon"}, + {L"fo", L"FO Language"}, + {L"f1", L"Formula One"}, + {L"fortran", L"Fortran"}, + {L"freebasic", L"FreeBasic"}, + {L"gambas", L"GAMBAS"}, + {L"gml", L"Game Maker"}, + {L"gdb", L"GDB"}, + {L"genero", L"Genero"}, + {L"genie", L"Genie"}, + {L"gettext", L"GetText"}, + {L"go", L"Go"}, + {L"groovy", L"Groovy"}, + {L"gwbasic", L"GwBasic"}, + {L"haskell", L"Haskell"}, + {L"hicest", L"HicEst"}, + {L"hq9plus", L"HQ9 Plus"}, + {L"html4strict", L"HTML"}, + {L"html5", L"HTML 5"}, + {L"icon", L"Icon"}, + {L"idl", L"IDL"}, + {L"ini", L"INI file"}, + {L"inno", L"Inno Script"}, + {L"intercal", L"INTERCAL"}, + {L"io", L"IO"}, + {L"j", L"J"}, + {L"java", L"Java"}, + {L"java5", L"Java 5"}, + {L"javascript", L"JavaScript"}, + {L"jquery", L"jQuery"}, + {L"kixtart", L"KiXtart"}, + {L"latex", L"Latex"}, + {L"lb", L"Liberty BASIC"}, + {L"lsl2", L"Linden Scripting"}, + {L"lisp", L"Lisp"}, + {L"llvm", L"LLVM"}, + {L"locobasic", L"Loco Basic"}, + {L"logtalk", L"Logtalk"}, + {L"lolcode", L"LOL Code"}, + {L"lotusformulas", L"Lotus Formulas"}, + {L"lotusscript", L"Lotus Script"}, + {L"lscript", L"LScript"}, + {L"lua", L"Lua"}, + {L"m68k", L"M68000 Assembler"}, + {L"magiksf", L"MagikSF"}, + {L"make", L"Make"}, + {L"mapbasic", L"MapBasic"}, + {L"matlab", L"MatLab"}, + {L"mirc", L"mIRC"}, + {L"mmix", L"MIX Assembler"}, + {L"modula2", L"Modula 2"}, + {L"modula3", L"Modula 3"}, + {L"68000devpac", L"Motorola 68000 HiSoft Dev"}, + {L"mpasm", L"MPASM"}, + {L"mxml", L"MXML"}, + {L"mysql", L"MySQL"}, + {L"newlisp", L"newLISP"}, + {L"text", L"None"}, + {L"nsis", L"NullSoft Installer"}, + {L"oberon2", L"Oberon 2"}, + {L"objeck", L"Objeck Programming Langua"}, + {L"objc", L"Objective C"}, + {L"ocaml-brief", L"OCalm Brief"}, + {L"ocaml", L"OCaml"}, + {L"pf", L"OpenBSD PACKET FILTER"}, + {L"glsl", L"OpenGL Shading"}, + {L"oobas", L"Openoffice BASIC"}, + {L"oracle11", L"Oracle 11"}, + {L"oracle8", L"Oracle 8"}, + {L"oz", L"Oz"}, + {L"pascal", L"Pascal"}, + {L"pawn", L"PAWN"}, + {L"pcre", L"PCRE"}, + {L"per", L"Per"}, + {L"perl", L"Perl"}, + {L"perl6", L"Perl 6"}, + {L"php", L"PHP"}, + {L"php-brief", L"PHP Brief"}, + {L"pic16", L"Pic 16"}, + {L"pike", L"Pike"}, + {L"pixelbender", L"Pixel Bender"}, + {L"plsql", L"PL/SQL"}, + {L"postgresql", L"PostgreSQL"}, + {L"povray", L"POV-Ray"}, + {L"powershell", L"Power Shell"}, + {L"powerbuilder", L"PowerBuilder"}, + {L"proftpd", L"ProFTPd"}, + {L"progress", L"Progress"}, + {L"prolog", L"Prolog"}, + {L"properties", L"Properties"}, + {L"providex", L"ProvideX"}, + {L"purebasic", L"PureBasic"}, + {L"pycon", L"PyCon"}, + {L"python", L"Python"}, + {L"q", L"q/kdb+"}, + {L"qbasic", L"QBasic"}, + {L"rsplus", L"R"}, + {L"rails", L"Rails"}, + {L"rebol", L"REBOL"}, + {L"reg", L"REG"}, + {L"robots", L"Robots"}, + {L"rpmspec", L"RPM Spec"}, + {L"ruby", L"Ruby"}, + {L"gnuplot", L"Ruby Gnuplot"}, + {L"sas", L"SAS"}, + {L"scala", L"Scala"}, + {L"scheme", L"Scheme"}, + {L"scilab", L"Scilab"}, + {L"sdlbasic", L"SdlBasic"}, + {L"smalltalk", L"Smalltalk"}, + {L"smarty", L"Smarty"}, + {L"sql", L"SQL"}, + {L"systemverilog", L"SystemVerilog"}, + {L"tsql", L"T-SQL"}, + {L"tcl", L"TCL"}, + {L"teraterm", L"Tera Term"}, + {L"thinbasic", L"thinBasic"}, + {L"typoscript", L"TypoScript"}, + {L"unicon", L"Unicon"}, + {L"uscript", L"UnrealScript"}, + {L"vala", L"Vala"}, + {L"vbnet", L"VB.NET"}, + {L"verilog", L"VeriLog"}, + {L"vhdl", L"VHDL"}, + {L"vim", L"VIM"}, + {L"visualprolog", L"Visual Pro Log"}, + {L"vb", L"VisualBasic"}, + {L"visualfoxpro", L"VisualFoxPro"}, + {L"whitespace", L"WhiteSpace"}, + {L"whois", L"WHOIS"}, + {L"winbatch", L"Win Batch"}, + {L"xbasic", L"XBasic"}, + {L"xml", L"XML"}, + {L"xorg_conf", L"Xorg Config"}, + {L"xpp", L"XPP"}, + {L"yaml", L"YAML"}, + {L"z80", L"Z80 Assembler"}, + {L"zxbasic", L"ZXBasic"}, +}; + +PasteFormat PasteToWeb1::defFormats[] = +{ + {L"text", L"None"}, + {L"xml", L"XML"}, + {L"html4strict", L"HTML"}, + {L"html5", L"HTML 5"}, + {L"javascript", L"JavaScript"}, + {L"php", L"PHP"}, + {L"c", L"C"}, + {L"csharp", L"C#"}, + {L"cpp", L"C++"}, + {L"java", L"Java"}, + {L"java5", L"Java 5"}, + {L"ini", L"INI file"}, + {L"css", L"CSS"}, + {L"sql", L"SQL"}, + {L"asm", L"ASM (NASM)"}, + {L"asp", L"ASP"}, + {L"caddcl", L"CAD DCL"}, + {L"cadlisp", L"CAD Lisp"}, + {L"delphi", L"Delphi"}, + {L"diff", L"Diff"}, + {L"jquery", L"jQuery"}, + {L"latex", L"Latex"}, + {L"pascal", L"Pascal"}, + {L"perl", L"Perl"}, + {L"perl6", L"Perl 6"}, + {L"python", L"Python"}, + {L"vbnet", L"VB.NET"}, + {L"vb", L"VisualBasic"}, +}; + +PasteToWeb1::PasteToWeb1() +{ +} + + +PasteToWeb1::~PasteToWeb1() +{ +} + +void PasteToWeb1::SendToServer(std::wstring str, std::wstring fileName, std::wstring format) +{ + std::map headers; + headers["Content-Type"] = "application/x-www-form-urlencoded"; + std::wstring content = _T("api_option=paste&api_paste_private="); + content += Options::instance->webOptions[pageIndex]->publicPaste ? _T("0") : _T("1"); + content += _T("&api_paste_expire_date="); + content += Options::instance->webOptions[pageIndex]->combo1.empty() ? _T("1M") : Options::instance->webOptions[pageIndex]->combo1; + content += _T("&api_dev_key=dcba056bf9cc71729fdad76dddcb0dcd&api_paste_format="); + content += format; + if(!Options::instance->webOptions[pageIndex]->pastebinUserKey.empty()) + { + content += _T("&api_user_key="); + content += Options::instance->webOptions[pageIndex]->pastebinUserKey; + } + content += _T("&api_paste_code="); + for(std::wstring::iterator it = str.begin(); it != str.end(); ++it) + { + if(*it == L'%') + { + content += L"%25"; + } + else if(*it ==L'&') + { + content += L"%26"; + } + else if(*it ==L'=') + { + content += L"%3D"; + } + else + { + content += *it; + } + } + + wchar_t* resCont = SendToWeb("http://pastebin.com/api/api_post.php", headers, content); + if(resCont != NULL) + { + if(memcmp(L"Bad API request, ", resCont, 17 * sizeof(wchar_t)) == 0) + { + _stprintf_s(bufErr, 1024, TranslateT("Error during sending text to web page: %s"), resCont + 17); + error = bufErr; + } + else + { + char* s = mir_u2a_cp(resCont, CP_ACP); + strcpy_s(szFileLink, 256, s); + mir_free(s); + } + mir_free(resCont); + } + else + { + error = TranslateT("Error during sending text to web page"); + } +} + +std::wstring PasteToWeb1::GetUserKey(std::wstring& user, std::wstring& password) +{ + std::map headers; + headers["Content-Type"] = "application/x-www-form-urlencoded"; + std::wstring content = _T("api_user_name="); + content += user; + content += _T("&api_user_password="); + content += password; + content += _T("&api_dev_key=dcba056bf9cc71729fdad76dddcb0dcd"); + wchar_t* resCont = SendToWeb("http://pastebin.com/api/api_login.php", headers, content); + std::wstring toRet; + if(resCont != NULL) + { + if(memcmp(L"Bad API request, ", resCont, 17 * sizeof(wchar_t)) == 0) + { + _stprintf_s(bufErr, 1024, TranslateT("Error during getting user key from web page: %s"), resCont + 17); + MessageBox(NULL, bufErr, TranslateT("Error"), MB_OK | MB_ICONERROR); + } + else + toRet = resCont; + mir_free(resCont); + } + + return toRet; +} + +std::list PasteToWeb1::GetFormats() +{ + int count = sizeof(formats) / sizeof(formats[0]); + std::list ret(formats, formats + count); + + return ret; +} + +std::list PasteToWeb1::GetDefFormats() +{ + int count = sizeof(defFormats) / sizeof(defFormats[0]); + std::list ret(defFormats, defFormats + count); + + return ret; +} + +void PasteToWeb1::ConfigureSettings() +{ + Options::instance->webOptions[pageIndex]->isSendFileName = false; + Options::instance->webOptions[pageIndex]->isPublicPaste = true; + Options::instance->webOptions[pageIndex]->isCombo1 = true; + Options::instance->webOptions[pageIndex]->combo1Desc = TranslateT("Paste expire date"); + PasteFormat pf; + pf.id = L"N"; + pf.name = TranslateT("Never"); + Options::instance->webOptions[pageIndex]->combo1Values.push_back(pf); + pf.id = L"10M"; + pf.name = TranslateT("10 minutes"); + Options::instance->webOptions[pageIndex]->combo1Values.push_back(pf); + pf.id = L"1H"; + pf.name = TranslateT("1 hour"); + Options::instance->webOptions[pageIndex]->combo1Values.push_back(pf); + pf.id = L"1D"; + pf.name = TranslateT("1 day"); + Options::instance->webOptions[pageIndex]->combo1Values.push_back(pf); + pf.id = L"1M"; + pf.name = TranslateT("1 month"); + Options::instance->webOptions[pageIndex]->combo1Values.push_back(pf); + Options::instance->webOptions[pageIndex]->combo1 = L"1M"; + Options::instance->webOptions[pageIndex]->isPastebin = true; +} + diff --git a/plugins/PasteIt/PasteToWeb1.h b/plugins/PasteIt/PasteToWeb1.h new file mode 100644 index 0000000000..b1611855d6 --- /dev/null +++ b/plugins/PasteIt/PasteToWeb1.h @@ -0,0 +1,40 @@ +/* +Paste It plugin +Copyright (C) 2011 Krzysztof Kral + +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 . +*/ + +#pragma once +#include "pastetoweb.h" +class PasteToWeb1 : + public PasteToWeb +{ +protected: + virtual void SendToServer(std::wstring str, std::wstring fileName, std::wstring format); + static PasteFormat formats[]; + static PasteFormat defFormats[]; +public: + PasteToWeb1(); + virtual ~PasteToWeb1(); + virtual TCHAR* GetName() + { + return _T("pastebin.com"); + } + virtual void ConfigureSettings(); + virtual std::list GetFormats(); + virtual std::list GetDefFormats(); + std::wstring GetUserKey(std::wstring& user, std::wstring& password); +}; + diff --git a/plugins/PasteIt/PasteToWeb2.cpp b/plugins/PasteIt/PasteToWeb2.cpp new file mode 100644 index 0000000000..c2edbddeef --- /dev/null +++ b/plugins/PasteIt/PasteToWeb2.cpp @@ -0,0 +1,247 @@ +/* +Paste It plugin +Copyright (C) 2011 Krzysztof Kral + +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 . +*/ + +#include "StdAfx.h" +#include "PasteToWeb2.h" + +PasteFormat PasteToWeb2::defFormats[] = +{ + {L"text", L"Text"}, + {L"xml", L"XML"}, + {L"html", L"HTML"}, + {L"js", L"JavaScript"}, + {L"php", L"PHP"}, + {L"c", L"C"}, + {L"csharp", L"C#"}, + {L"cpp", L"C++"}, + {L"java", L"Java"}, + {L"ini", L"INI"}, + {L"css", L"CSS"}, + {L"sql", L"SQL"}, + {L"nasm", L"NASM"}, + {L"delphi", L"Delphi"}, + {L"diff", L"Diff"}, + {L"tex", L"TeX"}, + {L"perl", L"Perl"}, + {L"python", L"Python"}, + {L"vb.net", L"VB.net"} +}; + +PasteToWeb2::PasteToWeb2() +{ +} + + +PasteToWeb2::~PasteToWeb2() +{ +} + +void PasteToWeb2::SendToServer(std::wstring str, std::wstring fileName, std::wstring format) +{ + std::map headers; + headers["Content-Type"] = "text/xml"; + std::wstring content = _T("\r\ncreate_paste"); + if(fileName == L"") + { + content += format; + content += _T(""); + } + else + { + content += _T(""); + } + for(std::wstring::iterator it = str.begin(); it != str.end(); ++it) + { + if(*it == L'&') + { + content += L"&"; + } + else if(*it ==L'<') + { + content += L"<"; + } + else + { + content += *it; + } + } + + content += _T(""); + if(fileName != L"") + { + for(std::wstring::iterator it = fileName.begin(); it != fileName.end(); ++it) + { + if(*it == L'&') + { + content += L"&"; + } + else if(*it ==L'<') + { + content += L"<"; + } + else + { + content += *it; + } + } + } + content += _T("1.5"); + + wchar_t* resCont = SendToWeb("http://wklej.to/api/", headers, content); + error = TranslateT("Error during sending text to web page"); + if(resCont != NULL) + { + HXML hXml = xi.parseString(resCont, NULL, _T("methodResponse")); + if(hXml != NULL) + { + HXML node = xi.getChildByPath(hXml, _T("params/param/value/array/data/value/int"), 0); + if(node != NULL && !_tcscmp(xi.getText(node), _T("1"))) + { + node = xi.getChildByPath(hXml, _T("params/param/value/array/data"), 0); + if(node != NULL) + { + node = xi.getNthChild(node, _T("value"), 1); + if(node != NULL) + { + node = xi.getChildByPath(node, _T("string"), 0); + if(node != NULL) + { + char* s = mir_t2a_cp(xi.getText(node), CP_ACP); + strcpy_s(szFileLink, 256, s); + mir_free(s); + error = NULL; + } + } + } + } + xi.destroyNode(hXml); + } + mir_free(resCont); + } +} + +std::list PasteToWeb2::GetFormats() +{ + std::list ret; + + std::map headers; + headers["Content-Type"] = "text/xml"; + std::wstring content = _T("\r\ntypes"); + + wchar_t* resCont = SendToWeb("http://wklej.to/api/", headers, content); + if(resCont != NULL) + { + HXML hXml = xi.parseString(resCont, NULL, _T("methodResponse")); + if(hXml != NULL) + { + HXML node = xi.getChildByPath(hXml, _T("params/param/value/array/data/value/int"), 0); + if(node != NULL && !_tcscmp(xi.getText(node), _T("1"))) + { + node = xi.getChildByPath(hXml, _T("params/param/value/array/data"), 0); + if(node != NULL) + { + node = xi.getNthChild(node, _T("value"), 1); + if(node != NULL) + { + node = xi.getChildByPath(node, _T("string"), 0); + if(node != NULL) + { + std::wstring str = xi.getText(node); + std::wstring::size_type pos = str.find(L'\n'); + if(pos < str.length()) + { + str = str.substr(pos + 1); + } + pos = str.find(L'\n'); + if(pos < str.length()) + { + str = str.substr(pos + 1); + } + pos = str.find(L'\n'); + while(pos < str.length()) + { + std::wstring line = str.substr(0, pos); + std::wstring::size_type sep = line.find(L':'); + if(sep < line.length()) + { + PasteFormat pf; + pf.name = line.substr(0, sep); + std::wstring::size_type sep2 = line.find(L','); + if(sep2 < line.length()) + { + pf.id = line.substr(sep + 2, sep2 - sep - 2); + } + else + { + pf.id = line.substr(sep + 2); + } + ret.push_back(pf); + } + + if(pos < str.length() - 1) + { + str = str.substr(pos + 1); + } + else + { + str = L""; + } + pos = str.find(L'\n'); + } + { + std::wstring line = str; + std::wstring::size_type sep = line.find(L':'); + if(sep < line.length()) + { + PasteFormat pf; + pf.name = line.substr(0, sep); + std::wstring::size_type sep2 = line.find(L','); + if(sep2 < line.length()) + { + pf.id = line.substr(sep + 2, sep2 - sep - 2); + } + else + { + pf.id = line.substr(sep + 2); + } + ret.push_back(pf); + } + } + } + } + } + } + xi.destroyNode(hXml); + } + mir_free(resCont); + } + + return ret; +} + +std::list PasteToWeb2::GetDefFormats() +{ + int count = sizeof(defFormats) / sizeof(defFormats[0]); + std::list ret(defFormats, defFormats + count); + + return ret; +} + +void PasteToWeb2::ConfigureSettings() +{ +} diff --git a/plugins/PasteIt/PasteToWeb2.h b/plugins/PasteIt/PasteToWeb2.h new file mode 100644 index 0000000000..364c6eb4e4 --- /dev/null +++ b/plugins/PasteIt/PasteToWeb2.h @@ -0,0 +1,38 @@ +/* +Paste It plugin +Copyright (C) 2011 Krzysztof Kral + +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 . +*/ + +#pragma once +#include "pastetoweb.h" +class PasteToWeb2 : + public PasteToWeb +{ +protected: + virtual void SendToServer(std::wstring str, std::wstring fileName, std::wstring format); + static PasteFormat defFormats[]; +public: + PasteToWeb2(); + virtual ~PasteToWeb2(); + virtual TCHAR* GetName() + { + return _T("wklej.to"); + } + virtual void ConfigureSettings(); + virtual std::list GetFormats(); + virtual std::list GetDefFormats(); +}; + diff --git a/plugins/PasteIt/dllmain.cpp b/plugins/PasteIt/dllmain.cpp new file mode 100644 index 0000000000..ad89773ec8 --- /dev/null +++ b/plugins/PasteIt/dllmain.cpp @@ -0,0 +1,14 @@ +// dllmain.cpp : Defines the entry point for the DLL application. +#include "stdafx.h" + +HINSTANCE hInst; + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + hInst = hModule; + return TRUE; +} + diff --git a/plugins/PasteIt/icons/Paste.ico b/plugins/PasteIt/icons/Paste.ico new file mode 100644 index 0000000000..54e8087326 Binary files /dev/null and b/plugins/PasteIt/icons/Paste.ico differ diff --git a/plugins/PasteIt/resource.h b/plugins/PasteIt/resource.h new file mode 100644 index 0000000000..cbfa566679 --- /dev/null +++ b/plugins/PasteIt/resource.h @@ -0,0 +1,50 @@ + +#define IDD_OPT_MAIN 101 +#define IDD_DLG_FROM_CLIPBOARD 102 +#define IDD_DLG_FROM_FILE 103 +#define IDD_OPT_PAGES 104 +#define IDD_DLG_CONFIGURE 105 +#define IDD_DLG_PASTEBIN_LOGIN 106 +#define IDC_WEBLIST 1001 +#define IDC_CONFDLG 1002 +#define IDC_AUTOSEND 1003 +#define IDC_CODEPAGE 1004 +#define IDC_AUTOUTF 1005 +#define IDC_CLIPBOARD_DATA 1006 +#define IDC_BTN_OK 1007 +#define IDC_FILE_DATA 1008 +#define IDC_FILE_PATH 1009 +#define IDC_RECODE 1010 +#define IDC_WEBPAGE 1011 +#define IDC_DEFFORMAT 1012 +#define IDC_AUTOFORMAT 1013 +#define IDC_CONFIGURE 1014 +#define IDC_FORMATTING 1015 +#define IDC_RESTORE 1016 +#define IDC_DOWNLOAD 1017 +#define IDC_DELETE 1018 +#define IDC_UP 1019 +#define IDC_DOWN 1020 +#define IDC_FORMAT 1021 +#define IDC_FORMATTEXT 1022 +#define IDC_PUBLICPASTE 1023 +#define IDC_COMBO1 1024 +#define IDC_COMBO1_DESC 1025 +#define IDC_GUEST 1026 +#define IDC_PASTEBIN_KEY 1027 +#define IDC_PASTEBIN_KEY_DESC 1028 +#define IDC_PASTEBIN_LOGIN 1029 +#define IDC_PASTEBIN_USER 1031 +#define IDC_PASTEBIN_PASSWORD 1032 +#define IDI_MENU 20000 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 107 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1033 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/plugins/PasteIt/stdafx.cpp b/plugins/PasteIt/stdafx.cpp new file mode 100644 index 0000000000..12ae832e21 --- /dev/null +++ b/plugins/PasteIt/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// PasteIt.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/plugins/PasteIt/stdafx.h b/plugins/PasteIt/stdafx.h new file mode 100644 index 0000000000..0089cbb943 --- /dev/null +++ b/plugins/PasteIt/stdafx.h @@ -0,0 +1,44 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files: +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define MIRANDA_VER 0x0700 +#define MIRANDA_CUSTOM_LP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sdk/m_msg_buttonsbar.h" +#include "sdk/m_updater.h" diff --git a/plugins/PasteIt/targetver.h b/plugins/PasteIt/targetver.h new file mode 100644 index 0000000000..90e767bfce --- /dev/null +++ b/plugins/PasteIt/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/plugins/PasteIt/version.h b/plugins/PasteIt/version.h new file mode 100644 index 0000000000..e7d016c0a4 --- /dev/null +++ b/plugins/PasteIt/version.h @@ -0,0 +1,20 @@ +#define __MAJOR_VERSION 1 +#define __MINOR_VERSION 0 +#define __RELEASE_NUM 0 +#define __BUILD_NUM 3 + +#define __FILEVERSION_STRING __MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM +#define __FILEVERSION_DOTS __MAJOR_VERSION.__MINOR_VERSION.__RELEASE_NUM.__BUILD_NUM + +#define __STRINGIFY_IMPL(x) #x +#define __STRINGIFY(x) __STRINGIFY_IMPL(x) +#define __VERSION_STRING __STRINGIFY(__FILEVERSION_DOTS) + +#define __PLUGIN_NAME "Paste It" +#define __INTERNAL_NAME "PasteIt" +#define __FILENAME "PasteIt.dll" +#define __DESCRIPTION "Uploads the text to web page and sends the URL to your friends." +#define __AUTHOR "Krzysztof Kral" +#define __AUTHOREMAIL "programista@poczta.of.pl" +#define __AUTHORWEB "http://programista.free.of.pl/miranda/" +#define __COPYRIGHT "Copyright (c) 2011 KrzysztofKral" diff --git a/plugins/PasteIt/version.rc b/plugins/PasteIt/version.rc new file mode 100644 index 0000000000..3fcaa468d0 --- /dev/null +++ b/plugins/PasteIt/version.rc @@ -0,0 +1,37 @@ + +#include +#include "version.h" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION __FILEVERSION_STRING + PRODUCTVERSION __FILEVERSION_STRING + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Author", "Krzysztof Kral" + VALUE "CompanyName", "Krzysztof Kral" + VALUE "FileDescription", __DESCRIPTION + VALUE "FileVersion", __VERSION_STRING + VALUE "InternalName", __INTERNAL_NAME + VALUE "LegalCopyright", __COPYRIGHT + VALUE "OriginalFilename", __FILENAME + VALUE "ProductName", __PLUGIN_NAME + VALUE "ProductVersion", __VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END -- cgit v1.2.3