Moved API_LOADER class to where it was used, i.e. the cURL library.
git-svn-id: https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/library/cURL@75972 8089f293-4706-0410-a29e-feb5c42a2edf
This commit is contained in:
115
api_loader.e
Normal file
115
api_loader.e
Normal file
@@ -0,0 +1,115 @@
|
||||
indexing
|
||||
description: "[
|
||||
Dynamic load a external API which exists in a dll or so.
|
||||
Benefit is we can still use our executables even without the dll/so files.
|
||||
]"
|
||||
status: "See notice at end of class."
|
||||
legal: "See notice at end of class."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
API_LOADER
|
||||
|
||||
feature -- Query
|
||||
|
||||
safe_load_api (a_module_name: STRING; a_api_name: STRING): POINTER is
|
||||
-- Safe loading `a_api_name' in `a_module_name' if possible.
|
||||
-- `a_module_name' is case sensitive.
|
||||
require
|
||||
not_void: a_module_name /= Void and then not a_module_name.is_empty
|
||||
not_void: a_api_name /= Void and then not a_api_name.is_empty
|
||||
local
|
||||
l_module: POINTER
|
||||
do
|
||||
l_module := module_pointer (a_module_name)
|
||||
if l_module /= default_pointer then
|
||||
Result := api_pointer (l_module, a_api_name)
|
||||
end
|
||||
end
|
||||
|
||||
module_pointer (a_name: STRING): POINTER is
|
||||
-- Find module hanle with `a_name'
|
||||
-- Result is void if not exists
|
||||
require
|
||||
not_void: a_name /= Void
|
||||
do
|
||||
if loaded_modules.has_key (a_name) then
|
||||
Result := loaded_modules.item (a_name)
|
||||
else
|
||||
Result := implementation.load_module (a_name)
|
||||
if Result /= default_pointer then
|
||||
loaded_modules.extend (Result, a_name)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
api_pointer (a_module: POINTER; a_name: STRING): POINTER is
|
||||
-- Find API pointer which name is `a_name' in `a_module'
|
||||
-- Result is void if not exists.
|
||||
require
|
||||
exists: a_module /= default_pointer
|
||||
not_void: a_name /= Void
|
||||
do
|
||||
if loaded_apis.has (a_name) then
|
||||
Result := loaded_apis.item (a_name)
|
||||
else
|
||||
Result := implementation.loal_api (a_module, a_name)
|
||||
if Result /= default_pointer then
|
||||
loaded_apis.extend (Result, a_name)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
loaded_modules: HASH_TABLE [POINTER, STRING] is
|
||||
-- Loaded modules
|
||||
once
|
||||
create Result.make (1)
|
||||
end
|
||||
|
||||
loaded_apis: HASH_TABLE [POINTER, STRING] is
|
||||
-- Loaded apis.
|
||||
once
|
||||
create Result.make (10)
|
||||
end
|
||||
|
||||
implementation: API_LOADER_IMP is
|
||||
-- Native loader
|
||||
once
|
||||
create Result
|
||||
end
|
||||
indexing
|
||||
copyright: "Copyright (c) 1984-2007, Eiffel Software"
|
||||
license: "GPL version 2 (see http://www.eiffel.com/licensing/gpl.txt)"
|
||||
licensing_options: "http://www.eiffel.com/licensing"
|
||||
copying: "[
|
||||
This file is part of Eiffel Software's Eiffel Development Environment.
|
||||
|
||||
Eiffel Software's Eiffel Development Environment is free
|
||||
software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published
|
||||
by the Free Software Foundation, version 2 of the License
|
||||
(available at the URL listed under "license" above).
|
||||
|
||||
Eiffel Software's Eiffel Development Environment is
|
||||
distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with Eiffel Software's Eiffel Development
|
||||
Environment; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
]"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
356 Storke Road, Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
|
||||
end
|
||||
24
cURL.ecf
24
cURL.ecf
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-3-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-3-0 http://www.eiffel.com/developers/xml/configuration-1-3-0.xsd" name="curl" uuid="D51EF190-6157-4B47-8E73-FA93DCBB7A71" library_target="curl">
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-4-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-4-0 http://www.eiffel.com/developers/xml/configuration-1-4-0.xsd" name="curl" uuid="D51EF190-6157-4B47-8E73-FA93DCBB7A71" library_target="curl">
|
||||
<target name="curl">
|
||||
<description>cURL: libcURL wrapper library for Eiffel.
|
||||
Copyright (c) 1984-2006, Eiffel Software and others.
|
||||
@@ -56,7 +56,25 @@
|
||||
</condition>
|
||||
</external_object>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
|
||||
<library name="framework" location="$ISE_LIBRARY\framework\framework.ecf"/>
|
||||
<cluster name="curl" location=".\" recursive="true"/>
|
||||
<library name="wel" location="$ISE_LIBRARY\library\wel\wel.ecf"/>
|
||||
<library name="vision2" location="$ISE_LIBRARY\library\vision2\vision2.ecf"/>
|
||||
<cluster name="curl" location=".\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/spec$</exclude>
|
||||
<exclude>/Clib$</exclude>
|
||||
</file_rule>
|
||||
<file_rule>
|
||||
<exclude>/gtk$</exclude>
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
</condition>
|
||||
</file_rule>
|
||||
<file_rule>
|
||||
<exclude>/mswin$</exclude>
|
||||
<condition>
|
||||
<platform excluded_value="windows"/>
|
||||
</condition>
|
||||
</file_rule>
|
||||
</cluster>
|
||||
</target>
|
||||
</system>
|
||||
|
||||
79
implementation/gtk/api_loader_imp.e
Normal file
79
implementation/gtk/api_loader_imp.e
Normal file
@@ -0,0 +1,79 @@
|
||||
indexing
|
||||
description: "[
|
||||
Interactive with native system APIs for dynamic loading.
|
||||
GTK verson.
|
||||
]"
|
||||
status: "See notice at end of class."
|
||||
legal: "See notice at end of class."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
API_LOADER_IMP
|
||||
|
||||
feature -- Command
|
||||
|
||||
load_module (a_name: STRING): POINTER is
|
||||
-- Load module with `a_name'.
|
||||
-- `a_name' is LPCTSTR, we should use WEL_STRING here.
|
||||
require
|
||||
exists: a_name /= Void
|
||||
local
|
||||
l_c_string: EV_GTK_C_STRING
|
||||
do
|
||||
l_c_string := a_name
|
||||
Result := {EV_GTK_EXTERNALS}.g_module_open (l_c_string.item, 0)
|
||||
end
|
||||
|
||||
loal_api (a_module: POINTER; a_name: STRING): POINTER is
|
||||
-- Load api which name is `a_name' in `a_module'
|
||||
require
|
||||
exists: a_module /= default_pointer
|
||||
exists: a_name /= Void
|
||||
local
|
||||
l_c_string: EV_GTK_C_STRING
|
||||
l_success: BOOLEAN
|
||||
l_result: POINTER
|
||||
do
|
||||
if a_module /= default_pointer then
|
||||
l_c_string := a_name
|
||||
l_success := {EV_GTK_EXTERNALS}.g_module_symbol (a_module, l_c_string.item, $l_result)
|
||||
if l_success then
|
||||
Result := l_result
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
indexing
|
||||
copyright: "Copyright (c) 1984-2007, Eiffel Software"
|
||||
license: "GPL version 2 (see http://www.eiffel.com/licensing/gpl.txt)"
|
||||
licensing_options: "http://www.eiffel.com/licensing"
|
||||
copying: "[
|
||||
This file is part of Eiffel Software's Eiffel Development Environment.
|
||||
|
||||
Eiffel Software's Eiffel Development Environment is free
|
||||
software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published
|
||||
by the Free Software Foundation, version 2 of the License
|
||||
(available at the URL listed under "license" above).
|
||||
|
||||
Eiffel Software's Eiffel Development Environment is
|
||||
distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with Eiffel Software's Eiffel Development
|
||||
Environment; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
]"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
356 Storke Road, Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
|
||||
end
|
||||
96
implementation/mswin/api_loader_imp.e
Normal file
96
implementation/mswin/api_loader_imp.e
Normal file
@@ -0,0 +1,96 @@
|
||||
indexing
|
||||
description: "[
|
||||
Interactive with native system APIs for dynamic loading.
|
||||
Windows verson.
|
||||
]"
|
||||
status: "See notice at end of class."
|
||||
legal: "See notice at end of class."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
API_LOADER_IMP
|
||||
|
||||
feature -- Command
|
||||
|
||||
load_module (a_name: STRING): POINTER is
|
||||
-- Load module with `a_name'.
|
||||
-- `a_name' is LPCTSTR, we should use WEL_STRING here.
|
||||
require
|
||||
exists: a_name /= Void
|
||||
local
|
||||
l_wel_string: WEL_STRING
|
||||
do
|
||||
create l_wel_string.make (a_name)
|
||||
Result := c_load_module (l_wel_string.item)
|
||||
end
|
||||
|
||||
loal_api (a_module: POINTER; a_name: STRING): POINTER is
|
||||
-- Load api which name is `a_name' in `a_module'
|
||||
require
|
||||
exists: a_module /= default_pointer
|
||||
exists: a_name /= Void
|
||||
local
|
||||
l_c_string: C_STRING
|
||||
do
|
||||
create l_c_string.make (a_name)
|
||||
Result := c_loal_api (a_module, l_c_string.item)
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
c_load_module (a_name: POINTER): POINTER is
|
||||
-- Load module with `a_name'.
|
||||
-- `a_name' is LPCTSTR, we should use WEL_STRING here.
|
||||
require
|
||||
exists: a_name /= default_pointer
|
||||
external
|
||||
"C inline use <windows.h>"
|
||||
alias
|
||||
"return (EIF_POINTER) LoadLibrary ($a_name);"
|
||||
end
|
||||
|
||||
c_loal_api (a_module: POINTER; a_name: POINTER): POINTER is
|
||||
-- Load api which name is `a_name' in `a_module'
|
||||
require
|
||||
exists: a_module /= default_pointer
|
||||
exists: a_name /= default_pointer
|
||||
external
|
||||
"C inline use <windows.h>"
|
||||
alias
|
||||
"return GetProcAddress ((HMODULE) $a_module, $a_name);"
|
||||
end
|
||||
|
||||
indexing
|
||||
copyright: "Copyright (c) 1984-2007, Eiffel Software"
|
||||
license: "GPL version 2 (see http://www.eiffel.com/licensing/gpl.txt)"
|
||||
licensing_options: "http://www.eiffel.com/licensing"
|
||||
copying: "[
|
||||
This file is part of Eiffel Software's Eiffel Development Environment.
|
||||
|
||||
Eiffel Software's Eiffel Development Environment is free
|
||||
software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published
|
||||
by the Free Software Foundation, version 2 of the License
|
||||
(available at the URL listed under "license" above).
|
||||
|
||||
Eiffel Software's Eiffel Development Environment is
|
||||
distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with Eiffel Software's Eiffel Development
|
||||
Environment; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
]"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
356 Storke Road, Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user