This is a summary of the changes I made to the core APR 1.2.11 library. The
patch will follow separately. The changes target CE 5 and may have broken
earlier versions. I do not have earlier versions on which to test/build
against, but it's possible to modify these changes to revert them using the
version of the _WIN32_WCE macro if problems are suspected.
I glanced over some of the changes to trunk and noticed a few of these
changes have been implemented, in slightly different ways.
A few of the changes don't work as expected. See the e-mail containing the
test results for details.
I have a VS2005 project, but can't post it here (it gets rejected).
* Build as Unicode project.
* Conditionally exclude headers that don't exist on CE. Use APR's macros
where possible to make the decision.
* Fix parameters passed to apr_conv_utf8_to_ucs2() in dso.c.
* Use CE's GetTempPathW() API to get the temporary path location.
* Check apr_dir_read() for ERROR_NO_MORE_FILES when it's normally expected
to succeed.
* CE doesn't have drive letters, don't check for or use them.
* Removed use of unimplemented Windows API functions on CE. File stats
suffered due to lack of this information.
* apr_file_info_get() non-working flags: APR_CHR, APR_PIPE,
APR_FINFO_IDENT, APR_FINFO_NLINK, APR_FINFO_USER, APR_FINFO_GROUP.
* apr_stat() non-working flags: APR_CHR, APR_FINFO_TYPE, APR_FINFO_USER,
APR_FINFO_GROUP.
* Used CeGetCanonicalPathNameW() to get root path, "drive", and to
canonicalize paths.
* Implemented file locking (removed blocks) for CE 5 and up. Although, it
isn't working properly for some reason; API usage is correct and works
in separate tests.
* Replaced use of GetStdHandle/SetStdHandle() with STD*_FILENO macros
because the CE API doesn't have the functions.
* Following flags are unsupported on CE for file creation/opening:
FILE_WRITE_ATTRIBUTES, FILE_FLAG_DELETE_ON_CLOSE,
FILE_FLAG_OPEN_REPARSE_POINT, READ_CONTROL, FILE_FLAG_OVERLAPPED.
* Used code for 95/98 (MoveFile instead of MoveFileEx) to implement
apr_file_rename().
* Implemented apr_file_open_std(err|out|in)() using STD*_FILENO instead of
GetStdHandle().
* Removed unsupported pipe-specific API usage.
* Removed use of overlapped file i/o, not supported on CE. APR_XTHREAD is
implied on CE because it "supports" cross-thread file use natively.
* Added workaround when using WriteFile() to "append" zero amount of data.
It normally fails, but since it doesn't do anything, the workaround
succeeds it.
* Called FlushFileBuffers() to really flush the file buffers in
apr_file_flush().
* Since CE doesn't support overlapped file i/o, don't bother keeping track
of the file pointer, let the OS handle it.
* Removed _WIN32_WINNT downgrade because it prevented needed APIs from
being defined.
* Removed exclusion of winsock2/mswsock/ws2tcpip.h, since CE 5 has them.
* Added support for IPV6, I'm developing on a platform that supports IPV6.
* Defined APR_HAVE_STR(N)ICMP to 1 because CE 5 has the necessary
functions.
* Changed APR_PATH_MAX to use MAX_PATH on CE; it's smaller than the
default.
* Updated APR_STATUS_IS_EDSOOPEN macro to check for
ERROR_INVALID_PARAMETER.
* Updated APR_STATUS_IS_ESYMNOTFOUND macro to check for
ERROR_INVALID_HANDLE.
* Defined "strcasecmp" to "_stricmp" and "strncasecmp" to "_strnicmp".
* Added APR_WIN_CE_(4|5|6) macros and version checking for newer CE
versions.
* Removed late binding API because it isn't needed on CE.
* Added WSA overlapped member to apr_socket_t for use with WSA sockets.
* WSABUF is already defined in CE 5, as it should be; left the explicit
definition alone for earlier versions.
* Added missing errno values needed/used internally: ENOSPC, EINVAL,
ERANGE, BUFSIZ.
* Replaced use of _malloc_dbg/_realloc_dbg() with normal malloc/realloc().
* Modified apr_dbg_log() to use Unicode APIs.
* Replaced UuidCreate() with CoCreateGuid() which exists on CE.
* Need to use CreateFileForMappingW() to open a file before mapping it.
Closing the mapped view automatically closes the extra handle.
* setsockopt() doesn't use errno (it doesn't exist), instead,
apr_get_netos_error() must be used.
* Removed fake getservbyname() in favor of real one in Winsock 2.
* Replaced use of standard sockets with overlapped WSA sockets to be able
to handle blocking sockets with a timeout. Standard sockets don't support
timeouts on CE.
* Shared memory must also use CreateFileForMappingW() for MMap files and
INVALID_HANDLE_VALUE for anonymous MMap files.
* Underlying implementation in apr_strtoff() doesn't use errno, need to
detect errors manually.
* Don't prepend program path/name as first argument when passing arguments
to newly created processes. CE 5 already takes care of it.
* CREATE_UNICODE_ENVIRONMENT is not supported on CE.
* Need to specify STACK_SIZE_PARAM_IS_A_RESERVATION to CreateThread() to
use the given stack size instead of the default.
* Replaced combination GetSystemTime() and SystemTimeToFileTime() with
simpler GetCurrentFT() to get the current time.