Back to index

lightning-sunbird  0.9+nobinonly
Defines | Functions | Variables
Registry.cpp File Reference
#include <objbase.h>
#include "nsString.h"
#include "Registry.h"

Go to the source code of this file.

Defines

#define PALMSYNC_PROXY_DLL_NAME   "PalmSyncProxy.dll"
#define PALMSYNC_STARTUP_ARG   " -PalmSyncStartup"
#define MAX_SIZE   2048

Functions

typedef HRESULT (__stdcall ProxyServer)()
BOOL CLSIDtochar (const CLSID &clsid, char *szCLSID, int length)
BOOL setKeyAndValue (nsCAutoString keyName, const char *subKey, const char *theValue)
LONG recursiveDeleteKey (HKEY hKeyParent, const char *lpszKeyChild)
void RegisterProxy ()
void UnRegisterProxy ()
HRESULT RegisterServerForPalmSync (const CLSID &clsid, const char *szFriendlyName, const char *szVerIndProgID, const char *szProgID)
LONG UnregisterServerForPalmSync (const CLSID &clsid, const char *szVerIndProgID, const char *szProgID)

Variables

const int CLSID_STRING_SIZE = 39

Define Documentation

#define MAX_SIZE   2048

Definition at line 47 of file Registry.cpp.

#define PALMSYNC_PROXY_DLL_NAME   "PalmSyncProxy.dll"

Definition at line 45 of file Registry.cpp.

#define PALMSYNC_STARTUP_ARG   " -PalmSyncStartup"

Definition at line 46 of file Registry.cpp.


Function Documentation

BOOL CLSIDtochar ( const CLSID &  clsid,
char *  szCLSID,
int  length 
)

Definition at line 59 of file Registry.cpp.

{
    LPOLESTR wszCLSID = NULL;

    // Get CLSID
    HRESULT hr = StringFromCLSID(clsid, &wszCLSID);
    if (FAILED(hr))
        return FALSE;

    // Covert from wide characters to non-wide.
    wcstombs(szCLSID, wszCLSID, length);

    // Free memory.
    CoTaskMemFree(wszCLSID);

    return TRUE;
}

Here is the caller graph for this function:

typedef HRESULT ( __stdcall  ProxyServer)
LONG recursiveDeleteKey ( HKEY  hKeyParent,
const char *  lpszKeyChild 
)

Definition at line 115 of file Registry.cpp.

{
    // Open the child.
    HKEY hKeyChild ;
    LONG lRes = RegOpenKeyEx(hKeyParent, lpszKeyChild, 0,
                             KEY_ALL_ACCESS, &hKeyChild) ;
    if (lRes != ERROR_SUCCESS)
    {
        return lRes ;
    }

    // Enumerate all of the decendents of this child.
    FILETIME time ;
    char szBuffer[MAX_SIZE] ;
    DWORD dwSize = MAX_SIZE ;
    while (RegEnumKeyEx(hKeyChild, 0, szBuffer, &dwSize, NULL,
                        NULL, NULL, &time) == S_OK)
    {
        // Delete the decendents of this child.
        lRes = recursiveDeleteKey(hKeyChild, szBuffer) ;
        if (lRes != ERROR_SUCCESS)
        {
            // Cleanup before exiting.
            RegCloseKey(hKeyChild) ;
            return lRes;
        }
        dwSize = MAX_SIZE;
    }

    // Close the child.
    RegCloseKey(hKeyChild) ;

    // Delete this child.
    return RegDeleteKey(hKeyParent, lpszKeyChild) ;
}

Here is the caller graph for this function:

Definition at line 152 of file Registry.cpp.

{
    HINSTANCE h = NULL;
    ProxyServer *RegisterFunc = NULL;

    char szModule[MAX_SIZE];
    char *pTemp = NULL;

    HMODULE hModule = GetModuleHandle(NULL);
    DWORD dwResult  = ::GetModuleFileName(hModule, szModule,
                                          sizeof(szModule)/sizeof(char));
    if (dwResult == 0)
        return;

    pTemp = strrchr(szModule, '\\');
    if (pTemp == NULL)
        return;

    *pTemp = '\0';
    nsCAutoString proxyPath(szModule);

    proxyPath += "\\";
    proxyPath += PALMSYNC_PROXY_DLL_NAME;

    h = LoadLibrary(proxyPath.get());
    if (h == NULL)
        return;

    RegisterFunc = (ProxyServer *) GetProcAddress(h, "DllRegisterServer");
    if (RegisterFunc)
        RegisterFunc();

    FreeLibrary(h);
}

Here is the call graph for this function:

Here is the caller graph for this function:

HRESULT RegisterServerForPalmSync ( const CLSID &  clsid,
const char *  szFriendlyName,
const char *  szVerIndProgID,
const char *  szProgID 
)

Definition at line 224 of file Registry.cpp.

{
    HMODULE hModule = GetModuleHandle(NULL);
    char szModuleName[MAX_SIZE];
    char szCLSID[CLSID_STRING_SIZE];

    nsCAutoString independentProgId(szVerIndProgID);
    nsCAutoString progId(szProgID);

    DWORD dwResult = ::GetModuleFileName(hModule, szModuleName,
                              sizeof(szModuleName)/sizeof(char));

    if (dwResult == 0)
        return S_FALSE;

    nsCAutoString moduleName(szModuleName);
    nsCAutoString registryKey("CLSID\\");

    moduleName += PALMSYNC_STARTUP_ARG;

    // Convert the CLSID into a char.

    if (!CLSIDtochar(clsid, szCLSID, sizeof(szCLSID)))
        return S_FALSE;
    registryKey += szCLSID;

    // Add the CLSID to the registry.
    if((!setKeyAndValue(registryKey, NULL, szFriendlyName))
         || (!setKeyAndValue(registryKey, "LocalServer32", moduleName.get()))
         // Add the ProgID subkey under the CLSID key.
         || (!setKeyAndValue(registryKey, "ProgID", szProgID))
         // Add the version-independent ProgID subkey under CLSID key.
         || (!setKeyAndValue(registryKey, "VersionIndependentProgID", szVerIndProgID))
         // Add the version-independent ProgID subkey under HKEY_CLASSES_ROOT.
         || (!setKeyAndValue(independentProgId, NULL, szFriendlyName))
         || (!setKeyAndValue(independentProgId, "CLSID", szCLSID))
         || (!setKeyAndValue(independentProgId, "CurVer", szProgID))
         // Add the versioned ProgID subkey under HKEY_CLASSES_ROOT.
         || (!setKeyAndValue(progId, NULL, szFriendlyName))
         || (!setKeyAndValue(progId, "CLSID", szCLSID))
      )
        return S_FALSE;

    RegisterProxy();

    return S_OK;
}

Here is the call graph for this function:

BOOL setKeyAndValue ( nsCAutoString  keyName,
const char *  subKey,
const char *  theValue 
)

Definition at line 80 of file Registry.cpp.

{
    HKEY hKey;
    BOOL retValue = TRUE;

    nsCAutoString theKey(keyName);
    if (subKey != NULL)
    {
        theKey += "\\";
        theKey += subKey;
    }

    // Create and open key and subkey.
    long lResult = RegCreateKeyEx(HKEY_CLASSES_ROOT, theKey.get(), 
                                  0, NULL, REG_OPTION_NON_VOLATILE,
                                  KEY_ALL_ACCESS, NULL, &hKey, NULL);
    if (lResult != ERROR_SUCCESS)
        return FALSE ;

    // Set the Value.
    if (theValue != NULL)
    {
       lResult = RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)theValue, 
                      strlen(theValue)+1);
       if (lResult != ERROR_SUCCESS)
           retValue = FALSE;
    }

    RegCloseKey(hKey);
    return TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 187 of file Registry.cpp.

{
    HINSTANCE h = NULL;
    ProxyServer *UnRegisterFunc = NULL;

    char szModule[MAX_SIZE];
    char *pTemp = NULL;

    HMODULE hModule = GetModuleHandle(NULL);
    DWORD dwResult  = ::GetModuleFileName(hModule, szModule,
                                          sizeof(szModule)/sizeof(char));
    if (dwResult == 0)
        return;

    pTemp = strrchr(szModule, '\\');
    if (pTemp == NULL)
        return;

    *pTemp = '\0';
    nsCAutoString proxyPath(szModule);

    proxyPath += "\\";
    proxyPath += PALMSYNC_PROXY_DLL_NAME;

    h = LoadLibrary(proxyPath.get());
    if (h == NULL)
        return;

    UnRegisterFunc = (ProxyServer *) GetProcAddress(h, "DllUnregisterServer");
    if (UnRegisterFunc)
        UnRegisterFunc();

    FreeLibrary(h);
}

Here is the call graph for this function:

Here is the caller graph for this function:

LONG UnregisterServerForPalmSync ( const CLSID &  clsid,
const char *  szVerIndProgID,
const char *  szProgID 
)

Definition at line 275 of file Registry.cpp.

{
    LONG lResult = S_OK;

    // Convert the CLSID into a char.

    char szCLSID[CLSID_STRING_SIZE];
    if (!CLSIDtochar(clsid, szCLSID, sizeof(szCLSID)))
        return S_FALSE;

    UnRegisterProxy();

    nsCAutoString registryKey("CLSID\\");
    registryKey += szCLSID;

    lResult = recursiveDeleteKey(HKEY_CLASSES_ROOT, registryKey.get());
    if (lResult == ERROR_SUCCESS || lResult == ERROR_FILE_NOT_FOUND)
        return lResult;

    registryKey += "\\LocalServer32";

    // Delete only the path for this server.

    lResult = recursiveDeleteKey(HKEY_CLASSES_ROOT, registryKey.get());
    if (lResult != ERROR_SUCCESS && lResult != ERROR_FILE_NOT_FOUND)
        return lResult;

    // Delete the version-independent ProgID Key.
    lResult = recursiveDeleteKey(HKEY_CLASSES_ROOT, szVerIndProgID);
    if (lResult != ERROR_SUCCESS && lResult != ERROR_FILE_NOT_FOUND)
        return lResult;

    lResult = recursiveDeleteKey(HKEY_CLASSES_ROOT, szProgID);

    return lResult;
}

Here is the call graph for this function:


Variable Documentation

Definition at line 50 of file Registry.cpp.