From 0dd84267e740fd10f46103a5affee01611fcd224 Mon Sep 17 00:00:00 2001 From: Daniel Brahneborg Date: Tue, 12 Mar 2002 10:31:02 +0000 Subject: Load all residual sis files before installing, to make sure we don't have another version installed already. --- sisinstall/sisinstaller.cpp | 178 ++++++++++++++++++++++++++++---------------- 1 file changed, 113 insertions(+), 65 deletions(-) (limited to 'sisinstall/sisinstaller.cpp') diff --git a/sisinstall/sisinstaller.cpp b/sisinstall/sisinstaller.cpp index 263b2ea..80d2ce2 100644 --- a/sisinstall/sisinstaller.cpp +++ b/sisinstall/sisinstaller.cpp @@ -2,6 +2,7 @@ #include "sisinstaller.h" #include "sisfile.h" +#include "sisfilelink.h" #include "sisfilerecord.h" #include "sisreqrecord.h" #include "psion.h" @@ -23,6 +24,11 @@ checkAbortHash(void *, u_int32_t) return continueRunning; } +SISInstaller::SISInstaller() +{ + m_installed = 0; +} + void SISInstaller::createDirs(char* filename) { @@ -161,6 +167,7 @@ SISInstaller::installFile(SISFileRecord* fileRecord) } SISInstaller installer; installer.setPsion(m_psion); + installer.setInstalled(m_installed); rc = installer.run(&sisFile, buf2, len, m_file); if (0 == m_drive) { @@ -186,10 +193,72 @@ SISInstaller::installFile(SISFileRecord* fileRecord) return FILE_OK; } +#define SYSTEMINSTALL "c:\\system\\install\\" + +SisRC +SISInstaller::loadInstalled() +{ + PlpDir files; + Enum res; + + if ((res = m_psion->dir(SYSTEMINSTALL, files)) != rfsv::E_PSI_GEN_NONE) + { + return SIS_FAILED; + } + else + { + while (!files.empty()) + { + PlpDirent file = files[0]; + printf("Loading sis file `%s'\n", file.getName()); + char sisname[256]; + sprintf(sisname, "%s%s", SYSTEMINSTALL, file.getName()); + loadPsionSis(sisname); + files.pop_front(); + } + } +} + void -SISInstaller::setPsion(Psion* psion) +SISInstaller::loadPsionSis(const char* name) { - m_psion = psion; + char srcName[32]; + strcpy(srcName, "/tmp/plptools-sis-XXXXXX"); + int fd = mkstemp(srcName); + if (-1 == fd) + { + printf("Couldn't create temp file: %s\n", strerror(errno)); + return; + } + Enum res; + continueRunning = 1; + if (logLevel >= 2) + printf("Copying from %s to temp file %s\n", name, srcName); + res = m_psion->copyFromPsion(name, fd, checkAbortHash); + if (res == rfsv::E_PSI_GEN_NONE) + { + off_t fileLen = lseek(fd, 0, SEEK_END); + if (logLevel >= 2) + printf("Read %d bytes from the Psion file %s\n", + (int)fileLen, name); + lseek(fd, SEEK_SET, 0); + uint8_t* sisbuf = new uint8_t[fileLen]; + int rc = read(fd, sisbuf, fileLen); + if (rc == fileLen) + { + SISFile* sisFile = new SISFile(); + SisRC rc2 = sisFile->fillFrom(sisbuf, fileLen); + if (rc2 == SIS_OK) + { + if (logLevel >= 1) + printf(" Ok.\n"); + SISFileLink* link = new SISFileLink(sisFile); + link->m_next = m_installed; + m_installed = link; + } + } + } + close(fd); } SisRC @@ -240,6 +309,8 @@ SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent) // library has been loaded, since the sis file names could be just // about anything. // + if (m_installed == 0) + loadInstalled(); // Check Requisites. // @@ -262,76 +333,38 @@ SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent) m_file->m_header.m_uid1, m_file->m_header.m_major, m_file->m_header.m_minor); - char* resname = new char[256]; - int namelen = 0; - while (compName[namelen] != 0) - { - if (compName[namelen] == ' ') - break; - namelen++; - } - sprintf(resname, "C:\\System\\Install\\%.*s.sis", namelen, compName); -#if 0 - char srcName[32]; - strcpy(srcName, "/tmp/plptools-sis-XXXXXX"); - int fd = mkstemp(srcName); - if (-1 == fd) - { - printf("Couldn't create temp file: %s\n", strerror(errno)); - return SIS_FAILED; - } - Enum res; - continueRunning = 1; - printf("Copying from %s to temp file %s\n", resname, srcName); - res = m_psion->copyFromPsion(resname, fd, checkAbortHash); - if (res == rfsv::E_PSI_GEN_NONE) + bool uninstallFirst; + SISFileLink* curr = m_installed; + while (curr) { - off_t fileLen = lseek(fd, SEEK_END, 0); - if (logLevel >= 2) - printf("Read %d bytes from the Psion file %s\n", - fileLen, resname); - lseek(fd, SEEK_SET, 0); - uint8_t* sisbuf = new uint8_t[fileLen]; - int rc = read(fd, sisbuf, fileLen); - if (rc == fileLen) + SISFile* sisFile = curr->m_file; + switch (sisFile->compareApp(m_file)) { - bool uninstallFirst = false; - SISFile sisFile; - SisRC rc2 = sisFile.fillFrom(sisbuf, fileLen); - if (rc2 == SIS_OK) - { - switch (sisFile.compareApp(m_file)) - { - case SIS_DIFFERENT_APP: - // NOW WHAT? - return SIS_DIFFERENT_APP; - - case SIS_VER_EARLIER: - uninstallFirst = true; - break; - - case SIS_SAME_OR_LATER: - // Ask for confirmation. - uninstallFirst = true; - break; + case SIS_VER_EARLIER: + uninstallFirst = true; + break; - case SIS_OTHER_VARIANT: - // Ask for confirmation. - uninstallFirst = true; - break; + case SIS_SAME_OR_LATER: + // Ask for confirmation. + uninstallFirst = true; + break; - } - if (uninstallFirst) - { - // Not yet... - // uninstall(&sisFile); - } - } + case SIS_OTHER_VARIANT: + // Ask for confirmation. + uninstallFirst = true; + break; } + curr = curr->m_next; + } + + if (uninstallFirst) + { + printf("You should uninstall the previous version first.\n"); + return SIS_ABORTED; + // Not yet... + // uninstall(&sisFile); } - close(fd); -#endif // Install file components. // @@ -398,6 +431,15 @@ SISInstaller::run(SISFile* file, uint8_t* buf, off_t len, SISFile* parent) // Copy the updated sis file to the epoc machine. // + char* resname = new char[256]; + int namelen = 0; + while (compName[namelen] != 0) + { + if (compName[namelen] == ' ') + break; + namelen++; + } + sprintf(resname, "C:\\System\\Install\\%.*s.sis", namelen, compName); printf("Creating residual sis file %s\n", resname); copyBuf(buf, firstFile, resname); delete[] resname; @@ -467,3 +509,9 @@ SISInstaller::selectDrive() } } +void +SISInstaller::setPsion(Psion* psion) +{ + m_psion = psion; +} + -- cgit v1.2.3