src/win32/win32dep.c

branch
gaim
changeset 20470
77693555855f
parent 13071
b98e72d4089a
parent 20469
b2836a24d81e
child 20471
1966704b3e42
--- a/src/win32/win32dep.c	Mon Apr 16 00:43:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,458 +0,0 @@
-/*
- * gaim
- *
- * File: win32dep.c
- * Date: June, 2002
- * Description: Windows dependant code for Gaim
- *
- * Copyright (C) 2002-2003, Herman Bloggs <hermanator12002@yahoo.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-#include <windows.h>
-#include <io.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <winuser.h>
-
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#include "gaim.h"
-#include "debug.h"
-#include "notify.h"
-
-#include "resource.h"
-#include "idletrack.h"
-#include "zlib.h"
-#include "untar.h"
-
-#include <libintl.h>
-
-#include "win32dep.h"
-
-/*
- *  DEFINES & MACROS
- */
-#define _(x) gettext(x)
-
-/*
- * DATA STRUCTS
- */
-
-/* For shfolder.dll */
-typedef HRESULT (CALLBACK* LPFNSHGETFOLDERPATHA)(HWND, int, HANDLE, DWORD, LPSTR);
-typedef HRESULT (CALLBACK* LPFNSHGETFOLDERPATHW)(HWND, int, HANDLE, DWORD, LPWSTR);
-
-typedef enum {
-    SHGFP_TYPE_CURRENT  = 0,   /* current value for user, verify it exists */
-    SHGFP_TYPE_DEFAULT  = 1,   /* default value, may not exist */
-} SHGFP_TYPE;
-
-/*
- * LOCALS
- */
-static char *app_data_dir, *install_dir, *lib_dir, *locale_dir;
-
-/*
- *  GLOBALS
- */
-HINSTANCE gaimexe_hInstance = 0;
-HINSTANCE gaimdll_hInstance = 0;
-
-/*
- *  PROTOS
- */
-
-FARPROC wgaim_find_and_loadproc(char*, char*);
-extern void wgaim_gtkspell_init();
-char* wgaim_data_dir(void);
-
-/*
- *  STATIC CODE
- */
-
-static void wgaim_debug_print(GaimDebugLevel level, const char *category, const char *format, va_list args) {
-	char *str = NULL;
-	if (args != NULL) {
-		str = g_strdup_vprintf(format, args);
-	} else {
-		str = g_strdup(format);
-	}
-	printf("%s%s%s", category?category:"", category?": ":"",str);
-	g_free(str);
-}
-
-static GaimDebugUiOps ops =  {
-	wgaim_debug_print
-};
-
-/*
- *  PUBLIC CODE
- */
-
-HINSTANCE wgaim_hinstance(void) {
-	return gaimexe_hInstance;
-}
-
-/* Escape windows dir separators.  This is needed when paths are saved,
-   and on being read back have their '\' chars used as an escape char.
-   Returns an allocated string which needs to be freed.
-*/
-char* wgaim_escape_dirsep( char* filename ) {
-	int sepcount=0;
-	char* ret=NULL;
-	int cnt=0;
-
-	ret = filename;
-	while(*ret) {
-		if(*ret == '\\')
-			sepcount++;
-		ret++;
-	}
-	ret = g_malloc0(strlen(filename) + sepcount + 1);
-	while(*filename) {
-		ret[cnt] = *filename;
-		if(*filename == '\\')
-			ret[++cnt] = '\\';
-		filename++;
-		cnt++;
-	}
-	ret[cnt] = '\0';
-	return ret;
-}
-
-/* Determine whether the specified dll contains the specified procedure.
-   If so, load it (if not already loaded). */
-FARPROC wgaim_find_and_loadproc( char* dllname, char* procedure ) {
-	HMODULE hmod;
-	int did_load=0;
-	FARPROC proc = 0;
-
-	if(!(hmod=GetModuleHandle(dllname))) {
-		gaim_debug(GAIM_DEBUG_WARNING, "wgaim", "%s not found. Loading it..\n", dllname);
-		if(!(hmod = LoadLibrary(dllname))) {
-			gaim_debug(GAIM_DEBUG_ERROR, "wgaim", "Could not load: %s\n", dllname);
-			return NULL;
-		}
-		else
-			did_load = 1;
- 	}
-
-	if((proc=GetProcAddress(hmod, procedure))) {
-		gaim_debug(GAIM_DEBUG_INFO, "wgaim", "This version of %s contains %s\n",
-			     dllname, procedure);
-		return proc;
-	}
-	else {
-		gaim_debug(GAIM_DEBUG_WARNING, "wgaim", "Function %s not found in dll %s\n", 
-			     procedure, dllname);
-		if(did_load) {
-			/* unload dll */
-			FreeLibrary(hmod);
-		}
-		return NULL;
-	}
-}
-
-/* Determine Gaim Paths during Runtime */
-
-/* Get paths to special Windows folders. */
-char *wgaim_get_special_folder(int folder_type) {
-	static LPFNSHGETFOLDERPATHA MySHGetFolderPathA = NULL;
-	char *retval = NULL;
-#if GLIB_CHECK_VERSION(2,6,0)
-	static LPFNSHGETFOLDERPATHW MySHGetFolderPathW = NULL;
-
-	if (!MySHGetFolderPathW) {
-		MySHGetFolderPathW = (LPFNSHGETFOLDERPATHW)
-			wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathW");
-	}
-
-	if (MySHGetFolderPathW) {
-		wchar_t utf_16_dir[MAX_PATH + 1];
-
-		if (SUCCEEDED(MySHGetFolderPathW(NULL, folder_type, NULL,
-						SHGFP_TYPE_CURRENT, utf_16_dir))) {
-			retval = g_utf16_to_utf8(utf_16_dir, -1, NULL, NULL, NULL);
-		}
-	}
-#endif
-
-	if (!retval) {
-		if (!MySHGetFolderPathA) {
-			MySHGetFolderPathA = (LPFNSHGETFOLDERPATHA)
-				wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathA");
-		}
-		if (MySHGetFolderPathA) {
-			char locale_dir[MAX_PATH + 1];
-
-			if (SUCCEEDED(MySHGetFolderPathA(NULL, folder_type, NULL,
-							SHGFP_TYPE_CURRENT, locale_dir))) {
-#if GLIB_CHECK_VERSION(2,6,0)
-				retval = g_locale_to_utf8(locale_dir, -1, NULL, NULL, NULL);
-#else
-				retval = g_strdup(locale_dir);
-#endif
-			}
-		}
-	}
-
-	return retval;
-}
-
-char* wgaim_install_dir(void) {
-	static gboolean initialized = FALSE;
-
-	if (!initialized) {
-		char *tmp = NULL;
-		if (G_WIN32_HAVE_WIDECHAR_API()) {
-			wchar_t winstall_dir[MAXPATHLEN];
-			if (GetModuleFileNameW(NULL, winstall_dir,
-					MAXPATHLEN) > 0) {
-				tmp = g_utf16_to_utf8(winstall_dir, -1,
-					NULL, NULL, NULL);
-			}
-		} else {
-			gchar cpinstall_dir[MAXPATHLEN];
-			if (GetModuleFileNameA(NULL, cpinstall_dir,
-					MAXPATHLEN) > 0) {
-				tmp = g_locale_to_utf8(cpinstall_dir,
-					-1, NULL, NULL, NULL);
-			}
-		}
-
-		if (tmp == NULL) {
-			tmp = g_win32_error_message(GetLastError());
-			gaim_debug(GAIM_DEBUG_ERROR, "wgaim",
-				"GetModuleFileName error: %s\n", tmp);
-			g_free(tmp);
-			return NULL;
-		} else {
-			install_dir = g_path_get_dirname(tmp);
-			g_free(tmp);
-			initialized = TRUE;
-		}
-	}
-
-	return install_dir;
-}
-
-char* wgaim_lib_dir(void) {
-	static gboolean initialized = FALSE;
-
-	if (!initialized) {
-		char *inst_dir = wgaim_install_dir();
-		if (inst_dir != NULL) {
-			lib_dir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "plugins", inst_dir);
-			initialized = TRUE;
-		} else {
-			return NULL;
-		}
-	}
-
-	return lib_dir;
-}
-
-char* wgaim_locale_dir(void) {
-	static gboolean initialized = FALSE;
-
-	if (!initialized) {
-		char *inst_dir = wgaim_install_dir();
-		if (inst_dir != NULL) {
-			locale_dir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "locale", inst_dir);
-			initialized = TRUE;
-		} else {
-			return NULL;
-		}
-	}
-
-	return locale_dir;
-}
-
-char* wgaim_data_dir(void) {
-        return app_data_dir;
-}
-
-/* Miscellaneous */
-
-gboolean wgaim_read_reg_string(HKEY key, char* sub_key, char* val_name, LPBYTE data, LPDWORD data_len) {
-        HKEY hkey;
-        gboolean ret = FALSE;
-
-        if(ERROR_SUCCESS == RegOpenKeyEx(key, 
-                                         sub_key, 
-					 0,  KEY_QUERY_VALUE, &hkey)) {
-                if(ERROR_SUCCESS == RegQueryValueEx(hkey, val_name, 0, NULL, data, data_len))
-                        ret = TRUE;
-                RegCloseKey(key);
-        }
-        return ret;
-}
-
-int wgaim_gz_decompress(const char* in, const char* out) {
-	gzFile fin;
-	FILE *fout;
-	char buf[1024];
-	int ret;
-
-	if((fin = gzopen(in, "rb"))) {
-		if(!(fout = g_fopen(out, "wb"))) {
-			gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_decompress", "Error opening file: %s\n", out);
-			gzclose(fin);
-			return 0;
-		}
-	}
-	else {
-		gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_decompress", "gzopen failed to open: %s\n", in);
-		return 0;
-	}
-
-	while((ret=gzread(fin, buf, 1024))) {
-		if(fwrite(buf, 1, ret, fout) < ret) {
-			gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_decompress", "Error writing %d bytes to file\n", ret);
-			gzclose(fin);
-			fclose(fout);
-			return 0;
-		}
-	}
-	fclose(fout);
-	gzclose(fin);
-
-	if(ret < 0) {
-		gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_decompress", "gzread failed while reading: %s\n", in);
-		return 0;
-	}
-
-	return 1;
-}
-
-int wgaim_gz_untar(const char* filename, const char* destdir) {
-	char tmpfile[_MAX_PATH];
-	char template[]="wgaimXXXXXX";
-
-	sprintf(tmpfile, "%s%s%s", g_get_tmp_dir(), G_DIR_SEPARATOR_S, _mktemp(template));
-	if(wgaim_gz_decompress(filename, tmpfile)) {
-		int ret;
-		if(untar(tmpfile, destdir, UNTAR_FORCE | UNTAR_QUIET))
-			ret=1;
-		else {
-			gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_untar", "Failure untaring %s\n", tmpfile);
-			ret=0;
-		}
-		g_unlink(tmpfile);
-		return ret;
-	}
-	else {
-		gaim_debug(GAIM_DEBUG_ERROR, "wgaim_gz_untar", "Failed to gz decompress %s\n", filename);
-		return 0;
-	}
-}
-
-void wgaim_notify_uri(const char *uri) {
-	SHELLEXECUTEINFO sinfo;
-
-	memset(&sinfo, 0, sizeof(sinfo));
-    sinfo.cbSize = sizeof(sinfo);
-    sinfo.fMask = SEE_MASK_CLASSNAME;
-    sinfo.lpVerb = "open";
-    sinfo.lpFile = uri; 
-    sinfo.nShow = SW_SHOWNORMAL; 
-    sinfo.lpClass = "http";
-
-	/* We'll allow whatever URI schemes are supported by the
-	   default http browser.
-	*/
-	if(!ShellExecuteEx(&sinfo))
-		gaim_debug_error("wgaim", "Error opening URI: %s error: %d\n", uri, (int)sinfo.hInstApp);
-}
-
-void wgaim_init(HINSTANCE hint) {
-	WORD wVersionRequested;
-	WSADATA wsaData;
-	char *perlenv;
-	char *newenv;
-
-	gaim_debug_set_ui_ops(&ops);
-	gaim_debug(GAIM_DEBUG_INFO, "wgaim", "wgaim_init start\n");
-
-	gaimexe_hInstance = hint;
-
-	/* Winsock init */
-	wVersionRequested = MAKEWORD( 2, 2 );
-	WSAStartup( wVersionRequested, &wsaData );
-
-	/* Confirm that the winsock DLL supports 2.2 */
-	/* Note that if the DLL supports versions greater than
-	   2.2 in addition to 2.2, it will still return 2.2 in 
-	   wVersion since that is the version we requested. */
-	if ( LOBYTE( wsaData.wVersion ) != 2 ||
-             HIBYTE( wsaData.wVersion ) != 2 ) {
-		gaim_debug(GAIM_DEBUG_WARNING, "wgaim", "Could not find a usable WinSock DLL.  Oh well.\n");
-		WSACleanup();
-	}
-
-	/* Set Environmental Variables */
-	/* Tell perl where to find Gaim's perl modules */
-	perlenv = (char*) g_getenv("PERL5LIB");
-	newenv = g_strdup_printf("PERL5LIB=%s%s%s%s",
-		perlenv ? perlenv : "",
-		perlenv ? ";" : "",
-		wgaim_install_dir(),
-		"\\perlmod;");
-	if (putenv(newenv) < 0)
-		gaim_debug(GAIM_DEBUG_WARNING, "wgaim", "putenv failed\n");
-	g_free(newenv);
-
-        /* Set app data dir, used by gaim_home_dir */
-	newenv = (char*) g_getenv("GAIMHOME");
-	if (newenv) {
-		app_data_dir = g_strdup(newenv);
-	} else {
-		app_data_dir = wgaim_get_special_folder(CSIDL_APPDATA);
-		if (!app_data_dir) {
-			app_data_dir = g_strdup("C:");
-		}
-        }
-
-	gaim_debug(GAIM_DEBUG_INFO, "wgaim", "Gaim settings dir: %s\n", app_data_dir);
-
-	/* IdleTracker Initialization */
-	if(!wgaim_set_idlehooks())
-		gaim_debug(GAIM_DEBUG_ERROR, "wgaim", "Failed to initialize idle tracker\n");
-
-	gaim_debug(GAIM_DEBUG_INFO, "wgaim", "wgaim_init end\n");
-}
-
-/* Windows Cleanup */
-
-void wgaim_cleanup(void) {
-	gaim_debug(GAIM_DEBUG_INFO, "wgaim", "wgaim_cleanup\n");
-
-	/* winsock cleanup */
-	WSACleanup();
-
-	/* Idle tracker cleanup */
-	wgaim_remove_idlehooks();
-
-	g_free(app_data_dir);
-}
-
-/* DLL initializer */
-BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) {
-	gaimdll_hInstance = hinstDLL;
-	return TRUE;
-}

mercurial