From decb3a6a16ea5acf1dfcdb1b70cb6edaa09840c0 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Tue, 21 Aug 2001 09:11:20 +0000 Subject: [PATCH] Added Net library to contrib git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11431 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- contrib/configure.in | 1 + contrib/include/wx/net/email.h | 43 ++++ contrib/include/wx/net/msg.h | 67 ++++++ contrib/include/wx/net/smapi.h | 56 +++++ contrib/include/wx/net/web.h | 37 +++ contrib/src/net/Makefile.in | 23 ++ contrib/src/net/NetVC.dsp | 106 ++++++++ contrib/src/net/NetVC.dsw | 29 +++ contrib/src/net/email.cpp | 58 +++++ contrib/src/net/makefile.b32 | 17 ++ contrib/src/net/makefile.g95 | 16 ++ contrib/src/net/makefile.vc | 144 +++++++++++ contrib/src/net/readme.txt | 10 + contrib/src/net/smapi.cpp | 426 +++++++++++++++++++++++++++++++++ contrib/src/net/web.cpp | 29 +++ distrib/msw/contrib.rsp | 7 + distrib/msw/makefile.rsp | 2 + distrib/msw/vc.rsp | 16 ++ docs/latex/wx/wizpage.tex | 4 +- src/msw/textctrl.cpp | 14 +- 20 files changed, 1101 insertions(+), 4 deletions(-) create mode 100644 contrib/include/wx/net/email.h create mode 100644 contrib/include/wx/net/msg.h create mode 100644 contrib/include/wx/net/smapi.h create mode 100644 contrib/include/wx/net/web.h create mode 100644 contrib/src/net/Makefile.in create mode 100644 contrib/src/net/NetVC.dsp create mode 100644 contrib/src/net/NetVC.dsw create mode 100644 contrib/src/net/email.cpp create mode 100644 contrib/src/net/makefile.b32 create mode 100644 contrib/src/net/makefile.g95 create mode 100644 contrib/src/net/makefile.vc create mode 100644 contrib/src/net/readme.txt create mode 100644 contrib/src/net/smapi.cpp create mode 100644 contrib/src/net/web.cpp diff --git a/contrib/configure.in b/contrib/configure.in index 2e485da09a..8a245132fb 100644 --- a/contrib/configure.in +++ b/contrib/configure.in @@ -47,6 +47,7 @@ AC_OUTPUT([ src/plot/Makefile src/applet/Makefile src/fl/Makefile + src/net/Makefile samples/Makefile samples/mmedia/Makefile samples/ogl/Makefile diff --git a/contrib/include/wx/net/email.h b/contrib/include/wx/net/email.h new file mode 100644 index 0000000000..1c312b4980 --- /dev/null +++ b/contrib/include/wx/net/email.h @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: email.h +// Purpose: wxEmail: portable email client class +// Author: Julian Smart +// Modified by: +// Created: 2001-08-21 +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma interface "email.h" +#endif + +#ifndef _WX_EMAIL_H_ +#define _WX_EMAIL_H_ + +#include "wx/net/msg.h" + +/* + * wxEmail + * Miscellaneous email functions + */ + +class wxEmail +{ +public: +//// Ctor/dtor + wxEmail() {}; + +//// Operations + + // Send a message. + // Specify profile, or leave it to wxWindows to find the current user name + static bool Send(wxMailMessage& message, const wxString& profileName = wxEmptyString ); + +protected: +}; + + +#endif //_WX_EMAIL_H_ + diff --git a/contrib/include/wx/net/msg.h b/contrib/include/wx/net/msg.h new file mode 100644 index 0000000000..ffc77727f5 --- /dev/null +++ b/contrib/include/wx/net/msg.h @@ -0,0 +1,67 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: msg.h +// Purpose: wxMailMessage +// Author: Julian Smart +// Modified by: +// Created: 2001-08-21 +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma interface "msg.h" +#endif + +#ifndef _WX_MSG_H_ +#define _WX_MSG_H_ + +/* + * wxMailMessage + * Encapsulates an email message + */ + +class wxMailMessage +{ +public: + + // A common usage + wxMailMessage(const wxString& subject, const wxString& to, + const wxString& body, const wxString& attachment = wxEmptyString, + const wxString& attachmentTitle = wxEmptyString) + { + m_to.Add(to); + m_subject = subject; + m_body = body; + if (!attachment.IsEmpty()) + { + m_attachments.Add(attachment); + m_attachmentTitles.Add(attachmentTitle); + } + } + + wxMailMessage() {}; + +//// Accessors + + void AddTo(const wxString& to) { m_to.Add(to); } + void AddCc(const wxString& cc) { m_cc.Add(cc); } + void AddBcc(const wxString& bcc) { m_bcc.Add(bcc); } + void AddAttachment(const wxString& attach, const wxString& title = wxEmptyString) + { m_attachments.Add(attach); m_attachmentTitles.Add(title); } + + void SetSubject(const wxString& subject) { m_subject = subject; } + void SetBody(const wxString& body) { m_body = body; } + +public: + wxArrayString m_to; //The To: Recipients + wxArrayString m_cc; //The CC: Recipients + wxArrayString m_bcc; //The BCC Recipients + wxString m_subject; //The Subject of the message + wxString m_body; //The Body of the message + wxArrayString m_attachments; //Files to attach to the email + wxArrayString m_attachmentTitles; //Titles to use for the email file attachments +}; + +#endif // _WX_MSG_H_ + diff --git a/contrib/include/wx/net/smapi.h b/contrib/include/wx/net/smapi.h new file mode 100644 index 0000000000..fd1246cf80 --- /dev/null +++ b/contrib/include/wx/net/smapi.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: smapi.h +// Purpose: Simple MAPI classes +// Author: PJ Naughter +// Modified by: Julian Smart +// Created: 2001-08-21 +// RCS-ID: $Id$ +// Copyright: (c) PJ Naughter +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma interface "smapi.h" +#endif + +#ifndef _WX_SMAPI_H_ +#define _WX_SMAPI_H_ + +#include "wx/net/msg.h" + +class wxMapiData; + +//The class which encapsulates the MAPI connection +class wxMapiSession +{ +public: + //Constructors / Destructors + wxMapiSession(); + ~wxMapiSession(); + + //Logon / Logoff Methods + bool Logon(const wxString& sProfileName, const wxString& sPassword = wxEmptyString, wxWindow* pParentWnd = NULL); + bool LoggedOn() const; + bool Logoff(); + + //Send a message + bool Send(wxMailMessage& message); + + //General MAPI support + bool MapiInstalled() const; + + //Error Handling + long GetLastError() const; + +protected: + //Methods + void Initialise(); + void Deinitialise(); + bool Resolve(const wxString& sName, void* lppRecip1); + + wxMapiData* m_data; + +}; + + +#endif //_WX_SMAPI_H_ \ No newline at end of file diff --git a/contrib/include/wx/net/web.h b/contrib/include/wx/net/web.h new file mode 100644 index 0000000000..ce79f83b8d --- /dev/null +++ b/contrib/include/wx/net/web.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: web.h +// Purpose: wxWeb: portable web browser-related class +// Author: Julian Smart +// Modified by: +// Created: 2001-08-21 +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma interface "web.h" +#endif + +#ifndef _WX_WEB_H_ +#define _WX_WEB_H_ + +/* + * wxWeb + * Miscellaneous web functions + */ + +class wxWeb +{ +public: +//// Ctor/dtor + wxWeb() {}; + +//// Operations + +protected: +}; + + +#endif //_WX_WEB_H_ + diff --git a/contrib/src/net/Makefile.in b/contrib/src/net/Makefile.in new file mode 100644 index 0000000000..b18aa2ffa4 --- /dev/null +++ b/contrib/src/net/Makefile.in @@ -0,0 +1,23 @@ +# $Id$ + +top_srcdir = @top_srcdir@/.. +top_builddir = ../../.. +libsrc_dir = contrib/src/net + +TARGET_LIBNAME=libwx_net + +LIBVERSION_CURRENT=1 +LIBVERSION_REVISION=0 +LIBVERSION_AGE=0 + +HEADER_PATH=$(top_srcdir)/contrib/include/wx +HEADER_SUBDIR=plot + +HEADERS=msg.h email.h web.h + +OBJECTS=email.o web.o + +APPEXTRADEFS=-I$(top_srcdir)/contrib/include + +include $(top_builddir)/src/makelib.env + diff --git a/contrib/src/net/NetVC.dsp b/contrib/src/net/NetVC.dsp new file mode 100644 index 0000000000..6d59a075ea --- /dev/null +++ b/contrib/src/net/NetVC.dsp @@ -0,0 +1,106 @@ +# Microsoft Developer Studio Project File - Name="NetVC" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=NetVC - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "NetVC.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "NetVC.mak" CFG="NetVC - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "NetVC - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "NetVC - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "NetVC - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O1 /Ob2 /I "../../../include" /I "../../include" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x809 +# ADD RSC /l 0x809 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\..\..\lib\net.lib" + +!ELSEIF "$(CFG)" == "NetVC - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /W3 /GX /Z7 /Od /I "../../../include" /I "../../include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D DEBUG=1 /D "__WXDEBUG__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x809 +# ADD RSC /l 0x809 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\..\..\lib\netd.lib" + +!ENDIF + +# Begin Target + +# Name "NetVC - Win32 Release" +# Name "NetVC - Win32 Debug" +# Begin Source File + +SOURCE=.\smapi.cpp +# End Source File +# Begin Source File + +SOURCE=.\email.cpp +# End Source File +# Begin Source File + +SOURCE=.\web.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\include\wx\net\smapi.h +# End Source File +# Begin Source File + +SOURCE=.\readme.txt +# End Source File +# End Target +# End Project diff --git a/contrib/src/net/NetVC.dsw b/contrib/src/net/NetVC.dsw new file mode 100644 index 0000000000..9cf4a63d8c --- /dev/null +++ b/contrib/src/net/NetVC.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "NetVC"=.\NetVC.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/contrib/src/net/email.cpp b/contrib/src/net/email.cpp new file mode 100644 index 0000000000..a4b9c44aaa --- /dev/null +++ b/contrib/src/net/email.cpp @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: email.h +// Purpose: wxEmail: portable email client class +// Author: Julian Smart +// Modified by: +// Created: 2001-08-21 +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma implementation "email.h" +#endif + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + +#include "wx/string.h" +#include "wx/net/email.h" + +#ifdef __WXMSW__ +#include "wx/net/smapi.h" +#endif + +// Send a message. +// Specify profile, or leave it to wxWindows to find the current user name + +#ifdef __WXMSW__ +bool wxEmail::Send(wxMailMessage& message, const wxString& profileName) +{ + wxASSERT (message.m_to.GetCount() > 0) ; + + wxString profile(profileName); + if (profile.IsEmpty()) + profile = wxGetUserName(); + + wxMapiSession session; + + if (!session.MapiInstalled()) + return FALSE; + if (!session.Logon(profile)) + return FALSE; + + return session.Send(message); +} +#else +#error Send not yet implemented for this platform. +#endif + diff --git a/contrib/src/net/makefile.b32 b/contrib/src/net/makefile.b32 new file mode 100644 index 0000000000..90ca71b55d --- /dev/null +++ b/contrib/src/net/makefile.b32 @@ -0,0 +1,17 @@ +# +# File: makefile.b32 +# Author: Julian Smart +# Created: 1999 +# Updated: +# Copyright: +# +# Makefile : Builds Net library for 32-bit BC++ + +WXDIR = $(WXWIN) + +LIBTARGET=$(WXDIR)\lib\net.lib + +OBJECTS = smapi.obj email.obj web.obj + +!include $(WXDIR)\src\makelib.b32 + diff --git a/contrib/src/net/makefile.g95 b/contrib/src/net/makefile.g95 new file mode 100644 index 0000000000..872df1c784 --- /dev/null +++ b/contrib/src/net/makefile.g95 @@ -0,0 +1,16 @@ +# +# File: makefile.g95 +# Author: Julian Smart +# Created: 1999 +# Updated: +# Copyright: (c) Julian Smart, 1999 +# +# Makefile for wxWindows Net library Cygwin/Mingw32). + +WXDIR = ../../.. + +LIBTARGET=$(WXDIR)/lib/libnet.a +OBJECTS = smapi.o email.o web.o + +include $(WXDIR)/src/makelib.g95 + diff --git a/contrib/src/net/makefile.vc b/contrib/src/net/makefile.vc new file mode 100644 index 0000000000..e57d1929f0 --- /dev/null +++ b/contrib/src/net/makefile.vc @@ -0,0 +1,144 @@ + +# File: makefile.vc +# Author: Julian Smart +# Created: 2001 +# Updated: +# Copyright: (c) 2001, Julian Smart +# +# "%W% %G%" +# +# Makefile : Builds net class library (MS VC++). +# Use FINAL=1 argument to nmake to build final version with no debugging +# info + + +# Set WXDIR for your system +WXDIR = $(WXWIN) +GIZMOSDIR = $(WXDIR)\contrib\src\net +GIZMOSINC = $(WXDIR)\contrib\include\wx\net +THISDIR = $(WXDIR)\contrib\src\net +DOCDIR=$(WXDIR)\contrib\docs +LOCALDOCDIR=$(WXDIR)\contrib\docs\latex\net + +!include $(WXDIR)\src\makevc.env + +OBJECTS = $(D)\smapi.obj $(D)\email.obj $(D)\web.obj + +LIBTARGET=$(WXDIR)\lib\net$(LIBEXT).lib + +all: $(D) $(LIBTARGET) + +$(D) : + mkdir $(D) + +wx: + cd $(WXDIR)\src\msw + nmake -f makefile.vc FINAL=$(FINAL) + cd $(THISDIR) + +wxclean: + cd $(WXDIR)\src\msw + nmake -f makefile.vc clean + cd $(THISDIR) + +$(LIBTARGET): $(OBJECTS) + -erase $(LIBTARGET) + $(implib) @<< +-out:$(LIBTARGET) +-machine:$(CPU) +$(OBJECTS) +<< + +$(D)\net.obj: net.$(SRCSUFF) + cl @<< +$(CPPFLAGS) /c /Fo$@ /Tp $(*B).$(SRCSUFF) +<< + +clean: + -erase $(D)\*.obj + -erase *.sbr + -erase *.exe + -erase *.res + -erase *.map + -erase *.pdb + -erase $(LIBTARGET) + +DOCSOURCES=$(LOCALDOCDIR)\net.tex \ + $(LOCALDOCDIR)\bugs.tex $(LOCALDOCDIR)\changes.tex\ + $(LOCALDOCDIR)\classes.tex $(LOCALDOCDIR)\intro.tex\ + $(LOCALDOCDIR)\topics.tex $(LOCALDOCDIR)\sample.tex + +html: $(DOCDIR)\html\net\net.htm +htmlhelp: $(DOCDIR)\htmlhelp\net.chm +htb: $(DOCDIR)\htb\net.htb +hlp: $(DOCDIR)\winhelp\net.hlp +pdfrtf: $(DOCDIR)\pdf\net.rtf +ps: $(DOCDIR)\ps\net.ps + +touchmanual: + touch $(LOCALDOCDIR)\net.tex + + +$(DOCDIR)\winhelp\net.hlp: $(LOCALDOCDIR)\net.rtf $(LOCALDOCDIR)\net.hpj + cd $(LOCALDOCDIR) + -erase net.ph + hc net + move net.hlp $(DOCDIR)\winhelp\net.hlp + move net.cnt $(DOCDIR)\winhelp\net.cnt + cd $(THISDIR) + +$(LOCALDOCDIR)\net.rtf: $(DOCSOURCES) + cd $(LOCALDOCDIR) + -start $(WAITFLAG) tex2rtf $(LOCALDOCDIR)\net.tex $(LOCALDOCDIR)\net.rtf -twice -winhelp + cd $(THISDIR) + +$(DOCDIR)\pdf\net.rtf: $(DOCSOURCES) + cd $(LOCALDOCDIR) + -copy *.bmp $(DOCDIR)\pdf + -start $(WAITFLAG) tex2rtf $(LOCALDOCDIR)\net.tex $(DOCDIR)\pdf\net.rtf -twice -rtf + cd $(THISDIR) + +$(DOCDIR)\html\net\net.htm: $(DOCSOURCES) + cd $(LOCALDOCDIR) + -mkdir $(DOCDIR)\html\net + copy *.gif $(DOCDIR)\html\net + -start $(WAITFLAG) tex2rtf $(LOCALDOCDIR)\net.tex $(DOCDIR)\html\net\net.htm -twice -html + -erase $(DOCDIR)\html\net\*.con + -erase *.con + -erase $(DOCDIR)\html\net\*.ref + cd $(THISDIR) + +$(DOCDIR)\htmlhelp\net.chm: $(DOCDIR)\html\net\net.htm $(DOCDIR)\html\net\net.hhp + cd $(DOCDIR)\html\net + -hhc net.hhp + move net.chm $(DOCDIR)\htmlhelp\net.chm + cd $(THISDIR) + +# An htb file is a zip file containing the .htm, .gif, .hhp, .hhc and .hhk +# files, renamed to htb. +# This can then be used with e.g. helpview. +# Optionally, a cached version of the .hhp file can be generated with hhp2cached. +$(DOCDIR)\htb\net.htb: $(DOCDIR)\html\net\net.htm + cd $(DOCDIR)\html\net + -erase net.zip net.htb + zip net.zip *.htm *.gif *.hhp *.hhc *.hhk + -mkdir $(DOCDIR)\htb + move net.zip $(DOCDIR)\htb\net.htb + cd $(THISDIR) + +$(LOCALDOCDIR)\net.dvi: $(DOCSOURCES) + cd $(LOCALDOCDIR) + -latex net + -latex net + -makeindx net + -bibtex net + -latex net + -latex net + cd $(THISDIR) + +$(WXDIR)\docs\ps\net.ps: $(LOCALDOCDIR)\net.dvi + cd $(LOCALDOCDIR) + -dvips32 -o net.ps net + move net.ps $(WXDIR)\docs\ps\net.ps + cd $(THISDIR) + diff --git a/contrib/src/net/readme.txt b/contrib/src/net/readme.txt new file mode 100644 index 0000000000..1fb7e4f43e --- /dev/null +++ b/contrib/src/net/readme.txt @@ -0,0 +1,10 @@ +Net library +=========== + +This is a library of email and other Internet-related functionality. + +wxMailMessage Populate this before sending a message +wxMapiSession Encapsulates Simple MAPI functionality on Windows +wxEmail Platform-independent mail functions, such as Send +wxWeb Platform-independent web functions, such as OpenURL + diff --git a/contrib/src/net/smapi.cpp b/contrib/src/net/smapi.cpp new file mode 100644 index 0000000000..4412ad15a2 --- /dev/null +++ b/contrib/src/net/smapi.cpp @@ -0,0 +1,426 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: smapi.cpp +// Purpose: Simple MAPI classes +// Author: PJ Naughter +// Modified by: Julian Smart +// Created: 2001-08-21 +// RCS-ID: $Id$ +// Copyright: (c) PJ Naughter +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma implementation "smapi.h" +#endif + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + +#include "wx/string.h" +#include "wx/msw/private.h" + +#include + +#include "wx/net/smapi.h" + +class wxMapiData +{ +public: + wxMapiData() + { + m_hSession = 0; + m_nLastError = 0; + m_hMapi = NULL; + m_lpfnMAPILogon = NULL; + m_lpfnMAPILogoff = NULL; + m_lpfnMAPISendMail = NULL; + m_lpfnMAPIResolveName = NULL; + m_lpfnMAPIFreeBuffer = NULL; + } + + //Data + LHANDLE m_hSession; //Mapi Session handle + long m_nLastError; //Last Mapi error value + HINSTANCE m_hMapi; //Instance handle of the MAPI dll + LPMAPILOGON m_lpfnMAPILogon; //MAPILogon function pointer + LPMAPILOGOFF m_lpfnMAPILogoff; //MAPILogoff function pointer + LPMAPISENDMAIL m_lpfnMAPISendMail; //MAPISendMail function pointer + LPMAPIRESOLVENAME m_lpfnMAPIResolveName; //MAPIResolveName function pointer + LPMAPIFREEBUFFER m_lpfnMAPIFreeBuffer; //MAPIFreeBuffer function pointer +}; + + +////////////////////////////////// Implementation ///////////////////////////// + +wxMapiSession::wxMapiSession() +{ + m_data = new wxMapiData; + + Initialise(); +} + +wxMapiSession::~wxMapiSession() +{ + //Logoff if logged on + Logoff(); + + //Unload the MAPI dll + Deinitialise(); + + delete m_data; +} + +void wxMapiSession::Initialise() +{ + //First make sure the "WIN.INI" entry for MAPI is present aswell + //as the MAPI32 dll being present on the system + bool bMapiInstalled = (GetProfileInt(_T("MAIL"), _T("MAPI"), 0) != 0) && + (SearchPath(NULL, _T("MAPI32.DLL"), NULL, 0, NULL, NULL) != 0); + + if (bMapiInstalled) + { + //Load up the MAPI dll and get the function pointers we are interested in + m_data->m_hMapi = ::LoadLibrary(_T("MAPI32.DLL")); + if (m_data->m_hMapi) + { + m_data->m_lpfnMAPILogon = (LPMAPILOGON) GetProcAddress(m_data->m_hMapi, "MAPILogon"); + m_data->m_lpfnMAPILogoff = (LPMAPILOGOFF) GetProcAddress(m_data->m_hMapi, "MAPILogoff"); + m_data->m_lpfnMAPISendMail = (LPMAPISENDMAIL) GetProcAddress(m_data->m_hMapi, "MAPISendMail"); + m_data->m_lpfnMAPIResolveName = (LPMAPIRESOLVENAME) GetProcAddress(m_data->m_hMapi, "MAPIResolveName"); + m_data->m_lpfnMAPIFreeBuffer = (LPMAPIFREEBUFFER) GetProcAddress(m_data->m_hMapi, "MAPIFreeBuffer"); + + //If any of the functions are not installed then fail the load + if (m_data->m_lpfnMAPILogon == NULL || + m_data->m_lpfnMAPILogoff == NULL || + m_data->m_lpfnMAPISendMail == NULL || + m_data->m_lpfnMAPIResolveName == NULL || + m_data->m_lpfnMAPIFreeBuffer == NULL) + { + wxLogDebug(_T("Failed to get one of the functions pointer in MAPI32.DLL\n")); + Deinitialise(); + } + } + } + else + wxLogDebug(_T("Mapi is not installed on this computer\n")); +} + +void wxMapiSession::Deinitialise() +{ + if (m_data->m_hMapi) + { + //Unload the MAPI dll and reset the function pointers to NULL + FreeLibrary(m_data->m_hMapi); + m_data->m_hMapi = NULL; + m_data->m_lpfnMAPILogon = NULL; + m_data->m_lpfnMAPILogoff = NULL; + m_data->m_lpfnMAPISendMail = NULL; + m_data->m_lpfnMAPIResolveName = NULL; + m_data->m_lpfnMAPIFreeBuffer = NULL; + } +} + +bool wxMapiSession::Logon(const wxString& sProfileName, const wxString& sPassword, wxWindow* pParentWnd) +{ + wxASSERT(MapiInstalled()); //MAPI must be installed + wxASSERT(m_data->m_lpfnMAPILogon); //Function pointer must be valid + + //Initialise the function return value + bool bSuccess = FALSE; + + //Just in case we are already logged in + Logoff(); + + //Setup the ascii versions of the profile name and password + int nProfileLength = sProfileName.Length(); + int nPasswordLength = sPassword.Length(); + + LPSTR pszProfileName = NULL; + LPSTR pszPassword = NULL; + if (nProfileLength) + { +// pszProfileName = T2A((LPTSTR) (LPCTSTR) sProfileName); +// pszPassword = T2A((LPTSTR) (LPCTSTR) sPassword); + pszProfileName = (LPSTR) sProfileName.c_str(); + pszPassword = (LPSTR) sPassword.c_str(); + } + + //Setup the flags & UIParam parameters used in the MapiLogon call + FLAGS flags = 0; + ULONG nUIParam = 0; + if (nProfileLength == 0) + { + //No profile name given, then we must interactively request a profile name + if (pParentWnd) + { + nUIParam = (ULONG) (HWND) pParentWnd->GetHWND(); + flags |= MAPI_LOGON_UI; + } + else + { + //No window given, just use the main window of the app as the parent window + if (wxTheApp->GetTopWindow()) + { + nUIParam = (ULONG) (HWND) wxTheApp->GetTopWindow()->GetHWND(); + flags |= MAPI_LOGON_UI; + } + } + } + + //First try to acquire a new MAPI session using the supplied settings using the MAPILogon functio + ULONG nError = m_data->m_lpfnMAPILogon(nUIParam, pszProfileName, pszPassword, flags | MAPI_NEW_SESSION, 0, &m_data->m_hSession); + if (nError != SUCCESS_SUCCESS && nError != MAPI_E_USER_ABORT) + { + //Failed to create a create mapi session, try to acquire a shared mapi session + wxLogDebug(_T("Failed to logon to MAPI using a new session, trying to acquire a shared one\n")); + nError = m_data->m_lpfnMAPILogon(nUIParam, NULL, NULL, 0, 0, &m_data->m_hSession); + if (nError == SUCCESS_SUCCESS) + { + m_data->m_nLastError = SUCCESS_SUCCESS; + bSuccess = TRUE; + } + else + { + wxLogDebug(_T("Failed to logon to MAPI using a shared session, Error:%d\n"), nError); + m_data->m_nLastError = nError; + } + } + else if (nError == SUCCESS_SUCCESS) + { + m_data->m_nLastError = SUCCESS_SUCCESS; + bSuccess = TRUE; + } + + return bSuccess; +} + +bool wxMapiSession::LoggedOn() const +{ + return (m_data->m_hSession != 0); +} + +bool wxMapiSession::MapiInstalled() const +{ + return (m_data->m_hMapi != NULL); +} + +bool wxMapiSession::Logoff() +{ + wxASSERT(MapiInstalled()); //MAPI must be installed + wxASSERT(m_data->m_lpfnMAPILogoff); //Function pointer must be valid + + //Initialise the function return value + bool bSuccess = FALSE; + + if (m_data->m_hSession) + { + //Call the MAPILogoff function + ULONG nError = m_data->m_lpfnMAPILogoff(m_data->m_hSession, 0, 0, 0); + if (nError != SUCCESS_SUCCESS) + { + wxLogDebug(_T("Failed in call to MapiLogoff, Error:%d"), nError); + m_data->m_nLastError = nError; + bSuccess = TRUE; + } + else + { + m_data->m_nLastError = SUCCESS_SUCCESS; + bSuccess = TRUE; + } + m_data->m_hSession = 0; + } + + return bSuccess; +} + +bool wxMapiSession::Resolve(const wxString& sName, void* lppRecip1) +{ + lpMapiRecipDesc* lppRecip = (lpMapiRecipDesc*) lppRecip1; + + wxASSERT(MapiInstalled()); //MAPI must be installed + wxASSERT(m_data->m_lpfnMAPIResolveName); //Function pointer must be valid + wxASSERT(LoggedOn()); //Must be logged on to MAPI + wxASSERT(m_data->m_hSession); //MAPI session handle must be valid + + //Call the MAPIResolveName function +// LPSTR lpszAsciiName = T2A((LPTSTR) (LPCTSTR) sName); + LPSTR lpszAsciiName = (LPSTR) sName.c_str(); + ULONG nError = m_data->m_lpfnMAPIResolveName(m_data->m_hSession, 0, lpszAsciiName, 0, 0, lppRecip); + if (nError != SUCCESS_SUCCESS) + { + wxLogDebug(_T("Failed to resolve the name: %s, Error:%d\n"), sName, nError); + m_data->m_nLastError = nError; + } + + return (nError == SUCCESS_SUCCESS); +} + +bool wxMapiSession::Send(wxMailMessage& message) +{ + wxASSERT(MapiInstalled()); //MAPI must be installed + wxASSERT(m_data->m_lpfnMAPISendMail); //Function pointer must be valid + wxASSERT(m_data->m_lpfnMAPIFreeBuffer); //Function pointer must be valid + wxASSERT(LoggedOn()); //Must be logged on to MAPI + wxASSERT(m_data->m_hSession); //MAPI session handle must be valid + + //Initialise the function return value + bool bSuccess = FALSE; + + //Create the MapiMessage structure to match the message parameter send into us + MapiMessage mapiMessage; + ZeroMemory(&mapiMessage, sizeof(mapiMessage)); + mapiMessage.lpszSubject = (LPSTR) message.m_subject.c_str(); + mapiMessage.lpszNoteText = (LPSTR) message.m_body.c_str(); +// mapiMessage.lpszSubject = T2A((LPTSTR) (LPCTSTR) message.m_subject); +// mapiMessage.lpszNoteText = T2A((LPTSTR) (LPCTSTR) message.m_body); + mapiMessage.nRecipCount = message.m_to.GetCount() + message.m_cc.GetCount() + message.m_bcc.GetCount(); + wxASSERT(mapiMessage.nRecipCount); //Must have at least 1 recipient! + + //Allocate the recipients array + mapiMessage.lpRecips = new MapiRecipDesc[mapiMessage.nRecipCount]; + + //Setup the "To" recipients + int nRecipIndex = 0; + int nToSize = message.m_to.GetCount(); + for (int i=0; ilpszName; + + //Don't forget to free up the memory MAPI allocated for us + m_data->m_lpfnMAPIFreeBuffer(lpTempRecip); + } + //recip.lpszName = T2A((LPTSTR) (LPCTSTR) sName); + recip.lpszName = (LPSTR) sName.c_str(); + + ++nRecipIndex; + } + + //Setup the "CC" recipients + int nCCSize = message.m_cc.GetCount(); + for (i=0; ilpszName; + + //Don't forget to free up the memory MAPI allocated for us + m_data->m_lpfnMAPIFreeBuffer(lpTempRecip); + } + //recip.lpszName = T2A((LPTSTR) (LPCTSTR) sName); + recip.lpszName = (LPSTR) sName.c_str(); + + ++nRecipIndex; + } + + //Setup the "BCC" recipients + int nBCCSize = message.m_bcc.GetCount(); + for (i=0; ilpszName; + + //Don't forget to free up the memory MAPI allocated for us + m_data->m_lpfnMAPIFreeBuffer(lpTempRecip); + } + //recip.lpszName = T2A((LPTSTR) (LPCTSTR) sName); + recip.lpszName = (LPSTR) sName.c_str(); + + ++nRecipIndex; + } + + //Setup the attachments + int nAttachmentSize = message.m_attachments.GetCount(); + int nTitleSize = message.m_attachmentTitles.GetCount(); + if (nTitleSize) + { + wxASSERT(nTitleSize == nAttachmentSize); //If you are going to set the attachment titles then you must set + //the attachment title for each attachment + } + if (nAttachmentSize) + { + mapiMessage.nFileCount = nAttachmentSize; + mapiMessage.lpFiles = new MapiFileDesc[nAttachmentSize]; + for (i=0; im_lpfnMAPISendMail(m_data->m_hSession, 0, &mapiMessage, MAPI_DIALOG, 0); + if (nError == SUCCESS_SUCCESS) + { + bSuccess = TRUE; + m_data->m_nLastError = SUCCESS_SUCCESS; + } + else + { + wxLogDebug(_T("Failed to send mail message, Error:%d\n"), nError); + m_data->m_nLastError = nError; + } + + //Tidy up the Attachements + if (nAttachmentSize) + delete [] mapiMessage.lpFiles; + + //Free up the Recipients memory + delete [] mapiMessage.lpRecips; + + return bSuccess; +} + +long wxMapiSession::GetLastError() const +{ + return m_data->m_nLastError; +} + diff --git a/contrib/src/net/web.cpp b/contrib/src/net/web.cpp new file mode 100644 index 0000000000..d39886809a --- /dev/null +++ b/contrib/src/net/web.cpp @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: web.h +// Purpose: wxWeb: portable web browser-related class +// Author: Julian Smart +// Modified by: +// Created: 2001-08-21 +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma implementation "web.h" +#endif + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + +#include "wx/string.h" + + diff --git a/distrib/msw/contrib.rsp b/distrib/msw/contrib.rsp index 7996a7fb8e..455cdd5c69 100644 --- a/distrib/msw/contrib.rsp +++ b/distrib/msw/contrib.rsp @@ -219,3 +219,10 @@ contrib/src/fl/flVC.dsp contrib/src/fl/flVC.dsw contrib/include/wx/fl/*.h +contrib/src/net/*.cpp +contrib/src/net/*.h +contrib/src/net/make* +contrib/src/net/NetVC.dsp +contrib/src/net/NetVC.dsw +contrib/include/wx/net/*.h + diff --git a/distrib/msw/makefile.rsp b/distrib/msw/makefile.rsp index 812d4ffc45..dd9f0e448b 100644 --- a/distrib/msw/makefile.rsp +++ b/distrib/msw/makefile.rsp @@ -96,6 +96,8 @@ contrib/src/stc/Makefile.in contrib/src/plot/Makefile.in contrib/src/gizmos/Makefile.in contrib/src/animate/Makefile.in +contrib/src/fl/Makefile.in +contrib/src/net/Makefile.in contrib/samples/Makefile.in contrib/samples/canvas/test/Makefile.in diff --git a/distrib/msw/vc.rsp b/distrib/msw/vc.rsp index fdf11f9c2e..da23c9b6f0 100644 --- a/distrib/msw/vc.rsp +++ b/distrib/msw/vc.rsp @@ -327,3 +327,19 @@ contrib/src/animate/AnimateVC.dsw contrib/samples/animate/AniTestVC.dsp contrib/samples/animate/AniTestVC.dsw +contrib/src/fl/flVC.dsp +contrib/src/fl/flVC.dsw +contrib/samples/fl/fl_demo1/fl_demo.dsp +contrib/samples/fl/fl_demo1/fl_demo.dsw +contrib/samples/fl/fl_demo2/fl_demo.dsp +contrib/samples/fl/fl_demo2/fl_demo.dsw +contrib/samples/fl/fl_sample1/fl_demo.dsp +contrib/samples/fl/fl_sample1/fl_demo.dsw +contrib/samples/fl/fl_sample2/fl_demo.dsp +contrib/samples/fl/fl_sample2/fl_demo.dsw +contrib/samples/fl/fl_sample3/fl_demo.dsp +contrib/samples/fl/fl_sample3/fl_demo.dsw + +contrib/src/net/NetVC.dsp +contrib/src/net/NetVC.dsw + diff --git a/docs/latex/wx/wizpage.tex b/docs/latex/wx/wizpage.tex index 2418fe5dd5..b7a89640bf 100644 --- a/docs/latex/wx/wizpage.tex +++ b/docs/latex/wx/wizpage.tex @@ -16,8 +16,8 @@ know what are the following and preceding pages (which may be {\tt NULL} for the first/last page). Except for this extra knowledge, wxWizardPage is just a panel, so the controls may be placed directly on it in the usual way. -This class allows to decide what is the orde fo pages in the wizard -dynamically (during run-time) and so providex maximal flexibility. Usually, +This class allows the programmer to decide the order of pages in the wizard +dynamically (during run-time) and so provides maximal flexibility. Usually, however, the order of pages is known in advance in which case \helpref{wxWizardPageSimple}{wxwizardpagesimple} class is enough and it is simpler to use. diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 391af4da13..0de8b105d5 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -259,6 +259,11 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, else { msStyle |= ES_AUTOVSCROLL; + // Experimental: this seems to help with the scroll problem. See messages from Jekabs Andrushaitis + // wx-dev list, entitled "[wx-dev] wxMSW-EVT_KEY_DOWN and wxMSW-wxTextCtrl" and "[wx-dev] TextCtrl (RichEdit)" + // Unfortunately, showing the selection in blue when the control doesn't have + // the focus is non-standard behaviour, and we need to find another workaround. + //msStyle |= ES_NOHIDESEL ; m_isRich = TRUE; int ver = wxRichEditModule::GetLoadedVersion(); @@ -614,8 +619,13 @@ void wxTextCtrl::SetInsertionPoint(long pos) SendMessage(hWnd, EM_SETSEL, 0, MAKELPARAM(pos, pos)); #endif // Win32/16 - static const wxChar *nothing = _T(""); - SendMessage(hWnd, EM_REPLACESEL, 0, (LPARAM)nothing); +#if wxUSE_RICHEDIT + if ( !m_isRich) +#endif + { + static const wxChar *nothing = _T(""); + SendMessage(hWnd, EM_REPLACESEL, 0, (LPARAM)nothing); + } } void wxTextCtrl::SetInsertionPointEnd() -- 2.45.2