Back to index

lightning-sunbird  0.9+nobinonly
Classes | Defines | Typedefs | Functions | Variables
xpi.c File Reference
#include "extern.h"
#include "dialogs.h"
#include "extra.h"
#include "xpistub.h"
#include "xpi.h"
#include "xperr.h"
#include "logging.h"
#include "ifuncns.h"

Go to the source code of this file.


struct  ExtractFilesDlgInfo


#define BDIR_RIGHT   1
#define BDIR_LEFT   2


typedef HRESULT(_cdeclXpiInit )(const char *, const char *aLogName, pfnXPIProgress)
typedef HRESULT(_cdeclXpiInstall )(const char *, const char *, long)
typedef void(_cdeclXpiExit )(void)
typedef BOOL(WINAPI * SetDllPathProc )(const char *)


static void UpdateArchiveInstallProgress (int aValue)
HRESULT InitializeXPIStub (char *xpinstallPath)
HRESULT DeInitializeXPIStub ()
void GetTotalArchivesToInstall (void)
char * GetErrorString (DWORD dwError, char *szErrorString, DWORD dwErrorStringSize)
HRESULT SmartUpdateJars (HWND aWizardPanel)
void cbXPIStart (const char *URL, const char *UIName)
void cbXPIProgress (const char *msg, PRInt32 val, PRInt32 max)
void cbXPIFinal (const char *URL, PRInt32 finalStatus)


static XpiInit pfnXpiInit
static XpiInstall pfnXpiInstall
static XpiExit pfnXpiExit
static SetDllPathProc pfnSetDllPath = NULL
static long lFileCounter
static long lBarberCounter
static DWORD dwCurrentFile
static DWORD dwTotalFiles
char szStrProcessingFile [MAX_BUF]
char szStrCopyingFile [MAX_BUF]
char szStrInstalling [MAX_BUF]
static char gSavedCwd [MAX_BUF]
struct ExtractFilesDlgInfo dlgInfo

Class Documentation

struct ExtractFilesDlgInfo

Definition at line 74 of file xpi.c.

Collaboration diagram for ExtractFilesDlgInfo:
Class Members
HWND hWndDlg
int nArchiveBars
int nBars
int nFileBars
int nMaxArchiveBars
int nMaxBars
int nMaxFileBars

Define Documentation

#define BDIR_LEFT   2

Definition at line 51 of file xpi.c.

#define BDIR_RIGHT   1

Definition at line 50 of file xpi.c.

Typedef Documentation

typedef BOOL(WINAPI * SetDllPathProc)(const char *)

Definition at line 56 of file xpi.c.

typedef void(_cdecl * XpiExit)(void)

Definition at line 55 of file xpi.c.

typedef HRESULT(_cdecl * XpiInit)(const char *, const char *aLogName, pfnXPIProgress)

Definition at line 53 of file xpi.c.

typedef HRESULT(_cdecl * XpiInstall)(const char *, const char *, long)

Definition at line 54 of file xpi.c.

Function Documentation

void cbXPIFinal ( const char *  URL,
PRInt32  finalStatus 

Definition at line 416 of file xpi.c.

void cbXPIProgress ( const char *  msg,
PRInt32  val,
PRInt32  max 

Definition at line 384 of file xpi.c.

  char szFilename[MAX_BUF];
  char szStrProcessingFileBuf[MAX_BUF];
  char szStrCopyingFileBuf[MAX_BUF];

  if(sgProduct.mode != SILENT)
    ParsePath((char *)msg, szFilename, sizeof(szFilename), FALSE, PP_FILENAME_ONLY);

    dlgInfo.nFileBars = 0;
    // XXXben this is a really nasty hack. We shouldn't be parsing the msg value
    // to find out what sort of progress notification this is. Really, the installer
    // listener system needs to be rearchitected to send out a message type (int) 
    // and a message value, and the listeners can synthesize a display message if
    // they want to. As it stands, the strings that are used here are NOT localizable
    // (hard coded over in mozilla/xpinstall/src), which blows dead goats through
    // straws. 
    if ((!strncmp(msg, "Installing: ", 12) ||
         !strncmp(msg, "Replacing: ", 11)) 
         && (max != 0 && val <= max)) {



Here is the caller graph for this function:

void cbXPIStart ( const char *  URL,
const char *  UIName 

Definition at line 380 of file xpi.c.


Definition at line 145 of file xpi.c.

Here is the caller graph for this function:

char* GetErrorString ( DWORD  dwError,
char *  szErrorString,
DWORD  dwErrorStringSize 

Definition at line 179 of file xpi.c.

  int  i = 0;
  char szErrorNumber[MAX_BUF];

  ZeroMemory(szErrorString, dwErrorStringSize);
  itoa(dwError, szErrorNumber, 10);

  /* map the error value to a string */
    if(*XpErrorList[i] == '\0')

    if(lstrcmpi(szErrorNumber, XpErrorList[i]) == 0)
      if(*XpErrorList[i + 1] != '\0')
        lstrcpy(szErrorString, XpErrorList[i + 1]);




Here is the caller graph for this function:

Definition at line 162 of file xpi.c.

  DWORD i = 0;
  siC *siCObject = NULL;

  dwTotalFiles = 0;
  siCObject = SiCNodeGetObject(i, TRUE, AC_ALL);
  while (siCObject) {
    if ((siCObject->dwAttributes & SIC_SELECTED) && 
        !(siCObject->dwAttributes & SIC_LAUNCHAPP))
      dwTotalFiles += siCObject->iFileCount;

    siCObject = SiCNodeGetObject(++i, TRUE, AC_ALL);

Here is the caller graph for this function:

HRESULT InitializeXPIStub ( char *  xpinstallPath)

Definition at line 83 of file xpi.c.

  char szBuf[MAX_BUF];
  char szXPIStubFile[MAX_BUF];
  char szEGetProcAddress[MAX_BUF];
  HANDLE hKernel;

  hXPIStubInst = NULL;
  GetCurrentDirectory(sizeof(gSavedCwd), gSavedCwd);

  if(!GetPrivateProfileString("Messages", "ERROR_GETPROCADDRESS", "", szEGetProcAddress, sizeof(szEGetProcAddress), szFileIniInstall))

  /* change current directory to where xpistub.dll */

  /* Windows XP SP1 changed DLL search path strategy, setting current dir */
  /* is no longer sufficient. Use SetDLLDirectory() if available */
  if ((hKernel = LoadLibrary("kernel32.dll")) != NULL)
    pfnSetDllPath = (SetDllPathProc)GetProcAddress(hKernel, "SetDllDirectoryA");
    if (pfnSetDllPath)

  /* build full path to xpistub.dll */
  lstrcpy(szXPIStubFile, xpinstallPath);
  AppendBackSlash(szXPIStubFile, sizeof(szXPIStubFile));
  lstrcat(szXPIStubFile, "xpistub.dll");

  if(FileExists(szXPIStubFile) == FALSE)

  /* load xpistub.dll */
  if((hXPIStubInst = LoadLibraryEx(szXPIStubFile, NULL, LOAD_WITH_ALTERED_SEARCH_PATH)) == NULL)
    wsprintf(szBuf, szEDllLoad, szXPIStubFile);
    PrintError(szBuf, ERROR_CODE_SHOW);
  if(((FARPROC)pfnXpiInit = GetProcAddress(hXPIStubInst, "XPI_Init")) == NULL)
    wsprintf(szBuf, szEGetProcAddress, "XPI_Init");
    PrintError(szBuf, ERROR_CODE_SHOW);
  if(((FARPROC)pfnXpiInstall = GetProcAddress(hXPIStubInst, "XPI_Install")) == NULL)
    wsprintf(szBuf, szEGetProcAddress, "XPI_Install");
    PrintError(szBuf, ERROR_CODE_SHOW);
  if(((FARPROC)pfnXpiExit = GetProcAddress(hXPIStubInst, "XPI_Exit")) == NULL)
    wsprintf(szBuf, szEGetProcAddress, "XPI_Exit");
    PrintError(szBuf, ERROR_CODE_SHOW);


Here is the caller graph for this function:

HRESULT SmartUpdateJars ( HWND  aWizardPanel)

Definition at line 207 of file xpi.c.

  DWORD     i = 0;
  siC       *siCObject = NULL;
  HRESULT   hrResult;
  char      szBuf[MAX_BUF];
  char      szEXpiInstall[MAX_BUF];
  char      szArchive[MAX_BUF];
  char      szMsgSmartUpdateStart[MAX_BUF];
  char      szDlgExtractingTitle[MAX_BUF];
  char      xpinstallPath[MAX_BUF];
  char      xpiArgs[MAX_BUF];

  // Save the handle to the dialog window so the installer procedures
  // can send messages to it. 
  dlgInfo.hWndDlg = aWizardPanel;

  if (!GetPrivateProfileString("Messages", "DLG_EXTRACTING_TITLE", 
                               "", szDlgExtractingTitle, 
    return 1;

  if (!GetPrivateProfileString("Messages", "STR_PROCESSINGFILE", 
                               "", szStrProcessingFile, 
                               szFileIniInstall) ||
      !GetPrivateProfileString("Messages", "STR_INSTALLING", 
                               "", szStrInstalling, 
                               szFileIniInstall) ||
      !GetPrivateProfileString("Messages", "STR_COPYINGFILE", 
                               "", szStrCopyingFile, 

  GetXpinstallPath(xpinstallPath, sizeof(xpinstallPath));
  if(InitializeXPIStub(xpinstallPath) == WIZ_OK)
    lstrcpy(szBuf, sgProduct.szPath);
    if(*sgProduct.szSubPath != '\0')
      AppendBackSlash(szBuf, sizeof(szBuf));
      lstrcat(szBuf, sgProduct.szSubPath);
    hrResult = pfnXpiInit(szBuf, FILE_INSTALL_LOG, cbXPIProgress);

    SetDlgItemText(dlgInfo.hWndDlg, IDC_STATUS0, szMsgSmartUpdateStart);


    SendDlgItemMessage(dlgInfo.hWndDlg, IDC_PROGRESS_ARCHIVE, PBM_SETRANGE, 
                       0, MAKELPARAM(0, dwTotalFiles));

    dwCurrentFile = 0;
    siCObject = SiCNodeGetObject(i, TRUE, AC_ALL);
    while (siCObject) {
      if(siCObject->dwAttributes & SIC_SELECTED)
        /* Since the archive is selected, we need to process the file ops here */
         ProcessFileOps(T_PRE_ARCHIVE, siCObject->szReferenceName);

      /* launch smartupdate engine for earch jar to be installed */
      if((siCObject->dwAttributes & SIC_SELECTED)   &&
        !(siCObject->dwAttributes & SIC_LAUNCHAPP) &&
        !(siCObject->dwAttributes & SIC_DOWNLOAD_ONLY))
        lFileCounter      = 0;
        lBarberCounter    = 0;
                       dlgInfo.nFileBars = 0;

        // We need to send this message otherwise the progress bars will paint
        // over the completion page for some unknown reason! -ben
        SendMessage(aWizardPanel, WM_PAINT, 0, 0);

        lstrcpy(szArchive, sgProduct.szAlternateArchiveSearchPath);
        AppendBackSlash(szArchive, sizeof(szArchive));
        lstrcat(szArchive, siCObject->szArchiveName);
        if((*sgProduct.szAlternateArchiveSearchPath == '\0') || (!FileExists(szArchive)))
          lstrcpy(szArchive, szSetupDir);
          AppendBackSlash(szArchive, sizeof(szArchive));
          lstrcat(szArchive, siCObject->szArchiveName);
            lstrcpy(szArchive, szTempDir);
            AppendBackSlash(szArchive, sizeof(szArchive));
            lstrcat(szArchive, siCObject->szArchiveName);
              char szEFileNotFound[MAX_BUF];

              if(GetPrivateProfileString("Messages", "ERROR_FILE_NOT_FOUND", "", szEFileNotFound, sizeof(szEFileNotFound), szFileIniInstall))
                wsprintf(szBuf, szEFileNotFound, szArchive);
                PrintError(szBuf, ERROR_CODE_HIDE);

        wsprintf(szBuf, szStrInstalling, siCObject->szDescriptionShort);
        SetDlgItemText(dlgInfo.hWndDlg, IDC_STATUS0, szBuf);

        /* XXX fix: we need to better support passing arguments to .xpi files.
         * This is a temporary hack to get greType passed to browser.xpi so that
         * it won't delete GRE files if GRE is installed in the mozilla dir.
         * What should be done is have the arguments be described in each
         * component's section in config.ini and have it passed thru here. */
        *xpiArgs = '\0';
        if(lstrcmpi(siCObject->szArchiveName, "gre.xpi") == 0)
          MozCopyStr(sgProduct.szRegPath, xpiArgs, sizeof(xpiArgs));
        else if((lstrcmpi(siCObject->szArchiveName, "browser.xpi") == 0) &&
                (sgProduct.greType == GRE_LOCAL))
          /* passing -greShared to browser.xpi will tell it to cleanup GRE files
           * from it's directory if they exist. */
          MozCopyStr("-greLocal", xpiArgs, sizeof(xpiArgs));

        hrResult = pfnXpiInstall(szArchive, xpiArgs, 0xFFFF);
        if(hrResult == E_REBOOT)
          bReboot = TRUE;
        else if((hrResult != WIZ_OK) &&
               !(siCObject->dwAttributes & SIC_IGNORE_XPINSTALL_ERROR))
          LogMSXPInstallStatus(siCObject->szArchiveName, hrResult);
          if(GetPrivateProfileString("Messages", "ERROR_XPI_INSTALL", "", szEXpiInstall, sizeof(szEXpiInstall), szFileIniInstall))
            char szErrorString[MAX_BUF];

            GetErrorString(hrResult, szErrorString, sizeof(szErrorString));
            wsprintf(szBuf, "%s - %s: %d %s", szEXpiInstall, siCObject->szDescriptionShort, hrResult, szErrorString);
            PrintError(szBuf, ERROR_CODE_HIDE);

          /* break out of the siCObject while loop */


        if((hrResult != WIZ_OK) &&
          (siCObject->dwAttributes & SIC_IGNORE_XPINSTALL_ERROR))
          /* reset the result to WIZ_OK if there was an error and the
           * component's attributes contains SIC_IGNORE_XPINSTALL_ERROR.
           * This should be done after LogISXPInstallComponentResult()
           * because we still should log the error value. */
          hrResult = WIZ_OK;

      if(siCObject->dwAttributes & SIC_SELECTED)
        /* Since the archive is selected, we need to do the file ops here */
         ProcessFileOps(T_POST_ARCHIVE, siCObject->szReferenceName);

      siCObject = SiCNodeGetObject(++i, TRUE, AC_ALL);
    } /* while(siCObject) */

    //report 100% progress status for successful installs
    LogMSXPInstallStatus(NULL, hrResult);



Here is the call graph for this function:

Here is the caller graph for this function:

static void UpdateArchiveInstallProgress ( int  aValue) [static]

Definition at line 423 of file xpi.c.

  if (sgProduct.mode != SILENT) {
    SendDlgItemMessage(dlgInfo.hWndDlg, IDC_PROGRESS_ARCHIVE, PBM_SETPOS, 
                       (WPARAM)aValue, 0);

Here is the caller graph for this function:

Variable Documentation

DWORD dwCurrentFile [static]

Definition at line 65 of file xpi.c.

DWORD dwTotalFiles [static]

Definition at line 66 of file xpi.c.

char gSavedCwd[MAX_BUF] [static]

Definition at line 70 of file xpi.c.

long lBarberCounter [static]

Definition at line 64 of file xpi.c.

long lFileCounter [static]

Definition at line 63 of file xpi.c.

Definition at line 61 of file xpi.c.

XpiExit pfnXpiExit [static]

Definition at line 60 of file xpi.c.

XpiInit pfnXpiInit [static]

Definition at line 58 of file xpi.c.

Definition at line 59 of file xpi.c.

Definition at line 68 of file xpi.c.

Definition at line 69 of file xpi.c.

Definition at line 67 of file xpi.c.