source: lab.git/Dev/utvpn/utvpn-unix-v101-7101-public/src/Cedar/Win32Html.cpp

Last change on this file was a1bae3e, checked in by mitty <mitty@…>, 12 years ago
  • copy vendor drop to trunk

git-svn-id: https://lab.mitty.jp/svn/lab/trunk@147 7d2118f6-f56c-43e7-95a2-4bb3031d96e7

  • Property mode set to 100644
File size: 17.3 KB
Line 
1// SoftEther UT-VPN SourceCode
2//
3// Copyright (C) 2004-2010 SoftEther Corporation.
4// Copyright (C) 2004-2010 University of Tsukuba, Japan.
5// Copyright (C) 2003-2010 Daiyuu Nobori.
6// All Rights Reserved.
7//
8// http://utvpn.tsukuba.ac.jp/
9//
10// This program is free software; you can redistribute it and/or
11// modify it under the terms of the GNU General Public License
12// version 2 as published by the Free Software Foundation.
13//
14// This program is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17// GNU General Public License for more details.
18//
19// You should have received a copy of the GNU General Public License version 2
20// along with this program; if not, write to the Free Software
21// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22//
23// このファイルは GPL バージョン 2 ライセンスで公開されています。
24// 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布
25// することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示
26// を除去することはできません。改変した著作物を配布する場合は、改変実施者の
27// 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。
28//
29// この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の
30// ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )
31// および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって
32// ホストされています。
33// 本プログラムの配布者は、本プログラムを、業としての利用以外のため、
34// および、試験または研究のために利用が行われることを想定して配布
35// しています。
36// SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に
37// あります。
38// 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード
39// の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して
40// いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して
41// ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース
42// に組み込みさせていただきます。
43//
44// GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する
45// 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。
46//
47// 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社
48// (SoftEther Corporation) およびその他の著作権保持者が保有しています。
49// ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの
50// 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意
51// ください。
52//
53// お願い: どのような通信ソフトウェアにも通常は必ず未発見の
54// セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、
55// UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの
56// 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社
57// および脆弱性情報の届出を受け付ける公的機関まで通報いただき、
58// 公益保護にご協力いただきますようお願い申し上げます。
59//
60// ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を
61// 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客
62// を保護するための努力を行います。
63//
64// ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/
65// 日本国内の脆弱性情報届出受付公的機関:
66//         独立行政法人 情報処理推進機構
67//         http://www.ipa.go.jp/security/vuln/report/
68//
69// 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。
70// 連絡先: http://www.softether.co.jp/jp/contact/
71
72// -----------------------------------------------
73// [ChangeLog]
74// 2010.05.20
75//  新規リリース by SoftEther
76// -----------------------------------------------
77
78// Win32Html.c
79// Win32 用 HTML 表示モジュール
80
81// Q. ソースコード名が「HTML」となっているが、どう見ても HTML に関係のない処理
82//    が入っているように見える。
83// A. はい。
84
85#ifdef  WIN32
86
87#define WIN32HTML_CPP
88
89//#define   _WIN32_WINNT        0x0502
90//#define   WINVER              0x0502
91#include <winsock2.h>
92#include <windows.h>
93#include <wincrypt.h>
94#include <wininet.h>
95#include <comdef.h>
96#include <Mshtmhst.h>
97#include <shlobj.h>
98#include <commctrl.h>
99#include <Dbghelp.h>
100#include <stdio.h>
101#include <stdlib.h>
102#include <string.h>
103#include <wchar.h>
104#include <stdarg.h>
105#include <time.h>
106#include <errno.h>
107extern "C"
108{
109#include <Mayaqua/Mayaqua.h>
110#include <Cedar/Cedar.h>
111}
112#include "../PenCore/resource.h"
113
114typedef struct FOLDER_DLG_INNER_DATA
115{
116    wchar_t *default_dir;
117} FOLDER_DLG_INNER_DATA;
118
119int CALLBACK FolderDlgInnerCallbackA(HWND hWnd, UINT msg, LPARAM lParam, LPARAM lData)
120{
121    FOLDER_DLG_INNER_DATA *data = (FOLDER_DLG_INNER_DATA *)lData;
122    LPITEMIDLIST pidl;
123
124    switch (msg)
125    {
126    case BFFM_INITIALIZED:
127        if (data->default_dir != NULL)
128        {
129            char *default_dir_a = CopyUniToStr(data->default_dir);
130
131            SendMessage(hWnd, BFFM_SETSELECTIONA, true, (LPARAM)default_dir_a);
132
133            Free(default_dir_a);
134        }
135        break;
136
137    case BFFM_SELCHANGED:
138        pidl = (LPITEMIDLIST)lParam;
139
140        if (pidl)
141        {
142            char tmp[MAX_PATH];
143
144            Zero(tmp, sizeof(tmp));
145            if (SHGetPathFromIDListA(pidl, tmp))
146            {
147                SendMessage(hWnd, BFFM_ENABLEOK, 0, 1);
148            }
149            else
150            {
151                SendMessage(hWnd, BFFM_ENABLEOK, 0, 0);
152            }
153        }
154        break;
155    }
156
157    return 0;
158}
159
160char *FolderDlgInnerA(HWND hWnd, wchar_t *title, char *default_dir)
161{
162    BROWSEINFOA info;
163    char display_name[MAX_PATH];
164    FOLDER_DLG_INNER_DATA data;
165    LPMALLOC pMalloc;
166    char *ret = NULL;
167    char *title_a;
168    if (UniIsEmptyStr(title))
169    {
170        title = NULL;
171    }
172    if (IsEmptyStr(default_dir))
173    {
174        default_dir = NULL;
175    }
176
177    Zero(&data, sizeof(data));
178    data.default_dir = CopyStrToUni(default_dir);
179
180    Zero(display_name, sizeof(display_name));
181    Zero(&info, sizeof(info));
182    info.hwndOwner = hWnd;
183    info.pidlRoot = NULL;
184    info.pszDisplayName = display_name;
185    title_a = CopyUniToStr(title);
186    info.lpszTitle = title_a;
187    info.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_VALIDATE | BIF_SHAREABLE;
188    info.lpfn = FolderDlgInnerCallbackA;
189    info.lParam = (LPARAM)&data;
190
191    if (SUCCEEDED(SHGetMalloc(&pMalloc)))
192    {
193        LPITEMIDLIST pidl;
194
195        pidl = SHBrowseForFolderA(&info);
196
197        if (pidl)
198        {
199            char tmp[MAX_PATH];
200
201            if (SHGetPathFromIDListA(pidl, tmp))
202            {
203                ret = CopyStr(tmp);
204            }
205
206            pMalloc->Free(pidl);
207        }
208
209        pMalloc->Release();
210    }
211
212    Free(data.default_dir);
213    Free(title_a);
214
215    return ret;
216}
217
218int CALLBACK FolderDlgInnerCallbackW(HWND hWnd, UINT msg, LPARAM lParam, LPARAM lData)
219{
220    FOLDER_DLG_INNER_DATA *data = (FOLDER_DLG_INNER_DATA *)lData;
221    LPITEMIDLIST pidl;
222
223    switch (msg)
224    {
225    case BFFM_INITIALIZED:
226        if (data->default_dir != NULL)
227        {
228            SendMessage(hWnd, BFFM_SETSELECTIONW, true, (LPARAM)data->default_dir);
229        }
230        break;
231
232    case BFFM_SELCHANGED:
233        pidl = (LPITEMIDLIST)lParam;
234
235        if (pidl)
236        {
237            wchar_t tmp[MAX_PATH];
238
239            Zero(tmp, sizeof(tmp));
240            if (SHGetPathFromIDListW(pidl, tmp))
241            {
242                SendMessage(hWnd, BFFM_ENABLEOK, 0, 1);
243            }
244            else
245            {
246                SendMessage(hWnd, BFFM_ENABLEOK, 0, 0);
247            }
248        }
249        break;
250    }
251
252    return 0;
253}
254
255wchar_t *FolderDlgInnerW(HWND hWnd, wchar_t *title, wchar_t *default_dir)
256{
257    BROWSEINFOW info;
258    wchar_t display_name[MAX_PATH];
259    FOLDER_DLG_INNER_DATA data;
260    LPMALLOC pMalloc;
261    wchar_t *ret = NULL;
262    if (UniIsEmptyStr(title))
263    {
264        title = NULL;
265    }
266    if (UniIsEmptyStr(default_dir))
267    {
268        default_dir = NULL;
269    }
270
271    Zero(&data, sizeof(data));
272    data.default_dir = default_dir;
273
274    Zero(display_name, sizeof(display_name));
275    Zero(&info, sizeof(info));
276    info.hwndOwner = hWnd;
277    info.pidlRoot = NULL;
278    info.pszDisplayName = display_name;
279    info.lpszTitle = title;
280    info.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_VALIDATE | BIF_SHAREABLE;
281    info.lpfn = FolderDlgInnerCallbackW;
282    info.lParam = (LPARAM)&data;
283
284    if (SUCCEEDED(SHGetMalloc(&pMalloc)))
285    {
286        LPITEMIDLIST pidl;
287
288        pidl = SHBrowseForFolderW(&info);
289
290        if (pidl)
291        {
292            wchar_t tmp[MAX_PATH];
293
294            if (SHGetPathFromIDListW(pidl, tmp))
295            {
296                ret = CopyUniStr(tmp);
297            }
298
299            pMalloc->Free(pidl);
300        }
301
302        pMalloc->Release();
303    }
304
305    return ret;
306}
307
308
309class CModule
310{
311public:
312    CModule()
313    {
314        m_hInstLib = NULL;
315    }
316    CModule( HINSTANCE hInstLib )
317    {
318        m_hInstLib = NULL;
319        this->Attach( hInstLib );
320    }
321    CModule( LPCTSTR pszModuleName )
322    {
323        m_hInstLib = NULL;
324        this->LoadLibrary( pszModuleName );
325    }
326    virtual ~CModule()
327    {
328        this->FreeLibrary();
329    }
330
331public:
332    BOOL Attach( HINSTANCE hInstLib )
333    {
334        this->FreeLibrary();
335        m_hInstLib = hInstLib;
336       
337        return TRUE;
338    }
339    BOOL Detach()
340    {
341        m_hInstLib = NULL;
342       
343        return TRUE;
344    }
345
346public:
347    HMODULE GetHandle()
348    {
349        return m_hInstLib;
350    }
351    // DLLのロード
352    HINSTANCE LoadLibrary( LPCTSTR pszModuleName )
353    {
354        this->FreeLibrary();
355        m_hInstLib = ::LoadLibrary( pszModuleName );
356       
357        return m_hInstLib;
358    }
359    // DLLの開放
360    BOOL FreeLibrary()
361    {
362        if (m_hInstLib == NULL)
363        {
364            return FALSE;
365        }
366       
367        BOOL bResult = ::FreeLibrary( m_hInstLib );
368        m_hInstLib = NULL;
369       
370        return bResult;
371    }
372    // 関数のアドレスの取得
373    FARPROC GetProcAddress( LPCTSTR pszProcName )
374    {
375        if (m_hInstLib == NULL)
376        {
377            return NULL;
378        }
379       
380        return ::GetProcAddress(m_hInstLib, pszProcName);
381    }
382    // 指定されたタイプおよび名前を持つリソースの情報ブロックのハンドルを取得
383    HRSRC FindResource(LPCTSTR lpName, LPCTSTR lpType)
384    {
385        if (m_hInstLib == NULL)
386        {
387            return NULL;
388        }
389       
390        return ::FindResource(m_hInstLib, lpName, lpType);
391    }
392    // 指定されたリソースのロード
393    HGLOBAL LoadResource(HRSRC hResInfo)
394    {
395        if (m_hInstLib == NULL)
396        {
397            return NULL;
398        }
399       
400        return ::LoadResource(m_hInstLib, hResInfo);
401    }
402
403protected:
404    HINSTANCE m_hInstLib;
405};
406
407
408
409static HRESULT _ShowHTMLDialog(
410    HWND hwndParent,
411    IMoniker* pMk,
412    VARIANT* pvarArgIn = NULL,
413    WCHAR* pchOptions = NULL,
414    VARIANT* pvarArgOut = NULL)
415{
416    HRESULT hr = S_OK;
417   
418    try
419    {
420        CModule Module("MSHTML.DLL");
421        if (Module.GetHandle() == NULL)
422        {
423            return E_FAIL;
424        }
425       
426        SHOWHTMLDIALOGFN* fnShowHTMLDialog =
427            (SHOWHTMLDIALOGFN*)Module.GetProcAddress("ShowHTMLDialog");
428        if (fnShowHTMLDialog == NULL)
429        {
430            return E_FAIL;
431        }
432       
433        hr = (*fnShowHTMLDialog)(hwndParent, pMk, pvarArgIn, pchOptions, pvarArgOut);
434        if (FAILED(hr))
435        {
436            return hr;
437        }
438    }
439    catch (...)
440    {
441        return E_FAIL;
442    }
443   
444    return hr;
445}
446
447HRESULT ShowHTMLDialogFromURL(HWND hwndParent,wchar_t *szURL,VARIANT* pvarArgIn,WCHAR* pchOptions,VARIANT* pvarArgOut)
448{
449    HRESULT hr = S_OK;
450   
451    try
452    {
453        IMonikerPtr spMoniker;
454        hr = ::CreateURLMoniker(NULL, szURL, &spMoniker);
455        if (FAILED(hr))
456        {
457            return hr;
458        }
459       
460        hr = ::_ShowHTMLDialog(hwndParent, spMoniker, pvarArgIn, pchOptions, pvarArgOut);
461        if (FAILED(hr))
462        {
463            return hr;
464        }
465    }
466    catch (...)
467    {
468        return E_FAIL;
469    }
470   
471    return hr;
472}
473
474// ショートカットの作成
475bool CreateLinkInnerA(char *filename, char *target, char *workdir, char *args,
476                     char *comment, char *icon, UINT icon_index)
477{
478    HRESULT r;
479    wchar_t tmp[MAX_SIZE];
480    IShellLinkA* pShellLink;
481    IPersistFile* pPersistFile;
482
483    r = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkA, (void **)&pShellLink);
484    if (FAILED(r))
485    {
486        return false;
487    }
488
489    r = pShellLink->QueryInterface(IID_IPersistFile,(void **)&pPersistFile);
490    if (FAILED(r))
491    {
492        pShellLink->Release();
493        return false;
494    }
495
496    r = pShellLink->SetPath(target);
497    if (FAILED(r))
498    {
499        pShellLink->Release();
500        pPersistFile->Release();
501        return false;
502    }
503
504    if (workdir != NULL)
505    {
506        r = pShellLink->SetWorkingDirectory(workdir);
507        if (FAILED(r))
508        {
509            pShellLink->Release();
510            pPersistFile->Release();
511            return false;
512        }
513    }
514
515    if (args != NULL)
516    {
517        r = pShellLink->SetArguments(args);
518        if (FAILED(r))
519        {
520            pShellLink->Release();
521            pPersistFile->Release();
522            return false;
523        }
524    }
525
526    if (comment != NULL)
527    {
528        r = pShellLink->SetDescription(comment);
529        if (FAILED(r))
530        {
531            pShellLink->Release();
532            pPersistFile->Release();
533            return false;
534        }
535    }
536
537    if (icon != NULL)
538    {
539        r = pShellLink->SetIconLocation(icon, icon_index);
540        if (FAILED(r))
541        {
542            pShellLink->Release();
543            pPersistFile->Release();
544            return false;
545        }
546    }
547
548    StrToUni(tmp, sizeof(tmp), filename);
549    r = pPersistFile->Save(tmp, true);
550    if (FAILED(r))
551    {
552        pShellLink->Release();
553        pPersistFile->Release();
554        return false;
555    }
556
557    pShellLink->Release();
558    pPersistFile->Release();
559    return true;
560}
561bool CreateLinkInner(wchar_t *filename, wchar_t *target, wchar_t *workdir, wchar_t *args,
562                     wchar_t *comment, wchar_t *icon, UINT icon_index)
563{
564    HRESULT r;
565    bool ret;
566    IShellLinkW* pShellLink;
567    IPersistFile* pPersistFile;
568
569    if (OS_IS_WINDOWS_9X(GetOsInfo()->OsType))
570    {
571        char *a1, *a2, *a3, *a4, *a5, *a6;
572        a1 = CopyUniToStr(filename);
573        a2 = CopyUniToStr(target);
574        a3 = CopyUniToStr(workdir);
575        a4 = CopyUniToStr(args);
576        a5 = CopyUniToStr(icon);
577        a6 = CopyUniToStr(comment);
578
579        ret = CreateLinkInnerA(a1, a2, a3, a4, a6, a5, icon_index);
580
581        Free(a1);
582        Free(a2);
583        Free(a3);
584        Free(a4);
585        Free(a5);
586        Free(a6);
587
588        return ret;
589    }
590
591    r = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void **)&pShellLink);
592    if (FAILED(r))
593    {
594        return false;
595    }
596
597    r = pShellLink->QueryInterface(IID_IPersistFile,(void **)&pPersistFile);
598    if (FAILED(r))
599    {
600        pShellLink->Release();
601        return false;
602    }
603
604    r = pShellLink->SetPath(target);
605    if (FAILED(r))
606    {
607        pShellLink->Release();
608        pPersistFile->Release();
609        return false;
610    }
611
612    if (workdir != NULL)
613    {
614        r = pShellLink->SetWorkingDirectory(workdir);
615        if (FAILED(r))
616        {
617            pShellLink->Release();
618            pPersistFile->Release();
619            return false;
620        }
621    }
622
623    if (comment != NULL)
624    {
625        r = pShellLink->SetDescription(comment);
626        if (FAILED(r))
627        {
628            pShellLink->Release();
629            pPersistFile->Release();
630            return false;
631        }
632    }
633
634    if (args != NULL)
635    {
636        r = pShellLink->SetArguments(args);
637        if (FAILED(r))
638        {
639            pShellLink->Release();
640            pPersistFile->Release();
641            return false;
642        }
643    }
644
645    if (icon != NULL)
646    {
647        r = pShellLink->SetIconLocation(icon, icon_index);
648        if (FAILED(r))
649        {
650            pShellLink->Release();
651            pPersistFile->Release();
652            return false;
653        }
654    }
655
656    r = pPersistFile->Save(filename, true);
657    if (FAILED(r))
658    {
659        pShellLink->Release();
660        pPersistFile->Release();
661        return false;
662    }
663
664    pShellLink->Release();
665    pPersistFile->Release();
666    return true;
667}
668
669extern "C"
670{
671
672// フォルダ選択ダイアログの表示
673wchar_t *FolderDlgW(HWND hWnd, wchar_t *title, wchar_t *default_dir)
674{
675    wchar_t *ret;
676
677    if (MsIsNt() == false)
678    {
679        char *default_dir_a = CopyUniToStr(default_dir);
680        char *ret_a = FolderDlgA(hWnd, title, default_dir_a);
681
682        ret = CopyStrToUni(ret_a);
683        Free(ret_a);
684        Free(default_dir_a);
685
686        return ret;
687    }
688
689    ret = FolderDlgInnerW(hWnd, title, default_dir);
690
691    return ret;
692}
693char *FolderDlgA(HWND hWnd, wchar_t *title, char *default_dir)
694{
695    char *ret;
696
697    ret = FolderDlgInnerA(hWnd, title, default_dir);
698
699    return ret;
700}
701
702// ショートカットの作成
703bool CreateLink(wchar_t *filename, wchar_t *target, wchar_t *workdir, wchar_t *args,
704                wchar_t *comment, wchar_t *icon, UINT icon_index)
705{
706    if (filename == NULL || target == NULL)
707    {
708        return false;
709    }
710
711    return CreateLinkInner(filename, target, workdir, args, comment, icon, icon_index);
712}
713
714// HTML の表示
715void ShowHtml(HWND hWnd, char *url, wchar_t *option)
716{
717    wchar_t tmp[MAX_SIZE];
718    // 引数チェック
719    if (url == NULL || option == NULL)
720    {
721        return;
722    }
723
724    StrToUni(tmp, sizeof(tmp), url);
725
726    ShowHTMLDialogFromURL(hWnd, tmp, NULL, option, NULL);
727}
728
729}
730
731#endif
Note: See TracBrowser for help on using the repository browser.