merged from PIEPIEPIE branch:
- min/max macros removed - Plugins refactored - more functions in util.{h,cpp} git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4232 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
b33965c87d
commit
57ad3c18b3
12 changed files with 300 additions and 311 deletions
|
@ -112,12 +112,6 @@ typedef WORD LANGID;
|
|||
// macros
|
||||
|
||||
#ifndef _WIN32
|
||||
# ifndef min
|
||||
# define min(x,y) ((x<y)?x:y)
|
||||
# endif
|
||||
# ifndef max
|
||||
# define max(x,y) ((x>y)?x:y)
|
||||
# endif
|
||||
# ifndef FIELD_OFFSET
|
||||
# define FIELD_OFFSET(t,f) ((LONG)&(((t*)0)->f))
|
||||
# endif
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
#include "exehead/config.h"
|
||||
#ifdef NSIS_CONFIG_PLUGIN_SUPPORT
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
#include "Plugins.h"
|
||||
#include "Platform.h"
|
||||
#include "util.h"
|
||||
|
||||
#include "dirreader.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
|
@ -12,45 +16,12 @@
|
|||
# include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
|
||||
extern FILE *g_output;
|
||||
|
||||
int PluginsList::add(const char *name, const char *path)
|
||||
void Plugins::FindCommands(const string &path, bool displayInfo)
|
||||
{
|
||||
int pos=SortedStringListND<struct plugin>::add(name);
|
||||
if (pos == -1) return 1;
|
||||
|
||||
((struct plugin*)gr.get())[pos].path=strings.add(path, strlen(path)+1);
|
||||
((struct plugin*)gr.get())[pos].dataHandle=-1;
|
||||
((struct plugin*)gr.get())[pos].unDataHandle=-1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char* PluginsList::get(char **name, int *dataHandle/*=0*/, int *uninstDataHandle/*=0*/)
|
||||
{
|
||||
if (dataHandle) *dataHandle=-1;
|
||||
if (uninstDataHandle) *uninstDataHandle=-1;
|
||||
int v=SortedStringListND<struct plugin>::find(*name);
|
||||
if (v==-1) return NULL;
|
||||
strcpy(*name, (char*)strings.get()+((struct plugin*)gr.get())[v].name);
|
||||
if (dataHandle) *dataHandle=((struct plugin*)gr.get())[v].dataHandle;
|
||||
if (uninstDataHandle) *uninstDataHandle=((struct plugin*)gr.get())[v].unDataHandle;
|
||||
return (char*)strings.get()+((struct plugin*)gr.get())[v].path;
|
||||
}
|
||||
|
||||
void PluginsList::setDataHandle(const char *name, int dataHandle, int uninstDataHandle)
|
||||
{
|
||||
int v=SortedStringListND<struct plugin>::find(name);
|
||||
if (v==-1) return;
|
||||
((struct plugin*)gr.get())[v].dataHandle=dataHandle;
|
||||
((struct plugin*)gr.get())[v].unDataHandle=uninstDataHandle;
|
||||
}
|
||||
|
||||
void Plugins::FindCommands(char* path, bool displayInfo)
|
||||
{
|
||||
if (!path)
|
||||
return;
|
||||
|
||||
dir_reader *dr = new_dir_reader();
|
||||
dr->read(path);
|
||||
|
||||
|
@ -61,117 +32,129 @@ void Plugins::FindCommands(char* path, bool displayInfo)
|
|||
if (!dir_reader::matches(*files_itr, "*.dll"))
|
||||
continue;
|
||||
|
||||
string plugin = string(path) + PLATFORM_PATH_SEPARATOR_C + *files_itr;
|
||||
|
||||
GetExports((char *) plugin.c_str(), displayInfo);
|
||||
const string plugin = path + PLATFORM_PATH_SEPARATOR_C + *files_itr;
|
||||
GetExports(plugin, displayInfo);
|
||||
}
|
||||
|
||||
delete dr;
|
||||
}
|
||||
|
||||
void Plugins::GetExports(char* pathToDll, bool displayInfo)
|
||||
void Plugins::GetExports(const string &pathToDll, bool displayInfo)
|
||||
{
|
||||
if (pathToDll)
|
||||
unsigned char* dlldata = 0;
|
||||
bool loaded = false;
|
||||
|
||||
string dllName = remove_file_extension(get_file_name(pathToDll));
|
||||
|
||||
FILE* dll = fopen(pathToDll.c_str() ,"rb");
|
||||
if (dll == NULL)
|
||||
return;
|
||||
|
||||
fseek(dll,0,SEEK_END);
|
||||
long dlldatalen = ftell(dll);
|
||||
fseek(dll,0,SEEK_SET);
|
||||
if (dlldatalen > 0)
|
||||
{
|
||||
unsigned char* dlldata = 0;
|
||||
long dlldatalen = 0;
|
||||
bool loaded = false;
|
||||
char dllName[1024];
|
||||
char signature[1024];
|
||||
dlldata = new unsigned char [dlldatalen];
|
||||
assert(dlldata);
|
||||
|
||||
dllName[0] = 0;
|
||||
char* ptr = strrchr(pathToDll,PLATFORM_PATH_SEPARATOR_C);
|
||||
if (ptr && *ptr && *(ptr+1)) strcpy(dllName,ptr+1);
|
||||
|
||||
// find .dll
|
||||
int len = strlen(dllName);
|
||||
if (len > 4 && !stricmp(dllName + len - 4, ".dll"))
|
||||
{
|
||||
dllName[len - 4] = 0;
|
||||
}
|
||||
|
||||
FILE* dll = fopen(pathToDll,"rb");
|
||||
if (dll)
|
||||
{
|
||||
fseek(dll,0,SEEK_END);
|
||||
dlldatalen = ftell(dll);
|
||||
fseek(dll,0,SEEK_SET);
|
||||
if (dlldatalen > 0)
|
||||
{
|
||||
dlldata = new unsigned char [dlldatalen];
|
||||
if (dlldata)
|
||||
{
|
||||
size_t bytesread = fread((void*)dlldata,1,dlldatalen,dll);
|
||||
if ((long)bytesread == dlldatalen)
|
||||
loaded = true;
|
||||
}
|
||||
}
|
||||
fclose(dll);
|
||||
}
|
||||
|
||||
if (!loaded)
|
||||
{
|
||||
if (dlldata) delete[] dlldata;
|
||||
return;
|
||||
}
|
||||
|
||||
PIMAGE_NT_HEADERS NTHeaders = PIMAGE_NT_HEADERS(dlldata + PIMAGE_DOS_HEADER(dlldata)->e_lfanew);
|
||||
if (NTHeaders->Signature == IMAGE_NT_SIGNATURE)
|
||||
{
|
||||
if (NTHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL)
|
||||
{
|
||||
if (NTHeaders->OptionalHeader.NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_EXPORT) return;
|
||||
|
||||
DWORD ExportDirVA = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
|
||||
DWORD ExportDirSize = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
|
||||
PIMAGE_SECTION_HEADER sections = IMAGE_FIRST_SECTION(NTHeaders);
|
||||
|
||||
for (int i = 0; i < NTHeaders->FileHeader.NumberOfSections; i++)
|
||||
{
|
||||
if (sections[i].VirtualAddress <= ExportDirVA
|
||||
&& sections[i].VirtualAddress+sections[i].Misc.VirtualSize >= ExportDirVA+ExportDirSize)
|
||||
{
|
||||
PIMAGE_EXPORT_DIRECTORY exports = PIMAGE_EXPORT_DIRECTORY(dlldata + sections[i].PointerToRawData + ExportDirVA - sections[i].VirtualAddress);
|
||||
unsigned long *names = (unsigned long*)((unsigned long)exports + (char *)exports->AddressOfNames - ExportDirVA);
|
||||
for (unsigned long j = 0; j < exports->NumberOfNames; j++)
|
||||
{
|
||||
char *name = (char*)exports + names[j] - ExportDirVA;
|
||||
wsprintf(signature, "%s::%s", dllName, name);
|
||||
m_list.add(signature, pathToDll);
|
||||
if (displayInfo)
|
||||
fprintf(g_output, " - %s\n", signature);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
size_t bytesread = fread((void*)dlldata,1,dlldatalen,dll);
|
||||
if (bytesread == (size_t)dlldatalen)
|
||||
loaded = true;
|
||||
}
|
||||
fclose(dll);
|
||||
|
||||
if (!loaded)
|
||||
{
|
||||
delete[] dlldata;
|
||||
return;
|
||||
}
|
||||
|
||||
PIMAGE_NT_HEADERS NTHeaders = PIMAGE_NT_HEADERS(dlldata + PIMAGE_DOS_HEADER(dlldata)->e_lfanew);
|
||||
if (NTHeaders->Signature == IMAGE_NT_SIGNATURE)
|
||||
{
|
||||
if (NTHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL)
|
||||
{
|
||||
if (NTHeaders->OptionalHeader.NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_EXPORT) return;
|
||||
|
||||
DWORD ExportDirVA = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
|
||||
DWORD ExportDirSize = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
|
||||
PIMAGE_SECTION_HEADER sections = IMAGE_FIRST_SECTION(NTHeaders);
|
||||
|
||||
for (int i = 0; i < NTHeaders->FileHeader.NumberOfSections; i++)
|
||||
{
|
||||
if (sections[i].VirtualAddress <= ExportDirVA
|
||||
&& sections[i].VirtualAddress+sections[i].Misc.VirtualSize >= ExportDirVA+ExportDirSize)
|
||||
{
|
||||
PIMAGE_EXPORT_DIRECTORY exports = PIMAGE_EXPORT_DIRECTORY(dlldata + sections[i].PointerToRawData + ExportDirVA - sections[i].VirtualAddress);
|
||||
unsigned long *names = (unsigned long*)((unsigned long)exports + (char *)exports->AddressOfNames - ExportDirVA);
|
||||
for (unsigned long j = 0; j < exports->NumberOfNames; j++)
|
||||
{
|
||||
const string name = string((char*)exports + names[j] - ExportDirVA);
|
||||
const string signature = dllName + "::" + name;
|
||||
m_command_to_path[signature] = pathToDll;
|
||||
m_command_lowercase_to_command[lowercase(signature)] = signature;
|
||||
if (displayInfo)
|
||||
fprintf(g_output, " - %s\n", signature.c_str());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete[] dlldata;
|
||||
}
|
||||
|
||||
bool Plugins::IsPluginCommand(const string& token) const {
|
||||
return m_command_to_path.find(NormalizedCommand(token)) != m_command_to_path.end();
|
||||
}
|
||||
|
||||
namespace {
|
||||
template <class Key, class Value>
|
||||
Value get_value(const map<Key, Value>& the_map,
|
||||
const Key& key)
|
||||
{
|
||||
assert(the_map.find(key) != the_map.end());
|
||||
return the_map.find(key)->second;
|
||||
}
|
||||
|
||||
template <class Key, class Value>
|
||||
Value get_value(const map<Key, Value>& the_map,
|
||||
const Key& key,
|
||||
const Value& defaultValue)
|
||||
{
|
||||
if (the_map.find(key) == the_map.end())
|
||||
return defaultValue;
|
||||
return the_map.find(key)->second;
|
||||
}
|
||||
}
|
||||
|
||||
string Plugins::NormalizedCommand(const string& command) const {
|
||||
return get_value(m_command_lowercase_to_command, lowercase(command));
|
||||
}
|
||||
|
||||
int Plugins::GetPluginHandle(bool uninst, const string& command) const {
|
||||
if (uninst) {
|
||||
return get_value(m_command_to_uninstall_data_handle, command, -1);
|
||||
}
|
||||
else {
|
||||
return get_value(m_command_to_data_handle, command, -1);
|
||||
}
|
||||
}
|
||||
|
||||
bool Plugins::IsPluginCommand(char* token)
|
||||
{
|
||||
return m_list.get(&token) ? true : false;
|
||||
string Plugins::GetPluginPath(const string& command) const {
|
||||
return get_value(m_command_to_path, command);
|
||||
}
|
||||
|
||||
char* Plugins::GetPluginDll(int uninst, char** command, int* dataHandle)
|
||||
{
|
||||
*dataHandle = -1;
|
||||
|
||||
if (uninst)
|
||||
return m_list.get(command, 0, dataHandle);
|
||||
else
|
||||
return m_list.get(command, dataHandle, 0);
|
||||
}
|
||||
|
||||
void Plugins::SetDllDataHandle(int uninst, char* command, int dataHandle)
|
||||
void Plugins::SetDllDataHandle(bool uninst, const string& command, int dataHandle)
|
||||
{
|
||||
if (uninst)
|
||||
m_list.setDataHandle(command, -1, dataHandle);
|
||||
else
|
||||
m_list.setDataHandle(command, dataHandle, -1);
|
||||
if (uninst) {
|
||||
m_command_to_uninstall_data_handle[command] = dataHandle;
|
||||
}
|
||||
else {
|
||||
m_command_to_data_handle[command] = dataHandle;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,36 +1,27 @@
|
|||
#ifndef __X18_PLUGINS_H
|
||||
#define __X18_PLUGINS_H
|
||||
|
||||
#include "Platform.h"
|
||||
#include "strlist.h"
|
||||
|
||||
struct plugin {
|
||||
int name;
|
||||
int path;
|
||||
int dataHandle;
|
||||
int unDataHandle;
|
||||
};
|
||||
|
||||
class PluginsList : public SortedStringListND<struct plugin>
|
||||
{
|
||||
public:
|
||||
int add(const char *name, const char *path);
|
||||
char *get(char **name, int *dataHandle=0, int *uninstDataHandle=0);
|
||||
void setDataHandle(const char *name, int dataHandle, int uninstDataHandle);
|
||||
};
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
class Plugins
|
||||
{
|
||||
public:
|
||||
void FindCommands(char*,bool);
|
||||
bool IsPluginCommand(char*);
|
||||
char* GetPluginDll(int, char**, int*);
|
||||
void SetDllDataHandle(int, char*, int);
|
||||
void FindCommands(const std::string& path, bool displayInfo);
|
||||
bool IsPluginCommand(const std::string& command) const;
|
||||
std::string NormalizedCommand(const std::string& command) const;
|
||||
int GetPluginHandle(bool uninst, const std::string& command) const;
|
||||
std::string GetPluginPath(const std::string& command) const;
|
||||
void SetDllDataHandle(bool uninst, const std::string& command, int dataHandle);
|
||||
|
||||
protected:
|
||||
PluginsList m_list;
|
||||
private: // methods
|
||||
void GetExports(const std::string &pathToDll, bool displayInfo);
|
||||
|
||||
void GetExports(char*,bool);
|
||||
private: // data members
|
||||
std::map<std::string, std::string> m_command_lowercase_to_command;
|
||||
std::map<std::string, std::string> m_command_to_path;
|
||||
std::map<std::string, int> m_command_to_data_handle;
|
||||
std::map<std::string, int> m_command_to_uninstall_data_handle;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "util.h"
|
||||
#include <time.h>
|
||||
#include <queue>
|
||||
using namespace std;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Utilities
|
||||
|
|
|
@ -23,12 +23,15 @@
|
|||
#if !defined(AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_)
|
||||
#define AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_
|
||||
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER > 1000
|
||||
|
||||
#include "Platform.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "Platform.h"
|
||||
#ifdef _WIN32
|
||||
# include <WinNT.h>
|
||||
#else
|
||||
|
@ -82,7 +85,6 @@ typedef struct _MY_IMAGE_RESOURCE_DIRECTORY_ENTRY {
|
|||
#pragma pack()
|
||||
|
||||
#include <stdexcept>
|
||||
using namespace std;
|
||||
|
||||
class CResourceDirectory;
|
||||
class CResourceDirectoryEntry;
|
||||
|
@ -150,7 +152,7 @@ public:
|
|||
|
||||
private:
|
||||
IMAGE_RESOURCE_DIRECTORY m_rdDir;
|
||||
vector<CResourceDirectoryEntry*> m_vEntries;
|
||||
std::vector<CResourceDirectoryEntry*> m_vEntries;
|
||||
};
|
||||
|
||||
class CResourceDirectoryEntry {
|
||||
|
|
|
@ -8,8 +8,6 @@
|
|||
|
||||
#include <stdexcept>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "exehead/resource.h"
|
||||
#include "ResourceEditor.h"
|
||||
#include "DialogTemplate.h"
|
||||
|
@ -31,6 +29,8 @@ using namespace std;
|
|||
return rc; \
|
||||
} while (false)
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace { // begin anonymous namespace
|
||||
|
||||
bool isSimpleChar(char ch)
|
||||
|
@ -3154,7 +3154,7 @@ void CEXEBuild::build_plugin_table(void)
|
|||
{
|
||||
sprintf(searchPath,"%s" PLATFORM_PATH_SEPARATOR_STR "Plugins",nsisdir);
|
||||
INFO_MSG("Processing plugin dlls: \"%s" PLATFORM_PATH_SEPARATOR_STR "*.dll\"\n",searchPath);
|
||||
m_plugins.FindCommands(searchPath,display_info?true:false);
|
||||
m_plugins.FindCommands(searchPath, display_info);
|
||||
INFO_MSG("\n");
|
||||
delete[] searchPath;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#include <algorithm> // for std::min
|
||||
#include "clzma.h"
|
||||
|
||||
#ifndef _WIN32
|
||||
|
@ -342,7 +343,7 @@ HRESULT CLZMA::ReadPart(void *data, UINT32 size, UINT32 *processedSize)
|
|||
if (compressor_finished)
|
||||
return E_ABORT;
|
||||
}
|
||||
UINT32 l = min(size, avail_in);
|
||||
UINT32 l = std::min(size, avail_in);
|
||||
memcpy(data, next_in, l);
|
||||
avail_in -= l;
|
||||
size -= l;
|
||||
|
@ -371,7 +372,7 @@ HRESULT CLZMA::WritePart(const void *data, UINT32 size, UINT32 *processedSize)
|
|||
if (!avail_out)
|
||||
return E_ABORT;
|
||||
}
|
||||
UINT32 l = min(size, avail_out);
|
||||
UINT32 l = std::min(size, avail_out);
|
||||
memcpy(next_out, data, l);
|
||||
avail_out -= l;
|
||||
size -= l;
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
#include "growbuf.h"
|
||||
|
||||
#include "Platform.h"
|
||||
#include <cstdlib> // for malloc/free
|
||||
#include <cstring> // for memcpy
|
||||
#include <cstdio> // for f*
|
||||
#include <algorithm> // for std::min
|
||||
|
||||
#include "Platform.h"
|
||||
|
||||
GrowBuf::GrowBuf() { m_alloc=m_used=m_zero=0; m_s=NULL; m_bs=32768; }
|
||||
GrowBuf::~GrowBuf() { free(m_s); }
|
||||
|
@ -49,7 +51,7 @@ void GrowBuf::resize(int newlen)
|
|||
}
|
||||
quit();
|
||||
}
|
||||
memcpy(n,m_s,min(newlen,os));
|
||||
memcpy(n,m_s,std::min(newlen,os));
|
||||
free(m_s);
|
||||
}
|
||||
m_s=n;
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#include "DialogTemplate.h"
|
||||
#include "exehead/resource.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
// Default English strings. Should match NSIS_DEFAULT_LANG
|
||||
// Do not change the first string in every item, it's the LangString
|
||||
// name for usage in scripts.
|
||||
|
|
|
@ -2495,7 +2495,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
|||
}
|
||||
|
||||
string compressor_name = line.gettoken_str(a);
|
||||
transform(compressor_name.begin(), compressor_name.end(), compressor_name.begin(), tolower);
|
||||
compressor_name = lowercase(compressor_name);
|
||||
|
||||
if (set_compressor(compressor_name, build_compress_whole) != PS_OK)
|
||||
{
|
||||
|
@ -5413,10 +5413,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
|||
{
|
||||
SCRIPT_MSG("PluginDir: \"%s\"\n",line.gettoken_str(1));
|
||||
#ifdef _WIN32
|
||||
m_plugins.FindCommands(line.gettoken_str(1),display_info?true:false);
|
||||
m_plugins.FindCommands(line.gettoken_str(1), display_info);
|
||||
#else
|
||||
char *converted_path = my_convert(line.gettoken_str(1));
|
||||
m_plugins.FindCommands(converted_path,display_info?true:false);
|
||||
m_plugins.FindCommands(converted_path, display_info);
|
||||
my_convert_free(converted_path);
|
||||
#endif
|
||||
return PS_OK;
|
||||
|
@ -5425,136 +5425,125 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
|
|||
return PS_ERROR;
|
||||
case TOK__PLUGINCOMMAND:
|
||||
{
|
||||
int ret, data_handle;
|
||||
char* command = strdup(line.gettoken_str(0));
|
||||
assert(command != 0);
|
||||
MANAGE_WITH(command, free);
|
||||
int ret;
|
||||
|
||||
char* dllPath = m_plugins.GetPluginDll(uninstall_mode, &command, &data_handle);
|
||||
if (dllPath)
|
||||
const string command = m_plugins.NormalizedCommand(line.gettoken_str(0));
|
||||
const string dllPath = m_plugins.GetPluginPath(command);
|
||||
int data_handle = m_plugins.GetPluginHandle(uninstall_mode, command);
|
||||
|
||||
if (uninstall_mode) uninst_plugin_used = true;
|
||||
else plugin_used = true;
|
||||
|
||||
// Initialize $PLUGINSDIR
|
||||
ent.which=EW_CALL;
|
||||
ent.offsets[0]=ns_func.add(uninstall_mode?"un.Initialize_____Plugins":"Initialize_____Plugins",0);
|
||||
ret=add_entry(&ent);
|
||||
if (ret != PS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// DLL name on the user machine
|
||||
char tempDLL[NSIS_MAX_STRLEN];
|
||||
string dllName = get_file_name(dllPath);
|
||||
wsprintf(tempDLL, "$PLUGINSDIR%c%s", PATH_SEPARATOR_C, dllName.c_str());
|
||||
|
||||
// Add the DLL to the installer
|
||||
if (data_handle == -1)
|
||||
{
|
||||
if (uninstall_mode) uninst_plugin_used = true;
|
||||
else plugin_used = true;
|
||||
|
||||
// Initialize $PLUGINSDIR
|
||||
ent.which=EW_CALL;
|
||||
ent.offsets[0]=ns_func.add(uninstall_mode?"un.Initialize_____Plugins":"Initialize_____Plugins",0);
|
||||
ret=add_entry(&ent);
|
||||
int files_added;
|
||||
int old_build_allowskipfiles=build_allowskipfiles;
|
||||
build_allowskipfiles=1; // on
|
||||
int old_build_overwrite=build_overwrite;
|
||||
build_overwrite=1; // off
|
||||
int old_build_datesave=build_datesave;
|
||||
build_datesave=0; // off
|
||||
ret=do_add_file(dllPath.c_str(),0,0,&files_added,tempDLL,2,&data_handle); // 2 means no size add
|
||||
if (ret != PS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// DLL name on the user machine
|
||||
char tempDLL[NSIS_MAX_STRLEN];
|
||||
char *dllName = strrchr(dllPath,PLATFORM_PATH_SEPARATOR_C);
|
||||
if (dllName && *dllName == PLATFORM_PATH_SEPARATOR_C)
|
||||
dllName++;
|
||||
wsprintf(tempDLL, "$PLUGINSDIR%c%s", PATH_SEPARATOR_C, dllName);
|
||||
|
||||
// Add the DLL to the installer
|
||||
if (data_handle == -1)
|
||||
{
|
||||
int files_added;
|
||||
// BEGIN - Added by ramon 23 May 2003
|
||||
int old_build_allowskipfiles=build_allowskipfiles;
|
||||
build_allowskipfiles=1; // on
|
||||
// END - Added by ramon 23 May 2003
|
||||
int old_build_overwrite=build_overwrite;
|
||||
build_overwrite=1; // off
|
||||
int old_build_datesave=build_datesave;
|
||||
build_datesave=0; // off
|
||||
ret=do_add_file(dllPath,0,0,&files_added,tempDLL,2,&data_handle); // 2 means no size add
|
||||
if (ret != PS_OK) {
|
||||
return ret;
|
||||
}
|
||||
m_plugins.SetDllDataHandle(uninstall_mode, line.gettoken_str(0),data_handle);
|
||||
build_overwrite=old_build_overwrite;
|
||||
build_datesave=old_build_datesave;
|
||||
// Added by ramon 23 May 2003
|
||||
build_allowskipfiles=old_build_allowskipfiles;
|
||||
}
|
||||
else
|
||||
{
|
||||
ent.which=EW_EXTRACTFILE;
|
||||
|
||||
DefineInnerLangString(NLF_SKIPPED);
|
||||
DefineInnerLangString(NLF_ERR_DECOMPRESSING);
|
||||
DefineInnerLangString(NLF_ERR_WRITING);
|
||||
DefineInnerLangString(NLF_EXTRACT);
|
||||
DefineInnerLangString(NLF_CANT_WRITE);
|
||||
|
||||
ent.offsets[0]=1; // overwrite off
|
||||
ent.offsets[0]|=(MB_RETRYCANCEL|MB_ICONSTOP|(IDCANCEL<<21))<<3;
|
||||
ent.offsets[1]=add_string(tempDLL);
|
||||
ent.offsets[2]=data_handle;
|
||||
ent.offsets[3]=0xffffffff;
|
||||
ent.offsets[4]=0xffffffff;
|
||||
ent.offsets[5]=DefineInnerLangString(NLF_FILE_ERROR);
|
||||
ret=add_entry(&ent);
|
||||
if (ret != PS_OK) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
// SetDetailsPrint lastused
|
||||
ent.which=EW_UPDATETEXT;
|
||||
ent.offsets[0]=0;
|
||||
ent.offsets[1]=8; // lastused
|
||||
ent.offsets[2]=0;
|
||||
ret=add_entry(&ent);
|
||||
if (ret != PS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Call the DLL
|
||||
char* funcname = strstr(command,"::");
|
||||
if (funcname) funcname += 2;
|
||||
else funcname = command;
|
||||
SCRIPT_MSG("Plugin Command: %s",funcname);
|
||||
|
||||
int i = 1;
|
||||
int nounload = 0;
|
||||
if (!strcmpi(line.gettoken_str(i), "/NOUNLOAD")) {
|
||||
i++;
|
||||
nounload++;
|
||||
}
|
||||
|
||||
// First push dll args
|
||||
|
||||
int parmst=i; // we push em in reverse order
|
||||
int nounloadmisused=0;
|
||||
for (; i < line.getnumtokens(); i++) {
|
||||
int w=parmst + (line.getnumtokens()-i - 1);
|
||||
ent.which=EW_PUSHPOP;
|
||||
ent.offsets[0]=add_string(line.gettoken_str(w));
|
||||
if (!strcmpi(line.gettoken_str(w), "/NOUNLOAD")) nounloadmisused=1;
|
||||
ent.offsets[1]=0;
|
||||
ret=add_entry(&ent);
|
||||
if (ret != PS_OK) {
|
||||
return ret;
|
||||
}
|
||||
SCRIPT_MSG(" %s",line.gettoken_str(i));
|
||||
}
|
||||
SCRIPT_MSG("\n");
|
||||
if (nounloadmisused)
|
||||
warning_fl("/NOUNLOAD must come first before any plugin parameter. Unless the plugin you are trying to use has a parameter /NOUNLOAD, you are doing something wrong");
|
||||
|
||||
// next, call it
|
||||
ent.which=EW_REGISTERDLL;
|
||||
ent.offsets[0]=add_string(tempDLL);;
|
||||
ent.offsets[1]=add_string(funcname);
|
||||
ent.offsets[2]=0;
|
||||
ent.offsets[3]=nounload|build_plugin_unload;
|
||||
ent.offsets[4]=1;
|
||||
ret=add_entry(&ent);
|
||||
if (ret != PS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
return PS_OK;
|
||||
m_plugins.SetDllDataHandle(uninstall_mode, line.gettoken_str(0), data_handle);
|
||||
build_overwrite=old_build_overwrite;
|
||||
build_datesave=old_build_datesave;
|
||||
// Added by ramon 23 May 2003
|
||||
build_allowskipfiles=old_build_allowskipfiles;
|
||||
}
|
||||
else
|
||||
ERROR_MSG("Error: Plugin dll for command \"%s\" not found.\n",line.gettoken_str(0));
|
||||
{
|
||||
ent.which=EW_EXTRACTFILE;
|
||||
|
||||
DefineInnerLangString(NLF_SKIPPED);
|
||||
DefineInnerLangString(NLF_ERR_DECOMPRESSING);
|
||||
DefineInnerLangString(NLF_ERR_WRITING);
|
||||
DefineInnerLangString(NLF_EXTRACT);
|
||||
DefineInnerLangString(NLF_CANT_WRITE);
|
||||
|
||||
ent.offsets[0]=1; // overwrite off
|
||||
ent.offsets[0]|=(MB_RETRYCANCEL|MB_ICONSTOP|(IDCANCEL<<21))<<3;
|
||||
ent.offsets[1]=add_string(tempDLL);
|
||||
ent.offsets[2]=data_handle;
|
||||
ent.offsets[3]=0xffffffff;
|
||||
ent.offsets[4]=0xffffffff;
|
||||
ent.offsets[5]=DefineInnerLangString(NLF_FILE_ERROR);
|
||||
ret=add_entry(&ent);
|
||||
if (ret != PS_OK) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
// SetDetailsPrint lastused
|
||||
ent.which=EW_UPDATETEXT;
|
||||
ent.offsets[0]=0;
|
||||
ent.offsets[1]=8; // lastused
|
||||
ent.offsets[2]=0;
|
||||
ret=add_entry(&ent);
|
||||
if (ret != PS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Call the DLL
|
||||
string funcname = get_string_suffix(command, "::");
|
||||
SCRIPT_MSG("Plugin Command: %s",funcname.c_str());
|
||||
|
||||
int i = 1;
|
||||
int nounload = 0;
|
||||
if (!strcmpi(line.gettoken_str(i), "/NOUNLOAD")) {
|
||||
i++;
|
||||
nounload++;
|
||||
}
|
||||
|
||||
// First push dll args
|
||||
|
||||
int parmst=i; // we push em in reverse order
|
||||
int nounloadmisused=0;
|
||||
for (; i < line.getnumtokens(); i++) {
|
||||
int w=parmst + (line.getnumtokens()-i - 1);
|
||||
ent.which=EW_PUSHPOP;
|
||||
ent.offsets[0]=add_string(line.gettoken_str(w));
|
||||
if (!strcmpi(line.gettoken_str(w), "/NOUNLOAD")) nounloadmisused=1;
|
||||
ent.offsets[1]=0;
|
||||
ret=add_entry(&ent);
|
||||
if (ret != PS_OK) {
|
||||
return ret;
|
||||
}
|
||||
SCRIPT_MSG(" %s",line.gettoken_str(i));
|
||||
}
|
||||
SCRIPT_MSG("\n");
|
||||
if (nounloadmisused)
|
||||
warning_fl("/NOUNLOAD must come first before any plugin parameter. Unless the plugin you are trying to use has a parameter /NOUNLOAD, you are doing something wrong");
|
||||
|
||||
// next, call it
|
||||
ent.which=EW_REGISTERDLL;
|
||||
ent.offsets[0]=add_string(tempDLL);;
|
||||
ent.offsets[1]=add_string(funcname.c_str());
|
||||
ent.offsets[2]=0;
|
||||
ent.offsets[3]=nounload|build_plugin_unload;
|
||||
ent.offsets[4]=1;
|
||||
ret=add_entry(&ent);
|
||||
if (ret != PS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
return PS_OK;
|
||||
}
|
||||
return PS_ERROR;
|
||||
case TOK_INITPLUGINSDIR:
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
#include <cassert> // for assert
|
||||
|
||||
using std::string;
|
||||
using namespace std;
|
||||
|
||||
int g_dopause=0;
|
||||
extern int g_display_errors;
|
||||
|
@ -611,18 +611,26 @@ string get_full_path(const string &path) {
|
|||
#endif//_WIN32
|
||||
}
|
||||
|
||||
string get_dir_name(const string& path) {
|
||||
string::size_type last_separator_pos = path.rfind(PLATFORM_PATH_SEPARATOR_C);
|
||||
string get_string_prefix(const string& str, const string& separator) {
|
||||
const string::size_type last_separator_pos = str.rfind(separator);
|
||||
if (last_separator_pos == string::npos)
|
||||
return path;
|
||||
return path.substr(0, last_separator_pos);
|
||||
return str;
|
||||
return str.substr(0, last_separator_pos);
|
||||
}
|
||||
|
||||
string get_string_suffix(const string& str, const string& separator) {
|
||||
const string::size_type last_separator_pos = str.rfind(separator);
|
||||
if (last_separator_pos == string::npos)
|
||||
return str;
|
||||
return str.substr(last_separator_pos + separator.size(), string::npos);
|
||||
}
|
||||
|
||||
string get_dir_name(const string& path) {
|
||||
return get_string_prefix(path, PLATFORM_PATH_SEPARATOR_STR);
|
||||
}
|
||||
|
||||
string get_file_name(const string& path) {
|
||||
string::size_type last_separator_pos = path.rfind(PLATFORM_PATH_SEPARATOR_C);
|
||||
if (last_separator_pos == string::npos)
|
||||
return path;
|
||||
return path.substr(last_separator_pos + 1, string::npos);
|
||||
return get_string_suffix(path, PLATFORM_PATH_SEPARATOR_STR);
|
||||
}
|
||||
|
||||
string get_executable_path(const char* argv0) {
|
||||
|
@ -640,3 +648,13 @@ string get_executable_path(const char* argv0) {
|
|||
string get_executable_dir(const char *argv0) {
|
||||
return get_dir_name(get_executable_path(argv0));
|
||||
}
|
||||
|
||||
string remove_file_extension(const string& path) {
|
||||
return get_string_prefix(path, ".");
|
||||
}
|
||||
|
||||
string lowercase(const string &str) {
|
||||
string result = str;
|
||||
transform(str.begin(), str.end(), result.begin(), tolower);
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -1,16 +1,17 @@
|
|||
#ifndef _UTIL_H_
|
||||
#define _UTIL_H_
|
||||
|
||||
#include <string> // for std::string
|
||||
|
||||
#include "boost/scoped_ptr.hpp" // for boost::scoped_ptr
|
||||
#include "ResourceEditor.h"
|
||||
|
||||
#ifndef _WIN32
|
||||
# include <iconv.h>
|
||||
# include <stdio.h>
|
||||
# include <glob.h>
|
||||
#endif
|
||||
#include "ResourceEditor.h"
|
||||
|
||||
#include <string> // for std::string
|
||||
|
||||
#include "boost/scoped_ptr.hpp" // for boost::scoped_ptr
|
||||
|
||||
// these are the standard pause-before-quit shit.
|
||||
extern int g_dopause;
|
||||
|
@ -49,10 +50,15 @@ size_t my_strftime(char *s, size_t max, const char *fmt, const struct tm *tm);
|
|||
(((x)&0x0000FF00) << 8) | \
|
||||
(((x)&0x000000FF) << 24) )
|
||||
|
||||
std::string get_full_path(const std::string &path);
|
||||
std::string get_full_path(const std::string& path);
|
||||
std::string get_dir_name(const std::string& path);
|
||||
std::string get_file_name(const std::string& path);
|
||||
std::string get_executable_dir(const char *argv0);
|
||||
std::string remove_file_extension(const std::string& path);
|
||||
std::string lowercase(const std::string&);
|
||||
|
||||
std::string get_string_prefix(const std::string& str, const std::string& separator);
|
||||
std::string get_string_suffix(const std::string& str, const std::string& separator);
|
||||
|
||||
#ifndef _WIN32
|
||||
char *CharPrev(const char *s, const char *p);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue