view src/win_gaim.c @ 7235:03f22e564311

[gaim-migrate @ 7810] I added some deps to the rpm, those should be there, right? Also... [ 821937 ] Fix for away message tooltip In Gaim 0.71, the tooltip text for Oscar is not properly escaped. This causes away messages such as "failed <-- this is a fact, not a prediction" to break the tooltip. Other protocols do not have this issue, since they call g_markup_escape_text() in the appropriate places. The call to gaim_markup_strip_html() is not sufficient in cases such as the example, since complete HTML tags are not present but HTML special characters are. This patch simply calls g_markup_escape_text() before adding the away message to the tooltip text. Patch is against the 0.71 source, since I don't think anoymous CVS is up-to-date. --Daniel Westermann-Clark (potpieman) committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sun, 12 Oct 2003 03:15:38 +0000
parents 4eee806af511
children e28728795a45
line wrap: on
line source

/*
 *  win_aim.c
 *
 *  Author: Herman Bloggs <hermanator12002@yahoo.com>
 *  Date: June, 2002
 *  Description: Entry point for win32 gaim, and various win32 dependant
 *  routines.
 */
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

/*
 *  GLOBALS
 */
__declspec(dllimport) HINSTANCE gaimexe_hInstance;

/*
 *  LOCALS
 */
static char msg1[] = "The following duplicate of ";
static char msg2[] = " has been found in your dll search path and will likely\x0d\x0a"
              "cause Gaim to malfunction:\x0d\x0a\x0d\x0a";

static char msg3[] = "\x0d\x0a\x0d\x0aWould you like to rename this dll to ";
static char msg4[] = ".prob in order to avoid any possible conflicts?\x0d\x0a"
                     "\x0d\x0a"
                     "Note: Doing so will likely cause the application that installed this dll to stop functioning.\x0d\x0a"
                     "You may wish to inform the author of the responsible application so that future versions\x0d\x0a"
                     "do not cause 'Dll Hell'.";

/*
 *  PROTOTYPES
 */
int (*gaim_main)( HINSTANCE, int, char** ) = NULL;

static void check_dll(char* dll, char* orig) {
        char tmp[MAX_PATH];
        char *last;

        if(SearchPath(NULL, dll, NULL, MAX_PATH, tmp, &last)) {
                char* patha = (char*)malloc(strlen(orig) + strlen(dll) + 4);
                strcpy(patha, orig);
                strcat(patha, "\\");
                strcat(patha, dll);
                /* Make sure that 2 paths are not the same */
                if(strcasecmp(patha, tmp) != 0) {
                        char *warning = (char*)malloc(strlen(msg1)+
                                                      strlen(msg2)+
                                                      strlen(msg3)+
                                                      strlen(msg4)+
                                                      strlen(tmp)+
                                                      (strlen(dll)*2)+4);
                        sprintf(warning, "%s%s%s%s%s%s%s", msg1, dll, msg2, tmp, msg3, dll, msg4);
                        if(MessageBox(NULL, warning, "Gaim Warning", MB_YESNO | MB_TOPMOST)==IDYES) {
                                char *newname = (char*)malloc(strlen(tmp)+6);
                                /* Rename offending dll */
                                sprintf(newname, "%s%s", tmp, ".prob");
                                if(rename(tmp, newname) != 0) {
                                        MessageBox(NULL, "Error renaming file.", NULL, MB_OK | MB_TOPMOST);
                                }
                                else
                                        check_dll(dll, orig);
                                free(newname);
                        }
                        free(warning);
                }
                free(patha);
        }
}

static void dll_hell_check(char* gtkpath) {
        HANDLE myHandle;
        WIN32_FIND_DATA fd;
        char* srchstr = (char*)malloc(strlen(gtkpath) + 8);
        
        sprintf(srchstr, "%s%s", gtkpath, "\\*.dll");
        myHandle = FindFirstFile(srchstr, &fd );
        if(myHandle != INVALID_HANDLE_VALUE) {
                check_dll(fd.cFileName, gtkpath);
                while(FindNextFile(myHandle, &fd)) {
                        check_dll(fd.cFileName, gtkpath);
                }
        }
        free(srchstr);
}

BOOL read_reg_string(HKEY key, char* sub_key, char* val_name, LPBYTE data, LPDWORD data_len) {
        HKEY hkey;
        BOOL ret = FALSE;
        int retv;

        if(ERROR_SUCCESS == RegOpenKeyEx(key, 
                                         sub_key, 
					 0,  KEY_QUERY_VALUE, &hkey)) {
                if(ERROR_SUCCESS == (retv=RegQueryValueEx(hkey, val_name, 0, NULL, data, data_len)))
                        ret = TRUE;
                else {
                        printf("Error reading registry string value: %d\n", retv);
                }
                RegCloseKey(key);
        }
        return ret;
}

void run_dll_check() {
        char path[MAX_PATH];
        DWORD plen = MAX_PATH;
        int gotreg=FALSE;

        /* Dll Hell Check.. Only run check if we are the same gaim as found in the
           gaim registry key */
        if(!(gotreg = read_reg_string(HKEY_LOCAL_MACHINE, "SOFTWARE\\gaim", "", (LPBYTE)&path, &plen)))
                gotreg = read_reg_string(HKEY_CURRENT_USER, "SOFTWARE\\gaim", "", (LPBYTE)&path, &plen);

        if(gotreg) {
                char modpath[MAX_PATH];
                
                strcat(path, "\\gaim.exe");
                GetModuleFileName(NULL, modpath, MAX_PATH);
                if(strcasecmp(path, modpath) == 0) {
                        plen = MAX_PATH;
                        if(!(gotreg = read_reg_string(HKEY_LOCAL_MACHINE, "SOFTWARE\\GTK\\2.0", "Path", (LPBYTE)&path, &plen)))
                                gotreg = read_reg_string(HKEY_CURRENT_USER, "SOFTWARE\\GTK\\2.0", "Path", (LPBYTE)&path, &plen);
                        if(gotreg) {
                                strcat(path, "\\bin");
                                dll_hell_check(path);
                        }
                }
        }
}

#ifdef __GNUC__
#  ifndef _stdcall
#    define _stdcall  __attribute__((stdcall))
#  endif
#endif

int _stdcall
WinMain (struct HINSTANCE__ *hInstance, 
	 struct HINSTANCE__ *hPrevInstance,
	 char               *lpszCmdLine,
	 int                 nCmdShow)
{
        char gaimdir[MAX_PATH];
        char *point;
        HMODULE hmod;

        /* If GAIM_NO_DLL_CHECK is set, don't run the dll check */
        if(!getenv("GAIM_NO_DLL_CHECK"))
                run_dll_check();

        /* Load exception handler if we have it */
        GetModuleFileName(NULL, gaimdir, MAX_PATH);
        if((point=strstr(gaimdir, "gaim.exe"))) {
                point[0] = '\0';
                strcat(gaimdir, "exchndl.dll");
                LoadLibrary(gaimdir);
        }

        /* Now we are ready for Gaim .. */
        if((hmod=LoadLibrary("gaim.dll"))) {
                gaim_main = (void*)GetProcAddress(hmod, "gaim_main");
        }

        if(!gaim_main) {
                MessageBox(NULL, "Error loading gaim.dll entry point.", NULL, MB_OK | MB_TOPMOST);
                return 0;
        }
        else
                return gaim_main (hInstance, __argc, __argv);
}