From 40f70c388fe58352e800fc82e61a0c8eb9a0f67a Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 13 Feb 2013 11:34:00 +0000 Subject: [PATCH] Add wWinMain to FLTK p3dcert, and use wstring entirely [untested] --- direct/src/plugin/p3dCert.cxx | 85 ++++++++++++++++++++++++----------- direct/src/plugin/p3dCert.h | 12 +++++ makepanda/makepanda.py | 2 +- 3 files changed, 73 insertions(+), 26 deletions(-) diff --git a/direct/src/plugin/p3dCert.cxx b/direct/src/plugin/p3dCert.cxx index 40b59e7099..78f78f9c39 100644 --- a/direct/src/plugin/p3dCert.cxx +++ b/direct/src/plugin/p3dCert.cxx @@ -92,6 +92,30 @@ no_cert_text[] = "Click Cancel to avoid running this application."; + +#ifdef _WIN32 +int WINAPI +wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { + OpenSSL_add_all_algorithms(); + + LPWSTR *argv; + int argc; + argv = CommandLineToArgvW(pCmdLine, &argc); + if (argv == NULL || argc != 2) { + cerr << "usage: p3dcert cert_filename cert_dir\n"; + return 1; + } + + wstring cert_filename (argv[0]); + wstring cert_dir (argv[1]); + + AuthDialog *dialog = new AuthDialog(cert_filename, cert_dir); + dialog->show(); + + return Fl::run(); +} + +#else // _WIN32 int main(int argc, char **argv) { OpenSSL_add_all_algorithms(); @@ -108,14 +132,20 @@ int main(int argc, char **argv) { return Fl::run(); } +#endif // _WIN32 //////////////////////////////////////////////////////////////////// // Function: AuthDialog::Constructor // Access: Public // Description: //////////////////////////////////////////////////////////////////// +#ifdef _WIN32 +AuthDialog:: +AuthDialog(const wstring &cert_filename, const wstring &cert_dir) : +#else AuthDialog:: AuthDialog(const string &cert_filename, const string &cert_dir) : +#endif Fl_Window(435, 242, "New Panda3D Application"), _cert_dir(cert_dir) { @@ -208,41 +238,43 @@ approve_cert() { // Look for an unused filename. int i = 1; size_t buf_length = _cert_dir.length() + 100; - char *buf = new char[buf_length]; + + // Sure, there's a slight race condition right now: another process + // might attempt to create the same filename. So what. + FILE *fp = NULL; + #ifdef _WIN32 - wstring buf_w; -#endif // _WIN32 + wchar_t *buf = new wchar_t[buf_length]; + + while (true) { + swprintf(buf, L"%s/p%d.crt", _cert_dir.c_str(), i); + assert(wcslen(buf) < buf_length); + + // Check if it already exists. If not, take it. + if (GetFileAttributesW(buf) == -1) { + break; + } + ++i; + } + fp = _wfopen(buf, L"w"); + +#else // _WIN32 + char *buf = new char[buf_length]; while (true) { sprintf(buf, "%s/p%d.crt", _cert_dir.c_str(), i); assert(strlen(buf) < buf_length); // Check if it already exists. If not, take it. -#ifdef _WIN32 - DWORD results = 0; - if (string_to_wstring(buf_w, buf)) { - results = GetFileAttributesW(buf_w.c_str()); - } - if (results == -1) { - break; - } -#else struct stat statbuf; if (stat(buf, &statbuf) != 0) { break; } -#endif ++i; } - - // Sure, there's a slight race condition right now: another process - // might attempt to create the same filename. So what. - FILE *fp = NULL; -#ifdef _WIN32 - fp = _wfopen(buf_w.c_str(), L"w"); -#else // _WIN32 fp = fopen(buf, "w"); -#endif // _WIN32 +#endif // _WIN32 + if (fp != NULL) { PEM_write_X509(fp, _cert); fclose(fp); @@ -257,14 +289,17 @@ approve_cert() { // Description: Reads the list of certificates in the pem filename // passed on the command line into _cert and _stack. //////////////////////////////////////////////////////////////////// +#ifdef _WIN32 +void AuthDialog:: +read_cert_file(const wstring &cert_filename) { +#else void AuthDialog:: read_cert_file(const string &cert_filename) { +#endif + FILE *fp = NULL; #ifdef _WIN32 - wstring cert_filename_w; - if (string_to_wstring(cert_filename_w, cert_filename)) { - fp = _wfopen(cert_filename_w.c_str(), L"r"); - } + fp = _wfopen(cert_filename.c_str(), L"r"); #else // _WIN32 fp = fopen(cert_filename.c_str(), "r"); #endif // _WIN32 diff --git a/direct/src/plugin/p3dCert.h b/direct/src/plugin/p3dCert.h index edf43c9c6e..641a362147 100644 --- a/direct/src/plugin/p3dCert.h +++ b/direct/src/plugin/p3dCert.h @@ -53,7 +53,11 @@ class ViewCertDialog; //////////////////////////////////////////////////////////////////// class AuthDialog : public Fl_Window { public: +#ifdef _WIN32 + AuthDialog(const wstring &cert_filename, const wstring &cert_dir); +#else AuthDialog(const string &cert_filename, const string &cert_dir); +#endif virtual ~AuthDialog(); static void run_clicked(Fl_Widget *w, void *data); @@ -63,7 +67,11 @@ public: void approve_cert(); private: +#ifdef _WIN32 + void read_cert_file(const wstring &cert_filename); +#else void read_cert_file(const string &cert_filename); +#endif void get_friendly_name(); void verify_cert(); int load_certificates_from_der_ram(X509_STORE *store, @@ -76,7 +84,11 @@ public: ViewCertDialog *_view_cert_dialog; private: +#ifdef _WIN32 + wstring _cert_dir; +#else string _cert_dir; +#endif X509 *_cert; STACK_OF(X509) *_stack; diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index eec7170db8..4ff3e35619 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -4455,7 +4455,7 @@ if (RTDIST or RUNTIME): TargetAdd('p3dcert.exe', input='plugin_mkdir_complete.obj') TargetAdd('p3dcert.exe', input='plugin_wstring_encode.obj') TargetAdd('p3dcert.exe', input='plugin_p3dCert.obj') - OPTS=['OPENSSL', 'FLTK', 'WINCOMCTL', 'WINSOCK', 'WINGDI', 'WINUSER', 'ADVAPI', 'WINOLE', 'WINSHELL'] + OPTS=['OPENSSL', 'FLTK', 'WINCOMCTL', 'WINSOCK', 'WINGDI', 'WINUSER', 'ADVAPI', 'WINOLE', 'WINSHELL', 'SUBSYSTEM:WINDOWS'] if GetTarget() == 'darwin': OPTS += ['OPT:2'] TargetAdd('p3dcert.exe', opts=OPTS)