initial import
git-svn-id: https://svn.pjsip.org/repos/pjproject/main@1 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
commit
0a749f11c7
|
@ -0,0 +1,132 @@
|
|||
Last Update: 2005/05/28 for pjproject-0.2.8
|
||||
|
||||
|
||||
COMMON PROBLEMS
|
||||
=================
|
||||
- make error
|
||||
process_begin: CreateProcess((null), cl /c /nologo /DWIN32 /D_WIN32 /DPJ_GUID_TY
|
||||
PE=PJ_GUID_COCREATEGUID /I../src ..\src\pj\ioqueue_winnt.c /Fooutput\pjlib_win32
|
||||
_vc\ioqueue_winnt.o, ...) failed.
|
||||
make (e=2): The system cannot find the file specified.
|
||||
make[1]: *** [output/pjlib_win32_vc/ioqueue_winnt.o] Error 2
|
||||
|
||||
solution:
|
||||
make doesn't like spaces in vc98 PATH
|
||||
|
||||
|
||||
BUILD INSTRUCTIONS
|
||||
================================================================================
|
||||
|
||||
The main target of the build process is to build executable pjsip/bin/pjsua.exe.
|
||||
|
||||
|
||||
1. Build instructions for Microsoft Visual Studio .NET 2003
|
||||
----------------------------------------------
|
||||
- Open solution file: build/pjproject.sln
|
||||
There will be some dialogs appear asking about Source Safe, just ignore it.
|
||||
- Build the solution. That should build every single projects in pjproject.
|
||||
|
||||
|
||||
2. Build instructions for Microsoft Visual Studio 6
|
||||
------------------------------------------------
|
||||
Note: MSVC6 workspace is normally updated less often than MSVC7.1 projects.
|
||||
Especially during intermediate release. Normally the status will be
|
||||
noted in the web page.
|
||||
|
||||
- Open workspace file: build/pjproject.dsw
|
||||
- Perform batch build. That should build every single projects in pjproject.
|
||||
|
||||
|
||||
3. Build instructions for Linux i386, Mingw
|
||||
----------------------------------------
|
||||
Note: mingw/Linux Makefiles are normally updated less often than MSVC7.1 projects.
|
||||
|
||||
Step-by-step instruction to build the whole thing:
|
||||
|
||||
$ tar xzvf pjproject-0.2.6.tar.gz
|
||||
$ cd pjproject-0.2.6
|
||||
|
||||
$ export TARGET=mingw <== for Mingw, or
|
||||
$ export TARGET=linux-i386 <== for Linux
|
||||
|
||||
$ make dep
|
||||
$ make all
|
||||
|
||||
That should build all libraries and test applications (including pjsua).
|
||||
|
||||
There are some other make targets:
|
||||
|
||||
$ make clean ==> clean files (except libraries, binaries, & dependency files).
|
||||
$ make realclean ==> clean everything
|
||||
$ make distclean ==> ditto.
|
||||
|
||||
Note:
|
||||
- pjsua for Mingw and Linux build doesn't have audio device at present.
|
||||
|
||||
|
||||
4. Additional flags (for debugging etc.)
|
||||
-------------------------------------
|
||||
The build system for mingw/Linux accepts can additional flags, for example
|
||||
for debugging.
|
||||
|
||||
Example:
|
||||
|
||||
$ (on pjproject root directory)
|
||||
$ make CFLAGS=-ggdb "LDFLAGS=-L/foo/lib -lfoo"
|
||||
|
||||
|
||||
|
||||
REDUCING SIZE
|
||||
================================================================================
|
||||
|
||||
There are some C macros that can be used to reduce the size. For Mingw and Linux build,
|
||||
these macros are activated if you specify MINSIZE=1 during make, e.g.:
|
||||
|
||||
$ .. (we're in pjproject directory) ..
|
||||
$ make MINSIZE=1 all
|
||||
|
||||
Then after building the projects, you can check the size of the libraries:
|
||||
|
||||
$ make size
|
||||
|
||||
If you use Microsoft Visual Studio, then you'll have to set the C macros manually:
|
||||
|
||||
pjlib/src/pj/config.h:
|
||||
- #define PJ_HAS_TCP 0 // ==> to exclude TCP
|
||||
- #define PJ_HAS_THREADS 0 // ==> to exclude threads
|
||||
- #define PJ_FUNCTIONS_ARE_INLINED 0 // ==> do not inline.
|
||||
pjlib/src/pj/log.h:
|
||||
- #define PJ_LOG_MAX_LEVEL 0 // ==> disable all tracing
|
||||
|
||||
|
||||
GENERATING DOCUMENTATION
|
||||
================================================================================
|
||||
|
||||
You need to have doxygen to generate documentation.
|
||||
|
||||
To generate doxygen documentation with GNU make,
|
||||
|
||||
$ (on pjproject root directory)
|
||||
$ make doc
|
||||
|
||||
If GNU make is not available, generate documentation on each project:
|
||||
|
||||
$ cd pjsip
|
||||
$ doxygen docs/doxygen.cfg
|
||||
|
||||
$ cd pjlib
|
||||
$ doxygen docs/doxygen.cfg
|
||||
|
||||
etc..
|
||||
|
||||
The HTML files will be put under docs/html directory.
|
||||
|
||||
|
||||
That's about it I guess, sorry couldn't write more. Feel free to drop me a note if
|
||||
you encounter any problems.
|
||||
|
||||
|
||||
Thanks,
|
||||
Benny Prijono
|
||||
<bennylp@bulukucing.org>
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
DIRS = pjlib pjsdp pjmedia pjsip
|
||||
|
||||
MAKE_FLAGS := TARGET=$(TARGET)
|
||||
|
||||
ifdef MINSIZE
|
||||
MAKE_FLAGS := $(MAKE_FLAGS) MINSIZE=1
|
||||
endif
|
||||
|
||||
all clean dep depend distclean doc print realclean:
|
||||
for dir in $(DIRS); do \
|
||||
if [ -d $$dir ]; then \
|
||||
if make $(MAKE_FLAGS) -C $$dir/build $@; then \
|
||||
true; \
|
||||
else \
|
||||
exit 1; \
|
||||
fi; \
|
||||
fi \
|
||||
done
|
||||
|
||||
LIBS = pjlib/lib/libpj.a pjsdp/lib/libpjsdp.a pjmedia/lib/libpjmedia.a \
|
||||
pjsip/lib/libpjsip_core.a pjsip/lib/libpjsip_ua.a
|
||||
BINS = pjsip/bin/pjsua$(EXE)
|
||||
|
||||
include pjlib/build/make-$(TARGET).inc
|
||||
|
||||
size:
|
||||
@echo 'TARGET=$(TARGET)'
|
||||
@echo -n 'Date: '
|
||||
@date
|
||||
@echo
|
||||
@for lib in $(LIBS); do \
|
||||
echo "$$lib:"; \
|
||||
ar tv $$lib | awk '{print $$3 "\t" $$8}' | sort -n; \
|
||||
echo -n 'Total: '; \
|
||||
ar tv $$lib | awk '{print " + " $$3}' | xargs expr 0; \
|
||||
echo; \
|
||||
done
|
||||
@echo
|
||||
@for bin in $(BINS); do \
|
||||
echo "size $$bin:"; \
|
||||
size $$bin; \
|
||||
done
|
||||
|
|
@ -0,0 +1,147 @@
|
|||
Version 0.2.9 - 2005/06/19
|
||||
Core:
|
||||
- Moved authentication stuff to core.
|
||||
SIMPLE:
|
||||
- Initial implementation of Event framework (SUBSCRIBE/NOTIFY)
|
||||
- Initial implementation of Presence
|
||||
- Tidying up here and there.
|
||||
|
||||
Version 0.2.8.5 - 2005/06/05
|
||||
====================================
|
||||
Core:
|
||||
- Tidying up sip_msg.h (no need to export clone/shallow_clone/print API
|
||||
for headers).
|
||||
- Endpoint now can respond with 501/Not Supported if incoming request is
|
||||
not handled by any modules.
|
||||
- Endpoint also supports Allow header now.
|
||||
- Changed transport names to capital letters (thanks ...)
|
||||
- Fixed bug with locking in select() ioqueue.
|
||||
- Add status phrase for >= 700 status codes.
|
||||
|
||||
pjsua:
|
||||
- Verify URL in arguments to prevent crash.
|
||||
- Can read commands from config file.
|
||||
- Now has buddy list and can send IM!
|
||||
|
||||
SIMPLE:
|
||||
- Instant Messaging support!
|
||||
|
||||
MEDIA:
|
||||
- CLOSING SEQUENCE IS NOT PROPER!!! SOMETIMES THREAD IS DEADLOCKED,
|
||||
OR DSOUND IS NOT CLOSED PROPERLY!!!
|
||||
|
||||
Version 0.2.8 - 2005/05/28
|
||||
====================================
|
||||
- Simple STUN client support
|
||||
SIP UDP port and media RTP/RTCP ports are now STUN aware.
|
||||
- Major changed in I/O queue, now callback is used.
|
||||
Callback is better because multiple libraries can register to single I/O queue.
|
||||
It was not possible with previous implementation, because the function which does
|
||||
polling needs to understand what to do when a key is signalled. The changes was
|
||||
initially needed to support STUN, but then the STUN client implementation uses the
|
||||
simpler select() (in stun_client.c).
|
||||
- Merge SDP library into PJMEDIA (no more PJSDP).
|
||||
PJSDP only has couple of files (sdp.[hc]), not worth maintaining a library.
|
||||
- Fixed bug in select() I/O queue (not thread safe).
|
||||
|
||||
|
||||
Version 0.2.7 - 2005/05/14
|
||||
====================================
|
||||
PJLIB:
|
||||
- Major reorganization in pool, introducing pool factory and policy.
|
||||
All libraries now can be completely agnostic about memory management
|
||||
choosen by application.
|
||||
- Fixed bug in GUID generation on mingw
|
||||
- Fixed bug in scanner if ASCII > 127 is fed into the input
|
||||
- More doxygen documentation
|
||||
|
||||
PJMEDIA:
|
||||
- Renamed some functions/structs/etc.
|
||||
|
||||
UA library:
|
||||
- Registration client completed (including authentication).
|
||||
- Fixed a crash condition when tsx has not received any response.
|
||||
|
||||
PJSUA:
|
||||
- Use getopt.c
|
||||
|
||||
|
||||
Version 0.2.6 - 2005/04/17
|
||||
====================================
|
||||
All:
|
||||
- tidying up header files.
|
||||
|
||||
Core library:
|
||||
- Removed PJSIP_HAS_DUMP macro (now automatically calculated based on log level)
|
||||
- Added pjsip_tx_data_invalidate_msg()
|
||||
|
||||
UA library:
|
||||
- big modification in dialog API to better support injecting custom header
|
||||
in outgoing message and to make it more flexible for future features (such
|
||||
as caching the outgoing message):
|
||||
- sending messages is now done in two steps: (1)create the msg transmit
|
||||
buffer (pjsip_dlg_tx_data), (2)send the msg transmit buffer.
|
||||
- dialog state won't change in step (1); it will change only
|
||||
when the message is actually sent in step (2).
|
||||
What won't change:
|
||||
- the dialog state
|
||||
- outgoing CSeq
|
||||
- outgoing message transmit buffer (pjsip_dlg_tx_data) will be deleted
|
||||
when sent in step (2). Application MAY save request messages for
|
||||
future transmission, even after the request has been sent. To do so,
|
||||
it must increment the reference counter and remember that each time
|
||||
the request is sent, the reference counter will be decremented. Also
|
||||
application CAN NOT re-send the message while the transaction that
|
||||
sends the message has not terminated.
|
||||
- changed API names: pjsip_dlg_answer_invitation() --> pjsip_dlg_answer(), etc.
|
||||
- initial sip_reg.h for SIP registration.
|
||||
|
||||
Auth library:
|
||||
- the digest authentication should work, however it has not been tested
|
||||
with any SIP servers because we don't have REGISTER support yet.
|
||||
*Note*:
|
||||
authentication in pjsua still uses hardcoded user/pass: hello/world.
|
||||
|
||||
|
||||
Version 0.2.5.2 - 2005/03/25
|
||||
====================================
|
||||
UA library:
|
||||
- Major modification in dialog callbacks, now high level callbacks such as
|
||||
on_calling(), on_incoming(), on_provisional(), on_established(), and
|
||||
on_disconnected() are provided instead of just one callback (on_event()).
|
||||
- Added pjsip_dlg_disconnect() which should handle all cases of disconnection
|
||||
such as sending CANCEL, sending BYE, or sending final response to INVITE.
|
||||
- Added and updated doxygen comments.
|
||||
- Changed: pjsip_dialog_xxx --> pjsip_dlg_xxx
|
||||
|
||||
New:
|
||||
- PJSIP Auth library, which supports digest scheme.
|
||||
- Only client functionality is present at the moment.
|
||||
|
||||
PJSUA:
|
||||
- Remove callgen feature, as it makes the application complicated.
|
||||
Will move it to different application, to make way for more sophisticated
|
||||
call generator.
|
||||
- Support the new callback framework.
|
||||
- Support the new digest authentication (UAC only).
|
||||
|
||||
SIP core:
|
||||
- Added PJSIP_EVENT_BEFORE_TX, triggered by transaction before sending
|
||||
outgoing message (including retransmission). Application can use this event
|
||||
(via dialog callback) to modify the message before transmission (such as
|
||||
adding authorization headers).
|
||||
- Added general purpose function to print text body.
|
||||
- Move constant strings in parser to public/extern, just in case other
|
||||
part of the library need to use them.
|
||||
|
||||
PJMEDIA:
|
||||
- Protect against NULL in destroy session.
|
||||
|
||||
Misc:
|
||||
- Rename build output directory x_Win32_x --> x_vc7_x or x_vc6_x, also
|
||||
library naming includes _vc7_ or _vc6_ now.
|
||||
- Renamed pjsip_test_core --> pjsip_core_test.
|
||||
- Renamed pjaudio_tool --> pjmedia_audio_tool.
|
||||
- Renamed sdp_test --> pjsdp_test
|
||||
- PJLIB test: added second pool test after new/malloc test.
|
||||
- Renamed README.txt --> INSTALL.txt
|
|
@ -0,0 +1,55 @@
|
|||
# Build configurations:
|
||||
#
|
||||
# MACHINE_NAME values:
|
||||
# - i386 (generic x86)
|
||||
# - m68k
|
||||
#
|
||||
# OS_NAME values:
|
||||
# - win32 (generic windows)
|
||||
# - linux
|
||||
#
|
||||
# CC_NAME values:
|
||||
# - gcc
|
||||
# - msvc
|
||||
#
|
||||
# HOST_NAME values:
|
||||
# - win32 (Windows command line)
|
||||
# - mingw (Windows, mingw)
|
||||
#
|
||||
|
||||
#
|
||||
# PalmOS 6 cross-compile, cygwin
|
||||
#
|
||||
#export MACHINE_NAME := m68k
|
||||
#export OS_NAME := palmos
|
||||
#export CC_NAME := gcc
|
||||
#export HOST_NAME := mingw
|
||||
|
||||
#
|
||||
# Win32, mingw
|
||||
#
|
||||
#export MACHINE_NAME := i386
|
||||
#export OS_NAME := win32
|
||||
#export CC_NAME := gcc
|
||||
#export HOST_NAME := mingw
|
||||
|
||||
#
|
||||
# Linux i386, gcc
|
||||
#
|
||||
export MACHINE_NAME := i386
|
||||
export OS_NAME := linux
|
||||
export CC_NAME := gcc
|
||||
export HOST_NAME := unix
|
||||
|
||||
#
|
||||
# Linux KERNEL i386, gcc
|
||||
#
|
||||
#export MACHINE_NAME := i386
|
||||
#export OS_NAME := linux-kernel
|
||||
#export CC_NAME := gcc
|
||||
#export HOST_NAME := unix
|
||||
#export PJPROJECT_DIR := /usr/src/pjproject-0.3
|
||||
##export KERNEL_DIR = /usr/src/linux
|
||||
#export KERNEL_DIR = /usr/src/uml/linux
|
||||
#export KERNEL_ARCH = ARCH=um
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
export CC = $(CROSS_COMPILE)gcc -c
|
||||
export AR = $(CROSS_COMPILE)ar r
|
||||
export LD = $(CROSS_COMPILE)gcc
|
||||
export LDOUT = -o
|
||||
export RANLIB = $(CROSS_COMPILE)ranlib
|
||||
|
||||
export OBJEXT := .o
|
||||
export LIBEXT := .a
|
||||
export LIBEXT2 :=
|
||||
|
||||
export CC_OUT := -o
|
||||
export CC_INC := -I
|
||||
export CC_DEF := -D
|
||||
export CC_OPTIMIZE := -O2
|
||||
export CC_LIB := -l
|
||||
|
||||
export CC_SOURCES :=
|
||||
export CC_CFLAGS := -Wall
|
||||
#export CC_CFLAGS += -Wdeclaration-after-statement
|
||||
#export CC_CXXFLAGS := -Wdeclaration-after-statement
|
||||
export CC_LDFLAGS :=
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
export CC := cl /c /nologo
|
||||
export AR := lib /NOLOGO /OUT:
|
||||
export LD := cl /nologo
|
||||
export LDOUT := /Fe
|
||||
export RANLIB := echo ranlib
|
||||
|
||||
export OBJEXT := .obj
|
||||
export LIBEXT := .lib
|
||||
export LIBEXT2 := .LIB
|
||||
|
||||
export CC_OUT := /Fo
|
||||
export CC_INC := /I
|
||||
export CC_DEF := /D
|
||||
export CC_OPTIMIZE := /Ox
|
||||
export CC_LIB :=
|
||||
|
||||
export CC_SOURCES :=
|
||||
export CC_CFLAGS := /W4 /MT
|
||||
export CC_CXXFLAGS := /GX
|
||||
export CC_LDFLAGS := /MT
|
|
@ -0,0 +1,13 @@
|
|||
export HOST_MV := mv
|
||||
export HOST_RM := rm -f @@
|
||||
export HOST_RMR := rm -rf @@
|
||||
export HOST_RMDIR := rm -rf @@
|
||||
export HOST_MKDIR := mkdir @@
|
||||
export HOST_EXE := .exe
|
||||
export HOST_PSEP := /
|
||||
|
||||
export HOST_SOURCES :=
|
||||
export HOST_CFLAGS :=
|
||||
export HOST_CXXFLAGS :=
|
||||
export HOST_LDFLAGS := $(CC_LIB)stdc++$(LIBEXT2)
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
export HOST_MV := mv
|
||||
export HOST_RM := rm -f @@
|
||||
export HOST_RMR := rm -rf @@
|
||||
export HOST_RMDIR := rm -rf @@
|
||||
export HOST_MKDIR := mkdir @@
|
||||
export HOST_EXE :=
|
||||
export HOST_PSEP := /
|
||||
|
||||
export HOST_SOURCES :=
|
||||
export HOST_CFLAGS :=
|
||||
export HOST_CXXFLAGS :=
|
||||
export HOST_LDFLAGS :=
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
export HOST_MV := ren
|
||||
export HOST_RM := if exist @@; del /F /Q @@
|
||||
export HOST_RMR := if exist @@; del /F /Q @@
|
||||
export HOST_RMDIR := if exist @@; rmdir @@
|
||||
export HOST_MKDIR := if not exist @@; mkdir @@
|
||||
export HOST_EXE := .exe
|
||||
export HOST_PSEP := \\
|
||||
|
||||
export HOST_SOURCES :=
|
||||
export HOST_CFLAGS :=
|
||||
export HOST_CXXFLAGS :=
|
||||
export HOST_LDFLAGS :=
|
|
@ -0,0 +1,4 @@
|
|||
export M_CFLAGS := $(CC_DEF)PJ_M_ALPHA=1
|
||||
export M_CXXFLAGS :=
|
||||
export M_LDFLAGS :=
|
||||
export M_SOURCES :=
|
|
@ -0,0 +1,4 @@
|
|||
export M_CFLAGS := $(CC_DEF)PJ_M_I386=1
|
||||
export M_CXXFLAGS :=
|
||||
export M_LDFLAGS :=
|
||||
export M_SOURCES :=
|
|
@ -0,0 +1,4 @@
|
|||
export M_CFLAGS := $(CC_DEF)PJ_M_M68K=1
|
||||
export M_CXXFLAGS :=
|
||||
export M_LDFLAGS :=
|
||||
export M_SOURCES :=
|
|
@ -0,0 +1,43 @@
|
|||
|
||||
include $(KERNEL_DIR)/.config
|
||||
|
||||
#
|
||||
# Basic kernel compilation flags.
|
||||
#
|
||||
export OS_CFLAGS := $(CC_DEF)PJ_LINUX_KERNEL=1 -D__KERNEL__ \
|
||||
-I$(KERNEL_DIR)/include -iwithprefix include \
|
||||
-nostdinc -msoft-float
|
||||
|
||||
#
|
||||
# Additional kernel compilation flags are taken from the kernel Makefile
|
||||
# itself.
|
||||
#
|
||||
|
||||
KERNEL_CFLAGS := \
|
||||
$(shell cd $(KERNEL_DIR) ; \
|
||||
make script SCRIPT='@echo $$(CFLAGS) $$(CFLAGS_MODULE)' $(KERNEL_ARCH))
|
||||
|
||||
export OS_CFLAGS += $(KERNEL_CFLAGS)
|
||||
|
||||
# -DMODULE -I$(KERNEL_DIR)/include -nostdinc \
|
||||
# -Wstrict-prototypes \
|
||||
# -Wno-trigraphs -fno-strict-aliasing -fno-common \
|
||||
# -msoft-float -m32 -fno-builtin-sprintf -fno-builtin-log2\
|
||||
# -fno-builtin-puts -mpreferred-stack-boundary=2 \
|
||||
# -fno-unit-at-a-time -march=i686 -mregparm=3 \
|
||||
# -iwithprefix include
|
||||
|
||||
#export OS_CFLAGS += -U__i386__ -Ui386 -D__arch_um__ -DSUBARCH=\"i386\" \
|
||||
# -D_LARGEFILE64_SOURCE -I$(KERNEL_DIR)/arch/um/include \
|
||||
# -Derrno=kernel_errno \
|
||||
# -I$(KERNEL_DIR)/arch/um/kernel/tt/include \
|
||||
# -I$(KERNEL_DIR)/arch/um/kernel/skas/include \
|
||||
|
||||
|
||||
export OS_CXXFLAGS :=
|
||||
|
||||
export OS_LDFLAGS :=
|
||||
|
||||
export OS_SOURCES :=
|
||||
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
export OS_CFLAGS := $(CC_DEF)PJ_LINUX=1
|
||||
|
||||
export OS_CXXFLAGS :=
|
||||
|
||||
export OS_LDFLAGS := $(CC_LIB)pthread$(LIBEXT2)
|
||||
|
||||
export OS_SOURCES :=
|
||||
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
#
|
||||
# make-mingw.inc: Mingw specific compilation switches.
|
||||
#
|
||||
PALM_OS_SDK_VER := 0x06000000
|
||||
PALM_OS_TARGET_HOST := TARGET_HOST_PALMOS
|
||||
PALM_OS_TARGET_PLATFORM := TARGET_PLATFORM_PALMSIM_WIN32
|
||||
PALM_OS_BUILD_TYPE := BUILD_TYPE_DEBUG
|
||||
PALM_OS_TRACE_OUTPUT := TRACE_OUTPUT_ON
|
||||
PALM_OS_CPU_TYPE := CPU_ARM
|
||||
|
||||
export CROSS_COMPILE :=
|
||||
|
||||
ifeq ($(CC_NAME),gcc)
|
||||
export CFLAGS += -mno-cygwin -fexceptions -frtti
|
||||
endif
|
||||
|
||||
export OS_CFLAGS := $(CC_DEF)PJ_PALMOS=1 \
|
||||
$(CC_DEF)__PALMOS_KERNEL__=1 \
|
||||
$(CC_DEF)__PALMOS__=$(PALM_OS_SDK_VER) \
|
||||
$(CC_DEF)BUILD_TYPE=$(PALM_OS_BUILD_TYPE) \
|
||||
$(CC_DEF)TRACE_OUTPUT=$(PALM_OS_TRACE_OUTPUT) \
|
||||
$(CC_DEF)_SUPPORTS_NAMESPACE=0 \
|
||||
$(CC_DEF)_SUPPORTS_RTTI=0 \
|
||||
$(CC_DEF)TARGET_HOST=$(PALM_OS_TRAGET_HOST) \
|
||||
$(CC_DEF)TARGET_PLATFORM=$(PALM_OS_TARGET_PLATFORM)
|
||||
|
||||
export OS_CXXFLAGS :=
|
||||
|
||||
export OS_LDFLAGS :=
|
||||
|
||||
export OS_SOURCES :=
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
export OS_CFLAGS := $(CC_DEF)PJ_WIN32=1
|
||||
|
||||
export OS_CXXFLAGS :=
|
||||
|
||||
export OS_LDFLAGS := $(CC_LIB)wsock32$(LIBEXT2) \
|
||||
$(CC_LIB)ws2_32$(LIBEXT2)\
|
||||
$(CC_LIB)ole32$(LIBEXT2)
|
||||
|
||||
export OS_SOURCES :=
|
||||
|
||||
|
|
@ -0,0 +1,233 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjlib"=..\pjlib\build\pjlib.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/pjlib/build", UIAAAAAA
|
||||
..\pjlib\build
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjlib_test"=..\pjlib\build\pjlib_test.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/pjlib/build", HICAAAAA
|
||||
..\pjlib\build
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjlib
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjlibpp"=..\pjlib\build\pjlibpp.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/pjlib/build", HICAAAAA
|
||||
..\pjlib\build
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjmedia"=..\pjmedia\build\pjmedia.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/pjmedia/build", MJCAAAAA
|
||||
..\pjmedia\build
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjmedia_audio_tool"=..\pjmedia\build\pjmedia_audio_tool.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/pjmedia/build", MJCAAAAA
|
||||
..\pjmedia\build
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjlib
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjmedia
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjmedia_test"=..\pjmedia\build\pjmedia_test.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/pjmedia/build", MJCAAAAA
|
||||
..\pjmedia\build
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjlib
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjmedia
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjsip_core"=..\pjsip\build\pjsip_core.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/pjsip/build", LJCAAAAA
|
||||
..\pjsip\build
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjsip_core_test"=..\pjsip\build\pjsip_core_test.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/pjsip/build", LJCAAAAA
|
||||
..\pjsip\build
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjlib
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjsip_core
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjsip_simple"=..\pjsip\build\pjsip_simple.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/pjsip/build", LJCAAAAA
|
||||
..\pjsip\build
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjsip_ua"=..\pjsip\build\pjsip_ua.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/pjsip/build", LJCAAAAA
|
||||
..\pjsip\build
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjsua"=..\pjsip\build\pjsua.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/pjsip/build", LJCAAAAA
|
||||
..\pjsip\build
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjlib
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjmedia
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjsip_ua
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjsip_core
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjsip_simple
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject/build", KYBAAAAA
|
||||
.
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
|
@ -0,0 +1,187 @@
|
|||
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjlib", "..\pjlib\build\pjlib.vcproj", "{72790D99-35BB-45AC-9A23-3BB60C901E63}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjlib_test", "..\pjlib\build\pjlib_test.vcproj", "{A684A4C0-00D6-4497-B144-FC6AED4FAD8A}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{72790D99-35BB-45AC-9A23-3BB60C901E63} = {72790D99-35BB-45AC-9A23-3BB60C901E63}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjlibpp", "..\pjlib\build\pjlibpp.vcproj", "{488B9CA1-8F59-4E4E-8748-D6A712CF9F3C}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjmedia_lib", "..\pjmedia\build\pjmedia.vcproj", "{EB8559B2-D738-4987-8591-4D217F8B0099}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjmedia_test", "..\pjmedia\build\pjmedia_test.vcproj", "{692B42C4-6888-4BF8-9613-E48A2F138005}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{72790D99-35BB-45AC-9A23-3BB60C901E63} = {72790D99-35BB-45AC-9A23-3BB60C901E63}
|
||||
{EB8559B2-D738-4987-8591-4D217F8B0099} = {EB8559B2-D738-4987-8591-4D217F8B0099}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjsip_core_lib", "..\pjsip\build\pjsip_core.vcproj", "{58A72B82-7369-4B89-B511-7191A6B0D8C3}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjsip_ua_lib", "..\pjsip\build\pjsip_ua.vcproj", "{DEE358A5-ADD3-4403-AD82-4967E63F17D1}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjsua", "..\pjsip\build\pjsua.vcproj", "{B8500B7B-C6A8-46B9-84E6-90E200C1B35A}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{B5C20C39-AF03-405D-BF59-B4C2E8D68BDE} = {B5C20C39-AF03-405D-BF59-B4C2E8D68BDE}
|
||||
{58A72B82-7369-4B89-B511-7191A6B0D8C3} = {58A72B82-7369-4B89-B511-7191A6B0D8C3}
|
||||
{72790D99-35BB-45AC-9A23-3BB60C901E63} = {72790D99-35BB-45AC-9A23-3BB60C901E63}
|
||||
{DEE358A5-ADD3-4403-AD82-4967E63F17D1} = {DEE358A5-ADD3-4403-AD82-4967E63F17D1}
|
||||
{EB8559B2-D738-4987-8591-4D217F8B0099} = {EB8559B2-D738-4987-8591-4D217F8B0099}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjsip_core_test", "..\pjsip\build\pjsip_core_test.vcproj", "{782BF0C1-FE0E-48A9-B875-31E7BF9F4B5B}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{58A72B82-7369-4B89-B511-7191A6B0D8C3} = {58A72B82-7369-4B89-B511-7191A6B0D8C3}
|
||||
{72790D99-35BB-45AC-9A23-3BB60C901E63} = {72790D99-35BB-45AC-9A23-3BB60C901E63}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjmedia_audio_tool", "..\pjmedia\build\pjmedia_audio_tool.vcproj", "{5FD061CF-A0E8-43DF-990C-B046AA1BF5EE}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{72790D99-35BB-45AC-9A23-3BB60C901E63} = {72790D99-35BB-45AC-9A23-3BB60C901E63}
|
||||
{EB8559B2-D738-4987-8591-4D217F8B0099} = {EB8559B2-D738-4987-8591-4D217F8B0099}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjsip_callgen", "..\pjsip\build\pjsip_callgen.vcproj", "{DCBEF2A3-D444-46FC-82E7-D939113EECA7}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjsip_simple_lib", "..\pjsip\build\pjsip_simple.vcproj", "{B5C20C39-AF03-405D-BF59-B4C2E8D68BDE}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SourceCodeControl) = preSolution
|
||||
SccNumberOfProjects = 13
|
||||
SccLocalPath0 = .
|
||||
CanCheckoutShared = false
|
||||
SolutionUniqueID = {23953A1F-662B-4D0D-BC25-C13C88DE8618}
|
||||
SccProjectUniqueName1 = ..\\pjlib\\build\\pjlib.vcproj
|
||||
SccProjectName1 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath1 = ..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection1 = pjlib\\build\\
|
||||
SccProjectUniqueName2 = ..\\pjlib\\build\\pjlib_test.vcproj
|
||||
SccProjectName2 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath2 = ..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection2 = pjlib\\build\\
|
||||
SccProjectUniqueName3 = ..\\pjlib\\build\\pjlibpp.vcproj
|
||||
SccProjectName3 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath3 = ..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection3 = pjlib\\build\\
|
||||
SccProjectUniqueName4 = ..\\pjmedia\\build\\pjmedia.vcproj
|
||||
SccProjectName4 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath4 = ..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection4 = pjmedia\\build\\
|
||||
SccProjectUniqueName5 = ..\\pjmedia\\build\\pjmedia_test.vcproj
|
||||
SccProjectName5 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath5 = ..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection5 = pjmedia\\build\\
|
||||
SccProjectUniqueName6 = ..\\pjsip\\build\\pjsip_core.vcproj
|
||||
SccProjectName6 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath6 = ..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection6 = pjsip\\build\\
|
||||
SccProjectUniqueName7 = ..\\pjsip\\build\\pjsip_ua.vcproj
|
||||
SccProjectName7 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath7 = ..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection7 = pjsip\\build\\
|
||||
SccProjectUniqueName8 = ..\\pjsip\\build\\pjsua.vcproj
|
||||
SccProjectName8 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath8 = ..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection8 = pjsip\\build\\
|
||||
SccProjectUniqueName9 = ..\\pjsip\\build\\pjsip_core_test.vcproj
|
||||
SccProjectName9 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath9 = ..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection9 = pjsip\\build\\
|
||||
SccProjectUniqueName10 = ..\\pjmedia\\build\\pjmedia_audio_tool.vcproj
|
||||
SccProjectName10 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath10 = ..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection10 = pjmedia\\build\\
|
||||
SccProjectUniqueName11 = ..\\pjsip\\build\\pjsip_callgen.vcproj
|
||||
SccProjectName11 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath11 = ..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection11 = pjsip\\build\\
|
||||
SccProjectUniqueName12 = ..\\pjsip\\build\\pjsip_simple.vcproj
|
||||
SccProjectName12 = \u0022$/pjproject/pjsip\u0022,\u0020QIAAAAAA
|
||||
SccLocalPath12 = ..\\pjsip
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection12 = build\\
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionConfiguration) = preSolution
|
||||
Debug = Debug
|
||||
Release = Release
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfiguration) = postSolution
|
||||
{72790D99-35BB-45AC-9A23-3BB60C901E63}.Debug.ActiveCfg = Debug|Win32
|
||||
{72790D99-35BB-45AC-9A23-3BB60C901E63}.Debug.Build.0 = Debug|Win32
|
||||
{72790D99-35BB-45AC-9A23-3BB60C901E63}.Release.ActiveCfg = Release|Win32
|
||||
{72790D99-35BB-45AC-9A23-3BB60C901E63}.Release.Build.0 = Release|Win32
|
||||
{A684A4C0-00D6-4497-B144-FC6AED4FAD8A}.Debug.ActiveCfg = Debug|Win32
|
||||
{A684A4C0-00D6-4497-B144-FC6AED4FAD8A}.Debug.Build.0 = Debug|Win32
|
||||
{A684A4C0-00D6-4497-B144-FC6AED4FAD8A}.Release.ActiveCfg = Release|Win32
|
||||
{A684A4C0-00D6-4497-B144-FC6AED4FAD8A}.Release.Build.0 = Release|Win32
|
||||
{488B9CA1-8F59-4E4E-8748-D6A712CF9F3C}.Debug.ActiveCfg = Debug|Win32
|
||||
{488B9CA1-8F59-4E4E-8748-D6A712CF9F3C}.Debug.Build.0 = Debug|Win32
|
||||
{488B9CA1-8F59-4E4E-8748-D6A712CF9F3C}.Release.ActiveCfg = Release|Win32
|
||||
{488B9CA1-8F59-4E4E-8748-D6A712CF9F3C}.Release.Build.0 = Release|Win32
|
||||
{EB8559B2-D738-4987-8591-4D217F8B0099}.Debug.ActiveCfg = Debug|Win32
|
||||
{EB8559B2-D738-4987-8591-4D217F8B0099}.Debug.Build.0 = Debug|Win32
|
||||
{EB8559B2-D738-4987-8591-4D217F8B0099}.Release.ActiveCfg = Release|Win32
|
||||
{EB8559B2-D738-4987-8591-4D217F8B0099}.Release.Build.0 = Release|Win32
|
||||
{692B42C4-6888-4BF8-9613-E48A2F138005}.Debug.ActiveCfg = Debug|Win32
|
||||
{692B42C4-6888-4BF8-9613-E48A2F138005}.Debug.Build.0 = Debug|Win32
|
||||
{692B42C4-6888-4BF8-9613-E48A2F138005}.Release.ActiveCfg = Release|Win32
|
||||
{692B42C4-6888-4BF8-9613-E48A2F138005}.Release.Build.0 = Release|Win32
|
||||
{58A72B82-7369-4B89-B511-7191A6B0D8C3}.Debug.ActiveCfg = Debug|Win32
|
||||
{58A72B82-7369-4B89-B511-7191A6B0D8C3}.Debug.Build.0 = Debug|Win32
|
||||
{58A72B82-7369-4B89-B511-7191A6B0D8C3}.Release.ActiveCfg = Release|Win32
|
||||
{58A72B82-7369-4B89-B511-7191A6B0D8C3}.Release.Build.0 = Release|Win32
|
||||
{DEE358A5-ADD3-4403-AD82-4967E63F17D1}.Debug.ActiveCfg = Debug|Win32
|
||||
{DEE358A5-ADD3-4403-AD82-4967E63F17D1}.Debug.Build.0 = Debug|Win32
|
||||
{DEE358A5-ADD3-4403-AD82-4967E63F17D1}.Release.ActiveCfg = Release|Win32
|
||||
{DEE358A5-ADD3-4403-AD82-4967E63F17D1}.Release.Build.0 = Release|Win32
|
||||
{B8500B7B-C6A8-46B9-84E6-90E200C1B35A}.Debug.ActiveCfg = Debug|Win32
|
||||
{B8500B7B-C6A8-46B9-84E6-90E200C1B35A}.Debug.Build.0 = Debug|Win32
|
||||
{B8500B7B-C6A8-46B9-84E6-90E200C1B35A}.Release.ActiveCfg = Release|Win32
|
||||
{B8500B7B-C6A8-46B9-84E6-90E200C1B35A}.Release.Build.0 = Release|Win32
|
||||
{782BF0C1-FE0E-48A9-B875-31E7BF9F4B5B}.Debug.ActiveCfg = Debug|Win32
|
||||
{782BF0C1-FE0E-48A9-B875-31E7BF9F4B5B}.Debug.Build.0 = Debug|Win32
|
||||
{782BF0C1-FE0E-48A9-B875-31E7BF9F4B5B}.Release.ActiveCfg = Release|Win32
|
||||
{782BF0C1-FE0E-48A9-B875-31E7BF9F4B5B}.Release.Build.0 = Release|Win32
|
||||
{5FD061CF-A0E8-43DF-990C-B046AA1BF5EE}.Debug.ActiveCfg = Debug|Win32
|
||||
{5FD061CF-A0E8-43DF-990C-B046AA1BF5EE}.Debug.Build.0 = Debug|Win32
|
||||
{5FD061CF-A0E8-43DF-990C-B046AA1BF5EE}.Release.ActiveCfg = Release|Win32
|
||||
{5FD061CF-A0E8-43DF-990C-B046AA1BF5EE}.Release.Build.0 = Release|Win32
|
||||
{DCBEF2A3-D444-46FC-82E7-D939113EECA7}.Debug.ActiveCfg = Debug|Win32
|
||||
{DCBEF2A3-D444-46FC-82E7-D939113EECA7}.Debug.Build.0 = Debug|Win32
|
||||
{DCBEF2A3-D444-46FC-82E7-D939113EECA7}.Release.ActiveCfg = Release|Win32
|
||||
{DCBEF2A3-D444-46FC-82E7-D939113EECA7}.Release.Build.0 = Release|Win32
|
||||
{B5C20C39-AF03-405D-BF59-B4C2E8D68BDE}.Debug.ActiveCfg = Debug|Win32
|
||||
{B5C20C39-AF03-405D-BF59-B4C2E8D68BDE}.Debug.Build.0 = Debug|Win32
|
||||
{B5C20C39-AF03-405D-BF59-B4C2E8D68BDE}.Release.ActiveCfg = Release|Win32
|
||||
{B5C20C39-AF03-405D-BF59-B4C2E8D68BDE}.Release.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,164 @@
|
|||
LIBDIR = ../lib
|
||||
BINDIR = ../bin
|
||||
|
||||
#
|
||||
# The full path of output lib file (e.g. ../lib/libapp.a).
|
||||
#
|
||||
LIB = $($(APP)_LIB)
|
||||
|
||||
#
|
||||
# The full path of output executable file (e.g. ../bin/app.exe).
|
||||
#
|
||||
EXE = $($(APP)_EXE)
|
||||
|
||||
#
|
||||
# Source directory
|
||||
#
|
||||
SRCDIR = $($(APP)_SRCDIR)
|
||||
|
||||
#
|
||||
# Output directory for object files (i.e. output/target)
|
||||
#
|
||||
OBJDIR = output/$(app)-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME)
|
||||
|
||||
ifeq ($(OS_NAME),linux-kernel)
|
||||
export $(APP)_CFLAGS += -DKBUILD_MODNAME=$(app) -DKBUILD_BASENAME=$(app)
|
||||
endif
|
||||
|
||||
|
||||
#
|
||||
# OBJS is ./output/target/file.o
|
||||
#
|
||||
OBJS = $(foreach file, $($(APP)_OBJS), $(OBJDIR)/$(file))
|
||||
OBJDIRS := $(sort $(dir $(OBJS)))
|
||||
|
||||
#
|
||||
# FULL_SRCS is ../src/app/file1.c ../src/app/file1.S
|
||||
#
|
||||
FULL_SRCS = $(foreach file, $($(APP)_OBJS), $(SRCDIR)/$(basename $(file)).c $(SRCDIR)/$(basename $(file)).cpp $(SRCDIR)/$(basename $(file)).S)
|
||||
|
||||
#
|
||||
# When generating dependency (gcc -MM), ideally we use only either
|
||||
# CFLAGS or CXXFLAGS (not both). But I just couldn't make if/ifeq to work.
|
||||
#
|
||||
DEPFLAGS = $($(APP)_CXXFLAGS) $($(APP)_CFLAGS)
|
||||
|
||||
# Dependency file
|
||||
DEP_FILE := .$(app)-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend
|
||||
|
||||
|
||||
print_common:
|
||||
@echo "###"
|
||||
@echo "### DUMPING MAKE VARIABLES (I WON'T DO ANYTHING ELSE):"
|
||||
@echo "###"
|
||||
@echo APP=$(APP)
|
||||
@echo OBJDIR=$(OBJDIR)
|
||||
@echo OBJDIRS=$(OBJDIRS)
|
||||
@echo OBJS=$(OBJS)
|
||||
@echo SRCDIR=$(SRCDIR)
|
||||
@echo FULL_SRCS=$(FULL_SRCS)
|
||||
@echo $(APP)_CFLAGS=$($(APP)_CFLAGS)
|
||||
@echo $(APP)_CXXFLAGS=$($(APP)_CXXFLAGS)
|
||||
@echo $(APP)_LDFLAGS=$($(APP)_LDFLAGS)
|
||||
@echo DEPFLAGS=$(DEPFLAGS)
|
||||
|
||||
print_bin: print_common
|
||||
@echo EXE=$(EXE)
|
||||
@echo BINDIR=$(BINDIR)
|
||||
|
||||
print_lib: print_common
|
||||
@echo LIB=$(LIB)
|
||||
@echo LIBDIR=$(LIBDIR)
|
||||
|
||||
$(LIB): $(LIBDIR) $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
|
||||
$(AR)$(LIB) $(OBJS)
|
||||
$(RANLIB) $(LIB)
|
||||
|
||||
$(EXE): $(BINDIR) $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
|
||||
$(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$(EXE)) \
|
||||
$(subst /,$(HOST_PSEP),$(OBJS)) $($(APP)_LDFLAGS)
|
||||
|
||||
$(OBJDIR)/$(app).o: $(OBJDIRS) $(OBJS)
|
||||
$(CROSS_COMPILE)ld -r -o $@ $(OBJS)
|
||||
|
||||
$(OBJDIR)/$(app).ko: $(OBJDIR)/$(app).o
|
||||
@echo Creating kbuild Makefile...
|
||||
@echo "# Our module name:" > $(OBJDIR)/Makefile
|
||||
@echo 'obj-m += $(app).o' >> $(OBJDIR)/Makefile
|
||||
@echo >> $(OBJDIR)/Makefile
|
||||
@echo "# Object members:" >> $(OBJDIR)/Makefile
|
||||
@echo -n '$(app)-objs += ' >> $(OBJDIR)/Makefile
|
||||
@for file in $($(APP)_OBJS); do \
|
||||
echo -n "$$file " >> $(OBJDIR)/Makefile; \
|
||||
done
|
||||
@echo >> $(OBJDIR)/Makefile
|
||||
@echo >> $(OBJDIR)/Makefile
|
||||
@echo "# Prevent .o files to be built by kbuild:" >> $(OBJDIR)/Makefile
|
||||
@for file in $($(APP)_OBJS); do \
|
||||
echo ".PHONY: `pwd`/$(OBJDIR)/$$file" >> $(OBJDIR)/Makefile; \
|
||||
done
|
||||
@echo >> $(OBJDIR)/Makefile
|
||||
@echo all: >> $(OBJDIR)/Makefile
|
||||
@echo -e "\tmake -C $(KERNEL_DIR) M=`pwd`/$(OBJDIR) modules $(KERNEL_ARCH)" >> $(OBJDIR)/Makefile
|
||||
@echo Invoking kbuild...
|
||||
make -C $(OBJDIR)
|
||||
|
||||
../lib/$(app).ko: $(LIB) $(OBJDIR)/$(app).ko
|
||||
cp $(OBJDIR)/$(app).ko ../lib
|
||||
|
||||
$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.c
|
||||
$(CC) $($(APP)_CFLAGS) \
|
||||
$(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
|
||||
$(subst /,$(HOST_PSEP),$<)
|
||||
|
||||
$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.S
|
||||
$(CC) $($(APP)_CFLAGS) \
|
||||
$(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
|
||||
$(subst /,$(HOST_PSEP),$<)
|
||||
|
||||
$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.cpp
|
||||
$(CC) $($(APP)_CXXFLAGS) \
|
||||
$(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
|
||||
$(subst /,$(HOST_PSEP),$<)
|
||||
|
||||
$(OBJDIRS):
|
||||
$(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR))
|
||||
|
||||
$(LIBDIR):
|
||||
$(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR))
|
||||
|
||||
$(BINDIR):
|
||||
$(subst @@,$(subst /,$(HOST_PSEP),$(BINDIR)),$(HOST_MKDIR))
|
||||
|
||||
clean:
|
||||
$(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)/*),$(HOST_RMR))
|
||||
$(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)),$(HOST_RMDIR))
|
||||
ifeq ($(OS_NAME),linux-kernel)
|
||||
rm -f ../lib/$(app).o
|
||||
endif
|
||||
|
||||
realclean: clean
|
||||
$(subst @@,$(subst /,$(HOST_PSEP),$(LIB)) $(subst /,$(HOST_PSEP),$(EXE)),$(HOST_RM))
|
||||
$(subst @@,$(DEP_FILE),$(HOST_RM))
|
||||
ifeq ($(OS_NAME),linux-kernel)
|
||||
rm -f ../lib/$(app).ko
|
||||
endif
|
||||
|
||||
depend:
|
||||
$(subst @@,$(DEP_FILE),$(HOST_RM))
|
||||
for F in $(FULL_SRCS); do \
|
||||
if test -f $$F; then \
|
||||
echo -n $(OBJDIR)/ >> $(DEP_FILE); \
|
||||
if gcc -MM $(DEPFLAGS) $$F | sed '/^#/d' >> $(DEP_FILE); then \
|
||||
true; \
|
||||
else \
|
||||
echo 'err:' >> $(DEP_FILE); \
|
||||
exit 1; \
|
||||
fi; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
dep: depend
|
||||
|
||||
-include $(DEP_FILE)
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>pjproject version 0.2.8</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<strong>Version 0.2.8 - 2005/05/28</strong>
|
||||
<hr>
|
||||
<H3>Status</H3><P>
|
||||
- Should not crash when everything is ok. :)<BR>
|
||||
- All targets are up to date.</P>
|
||||
|
||||
<H3>What's new</H3><P>
|
||||
- STUN client support (pj/stun*).<BR>
|
||||
- Briefly tested with iptel.org service (with or without STUN).<BR>
|
||||
- Removed PJSDP project (merged into PJMEDIA).<BR>
|
||||
- Changed I/O queue to use callback for more flexibility.</P>
|
||||
|
||||
<P>For more information, go to <STRONG><A href="http://www.bulukucing.org/pjsip.html">PJSIP web page</A></STRONG> or <STRONG><A href="http://www.bulukucing.org/pjproject/v0.2.8/">Browse the Source Files</A></STRONG>.</P>
|
||||
|
||||
<H3>Download source tar ball</H3>
|
||||
<P>
|
||||
<STRONG><A href="http://www.bulukucing.org/pjproject/v0.2.8/pjproject-0.2.8.tar.gz">pjproject-0.2.8.tar.gz</A></STRONG> (339KB)</P>
|
||||
|
||||
<H3>Download executables</H3>
|
||||
<P>
|
||||
Win2k/XP (needs Direct Sound/msvcrt.dll, won't work on NT because of Direct Sound):<BR>
|
||||
- <A href="http://www.bulukucing.org/pjproject/v0.2.8/pjsua_vc6.exe"><STRONG>pjsua_vc6.exe</STRONG></A> (124 KB) or <A href="http://www.bulukucing.org/pjproject/v0.2.8/pjsua_vc6.exe.gz"><STRONG>pjsua_vc6.exe.gz</STRONG></A> (62 KB)</P>
|
||||
|
||||
<P>Win32 mingw (no audio):<BR>
|
||||
- <A href="http://www.bulukucing.org/pjproject/v0.2.8/pjsua_mingw.exe"><STRONG>pjsua_mingw.exe</STRONG></A> (209 KB) or <A href="http://www.bulukucing.org/pjproject/v0.2.8/pjsua_mingw.exe.gz"><STRONG>pjsua_mingw.exe.gz</STRONG></A> (92 KB)</P>
|
||||
|
||||
<P>Linux (compiled on Fedora Linux 3, no audio):<BR>
|
||||
- <A href="http://www.bulukucing.org/pjproject/v0.2.8/pjsua.gz"><STRONG>pjsua.gz</STRONG></A> (74 KB)<BR>
|
||||
</P>
|
||||
|
||||
<H3>Release Notes:</H3>
|
||||
<ul>
|
||||
<li>Simple <strong>STUN</strong> client support.<BR>
|
||||
SIP UDP port and media RTP/RTCP ports are now STUN aware. <BR>
|
||||
</li>
|
||||
<li>Client <strong>registration</strong> tested<BR>
|
||||
Including digest authentication, tested with iptel.org.
|
||||
</li>
|
||||
<li>Major changed in <strong>I/O queue</strong>, now callback is used.<BR>
|
||||
Callback is better because multiple libraries can register to single I/O queue.
|
||||
It was not possible with previous implementation, because the function which does
|
||||
polling needs to understand what to do when a key is signalled. The changes was
|
||||
initially needed to support STUN, but then I decided that the STUN client
|
||||
implementation uses the simpler select() (in stun_client.c). But the changes in
|
||||
I/O queue stays there because it's better than previous implementation.
|
||||
</li>
|
||||
<li>Merge <strong>SDP</strong> library into PJMEDIA (no more PJSDP).<BR>
|
||||
PJSDP only has couple of files (sdp.[hc]), not worth maintaining a library.
|
||||
</li>
|
||||
<li>Fixed bug in select() I/O queue (not thread safe).
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
|
@ -0,0 +1,504 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
|
@ -0,0 +1,151 @@
|
|||
#
|
||||
# Include host/target/compiler selection.
|
||||
# This will export CC_NAME, MACHINE_NAME, OS_NAME, and HOST_NAME variables.
|
||||
#
|
||||
include ../../build.mak
|
||||
|
||||
#
|
||||
# Include global compiler specific definitions
|
||||
#
|
||||
include ../../build/cc-$(CC_NAME).mak
|
||||
|
||||
#
|
||||
# (Optionally) Include compiler specific configuration that is
|
||||
# specific to this project. This configuration file is
|
||||
# located in this directory.
|
||||
#
|
||||
-include cc-$(CC_NAME).mak
|
||||
|
||||
#
|
||||
# Include global machine specific definitions
|
||||
#
|
||||
include ../../build/m-$(MACHINE_NAME).mak
|
||||
-include m-$(MACHINE_NAME).mak
|
||||
|
||||
#
|
||||
# Include target OS specific definitions
|
||||
#
|
||||
include ../../build/os-$(OS_NAME).mak
|
||||
|
||||
#
|
||||
# (Optionally) Include target OS specific configuration that is
|
||||
# specific to this project. This configuration file is
|
||||
# located in this directory.
|
||||
#
|
||||
-include os-$(OS_NAME).mak
|
||||
|
||||
#
|
||||
# Include host specific definitions
|
||||
#
|
||||
include ../../build/host-$(HOST_NAME).mak
|
||||
|
||||
#
|
||||
# (Optionally) Include host specific configuration that is
|
||||
# specific to this project. This configuration file is
|
||||
# located in this directory.
|
||||
#
|
||||
-include host-$(HOST_NAME).mak
|
||||
|
||||
#
|
||||
# Include global user configuration, if any
|
||||
#
|
||||
-include ../../user.mak
|
||||
|
||||
|
||||
RULES_MAK := ../../build/rules.mak
|
||||
|
||||
|
||||
export PJLIB_LIB := ../lib/libpj-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME)$(LIBEXT)
|
||||
|
||||
###############################################################################
|
||||
# Gather all flags.
|
||||
#
|
||||
export _CFLAGS := $(CC_CFLAGS) $(OS_CFLAGS) $(HOST_CFLAGS) $(M_CFLAGS) \
|
||||
$(CFLAGS) $(CC_INC)../include
|
||||
export _CXXFLAGS:= $(_CFLAGS) $(CC_CXXFLAGS) $(OS_CXXFLAGS) $(M_CXXFLAGS) \
|
||||
$(HOST_CXXFLAGS) $(CXXFLAGS)
|
||||
export _LDFLAGS := $(subst /,$(HOST_PSEP),$(PJLIB_LIB)) \
|
||||
$(CC_LDFLAGS) $(OS_LDFLAGS) $(M_LDFLAGS) $(HOST_LDFLAGS) \
|
||||
$(LDFLAGS)
|
||||
|
||||
###############################################################################
|
||||
# Defines for building PJLIB library
|
||||
#
|
||||
export PJLIB_SRCDIR = ../src/pj
|
||||
export PJLIB_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \
|
||||
array.o config.o errno.o except.o fifobuf.o guid.o \
|
||||
hash.o list.o lock.o log.o \
|
||||
md5.o pool.o pool_caching.o rand.o \
|
||||
rbtree.o scanner.o string.o stun.o stun_client.o timer.o \
|
||||
types.o xml.o symbols.o
|
||||
export PJLIB_CFLAGS += $(_CFLAGS)
|
||||
|
||||
###############################################################################
|
||||
# Defines for building test application
|
||||
#
|
||||
export TEST_SRCDIR = ../src/pjlib-test
|
||||
export TEST_OBJS += atomic.o echo_clt.o echo_srv.o errno.o exception.o \
|
||||
fifobuf.o \
|
||||
ioq_perf.o ioq_udp.o ioq_tcp.o \
|
||||
list.o mutex.o os.o pool.o pool_perf.o rand.o rbtree.o \
|
||||
select.o sleep.o sock.o sock_perf.o \
|
||||
string.o test.o thread.o timer.o timestamp.o \
|
||||
udp_echo_srv_sync.o \
|
||||
util.o xml.o
|
||||
export TEST_CFLAGS += $(_CFLAGS)
|
||||
export TEST_LDFLAGS += $(_LDFLAGS)
|
||||
export TEST_EXE := ../bin/pjlib-test-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME)$(HOST_EXE)
|
||||
|
||||
|
||||
export CC_OUT CC AR RANLIB HOST_MV HOST_RM HOST_RMDIR HOST_MKDIR OBJEXT LD LDOUT
|
||||
|
||||
###############################################################################
|
||||
# Main entry
|
||||
#
|
||||
# $(TARGET) is defined in os-$(OS_NAME).mak file in current directory.
|
||||
#
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
doc:
|
||||
cd .. && doxygen docs/doxygen.cfg
|
||||
|
||||
print:
|
||||
$(MAKE) -f $(RULES_MAK) APP=PJLIB app=pjlib print_lib
|
||||
$(MAKE) -f $(RULES_MAK) APP=TEST app=pjlib-test print_bin
|
||||
|
||||
depend:
|
||||
$(MAKE) -f $(RULES_MAK) APP=PJLIB app=pjlib depend
|
||||
$(MAKE) -f $(RULES_MAK) APP=TEST app=pjlib-test depend
|
||||
echo '$(TEST_EXE): $(PJLIB_LIB)' >> .pjlib-test-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend
|
||||
|
||||
|
||||
.PHONY: dep depend pjlib pjlib-test clean realclean distclean
|
||||
|
||||
dep: depend
|
||||
|
||||
pjlib:
|
||||
$(MAKE) -f $(RULES_MAK) APP=PJLIB app=pjlib $(PJLIB_LIB)
|
||||
|
||||
pjlib-test:
|
||||
$(MAKE) -f $(RULES_MAK) APP=TEST app=pjlib-test $(TEST_EXE)
|
||||
|
||||
.PHONY: ../lib/pjlib.ko
|
||||
../lib/pjlib.ko:
|
||||
echo Making $@
|
||||
$(MAKE) -f $(RULES_MAK) APP=PJLIB app=pjlib $@
|
||||
|
||||
.PHONY: ../lib/pjlib-test.ko
|
||||
../lib/pjlib-test.ko:
|
||||
$(MAKE) -f $(RULES_MAK) APP=TEST app=pjlib-test $@
|
||||
|
||||
clean:
|
||||
$(MAKE) -f $(RULES_MAK) APP=PJLIB app=pjlib clean
|
||||
$(MAKE) -f $(RULES_MAK) APP=TEST app=pjlib-test clean
|
||||
|
||||
realclean:
|
||||
$(MAKE) -f $(RULES_MAK) APP=PJLIB app=pjlib realclean
|
||||
$(MAKE) -f $(RULES_MAK) APP=TEST app=pjlib-test realclean
|
||||
|
||||
distclean: realclean
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
#
|
||||
# OS specific configuration for Linux Kernel module target.
|
||||
#
|
||||
|
||||
#
|
||||
# PJLIB_OBJS specified here are object files to be included in PJLIB
|
||||
# (the library) for this specific operating system. Object files common
|
||||
# to all operating systems should go in Makefile instead.
|
||||
#
|
||||
export PJLIB_OBJS += compat/sigjmp.o compat/setjmp_i386.o \
|
||||
compat/longjmp_i386.o compat/string.o \
|
||||
addr_resolv_linux_kernel.o \
|
||||
guid_simple.o \
|
||||
log_writer_printk.o pool_policy_kmalloc.o \
|
||||
os_error_linux_kernel.o os_core_linux_kernel.o \
|
||||
os_time_linux_kernel.o os_timestamp_common.o \
|
||||
os_timestamp_linux_kernel.o \
|
||||
sock_linux_kernel.o sock_select.o
|
||||
|
||||
# For IOQueue, we can use either epoll or select
|
||||
export PJLIB_OBJS += ioqueue_epoll.o
|
||||
#export PJLIB_OBJS += ioqueue_select.o
|
||||
|
||||
#
|
||||
# TEST_OBJS are operating system specific object files to be included in
|
||||
# the test application.
|
||||
#
|
||||
export TEST_OBJS += main_mod.o
|
||||
|
||||
#
|
||||
# Additional CFLAGS
|
||||
#
|
||||
export TEST_CFLAGS += -msoft-float
|
||||
|
||||
#
|
||||
# Additional LD_FLAGS for this target.
|
||||
#
|
||||
export TEST_LDFLAGS += -lgcc
|
||||
|
||||
|
||||
#
|
||||
# TARGETS are make targets in the Makefile, to be executed for this given
|
||||
# operating system.
|
||||
#
|
||||
export TARGETS := ../lib/pjlib.ko ../lib/pjlib-test.ko
|
||||
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
#
|
||||
# OS specific configuration for Linux OS target.
|
||||
#
|
||||
|
||||
#
|
||||
# PJLIB_OBJS specified here are object files to be included in PJLIB
|
||||
# (the library) for this specific operating system. Object files common
|
||||
# to all operating systems should go in Makefile instead.
|
||||
#
|
||||
export PJLIB_OBJS += addr_resolv_sock.o guid_simple.o \
|
||||
log_writer_stdout.o os_core_unix.o \
|
||||
os_error_unix.o os_time_ansi.o \
|
||||
os_timestamp_common.o os_timestamp_linux.o \
|
||||
os_time_ansi.o \
|
||||
pool_policy_malloc.o sock_bsd.o sock_select.o
|
||||
|
||||
export PJLIB_OBJS += ioqueue_select.o
|
||||
#export PJLIB_OBJS += ioqueue_epoll.o
|
||||
|
||||
#
|
||||
# TEST_OBJS are operating system specific object files to be included in
|
||||
# the test application.
|
||||
#
|
||||
export TEST_OBJS += main.o
|
||||
|
||||
#
|
||||
# Additional LDFLAGS for pjlib-test
|
||||
#
|
||||
export TEST_LDFLAGS += -lm
|
||||
|
||||
#
|
||||
# TARGETS are make targets in the Makefile, to be executed for this given
|
||||
# operating system.
|
||||
#
|
||||
export TARGETS = pjlib pjlib-test
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
#
|
||||
# OS specific configuration for Win32 OS target.
|
||||
#
|
||||
|
||||
#
|
||||
# PJLIB_OBJS specified here are object files to be included in PJLIB
|
||||
# (the library) for this specific operating system. Object files common
|
||||
# to all operating systems should go in Makefile instead.
|
||||
#
|
||||
export PJLIB_OBJS += addr_resolv_sock.o guid_win32.o ioqueue_winnt.o \
|
||||
log_writer_stdout.o os_core_win32.o \
|
||||
os_error_win32.o os_time_ansi.o os_timestamp_common.o \
|
||||
os_timestamp_win32.o \
|
||||
pool_policy_malloc.o sock_bsd.o sock_select.o
|
||||
|
||||
#
|
||||
# TEST_OBJS are operating system specific object files to be included in
|
||||
# the test application.
|
||||
#
|
||||
export TEST_OBJS += main.o
|
||||
|
||||
#
|
||||
# TARGETS are make targets in the Makefile, to be executed for this given
|
||||
# operating system.
|
||||
#
|
||||
export TARGETS = pjlib pjlib-test
|
||||
|
|
@ -0,0 +1,579 @@
|
|||
# Microsoft Developer Studio Project File - Name="pjlib" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Static Library" 0x0104
|
||||
|
||||
CFG=pjlib - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "pjlib.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "pjlib.mak" CFG="pjlib - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "pjlib - Win32 Release" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE "pjlib - Win32 Debug" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""$/pjproject/pjlib/build", UIAAAAAA"
|
||||
# PROP Scc_LocalPath "."
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "pjlib - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir ".\output\pjlib-i386-win32-vc6-release"
|
||||
# PROP BASE Intermediate_Dir "output\pjlib-i386-win32-vc6-release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "\.output\pjlib-i386-win32-vc6-release"
|
||||
# PROP Intermediate_Dir ".\output\pjlib-i386-win32-vc6-release"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W4 /Zi /O2 /I "../include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "PJ_WIN32" /D "PJ_M_I386" /FR /FD /c
|
||||
# SUBTRACT CPP /YX
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LIB32=link.exe -lib
|
||||
# ADD BASE LIB32 /nologo
|
||||
# ADD LIB32 /nologo /out:"../lib/pjlib-i386-win32-vc6-release.lib"
|
||||
|
||||
!ELSEIF "$(CFG)" == "pjlib - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir ".\output\pjlib-i386-win32-vc6-debug"
|
||||
# PROP BASE Intermediate_Dir ".\output\pjlib-i386-win32-vc6-debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir ".\output\pjlib-i386-win32-vc6-debug"
|
||||
# PROP Intermediate_Dir ".\output\pjlib-i386-win32-vc6-debug"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W4 /Gm /GX /ZI /Od /I "../include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "PJ_WIN32" /D "PJ_M_I386" /FR /FD /GZ /c
|
||||
# SUBTRACT CPP /YX
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LIB32=link.exe -lib
|
||||
# ADD BASE LIB32 /nologo
|
||||
# ADD LIB32 /nologo /out:"../lib/pjlib-i386-win32-vc6-debug.lib"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "pjlib - Win32 Release"
|
||||
# Name "pjlib - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Group "Other Targets"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\addr_resolv_linux_kernel.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\guid_simple.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\ioqueue_dummy.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\ioqueue_epoll.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\log_writer_printk.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_core_linux_kernel.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_core_unix.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_error_linux_kernel.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_error_unix.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_time_linux_kernel.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_timestamp_linux.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_timestamp_linux_kernel.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\pool_policy_kmalloc.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\sock_linux_kernel.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\symbols.c
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\addr_resolv_sock.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\array.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\config.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\equeue_winnt.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\errno.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\except.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\fifobuf.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\guid.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\guid_win32.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\hash.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\ioqueue_select.c
|
||||
|
||||
!IF "$(CFG)" == "pjlib - Win32 Release"
|
||||
|
||||
# PROP Exclude_From_Build 1
|
||||
|
||||
!ELSEIF "$(CFG)" == "pjlib - Win32 Debug"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\ioqueue_winnt.c
|
||||
|
||||
!IF "$(CFG)" == "pjlib - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "pjlib - Win32 Debug"
|
||||
|
||||
# PROP Exclude_From_Build 1
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\list.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\lock.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\log.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\log_writer_stdout.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\md5.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_core_win32.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_error_win32.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_time_ansi.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_timestamp_common.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\os_timestamp_win32.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\pool.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\pool_caching.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\pool_dbg_win32.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\pool_policy_malloc.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\rand.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\rbtree.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\scanner.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\sock_bsd.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\sock_select.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\string.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\stun.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\stun_client.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\timer.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\types.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\src\pj\xml.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Group "compat"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\assert.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\cc_gcc.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\cc_msvc.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\ctype.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\errno.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\high_precision.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\m_alpha.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\m_i386.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\m_m68k.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\malloc.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\os_linux.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\os_linux_kernel.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\os_palmos.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\os_win32.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\rand.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\setjmp.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\size_t.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\socket.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\sprintf.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\stdarg.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\stdfileio.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\string.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\time.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\compat\vsprintf.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\addr_resolv.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\array.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\assert.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\config.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\config_site.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\ctype.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\doxygen.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\equeue.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\errno.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\except.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\fifobuf.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\guid.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\hash.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\ioqueue.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\list.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\lock.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\log.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\md5.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\os.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pjlib.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\pool.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\rand.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\rbtree.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\scanner.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\sock.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\sock_select.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\string.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\stun.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\timer.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\types.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\xml.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Inline Files"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\list_i.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\pool_i.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\include\pj\string_i.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
|
@ -0,0 +1,91 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjlib"=".\pjlib.dsp" - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject-0.3/pjlib/build", EJDAAAAA
|
||||
.
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjlib_samples"=".\pjlib_samples.dsp" - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject-0.3/pjlib/build", EJDAAAAA
|
||||
.
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjlib
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjlib_test"=".\pjlib_test.dsp" - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject-0.3/pjlib/build", EJDAAAAA
|
||||
.
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name pjlib
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "pjlibpp"=".\pjlibpp.dsp" - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject-0.3/pjlib/build", EJDAAAAA
|
||||
.
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
begin source code control
|
||||
"$/pjproject-0.3/pjlib/build", EJDAAAAA
|
||||
.
|
||||
end source code control
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjlib", "pjlib.vcproj", "{07A676B3-6E86-49E5-B20A-394A33B05B28}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjlib_test", "pjlib_test.vcproj", "{CF20BE3E-30FA-4A05-91F2-FF978F8705BF}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{07A676B3-6E86-49E5-B20A-394A33B05B28} = {07A676B3-6E86-49E5-B20A-394A33B05B28}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pjlibpp", "pjlibpp.vcproj", "{488B9CA1-8F59-4E4E-8748-D6A712CF9F3C}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SourceCodeControl) = preSolution
|
||||
SccNumberOfProjects = 4
|
||||
SccProjectUniqueName0 = pjlib.vcproj
|
||||
SccLocalPath0 = ..\\..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection0 = pjlib\\build\\
|
||||
SccProjectName1 = \u0022$/pjproject\u0022,\u0020PIAAAAAA
|
||||
SccLocalPath1 = ..\\..
|
||||
SccProvider1 = MSSCCI:Microsoft\u0020Visual\u0020SourceSafe
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection1 = pjlib\\build\\
|
||||
SolutionUniqueID = {9AAE883A-59C1-4404-A119-28ED201D7215}
|
||||
SccProjectUniqueName2 = pjlib_test.vcproj
|
||||
SccLocalPath2 = ..\\..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection2 = pjlib\\build\\
|
||||
SccProjectUniqueName3 = pjlibpp.vcproj
|
||||
SccLocalPath3 = ..\\..
|
||||
CanCheckoutShared = false
|
||||
SccProjectFilePathRelativizedFromConnection3 = pjlib\\build\\
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionConfiguration) = preSolution
|
||||
Debug = Debug
|
||||
Release = Release
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfiguration) = postSolution
|
||||
{07A676B3-6E86-49E5-B20A-394A33B05B28}.Debug.ActiveCfg = Debug|Win32
|
||||
{07A676B3-6E86-49E5-B20A-394A33B05B28}.Debug.Build.0 = Debug|Win32
|
||||
{07A676B3-6E86-49E5-B20A-394A33B05B28}.Release.ActiveCfg = Release|Win32
|
||||
{07A676B3-6E86-49E5-B20A-394A33B05B28}.Release.Build.0 = Release|Win32
|
||||
{CF20BE3E-30FA-4A05-91F2-FF978F8705BF}.Debug.ActiveCfg = Debug|Win32
|
||||
{CF20BE3E-30FA-4A05-91F2-FF978F8705BF}.Debug.Build.0 = Debug|Win32
|
||||
{CF20BE3E-30FA-4A05-91F2-FF978F8705BF}.Release.ActiveCfg = Release|Win32
|
||||
{CF20BE3E-30FA-4A05-91F2-FF978F8705BF}.Release.Build.0 = Release|Win32
|
||||
{488B9CA1-8F59-4E4E-8748-D6A712CF9F3C}.Debug.ActiveCfg = Debug|Win32
|
||||
{488B9CA1-8F59-4E4E-8748-D6A712CF9F3C}.Debug.Build.0 = Debug|Win32
|
||||
{488B9CA1-8F59-4E4E-8748-D6A712CF9F3C}.Release.ActiveCfg = Release|Win32
|
||||
{488B9CA1-8F59-4E4E-8748-D6A712CF9F3C}.Release.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,609 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="pjlib"
|
||||
ProjectGUID="{72790D99-35BB-45AC-9A23-3BB60C901E63}"
|
||||
SccProjectName=""$/pjproject", PIAAAAAA"
|
||||
SccAuxPath=""
|
||||
SccLocalPath="..\.."
|
||||
SccProvider="MSSCCI:Microsoft Visual SourceSafe">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\output\pjlib_vc7_Debug"
|
||||
IntermediateDirectory=".\output\pjlib_vc7_Debug"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../src"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
PrecompiledHeaderFile=".\output\pjlib_vc7_Debug/pjlib.pch"
|
||||
AssemblerListingLocation=".\output\pjlib_vc7_Debug/"
|
||||
ObjectFile=".\output\pjlib_vc7_Debug/"
|
||||
ProgramDataBaseFileName=".\output\pjlib_vc7_Debug/"
|
||||
BrowseInformation="1"
|
||||
WarningLevel="4"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile="..\lib\pjlib_vc7sd.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\output\pjlib_vc7_Release"
|
||||
IntermediateDirectory=".\output\pjlib_vc7_Release"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="../src"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\output\pjlib_vc7_Release/pjlib.pch"
|
||||
AssemblerListingLocation=".\output\pjlib_vc7_Release/"
|
||||
ObjectFile=".\output\pjlib_vc7_Release/"
|
||||
ProgramDataBaseFileName=".\output\pjlib_vc7_Release/"
|
||||
BrowseInformation="1"
|
||||
WarningLevel="4"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="3"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile="..\lib\pjlib_vc7s.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="..\src\pj\array.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\config.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\except.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\fifobuf.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\guid.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\hash.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\ioqueue_select.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\ioqueue_winnt.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\list.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\log.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\log_stdout.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\md5.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\os_win32.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\pool.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\pool_caching.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\pool_dbg_win32.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\pool_policy.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\rbtree.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\scanner.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\sock.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\string.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\stun.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\stun_client.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\timer.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\types.c">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\xml.c">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="..\src\pj\array.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\compat.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\config.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\except.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\fifobuf.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\guid.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\hash.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\ioqueue.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\list.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\log.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\md5.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\os.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pjlib.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\pool.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\rbtree.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\scanner.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\sock.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\string.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\stun.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\timer.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\types.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\xml.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Inline Files"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\src\pj\array_i.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\list_i.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\pool_i.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\scanner_i.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\sock_i.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\string_i.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj\timer_i.h">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
|
@ -0,0 +1,113 @@
|
|||
# Microsoft Developer Studio Project File - Name="pjlib_samples" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) External Target" 0x0106
|
||||
|
||||
CFG=pjlib_samples - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "pjlib_samples.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "pjlib_samples.mak" CFG="pjlib_samples - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "pjlib_samples - Win32 Release" (based on "Win32 (x86) External Target")
|
||||
!MESSAGE "pjlib_samples - Win32 Debug" (based on "Win32 (x86) External Target")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""$/pjproject-0.3/pjlib/build", EJDAAAAA"
|
||||
# PROP Scc_LocalPath "."
|
||||
|
||||
!IF "$(CFG)" == "pjlib_samples - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "./output/pjlib-samples-i386-win32-vc6-release"
|
||||
# PROP BASE Intermediate_Dir "./output/pjlib-samples-i386-win32-vc6-release"
|
||||
# PROP BASE Cmd_Line "NMAKE /f pjlib_samples.mak"
|
||||
# PROP BASE Rebuild_Opt "/a"
|
||||
# PROP BASE Target_File "pjlib_samples.exe"
|
||||
# PROP BASE Bsc_Name "pjlib_samples.bsc"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "./output/pjlib-samples-i386-win32-vc6-release"
|
||||
# PROP Intermediate_Dir "./output/pjlib-samples-i386-win32-vc6-release"
|
||||
# PROP Cmd_Line "nmake /f "pjlib_samples.mak" MODE=release"
|
||||
# PROP Rebuild_Opt "/a"
|
||||
# PROP Target_File "pjlib samples"
|
||||
# PROP Bsc_Name ""
|
||||
# PROP Target_Dir ""
|
||||
|
||||
!ELSEIF "$(CFG)" == "pjlib_samples - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "./output/pjlib-samples-i386-win32-vc6-debug"
|
||||
# PROP BASE Intermediate_Dir "./output/pjlib-samples-i386-win32-vc6-debug"
|
||||
# PROP BASE Cmd_Line "NMAKE /f pjlib_samples.mak"
|
||||
# PROP BASE Rebuild_Opt "/a"
|
||||
# PROP BASE Target_File "pjlib_samples.exe"
|
||||
# PROP BASE Bsc_Name "pjlib_samples.bsc"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "./output/pjlib-samples-i386-win32-vc6-debug"
|
||||
# PROP Intermediate_Dir "./output/pjlib-samples-i386-win32-vc6-debug"
|
||||
# PROP Cmd_Line "nmake /nologo /f "pjlib_samples.mak" MODE=debug"
|
||||
# PROP Rebuild_Opt "/a"
|
||||
# PROP Target_File "pjlib samples"
|
||||
# PROP Bsc_Name ""
|
||||
# PROP Target_Dir ""
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "pjlib_samples - Win32 Release"
|
||||
# Name "pjlib_samples - Win32 Debug"
|
||||
|
||||
!IF "$(CFG)" == "pjlib_samples - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "pjlib_samples - Win32 Debug"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-samples\except.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-samples\list.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-samples\log.c"
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\pjlib_samples.mak
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
|
@ -0,0 +1,35 @@
|
|||
OUTDIR=.\output\pjlib-samples-i386-win32-vc6-$(MODE)
|
||||
|
||||
SRCDIR=../src/pjlib-samples
|
||||
|
||||
SAMPLES=$(OUTDIR)/except.exe \
|
||||
$(OUTDIR)/log.exe \
|
||||
$(OUTDIR)/list.exe \
|
||||
|
||||
!IF "$(MODE)" == "debug"
|
||||
MODE_CFLAGS=/MTd
|
||||
!ELSE
|
||||
MODE_CFLAGS=/MT
|
||||
!ENDIF
|
||||
|
||||
CFLAGS=/nologo /W4 $(MODE_CFLAGS) /DPJ_WIN32=1 /DPJ_M_I386=1 /I../include
|
||||
|
||||
PJLIB=../lib/pjlib-i386-win32-vc6-$(MODE).lib
|
||||
|
||||
DEPEND=$(PJLIB)
|
||||
LIBS=netapi32.lib mswsock.lib ws2_32.lib ole32.lib
|
||||
CL=cl.exe
|
||||
|
||||
all: "$(OUTDIR)" $(SAMPLES)
|
||||
|
||||
$(SAMPLES): "$(SRCDIR)/$(@B).c" $(DEPEND)
|
||||
$(CL) /Fe$@ \
|
||||
/Fo$(@R).obj \
|
||||
$(CFLAGS) \
|
||||
$** $(LIBS)
|
||||
|
||||
"$(OUTDIR)" :
|
||||
@IF NOT EXIST "$(OUTDIR)" MKDIR "$(OUTDIR)"
|
||||
|
||||
clean :
|
||||
@IF EXIST "$(OUTDIR)" DEL /Q "$(OUTDIR)\*.*" && RMDIR "$(OUTDIR)"
|
|
@ -0,0 +1,223 @@
|
|||
# Microsoft Developer Studio Project File - Name="pjlib_test" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
||||
|
||||
CFG=pjlib_test - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "pjlib_test.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "pjlib_test.mak" CFG="pjlib_test - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "pjlib_test - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "pjlib_test - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""$/pjproject/pjlib/build", UIAAAAAA"
|
||||
# PROP Scc_LocalPath "."
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "pjlib_test - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir ".\output\pjlib-test-i386-win32-vc6-release"
|
||||
# PROP BASE Intermediate_Dir ".\output\pjlib-test-i386-win32-vc6-release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir ".\output\pjlib-test-i386-win32-vc6-release"
|
||||
# PROP Intermediate_Dir ".\output\pjlib-test-i386-win32-vc6-release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W4 /GX /Zi /O2 /I "../include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "PJ_WIN32" /D "PJ_M_I386" /FR /YX /FD /c
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 netapi32.lib mswsock.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"../bin/pjlib-test-i386-win32-vc6-release.exe"
|
||||
|
||||
!ELSEIF "$(CFG)" == "pjlib_test - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir ".\output\pjlib-test-i386-win32-vc6-debug"
|
||||
# PROP BASE Intermediate_Dir ".\output\pjlib-test-i386-win32-vc6-debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir ".\output\pjlib-test-i386-win32-vc6-debug"
|
||||
# PROP Intermediate_Dir ".\output\pjlib-test-i386-win32-vc6-debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W4 /Gm /GX /ZI /Od /I "../include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "PJ_WIN32" /D "PJ_M_I386" /FR /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 netapi32.lib mswsock.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"../bin/pjlib-test-i386-win32-vc6-debug.exe" /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "pjlib_test - Win32 Release"
|
||||
# Name "pjlib_test - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\atomic.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\echo_clt.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\echo_srv.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\errno.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\exception.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\fifobuf.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\ioq_perf.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\ioq_tcp.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\ioq_udp.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\list.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\main.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\main_mod.c"
|
||||
# PROP Exclude_From_Build 1
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\mutex.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\os.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\pool.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\pool_perf.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\rand.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\rbtree.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\select.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\sleep.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\sock.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\sock_perf.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\string.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\test.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\thread.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\timer.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\timestamp.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\udp_echo_srv_sync.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\util.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\xml.c"
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib-test\test.h"
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
|
@ -0,0 +1,416 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="pjlib_test"
|
||||
ProjectGUID="{A684A4C0-00D6-4497-B144-FC6AED4FAD8A}"
|
||||
SccProjectName=""$/pjproject", PIAAAAAA"
|
||||
SccAuxPath=""
|
||||
SccLocalPath="..\.."
|
||||
SccProvider="MSSCCI:Microsoft Visual SourceSafe">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\output\pjlib_test_vc7_Debug"
|
||||
IntermediateDirectory=".\output\pjlib_test_vc7_Debug"
|
||||
ConfigurationType="1"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../src"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\output\pjlib_test_vc7_Debug/pjlib_test.pch"
|
||||
AssemblerListingLocation=".\output\pjlib_test_vc7_Debug/"
|
||||
ObjectFile=".\output\pjlib_test_vc7_Debug/"
|
||||
ProgramDataBaseFileName=".\output\pjlib_test_vc7_Debug/"
|
||||
BrowseInformation="1"
|
||||
WarningLevel="4"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="netapi32.lib mswsock.lib ws2_32.lib odbc32.lib odbccp32.lib"
|
||||
OutputFile="..\bin\pjlib_test_vc7d.exe"
|
||||
LinkIncremental="2"
|
||||
SuppressStartupBanner="TRUE"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\output\pjlib_test_vc7_Debug/pjlib_test.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
TypeLibraryName=".\output\pjlib_test_vc7_Debug/pjlib_test.tlb"
|
||||
HeaderFileName=""/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\output\pjlib_test_vc7_Release"
|
||||
IntermediateDirectory=".\output\pjlib_test_vc7_Release"
|
||||
ConfigurationType="1"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="../src"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\output\pjlib_test_vc7_Release/pjlib_test.pch"
|
||||
AssemblerListingLocation=".\output\pjlib_test_vc7_Release/"
|
||||
ObjectFile=".\output\pjlib_test_vc7_Release/"
|
||||
ProgramDataBaseFileName=".\output\pjlib_test_vc7_Release/"
|
||||
BrowseInformation="1"
|
||||
WarningLevel="4"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="3"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="netapi32.lib mswsock.lib ws2_32.lib odbc32.lib odbccp32.lib"
|
||||
OutputFile="../bin/pjlib_test_vc7.exe"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\output\pjlib_test_vc7_Release/pjlib_test.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
TypeLibraryName=".\output\pjlib_test_vc7_Release/pjlib_test.tlb"
|
||||
HeaderFileName=""/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="..\src\test\exception_test.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\test\fifobuf_test.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\test\ioqueue_test.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\test\ioqueue_test_tcp.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\test\ioqueue_test_udp.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\test\list_test.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\test\main.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\test\os_test.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\test\pool_test.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\test\rbtree_test.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\test\timer_test.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BrowseInformation="1"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\test\xml_test.cpp">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="..\src\test\libpj_test.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Test Files"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\src\test\pidf-diff.xml">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
|
@ -0,0 +1,158 @@
|
|||
# Microsoft Developer Studio Project File - Name="pjlibpp" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Static Library" 0x0104
|
||||
|
||||
CFG=pjlibpp - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "pjlibpp.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "pjlibpp.mak" CFG="pjlibpp - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "pjlibpp - Win32 Release" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE "pjlibpp - Win32 Debug" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""$/pjproject/pjlib/build", UIAAAAAA"
|
||||
# PROP Scc_LocalPath "."
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "pjlibpp - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir ".\output\pjlibpp-i386-win32-vc6-release"
|
||||
# PROP BASE Intermediate_Dir ".\output\pjlibpp-i386-win32-vc6-release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir ".\output\pjlibpp-i386-win32-vc6-release"
|
||||
# PROP Intermediate_Dir ".\output\pjlibpp-i386-win32-vc6-release"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "../src" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "PJ_WIN32" /D "PJ_M_I386" /FD /c
|
||||
# SUBTRACT CPP /YX
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LIB32=link.exe -lib
|
||||
# ADD BASE LIB32 /nologo
|
||||
# ADD LIB32 /nologo /out:"../lib/pjlibp_vc6s.lib"
|
||||
|
||||
!ELSEIF "$(CFG)" == "pjlibpp - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir ".\output\pjlibpp-i386-win32-vc6-debug"
|
||||
# PROP BASE Intermediate_Dir ".\output\pjlibpp-i386-win32-vc6-debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir ".\output\pjlibpp-i386-win32-vc6-debug"
|
||||
# PROP Intermediate_Dir ".\output\pjlibpp-i386-win32-vc6-debug"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../src" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "PJ_WIN32" /D "PJ_M_I386" /FD /GZ /c
|
||||
# SUBTRACT CPP /YX
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LIB32=link.exe -lib
|
||||
# ADD BASE LIB32 /nologo
|
||||
# ADD LIB32 /nologo /out:"../lib/pjlibp_vc6sd.lib"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "pjlibpp - Win32 Release"
|
||||
# Name "pjlibpp - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\compiletest.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\pj++.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\proactor.cpp"
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\hash.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\ioqueue.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\list.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\os.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pjlib++.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\pool.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\proactor.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\scanner.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\sock.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\string.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\timer.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\tree.hpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="..\src\pj++\types.hpp"
|
||||
# End Source File
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
|
@ -0,0 +1,223 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="pjlibpp"
|
||||
ProjectGUID="{488B9CA1-8F59-4E4E-8748-D6A712CF9F3C}"
|
||||
SccProjectName=""$/pjproject", PIAAAAAA"
|
||||
SccAuxPath=""
|
||||
SccLocalPath="..\.."
|
||||
SccProvider="MSSCCI:Microsoft Visual SourceSafe">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\output\pjlibpp_vc7_Release"
|
||||
IntermediateDirectory=".\output\pjlibpp_vc7_Release"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="../src"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\output\pjlibpp_vc7_Release/pjlibpp.pch"
|
||||
AssemblerListingLocation=".\output\pjlibpp_vc7_Release/"
|
||||
ObjectFile=".\output\pjlibpp_vc7_Release/"
|
||||
ProgramDataBaseFileName=".\output\pjlibpp_vc7_Release/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile="..\lib\pjlibpp_vc7s.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\output\pjlibpp_vc7_Debug"
|
||||
IntermediateDirectory=".\output\pjlibpp_vc7_Debug"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../src"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\output\pjlibpp_vc7_Debug/pjlibpp.pch"
|
||||
AssemblerListingLocation=".\output\pjlibpp_vc7_Debug/"
|
||||
ObjectFile=".\output\pjlibpp_vc7_Debug/"
|
||||
ProgramDataBaseFileName=".\output\pjlibpp_vc7_Debug/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile="..\lib\pjlibpp_vc7sd.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="..\src\pj++\compiletest.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
AssemblerOutput="4"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\pj++.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\proactor.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="..\src\pj++\hash.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\ioqueue.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\list.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\os.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\pool.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\proactor.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\scanner.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\sock.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\string.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\timer.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\tree.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\pj++\types.hpp">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,305 @@
|
|||
BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {
|
||||
font-family: Geneva, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
BODY,TD {
|
||||
font-size: 80%;
|
||||
}
|
||||
CODE {
|
||||
font-size: 120%;
|
||||
font-family: monospace;
|
||||
}
|
||||
.fragment, pre {
|
||||
font-size: 110%;
|
||||
font-family: monospace;
|
||||
}
|
||||
H1 {
|
||||
text-align: center;
|
||||
font-size: 240%;
|
||||
}
|
||||
H2 {
|
||||
font-size: 200%;
|
||||
margin-top : 60px;
|
||||
}
|
||||
H3 {
|
||||
font-size: 160%;
|
||||
}
|
||||
H4 {
|
||||
font-size: 120%;
|
||||
}
|
||||
CAPTION { font-weight: bold }
|
||||
DIV.qindex {
|
||||
width: 100%;
|
||||
background-color: #eeeeff;
|
||||
border: 1px solid #b0b0b0;
|
||||
text-align: center;
|
||||
margin: 2px;
|
||||
padding: 2px;
|
||||
line-height: 140%;
|
||||
}
|
||||
DIV.nav {
|
||||
width: 100%;
|
||||
background-color: #eeeeff;
|
||||
border: 1px solid #b0b0b0;
|
||||
text-align: center;
|
||||
margin: 2px;
|
||||
padding: 2px;
|
||||
line-height: 140%;
|
||||
}
|
||||
A.qindex {
|
||||
text-decoration: none;
|
||||
font-size: 120%;
|
||||
color: #1A419D;
|
||||
}
|
||||
A.qindex:visited {
|
||||
text-decoration: none;
|
||||
color: #1A419D
|
||||
}
|
||||
A.qindex:hover {
|
||||
text-decoration: none;
|
||||
background-color: #ddddff;
|
||||
}
|
||||
A.qindexHL {
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
background-color: #6666cc;
|
||||
color: #ffffff;
|
||||
border: 1px double #9295C2;
|
||||
}
|
||||
A.qindexHL:hover {
|
||||
text-decoration: none;
|
||||
background-color: #6666cc;
|
||||
color: #ffffff;
|
||||
}
|
||||
A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff }
|
||||
A.el { text-decoration: none; font-weight: bold }
|
||||
A.elRef { font-weight: bold }
|
||||
A.code:link { text-decoration: none; font-weight: normal; color: #0000FF; }
|
||||
A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF}
|
||||
A.codeRef:link { font-weight: normal; color: #0000FF}
|
||||
A.codeRef:visited { font-weight: normal; color: #0000FF}
|
||||
A:hover { text-decoration: none; background-color: #f2f2ff }
|
||||
DL.el { margin-left: -1cm }
|
||||
PRE.fragment {
|
||||
border: 1px solid #CCCCCC;
|
||||
background-color: #f5f5f5;
|
||||
margin-top: 4px;
|
||||
margin-bottom: 4px;
|
||||
margin-left: 2px;
|
||||
margin-right: 8px;
|
||||
padding-left: 6px;
|
||||
padding-right: 6px;
|
||||
padding-top: 4px;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }
|
||||
TD.md { background-color: #F4F4FB; font-weight: bold; }
|
||||
TD.mdPrefix {
|
||||
background-color: #F4F4FB;
|
||||
color: #606060;
|
||||
font-size: 80%;
|
||||
}
|
||||
TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; }
|
||||
TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; }
|
||||
DIV.groupHeader {
|
||||
margin-left: 16px;
|
||||
margin-top: 12px;
|
||||
margin-bottom: 6px;
|
||||
font-weight: bold;
|
||||
}
|
||||
DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% }
|
||||
BODY {
|
||||
background: white;
|
||||
color: black;
|
||||
margin-right: 20px;
|
||||
margin-left: 20px;
|
||||
}
|
||||
TD.indexkey {
|
||||
background-color: #eeeeff;
|
||||
font-weight: bold;
|
||||
padding-right : 10px;
|
||||
padding-top : 2px;
|
||||
padding-left : 10px;
|
||||
padding-bottom : 2px;
|
||||
margin-left : 0px;
|
||||
margin-right : 0px;
|
||||
margin-top : 2px;
|
||||
margin-bottom : 2px;
|
||||
border: 1px solid #CCCCCC;
|
||||
}
|
||||
TD.indexvalue {
|
||||
background-color: #eeeeff;
|
||||
font-style: italic;
|
||||
padding-right : 10px;
|
||||
padding-top : 2px;
|
||||
padding-left : 10px;
|
||||
padding-bottom : 2px;
|
||||
margin-left : 0px;
|
||||
margin-right : 0px;
|
||||
margin-top : 2px;
|
||||
margin-bottom : 2px;
|
||||
border: 1px solid #CCCCCC;
|
||||
}
|
||||
TR.memlist {
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
P.formulaDsp { text-align: center; }
|
||||
IMG.formulaDsp { }
|
||||
IMG.formulaInl { vertical-align: middle; }
|
||||
SPAN.keyword { color: #008000 }
|
||||
SPAN.keywordtype { color: #604020 }
|
||||
SPAN.keywordflow { color: #e08000 }
|
||||
SPAN.comment { color: #800000 }
|
||||
SPAN.preprocessor { color: #806020 }
|
||||
SPAN.stringliteral { color: #002080 }
|
||||
SPAN.charliteral { color: #008080 }
|
||||
.mdTable {
|
||||
border: 1px solid #868686;
|
||||
background-color: #F4F4FB;
|
||||
}
|
||||
.mdRow {
|
||||
padding: 8px 10px;
|
||||
}
|
||||
.mdescLeft {
|
||||
padding: 0px 8px 4px 8px;
|
||||
font-size: 80%;
|
||||
font-style: italic;
|
||||
background-color: #FAFAFA;
|
||||
border-top: 1px none #E0E0E0;
|
||||
border-right: 1px none #E0E0E0;
|
||||
border-bottom: 1px none #E0E0E0;
|
||||
border-left: 1px none #E0E0E0;
|
||||
margin: 0px;
|
||||
}
|
||||
.mdescRight {
|
||||
padding: 0px 8px 4px 8px;
|
||||
font-size: 80%;
|
||||
font-style: italic;
|
||||
background-color: #FAFAFA;
|
||||
border-top: 1px none #E0E0E0;
|
||||
border-right: 1px none #E0E0E0;
|
||||
border-bottom: 1px none #E0E0E0;
|
||||
border-left: 1px none #E0E0E0;
|
||||
margin: 0px;
|
||||
}
|
||||
.memItemLeft {
|
||||
padding: 1px 0px 0px 8px;
|
||||
margin: 4px;
|
||||
border-top-width: 1px;
|
||||
border-right-width: 1px;
|
||||
border-bottom-width: 1px;
|
||||
border-left-width: 1px;
|
||||
border-top-color: #E0E0E0;
|
||||
border-right-color: #E0E0E0;
|
||||
border-bottom-color: #E0E0E0;
|
||||
border-left-color: #E0E0E0;
|
||||
border-top-style: solid;
|
||||
border-right-style: none;
|
||||
border-bottom-style: none;
|
||||
border-left-style: none;
|
||||
background-color: #FAFAFA;
|
||||
font-size: 80%;
|
||||
}
|
||||
.memItemRight {
|
||||
padding: 1px 8px 0px 8px;
|
||||
margin: 4px;
|
||||
border-top-width: 1px;
|
||||
border-right-width: 1px;
|
||||
border-bottom-width: 1px;
|
||||
border-left-width: 1px;
|
||||
border-top-color: #E0E0E0;
|
||||
border-right-color: #E0E0E0;
|
||||
border-bottom-color: #E0E0E0;
|
||||
border-left-color: #E0E0E0;
|
||||
border-top-style: solid;
|
||||
border-right-style: none;
|
||||
border-bottom-style: none;
|
||||
border-left-style: none;
|
||||
background-color: #FAFAFA;
|
||||
font-size: 80%;
|
||||
}
|
||||
.memTemplItemLeft {
|
||||
padding: 1px 0px 0px 8px;
|
||||
margin: 4px;
|
||||
border-top-width: 1px;
|
||||
border-right-width: 1px;
|
||||
border-bottom-width: 1px;
|
||||
border-left-width: 1px;
|
||||
border-top-color: #E0E0E0;
|
||||
border-right-color: #E0E0E0;
|
||||
border-bottom-color: #E0E0E0;
|
||||
border-left-color: #E0E0E0;
|
||||
border-top-style: none;
|
||||
border-right-style: none;
|
||||
border-bottom-style: none;
|
||||
border-left-style: none;
|
||||
background-color: #FAFAFA;
|
||||
font-size: 80%;
|
||||
}
|
||||
.memTemplItemRight {
|
||||
padding: 1px 8px 0px 8px;
|
||||
margin: 4px;
|
||||
border-top-width: 1px;
|
||||
border-right-width: 1px;
|
||||
border-bottom-width: 1px;
|
||||
border-left-width: 1px;
|
||||
border-top-color: #E0E0E0;
|
||||
border-right-color: #E0E0E0;
|
||||
border-bottom-color: #E0E0E0;
|
||||
border-left-color: #E0E0E0;
|
||||
border-top-style: none;
|
||||
border-right-style: none;
|
||||
border-bottom-style: none;
|
||||
border-left-style: none;
|
||||
background-color: #FAFAFA;
|
||||
font-size: 80%;
|
||||
}
|
||||
.memTemplParams {
|
||||
padding: 1px 0px 0px 8px;
|
||||
margin: 4px;
|
||||
border-top-width: 1px;
|
||||
border-right-width: 1px;
|
||||
border-bottom-width: 1px;
|
||||
border-left-width: 1px;
|
||||
border-top-color: #E0E0E0;
|
||||
border-right-color: #E0E0E0;
|
||||
border-bottom-color: #E0E0E0;
|
||||
border-left-color: #E0E0E0;
|
||||
border-top-style: solid;
|
||||
border-right-style: none;
|
||||
border-bottom-style: none;
|
||||
border-left-style: none;
|
||||
color: #606060;
|
||||
background-color: #FAFAFA;
|
||||
font-size: 80%;
|
||||
}
|
||||
.search { color: #003399;
|
||||
font-weight: bold;
|
||||
}
|
||||
FORM.search {
|
||||
margin-bottom: 0px;
|
||||
margin-top: 0px;
|
||||
}
|
||||
INPUT.search { font-size: 75%;
|
||||
color: #000080;
|
||||
font-weight: normal;
|
||||
background-color: #eeeeff;
|
||||
}
|
||||
TD.tiny { font-size: 75%;
|
||||
}
|
||||
a {
|
||||
color: #252E78;
|
||||
}
|
||||
a:visited {
|
||||
color: #3D2185;
|
||||
}
|
||||
.dirtab { padding: 4px;
|
||||
border-collapse: collapse;
|
||||
border: 1px solid #b0b0b0;
|
||||
}
|
||||
TH.dirtab { background: #eeeeff;
|
||||
font-weight: bold;
|
||||
}
|
||||
HR { height: 1px;
|
||||
border: none;
|
||||
border-top: 1px solid black;
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
</TD></TR>
|
||||
</TABLE>
|
||||
</BODY>
|
||||
</HTML>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
|
||||
<title>PJLIB Documentation</title>
|
||||
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
||||
</head><body>
|
||||
<A HREF="/"><-- HOME</A><HR>
|
||||
|
||||
<TABLE border="0">
|
||||
<TR><TD width="600" align="left">
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/addr_resolv.h 2 10/14/05 12:25a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_ADDR_RESOLV_H__
|
||||
#define __PJ_ADDR_RESOLV_H__
|
||||
|
||||
/**
|
||||
* @file addr_resolv.h
|
||||
* @brief Address resolve (pj_gethostbyname()).
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup pj_addr_resolve Address Resolution
|
||||
* @ingroup PJ_IO
|
||||
* @{
|
||||
*
|
||||
* This module provides function to resolve Internet address of the
|
||||
* specified host name. To resolve a particular host name, application
|
||||
* can just call #pj_gethostbyname().
|
||||
*
|
||||
* Example:
|
||||
* <pre>
|
||||
* ...
|
||||
* pj_hostent he;
|
||||
* pj_status_t rc;
|
||||
* pj_str_t host = pj_str("host.example.com");
|
||||
*
|
||||
* rc = pj_gethostbyname( &host, &he);
|
||||
* if (rc != PJ_SUCCESS) {
|
||||
* char errbuf[80];
|
||||
* pj_strerror( rc, errbuf, sizeof(errbuf));
|
||||
* PJ_LOG(2,("sample", "Unable to resolve host, error=%s", errbuf));
|
||||
* return rc;
|
||||
* }
|
||||
*
|
||||
* // process address...
|
||||
* addr.sin_addr.s_addr = *(pj_uint32_t*)he.h_addr;
|
||||
* ...
|
||||
* </pre>
|
||||
*
|
||||
* It's pretty simple really...
|
||||
*/
|
||||
|
||||
/** This structure describes an Internet host address. */
|
||||
typedef struct pj_hostent
|
||||
{
|
||||
char *h_name; /**< The official name of the host. */
|
||||
char **h_aliases; /**< Aliases list. */
|
||||
int h_addrtype; /**< Host address type. */
|
||||
int h_length; /**< Length of address. */
|
||||
char **h_addr_list; /**< List of addresses. */
|
||||
} pj_hostent;
|
||||
|
||||
/** Shortcut to h_addr_list[0] */
|
||||
#define h_addr h_addr_list[0]
|
||||
|
||||
/**
|
||||
* This function fills the structure of type pj_hostent for a given host name.
|
||||
*
|
||||
* @param name Host name, or IPv4 or IPv6 address in standard dot notation.
|
||||
* @param he The pj_hostent structure to be filled.
|
||||
*
|
||||
* @return PJ_SUCCESS, or the appropriate error codes.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_gethostbyname(const pj_str_t *name, pj_hostent *he);
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_ADDR_RESOLV_H__ */
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/array.h 7 10/14/05 12:25a Bennylp $ */
|
||||
#ifndef __PJ_ARRAY_H__
|
||||
#define __PJ_ARRAY_H__
|
||||
|
||||
/**
|
||||
* @file array.h
|
||||
* @brief PJLIB Array helper.
|
||||
*/
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_ARRAY Array helper.
|
||||
* @ingroup PJ_DS
|
||||
* @{
|
||||
*
|
||||
* This module provides helper to manipulate array of elements of any size.
|
||||
* It provides most used array operations such as insert, erase, and search.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Insert value to the array at the given position, and rearrange the
|
||||
* remaining nodes after the position.
|
||||
*
|
||||
* @param array the array.
|
||||
* @param elem_size the size of the individual element.
|
||||
* @param count the current number of elements in the array.
|
||||
* @param pos the position where the new element is put.
|
||||
* @param value the value to copy to the new element.
|
||||
*/
|
||||
PJ_DECL(void) pj_array_insert( void *array,
|
||||
unsigned elem_size,
|
||||
unsigned count,
|
||||
unsigned pos,
|
||||
const void *value);
|
||||
|
||||
/**
|
||||
* Erase a value from the array at given position, and rearrange the remaining
|
||||
* elements post the erased element.
|
||||
*
|
||||
* @param array the array.
|
||||
* @param elem_size the size of the individual element.
|
||||
* @param count the current number of elements in the array.
|
||||
* @param pos the index/position to delete.
|
||||
*/
|
||||
PJ_DECL(void) pj_array_erase( void *array,
|
||||
unsigned elem_size,
|
||||
unsigned count,
|
||||
unsigned pos);
|
||||
|
||||
/**
|
||||
* Search the first value in the array according to matching function.
|
||||
*
|
||||
* @param array the array.
|
||||
* @param elem_size the individual size of the element.
|
||||
* @param count the number of elements.
|
||||
* @param matching the matching function, which MUST return PJ_SUCCESS if
|
||||
* the specified element match.
|
||||
* @param result the pointer to the value found.
|
||||
*
|
||||
* @return PJ_SUCCESS if value is found, otherwise the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_array_find( const void *array,
|
||||
unsigned elem_size,
|
||||
unsigned count,
|
||||
pj_status_t (*matching)(const void *value),
|
||||
void **result);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
|
||||
#endif /* __PJ_ARRAY_H__ */
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/assert.h 4 10/14/05 12:25a Bennylp $ */
|
||||
#ifndef __PJ_ASSERT_H__
|
||||
#define __PJ_ASSERT_H__
|
||||
|
||||
/**
|
||||
* @file assert.h
|
||||
* @brief Assertion macro pj_assert().
|
||||
*/
|
||||
|
||||
#include <pj/config.h>
|
||||
#include <pj/compat/assert.h>
|
||||
|
||||
/**
|
||||
* @defgroup pj_assert Assertion Macro
|
||||
* @ingroup PJ_MISC
|
||||
* @{
|
||||
*
|
||||
* Assertion and other helper macros for sanity checking.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Check during debug build that an expression is true. If the expression
|
||||
* computes to false during run-time, then the program will stop at the
|
||||
* offending statements.
|
||||
* For release build, this macro will not do anything.
|
||||
*
|
||||
* @param expr The expression to be evaluated.
|
||||
*/
|
||||
#define pj_assert(expr) assert(expr)
|
||||
|
||||
|
||||
/**
|
||||
* @hideinitializer
|
||||
* If #PJ_ENABLE_EXTRA_CHECK is declared and non-zero, then
|
||||
* #PJ_ASSERT_RETURN macro will evaluate the expression in @a expr during
|
||||
* run-time. If the expression yields false, assertion will be triggered
|
||||
* and the current function will return with the specified return value.
|
||||
*
|
||||
* If #PJ_ENABLE_EXTRA_CHECK is not declared or is zero, then no run-time
|
||||
* checking will be performed. The macro simply evaluates to pj_assert(expr).
|
||||
*/
|
||||
#if defined(PJ_ENABLE_EXTRA_CHECK) && PJ_ENABLE_EXTRA_CHECK != 0
|
||||
# define PJ_ASSERT_RETURN(expr,retval) \
|
||||
do { \
|
||||
pj_assert(expr); \
|
||||
if (!(expr)) return retval; \
|
||||
} while (0)
|
||||
#else
|
||||
# define PJ_ASSERT_RETURN(expr,retval) pj_assert(expr)
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* __PJ_ASSERT_H__ */
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/assert.h 3 9/22/05 10:31a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/assert.h $
|
||||
*
|
||||
* 3 9/22/05 10:31a Bennylp
|
||||
* Moving all *.h files to include/.
|
||||
*
|
||||
* 2 9/21/05 1:39p Bennylp
|
||||
* Periodic checkin for backup.
|
||||
*
|
||||
* 1 9/17/05 10:36a Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_ASSERT_H__
|
||||
#define __PJ_COMPAT_ASSERT_H__
|
||||
|
||||
/**
|
||||
* @file assert.h
|
||||
* @brief Provides assert() macro.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_ASSERT_H) && PJ_HAS_ASSERT_H != 0
|
||||
# include <assert.h>
|
||||
|
||||
#elif defined(PJ_LINUX_KERNEL) && PJ_LINUX_KERNEL != 0
|
||||
# define assert(expr) do { \
|
||||
if (!(expr)) \
|
||||
printk("!!ASSERTION FAILED: [%s:%d] \"" #expr "\"\n",\
|
||||
__FILE__, __LINE__); \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
# warning "assert() is not implemented"
|
||||
# define assert(expr)
|
||||
#endif
|
||||
|
||||
#endif /* __PJ_COMPAT_ASSERT_H__ */
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/cc_gcc.h 2 9/17/05 10:37a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/cc_gcc.h $
|
||||
*
|
||||
* 2 9/17/05 10:37a Bennylp
|
||||
* Major reorganization towards version 0.3.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_CC_GCC_H__
|
||||
#define __PJ_COMPAT_CC_GCC_H__
|
||||
|
||||
/**
|
||||
* @file cc_gcc.h
|
||||
* @brief Describes GCC compiler specifics.
|
||||
*/
|
||||
|
||||
#ifndef __GNUC__
|
||||
# error "This file is only for gcc!"
|
||||
#endif
|
||||
|
||||
#define PJ_INLINE_SPECIFIER static inline
|
||||
#define PJ_THREAD_FUNC
|
||||
#define PJ_NORETURN
|
||||
#define PJ_ATTR_NORETURN __attribute__ ((noreturn))
|
||||
|
||||
#define PJ_HAS_INT64 1
|
||||
|
||||
typedef long long pj_int64_t;
|
||||
typedef unsigned long long pj_uint64_t;
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_CC_GCC_H__ */
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/cc_msvc.h 3 10/14/05 12:26a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/include/pj/compat/cc_msvc.h $
|
||||
*
|
||||
* 3 10/14/05 12:26a Bennylp
|
||||
* Finished error code framework, some fixes in ioqueue, etc. Pretty
|
||||
* major.
|
||||
*
|
||||
* 2 9/17/05 10:37a Bennylp
|
||||
* Major reorganization towards version 0.3.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_CC_MSVC_H__
|
||||
#define __PJ_COMPAT_CC_MSVC_H__
|
||||
|
||||
/**
|
||||
* @file cc_msvc.h
|
||||
* @brief Describes Microsoft Visual C compiler specifics.
|
||||
*/
|
||||
|
||||
#ifndef _MSC_VER
|
||||
# error "This header file is only for Visual C compiler!"
|
||||
#endif
|
||||
|
||||
# pragma warning(disable: 4127) // conditional expression is constant
|
||||
# pragma warning(disable: 4611) // not wise to mix setjmp with C++
|
||||
# pragma warning(disable: 4514) // unreferenced inline function has been removed
|
||||
# ifdef __cplusplus
|
||||
# define PJ_INLINE_SPECIFIER inline
|
||||
# else
|
||||
# define PJ_INLINE_SPECIFIER static __inline
|
||||
# endif
|
||||
# define PJ_THREAD_FUNC
|
||||
# define PJ_NORETURN __declspec(noreturn)
|
||||
# define PJ_ATTR_NORETURN
|
||||
|
||||
# define PJ_HAS_INT64 1
|
||||
typedef __int64 pj_int64_t;
|
||||
typedef unsigned __int64 pj_uint64_t;
|
||||
|
||||
#endif /* __PJ_COMPAT_CC_MSVC_H__ */
|
|
@ -0,0 +1,42 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/ctype.h 3 10/14/05 12:26a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/include/pj/compat/ctype.h $
|
||||
*
|
||||
* 3 10/14/05 12:26a Bennylp
|
||||
* Finished error code framework, some fixes in ioqueue, etc. Pretty
|
||||
* major.
|
||||
*
|
||||
* 2 9/22/05 10:31a Bennylp
|
||||
* Moving all *.h files to include/.
|
||||
*
|
||||
* 1 9/17/05 10:36a Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_CTYPE_H__
|
||||
#define __PJ_COMPAT_CTYPE_H__
|
||||
|
||||
/**
|
||||
* @file ctype.h
|
||||
* @brief Provides ctype function family.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_CTYPE_H) && PJ_HAS_CTYPE_H != 0
|
||||
# include <ctype.h>
|
||||
#else
|
||||
# define isalnum(c) (isalpha(c) || isdigit(c))
|
||||
# define isalpha(c) (islower(c) || isupper(c))
|
||||
# define isascii(c) (((unsigned char)(c))<=0x7f)
|
||||
# define isdigit(c) ((c)>='0' && (c)<='9')
|
||||
# define isspace(c) ((c)==' ' || (c)=='\t' ||\
|
||||
(c)=='\n' || (c)=='\r' || (c)=='\v')
|
||||
# define islower(c) ((c)>='a' && (c)<='z')
|
||||
# define isupper(c) ((c)>='A' && (c)<='Z')
|
||||
# define isxdigit(c) (isdigit(c) || (tolower(c)>='a'&&tolower(c)<='f'))
|
||||
# define tolower(c) (((c) >= 'A' && (c) <= 'Z') ? (c)+('a'-'A') : (c))
|
||||
# define toupper(c) (((c) >= 'a' && (c) <= 'z') ? (c)-('a'-'A') : (c))
|
||||
#endif
|
||||
|
||||
#define isblank(c) (c==' ' || c=='\t')
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_CTYPE_H__ */
|
|
@ -0,0 +1,26 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/errno.h 2 10/14/05 12:26a Bennylp $ */
|
||||
#ifndef __PJ_COMPAT_ERRNO_H__
|
||||
#define __PJ_COMPAT_ERRNO_H__
|
||||
|
||||
#if defined(PJ_WIN32) && PJ_WIN32 != 0
|
||||
|
||||
typedef unsigned long pj_os_err_type;
|
||||
# define pj_get_native_os_error() GetLastError()
|
||||
# define pj_get_native_netos_error() WSAGetLastError()
|
||||
|
||||
#elif (defined(PJ_LINUX) && PJ_LINUX != 0) || \
|
||||
(defined(PJ_LINUX_KERNEL) && PJ_LINUX_KERNEL != 0)
|
||||
|
||||
typedef int pj_os_err_type;
|
||||
# define pj_get_native_os_error() (errno)
|
||||
# define pj_get_native_netos_error() (errno)
|
||||
|
||||
#else
|
||||
|
||||
# error "Please define pj_os_err_type for this platform here!"
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_ERRNO_H__ */
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/high_precision.h 3 10/29/05 11:51a Bennylp $ */
|
||||
#ifndef __PJ_COMPAT_HIGH_PRECISION_H__
|
||||
#define __PJ_COMPAT_HIGH_PRECISION_H__
|
||||
|
||||
|
||||
#if defined(PJ_HAS_FLOATING_POINT) && PJ_HAS_FLOATING_POINT != 0
|
||||
/*
|
||||
* The first choice for high precision math is to use double.
|
||||
*/
|
||||
# include <math.h>
|
||||
typedef double pj_highprec_t;
|
||||
|
||||
# define PJ_HIGHPREC_VALUE_IS_ZERO(a) (a==0)
|
||||
# define pj_highprec_mod(a,b) (a=fmod(a,b))
|
||||
|
||||
#elif defined(PJ_LINUX_KERNEL) && PJ_LINUX_KERNEL != 0
|
||||
|
||||
# include <asm/div64.h>
|
||||
|
||||
typedef pj_int64_t pj_highprec_t;
|
||||
|
||||
# define pj_highprec_div(a1,a2) do_div(a1,a2)
|
||||
# define pj_highprec_mod(a1,a2) (a1=do_mod(a1, a2))
|
||||
|
||||
PJ_INLINE(pj_int64_t) do_mod( pj_int64_t a1, pj_int64_t a2)
|
||||
{
|
||||
return do_div(a1,a2);
|
||||
}
|
||||
|
||||
|
||||
#elif defined(PJ_HAS_INT64) && PJ_HAS_INT64 != 0
|
||||
/*
|
||||
* Next choice is to use 64-bit arithmatics.
|
||||
*/
|
||||
typedef pj_int64_t pj_highprec_t;
|
||||
|
||||
#else
|
||||
/*
|
||||
* Last, fallback to 32-bit arithmetics.
|
||||
*/
|
||||
typedef pj_int32_t pj_highprec_t;
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def pj_highprec_mul
|
||||
* pj_highprec_mul(a1, a2) - High Precision Multiplication
|
||||
* Multiply a1 and a2, and store the result in a1.
|
||||
*/
|
||||
#ifndef pj_highprec_mul
|
||||
# define pj_highprec_mul(a1,a2) (a1 = a1 * a2)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def pj_highprec_div
|
||||
* pj_highprec_div(a1, a2) - High Precision Division
|
||||
* Divide a2 from a1, and store the result in a1.
|
||||
*/
|
||||
#ifndef pj_highprec_div
|
||||
# define pj_highprec_div(a1,a2) (a1 = a1 / a2)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def pj_highprec_mod
|
||||
* pj_highprec_mod(a1, a2) - High Precision Modulus
|
||||
* Get the modulus a2 from a1, and store the result in a1.
|
||||
*/
|
||||
#ifndef pj_highprec_mod
|
||||
# define pj_highprec_mod(a1,a2) (a1 = a1 % a2)
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* @def PJ_HIGHPREC_VALUE_IS_ZERO(a)
|
||||
* Test if the specified high precision value is zero.
|
||||
*/
|
||||
#ifndef PJ_HIGHPREC_VALUE_IS_ZERO
|
||||
# define PJ_HIGHPREC_VALUE_IS_ZERO(a) (a==0)
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_HIGH_PRECISION_H__ */
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/m_alpha.h 1 10/29/05 5:23p Bennylp $ */
|
||||
/*
|
||||
* $Log: /pjproject-0.3/pjlib/include/pj/compat/m_alpha.h $
|
||||
*
|
||||
* 1 10/29/05 5:23p Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_M_ALPHA_H__
|
||||
#define __PJ_COMPAT_M_ALPHA_H__
|
||||
|
||||
/**
|
||||
* @file m_alpha.h
|
||||
* @brief Describes Alpha processor family specifics.
|
||||
*/
|
||||
|
||||
#define PJ_HAS_PENTIUM 0
|
||||
#define PJ_IS_LITTLE_ENDIAN 1
|
||||
#define PJ_IS_BIG_ENDIAN 0
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_M_ALPHA_H__ */
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/m_i386.h 3 9/21/05 1:39p Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/m_i386.h $
|
||||
*
|
||||
* 3 9/21/05 1:39p Bennylp
|
||||
* Periodic checkin for backup.
|
||||
*
|
||||
* 2 9/17/05 10:37a Bennylp
|
||||
* Major reorganization towards version 0.3.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_M_i386_H__
|
||||
#define __PJ_COMPAT_M_i386_H__
|
||||
|
||||
/**
|
||||
* @file m_i386.h
|
||||
* @brief Describes Intel i386 family processor specifics.
|
||||
*/
|
||||
|
||||
#define PJ_M_I386 1
|
||||
|
||||
#define PJ_HAS_PENTIUM 1
|
||||
#define PJ_IS_LITTLE_ENDIAN 1
|
||||
#define PJ_IS_BIG_ENDIAN 0
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_M_i386_H__ */
|
|
@ -0,0 +1,21 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/m_m68k.h 2 9/17/05 10:37a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/m_m68k.h $
|
||||
*
|
||||
* 2 9/17/05 10:37a Bennylp
|
||||
* Major reorganization towards version 0.3.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_M_M68K_H__
|
||||
#define __PJ_COMPAT_M_M68K_H__
|
||||
|
||||
/**
|
||||
* @file m_m68k.h
|
||||
* @brief Describes Motorola m68k family processor specifics.
|
||||
*/
|
||||
|
||||
#define PJ_HAS_PENTIUM 0
|
||||
#define PJ_IS_LITTLE_ENDIAN 1
|
||||
#define PJ_IS_BIG_ENDIAN 0
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_M_M68K_H__ */
|
|
@ -0,0 +1,25 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/malloc.h 2 9/17/05 10:37a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/malloc.h $
|
||||
*
|
||||
* 2 9/17/05 10:37a Bennylp
|
||||
* Major reorganization towards version 0.3.
|
||||
*
|
||||
* 1 9/16/05 10:02p Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_MALLOC_H__
|
||||
#define __PJ_COMPAT_MALLOC_H__
|
||||
|
||||
/**
|
||||
* @file malloc.h
|
||||
* @brief Provides malloc() and free() functions.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_MALLOC_H) && PJ_HAS_MALLOC_H != 0
|
||||
# include <malloc.h>
|
||||
#elif defined(PJ_HAS_STDLIB_H) && PJ_HAS_STDLIB_H != 0
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#endif /* __PJ_COMPAT_MALLOC_H__ */
|
|
@ -0,0 +1,69 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/os_linux.h 6 10/29/05 11:51a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/include/pj/compat/os_linux.h $
|
||||
*
|
||||
* 6 10/29/05 11:51a Bennylp
|
||||
* Version 0.3-pre2.
|
||||
*
|
||||
* 5 10/14/05 12:26a Bennylp
|
||||
* Finished error code framework, some fixes in ioqueue, etc. Pretty
|
||||
* major.
|
||||
*
|
||||
* 4 9/22/05 10:31a Bennylp
|
||||
* Moving all *.h files to include/.
|
||||
*
|
||||
* 3 9/21/05 1:39p Bennylp
|
||||
* Periodic checkin for backup.
|
||||
*
|
||||
* 2 9/17/05 10:37a Bennylp
|
||||
* Major reorganization towards version 0.3.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_OS_LINUX_H__
|
||||
#define __PJ_COMPAT_OS_LINUX_H__
|
||||
|
||||
/**
|
||||
* @file os_linux.h
|
||||
* @brief Describes Linux operating system specifics.
|
||||
*/
|
||||
|
||||
#define PJ_HAS_ARPA_INET_H 1
|
||||
#define PJ_HAS_ASSERT_H 1
|
||||
#define PJ_HAS_CTYPE_H 1
|
||||
#define PJ_HAS_ERRNO_H 1
|
||||
#define PJ_HAS_LINUX_SOCKET_H 0
|
||||
#define PJ_HAS_MALLOC_H 1
|
||||
#define PJ_HAS_NETDB_H 1
|
||||
#define PJ_HAS_NETINET_IN_H 1
|
||||
#define PJ_HAS_SETJMP_H 1
|
||||
#define PJ_HAS_STDARG_H 1
|
||||
#define PJ_HAS_STDDEF_H 1
|
||||
#define PJ_HAS_STDIO_H 1
|
||||
#define PJ_HAS_STDLIB_H 1
|
||||
#define PJ_HAS_STRING_H 1
|
||||
#define PJ_HAS_SYS_IOCTL_H 1
|
||||
#define PJ_HAS_SYS_SELECT_H 1
|
||||
#define PJ_HAS_SYS_SOCKET_H 1
|
||||
#define PJ_HAS_SYS_TIMEB_H 1
|
||||
#define PJ_HAS_SYS_TYPES_H 1
|
||||
#define PJ_HAS_TIME_H 1
|
||||
#define PJ_HAS_UNISTD_H 1
|
||||
|
||||
#define PJ_HAS_MSWSOCK_H 0
|
||||
#define PJ_HAS_WINSOCK_H 0
|
||||
#define PJ_HAS_WINSOCK2_H 0
|
||||
|
||||
#define PJ_SOCK_HAS_INET_ATON 1
|
||||
|
||||
/* Default threading is enabled, unless it's overridden. */
|
||||
#ifndef PJ_HAS_THREADS
|
||||
# define PJ_HAS_THREADS (1)
|
||||
#endif
|
||||
|
||||
#define PJ_HAS_HIGH_RES_TIMER 1
|
||||
#define PJ_HAS_MALLOC 1
|
||||
#define PJ_OS_HAS_CHECK_STACK 0
|
||||
|
||||
#define PJ_ATOMIC_VALUE_TYPE long
|
||||
|
||||
#endif /* __PJ_COMPAT_OS_LINUX_H__ */
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/os_linux_kernel.h 4 10/29/05 11:51a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/include/pj/compat/os_linux_kernel.h $
|
||||
*
|
||||
* 4 10/29/05 11:51a Bennylp
|
||||
* Version 0.3-pre2.
|
||||
*
|
||||
* 3 10/14/05 12:26a Bennylp
|
||||
* Finished error code framework, some fixes in ioqueue, etc. Pretty
|
||||
* major.
|
||||
*
|
||||
* 2 9/22/05 10:31a Bennylp
|
||||
* Moving all *.h files to include/.
|
||||
*
|
||||
* 1 9/21/05 1:38p Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_OS_LINUX_KERNEL_H__
|
||||
#define __PJ_COMPAT_OS_LINUX_KERNEL_H__
|
||||
|
||||
/**
|
||||
* @file os_linux.h
|
||||
* @brief Describes Linux operating system specifics.
|
||||
*/
|
||||
|
||||
#define PJ_HAS_ARPA_INET_H 0
|
||||
#define PJ_HAS_ASSERT_H 0
|
||||
#define PJ_HAS_CTYPE_H 0
|
||||
#define PJ_HAS_ERRNO_H 0
|
||||
#define PJ_HAS_LINUX_SOCKET_H 1
|
||||
#define PJ_HAS_MALLOC_H 0
|
||||
#define PJ_HAS_NETDB_H 0
|
||||
#define PJ_HAS_NETINET_IN_H 0
|
||||
#define PJ_HAS_SETJMP_H 0
|
||||
#define PJ_HAS_STDARG_H 1
|
||||
#define PJ_HAS_STDDEF_H 0
|
||||
#define PJ_HAS_STDIO_H 0
|
||||
#define PJ_HAS_STDLIB_H 0
|
||||
#define PJ_HAS_STRING_H 0
|
||||
#define PJ_HAS_SYS_IOCTL_H 0
|
||||
#define PJ_HAS_SYS_SELECT_H 0
|
||||
#define PJ_HAS_SYS_SOCKET_H 0
|
||||
#define PJ_HAS_SYS_TIMEB_H 0
|
||||
#define PJ_HAS_SYS_TYPES_H 0
|
||||
#define PJ_HAS_TIME_H 0
|
||||
#define PJ_HAS_UNISTD_H 0
|
||||
|
||||
#define PJ_HAS_MSWSOCK_H 0
|
||||
#define PJ_HAS_WINSOCK_H 0
|
||||
#define PJ_HAS_WINSOCK2_H 0
|
||||
|
||||
#define PJ_SOCK_HAS_INET_ATON 0
|
||||
|
||||
#ifndef PJ_HAS_THREADS
|
||||
# define PJ_HAS_THREADS (1)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Declare __FD_SETSIZE now before including <linux*>.
|
||||
*/
|
||||
#define __FD_SETSIZE PJ_IOQUEUE_MAX_HANDLES
|
||||
|
||||
#define NULL ((void*)0)
|
||||
|
||||
#include <linux/module.h> /* Needed by all modules */
|
||||
#include <linux/kernel.h> /* Needed for KERN_INFO */
|
||||
|
||||
#define __PJ_EXPORT_SYMBOL(a) EXPORT_SYMBOL(a);
|
||||
|
||||
/*
|
||||
* Override features.
|
||||
*/
|
||||
#define PJ_HAS_FLOATING_POINT 0
|
||||
#define PJ_HAS_MALLOC 0
|
||||
#define PJ_HAS_SEMAPHORE 0
|
||||
#define PJ_HAS_EVENT_OBJ 0
|
||||
#define PJ_HAS_HIGH_RES_TIMER 1
|
||||
#define PJ_OS_HAS_CHECK_STACK 0
|
||||
#define PJ_TERM_HAS_COLOR 0
|
||||
|
||||
#define PJ_ATOMIC_VALUE_TYPE int
|
||||
#define PJ_THREAD_DESC_SIZE 128
|
||||
|
||||
#endif /* __PJ_COMPAT_OS_LINUX_KERNEL_H__ */
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/os_palmos.h 3 9/21/05 1:39p Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/os_palmos.h $
|
||||
*
|
||||
* 3 9/21/05 1:39p Bennylp
|
||||
* Periodic checkin for backup.
|
||||
*
|
||||
* 2 9/17/05 10:37a Bennylp
|
||||
* Major reorganization towards version 0.3.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_OS_PALMOS_H__
|
||||
#define __PJ_COMPAT_OS_PALMOS_H__
|
||||
|
||||
/**
|
||||
* @file os_palmos.h
|
||||
* @brief Describes PalmOS operating system specifics.
|
||||
*/
|
||||
|
||||
#define PJ_HAS_ARPA_INET_H 0
|
||||
#define PJ_HAS_ASSERT_H 1
|
||||
#define PJ_HAS_CTYPE_H 1
|
||||
#define PJ_HAS_ERRNO_H 0
|
||||
#define PJ_HAS_MALLOC_H 1
|
||||
#define PJ_HAS_NETDB_H 0
|
||||
#define PJ_HAS_NETINET_IN_H 0
|
||||
#define PJ_HAS_SETJMP_H 1
|
||||
#define PJ_HAS_STDARG_H 1
|
||||
#define PJ_HAS_STDDEF_H 1
|
||||
#define PJ_HAS_STDIO_H 1
|
||||
#define PJ_HAS_STDLIB_H 1
|
||||
#define PJ_HAS_STRING_H 1
|
||||
#define PJ_HAS_SYS_IOCTL_H 0
|
||||
#define PJ_HAS_SYS_SELECT_H 0
|
||||
#define PJ_HAS_SYS_SOCKET_H 0
|
||||
#define PJ_HAS_SYS_TIMEB_H 0
|
||||
#define PJ_HAS_SYS_TYPES_H 1
|
||||
#define PJ_HAS_TIME_H 1
|
||||
#define PJ_HAS_UNISTD_H 0
|
||||
|
||||
#define PJ_HAS_MSWSOCK_H 0
|
||||
#define PJ_HAS_WINSOCK_H 0
|
||||
#define PJ_HAS_WINSOCK2_H 0
|
||||
|
||||
#define PJ_SOCK_HAS_INET_ATON 0
|
||||
|
||||
/* Default threading is enabled, unless it's overridden. */
|
||||
#ifndef PJ_HAS_THREADS
|
||||
# define PJ_HAS_THREADS (1)
|
||||
#endif
|
||||
|
||||
#define PJ_HAS_HIGH_RES_TIMER 1
|
||||
#define PJ_OS_HAS_CHECK_STACK 0
|
||||
|
||||
#endif /* __PJ_COMPAT_OS_PALMOS_H__ */
|
|
@ -0,0 +1,72 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/os_win32.h 6 10/29/05 11:51a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/include/pj/compat/os_win32.h $
|
||||
*
|
||||
* 6 10/29/05 11:51a Bennylp
|
||||
* Version 0.3-pre2.
|
||||
*
|
||||
* 5 10/14/05 12:26a Bennylp
|
||||
* Finished error code framework, some fixes in ioqueue, etc. Pretty
|
||||
* major.
|
||||
*
|
||||
* 4 9/22/05 10:31a Bennylp
|
||||
* Moving all *.h files to include/.
|
||||
*
|
||||
* 3 9/21/05 1:39p Bennylp
|
||||
* Periodic checkin for backup.
|
||||
*
|
||||
* 2 9/17/05 10:37a Bennylp
|
||||
* Major reorganization towards version 0.3.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_OS_WIN32_H__
|
||||
#define __PJ_COMPAT_OS_WIN32_H__
|
||||
|
||||
/**
|
||||
* @file os_win32.h
|
||||
* @brief Describes Win32 operating system family specifics.
|
||||
*/
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define PJ_WIN32_WINNT 0x0400
|
||||
#define _WIN32_WINNT PJ_WIN32_WINNT
|
||||
|
||||
#define PJ_HAS_ARPA_INET_H 0
|
||||
#define PJ_HAS_ASSERT_H 1
|
||||
#define PJ_HAS_CTYPE_H 1
|
||||
#define PJ_HAS_ERRNO_H 0 /* Must be zero, otherwise errno_test() fails. */
|
||||
#define PJ_HAS_LINUX_SOCKET_H 0
|
||||
#define PJ_HAS_MALLOC_H 1
|
||||
#define PJ_HAS_NETDB_H 0
|
||||
#define PJ_HAS_NETINET_IN_H 0
|
||||
#define PJ_HAS_SETJMP_H 1
|
||||
#define PJ_HAS_STDARG_H 1
|
||||
#define PJ_HAS_STDDEF_H 1
|
||||
#define PJ_HAS_STDIO_H 1
|
||||
#define PJ_HAS_STDLIB_H 1
|
||||
#define PJ_HAS_STRING_H 1
|
||||
#define PJ_HAS_SYS_IOCTL_H 0
|
||||
#define PJ_HAS_SYS_SELECT_H 0
|
||||
#define PJ_HAS_SYS_SOCKET_H 0
|
||||
#define PJ_HAS_SYS_TIMEB_H 1
|
||||
#define PJ_HAS_SYS_TYPES_H 1
|
||||
#define PJ_HAS_TIME_H 1
|
||||
#define PJ_HAS_UNISTD_H 0
|
||||
|
||||
#define PJ_HAS_MSWSOCK_H 1
|
||||
#define PJ_HAS_WINSOCK_H 0
|
||||
#define PJ_HAS_WINSOCK2_H 1
|
||||
|
||||
#define PJ_SOCK_HAS_INET_ATON 0
|
||||
|
||||
/* Default threading is enabled, unless it's overridden. */
|
||||
#ifndef PJ_HAS_THREADS
|
||||
# define PJ_HAS_THREADS (1)
|
||||
#endif
|
||||
|
||||
#define PJ_HAS_HIGH_RES_TIMER 1
|
||||
#define PJ_HAS_MALLOC 1
|
||||
#define PJ_OS_HAS_CHECK_STACK 1
|
||||
|
||||
#define PJ_ATOMIC_VALUE_TYPE long
|
||||
|
||||
#endif /* __PJ_COMPAT_OS_WIN32_H__ */
|
|
@ -0,0 +1,65 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/rand.h 3 10/14/05 12:26a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/include/pj/compat/rand.h $
|
||||
*
|
||||
* 3 10/14/05 12:26a Bennylp
|
||||
* Finished error code framework, some fixes in ioqueue, etc. Pretty
|
||||
* major.
|
||||
*
|
||||
* 2 9/21/05 1:39p Bennylp
|
||||
* Periodic checkin for backup.
|
||||
*
|
||||
* 1 9/17/05 10:36a Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_RAND_H__
|
||||
#define __PJ_COMPAT_RAND_H__
|
||||
|
||||
/**
|
||||
* @file rand.h
|
||||
* @brief Provides platform_rand() and platform_srand() functions.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_STDLIB_H) && PJ_HAS_STDLIB_H != 0
|
||||
/*
|
||||
* Use stdlib based rand() and srand().
|
||||
*/
|
||||
# include <stdlib.h>
|
||||
# define platform_srand srand
|
||||
# if defined(RAND_MAX) && RAND_MAX <= 0xFFFF
|
||||
/*
|
||||
* When rand() is only 16 bit strong, double the strength
|
||||
* by calling it twice!
|
||||
*/
|
||||
PJ_INLINE(int) platform_rand(void)
|
||||
{
|
||||
return ((rand() & 0xFFFF) << 16) | (rand() & 0xFFFF);
|
||||
}
|
||||
# else
|
||||
# define platform_rand rand
|
||||
# endif
|
||||
|
||||
#elif defined(PJ_LINUX_KERNEL) && PJ_LINUX_KERNEL != 0
|
||||
/*
|
||||
* Linux kernel mode random number generator.
|
||||
*/
|
||||
# include <linux/random.h>
|
||||
# define platform_srand(seed)
|
||||
|
||||
PJ_INLINE(int) platform_rand(void)
|
||||
{
|
||||
int value;
|
||||
get_random_bytes((void*)&value, sizeof(value));
|
||||
return value;
|
||||
}
|
||||
|
||||
#else
|
||||
# warning "platform_rand() is not implemented"
|
||||
# define platform_rand() 1
|
||||
# define platform_srand(seed)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_RAND_H__ */
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/setjmp.h 4 10/14/05 12:26a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/include/pj/compat/setjmp.h $
|
||||
*
|
||||
* 4 10/14/05 12:26a Bennylp
|
||||
* Finished error code framework, some fixes in ioqueue, etc. Pretty
|
||||
* major.
|
||||
*
|
||||
* 3 9/22/05 10:31a Bennylp
|
||||
* Moving all *.h files to include/.
|
||||
*
|
||||
* 2 9/21/05 1:39p Bennylp
|
||||
* Periodic checkin for backup.
|
||||
*
|
||||
* 1 9/17/05 10:36a Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_SETJMP_H__
|
||||
#define __PJ_COMPAT_SETJMP_H__
|
||||
|
||||
/**
|
||||
* @file setjmp.h
|
||||
* @brief Provides setjmp.h functionality.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_SETJMP_H) && PJ_HAS_SETJMP_H != 0
|
||||
# include <setjmp.h>
|
||||
typedef jmp_buf pj_jmp_buf;
|
||||
# define pj_setjmp(buf) setjmp(buf)
|
||||
# define pj_longjmp(buf,d) longjmp(buf,d)
|
||||
|
||||
#elif defined(PJ_LINUX_KERNEL) && PJ_LINUX_KERNEL != 0 && \
|
||||
defined(PJ_M_I386) && PJ_M_I386 != 0
|
||||
|
||||
/*
|
||||
* These are taken from uClibc.
|
||||
* Copyright (C) 2000-2003 Erik Andersen <andersen@uclibc.org>
|
||||
*/
|
||||
# if defined __USE_MISC || defined _ASM
|
||||
# define JB_BX 0
|
||||
# define JB_SI 1
|
||||
# define JB_DI 2
|
||||
# define JB_BP 3
|
||||
# define JB_SP 4
|
||||
# define JB_PC 5
|
||||
# define JB_SIZE 24
|
||||
# endif
|
||||
|
||||
# ifndef _ASM
|
||||
typedef int __jmp_buf[6];
|
||||
|
||||
/* A `sigset_t' has a bit for each signal. */
|
||||
# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
|
||||
typedef struct __sigset_t_tag
|
||||
{
|
||||
unsigned long int __val[_SIGSET_NWORDS];
|
||||
} __sigset_t;
|
||||
|
||||
/* Calling environment, plus possibly a saved signal mask. */
|
||||
typedef struct __jmp_buf_tag /* C++ doesn't like tagless structs. */
|
||||
{
|
||||
/* NOTE: The machine-dependent definitions of `__sigsetjmp'
|
||||
assume that a `jmp_buf' begins with a `__jmp_buf' and that
|
||||
`__mask_was_saved' follows it. Do not move these members
|
||||
or add others before it. */
|
||||
__jmp_buf __jmpbuf; /* Calling environment. */
|
||||
int __mask_was_saved; /* Saved the signal mask? */
|
||||
// we never saved the mask.
|
||||
__sigset_t __saved_mask; /* Saved signal mask. */
|
||||
} jmp_buf[1];
|
||||
|
||||
typedef jmp_buf sigjmp_buf;
|
||||
typedef jmp_buf pj_jmp_buf;
|
||||
|
||||
PJ_DECL(int) pj_setjmp(pj_jmp_buf env);
|
||||
PJ_DECL(void) pj_longjmp(pj_jmp_buf env, int val) __attribute__((noreturn));
|
||||
|
||||
# endif /* _ASM */
|
||||
|
||||
#else
|
||||
# warning "setjmp()/longjmp() is not implemented"
|
||||
typedef int pj_jmp_buf[1];
|
||||
# define pj_setjmp(buf) 0
|
||||
# define pj_longjmp(buf,d) 0
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_SETJMP_H__ */
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/size_t.h 2 9/21/05 1:39p Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/size_t.h $
|
||||
*
|
||||
* 2 9/21/05 1:39p Bennylp
|
||||
* Periodic checkin for backup.
|
||||
*
|
||||
* 1 9/17/05 10:36a Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_SIZE_T_H__
|
||||
#define __PJ_COMPAT_SIZE_T_H__
|
||||
|
||||
/**
|
||||
* @file size_t.h
|
||||
* @brief Provides size_t type.
|
||||
*/
|
||||
#if PJ_HAS_STDDEF_H
|
||||
# include <stddef.h>
|
||||
#endif
|
||||
|
||||
#endif /* __PJ_COMPAT_SIZE_T_H__ */
|
||||
|
|
@ -0,0 +1,129 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/socket.h 5 10/29/05 11:51a Bennylp $*/
|
||||
/* $Log: /pjproject-0.3/pjlib/include/pj/compat/socket.h $
|
||||
*
|
||||
* 5 10/29/05 11:51a Bennylp
|
||||
* Version 0.3-pre2.
|
||||
*
|
||||
* 4 10/14/05 12:26a Bennylp
|
||||
* Finished error code framework, some fixes in ioqueue, etc. Pretty
|
||||
* major.
|
||||
*
|
||||
* 3 9/21/05 1:39p Bennylp
|
||||
* Periodic checkin for backup.
|
||||
*
|
||||
* 2 9/17/05 10:37a Bennylp
|
||||
* Major reorganization towards version 0.3.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_SOCKET_H__
|
||||
#define __PJ_COMPAT_SOCKET_H__
|
||||
|
||||
/**
|
||||
* @file socket.h
|
||||
* @brief Provides all socket related functions,data types, error codes, etc.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_WINSOCK_H) && PJ_HAS_WINSOCK_H != 0
|
||||
# include <winsock.h>
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_WINSOCK2_H) && PJ_HAS_WINSOCK2_H != 0
|
||||
# include <winsock2.h>
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_SYS_TYPES_H) && PJ_HAS_SYS_TYPES_H != 0
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_SYS_SOCKET_H) && PJ_HAS_SYS_SOCKET_H != 0
|
||||
# include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_LINUX_SOCKET_H) && PJ_HAS_LINUX_SOCKET_H != 0
|
||||
# include <linux/socket.h>
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_SYS_SELECT_H) && PJ_HAS_SYS_SELECT_H != 0
|
||||
# include <sys/select.h>
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_NETINET_IN_H) && PJ_HAS_NETINET_IN_H != 0
|
||||
# include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_ARPA_INET_H) && PJ_HAS_ARPA_INET_H != 0
|
||||
# include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_SYS_IOCTL_H) && PJ_HAS_SYS_IOCTL_H != 0
|
||||
# include <sys/ioctl.h> /* FBIONBIO */
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_ERRNO_H) && PJ_HAS_ERRNO_H != 0
|
||||
# include <errno.h>
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_NETDB_H) && PJ_HAS_NETDB_H != 0
|
||||
# include <netdb.h>
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_UNISTD_H) && PJ_HAS_UNISTD_H != 0
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Define common errors.
|
||||
*/
|
||||
#ifdef PJ_WIN32
|
||||
# define OSERR_EWOULDBLOCK WSAEWOULDBLOCK
|
||||
# define OSERR_EINPROGRESS WSAEINPROGRESS
|
||||
#else
|
||||
# define OSERR_EWOULDBLOCK EWOULDBLOCK
|
||||
# define OSERR_EINPROGRESS EINPROGRESS
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* And undefine this..
|
||||
*/
|
||||
#undef s_addr
|
||||
|
||||
/*
|
||||
* Linux kernel specifics
|
||||
*/
|
||||
#ifdef PJ_LINUX_KERNEL
|
||||
# include <linux/net.h>
|
||||
# include <asm/ioctls.h> /* FIONBIO */
|
||||
# include <linux/syscalls.h> /* sys_select() */
|
||||
# include <asm/uaccess.h> /* set/get_fs() */
|
||||
|
||||
typedef int socklen_t;
|
||||
# define getsockopt sys_getsockopt
|
||||
|
||||
/*
|
||||
* Wrapper for select() in Linux kernel.
|
||||
*/
|
||||
PJ_INLINE(int) select(int n, fd_set *inp, fd_set *outp, fd_set *exp,
|
||||
struct timeval *tvp)
|
||||
{
|
||||
int count;
|
||||
mm_segment_t oldfs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
count = sys_select(n, inp, outp, exp, tvp);
|
||||
set_fs(oldfs);
|
||||
return count;
|
||||
}
|
||||
#endif /* PJ_LINUX_KERNEL */
|
||||
|
||||
|
||||
/*
|
||||
* Windows specific
|
||||
*/
|
||||
#ifdef PJ_WIN32
|
||||
typedef int socklen_t;;
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_SOCKET_H__ */
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/compat/sprintf.h 2 10/14/05 12:26a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/include/pj/compat/sprintf.h $
|
||||
*
|
||||
* 2 10/14/05 12:26a Bennylp
|
||||
* Finished error code framework, some fixes in ioqueue, etc. Pretty
|
||||
* major.
|
||||
*
|
||||
* 1 9/17/05 10:36a Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_SPRINTF_H__
|
||||
#define __PJ_COMPAT_SPRINTF_H__
|
||||
|
||||
/**
|
||||
* @file sprintf.h
|
||||
* @brief Provides sprintf() and snprintf() functions.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_STDIO_H) && PJ_HAS_STDIO_H != 0
|
||||
# include <stdio.h>
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# define snprintf _snprintf
|
||||
#endif
|
||||
|
||||
#define pj_sprintf sprintf
|
||||
#define pj_snprintf snprintf
|
||||
|
||||
#endif /* __PJ_COMPAT_SPRINTF_H__ */
|
|
@ -0,0 +1,20 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/stdarg.h 1 9/17/05 10:36a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/stdarg.h $
|
||||
*
|
||||
* 1 9/17/05 10:36a Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_STDARG_H__
|
||||
#define __PJ_COMPAT_STDARG_H__
|
||||
|
||||
/**
|
||||
* @file stdarg.h
|
||||
* @brief Provides stdarg functionality.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_STDARG_H) && PJ_HAS_STDARG_H != 0
|
||||
# include <stdarg.h>
|
||||
#endif
|
||||
|
||||
#endif /* __PJ_COMPAT_STDARG_H__ */
|
|
@ -0,0 +1,20 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/stdfileio.h 1 9/17/05 10:36a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/stdfileio.h $
|
||||
*
|
||||
* 1 9/17/05 10:36a Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_STDFILEIO_H__
|
||||
#define __PJ_COMPAT_STDFILEIO_H__
|
||||
|
||||
/**
|
||||
* @file stdfileio.h
|
||||
* @brief Compatibility for ANSI file I/O like fputs, fflush, etc.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_STDIO_H) && PJ_HAS_STDIO_H != 0
|
||||
# include <stdio.h>
|
||||
#endif
|
||||
|
||||
#endif /* __PJ_COMPAT_STDFILEIO_H__ */
|
|
@ -0,0 +1,41 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/string.h 3 9/22/05 10:31a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/string.h $
|
||||
*
|
||||
* 3 9/22/05 10:31a Bennylp
|
||||
* Moving all *.h files to include/.
|
||||
*
|
||||
* 2 9/21/05 1:39p Bennylp
|
||||
* Periodic checkin for backup.
|
||||
*
|
||||
* 1 9/17/05 10:36a Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_STRING_H__
|
||||
#define __PJ_COMPAT_STRING_H__
|
||||
|
||||
/**
|
||||
* @file string.h
|
||||
* @brief Provides string manipulation functions found in ANSI string.h.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_STRING_H) && PJ_HAS_STRING_H != 0
|
||||
# include <string.h>
|
||||
#else
|
||||
|
||||
PJ_DECL(int) strcasecmp(const char *s1, const char *s2);
|
||||
PJ_DECL(int) strncasecmp(const char *s1, const char *s2, int len);
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# define strcasecmp stricmp
|
||||
# define strncasecmp strnicmp
|
||||
# define snprintf _snprintf
|
||||
#else
|
||||
# define stricmp strcasecmp
|
||||
# define strnicmp strncasecmp
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_STRING_H__ */
|
|
@ -0,0 +1,25 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/time.h 1 9/17/05 10:36a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/time.h $
|
||||
*
|
||||
* 1 9/17/05 10:36a Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_TIME_H__
|
||||
#define __PJ_COMPAT_TIME_H__
|
||||
|
||||
/**
|
||||
* @file time.h
|
||||
* @brief Provides ftime() and localtime() etc functions.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_TIME_H) && PJ_HAS_TIME_H != 0
|
||||
# include <time.h>
|
||||
#endif
|
||||
|
||||
#if defined(PJ_HAS_SYS_TIMEB_H) && PJ_HAS_SYS_TIMEB_H != 0
|
||||
# include <sys/timeb.h>
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __PJ_COMPAT_TIME_H__ */
|
|
@ -0,0 +1,26 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/compat/vsprintf.h 1 9/17/05 10:36a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/src/pj/compat/vsprintf.h $
|
||||
*
|
||||
* 1 9/17/05 10:36a Bennylp
|
||||
* Created.
|
||||
*
|
||||
*/
|
||||
#ifndef __PJ_COMPAT_VSPRINTF_H__
|
||||
#define __PJ_COMPAT_VSPRINTF_H__
|
||||
|
||||
/**
|
||||
* @file vsprintf.h
|
||||
* @brief Provides vsprintf and vsnprintf function.
|
||||
*/
|
||||
|
||||
#if defined(PJ_HAS_STDIO_H) && PJ_HAS_STDIO_H != 0
|
||||
# include <stdio.h>
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# define vsnprintf _vsnprintf
|
||||
#endif
|
||||
|
||||
#define pj_vsnprintf vsnprintf
|
||||
|
||||
#endif /* __PJ_COMPAT_VSPRINTF_H__ */
|
|
@ -0,0 +1,438 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/config.h 12 10/29/05 10:25p Bennylp $ */
|
||||
|
||||
#ifndef __PJ_CONFIG_H__
|
||||
#define __PJ_CONFIG_H__
|
||||
|
||||
/**
|
||||
* @file config.h
|
||||
* @brief PJLIB Main configuration settings.
|
||||
*/
|
||||
|
||||
/********************************************************************
|
||||
* Include compiler specific configuration.
|
||||
*/
|
||||
#if defined(_MSC_VER)
|
||||
# include <pj/compat/cc_msvc.h>
|
||||
#elif defined(__GNUC__)
|
||||
# include <pj/compat/cc_gcc.h>
|
||||
#else
|
||||
# error "Unknown compiler."
|
||||
#endif
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* Include target specific configuration.
|
||||
*/
|
||||
#if defined(PJ_WIN32)
|
||||
# include <pj/compat/os_win32.h>
|
||||
#elif defined(PJ_LINUX)
|
||||
# include <pj/compat/os_linux.h>
|
||||
#elif defined(PJ_LINUX_KERNEL)
|
||||
# include <pj/compat/os_linux_kernel.h>
|
||||
#elif defined(PJ_PALMOS)
|
||||
# include <pj/compat/os_palmos.h>
|
||||
#else
|
||||
# error "Please specify target os."
|
||||
#endif
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* Target machine specific configuration.
|
||||
*/
|
||||
#if defined (PJ_M_I386) && PJ_M_I386 != 0
|
||||
# include <pj/compat/m_i386.h>
|
||||
#elif defined (PJ_M_M68K) && PJ_M_M68K != 0
|
||||
# include <pj/compat/m_m68k.h>
|
||||
#elif defined (PJ_M_ALPHA) && PJ_M_ALPHA != 0
|
||||
# include <pj/compat/m_alpha.h>
|
||||
#else
|
||||
# error "Please specify target machine."
|
||||
#endif
|
||||
|
||||
/* Include size_t definition. */
|
||||
#include <pj/compat/size_t.h>
|
||||
|
||||
/* Include site/user specific configuration to control PJLIB features.
|
||||
* YOU MUST CREATE THIS FILE YOURSELF!!
|
||||
*/
|
||||
#include <pj/config_site.h>
|
||||
|
||||
/********************************************************************
|
||||
* PJLIB Features.
|
||||
*/
|
||||
|
||||
/* Overrides for DOXYGEN */
|
||||
#ifdef DOXYGEN
|
||||
# undef PJ_FUNCTIONS_ARE_INLINED
|
||||
# undef PJ_HAS_FLOATING_POINT
|
||||
# undef PJ_LOG_MAX_LEVEL
|
||||
# undef PJ_LOG_MAX_SIZE
|
||||
# undef PJ_LOG_USE_STACK_BUFFER
|
||||
# undef PJ_TERM_HAS_COLOR
|
||||
# undef PJ_POOL_DEBUG
|
||||
# undef PJ_HAS_TCP
|
||||
# undef PJ_MAX_HOSTNAME
|
||||
# undef PJ_IOQUEUE_MAX_HANDLES
|
||||
# undef FD_SETSIZE
|
||||
# undef PJ_HAS_SEMAPHORE
|
||||
# undef PJ_HAS_EVENT_OBJ
|
||||
# undef PJ_ENABLE_EXTRA_CHECK
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @defgroup pj_config Build Configuration
|
||||
* @ingroup PJ
|
||||
* @{
|
||||
*
|
||||
* This section contains macros that can set during PJLIB build process
|
||||
* to controll various aspects of the library.
|
||||
*
|
||||
* <b>Note</b>: the values in this page does NOT necessarily reflect to the
|
||||
* macro values during the build process.
|
||||
*/
|
||||
|
||||
/**
|
||||
* If this macro is set to 1, it will enable some debugging checking
|
||||
* in the library.
|
||||
*
|
||||
* Default: equal to (NOT NDEBUG).
|
||||
*/
|
||||
#ifndef PJ_DEBUG
|
||||
# ifndef NDEBUG
|
||||
# define PJ_DEBUG 1
|
||||
# else
|
||||
# define PJ_DEBUG 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Expand functions in *_i.h header files as inline.
|
||||
*
|
||||
* Default: 0.
|
||||
*/
|
||||
#ifndef PJ_FUNCTIONS_ARE_INLINED
|
||||
# define PJ_FUNCTIONS_ARE_INLINED 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Use floating point computations in the library.
|
||||
*
|
||||
* Default: 1.
|
||||
*/
|
||||
#ifndef PJ_HAS_FLOATING_POINT
|
||||
# define PJ_HAS_FLOATING_POINT 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Declare maximum logging level/verbosity. Lower number indicates higher
|
||||
* importance, with the highest importance has level zero. The least
|
||||
* important level is five in this implementation, but this can be extended
|
||||
* by supplying the appropriate implementation.
|
||||
*
|
||||
* The level conventions:
|
||||
* - 0: fatal error
|
||||
* - 1: error
|
||||
* - 2: warning
|
||||
* - 3: info
|
||||
* - 4: debug
|
||||
* - 5: trace
|
||||
* - 6: more detailed trace
|
||||
*
|
||||
* Default: 4
|
||||
*/
|
||||
#ifndef PJ_LOG_MAX_LEVEL
|
||||
# define PJ_LOG_MAX_LEVEL 4
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Maximum message size that can be sent to output device for each call
|
||||
* to PJ_LOG(). If the message size is longer than this value, it will be cut.
|
||||
* This may affect the stack usage, depending whether PJ_LOG_USE_STACK_BUFFER
|
||||
* flag is set.
|
||||
*
|
||||
* Default: 800
|
||||
*/
|
||||
#ifndef PJ_LOG_MAX_SIZE
|
||||
# define PJ_LOG_MAX_SIZE 800
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Log buffer.
|
||||
* Does the log get the buffer from the stack? (default is yes).
|
||||
* If the value is set to NO, then the buffer will be taken from static
|
||||
* buffer, which in this case will make the log function non-reentrant.
|
||||
*
|
||||
* Default: 1
|
||||
*/
|
||||
#ifndef PJ_LOG_USE_STACK_BUFFER
|
||||
# define PJ_LOG_USE_STACK_BUFFER 1
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Colorfull terminal (for logging etc).
|
||||
*
|
||||
* Default: 1
|
||||
*/
|
||||
#ifndef PJ_TERM_HAS_COLOR
|
||||
# define PJ_TERM_HAS_COLOR 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Pool debugging.
|
||||
*
|
||||
* Default: 0
|
||||
*/
|
||||
#ifndef PJ_POOL_DEBUG
|
||||
# define PJ_POOL_DEBUG 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \def PJ_HAS_TCP
|
||||
* Support TCP in the library.
|
||||
* Disabling TCP will reduce the footprint slightly (about 6KB).
|
||||
*
|
||||
* Default: 1
|
||||
*/
|
||||
#ifndef PJ_HAS_TCP
|
||||
# define PJ_HAS_TCP 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Maximum hostname length.
|
||||
* Libraries sometimes needs to make copy of an address to stack buffer;
|
||||
* the value here affects the stack usage.
|
||||
*
|
||||
* Default: 128
|
||||
*/
|
||||
#ifndef PJ_MAX_HOSTNAME
|
||||
# define PJ_MAX_HOSTNAME (128)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Constants for declaring the maximum handles that can be supported by
|
||||
* a single IOQ framework. This constant might not be relevant to the
|
||||
* underlying I/O queue impelementation, but still, developers should be
|
||||
* aware of this constant, to make sure that the program will not break when
|
||||
* the underlying implementation changes.
|
||||
*
|
||||
* For implementation based on select(), the value here will be used as the
|
||||
* maximum number of socket handles passed to select() (i.e. FD_SETSIZE will
|
||||
* be set to this value).
|
||||
*
|
||||
* Default: 64
|
||||
*/
|
||||
#ifndef PJ_IOQUEUE_MAX_HANDLES
|
||||
# define PJ_IOQUEUE_MAX_HANDLES (64)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Overrides FD_SETSIZE so it is consistent throughout the library.
|
||||
* OS specific configuration header (compat/os_*) might have declared
|
||||
* FD_SETSIZE, thus we only set if it hasn't been declared.
|
||||
*
|
||||
* Default: #PJ_IOQUEUE_MAX_HANDLES
|
||||
*/
|
||||
#ifndef FD_SETSIZE
|
||||
# define FD_SETSIZE PJ_IOQUEUE_MAX_HANDLES
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Has semaphore functionality?
|
||||
*
|
||||
* Default: 1
|
||||
*/
|
||||
#ifndef PJ_HAS_SEMAPHORE
|
||||
# define PJ_HAS_SEMAPHORE 1
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Event object (for synchronization, e.g. in Win32)
|
||||
*
|
||||
* Default: 1
|
||||
*/
|
||||
#ifndef PJ_HAS_EVENT_OBJ
|
||||
# define PJ_HAS_EVENT_OBJ 1
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Enable library's extra check.
|
||||
* If this macro is enabled, #PJ_ASSERT_RETURN macro will expand to
|
||||
* run-time checking. If this macro is disabled, #PJ_ASSERT_RETURN
|
||||
* will simply evaluate to #pj_assert().
|
||||
*
|
||||
* You can disable this macro to reduce size, at the risk of crashes
|
||||
* if invalid value (e.g. NULL) is passed to the library.
|
||||
*
|
||||
* Default: 1
|
||||
*/
|
||||
#ifndef PJ_ENABLE_EXTRA_CHECK
|
||||
# define PJ_ENABLE_EXTRA_CHECK 1
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Enable name registration for exceptions with #pj_exception_id_alloc().
|
||||
* If this feature is enabled, then the library will keep track of
|
||||
* names associated with each exception ID requested by application via
|
||||
* #pj_exception_id_alloc().
|
||||
*
|
||||
* Disabling this macro will reduce the code and .bss size by a tad bit.
|
||||
* See also #PJ_MAX_EXCEPTION_ID.
|
||||
*
|
||||
* Default: 1
|
||||
*/
|
||||
#ifndef PJ_HAS_EXCEPTION_NAMES
|
||||
# define PJ_HAS_EXCEPTION_NAMES 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Maximum number of unique exception IDs that can be requested
|
||||
* with #pj_exception_id_alloc(). For each entry, a small record will
|
||||
* be allocated in the .bss segment.
|
||||
*
|
||||
* Default: 16
|
||||
*/
|
||||
#ifndef PJ_MAX_EXCEPTION_ID
|
||||
# define PJ_MAX_EXCEPTION_ID 16
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
|
||||
/********************************************************************
|
||||
* General macros.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @def PJ_INLINE(type)
|
||||
* @param type The return type of the function.
|
||||
* Expand the function as inline.
|
||||
*/
|
||||
#define PJ_INLINE(type) PJ_INLINE_SPECIFIER type
|
||||
|
||||
/**
|
||||
* @def PJ_DECL(type)
|
||||
* @param type The return type of the function.
|
||||
* Declare a function.
|
||||
*/
|
||||
/**
|
||||
* @def PJ_DECL_NO_RETURN(type)
|
||||
* @param type The return type of the function.
|
||||
* Declare a function that will not return.
|
||||
*/
|
||||
/**
|
||||
* @def PJ_BEGIN_DECL
|
||||
* Mark beginning of declaration section in a header file.
|
||||
*/
|
||||
/**
|
||||
* @def PJ_END_DECL
|
||||
* Mark end of declaration section in a header file.
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
# define PJ_DECL(type) type
|
||||
# define PJ_DECL_NO_RETURN(type) type PJ_NORETURN
|
||||
# define PJ_BEGIN_DECL extern "C" {
|
||||
# define PJ_END_DECL }
|
||||
#else
|
||||
# define PJ_DECL(type) extern type
|
||||
# define PJ_DECL_NO_RETURN(type) PJ_NORETURN type
|
||||
# define PJ_BEGIN_DECL
|
||||
# define PJ_END_DECL
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def PJ_DEF(type)
|
||||
* @param type The return type of the function.
|
||||
* Define a function.
|
||||
*/
|
||||
#define PJ_DEF(type) type
|
||||
|
||||
/**
|
||||
* @def PJ_EXPORT_SYMBOL(sym)
|
||||
* @param sym The symbol to export.
|
||||
* Export the specified symbol in compilation type that requires export
|
||||
* (e.g. Linux kernel).
|
||||
*/
|
||||
#ifdef __PJ_EXPORT_SYMBOL
|
||||
# define PJ_EXPORT_SYMBOL(sym) __PJ_EXPORT_SYMBOL(sym)
|
||||
#else
|
||||
# define PJ_EXPORT_SYMBOL(sym)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def PJ_IDECL(type)
|
||||
* @param type The function's return type.
|
||||
* Declare a function that may be expanded as inline.
|
||||
*/
|
||||
/**
|
||||
* @def PJ_IDEF(type)
|
||||
* @param type The function's return type.
|
||||
* Define a function that may be expanded as inline.
|
||||
*/
|
||||
|
||||
#if PJ_FUNCTIONS_ARE_INLINED
|
||||
# define PJ_IDECL(type) PJ_INLINE(type)
|
||||
# define PJ_IDEF(type) PJ_INLINE(type)
|
||||
#else
|
||||
# define PJ_IDECL(type) PJ_DECL(type)
|
||||
# define PJ_IDEF(type) PJ_DEF(type)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def PJ_UNUSED_ARG(arg)
|
||||
* @param arg The argument name.
|
||||
* PJ_UNUSED_ARG prevents warning about unused argument in a function.
|
||||
*/
|
||||
#define PJ_UNUSED_ARG(arg) (void)arg
|
||||
|
||||
/**
|
||||
* @def PJ_TODO(id)
|
||||
* @param id Any identifier that will be printed as TODO message.
|
||||
* PJ_TODO macro will display TODO message as warning during compilation.
|
||||
* Example: PJ_TODO(CLEAN_UP_ERROR);
|
||||
*/
|
||||
#ifndef PJ_TODO
|
||||
# define PJ_TODO(id) TODO___##id:
|
||||
#endif
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* Sanity Checks
|
||||
*/
|
||||
#ifndef PJ_HAS_HIGH_RES_TIMER
|
||||
# error "PJ_HAS_HIGH_RES_TIMER is not defined!"
|
||||
#endif
|
||||
|
||||
#if !defined(PJ_HAS_PENTIUM)
|
||||
# error "PJ_HAS_PENTIUM is not defined!"
|
||||
#endif
|
||||
|
||||
#if !defined(PJ_IS_LITTLE_ENDIAN)
|
||||
# error "PJ_IS_LITTLE_ENDIAN is not defined!"
|
||||
#endif
|
||||
|
||||
#if !defined(PJ_IS_BIG_ENDIAN)
|
||||
# error "PJ_IS_BIG_ENDIAN is not defined!"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* PJLIB version string.
|
||||
*/
|
||||
extern const char *PJ_VERSION;
|
||||
|
||||
/**
|
||||
* Dump configuration to log with verbosity equal to info(3).
|
||||
*/
|
||||
PJ_DECL(void) pj_dump_config(void);
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
|
||||
#endif /* __PJ_CONFIG_H__ */
|
||||
|
|
@ -0,0 +1,119 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/ctype.h 4 10/14/05 12:26a Bennylp $ */
|
||||
#ifndef __PJ_CTYPE_H__
|
||||
#define __PJ_CTYPE_H__
|
||||
|
||||
/**
|
||||
* @file ctype.h
|
||||
* @brief C type helper macros.
|
||||
*/
|
||||
|
||||
#include <pj/compat/ctype.h>
|
||||
|
||||
/**
|
||||
* @defgroup pj_ctype ctype - Character Type
|
||||
* @ingroup PJ_MISC
|
||||
* @{
|
||||
*
|
||||
* This module contains several inline functions/macros for testing or
|
||||
* manipulating character types. It is provided in PJLIB because PJLIB
|
||||
* must not depend to LIBC.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns a non-zero value if either isalpha or isdigit is true for c.
|
||||
* @param c The integer character to test.
|
||||
* @return Non-zero value if either isalpha or isdigit is true for c.
|
||||
*/
|
||||
PJ_INLINE(int) pj_isalnum(int c) { return isalnum(c); }
|
||||
|
||||
/**
|
||||
* Returns a non-zero value if c is a particular representation of an
|
||||
* alphabetic character.
|
||||
* @param c The integer character to test.
|
||||
* @return Non-zero value if c is a particular representation of an
|
||||
* alphabetic character.
|
||||
*/
|
||||
PJ_INLINE(int) pj_isalpha(int c) { return isalpha(c); }
|
||||
|
||||
/**
|
||||
* Returns a non-zero value if c is a particular representation of an
|
||||
* ASCII character.
|
||||
* @param c The integer character to test.
|
||||
* @return Non-zero value if c is a particular representation of
|
||||
* an ASCII character.
|
||||
*/
|
||||
PJ_INLINE(int) pj_isascii(int c) { return isascii(c); }
|
||||
|
||||
/**
|
||||
* Returns a non-zero value if c is a particular representation of
|
||||
* a decimal-digit character.
|
||||
* @param c The integer character to test.
|
||||
* @return Non-zero value if c is a particular representation of
|
||||
* a decimal-digit character.
|
||||
*/
|
||||
PJ_INLINE(int) pj_isdigit(int c) { return isdigit(c); }
|
||||
|
||||
/**
|
||||
* Returns a non-zero value if c is a particular representation of
|
||||
* a space character (0x09 - 0x0D or 0x20).
|
||||
* @param c The integer character to test.
|
||||
* @return Non-zero value if c is a particular representation of
|
||||
* a space character (0x09 - 0x0D or 0x20).
|
||||
*/
|
||||
PJ_INLINE(int) pj_isspace(int c) { return isspace(c); }
|
||||
|
||||
/**
|
||||
* Returns a non-zero value if c is a particular representation of
|
||||
* a lowercase character.
|
||||
* @param c The integer character to test.
|
||||
* @return Non-zero value if c is a particular representation of
|
||||
* a lowercase character.
|
||||
*/
|
||||
PJ_INLINE(int) pj_islower(int c) { return islower(c); }
|
||||
|
||||
|
||||
/**
|
||||
* Returns a non-zero value if c is a particular representation of
|
||||
* a uppercase character.
|
||||
* @param c The integer character to test.
|
||||
* @return Non-zero value if c is a particular representation of
|
||||
* a uppercase character.
|
||||
*/
|
||||
PJ_INLINE(int) pj_isupper(int c) { return isupper(c); }
|
||||
|
||||
/**
|
||||
* Returns a non-zero value if c is a particular representation of
|
||||
* an hexadecimal digit character.
|
||||
* @param c The integer character to test.
|
||||
* @return Non-zero value if c is a particular representation of
|
||||
* an hexadecimal digit character.
|
||||
*/
|
||||
PJ_INLINE(int) pj_isxdigit(int c){ return isxdigit(c); }
|
||||
|
||||
/**
|
||||
* Returns a non-zero value if c is a either a space (' ') or horizontal
|
||||
* tab ('\\t') character.
|
||||
* @param c The integer character to test.
|
||||
* @return Non-zero value if c is a either a space (' ') or horizontal
|
||||
* tab ('\\t') character.
|
||||
*/
|
||||
PJ_INLINE(int) pj_isblank(int c) { return isblank(c); }
|
||||
|
||||
/**
|
||||
* Converts character to lowercase.
|
||||
* @param c The integer character to convert.
|
||||
* @return Lowercase character of c.
|
||||
*/
|
||||
PJ_INLINE(int) pj_tolower(int c) { return tolower(c); }
|
||||
|
||||
/**
|
||||
* Converts character to uppercase.
|
||||
* @param c The integer character to convert.
|
||||
* @return Uppercase character of c.
|
||||
*/
|
||||
PJ_INLINE(int) pj_toupper(int c) { return toupper(c); }
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* __PJ_CTYPE_H__ */
|
||||
|
|
@ -0,0 +1,880 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/doxygen.h 5 10/29/05 10:27p Bennylp $ */
|
||||
#ifndef __PJ_DOXYGEN_H__
|
||||
#define __PJ_DOXYGEN_H__
|
||||
|
||||
/**
|
||||
* @file doxygen.h
|
||||
* @brief Doxygen's mainpage.
|
||||
*/
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////*/
|
||||
/*
|
||||
INTRODUCTION PAGE
|
||||
*/
|
||||
|
||||
/**
|
||||
* @mainpage Welcome to PJLIB!
|
||||
*
|
||||
* @section intro_sec What is PJLIB
|
||||
*
|
||||
* PJLIB is a small foundation library written in C for making scalable
|
||||
* applications. Because of its small footprint, it can be used in embedded
|
||||
* applications (we hope so!), but yet the library is also aimed for
|
||||
* facilitating high performance protocol stacks.
|
||||
*
|
||||
* PJLIB is released under LGPL terms.
|
||||
*
|
||||
* @section download_sec Download
|
||||
*
|
||||
* PJLIB and all documentation can be downloaded from
|
||||
* http://www.bulukucing.org.
|
||||
*
|
||||
*
|
||||
* @section how_to_use_sec About This Documentation
|
||||
*
|
||||
* This document is generated directly from PJLIB source file using
|
||||
* \a doxygen (http://www.doxygen.org). Doxygen is a great (and free!)
|
||||
* tools for generating such documentation.
|
||||
*
|
||||
* @subsection doc_ver_subsec Version
|
||||
*
|
||||
* This document corresponds to PJLIB version 0.3-pre2.
|
||||
*
|
||||
*
|
||||
* @subsection find_samples_subsec How to Read This Document
|
||||
*
|
||||
* This documentation is laid out more to be a reference guide instead
|
||||
* of tutorial, therefore first time users may find it difficult to
|
||||
* grasp PJLIB by reading this document alone.
|
||||
*
|
||||
* However, we've tried our best to make this document easy to follow.
|
||||
* For first time users, we would suggest that you follow these steps
|
||||
* when reading this documentation:
|
||||
*
|
||||
* - continue reading this introduction chapter. At the end of this
|
||||
* chapter, you'll find section called \ref pjlib_fundamentals_sec
|
||||
* which should guide you to understand basic things about PJLIB.
|
||||
*
|
||||
* - find information about specific features that you want to use
|
||||
* in PJLIB. Use the <b>Module Index</b> to find out about all
|
||||
* features in PJLIB (if you're browsing the HTML documentation,
|
||||
* click on the \a Module link on top of the page, or if you're
|
||||
* reading the PDF documentation, click on \a Module \a Documentation
|
||||
* on the navigation pane on the left).
|
||||
*
|
||||
* @subsection doc_organize_sec How To's
|
||||
*
|
||||
* Please find below links to specific tasks that you probably
|
||||
* want to do:
|
||||
*
|
||||
* - <b>How to Build PJLIB</b>
|
||||
*\n
|
||||
* Please refer to \ref pjlib_build_sys_pg page for more information.
|
||||
*
|
||||
* - <b>How to Use PJLIB in My Application</b>
|
||||
*\n
|
||||
* Please refer to \ref configure_app_sec for more information.
|
||||
*
|
||||
* - <b>How to Port PJLIB</b>
|
||||
*\n
|
||||
* Please refer to \ref porting_pjlib_pg page.
|
||||
*
|
||||
* - <b>Where to Read Samples Documentation</b>
|
||||
*\n
|
||||
* Most of the modules provide link to the corresponding sample file.
|
||||
* Alternatively, to get the list of all examples, you can click on
|
||||
* <b>Related Pages</b> on the top of HTML document or on
|
||||
* <b>PJLIB Page Documentation</b> on navigation pane of your PDF reader.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* @section features_sec Features
|
||||
*
|
||||
* @subsection open_source_feat It's Open Source!
|
||||
*
|
||||
* PJLIB is currently released on LGPL license. We may release PJLIB under
|
||||
* additional schemes in the future (such as GPL or MPL) to incorporate
|
||||
* linking with specific application, however, one thing for sure is
|
||||
* we will NEVER be able to make PJLIB a proprietary software.
|
||||
*
|
||||
* @subsection extreme_portable_feat Extreme Portability
|
||||
*
|
||||
* PJLIB is designed to be extremely portable. It can run on any kind
|
||||
* of processors (16-bit, 32-bit, or 64-bit, big or little endian, single
|
||||
* or multi-processors) and operating systems. Floating point or no
|
||||
* floating point. Multi-threading or not.
|
||||
* It can even run in environment where no ANSI LIBC is available.
|
||||
*
|
||||
* Currently PJLIB is being ported to:
|
||||
* - x86, Win32 (Win95/98/ME, NT/2000/XP/2003, mingw).
|
||||
* - x86, Linux (user mode and as <b>kernel module</b>(!)).
|
||||
* - alpha, Linux
|
||||
* And coming up:
|
||||
* - x86, eCos
|
||||
* - ultra-II, Solaris.
|
||||
* - powerpc, MacOS
|
||||
* - m68k, PalmOS.
|
||||
* - arm, PocketPC
|
||||
*
|
||||
* No other library is known to have this extreme portability!
|
||||
*
|
||||
* @subsection small_size_feat Small in Size
|
||||
*
|
||||
* One of the primary objectives is to have library that is small in size for
|
||||
* typical embedded applications. As a rough guidance, we aim to keep the
|
||||
* library size below 100KB for it to be considered as small.
|
||||
* As the result, most of the functionalities in the library can be tailored
|
||||
* to meet the requirements; user can enable/disable specific functionalities
|
||||
* to get the desired size/performance/functionality balance.
|
||||
*
|
||||
* For more info, please see @ref pj_config.
|
||||
*
|
||||
* @subsection no_dyn_mem No Dynamic Memory Allocations
|
||||
*
|
||||
* The central idea of PJLIB is that for applications to run as fast as it can,
|
||||
* it should not use \a malloc() at all, but instead should get the memory
|
||||
* from a preallocated storage pool. There are few things that can be
|
||||
* optimized with this approach:
|
||||
*
|
||||
* - \a alloc() is a O(1) operation.
|
||||
* - no mutex is used inside alloc(). It is assumed that synchronization
|
||||
* will be used in higher abstraction by application anyway.
|
||||
* - no \a free() is required. All chunks will be deleted when the pool is
|
||||
* destroyed.
|
||||
*
|
||||
* The performance gained on some systems can be as high as 10x speed up
|
||||
* against \a malloc() and \a free().
|
||||
*
|
||||
* For more information, see \ref PJ_POOL_GROUP
|
||||
*
|
||||
*
|
||||
* @subsection os_abstract_feat Operating System Abstraction
|
||||
*
|
||||
* PJLIB has abstractions for features that are normally not portable
|
||||
* across operating systems:
|
||||
* - @ref PJ_THREAD
|
||||
*\n
|
||||
* Portable thread manipulation.
|
||||
* - @ref PJ_TLS
|
||||
*\n
|
||||
* Storing data in thread's private data.
|
||||
* - @ref PJ_MUTEX
|
||||
*\n
|
||||
* Mutual exclusion protection.
|
||||
* - @ref PJ_SEM
|
||||
*\n
|
||||
* Semaphores.
|
||||
* - @ref PJ_ATOMIC
|
||||
*\n
|
||||
* Atomic variables and their operations.
|
||||
* - @ref PJ_CRIT_SEC
|
||||
*\n
|
||||
* Fast locking of critical sections.
|
||||
* - @ref PJ_LOCK
|
||||
*\n
|
||||
* High level abstraction for lock objects.
|
||||
* - @ref PJ_EVENT
|
||||
*\n
|
||||
* Event object.
|
||||
* - @ref PJ_TIME
|
||||
*\n
|
||||
* Portable time manipulation.
|
||||
* - @ref PJ_TIMESTAMP
|
||||
*\n
|
||||
* High resolution time value.
|
||||
* - etc.
|
||||
*
|
||||
*
|
||||
* @subsection ll_network_io_sec Low-Level Network I/O
|
||||
*
|
||||
* PJLIB has very portable abstraction and fairly complete set of API for
|
||||
* doing network I/O communications. At the lowest level, PJLIB provides:
|
||||
*
|
||||
* - @ref PJ_SOCK
|
||||
*\n
|
||||
* A highly portable socket abstraction, runs on all kind of
|
||||
* network APIs such as standard BSD socket, Windows socket, Linux
|
||||
* \b kernel socket, PalmOS networking API, etc.
|
||||
*
|
||||
* - @ref pj_addr_resolve
|
||||
*\n
|
||||
* Portable address resolution, which implements #pj_gethostbyname().
|
||||
*
|
||||
* - @ref PJ_SOCK_SELECT
|
||||
*\n
|
||||
* A portable \a select() like API (#pj_sock_select()) which can be
|
||||
* implemented with various back-end.
|
||||
*
|
||||
*
|
||||
* @subsection hl_network_io_sec High-Level Network I/O
|
||||
*
|
||||
* At higher abstraction, PJLIB provides @ref PJ_IOQUEUE,
|
||||
* which promotes creating high performance network
|
||||
* applications by managing asynchronous I/O. This is a passive framework
|
||||
* that utilizes the most effective way to manage asynchronous I/O
|
||||
* on a given platform, such as:
|
||||
* - IoCompletionPort on WinNT,
|
||||
* - on Linux it can use either /dev/epoll or aio.
|
||||
* - or to fall back to use @a select()
|
||||
*
|
||||
* At even a higher abstraction, PJLIB provides @ref PJ_EQUEUE, which
|
||||
* combines asynchronous I/O with timer management and thread management
|
||||
* to fasilitate creating trully high performance, event driven
|
||||
* application.
|
||||
*
|
||||
*
|
||||
* @subsection timer_mgmt_sec Timer Management
|
||||
*
|
||||
* A passive framework for managing timer, see @ref PJ_TIMER for more info.
|
||||
* There is also function to retrieve high resolution timestamp
|
||||
* from the system (see @ref PJ_TIMESTAMP).
|
||||
*
|
||||
*
|
||||
* @subsection lexical_scanner_sec Lexical Scanner
|
||||
*
|
||||
* A fast, small, top-down lexical scanner to create fully optimized
|
||||
* hand-written parser. See @ref PJ_SCAN for more info.
|
||||
*
|
||||
* @subsection data_struct_sec Various Data Structures
|
||||
*
|
||||
* Various data structures are provided in the library:
|
||||
*
|
||||
* - @ref PJ_PSTR
|
||||
* - @ref PJ_ARRAY
|
||||
* - @ref PJ_HASH
|
||||
* - @ref PJ_LIST
|
||||
* - @ref PJ_RBTREE
|
||||
*
|
||||
*
|
||||
* @subsection exception_sec Exception Construct
|
||||
*
|
||||
* A convenient TRY/CATCH like construct to propagate errors, which by
|
||||
* default are used by the @ref PJ_POOL_GROUP "memory pool" and
|
||||
* the @ref PJ_SCAN "scanner". The exception
|
||||
* construct can be used to write programs like below:
|
||||
*
|
||||
* <pre>
|
||||
* #define SYNTAX_ERROR 1
|
||||
*
|
||||
* PJ_TRY {
|
||||
* msg = NULL;
|
||||
* msg = parse_msg(buf, len);
|
||||
* }
|
||||
* PJ_CATCH ( SYNTAX_ERROR ) {
|
||||
* .. handle error ..
|
||||
* }
|
||||
* PJ_END;
|
||||
* </pre>
|
||||
*
|
||||
* Please see @ref PJ_EXCEPT for more information.
|
||||
*
|
||||
*
|
||||
* @subsection logging_sec Logging Facility
|
||||
*
|
||||
* PJLIB @ref PJ_LOG consists of macros to write logging information to
|
||||
* some output device. Some of the features of the logging facility:
|
||||
*
|
||||
* - the verbosity can be fine-tuned both at compile time (to control
|
||||
* the library size) or run-time (to control the verbosity of the
|
||||
* information).
|
||||
* - output device is configurable (e.g. stdout, printk, file, etc.)
|
||||
* - log decoration is configurable.
|
||||
*
|
||||
* See @ref PJ_LOG for more information.
|
||||
*
|
||||
*
|
||||
* @subsection guid_gen_sec Random and GUID Generation
|
||||
*
|
||||
* PJLIB provides facility to create random string
|
||||
* (#pj_create_random_string()) or globally unique identifier
|
||||
* (see @ref PJ_GUID).
|
||||
*
|
||||
*
|
||||
*
|
||||
* @section configure_app_sec Configuring Application to use PJLIB
|
||||
*
|
||||
* @subsection pjlib_compil_sec Building PJLIB
|
||||
*
|
||||
* Follow the instructions in \ref pjlib_build_sys_pg to build
|
||||
* PJLIB.
|
||||
*
|
||||
* @subsection pjlib_compil_app_sec Building Applications with PJLIB
|
||||
*
|
||||
* Use the following settings when building applications with PJLIB.
|
||||
*
|
||||
* @subsubsection compil_inc_dir_sec Include Search Path
|
||||
*
|
||||
* Add this to your include search path ($PJLIB is PJLIB root directory):
|
||||
* <pre>
|
||||
* $PJLIB/include
|
||||
* </pre>
|
||||
*
|
||||
* @subsubsection compil_inc_file_sec Include PJLIB Header
|
||||
*
|
||||
* To include all PJLIB headers:
|
||||
* \verbatim
|
||||
#include <pjlib.h>
|
||||
\endverbatim
|
||||
*
|
||||
* Alternatively, you can include individual PJLIB headers like this:
|
||||
* \verbatim
|
||||
#include <pj/log.h>
|
||||
#include <pj/os.h>
|
||||
\endverbatim
|
||||
*
|
||||
*
|
||||
* @subsubsection compil_lib_dir_sec Library Path
|
||||
*
|
||||
* Add this to your library search path:
|
||||
* <pre>
|
||||
* $PJLIB/lib
|
||||
* </pre>
|
||||
*
|
||||
* Then add the appropriate PJLIB library to your link specification. For
|
||||
* example, you would add \c libpj-i386-linux-gcc.a when you're building
|
||||
* applications in Linux.
|
||||
*
|
||||
*
|
||||
* @subsection pjlib_fundamentals_sec Principles in Using PJLIB
|
||||
*
|
||||
* Few things that you \b MUST do when using PJLIB, to make sure that
|
||||
* you create trully portable applications.
|
||||
*
|
||||
* @subsubsection call_pjlib_init_sec Call pj_init()
|
||||
*
|
||||
* Before you do anything else, call \c pj_init(). This would make sure that
|
||||
* PJLIB system is properly set up.
|
||||
*
|
||||
* @subsubsection no_ansi_subsec Do NOT Use ANSI C
|
||||
*
|
||||
* Contrary to popular teaching, ANSI C (and LIBC) is not the most portable
|
||||
* library in the world, nor it's the most ubiquitous. For example, LIBC
|
||||
* is not available in Linux kernel. Also normally LIBC will be excluded
|
||||
* from compilation of RTOSes to reduce size.
|
||||
*
|
||||
* So for maximum portability, do NOT use ANSI C. Do not even try to include
|
||||
* any other header files outside <include/pj>. Stick with the functionalities
|
||||
* provided by PJLIB.
|
||||
*
|
||||
*
|
||||
* @subsubsection string_rep_subsubsec Use pj_str_t instead of C Strings
|
||||
*
|
||||
* PJLIB uses pj_str_t instead of normal C strings. You SHOULD follow this
|
||||
* convention too. Remember, ANSI string-h is not always available. And
|
||||
* PJLIB string is faster!
|
||||
*
|
||||
* @subsubsection mem_alloc_subsubsec Use Pool for Memory Allocations
|
||||
*
|
||||
* You MUST NOT use \a malloc() or any other memory allocation functions.
|
||||
* Use PJLIB pool instead! It's faster and most portable.
|
||||
*
|
||||
* @subsection logging_subsubsec Use Logging for Text Display
|
||||
*
|
||||
* DO NOT use <stdio.h> for text output. Use PJLIB logging instead.
|
||||
*
|
||||
*
|
||||
* @section porting_pjlib_sec0 Porting PJLIB
|
||||
*
|
||||
* Please see \ref porting_pjlib_pg page on more information to port
|
||||
* PJLIB to new target.
|
||||
*
|
||||
* @section enjoy_sec Enjoy Using PJLIB!
|
||||
*
|
||||
* We hope that you find PJLIB usefull for your application. If you
|
||||
* have any questions, suggestions, critics, bug fixes, or anything
|
||||
* else, we would be happy to hear it.
|
||||
*
|
||||
* Enjoy using PJLIB!
|
||||
*
|
||||
* Benny Prijono < bennylp at bulukucing dot org >
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*////////////////////////////////////////////////////////////////////////// */
|
||||
/*
|
||||
BUILDING AND INSTALLING PJLIB
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @page pjlib_build_sys_pg Building, and Installing PJLIB
|
||||
*
|
||||
* @section build_sys_install_sec Build and Installation
|
||||
*
|
||||
* @subsection build_sys_install_win32_sec Visual Studio
|
||||
*
|
||||
* The PJLIB Visual Studio workspace supports the building of PJLIB
|
||||
* for Win32 target. Although currently only the Visual Studio 6 Workspace is
|
||||
* actively maintained, developers with later version of Visual Studio
|
||||
* can easily imports VS6 workspace into their IDE.
|
||||
*
|
||||
* To start building PJLIB projects with Visual Studio 6 or later, open
|
||||
* the \a workspace file in the corresponding \b \c build directory. You have
|
||||
* several choices on which \a dsw file to open:
|
||||
\verbatim
|
||||
$PJPROJECT/build/pjproject.dsw
|
||||
$PJPROJECT/pjlib/build/pjlib.dsw
|
||||
$PJPROJECT/pjsip/build/pjsip.dsw
|
||||
..etc
|
||||
\endverbatim
|
||||
*
|
||||
* The easiest way is to open <tt>pjproject.dsw</tt> file in \b \c $PJPROJECT/build
|
||||
* directory. However this will only build the required projects, not
|
||||
* the complete projects. For example, the PJLIB test and samples projects
|
||||
* are not included in this workspace. To build the complete projects, you must
|
||||
* open and build each \a dsw file in \c build directory in each
|
||||
* subprojects. For example, to open the complete PJLIB workspace, open
|
||||
* <tt>pjlib.dsw</tt> in <tt>$PJPROJECT/pjlib/build</tt> directory.
|
||||
*
|
||||
* @subsection build_sys_install_unix_sec Make System
|
||||
*
|
||||
* For other targets, PJLIB provides a rather comprehensive build system
|
||||
* that uses GNU \a make (and only GNU \a make will work).
|
||||
* Currently, the build system supports building * PJLIB for these targets:
|
||||
* - i386/Win32/mingw
|
||||
* - i386/Linux
|
||||
* - i386/Linux (kernel)
|
||||
*
|
||||
* Generally, steps required to build the projects are:
|
||||
*
|
||||
\verbatim
|
||||
$ cd /home/user/pjproject-0.3 # <-- go to $PJPROJECT\n
|
||||
$ vi build.mak # <-- set build target etc\n
|
||||
$ cd pjlib/build # <-- go to projet's build dir\n
|
||||
$ make # <-- build the project\n
|
||||
\endverbatim
|
||||
*
|
||||
* For other project, \a cd to <tt>build</tt> directory in the project
|
||||
* and execute \a make from there.
|
||||
*
|
||||
* \note For Linux kernel target, there are additional steps required, which
|
||||
* will be explained in section \ref linux_kern_target_subsec.
|
||||
*
|
||||
* @subsubsection build_mak_sec Editing build.mak
|
||||
*
|
||||
* The \c build.mak file in \c $PJPROJECT root directory is used to
|
||||
* specify the build configuration. This file is expected to export
|
||||
* the following \a make variables:
|
||||
*
|
||||
* - \c MACHINE_NAME
|
||||
*\n
|
||||
* Target machine/processor, one of: <b>{ i386 }</b>.
|
||||
*
|
||||
* - \c OS_NAME
|
||||
*\n
|
||||
* Target operating system, one of: <b>{ win32 | linux | linux-kernel }</b>.
|
||||
*
|
||||
* - \c CC_NAME
|
||||
*\n
|
||||
* Compiler name: <b>{ gcc | vc }</b>
|
||||
*
|
||||
* - \c HOST_NAME
|
||||
*\n
|
||||
* Build host: <b>{ unix | mingw }</b>
|
||||
*
|
||||
* These variables will cause the correct configuration file in
|
||||
* \c $PJPROJECT/build directory to be executed by \a make. For
|
||||
* example, specifying \c OS_NAME=linux will cause file \c os-linux.mak
|
||||
* in \c build directory to be executed. These files contain specific
|
||||
* configuration for the option that is selected.
|
||||
*
|
||||
* For Linux kernel target, you are also required to declare the following
|
||||
* variables in this file:
|
||||
* - \c KERNEL_DIR: full path of kernel source tree.
|
||||
* - \c KERNEL_ARCH: kernel ARCH options (e.g. "ARCH=um"), or leave blank
|
||||
* for default.
|
||||
* - \c PJPROJECT_DIR: full path of PJPROJECT source tree.
|
||||
*
|
||||
* Apart from these, there are also additional steps required to build
|
||||
* Linux kernel target, which will be explained in \ref linux_kern_target_subsec.
|
||||
*
|
||||
* @subsubsection build_dir_sec Files in "build" Directory
|
||||
*
|
||||
* The <tt>*.mak</tt> files in \c $PJPROJECT/build directory are used to specify
|
||||
* the configuration for the specified compiler, target machine target
|
||||
* operating system, and host options. These files will be executed
|
||||
* (included) by \a make during building process, depending on the values
|
||||
* specified in <b>$PJPROJECT/build.mak</b> file.
|
||||
*
|
||||
* Normally you don't need to edit these files, except when you're porting
|
||||
* PJLIB to new target.
|
||||
*
|
||||
* Below are the description of some files in this directory:
|
||||
*
|
||||
* - <tt>rules.mak</tt>: contains generic rules always included during make.
|
||||
* - <tt>cc-gcc.mak</tt>: rules when gcc is used for compiler.
|
||||
* - <tt>cc-vc.mak</tt>: rules when MSVC compiler is used.
|
||||
* - <tt>host-mingw.mak</tt>: rules for building in mingw host.
|
||||
* - <tt>host-unix.mak</tt>: rules for building in Unix/Posix host.
|
||||
* - <tt>host-win32.mak</tt>: rules for building in Win32 command console
|
||||
* (only valid when VC is used).
|
||||
* - <tt>m-i386.mak</tt>: rules when target machine is an i386 processor.
|
||||
* - <tt>m-m68k.mak</tt>: rules when target machine is an m68k processor.
|
||||
* - <tt>os-linux.mak</tt>: rules when target OS is Linux.
|
||||
* - <tt>os-linux-kernel.mak</tt>: rules when PJLIB is to be build as
|
||||
* part of Linux kernel.
|
||||
* - <tt>os-win32.mak</tt>: rules when target OS is Win32.
|
||||
*
|
||||
* @subsubsection invoking_make_sec Invoking make
|
||||
*
|
||||
* Normally, \a make is invoked in \c build directory under each project.
|
||||
* For example, to build PJLIB, you would invoke \a make in
|
||||
* \c $PJPROJECT/pjlib/build directory like below:
|
||||
*
|
||||
\verbatim
|
||||
$ cd pjlib/build
|
||||
$ make
|
||||
\endverbatim
|
||||
*
|
||||
*
|
||||
*
|
||||
* @subsubsection linux_kern_target_subsec Linux Kernel Target
|
||||
*
|
||||
* \note
|
||||
* <b>BUILDING APPLICATIONS IN LINUX KERNEL MODE IS A VERY DANGEROUS BUSINESS.
|
||||
* YOU MAY CRASH THE WHOLE OF YOUR SYSTEM, CORRUPT YOUR HARDISK, ETC. PJLIB
|
||||
* KERNEL MODULES ARE STILL IN EXPERIMENTAL PHASE. DO NOT RUN IT IN PRODUCTION
|
||||
* SYSTEMS OR OTHER SYSTEMS WHERE RISK OF LOSS OF DATA IS NOT ACCEPTABLE.
|
||||
* YOU HAVE BEEN WARNED.</b>
|
||||
*
|
||||
* \note
|
||||
* <b>User Mode Linux (UML)</b> provides excellent way to experiment with Linux
|
||||
* kernel without risking the stability of the host system. See
|
||||
* http://user-mode-linux.sourceforge.net for details.
|
||||
*
|
||||
* \note
|
||||
* I only use <b>UML</b> to experiment with PJLIB kernel modules.
|
||||
* <b>I wouldn't be so foolish to use my host Linux machine to experiment
|
||||
* with this.</b>
|
||||
*
|
||||
* \note
|
||||
* You have been warned.
|
||||
*
|
||||
* For building PJLIB for Linux kernel target, there are additional steps required.
|
||||
* In general, the additional tasks are:
|
||||
* - Declare some more variables in <b><tt>build.mak</tt></b> file (this
|
||||
* has been explained in \ref build_mak_sec above).
|
||||
* - Perform these two small modifications in kernel source tree.
|
||||
*
|
||||
* There are two small modification need to be applied to the kernel tree.
|
||||
*
|
||||
* <b>1. Edit <tt>Makefile</tt> in kernel root source tree.</b>
|
||||
*
|
||||
* Add the following lines at the end of the <tt>Makefile</tt> in your
|
||||
* <tt>$KERNEL_SRC</tt> dir:
|
||||
\verbatim
|
||||
script:
|
||||
$(SCRIPT)
|
||||
\endverbatim
|
||||
*
|
||||
* \note Remember to replace spaces with <b>tab</b> in the Makefile.
|
||||
*
|
||||
* The modification above is needed to capture kernel's \c $CFLAGS and
|
||||
* \c $CFLAGS_MODULE which will be used for PJLIB's compilation.
|
||||
*
|
||||
* <b>2. Add Additional Exports.</b>
|
||||
*
|
||||
* We need the kernel to export some more symbols for our use. So we declare
|
||||
* the additional symbols to be exported in <tt>extra-exports.c</tt> file, and add
|
||||
* a this file to be compiled into the kernel:
|
||||
*
|
||||
* - Copy the file <tt>extra-exports.c</tt> from <tt>pjlib/src/pj</tt>
|
||||
* directory to <tt>$KERNEL_SRC/kernel/</tt> directory.
|
||||
* - Edit <tt>Makefile</tt> in that directory, and add this line
|
||||
* somewhere after the declaration of that variable:
|
||||
\verbatim
|
||||
obj-y += extra-exports.o
|
||||
\endverbatim
|
||||
*
|
||||
* To illustrate what have been done in your kernel source tree, below
|
||||
* is screenshot of my kernel source tree _after_ the modification.
|
||||
*
|
||||
\verbatim
|
||||
[root@vpc-linux linux-2.6.7]# pwd
|
||||
/usr/src/linux-2.6.7
|
||||
[root@vpc-linux linux-2.6.7]#
|
||||
[root@vpc-linux linux-2.6.7]#
|
||||
[root@vpc-linux linux-2.6.7]# tail Makefile
|
||||
|
||||
endif # skip-makefile
|
||||
|
||||
FORCE:
|
||||
|
||||
.PHONY: script
|
||||
|
||||
script:
|
||||
$(SCRIPT)
|
||||
|
||||
[root@vpc-linux linux-2.6.7]#
|
||||
[root@vpc-linux linux-2.6.7]#
|
||||
[root@vpc-linux linux-2.6.7]# head kernel/extra-exports.c
|
||||
#include <linux/module.h>
|
||||
#include <linux/syscalls.h>
|
||||
|
||||
EXPORT_SYMBOL(sys_select);
|
||||
|
||||
EXPORT_SYMBOL(sys_epoll_create);
|
||||
EXPORT_SYMBOL(sys_epoll_ctl);
|
||||
EXPORT_SYMBOL(sys_epoll_wait);
|
||||
|
||||
EXPORT_SYMBOL(sys_socket);
|
||||
[root@vpc-linux linux-2.6.7]#
|
||||
[root@vpc-linux linux-2.6.7]#
|
||||
[root@vpc-linux linux-2.6.7]# head -15 kernel/Makefile
|
||||
#
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
obj-y = sched.o fork.o exec_domain.o panic.o printk.o profile.o \
|
||||
exit.o itimer.o time.o softirq.o resource.o \
|
||||
sysctl.o capability.o ptrace.o timer.o user.o \
|
||||
signal.o sys.o kmod.o workqueue.o pid.o \
|
||||
rcupdate.o intermodule.o extable.o params.o posix-timers.o \
|
||||
kthread.o
|
||||
|
||||
obj-y += extra-exports.o
|
||||
|
||||
obj-$(CONFIG_FUTEX) += futex.o
|
||||
obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
|
||||
[root@vpc-linux linux-2.6.7]#
|
||||
|
||||
\endverbatim
|
||||
*
|
||||
* Then you must rebuild the kernel.
|
||||
* If you fail to do this, you won't be able to <b>insmod</b> pjlib.
|
||||
*
|
||||
* \note You will see a lots of warning messages during pjlib-test compilation.
|
||||
* The warning messages complain about unresolved symbols which are defined
|
||||
* in pjlib module. You can safely ignore these warnings. However, you can not
|
||||
* ignore warnings about non-pjlib unresolved symbols.
|
||||
*
|
||||
*
|
||||
* @subsection makefile_explained_sec Makefile Explained
|
||||
*
|
||||
* The \a Makefile for each project (e.g. PJLIB, PJSIP, etc) should be
|
||||
* very similar in the contents. The Makefile is located under \c build
|
||||
* directory in each project subdir.
|
||||
*
|
||||
* @subsubsection pjlib_makefile_subsec PJLIB Makefile.
|
||||
*
|
||||
* Below is PJLIB's Makefile:
|
||||
*
|
||||
* \include build/Makefile
|
||||
*
|
||||
* @subsubsection pjlib_os_makefile_subsec PJLIB os-linux.mak.
|
||||
*
|
||||
* Below is file <tt><b>os-linux.mak</b></tt> file in
|
||||
* <tt>$PJPROJECT/pjlib/build</tt> directory,
|
||||
* which is OS specific configuration file for Linux target that is specific
|
||||
* for PJLIB project. For \b global OS specific configuration, please see
|
||||
* <tt>$PJPROJECT/build/os-*.mak</tt>.
|
||||
*
|
||||
* \include build/os-linux.mak
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*////////////////////////////////////////////////////////////////////////// */
|
||||
/*
|
||||
PORTING PJLIB
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @page porting_pjlib_pg Porting PJLIB
|
||||
*
|
||||
*
|
||||
* @section new_arch_sec Porting to New CPU Architecture
|
||||
*
|
||||
* Below is step-by-step guide to add support for new CPU architecture.
|
||||
* This sample is based on porting to Alpha architecture; however steps for
|
||||
* porting to other CPU architectures should be pretty similar.
|
||||
*
|
||||
* Also note that in this example, the operating system used is <b>Linux</b>.
|
||||
* Should you wish to add support for new operating system, then follow
|
||||
* the next section \ref porting_os_sec.
|
||||
*
|
||||
* Step-by-step guide to port to new CPU architecture:
|
||||
* - decide the name for the new architecture. In this case, we choose
|
||||
* <tt><b>alpha</b></tt>.
|
||||
* - edit file <tt>$PJPROJECT/build.mak</tt>, and add new section for
|
||||
* the new target:
|
||||
* <pre>
|
||||
* #
|
||||
* # Linux alpha, gcc
|
||||
* #
|
||||
* export MACHINE_NAME := <b>alpha</b>
|
||||
* export OS_NAME := linux
|
||||
* export CC_NAME := gcc
|
||||
* export HOST_NAME := unix
|
||||
* </pre>
|
||||
*
|
||||
* - create a new file <tt>$PJPROJECT/build/<b>m-alpha</b>.mak</tt>.
|
||||
* Alternatively create a copy from other file in this directory.
|
||||
* The contents of this file will look something like:
|
||||
* <pre>
|
||||
* export M_CFLAGS := $(CC_DEF)<b>PJ_M_ALPHA=1</b>
|
||||
* export M_CXXFLAGS :=
|
||||
* export M_LDFLAGS :=
|
||||
* export M_SOURCES :=
|
||||
* </pre>
|
||||
* - create a new file <tt>$PJPROJECT/pjlib/include/pj/compat/<b>m_alpha.h</b></tt>.
|
||||
* Alternatively create a copy from other header file in this directory.
|
||||
* The contents of this file will look something like:
|
||||
* <pre>
|
||||
* #define PJ_HAS_PENTIUM 0
|
||||
* #define PJ_IS_LITTLE_ENDIAN 1
|
||||
* #define PJ_IS_BIG_ENDIAN 0
|
||||
* </pre>
|
||||
* - edit <tt>pjlib/include/pj/<b>config.h</b></tt>. Add new processor
|
||||
* configuration in this header file, like follows:
|
||||
* <pre>
|
||||
* ...
|
||||
* #elif defined (PJ_M_ALPHA) && PJ_M_ALPHA != 0
|
||||
* # include <pj/compat/m_alpha.h>
|
||||
* ...
|
||||
* </pre>
|
||||
* - done. Build PJLIB with:
|
||||
* <pre>
|
||||
* $ cd $PJPROJECT/pjlib/build
|
||||
* $ make dep
|
||||
* $ make clean
|
||||
* $ make
|
||||
* </pre>
|
||||
*
|
||||
* @section porting_os_sec Porting to New Operating System Target
|
||||
*
|
||||
* This section will try to give you rough guideline on how to
|
||||
* port PJLIB to a new target. As a sample, we give the target a name tag,
|
||||
* for example <tt><b>xos</b></tt> (for X OS).
|
||||
*
|
||||
* @subsection new_compat_os_h_file_sec Create New Compat Header File
|
||||
*
|
||||
* You'll need to create a new header file
|
||||
* <b><tt>include/pj/compat/os_xos.h</tt></b>. You can copy as a
|
||||
* template other header file and edit it accordingly.
|
||||
*
|
||||
* @subsection modify_config_h_file_sec Modify config.h
|
||||
*
|
||||
* Then modify file <b><tt>include/pj/config.h</tt></b> to include
|
||||
* this file accordingly (e.g. when macro <tt><b>PJ_XOS</b></tt> is
|
||||
* defined):
|
||||
*
|
||||
\verbatim
|
||||
...
|
||||
#elif defined(PJ_XOS)
|
||||
# include <pj/compat/os_xos.h>
|
||||
#else
|
||||
#...
|
||||
\endverbatim
|
||||
*
|
||||
* @subsection new_target_mak_file_sec Create New Global Make Config File
|
||||
*
|
||||
* Then you'll need to create global configuration file that
|
||||
* is specific for this OS, i.e. <tt><b>os-xos.mak</b></tt> in
|
||||
* <tt><b>$PJPROJECT/build</b></tt> directory.
|
||||
*
|
||||
* At very minimum, the file will normally need to define
|
||||
* <tt><b>PJ_XOS=1</b></tt> in the \c CFLAGS section:
|
||||
*
|
||||
\verbatim
|
||||
#
|
||||
# $PJPROJECT/build/os-xos.mak:
|
||||
#
|
||||
export OS_CFLAGS := $(CC_DEF)PJ_XOS=1
|
||||
export OS_CXXFLAGS :=
|
||||
export OS_LDFLAGS :=
|
||||
export OS_SOURCES :=
|
||||
\endverbatim
|
||||
*
|
||||
*
|
||||
* @subsection new_target_prj_mak_file_sec Create New Project's Make Config File
|
||||
*
|
||||
* Then you'll need to create xos-specific configuration file
|
||||
* for PJLIB. This file is also named <tt><b>os-xos.mak</b></tt>,
|
||||
* but its located in <tt><b>pjlib/build</b></tt> directory.
|
||||
* This file will specify source files that are specific to
|
||||
* this OS to be included in the build process.
|
||||
*
|
||||
* Below is a sample:
|
||||
\verbatim
|
||||
#
|
||||
# pjlib/build/os-xos.mak:
|
||||
# XOS specific configuration for PJLIB.
|
||||
#
|
||||
export PJLIB_OBJS += os_core_xos.o \
|
||||
os_error_unix.o \
|
||||
os_time_ansi.o
|
||||
export TEST_OBJS += main.o
|
||||
export TARGETS = pjlib pjlib-test
|
||||
\endverbatim
|
||||
*
|
||||
* @subsection new_target_src_sec Create and Edit Source Files
|
||||
*
|
||||
* You'll normally need to create at least these files:
|
||||
* - <tt><b>os_core_xos.c</b></tt>: core OS specific
|
||||
* functionality.
|
||||
* - <tt><b>os_timestamp_xos.c</b></tt>: how to get timestamp
|
||||
* in this OS.
|
||||
*
|
||||
* Depending on how things are done in your OS, you may need
|
||||
* to create these files:
|
||||
* - <tt><b>os_error_*.c</b></tt>: how to manipulate
|
||||
* OS error codes. Alternatively you may use existing
|
||||
* <tt>os_error_unix.c</tt> if the OS has \c errno and
|
||||
* \c strerror() function.
|
||||
* - <tt><b>ioqueue_*.c</b></tt>: if the OS has specific method
|
||||
* to perform asynchronous I/O. Alternatively you may
|
||||
* use existing <tt>ioqueue_select.c</tt> if the OS supports
|
||||
* \c select() function call.
|
||||
* - <tt><b>sock_*.c</b></tt>: if the OS has specific method
|
||||
* to perform socket communication. Alternatively you may
|
||||
* use existing <tt>sock_bsd.c</tt> if the OS supports
|
||||
* BSD socket API, and edit <tt>include/pj/compat/socket.h</tt>
|
||||
* file accordingly.
|
||||
*
|
||||
* You will also need to check various files in
|
||||
* <tt><b>include/pj/compat/*.h</b></tt>, to see if they're
|
||||
* compatible with your OS.
|
||||
*
|
||||
* @subsection new_target_build_file_sec Build The Project
|
||||
*
|
||||
* After basic building blocks have been created for the OS, then
|
||||
* the easiest way to see which parts need to be fixed is by building
|
||||
* the project and see the error messages.
|
||||
*
|
||||
* @subsection new_target_edit_vs_new_file_sec Editing Existing Files vs Creating New File
|
||||
*
|
||||
* When you encounter compatibility errors in PJLIB during porting,
|
||||
* you have three options on how to fix the error:
|
||||
* - edit the existing <tt>*.c</tt> file, and give it <tt>#ifdef</tt>
|
||||
* switch for the new OS, or
|
||||
* - edit <tt>include/pj/compat/*.h</tt> instead, or
|
||||
* - create a totally new file.
|
||||
*
|
||||
* Basicly there is no strict rule on which approach is the best
|
||||
* to use, however the following guidelines may be used:
|
||||
* - if the file is expected to be completely different than
|
||||
* any existing file, then perhaps you should create a completely
|
||||
* new file. For example, file <tt>os_core_xxx.c</tt> will
|
||||
* normally be different for each OS flavour.
|
||||
* - if the difference can be localized in <tt>include/compat</tt>
|
||||
* header file, and existing <tt>#ifdef</tt> switch is there,
|
||||
* then preferably you should edit this <tt>include/compat</tt>
|
||||
* header file.
|
||||
* - if the existing <tt>*.c</tt> file has <tt>#ifdef</tt> switch,
|
||||
* then you may add another <tt>#elif</tt> switch there. This
|
||||
* normally is used for behaviors that are not totally
|
||||
* different on each platform.
|
||||
* - other than that above, use your own judgement on whether
|
||||
* to edit the file or create new file etc.
|
||||
*/
|
||||
|
||||
#endif /* __PJ_DOXYGEN_H__ */
|
||||
|
|
@ -0,0 +1,319 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/equeue.h 2 10/14/05 12:26a Bennylp $ */
|
||||
#ifndef __PJ_EQUEUE_H__
|
||||
#define __PJ_EQUEUE_H__
|
||||
|
||||
/**
|
||||
* @file equeue.h
|
||||
* @brief Event Queue
|
||||
*/
|
||||
#include <pj/types.h>
|
||||
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_EQUEUE Event Queue
|
||||
* @brief Event Queue
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Opaque data type for Event Queue.
|
||||
*/
|
||||
typedef struct pj_equeue_t pj_equeue_t;
|
||||
|
||||
/**
|
||||
* Opaque data type for Event Queue key.
|
||||
*/
|
||||
typedef struct pj_equeue_key_t pj_equeue_key_t;
|
||||
|
||||
|
||||
/**
|
||||
* This structure describes the callbacks to be called when I/O operation
|
||||
* completes.
|
||||
*/
|
||||
typedef struct pj_io_callback
|
||||
{
|
||||
/**
|
||||
* This callback is called when #pj_equeue_read, #pj_equeue_recv or
|
||||
* #pj_equeue_recvfrom completes.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param bytes_read The size of data that has just been read.
|
||||
*/
|
||||
void (*on_read_complete)(pj_equeue_key_t *key, pj_ssize_t bytes_read);
|
||||
|
||||
/**
|
||||
* This callback is called when #pj_equeue_write, #pj_equeue_send, or
|
||||
* #pj_equeue_sendto completes.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param bytes_read The size of data that has just been written.
|
||||
*/
|
||||
void (*on_write_complete)(pj_equeue_key_t *key, pj_ssize_t bytes_sent);
|
||||
|
||||
/**
|
||||
* This callback is called when #pj_equeue_accept completes.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param status Zero if the operation completes successfully.
|
||||
*/
|
||||
void (*on_accept_complete)(pj_equeue_key_t *key, int status);
|
||||
|
||||
/**
|
||||
* This callback is called when #pj_equeue_connect completes.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param status Zero if the operation completes successfully.
|
||||
*/
|
||||
void (*on_connect_complete)(pj_equeue_key_t *key, int status);
|
||||
|
||||
} pj_io_callback;
|
||||
|
||||
/**
|
||||
* Event Queue options.
|
||||
*/
|
||||
typedef struct pj_equeue_options
|
||||
{
|
||||
/** Maximum number of threads that are allowed to access Event Queue
|
||||
* simulteneously.
|
||||
*/
|
||||
unsigned nb_threads;
|
||||
|
||||
/** If non-zero, then no mutex protection will be used. */
|
||||
pj_bool_t no_lock;
|
||||
|
||||
/** Interval of the busy loop inside the event queue.
|
||||
* The time resolution here determines the accuracy of the
|
||||
* timer in the Event Queue.
|
||||
*/
|
||||
pj_time_val poll_interval;
|
||||
|
||||
} pj_equeue_options;
|
||||
|
||||
|
||||
/**
|
||||
* Error value returned by I/O operations to indicate that the operation
|
||||
* can't complete immediately and will complete later.
|
||||
*/
|
||||
#define PJ_EQUEUE_PENDING (-2)
|
||||
|
||||
/**
|
||||
* Types of Event Queue operation.
|
||||
*/
|
||||
typedef enum pj_equeue_op
|
||||
{
|
||||
PJ_EQUEUE_OP_NONE = 0, /**< No operation. */
|
||||
PJ_EQUEUE_OP_READ = 1, /**< read() operation. */
|
||||
PJ_EQUEUE_OP_RECV_FROM = 2, /**< recvfrom() operation. */
|
||||
PJ_EQUEUE_OP_WRITE = 4, /**< write() operation. */
|
||||
PJ_EQUEUE_OP_SEND_TO = 8, /**< sendto() operation. */
|
||||
#if defined(PJ_HAS_TCP) && PJ_HAS_TCP != 0
|
||||
PJ_EQUEUE_OP_ACCEPT = 16, /**< accept() operation. */
|
||||
PJ_EQUEUE_OP_CONNECT = 32, /**< connect() operation. */
|
||||
#endif /* PJ_HAS_TCP */
|
||||
} pj_equeue_op;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Initialize Event Queue options with default values.
|
||||
*
|
||||
* @param options Event Queue options.
|
||||
*/
|
||||
PJ_DECL(void) pj_equeue_options_init(pj_equeue_options *options);
|
||||
|
||||
/**
|
||||
* Create a new Event Queue framework.
|
||||
*
|
||||
* @param pool The pool to allocate the event queue structure.
|
||||
* @param options Event queue options, or if NULL is given, then
|
||||
* default options will be used.
|
||||
* @param equeue Pointer to receive event queue structure.
|
||||
*
|
||||
* @return zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_equeue_create( pj_pool_t *pool,
|
||||
const pj_equeue_options *options,
|
||||
pj_equeue_t **equeue);
|
||||
|
||||
/**
|
||||
* Get the first instance of Event Queue, or NULL if no Event Queue
|
||||
* instance has been created in the application.
|
||||
*
|
||||
* @return The first instance of Event Queue created, or NULL.
|
||||
*/
|
||||
PJ_DECL(pj_equeue_t*) pj_equeue_instance(void);
|
||||
|
||||
/**
|
||||
* Destroy the Event Queue.
|
||||
*
|
||||
* @param equeue The Event Queue instance to be destroyed.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_equeue_destroy( pj_equeue_t *equeue );
|
||||
|
||||
/**
|
||||
* Customize the lock object that is used by the Event Queue.
|
||||
*
|
||||
* @param equeue The Event Queue instance.
|
||||
* @param lock The lock object.
|
||||
* @param auto_del If non-zero, the lock will be destroyed by
|
||||
* Event Queue.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_equeue_set_lock( pj_equeue_t *equeue,
|
||||
pj_lock_t *lock,
|
||||
pj_bool_t auto_del);
|
||||
|
||||
/**
|
||||
* Associate an Event Queue key to particular handle. The key is also
|
||||
* associated with the callback and user data, which will be used by
|
||||
* the Event Queue framework when signalling event back to application.
|
||||
*
|
||||
* @param pool To allocate the resource for the specified handle, which
|
||||
* must be valid until the handle/key is unregistered
|
||||
* from Event Queue.
|
||||
* @param equeue The Event Queue.
|
||||
* @param hnd The OS handle to be registered, which can be a socket
|
||||
* descriptor (pj_sock_t), file descriptor, etc.
|
||||
* @param cb Callback to be called when I/O operation completes.
|
||||
* @param user_data User data to be associated with the key.
|
||||
* @param key Pointer to receive the key.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_equeue_register( pj_pool_t *pool,
|
||||
pj_equeue_t *equeue,
|
||||
pj_oshandle_t hnd,
|
||||
pj_io_callback *cb,
|
||||
void *user_data,
|
||||
pj_equeue_key_t **key);
|
||||
|
||||
/**
|
||||
* Retrieve user data associated with a key.
|
||||
*
|
||||
* @param key The Event Queue key.
|
||||
*
|
||||
* @return User data associated with the key.
|
||||
*/
|
||||
PJ_DECL(void*) pj_equeue_get_user_data( pj_equeue_key_t *key );
|
||||
|
||||
|
||||
/**
|
||||
* Unregister Event Queue key from the Event Queue.
|
||||
*
|
||||
* @param equeue The Event Queue.
|
||||
* @param key The key.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_equeue_unregister( pj_equeue_t *equeue,
|
||||
pj_equeue_key_t *key);
|
||||
|
||||
/**
|
||||
* Instruct the Event Queue to read from the specified handle. This function
|
||||
* returns immediately (i.e. non-blocking) regardless whether some data has
|
||||
* been transfered. If the operation can't complete immediately, caller will
|
||||
* be notified about the completion when it calls pj_equeue_poll().
|
||||
*
|
||||
* @param key The key that uniquely identifies the handle.
|
||||
* @param buffer The buffer to hold the read data. The caller MUST make sure
|
||||
* that this buffer remain valid until the framework completes
|
||||
* reading the handle.
|
||||
* @param size The maximum size to be read.
|
||||
*
|
||||
* @return
|
||||
* - zero or positive number to indicate the number of bytes has been
|
||||
* read, and in this case the operation was not queued.
|
||||
* - (-1) on error, which in this case operation was not queued.
|
||||
* - PJ_EQUEUE_PENDING if the operation has been queued.
|
||||
*/
|
||||
PJ_DECL(pj_ssize_t) pj_equeue_read( pj_equeue_key_t *key,
|
||||
void *buffer,
|
||||
pj_size_t size);
|
||||
|
||||
/**
|
||||
* Start recv() operation on the specified handle.
|
||||
*
|
||||
* @see ::pj_ioqueue_read
|
||||
*/
|
||||
PJ_DECL(pj_ssize_t) pj_equeue_recv( pj_equeue_key_t *key,
|
||||
void *buf,
|
||||
pj_size_t size,
|
||||
unsigned flags);
|
||||
|
||||
/**
|
||||
* Start recvfrom() operation on the specified handle.
|
||||
*
|
||||
* @see ::pj_equeue_read
|
||||
*/
|
||||
PJ_DECL(pj_ssize_t) pj_equeue_recvfrom( pj_equeue_key_t *key,
|
||||
void *buf,
|
||||
pj_size_t size,
|
||||
unsigned flags,
|
||||
pj_sockaddr_t *addr,
|
||||
int *addrlen );
|
||||
|
||||
/**
|
||||
* Write.
|
||||
*/
|
||||
PJ_DECL(pj_ssize_t) pj_equeue_write( pj_equeue_key_t *key,
|
||||
const void *buf,
|
||||
pj_size_t size);
|
||||
|
||||
/**
|
||||
* Send.
|
||||
*/
|
||||
PJ_DECL(pj_ssize_t) pj_equeue_send( pj_equeue_key_t *key,
|
||||
const void *buf,
|
||||
pj_size_t size,
|
||||
unsigned flags);
|
||||
|
||||
/**
|
||||
* Sendto.
|
||||
*/
|
||||
PJ_DECL(pj_ssize_t) pj_equeue_sendto( pj_equeue_key_t *key,
|
||||
const void *buf,
|
||||
pj_size_t size,
|
||||
unsigned flags,
|
||||
const pj_sockaddr_t *addr,
|
||||
int addrlen);
|
||||
|
||||
/**
|
||||
* Schedule timer.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_equeue_schedule_timer( pj_equeue_t *equeue,
|
||||
const pj_time_val *timeout,
|
||||
pj_timer_entry *entry);
|
||||
|
||||
/**
|
||||
* Cancel timer.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_equeue_cancel_timer( pj_equeue_t *equeue,
|
||||
pj_timer_entry *entry);
|
||||
|
||||
/**
|
||||
* Poll for events.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_equeue_poll( pj_equeue_t *equeue,
|
||||
const pj_time_val *timeout );
|
||||
|
||||
/**
|
||||
* Run.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_equeue_run( pj_equeue_t *equeue );
|
||||
|
||||
/**
|
||||
* Stop all running threads.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_equeue_stop( pj_equeue_t *equeue );
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_EQUEUE_H__ */
|
|
@ -0,0 +1,249 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/errno.h 2 10/14/05 12:26a Bennylp $ */
|
||||
#ifndef __PJ_ERRNO_H__
|
||||
#define __PJ_ERRNO_H__
|
||||
|
||||
/**
|
||||
* @file errno.h
|
||||
* @brief PJLIB Error Codes
|
||||
*/
|
||||
#include <pj/types.h>
|
||||
#include <pj/compat/errno.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup pj_errno Error Codes
|
||||
* @ingroup PJ
|
||||
* @{
|
||||
*
|
||||
* In PJLIB, error/status codes from operating system are translated
|
||||
* into PJLIB error namespace, and stored in @a pj_status_t. All functions
|
||||
* that work with @a pj_status_t expect to get PJLIB error code instead
|
||||
* of native codes.
|
||||
*
|
||||
* @section pj_errno_retval Return Values
|
||||
*
|
||||
* All functions that returns @a pj_status_t returns @a PJ_SUCCESS if the
|
||||
* operation was completed successfully, or non-zero value to indicate
|
||||
* error. If the error came from operating system, then the native error
|
||||
* code is translated/folded into PJLIB's error namespace by using
|
||||
* #PJ_STATUS_FROM_OS() macro. The function will do this automatically
|
||||
* before returning the error to caller.
|
||||
*
|
||||
* @section pj_errno_errmsg Error Message
|
||||
*
|
||||
* To get the error message corresponding to a particular code, use function
|
||||
* #pj_strerror(). This function expects error code in PJLIB error namespace,
|
||||
* not the native error code. Application can pass the value from the
|
||||
* following sources to this function:
|
||||
* - #pj_get_os_error()
|
||||
* - #pj_get_netos_error()
|
||||
* - any return value from function returning @a pj_status_t.
|
||||
*
|
||||
* Application MUST NOT pass native error code (such as error code from
|
||||
* functions like GetLastError() or errno) to PJLIB functions expecting
|
||||
* @a pj_status_t.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get the last platform error/status, folded into pj_status_t.
|
||||
* @return OS dependent error code, folded into pj_status_t.
|
||||
* @remark This function gets errno, or calls GetLastError() function and
|
||||
* convert the code into pj_status_t with PJ_STATUS_FROM_OS. Do
|
||||
* not call this for socket functions!
|
||||
* @see pj_get_netos_error()
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_get_os_error(void);
|
||||
|
||||
/**
|
||||
* Set last error.
|
||||
* @param code pj_status_t
|
||||
*/
|
||||
PJ_DECL(void) pj_set_os_error(pj_status_t code);
|
||||
|
||||
/**
|
||||
* Get the last error from socket operations.
|
||||
* @return Last socket error, folded into pj_status_t.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_get_netos_error(void);
|
||||
|
||||
/**
|
||||
* Set error code.
|
||||
* @param code pj_status_t.
|
||||
*/
|
||||
PJ_DECL(void) pj_set_netos_error(pj_status_t code);
|
||||
|
||||
|
||||
/**
|
||||
* Get the error message for the specified error code. The message
|
||||
* string will be NULL terminated.
|
||||
*
|
||||
* @param statcode The error code.
|
||||
* @param buf Buffer to hold the error message string.
|
||||
* @param bufsize Size of the buffer.
|
||||
*
|
||||
* @return The error message as NULL terminated string,
|
||||
* wrapped with pj_str_t.
|
||||
*/
|
||||
PJ_DECL(pj_str_t) pj_strerror( pj_status_t statcode,
|
||||
char *buf, pj_size_t bufsize);
|
||||
|
||||
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Return platform os error code folded into pj_status_t code. This is
|
||||
* the macro that is used throughout the library for all PJLIB's functions
|
||||
* that returns error from operating system. Application may override
|
||||
* this macro to reduce size (e.g. by defining it to always return
|
||||
* #PJ_EUNKNOWN).
|
||||
*
|
||||
* Note:
|
||||
* This macro MUST return non-zero value regardless whether zero is
|
||||
* passed as the argument. The reason is to protect logic error when
|
||||
* the operating system doesn't report error codes properly.
|
||||
*
|
||||
* @param os_code Platform OS error code. This value may be evaluated
|
||||
* more than once.
|
||||
* @return The platform os error code folded into pj_status_t.
|
||||
*/
|
||||
#ifndef PJ_RETURN_OS_ERROR
|
||||
# define PJ_RETURN_OS_ERROR(os_code) (os_code ? \
|
||||
PJ_STATUS_FROM_OS(os_code) : -1)
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Fold a platform specific error into an pj_status_t code.
|
||||
*
|
||||
* @param e The platform os error code.
|
||||
* @return pj_status_t
|
||||
* @warning Macro implementation; the syserr argument may be evaluated
|
||||
* multiple times.
|
||||
*/
|
||||
#define PJ_STATUS_FROM_OS(e) (e == 0 ? PJ_SUCCESS : e + PJ_ERRNO_START_SYS)
|
||||
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Fold an pj_status_t code back to the native platform defined error.
|
||||
*
|
||||
* @param e The pj_status_t folded platform os error code.
|
||||
* @return pj_os_err_type
|
||||
* @warning macro implementation; the statcode argument may be evaluated
|
||||
* multiple times. If the statcode was not created by
|
||||
* pj_get_os_error or PJ_STATUS_FROM_OS, the results are undefined.
|
||||
*/
|
||||
#define PJ_STATUS_TO_OS(e) (e == 0 ? PJ_SUCCESS : e - PJ_ERRNO_START_SYS)
|
||||
|
||||
|
||||
/**
|
||||
* @defgroup pj_errnum PJLIB's Own Error Codes
|
||||
* @ingroup pj_errno
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Unknown error has been reported.
|
||||
*/
|
||||
#define PJ_EUNKNOWN (PJ_ERRNO_START_STATUS + 1)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* The operation is pending and will be completed later.
|
||||
*/
|
||||
#define PJ_EPENDING (PJ_ERRNO_START_STATUS + 2)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Too many connecting sockets.
|
||||
*/
|
||||
#define PJ_ETOOMANYCONN (PJ_ERRNO_START_STATUS + 3)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Invalid argument.
|
||||
*/
|
||||
#define PJ_EINVAL (PJ_ERRNO_START_STATUS + 4)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Name too long (eg. hostname too long).
|
||||
*/
|
||||
#define PJ_ENAMETOOLONG (PJ_ERRNO_START_STATUS + 5)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Not found.
|
||||
*/
|
||||
#define PJ_ENOTFOUND (PJ_ERRNO_START_STATUS + 6)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Not enough memory.
|
||||
*/
|
||||
#define PJ_ENOMEM (PJ_ERRNO_START_STATUS + 7)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Bug detected!
|
||||
*/
|
||||
#define PJ_EBUG (PJ_ERRNO_START_STATUS + 8)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Operation timed out.
|
||||
*/
|
||||
#define PJ_ETIMEDOUT (PJ_ERRNO_START_STATUS + 9)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Too many objects.
|
||||
*/
|
||||
#define PJ_ETOOMANY (PJ_ERRNO_START_STATUS + 10)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Object is busy.
|
||||
*/
|
||||
#define PJ_EBUSY (PJ_ERRNO_START_STATUS + 11)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* The specified option is not supported.
|
||||
*/
|
||||
#define PJ_ENOTSUP (PJ_ERRNO_START_STATUS + 12)
|
||||
/**
|
||||
* @hideinitializer
|
||||
* Invalid operation.
|
||||
*/
|
||||
#define PJ_EINVALIDOP (PJ_ERRNO_START_STATUS + 13)
|
||||
|
||||
/** @} */ /* pj_errnum */
|
||||
|
||||
/** @} */ /* pj_errno */
|
||||
|
||||
|
||||
/**
|
||||
* PJ_ERRNO_START is where PJLIB specific error values start.
|
||||
*/
|
||||
#define PJ_ERRNO_START 20000
|
||||
|
||||
/**
|
||||
* PJ_ERRNO_SPACE_SIZE is the maximum number of errors in one of
|
||||
* the error/status range below.
|
||||
*/
|
||||
#define PJ_ERRNO_SPACE_SIZE 50000
|
||||
|
||||
/**
|
||||
* PJ_ERRNO_START_STATUS is where PJLIB specific status codes start.
|
||||
*/
|
||||
#define PJ_ERRNO_START_STATUS (PJ_ERRNO_START + PJ_ERRNO_SPACE_SIZE)
|
||||
|
||||
/**
|
||||
* PJ_ERRNO_START_SYS converts platform specific error codes into
|
||||
* pj_status_t values.
|
||||
*/
|
||||
#define PJ_ERRNO_START_SYS (PJ_ERRNO_START_STATUS + PJ_ERRNO_SPACE_SIZE)
|
||||
|
||||
/**
|
||||
* PJ_ERRNO_START_USER are reserved for applications that use error
|
||||
* codes along with PJLIB codes.
|
||||
*/
|
||||
#define PJ_ERRNO_START_USER (PJ_ERRNO_START_SYS + PJ_ERRNO_SPACE_SIZE)
|
||||
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_ERRNO_H__ */
|
||||
|
|
@ -0,0 +1,267 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/except.h 9 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_EXCEPTION_H__
|
||||
#define __PJ_EXCEPTION_H__
|
||||
|
||||
/**
|
||||
* @file except.h
|
||||
* @brief Exception Handling in C.
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
#include <pj/compat/setjmp.h>
|
||||
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
|
||||
/**
|
||||
* @defgroup PJ_EXCEPT Exception Handling
|
||||
* @ingroup PJ_MISC
|
||||
* @{
|
||||
*
|
||||
* \section pj_except_sample_sec Quick Example
|
||||
*
|
||||
* For the impatient, take a look at some examples:
|
||||
* - @ref page_pjlib_samples_except_c
|
||||
* - @ref page_pjlib_exception_test
|
||||
*
|
||||
* \section pj_except_except Exception Handling
|
||||
*
|
||||
* This module provides exception handling syntactically similar to C++ in
|
||||
* C language. The underlying mechanism use setjmp() and longjmp(), and since
|
||||
* these constructs are ANSI standard, the mechanism here should be available
|
||||
* on most platforms/compilers which are ANSI compliant.
|
||||
*
|
||||
* If ANSI libc is not available, then setjmp()/longjmp() implementation will
|
||||
* be provided. See <pj/compat/setjmp.h> for compatibility.
|
||||
*
|
||||
* The exception handling mechanism is completely thread safe, so the exception
|
||||
* thrown by one thread will not interfere with other thread.
|
||||
*
|
||||
* CAVEATS:
|
||||
* - unlike C++ exception, the scheme here won't call destructors of local
|
||||
* objects if exception is thrown. Care must be taken when a function
|
||||
* hold some resorce such as pool or mutex etc.
|
||||
* - You CAN NOT make nested exception in one single function without using
|
||||
* a nested PJ_USE_EXCEPTION.
|
||||
* - Exceptions will always be caught by the first handle (unlike C++ where
|
||||
* exception is only caught if the type matches.
|
||||
*
|
||||
* The exception handling constructs are similar to C++. The blocks will be
|
||||
* constructed similar to the following sample:
|
||||
*
|
||||
* \verbatim
|
||||
#define NO_MEMORY 1
|
||||
#define SYNTAX_ERROR 2
|
||||
|
||||
int main()
|
||||
{
|
||||
PJ_USE_EXCEPTION; // declare local exception stack.
|
||||
|
||||
PJ_TRY {
|
||||
...// do something..
|
||||
}
|
||||
PJ_CATCH(NO_MEMORY) {
|
||||
... // handle exception 1
|
||||
}
|
||||
PJ_CATCH(SYNTAX_ERROR) {
|
||||
... // handle exception 2
|
||||
}
|
||||
PJ_DEFAULT {
|
||||
... // handle other exceptions.
|
||||
}
|
||||
PJ_END;
|
||||
}
|
||||
\endverbatim
|
||||
*
|
||||
* The above sample uses hard coded exception ID. It is @b strongly
|
||||
* recommended that applications request a unique exception ID instead
|
||||
* of hard coded value like above.
|
||||
*
|
||||
* \section pj_except_reg Exception ID Allocation
|
||||
*
|
||||
* To ensure that exception ID (number) are used consistently and to
|
||||
* prevent ID collisions in an application, it is strongly suggested that
|
||||
* applications allocate an exception ID for each possible exception
|
||||
* type. As a bonus of this process, the application can identify
|
||||
* the name of the exception when the particular exception is thrown.
|
||||
*
|
||||
* Exception ID management are performed with the following APIs:
|
||||
* - #pj_exception_id_alloc().
|
||||
* - #pj_exception_id_free().
|
||||
* - #pj_exception_id_name().
|
||||
*
|
||||
*
|
||||
* PJLIB itself automatically allocates one exception id, i.e.
|
||||
* #PJ_NO_MEMORY_EXCEPTION which is declared in <pj/pool.h>. This exception
|
||||
* ID is raised by default pool policy when it fails to allocate memory.
|
||||
*
|
||||
* \section PJ_EX_KEYWORDS Keywords
|
||||
*
|
||||
* \subsection PJ_THROW PJ_THROW(expression)
|
||||
* Throw an exception. The expression thrown is an integer as the result of
|
||||
* the \a expression. This keyword can be specified anywhere within the
|
||||
* program.
|
||||
*
|
||||
* \subsection PJ_USE_EXCEPTION PJ_USE_EXCEPTION
|
||||
* Specify this in the variable definition section of the function block
|
||||
* (or any blocks) to specify that the block has \a PJ_TRY/PJ_CATCH exception
|
||||
* block.
|
||||
* Actually, this is just a macro to declare local variable which is used to
|
||||
* push the exception state to the exception stack.
|
||||
*
|
||||
* \subsection PJ_TRY PJ_TRY
|
||||
* The \a PJ_TRY keyword is typically followed by a block. If an exception is
|
||||
* thrown in this block, then the execution will resume to the \a PJ_CATCH
|
||||
* handler.
|
||||
*
|
||||
* \subsection PJ_CATCH PJ_CATCH(expression)
|
||||
* The \a PJ_CATCH is normally followed by a block. This block will be executed
|
||||
* if the exception being thrown is equal to the expression specified in the
|
||||
* \a PJ_CATCH.
|
||||
*
|
||||
* \subsection PJ_DEFAULT PJ_DEFAULT
|
||||
* The \a PJ_DEFAULT keyword is normally followed by a block. This block will
|
||||
* be executed if the exception being thrown doesn't match any of the \a
|
||||
* PJ_CATCH specification. The \a PJ_DEFAULT block \b MUST be placed as the
|
||||
* last block of the handlers.
|
||||
*
|
||||
* \subsection PJ_END PJ_END
|
||||
* Specify this keyword to mark the end of \a PJ_TRY / \a PJ_CATCH blocks.
|
||||
*
|
||||
* \subsection PJ_GET_EXCEPTION PJ_GET_EXCEPTION(void)
|
||||
* Get the last exception thrown. This macro is normally called inside the
|
||||
* \a PJ_CATCH or \a PJ_DEFAULT block, altough it can be used anywhere where
|
||||
* the \a PJ_USE_EXCEPTION definition is in scope.
|
||||
*
|
||||
*
|
||||
* \section pj_except_examples_sec Examples
|
||||
*
|
||||
* For some examples on how to use the exception construct, please see:
|
||||
* - @ref page_pjlib_samples_except_c
|
||||
* - @ref page_pjlib_exception_test
|
||||
*/
|
||||
|
||||
/**
|
||||
* Allocate a unique exception id.
|
||||
* Applications don't have to allocate a unique exception ID before using
|
||||
* the exception construct. However, by doing so it ensures that there is
|
||||
* no collisions of exception ID.
|
||||
*
|
||||
* As a bonus, when exception number is acquired through this function,
|
||||
* the library can assign name to the exception (only if
|
||||
* PJ_HAS_EXCEPTION_NAMES is enabled (default is yes)) and find out the
|
||||
* exception name when it catches an exception.
|
||||
*
|
||||
* @param name Name to be associated with the exception ID.
|
||||
* @param id Pointer to receive the ID.
|
||||
*
|
||||
* @return PJ_SUCCESS on success or PJ_ETOOMANY if the library
|
||||
* is running out out ids.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_exception_id_alloc(const char *name,
|
||||
pj_exception_id_t *id);
|
||||
|
||||
/**
|
||||
* Free an exception id.
|
||||
*
|
||||
* @param id The exception ID.
|
||||
*
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_exception_id_free(pj_exception_id_t id);
|
||||
|
||||
/**
|
||||
* Retrieve name associated with the exception id.
|
||||
*
|
||||
* @param id The exception ID.
|
||||
*
|
||||
* @return The name associated with the specified ID.
|
||||
*/
|
||||
PJ_DECL(const char*) pj_exception_id_name(pj_exception_id_t id);
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* This structure (which should be invisible to user) manages the TRY handler
|
||||
* stack.
|
||||
*/
|
||||
struct pj_exception_state_t
|
||||
{
|
||||
struct pj_exception_state_t *prev; /**< Previous state in the list. */
|
||||
pj_jmp_buf state; /**< jmp_buf. */
|
||||
};
|
||||
|
||||
/**
|
||||
* Throw exception.
|
||||
* @param id Exception Id.
|
||||
*/
|
||||
PJ_DECL_NO_RETURN(void)
|
||||
pj_throw_exception_(pj_exception_id_t id) PJ_ATTR_NORETURN;
|
||||
|
||||
/**
|
||||
* Push exception handler.
|
||||
*/
|
||||
PJ_DECL(void) pj_push_exception_handler_(struct pj_exception_state_t *rec);
|
||||
|
||||
/**
|
||||
* Pop exception handler.
|
||||
*/
|
||||
PJ_DECL(void) pj_pop_exception_handler_(void);
|
||||
|
||||
/**
|
||||
* Declare that the function will use exception.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_USE_EXCEPTION struct pj_exception_state_t pj_x_except__; int pj_x_code__
|
||||
|
||||
/**
|
||||
* Start exception specification block.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_TRY if (1) { \
|
||||
pj_push_exception_handler_(&pj_x_except__); \
|
||||
pj_x_code__ = pj_setjmp(pj_x_except__.state); \
|
||||
if (pj_x_code__ == 0)
|
||||
/**
|
||||
* Catch the specified exception Id.
|
||||
* @param id The exception number to catch.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_CATCH(id) else if (pj_x_code__ == (id))
|
||||
|
||||
/**
|
||||
* Catch any exception number.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_DEFAULT else
|
||||
|
||||
/**
|
||||
* End of exception specification block.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_END pj_pop_exception_handler_(); \
|
||||
} else {}
|
||||
|
||||
/**
|
||||
* Throw exception.
|
||||
* @param exception_id The exception number.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_THROW(exception_id) pj_throw_exception_(exception_id)
|
||||
|
||||
/**
|
||||
* Get current exception.
|
||||
* @return Current exception code.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_GET_EXCEPTION() (pj_x_code__)
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
|
||||
|
||||
#endif /* __PJ_EXCEPTION_H__ */
|
||||
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/fifobuf.h 4 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_FIFOBUF_H__
|
||||
#define __PJ_FIFOBUF_H__
|
||||
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
typedef struct pj_fifobuf_t pj_fifobuf_t;
|
||||
struct pj_fifobuf_t
|
||||
{
|
||||
char *first, *last;
|
||||
char *ubegin, *uend;
|
||||
int full;
|
||||
};
|
||||
|
||||
PJ_DECL(void) pj_fifobuf_init (pj_fifobuf_t *fb, void *buffer, unsigned size);
|
||||
PJ_DECL(unsigned) pj_fifobuf_max_size (pj_fifobuf_t *fb);
|
||||
PJ_DECL(void*) pj_fifobuf_alloc (pj_fifobuf_t *fb, unsigned size);
|
||||
PJ_DECL(pj_status_t) pj_fifobuf_unalloc (pj_fifobuf_t *fb, void *buf);
|
||||
PJ_DECL(pj_status_t) pj_fifobuf_free (pj_fifobuf_t *fb, void *buf);
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_FIFOBUF_H__ */
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
/* $header: $ */
|
||||
|
||||
#ifndef __PJ_GUID_H__
|
||||
#define __PJ_GUID_H__
|
||||
|
||||
|
||||
/**
|
||||
* @file guid.h
|
||||
* @brief GUID Globally Unique Identifier.
|
||||
*/
|
||||
#include <pj/types.h>
|
||||
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
|
||||
/**
|
||||
* @defgroup PJ_DS Data Structure.
|
||||
* @ingroup PJ
|
||||
*/
|
||||
/**
|
||||
* @defgroup PJ_GUID Globally Unique Identifier
|
||||
* @ingroup PJ_DS
|
||||
* @{
|
||||
*
|
||||
* This module provides API to create string that is globally unique.
|
||||
* If application doesn't require that strong requirement, it can just
|
||||
* use #pj_create_random_string() instead.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* PJ_GUID_STRING_LENGTH specifies length of GUID string. The value is
|
||||
* dependent on the algorithm used internally to generate the GUID string.
|
||||
* If real GUID generator is used, then the length will be 128bit or
|
||||
* 32 bytes. If shadow GUID generator is used, then the length
|
||||
* will be 20 bytes. Application should not assume which algorithm will
|
||||
* be used by GUID generator.
|
||||
*/
|
||||
extern const unsigned PJ_GUID_STRING_LENGTH;
|
||||
|
||||
/**
|
||||
* PJ_GUID_MAX_LENGTH specifies the maximum length of GUID string,
|
||||
* regardless of which algorithm to use.
|
||||
*/
|
||||
#define PJ_GUID_MAX_LENGTH 32
|
||||
|
||||
/**
|
||||
* Create a globally unique string, which length is PJ_GUID_STRING_LENGTH
|
||||
* characters. Caller is responsible for preallocating the storage used
|
||||
* in the string.
|
||||
*
|
||||
* @param str The string to store the result.
|
||||
*
|
||||
* @return The string.
|
||||
*/
|
||||
PJ_DECL(pj_str_t*) pj_generate_unique_string(pj_str_t *str);
|
||||
|
||||
/**
|
||||
* Generate a unique string.
|
||||
*
|
||||
* @param pool Pool to allocate memory from.
|
||||
* @param str The string.
|
||||
*/
|
||||
PJ_DECL(void) pj_create_unique_string(pj_pool_t *pool, pj_str_t *str);
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif/* __PJ_GUID_H__ */
|
||||
|
|
@ -0,0 +1,140 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/hash.h 6 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_HASH_H__
|
||||
#define __PJ_HASH_H__
|
||||
|
||||
/**
|
||||
* @file hash.h
|
||||
* @brief Hash Table.
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_HASH Hash Table
|
||||
* @ingroup PJ_DS
|
||||
* @{
|
||||
* A hash table is a dictionary in which keys are mapped to array positions by
|
||||
* hash functions. Having the keys of more than one item map to the same
|
||||
* position is called a collision. In this library, we will chain the nodes
|
||||
* that have the same key in a list.
|
||||
*/
|
||||
|
||||
/**
|
||||
* If this constant is used as keylen, then the key is interpreted as
|
||||
* NULL terminated string.
|
||||
*/
|
||||
#define PJ_HASH_KEY_STRING ((unsigned)-1)
|
||||
|
||||
/**
|
||||
* This is the function that is used by the hash table to calculate hash value
|
||||
* of the specified key.
|
||||
*
|
||||
* @param hval the initial hash value, or zero.
|
||||
* @param key the key to calculate.
|
||||
* @param keylen the length of the key, or PJ_HASH_KEY_STRING to treat
|
||||
* the key as null terminated string.
|
||||
*
|
||||
* @return the hash value.
|
||||
*/
|
||||
PJ_DECL(pj_uint32_t) pj_hash_calc(pj_uint32_t hval,
|
||||
const void *key, unsigned keylen);
|
||||
|
||||
|
||||
/**
|
||||
* Create a hash table with the specified 'bucket' size.
|
||||
*
|
||||
* @param pool the pool from which the hash table will be allocated from.
|
||||
* @param size the bucket size, which will be round-up to the nearest 2^n+1
|
||||
*
|
||||
* @return the hash table.
|
||||
*/
|
||||
PJ_DECL(pj_hash_table_t*) pj_hash_create(pj_pool_t *pool, unsigned size);
|
||||
|
||||
|
||||
/**
|
||||
* Get the value associated with the specified key.
|
||||
*
|
||||
* @param ht the hash table.
|
||||
* @param key the key to look for.
|
||||
* @param keylen the length of the key, or PJ_HASH_KEY_STRING to use the
|
||||
* string length of the key.
|
||||
*
|
||||
* @return the value associated with the key, or NULL if the key is not found.
|
||||
*/
|
||||
PJ_DECL(void *) pj_hash_get( pj_hash_table_t *ht,
|
||||
const void *key, unsigned keylen );
|
||||
|
||||
|
||||
/**
|
||||
* Associate/disassociate a value with the specified key.
|
||||
*
|
||||
* @param pool the pool to allocate the new entry if a new entry has to be
|
||||
* created.
|
||||
* @param ht the hash table.
|
||||
* @param key the key.
|
||||
* @param keylen the length of the key, or PJ_HASH_KEY_STRING to use the
|
||||
* string length of the key.
|
||||
* @param value value to be associated, or NULL to delete the entry with
|
||||
* the specified key.
|
||||
*/
|
||||
PJ_DECL(void) pj_hash_set( pj_pool_t *pool, pj_hash_table_t *ht,
|
||||
const void *key, unsigned keylen,
|
||||
void *value );
|
||||
|
||||
/**
|
||||
* Get the total number of entries in the hash table.
|
||||
*
|
||||
* @param ht the hash table.
|
||||
*
|
||||
* @return the number of entries in the hash table.
|
||||
*/
|
||||
PJ_DECL(unsigned) pj_hash_count( pj_hash_table_t *ht );
|
||||
|
||||
|
||||
/**
|
||||
* Get the iterator to the first element in the hash table.
|
||||
*
|
||||
* @param ht the hash table.
|
||||
* @param it the iterator for iterating hash elements.
|
||||
*
|
||||
* @return the iterator to the hash element, or NULL if no element presents.
|
||||
*/
|
||||
PJ_DECL(pj_hash_iterator_t*) pj_hash_first( pj_hash_table_t *ht,
|
||||
pj_hash_iterator_t *it );
|
||||
|
||||
|
||||
/**
|
||||
* Get the next element from the iterator.
|
||||
*
|
||||
* @param ht the hash table.
|
||||
* @param it the hash iterator.
|
||||
*
|
||||
* @return the next iterator, or NULL if there's no more element.
|
||||
*/
|
||||
PJ_DECL(pj_hash_iterator_t*) pj_hash_next( pj_hash_table_t *ht,
|
||||
pj_hash_iterator_t *it );
|
||||
|
||||
/**
|
||||
* Get the value associated with a hash iterator.
|
||||
*
|
||||
* @param ht the hash table.
|
||||
* @param it the hash iterator.
|
||||
*
|
||||
* @return the value associated with the current element in iterator.
|
||||
*/
|
||||
PJ_DECL(void*) pj_hash_this( pj_hash_table_t *ht,
|
||||
pj_hash_iterator_t *it );
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,473 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/ioqueue.h 10 10/29/05 11:29a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_IOQUEUE_H__
|
||||
#define __PJ_IOQUEUE_H__
|
||||
|
||||
/**
|
||||
* @file ioqueue.h
|
||||
* @brief I/O Dispatching Mechanism
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_IO Network I/O
|
||||
* @brief Network I/O
|
||||
* @ingroup PJ_OS
|
||||
*
|
||||
* This section contains API building blocks to perform network I/O and
|
||||
* communications. If provides:
|
||||
* - @ref PJ_SOCK
|
||||
*\n
|
||||
* A highly portable socket abstraction, runs on all kind of
|
||||
* network APIs such as standard BSD socket, Windows socket, Linux
|
||||
* \b kernel socket, PalmOS networking API, etc.
|
||||
*
|
||||
* - @ref pj_addr_resolve
|
||||
*\n
|
||||
* Portable address resolution, which implements #pj_gethostbyname().
|
||||
*
|
||||
* - @ref PJ_SOCK_SELECT
|
||||
*\n
|
||||
* A portable \a select() like API (#pj_sock_select()) which can be
|
||||
* implemented with various back-ends.
|
||||
*
|
||||
* - @ref PJ_IOQUEUE
|
||||
*\n
|
||||
* Framework for dispatching network events.
|
||||
*
|
||||
* For more information see the modules below.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup PJ_IOQUEUE I/O Event Dispatching Queue
|
||||
* @ingroup PJ_IO
|
||||
* @{
|
||||
*
|
||||
* This file provides abstraction for various event dispatching mechanisms.
|
||||
* The interfaces for event dispatching vary alot, even in a single
|
||||
* operating system. The abstraction here hopefully is suitable for most of
|
||||
* the event dispatching available.
|
||||
*
|
||||
* Currently, the I/O Queue supports:
|
||||
* - select(), as the common denominator, but the least efficient.
|
||||
* - I/O Completion ports in Windows NT/2000/XP, which is the most efficient
|
||||
* way to dispatch events in Windows NT based OSes, and most importantly,
|
||||
* it doesn't have the limit on how many handles to monitor. And it works
|
||||
* with files (not only sockets) as well.
|
||||
*
|
||||
* \section pj_ioqeuue_examples_sec Examples
|
||||
*
|
||||
* For some examples on how to use the I/O Queue, please see:
|
||||
*
|
||||
* - \ref page_pjlib_ioqueue_tcp_test
|
||||
* - \ref page_pjlib_ioqueue_udp_test
|
||||
* - \ref page_pjlib_ioqueue_perf_test
|
||||
*/
|
||||
|
||||
/**
|
||||
* This structure describes the callbacks to be called when I/O operation
|
||||
* completes.
|
||||
*/
|
||||
typedef struct pj_ioqueue_callback
|
||||
{
|
||||
/**
|
||||
* This callback is called when #pj_ioqueue_read or #pj_ioqueue_recvfrom
|
||||
* completes.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param bytes_read The size of data that has just been read.
|
||||
*/
|
||||
void (*on_read_complete)(pj_ioqueue_key_t *key, pj_ssize_t bytes_read);
|
||||
|
||||
/**
|
||||
* This callback is called when #pj_ioqueue_write or #pj_ioqueue_sendto
|
||||
* completes.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param bytes_read The size of data that has just been read.
|
||||
*/
|
||||
void (*on_write_complete)(pj_ioqueue_key_t *key, pj_ssize_t bytes_sent);
|
||||
|
||||
/**
|
||||
* This callback is called when #pj_ioqueue_accept completes.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param sock Newly connected socket.
|
||||
* @param status Zero if the operation completes successfully.
|
||||
*/
|
||||
void (*on_accept_complete)(pj_ioqueue_key_t *key, pj_sock_t sock,
|
||||
int status);
|
||||
|
||||
/**
|
||||
* This callback is called when #pj_ioqueue_connect completes.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param status Zero if the operation completes successfully.
|
||||
*/
|
||||
void (*on_connect_complete)(pj_ioqueue_key_t *key, int status);
|
||||
} pj_ioqueue_callback;
|
||||
|
||||
|
||||
/**
|
||||
* Types of I/O Queue operation.
|
||||
*/
|
||||
typedef enum pj_ioqueue_operation_e
|
||||
{
|
||||
PJ_IOQUEUE_OP_NONE = 0, /**< No operation. */
|
||||
PJ_IOQUEUE_OP_READ = 1, /**< read() operation. */
|
||||
PJ_IOQUEUE_OP_RECV = 2, /**< recv() operation. */
|
||||
PJ_IOQUEUE_OP_RECV_FROM = 4, /**< recvfrom() operation. */
|
||||
PJ_IOQUEUE_OP_WRITE = 8, /**< write() operation. */
|
||||
PJ_IOQUEUE_OP_SEND = 16, /**< send() operation. */
|
||||
PJ_IOQUEUE_OP_SEND_TO = 32, /**< sendto() operation. */
|
||||
#if defined(PJ_HAS_TCP) && PJ_HAS_TCP != 0
|
||||
PJ_IOQUEUE_OP_ACCEPT = 64, /**< accept() operation. */
|
||||
PJ_IOQUEUE_OP_CONNECT = 128, /**< connect() operation. */
|
||||
#endif /* PJ_HAS_TCP */
|
||||
} pj_ioqueue_operation_e;
|
||||
|
||||
|
||||
/**
|
||||
* Indicates that the I/O Queue should be created to handle reasonable
|
||||
* number of threads.
|
||||
*/
|
||||
#define PJ_IOQUEUE_DEFAULT_THREADS 0
|
||||
|
||||
|
||||
/**
|
||||
* Create a new I/O Queue framework.
|
||||
*
|
||||
* @param pool The pool to allocate the I/O queue structure.
|
||||
* @param max_fd The maximum number of handles to be supported, which
|
||||
* should not exceed PJ_IOQUEUE_MAX_HANDLES.
|
||||
* @param max_threads The maximum number of threads that are allowed to
|
||||
* operate on a single descriptor simultaneously. If
|
||||
* the value is zero, the framework will set it
|
||||
* to a reasonable value.
|
||||
* @param ioqueue Pointer to hold the newly created I/O Queue.
|
||||
*
|
||||
* @return PJ_SUCCESS on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_create( pj_pool_t *pool,
|
||||
pj_size_t max_fd,
|
||||
int max_threads,
|
||||
pj_ioqueue_t **ioqueue);
|
||||
|
||||
/**
|
||||
* Destroy the I/O queue.
|
||||
*
|
||||
* @param ioque The I/O Queue to be destroyed.
|
||||
*
|
||||
* @return PJ_SUCCESS if success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_destroy( pj_ioqueue_t *ioque );
|
||||
|
||||
/**
|
||||
* Set the lock object to be used by the I/O Queue. This function can only
|
||||
* be called right after the I/O queue is created, before any handle is
|
||||
* registered to the I/O queue.
|
||||
*
|
||||
* Initially the I/O queue is created with non-recursive mutex protection.
|
||||
* Applications can supply alternative lock to be used by calling this
|
||||
* function.
|
||||
*
|
||||
* @param ioque The ioqueue instance.
|
||||
* @param lock The lock to be used by the ioqueue.
|
||||
* @param auto_delete In non-zero, the lock will be deleted by the ioqueue.
|
||||
*
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_set_lock( pj_ioqueue_t *ioque,
|
||||
pj_lock_t *lock,
|
||||
pj_bool_t auto_delete );
|
||||
|
||||
/**
|
||||
* Register a socket to the I/O queue framework.
|
||||
* When a socket is registered to the IOQueue, it may be modified to use
|
||||
* non-blocking IO. If it is modified, there is no guarantee that this
|
||||
* modification will be restored after the socket is unregistered.
|
||||
*
|
||||
* @param pool To allocate the resource for the specified handle,
|
||||
* which must be valid until the handle/key is unregistered
|
||||
* from I/O Queue.
|
||||
* @param ioque The I/O Queue.
|
||||
* @param sock The socket.
|
||||
* @param user_data User data to be associated with the key, which can be
|
||||
* retrieved later.
|
||||
* @param cb Callback to be called when I/O operation completes.
|
||||
* @param key Pointer to receive the returned key.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_register_sock( pj_pool_t *pool,
|
||||
pj_ioqueue_t *ioque,
|
||||
pj_sock_t sock,
|
||||
void *user_data,
|
||||
const pj_ioqueue_callback *cb,
|
||||
pj_ioqueue_key_t **key);
|
||||
|
||||
/**
|
||||
* Unregister a handle from the I/O Queue framework.
|
||||
*
|
||||
* @param ioque The I/O Queue.
|
||||
* @param key The key that uniquely identifies the handle, which is
|
||||
* returned from the function #pj_ioqueue_register_sock()
|
||||
* or other registration functions.
|
||||
*
|
||||
* @return PJ_SUCCESS on success or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_unregister( pj_ioqueue_t *ioque,
|
||||
pj_ioqueue_key_t *key );
|
||||
|
||||
|
||||
/**
|
||||
* Get user data associated with the I/O Queue key.
|
||||
*
|
||||
* @param key The key previously associated with the socket/handle with
|
||||
* #pj_ioqueue_register_sock() (or other registration
|
||||
* functions).
|
||||
*
|
||||
* @return The user data associated with the key, or NULL on error
|
||||
* of if no data is associated with the key during
|
||||
* registration.
|
||||
*/
|
||||
PJ_DECL(void*) pj_ioqueue_get_user_data( pj_ioqueue_key_t *key );
|
||||
|
||||
|
||||
#if defined(PJ_HAS_TCP) && PJ_HAS_TCP != 0
|
||||
/**
|
||||
* Instruct I/O Queue to wait for incoming connections on the specified
|
||||
* listening socket. This function will return
|
||||
* immediately (i.e. non-blocking) regardless whether some data has been
|
||||
* transfered. If the function can't complete immediately, and the caller will
|
||||
* be notified about the completion when it calls pj_ioqueue_poll().
|
||||
*
|
||||
* @param ioqueue The I/O Queue
|
||||
* @param key The key which registered to the server socket.
|
||||
* @param sock Argument which contain pointer to receive
|
||||
* the socket for the incoming connection.
|
||||
* @param local Optional argument which contain pointer to variable to
|
||||
* receive local address.
|
||||
* @param remote Optional argument which contain pointer to variable to
|
||||
* receive the remote address.
|
||||
* @param addrlen On input, contains the length of the buffer for the
|
||||
* address, and on output, contains the actual length of the
|
||||
* address. This argument is optional.
|
||||
* @return
|
||||
* - PJ_SUCCESS If there's a connection available immediately, which
|
||||
* in this case the callback should have been called before
|
||||
* the function returns.
|
||||
* - PJ_EPENDING If accept is queued, or
|
||||
* - non-zero which indicates the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_accept( pj_ioqueue_t *ioqueue,
|
||||
pj_ioqueue_key_t *key,
|
||||
pj_sock_t *sock,
|
||||
pj_sockaddr_t *local,
|
||||
pj_sockaddr_t *remote,
|
||||
int *addrlen );
|
||||
|
||||
/**
|
||||
* Initiate non-blocking socket connect. If the socket can NOT be connected
|
||||
* immediately, the result will be reported during poll.
|
||||
*
|
||||
* @param ioqueue The ioqueue
|
||||
* @param key The key associated with TCP socket
|
||||
* @param addr The remote address.
|
||||
* @param addrlen The remote address length.
|
||||
*
|
||||
* @return
|
||||
* - PJ_SUCCESS If socket is connected immediately, which in this case
|
||||
* the callback should have been called.
|
||||
* - PJ_EPENDING If operation is queued, or
|
||||
* - non-zero Indicates the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_connect( pj_ioqueue_t *ioqueue,
|
||||
pj_ioqueue_key_t *key,
|
||||
const pj_sockaddr_t *addr,
|
||||
int addrlen );
|
||||
|
||||
#endif /* PJ_HAS_TCP */
|
||||
|
||||
/**
|
||||
* Poll the I/O Queue for completed events.
|
||||
*
|
||||
* @param ioque the I/O Queue.
|
||||
* @param timeout polling timeout, or NULL if the thread wishes to wait
|
||||
* indefinetely for the event.
|
||||
*
|
||||
* @return
|
||||
* - zero if timed out (no event).
|
||||
* - (<0) if error occured during polling. Callback will NOT be called.
|
||||
* - (>1) to indicate numbers of events. Callbacks have been called.
|
||||
*/
|
||||
PJ_DECL(int) pj_ioqueue_poll( pj_ioqueue_t *ioque,
|
||||
const pj_time_val *timeout);
|
||||
|
||||
/**
|
||||
* Instruct the I/O Queue to read from the specified handle. This function
|
||||
* returns immediately (i.e. non-blocking) regardless whether some data has
|
||||
* been transfered. If the operation can't complete immediately, caller will
|
||||
* be notified about the completion when it calls pj_ioqueue_poll().
|
||||
*
|
||||
* @param ioque The I/O Queue.
|
||||
* @param key The key that uniquely identifies the handle.
|
||||
* @param buffer The buffer to hold the read data. The caller MUST make sure
|
||||
* that this buffer remain valid until the framework completes
|
||||
* reading the handle.
|
||||
* @param buflen The maximum size to be read.
|
||||
*
|
||||
* @return
|
||||
* - PJ_SUCCESS If immediate data has been received. In this case, the
|
||||
* callback must have been called before this function
|
||||
* returns, and no pending operation is scheduled.
|
||||
* - PJ_EPENDING If the operation has been queued.
|
||||
* - non-zero The return value indicates the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_read( pj_ioqueue_t *ioque,
|
||||
pj_ioqueue_key_t *key,
|
||||
void *buffer,
|
||||
pj_size_t buflen);
|
||||
|
||||
|
||||
/**
|
||||
* This function behaves similarly as #pj_ioqueue_read(), except that it is
|
||||
* normally called for socket.
|
||||
*
|
||||
* @param ioque The I/O Queue.
|
||||
* @param key The key that uniquely identifies the handle.
|
||||
* @param buffer The buffer to hold the read data. The caller MUST make sure
|
||||
* that this buffer remain valid until the framework completes
|
||||
* reading the handle.
|
||||
* @param buflen The maximum size to be read.
|
||||
* @param flags Recv flag.
|
||||
*
|
||||
* @return
|
||||
* - PJ_SUCCESS If immediate data has been received. In this case, the
|
||||
* callback must have been called before this function
|
||||
* returns, and no pending operation is scheduled.
|
||||
* - PJ_EPENDING If the operation has been queued.
|
||||
* - non-zero The return value indicates the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_recv( pj_ioqueue_t *ioque,
|
||||
pj_ioqueue_key_t *key,
|
||||
void *buffer,
|
||||
pj_size_t buflen,
|
||||
unsigned flags );
|
||||
|
||||
/**
|
||||
* This function behaves similarly as #pj_ioqueue_read(), except that it is
|
||||
* normally called for socket, and the remote address will also be returned
|
||||
* along with the data. Caller MUST make sure that both buffer and addr
|
||||
* remain valid until the framework completes reading the data.
|
||||
*
|
||||
* @param ioque The I/O Queue.
|
||||
* @param key The key that uniquely identifies the handle.
|
||||
* @param buffer The buffer to hold the read data. The caller MUST make sure
|
||||
* that this buffer remain valid until the framework completes
|
||||
* reading the handle.
|
||||
* @param buflen The maximum size to be read.
|
||||
* @param flags Recv flag.
|
||||
* @param addr Pointer to buffer to receive the address, or NULL.
|
||||
* @param addrlen On input, specifies the length of the address buffer.
|
||||
* On output, it will be filled with the actual length of
|
||||
* the address.
|
||||
*
|
||||
* @return
|
||||
* - PJ_SUCCESS If immediate data has been received. In this case, the
|
||||
* callback must have been called before this function
|
||||
* returns, and no pending operation is scheduled.
|
||||
* - PJ_EPENDING If the operation has been queued.
|
||||
* - non-zero The return value indicates the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_recvfrom( pj_ioqueue_t *ioque,
|
||||
pj_ioqueue_key_t *key,
|
||||
void *buffer,
|
||||
pj_size_t buflen,
|
||||
unsigned flags,
|
||||
pj_sockaddr_t *addr,
|
||||
int *addrlen);
|
||||
|
||||
/**
|
||||
* Instruct the I/O Queue to write to the handle. This function will return
|
||||
* immediately (i.e. non-blocking) regardless whether some data has been
|
||||
* transfered. If the function can't complete immediately, and the caller will
|
||||
* be notified about the completion when it calls pj_ioqueue_poll().
|
||||
*
|
||||
* @param ioque the I/O Queue.
|
||||
* @param key the key that identifies the handle.
|
||||
* @param data the data to send. Caller MUST make sure that this buffer
|
||||
* remains valid until the write operation completes.
|
||||
* @param datalen the length of the data.
|
||||
*
|
||||
* @return
|
||||
* - PJ_SUCCESS If data was immediately written.
|
||||
* - PJ_EPENDING If the operation has been queued.
|
||||
* - non-zero The return value indicates the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_write( pj_ioqueue_t *ioque,
|
||||
pj_ioqueue_key_t *key,
|
||||
const void *data,
|
||||
pj_size_t datalen);
|
||||
|
||||
/**
|
||||
* This function behaves similarly as #pj_ioqueue_write(), except that
|
||||
* pj_sock_send() (or equivalent) will be called to send the data.
|
||||
*
|
||||
* @param ioque the I/O Queue.
|
||||
* @param key the key that identifies the handle.
|
||||
* @param data the data to send. Caller MUST make sure that this buffer
|
||||
* remains valid until the write operation completes.
|
||||
* @param datalen the length of the data.
|
||||
* @param flags send flags.
|
||||
*
|
||||
* @return
|
||||
* - PJ_SUCCESS If data was immediately written.
|
||||
* - PJ_EPENDING If the operation has been queued.
|
||||
* - non-zero The return value indicates the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_send( pj_ioqueue_t *ioque,
|
||||
pj_ioqueue_key_t *key,
|
||||
const void *data,
|
||||
pj_size_t datalen,
|
||||
unsigned flags );
|
||||
|
||||
|
||||
/**
|
||||
* This function behaves similarly as #pj_ioqueue_write(), except that
|
||||
* pj_sock_sendto() (or equivalent) will be called to send the data.
|
||||
*
|
||||
* @param ioque the I/O Queue.
|
||||
* @param key the key that identifies the handle.
|
||||
* @param data the data to send. Caller MUST make sure that this buffer
|
||||
* remains valid until the write operation completes.
|
||||
* @param datalen the length of the data.
|
||||
* @param flags send flags.
|
||||
* @param addr remote address.
|
||||
* @param addrlen remote address length.
|
||||
*
|
||||
* @return
|
||||
* - PJ_SUCCESS If data was immediately written.
|
||||
* - PJ_EPENDING If the operation has been queued.
|
||||
* - non-zero The return value indicates the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_ioqueue_sendto( pj_ioqueue_t *ioque,
|
||||
pj_ioqueue_key_t *key,
|
||||
const void *data,
|
||||
pj_size_t datalen,
|
||||
unsigned flags,
|
||||
const pj_sockaddr_t *addr,
|
||||
int addrlen);
|
||||
|
||||
|
||||
/**
|
||||
* !}
|
||||
*/
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_IOQUEUE_H__ */
|
||||
|
|
@ -0,0 +1,217 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/list.h 8 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_LIST_H__
|
||||
#define __PJ_LIST_H__
|
||||
|
||||
/**
|
||||
* @file list.h
|
||||
* @brief Linked List data structure.
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/*
|
||||
* @defgroup PJ_DS Data Structure.
|
||||
* @ingroup PJ
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup PJ_LIST Linked List
|
||||
* @ingroup PJ_DS
|
||||
* @{
|
||||
*
|
||||
* List in PJLIB is implemented as doubly-linked list, and it won't require
|
||||
* dynamic memory allocation (just as all PJLIB data structures). The list here
|
||||
* should be viewed more like a low level C list instead of high level C++ list
|
||||
* (which normally are easier to use but require dynamic memory allocations),
|
||||
* therefore all caveats with C list apply here too (such as you can NOT put
|
||||
* a node in more than one lists).
|
||||
*
|
||||
* \section pj_list_example_sec Examples
|
||||
*
|
||||
* See below for examples on how to manipulate linked list:
|
||||
* - @ref page_pjlib_samples_list_c
|
||||
* - @ref page_pjlib_list_test
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Use this macro in the start of the structure declaration to declare that
|
||||
* the structure can be used in the linked list operation. This macro simply
|
||||
* declares additional member @a prev and @a next to the structure.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_DECL_LIST_MEMBER(type) type *prev; /** List @a prev. */ \
|
||||
type *next; /** List @a next. */
|
||||
|
||||
|
||||
/**
|
||||
* This structure describes generic list node and list. The owner of this list
|
||||
* must initialize the 'value' member to an appropriate value (typically the
|
||||
* owner itself).
|
||||
*/
|
||||
struct pj_list
|
||||
{
|
||||
PJ_DECL_LIST_MEMBER(void)
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the list.
|
||||
* Initially, the list will have no member, and function pj_list_empty() will
|
||||
* always return nonzero (which indicates TRUE) for the newly initialized
|
||||
* list.
|
||||
*
|
||||
* @param node The list head.
|
||||
*/
|
||||
PJ_INLINE(void) pj_list_init(pj_list_type * node)
|
||||
{
|
||||
((pj_list*)node)->next = ((pj_list*)node)->prev = node;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check that the list is empty.
|
||||
*
|
||||
* @param node The list head.
|
||||
*
|
||||
* @return Non-zero if the list is not-empty, or zero if it is empty.
|
||||
*
|
||||
*/
|
||||
PJ_INLINE(int) pj_list_empty(const pj_list_type * node)
|
||||
{
|
||||
return ((pj_list*)node)->next == node;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Insert the node to the list before the specified element position.
|
||||
*
|
||||
* @param pos The element to which the node will be inserted before.
|
||||
* @param node The element to be inserted.
|
||||
*
|
||||
* @return void.
|
||||
*/
|
||||
PJ_IDECL(void) pj_list_insert_before(pj_list_type *pos, pj_list_type *node);
|
||||
|
||||
|
||||
/**
|
||||
* Inserts all nodes in \a nodes to the target list.
|
||||
*
|
||||
* @param lst The target list.
|
||||
* @param nodes Nodes list.
|
||||
*/
|
||||
PJ_IDECL(void) pj_list_insert_nodes_before(pj_list_type *lst,
|
||||
pj_list_type *nodes);
|
||||
|
||||
/**
|
||||
* Insert a node to the list after the specified element position.
|
||||
*
|
||||
* @param pos The element in the list which will precede the inserted
|
||||
* element.
|
||||
* @param node The element to be inserted after the position element.
|
||||
*
|
||||
* @return void.
|
||||
*/
|
||||
PJ_IDECL(void) pj_list_insert_after(pj_list_type *pos, pj_list_type *node);
|
||||
|
||||
/**
|
||||
* Insert all nodes in \a nodes to the target list.
|
||||
*
|
||||
* @param lst The target list.
|
||||
* @param nodes Nodes list.
|
||||
*/
|
||||
PJ_IDECL(void) pj_list_insert_nodes_after(pj_list_type *lst,
|
||||
pj_list_type *nodes);
|
||||
|
||||
|
||||
/**
|
||||
* Remove elements from the source list, and insert them to the destination
|
||||
* list. The elements of the source list will occupy the
|
||||
* front elements of the target list. Note that the node pointed by \a list2
|
||||
* itself is not considered as a node, but rather as the list descriptor, so
|
||||
* it will not be inserted to the \a list1. The elements to be inserted starts
|
||||
* at \a list2->next. If \a list2 is to be included in the operation, use
|
||||
* \a pj_list_insert_nodes_before.
|
||||
*
|
||||
* @param list1 The destination list.
|
||||
* @param list2 The source list.
|
||||
*
|
||||
* @return void.
|
||||
*/
|
||||
PJ_IDECL(void) pj_list_merge_first(pj_list_type *list1, pj_list_type *list2);
|
||||
|
||||
|
||||
/**
|
||||
* Remove elements from the second list argument, and insert them to the list
|
||||
* in the first argument. The elements from the second list will be appended
|
||||
* to the first list. Note that the node pointed by \a list2
|
||||
* itself is not considered as a node, but rather as the list descriptor, so
|
||||
* it will not be inserted to the \a list1. The elements to be inserted starts
|
||||
* at \a list2->next. If \a list2 is to be included in the operation, use
|
||||
* \a pj_list_insert_nodes_before.
|
||||
*
|
||||
* @param list1 The element in the list which will precede the inserted
|
||||
* element.
|
||||
* @param list2 The element in the list to be inserted.
|
||||
*
|
||||
* @return void.
|
||||
*/
|
||||
PJ_IDECL(void) pj_list_merge_last( pj_list_type *list1, pj_list_type *list2);
|
||||
|
||||
|
||||
/**
|
||||
* Erase the node from the list it currently belongs.
|
||||
*
|
||||
* @param node The element to be erased.
|
||||
*/
|
||||
PJ_IDECL(void) pj_list_erase(pj_list_type *node);
|
||||
|
||||
|
||||
/**
|
||||
* Find node in the list.
|
||||
*
|
||||
* @param list The list head.
|
||||
* @param node The node element to be searched.
|
||||
*
|
||||
* @return The node itself if it is found in the list, or NULL if it is not
|
||||
* found in the list.
|
||||
*/
|
||||
PJ_IDECL(pj_list_type*) pj_list_find_node(pj_list_type *list,
|
||||
pj_list_type *node);
|
||||
|
||||
|
||||
/**
|
||||
* Search the list for the specified value, using the specified comparison
|
||||
* function. This function iterates on nodes in the list, started with the
|
||||
* first node, and call the user supplied comparison function until the
|
||||
* comparison function returns ZERO.
|
||||
*
|
||||
* @param list The list head.
|
||||
* @param value The user defined value to be passed in the comparison
|
||||
* function
|
||||
* @param comp The comparison function, which should return ZERO to
|
||||
* indicate that the searched value is found.
|
||||
*
|
||||
* @return The first node that matched, or NULL if it is not found.
|
||||
*/
|
||||
PJ_IDECL(pj_list_type*) pj_list_search(pj_list_type *list, void *value,
|
||||
int (*comp)(void *value,
|
||||
const pj_list_type *node)
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#if PJ_FUNCTIONS_ARE_INLINED
|
||||
# include "list_i.h"
|
||||
#endif
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_LIST_H__ */
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/list_i.h 4 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
|
||||
/* Internal */
|
||||
PJ_IDEF(void) pj_link_node(pj_list_type *prev, pj_list_type *next)
|
||||
{
|
||||
((pj_list*)prev)->next = next;
|
||||
((pj_list*)next)->prev = prev;
|
||||
}
|
||||
|
||||
/*
|
||||
PJ_IDEF(void)
|
||||
pj_list_init(pj_list_type * node)
|
||||
{
|
||||
((pj_list*)node)->next = ((pj_list*)node)->prev = node;
|
||||
}
|
||||
|
||||
PJ_IDEF(int) pj_list_empty(const pj_list_type * node)
|
||||
{
|
||||
return ((pj_list*)node)->next == node;
|
||||
}
|
||||
*/
|
||||
|
||||
PJ_IDEF(void)
|
||||
pj_list_insert_after(pj_list_type *pos, pj_list_type *node)
|
||||
{
|
||||
((pj_list*)node)->prev = pos;
|
||||
((pj_list*)node)->next = ((pj_list*)pos)->next;
|
||||
((pj_list*) ((pj_list*)pos)->next) ->prev = node;
|
||||
((pj_list*)pos)->next = node;
|
||||
}
|
||||
|
||||
|
||||
PJ_IDEF(void)
|
||||
pj_list_insert_before(pj_list_type *pos, pj_list_type *node)
|
||||
{
|
||||
pj_list_insert_after(((pj_list*)pos)->prev, node);
|
||||
}
|
||||
|
||||
|
||||
PJ_IDEF(void)
|
||||
pj_list_insert_nodes_after(pj_list_type *pos, pj_list_type *lst)
|
||||
{
|
||||
pj_list *lst_last = (pj_list *) ((pj_list*)lst)->prev;
|
||||
pj_list *pos_next = (pj_list *) ((pj_list*)pos)->next;
|
||||
|
||||
pj_link_node(pos, lst);
|
||||
pj_link_node(lst_last, pos_next);
|
||||
}
|
||||
|
||||
PJ_IDEF(void)
|
||||
pj_list_insert_nodes_before(pj_list_type *pos, pj_list_type *lst)
|
||||
{
|
||||
pj_list_insert_nodes_after(((pj_list*)pos)->prev, lst);
|
||||
}
|
||||
|
||||
PJ_IDEF(void)
|
||||
pj_list_merge_last(pj_list_type *lst1, pj_list_type *lst2)
|
||||
{
|
||||
pj_link_node(((pj_list*)lst1)->prev, ((pj_list*)lst2)->next);
|
||||
pj_link_node(((pj_list*)lst2)->prev, lst1);
|
||||
pj_list_init(lst2);
|
||||
}
|
||||
|
||||
PJ_IDEF(void)
|
||||
pj_list_merge_first(pj_list_type *lst1, pj_list_type *lst2)
|
||||
{
|
||||
pj_link_node(((pj_list*)lst2)->prev, ((pj_list*)lst1)->next);
|
||||
pj_link_node(((pj_list*)lst1), ((pj_list*)lst2)->next);
|
||||
pj_list_init(lst2);
|
||||
}
|
||||
|
||||
PJ_IDEF(void)
|
||||
pj_list_erase(pj_list_type *node)
|
||||
{
|
||||
pj_link_node( ((pj_list*)node)->prev, ((pj_list*)node)->next);
|
||||
}
|
||||
|
||||
|
||||
PJ_IDEF(pj_list_type*)
|
||||
pj_list_find_node(pj_list_type *list, pj_list_type *node)
|
||||
{
|
||||
pj_list *p = (pj_list *) ((pj_list*)list)->next;
|
||||
while (p != list && p != node)
|
||||
p = (pj_list *) p->next;
|
||||
|
||||
return p==node ? p : NULL;
|
||||
}
|
||||
|
||||
|
||||
PJ_IDEF(pj_list_type*)
|
||||
pj_list_search(pj_list_type *list, void *value,
|
||||
int (*comp)(void *value, const pj_list_type *node))
|
||||
{
|
||||
pj_list *p = (pj_list *) ((pj_list*)list)->next;
|
||||
while (p != list && (*comp)(value, p) != 0)
|
||||
p = (pj_list *) p->next;
|
||||
|
||||
return p==list ? NULL : p;
|
||||
}
|
||||
|
|
@ -0,0 +1,136 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/lock.h 2 10/14/05 12:26a Bennylp $ */
|
||||
#ifndef __PJ_LOCK_H__
|
||||
#define __PJ_LOCK_H__
|
||||
|
||||
/**
|
||||
* @file lock.h
|
||||
* @brief Higher abstraction for locking objects.
|
||||
*/
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_LOCK Lock Objects
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
*
|
||||
* <b>Lock Objects</b> are higher abstraction for different lock mechanisms.
|
||||
* It offers the same API for manipulating different lock types (e.g.
|
||||
* @ref PJ_MUTEX "mutex", @ref PJ_SEM "semaphores", or null locks).
|
||||
* Because Lock Objects have the same API for different types of lock
|
||||
* implementation, it can be passed around in function arguments. As the
|
||||
* result, it can be used to control locking policy for a particular
|
||||
* feature.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Create simple, non recursive mutex lock object.
|
||||
*
|
||||
* @param pool Memory pool.
|
||||
* @param name Lock object's name.
|
||||
* @param lock Pointer to store the returned handle.
|
||||
*
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_lock_create_simple_mutex( pj_pool_t *pool,
|
||||
const char *name,
|
||||
pj_lock_t **lock );
|
||||
|
||||
/**
|
||||
* Create recursive mutex lock object.
|
||||
*
|
||||
* @param pool Memory pool.
|
||||
* @param name Lock object's name.
|
||||
* @param lock Pointer to store the returned handle.
|
||||
*
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_lock_create_recursive_mutex( pj_pool_t *pool,
|
||||
const char *name,
|
||||
pj_lock_t **lock );
|
||||
|
||||
|
||||
/**
|
||||
* Create NULL mutex. A NULL mutex doesn't actually have any synchronization
|
||||
* object attached to it.
|
||||
*
|
||||
* @param pool Memory pool.
|
||||
* @param name Lock object's name.
|
||||
* @param lock Pointer to store the returned handle.
|
||||
*
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_lock_create_null_mutex( pj_pool_t *pool,
|
||||
const char *name,
|
||||
pj_lock_t **lock );
|
||||
|
||||
|
||||
#if defined(PJ_HAS_SEMAPHORE) && PJ_HAS_SEMAPHORE != 0
|
||||
/**
|
||||
* Create semaphore lock object.
|
||||
*
|
||||
* @param pool Memory pool.
|
||||
* @param name Lock object's name.
|
||||
* @param initial Initial value of the semaphore.
|
||||
* @param max Maximum value of the semaphore.
|
||||
* @param lock Pointer to store the returned handle.
|
||||
*
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_lock_create_semaphore( pj_pool_t *pool,
|
||||
const char *name,
|
||||
unsigned initial,
|
||||
unsigned max,
|
||||
pj_lock_t **lock );
|
||||
|
||||
#endif /* PJ_HAS_SEMAPHORE */
|
||||
|
||||
/**
|
||||
* Acquire lock on the specified lock object.
|
||||
*
|
||||
* @param lock The lock object.
|
||||
*
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_lock_acquire( pj_lock_t *lock );
|
||||
|
||||
|
||||
/**
|
||||
* Try to acquire lock on the specified lock object.
|
||||
*
|
||||
* @param lock The lock object.
|
||||
*
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_lock_tryacquire( pj_lock_t *lock );
|
||||
|
||||
|
||||
/**
|
||||
* Release lock on the specified lock object.
|
||||
*
|
||||
* @param lock The lock object.
|
||||
*
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_lock_release( pj_lock_t *lock );
|
||||
|
||||
|
||||
/**
|
||||
* Destroy the lock object.
|
||||
*
|
||||
* @param lock The lock object.
|
||||
*
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_lock_destroy( pj_lock_t *lock );
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
|
||||
#endif /* __PJ_LOCK_H__ */
|
||||
|
|
@ -0,0 +1,304 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/log.h 7 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_LOG_H__
|
||||
#define __PJ_LOG_H__
|
||||
|
||||
/**
|
||||
* @file log.h
|
||||
* @brief Logging Utility.
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_MISC Miscelaneous
|
||||
* @ingroup PJ
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup PJ_LOG Logging Facility
|
||||
* @ingroup PJ_MISC
|
||||
* @{
|
||||
*
|
||||
* The PJLIB logging facility is a configurable, flexible, and convenient
|
||||
* way to write logging or trace information.
|
||||
*
|
||||
* To write to the log, one uses construct like below:
|
||||
*
|
||||
* <pre>
|
||||
* ...
|
||||
* PJ_LOG(3, ("main.c", "Starting hello..."));
|
||||
* ...
|
||||
* PJ_LOG(3, ("main.c", "Hello world from process %d", pj_getpid()));
|
||||
* ...
|
||||
* </pre>
|
||||
*
|
||||
* In the above example, the number @b 3 controls the verbosity level of
|
||||
* the information (which means "information", by convention). The string
|
||||
* "main.c" specifies the source or sender of the message.
|
||||
*
|
||||
*
|
||||
* \section pj_log_quick_sample_sec Examples
|
||||
*
|
||||
* For examples, see:
|
||||
* - @ref page_pjlib_samples_log_c.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Log decoration flag, to be specified with #pj_log_set_decor().
|
||||
*/
|
||||
enum pj_log_decoration
|
||||
{
|
||||
PJ_LOG_HAS_DAY_NAME = 1, /**< Include day name [default: no]. */
|
||||
PJ_LOG_HAS_YEAR = 2, /**< Include year digit [default: no] */
|
||||
PJ_LOG_HAS_MONTH = 4, /**< Include month [default: no] */
|
||||
PJ_LOG_HAS_DAY_OF_MON = 8, /**< Include day of month [default: no] */
|
||||
PJ_LOG_HAS_TIME = 16, /**< Include time [default: yes]. */
|
||||
PJ_LOG_HAS_MICRO_SEC = 32, /**< Include microseconds [yes] */
|
||||
PJ_LOG_HAS_SENDER = 64, /**< Include sender in the log [yes]. */
|
||||
PJ_LOG_HAS_NEWLINE = 128, /**< Terminate each call with newline [yes].*/
|
||||
};
|
||||
|
||||
/**
|
||||
* Write log message.
|
||||
* This is the main macro used to write text to the logging backend.
|
||||
*
|
||||
* @param level The logging verbosity level. Lower number indicates higher
|
||||
* importance, with level zero indicates fatal error. Only
|
||||
* numeral argument is permitted (e.g. not variable).
|
||||
* @param arg Enclosed 'printf' like arguments, with the first
|
||||
* argument is the sender, the second argument is format
|
||||
* string and the following arguments are variable number of
|
||||
* arguments suitable for the format string.
|
||||
*
|
||||
* Sample:
|
||||
* \verbatim
|
||||
PJ_LOG(2, (__FILE__, "current value is %d", value));
|
||||
\endverbatim
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_LOG(level,arg) pj_log_wrapper_##level(arg)
|
||||
|
||||
/**
|
||||
* Signature for function to be registered to the logging subsystem to
|
||||
* write the actual log message to some output device.
|
||||
*
|
||||
* @param level Log level.
|
||||
* @param data Log message.
|
||||
* @param len Message length.
|
||||
*/
|
||||
typedef void pj_log_func(int level, const char *data, int len);
|
||||
|
||||
/**
|
||||
* Default logging writer function used by front end logger function.
|
||||
* Application normally should NOT need to call this function, but
|
||||
* rather use the PJ_LOG macro.
|
||||
*
|
||||
* @param level Log level.
|
||||
* @param buffer Log message.
|
||||
* @param len Message length.
|
||||
*/
|
||||
PJ_DECL(void) pj_log_write(int level, const char *buffer, int len);
|
||||
|
||||
|
||||
#if PJ_LOG_MAX_LEVEL >= 1
|
||||
|
||||
/**
|
||||
* Change log output function. The front-end logging functions will call
|
||||
* this function to write the actual message to the desired device.
|
||||
* By default, the front-end functions use pj_log_write() to write
|
||||
* the messages, unless it's changed by calling this function.
|
||||
*
|
||||
* @param func The function that will be called to write the log
|
||||
* messages to the desired device.
|
||||
*/
|
||||
PJ_DECL(void) pj_log_set_log_func( pj_log_func *func );
|
||||
|
||||
/**
|
||||
* Get the current log output function that is used to write log messages.
|
||||
*
|
||||
* @return Current log output function.
|
||||
*/
|
||||
PJ_DECL(pj_log_func*) pj_log_get_log_func(void);
|
||||
|
||||
/**
|
||||
* Set maximum log level. Application can call this function to set
|
||||
* the desired level of verbosity of the logging messages. The bigger the
|
||||
* value, the more verbose the logging messages will be printed. However,
|
||||
* the maximum level of verbosity can not exceed compile time value of
|
||||
* PJ_LOG_MAX_LEVEL.
|
||||
*
|
||||
* @param level The maximum level of verbosity of the logging
|
||||
* messages (6=very detailed..1=error only, 0=disabled)
|
||||
*/
|
||||
PJ_DECL(void) pj_log_set_level(int level);
|
||||
|
||||
/**
|
||||
* Get current maximum log verbositylevel.
|
||||
*
|
||||
* @return Current log maximum level.
|
||||
*/
|
||||
PJ_DECL(int) pj_log_get_level(void);
|
||||
|
||||
/**
|
||||
* Set log decoration. The log decoration flag controls what are printed
|
||||
* to output device alongside the actual message. For example, application
|
||||
* can specify that date/time information should be displayed with each
|
||||
* log message.
|
||||
*
|
||||
* @param decor Bitmask combination of #pj_log_decoration to control
|
||||
* the layout of the log message.
|
||||
*/
|
||||
PJ_DECL(void) pj_log_set_decor(unsigned decor);
|
||||
|
||||
/**
|
||||
* Get current log decoration flag.
|
||||
*
|
||||
* @return Log decoration flag.
|
||||
*/
|
||||
PJ_DECL(unsigned) pj_log_get_decor(void);
|
||||
|
||||
|
||||
#else /* #if PJ_LOG_MAX_LEVEL >= 1 */
|
||||
|
||||
/**
|
||||
* Change log output function. The front-end logging functions will call
|
||||
* this function to write the actual message to the desired device.
|
||||
* By default, the front-end functions use pj_log_write() to write
|
||||
* the messages, unless it's changed by calling this function.
|
||||
*
|
||||
* @param func The function that will be called to write the log
|
||||
* messages to the desired device.
|
||||
*/
|
||||
# define pj_log_set_log_func(func)
|
||||
|
||||
/**
|
||||
* Set maximum log level. Application can call this function to set
|
||||
* the desired level of verbosity of the logging messages. The bigger the
|
||||
* value, the more verbose the logging messages will be printed. However,
|
||||
* the maximum level of verbosity can not exceed compile time value of
|
||||
* PJ_LOG_MAX_LEVEL.
|
||||
*
|
||||
* @param level The maximum level of verbosity of the logging
|
||||
* messages (6=very detailed..1=error only, 0=disabled)
|
||||
*/
|
||||
# define pj_log_set_level(level)
|
||||
|
||||
/**
|
||||
* Set log decoration. The log decoration flag controls what are printed
|
||||
* to output device alongside the actual message. For example, application
|
||||
* can specify that date/time information should be displayed with each
|
||||
* log message.
|
||||
*
|
||||
* @param decor Bitmask combination of #pj_log_decoration to control
|
||||
* the layout of the log message.
|
||||
*/
|
||||
# define pj_log_set_decor(decor)
|
||||
|
||||
#endif /* #if PJ_LOG_MAX_LEVEL >= 1 */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
* Log functions implementation prototypes.
|
||||
* These functions are called by PJ_LOG macros according to verbosity
|
||||
* level specified when calling the macro. Applications should not normally
|
||||
* need to call these functions directly.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @def pj_log_wrapper_1(arg)
|
||||
* Internal function to write log with verbosity 1. Will evaluate to
|
||||
* empty expression if PJ_LOG_MAX_LEVEL is below 1.
|
||||
* @param arg Log expression.
|
||||
*/
|
||||
#if PJ_LOG_MAX_LEVEL >= 1
|
||||
#define pj_log_wrapper_1(arg) pj_log_1 arg
|
||||
/** Internal function. */
|
||||
PJ_DECL(void) pj_log_1(const char *src, const char *format, ...);
|
||||
#else
|
||||
#define pj_log_wrapper_1(arg)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def pj_log_wrapper_2(arg)
|
||||
* Internal function to write log with verbosity 2. Will evaluate to
|
||||
* empty expression if PJ_LOG_MAX_LEVEL is below 2.
|
||||
* @param arg Log expression.
|
||||
*/
|
||||
#if PJ_LOG_MAX_LEVEL >= 2
|
||||
#define pj_log_wrapper_2(arg) pj_log_2 arg
|
||||
/** Internal function. */
|
||||
PJ_DECL(void) pj_log_2(const char *src, const char *format, ...);
|
||||
#else
|
||||
#define pj_log_wrapper_2(arg)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def pj_log_wrapper_3(arg)
|
||||
* Internal function to write log with verbosity 3. Will evaluate to
|
||||
* empty expression if PJ_LOG_MAX_LEVEL is below 3.
|
||||
* @param arg Log expression.
|
||||
*/
|
||||
#if PJ_LOG_MAX_LEVEL >= 3
|
||||
#define pj_log_wrapper_3(arg) pj_log_3 arg
|
||||
/** Internal function. */
|
||||
PJ_DECL(void) pj_log_3(const char *src, const char *format, ...);
|
||||
#else
|
||||
#define pj_log_wrapper_3(arg)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def pj_log_wrapper_4(arg)
|
||||
* Internal function to write log with verbosity 4. Will evaluate to
|
||||
* empty expression if PJ_LOG_MAX_LEVEL is below 4.
|
||||
* @param arg Log expression.
|
||||
*/
|
||||
#if PJ_LOG_MAX_LEVEL >= 4
|
||||
#define pj_log_wrapper_4(arg) pj_log_4 arg
|
||||
/** Internal function. */
|
||||
PJ_DECL(void) pj_log_4(const char *src, const char *format, ...);
|
||||
#else
|
||||
#define pj_log_wrapper_4(arg)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def pj_log_wrapper_5(arg)
|
||||
* Internal function to write log with verbosity 5. Will evaluate to
|
||||
* empty expression if PJ_LOG_MAX_LEVEL is below 5.
|
||||
* @param arg Log expression.
|
||||
*/
|
||||
#if PJ_LOG_MAX_LEVEL >= 5
|
||||
#define pj_log_wrapper_5(arg) pj_log_5 arg
|
||||
/** Internal function. */
|
||||
PJ_DECL(void) pj_log_5(const char *src, const char *format, ...);
|
||||
#else
|
||||
#define pj_log_wrapper_5(arg)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def pj_log_wrapper_6(arg)
|
||||
* Internal function to write log with verbosity 6. Will evaluate to
|
||||
* empty expression if PJ_LOG_MAX_LEVEL is below 6.
|
||||
* @param arg Log expression.
|
||||
*/
|
||||
#if PJ_LOG_MAX_LEVEL >= 6
|
||||
#define pj_log_wrapper_6(arg) pj_log_6 arg
|
||||
/** Internal function. */
|
||||
PJ_DECL(void) pj_log_6(const char *src, const char *format, ...);
|
||||
#else
|
||||
#define pj_log_wrapper_6(arg)
|
||||
#endif
|
||||
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_LOG_H__ */
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/src/pj/md5.h 5 9/17/05 10:37a Bennylp $ */
|
||||
/*
|
||||
Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved.
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
L. Peter Deutsch
|
||||
ghost@aladdin.com
|
||||
|
||||
*/
|
||||
/* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */
|
||||
/*
|
||||
Independent implementation of MD5 (RFC 1321).
|
||||
|
||||
This code implements the MD5 Algorithm defined in RFC 1321, whose
|
||||
text is available at
|
||||
http://www.ietf.org/rfc/rfc1321.txt
|
||||
The code is derived from the text of the RFC, including the test suite
|
||||
(section A.5) but excluding the rest of Appendix A. It does not include
|
||||
any code or documentation that is identified in the RFC as being
|
||||
copyrighted.
|
||||
|
||||
The original and principal author of md5.h is L. Peter Deutsch
|
||||
<ghost@aladdin.com>. Other authors are noted in the change history
|
||||
that follows (in reverse chronological order):
|
||||
|
||||
2002-04-13 lpd Removed support for non-ANSI compilers; removed
|
||||
references to Ghostscript; clarified derivation from RFC 1321;
|
||||
now handles byte order either statically or dynamically.
|
||||
1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
|
||||
1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
|
||||
added conditionalization for C++ compilation from Martin
|
||||
Purschke <purschke@bnl.gov>.
|
||||
1999-05-03 lpd Original version.
|
||||
*/
|
||||
|
||||
#ifndef md5_INCLUDED
|
||||
# define md5_INCLUDED
|
||||
|
||||
/*
|
||||
* This package supports both compile-time and run-time determination of CPU
|
||||
* byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be
|
||||
* compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is
|
||||
* defined as non-zero, the code will be compiled to run only on big-endian
|
||||
* CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to
|
||||
* run on either big- or little-endian CPUs, but will run slightly less
|
||||
* efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined.
|
||||
*/
|
||||
|
||||
typedef unsigned char md5_byte_t; /* 8-bit byte */
|
||||
typedef unsigned long md5_word_t; /* 32-bit word */
|
||||
|
||||
/** Define the state of the MD5 Algorithm. */
|
||||
typedef struct md5_state_s {
|
||||
md5_word_t count[2]; /**< message length in bits, lsw first */
|
||||
md5_word_t abcd[4]; /**< digest buffer */
|
||||
md5_byte_t buf[64]; /**< accumulate block */
|
||||
} md5_state_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/** Initialize the algorithm. */
|
||||
void md5_init(md5_state_t *pms);
|
||||
|
||||
/** Append a string to the message. */
|
||||
void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
|
||||
|
||||
/** Finish the message and return the digest. */
|
||||
void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* end extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* md5_INCLUDED */
|
|
@ -0,0 +1,904 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/os.h 12 10/29/05 11:30a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_OS_H__
|
||||
#define __PJ_OS_H__
|
||||
|
||||
/**
|
||||
* @file os.h
|
||||
* @brief OS dependent functions
|
||||
*/
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_OS Operating System Dependent Functionality.
|
||||
* @ingroup PJ
|
||||
*/
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* @defgroup PJ_THREAD Threads
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
* This module provides multithreading API.
|
||||
*
|
||||
* \section pj_thread_examples_sec Examples
|
||||
*
|
||||
* For examples, please see:
|
||||
* - \ref page_pjlib_thread_test
|
||||
* - \ref page_pjlib_sleep_test
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Thread creation flags:
|
||||
* - PJ_THREAD_SUSPENDED: specify that the thread should be created suspended.
|
||||
*/
|
||||
typedef enum pj_thread_create_flags
|
||||
{
|
||||
PJ_THREAD_SUSPENDED = 1
|
||||
} pj_thread_create_flags;
|
||||
|
||||
|
||||
/**
|
||||
* Specify this as \a stack_size argument in #pj_thread_create() to specify
|
||||
* that thread should use default stack size for the current platform.
|
||||
*/
|
||||
#define PJ_THREAD_DEFAULT_STACK_SIZE 0
|
||||
|
||||
/**
|
||||
* Type of thread entry function.
|
||||
*/
|
||||
typedef int (PJ_THREAD_FUNC pj_thread_proc)(void*);
|
||||
|
||||
/**
|
||||
* Size of thread struct.
|
||||
*/
|
||||
#if !defined(PJ_THREAD_DESC_SIZE)
|
||||
# define PJ_THREAD_DESC_SIZE (PJ_MAX_OBJ_NAME + 10*sizeof(long))
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Thread structure, to thread's state when the thread is created by external
|
||||
* or native API.
|
||||
*/
|
||||
typedef pj_uint8_t pj_thread_desc[PJ_THREAD_DESC_SIZE];
|
||||
|
||||
/**
|
||||
* Get process ID.
|
||||
* @return process ID.
|
||||
*/
|
||||
PJ_DECL(pj_uint32_t) pj_getpid(void);
|
||||
|
||||
/**
|
||||
* Create a new thread.
|
||||
*
|
||||
* @param pool The memory pool from which the thread record
|
||||
* will be allocated from.
|
||||
* @param thread_name The optional name to be assigned to the thread.
|
||||
* @param proc Thread entry function.
|
||||
* @param arg Argument to be passed to the thread entry function.
|
||||
* @param stack_size The size of the stack for the new thread, or ZERO or
|
||||
* PJ_THREAD_DEFAULT_STACK_SIZE to let the
|
||||
* library choose the reasonable size for the stack.
|
||||
* For some systems, the stack will be allocated from
|
||||
* the pool, so the pool must have suitable capacity.
|
||||
* @param flags Flags for thread creation, which is bitmask combination
|
||||
* from enum pj_thread_create_flags.
|
||||
* @param thread Pointer to hold the newly created thread.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_thread_create( pj_pool_t *pool,
|
||||
const char *thread_name,
|
||||
pj_thread_proc *proc,
|
||||
void *arg,
|
||||
pj_size_t stack_size,
|
||||
unsigned flags,
|
||||
pj_thread_t **thread );
|
||||
|
||||
/**
|
||||
* Register a thread that was created by external or native API to PJLIB.
|
||||
* This function must be called in the context of the thread being registered.
|
||||
* When the thread is created by external function or API call,
|
||||
* it must be 'registered' to PJLIB using pj_thread_register(), so that it can
|
||||
* cooperate with PJLIB's framework. During registration, some data needs to
|
||||
* be maintained, and this data must remain available during the thread's
|
||||
* lifetime.
|
||||
*
|
||||
* @param thread_name The optional name to be assigned to the thread.
|
||||
* @param desc Thread descriptor, which must be available throughout
|
||||
* the lifetime of the thread.
|
||||
* @param thread Pointer to hold the created thread handle.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_thread_register ( const char *thread_name,
|
||||
pj_thread_desc desc,
|
||||
pj_thread_t **thread);
|
||||
|
||||
/**
|
||||
* Get thread name.
|
||||
*
|
||||
* @param thread The thread handle.
|
||||
*
|
||||
* @return Thread name as null terminated string.
|
||||
*/
|
||||
PJ_DECL(const char*) pj_thread_get_name(pj_thread_t *thread);
|
||||
|
||||
/**
|
||||
* Resume a suspended thread.
|
||||
*
|
||||
* @param thread The thread handle.
|
||||
*
|
||||
* @return zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_thread_resume(pj_thread_t *thread);
|
||||
|
||||
/**
|
||||
* Get the current thread.
|
||||
*
|
||||
* @return Thread handle of current thread.
|
||||
*/
|
||||
PJ_DECL(pj_thread_t*) pj_thread_this(void);
|
||||
|
||||
/**
|
||||
* Join thread.
|
||||
* This function will block the caller thread until the specified thread exits.
|
||||
*
|
||||
* @param thread The thread handle.
|
||||
*
|
||||
* @return zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_thread_join(pj_thread_t *thread);
|
||||
|
||||
|
||||
/**
|
||||
* Destroy thread and release resources allocated for the thread.
|
||||
* However, the memory allocated for the pj_thread_t itself will only be released
|
||||
* when the pool used to create the thread is destroyed.
|
||||
*
|
||||
* @param thread The thread handle.
|
||||
*
|
||||
* @return zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_thread_destroy(pj_thread_t *thread);
|
||||
|
||||
|
||||
/**
|
||||
* Put the current thread to sleep for the specified miliseconds.
|
||||
*
|
||||
* @param msec Miliseconds delay.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_thread_sleep(unsigned msec);
|
||||
|
||||
/**
|
||||
* @def PJ_CHECK_STACK()
|
||||
* PJ_CHECK_STACK() macro is used to check the sanity of the stack.
|
||||
* The OS implementation may check that no stack overflow occurs, and
|
||||
* it also may collect statistic about stack usage.
|
||||
*/
|
||||
#if defined(PJ_OS_HAS_CHECK_STACK) && PJ_OS_HAS_CHECK_STACK!=0
|
||||
|
||||
# define PJ_CHECK_STACK() pj_thread_check_stack(__FILE__, __LINE__)
|
||||
|
||||
/** @internal
|
||||
* The implementation of stack checking.
|
||||
*/
|
||||
PJ_DECL(void) pj_thread_check_stack(const char *file, int line);
|
||||
|
||||
/** @internal
|
||||
* Get maximum stack usage statistic.
|
||||
*/
|
||||
PJ_DECL(pj_uint32_t) pj_thread_get_stack_max_usage(pj_thread_t *thread);
|
||||
|
||||
/** @internal
|
||||
* Dump thread stack status.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_thread_get_stack_info(pj_thread_t *thread,
|
||||
const char **file,
|
||||
int *line);
|
||||
#else
|
||||
|
||||
# define PJ_CHECK_STACK()
|
||||
/** pj_thread_get_stack_max_usage() for the thread */
|
||||
# define pj_thread_get_stack_max_usage(thread) 0
|
||||
/** pj_thread_get_stack_info() for the thread */
|
||||
# define pj_thread_get_stack_info(thread,f,l) (*(f)="",*(l)=0)
|
||||
#endif /* PJ_OS_HAS_CHECK_STACK */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* @defgroup PJ_TLS Thread Local Storage.
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Allocate thread local storage index. The initial value of the variable at
|
||||
* the index is zero.
|
||||
*
|
||||
* @param index Pointer to hold the return value.
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_thread_local_alloc(long *index);
|
||||
|
||||
/**
|
||||
* Deallocate thread local variable.
|
||||
*
|
||||
* @param index The variable index.
|
||||
*/
|
||||
PJ_DECL(void) pj_thread_local_free(long index);
|
||||
|
||||
/**
|
||||
* Set the value of thread local variable.
|
||||
*
|
||||
* @param index The index of the variable.
|
||||
* @param value The value.
|
||||
*/
|
||||
PJ_DECL(void) pj_thread_local_set(long index, void *value);
|
||||
|
||||
/**
|
||||
* Get the value of thread local variable.
|
||||
*
|
||||
* @param index The index of the variable.
|
||||
* @return The value.
|
||||
*/
|
||||
PJ_DECL(void*) pj_thread_local_get(long index);
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* @defgroup PJ_ATOMIC Atomic Variables
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
*
|
||||
* This module provides API to manipulate atomic variables.
|
||||
*
|
||||
* \section pj_atomic_examples_sec Examples
|
||||
*
|
||||
* For some example codes, please see:
|
||||
* - @ref page_pjlib_atomic_test
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Create atomic variable.
|
||||
*
|
||||
* @param pool The pool.
|
||||
* @param initial The initial value of the atomic variable.
|
||||
* @param atomic Pointer to hold the atomic variable upon return.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_atomic_create( pj_pool_t *pool,
|
||||
pj_atomic_value_t initial,
|
||||
pj_atomic_t **atomic );
|
||||
|
||||
/**
|
||||
* Destroy atomic variable.
|
||||
*
|
||||
* @param atomic_var the atomic variable.
|
||||
*
|
||||
* @return PJ_SUCCESS if success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_atomic_destroy( pj_atomic_t *atomic_var );
|
||||
|
||||
/**
|
||||
* Set the value of an atomic type, and return the previous value.
|
||||
*
|
||||
* @param atomic_var the atomic variable.
|
||||
* @param value value to be set to the variable.
|
||||
*
|
||||
* @return the previous value of the variable.
|
||||
*/
|
||||
PJ_DECL(pj_atomic_value_t) pj_atomic_set(pj_atomic_t *atomic_var,
|
||||
pj_atomic_value_t value);
|
||||
|
||||
/**
|
||||
* Get the value of an atomic type.
|
||||
*
|
||||
* @param atomic_var the atomic variable.
|
||||
*
|
||||
* @return the value of the atomic variable.
|
||||
*/
|
||||
PJ_DECL(pj_atomic_value_t) pj_atomic_get(pj_atomic_t *atomic_var);
|
||||
|
||||
/**
|
||||
* Increment the value of an atomic type.
|
||||
*
|
||||
* @param atomic_var the atomic variable.
|
||||
*
|
||||
* @return the result.
|
||||
*/
|
||||
PJ_DECL(pj_atomic_value_t) pj_atomic_inc(pj_atomic_t *atomic_var);
|
||||
|
||||
/**
|
||||
* Decrement the value of an atomic type.
|
||||
*
|
||||
* @param atomic_var the atomic variable.
|
||||
*
|
||||
* @return the result.
|
||||
*/
|
||||
PJ_DECL(pj_atomic_value_t) pj_atomic_dec(pj_atomic_t *atomic_var);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* @defgroup PJ_MUTEX Mutexes.
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
*
|
||||
* Mutex manipulation. Alternatively, application can use higher abstraction
|
||||
* for lock objects, which provides uniform API for all kinds of lock
|
||||
* mechanisms, including mutex. See @ref PJ_LOCK for more information.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Mutex types:
|
||||
* - PJ_MUTEX_DEFAULT: default mutex type, which is system dependent.
|
||||
* - PJ_MUTEX_SIMPLE: non-recursive mutex.
|
||||
* - PJ_MUTEX_RECURSIVE: recursive mutex.
|
||||
*/
|
||||
typedef enum pj_mutex_type_e
|
||||
{
|
||||
PJ_MUTEX_DEFAULT,
|
||||
PJ_MUTEX_SIMPLE,
|
||||
PJ_MUTEX_RECURSE,
|
||||
} pj_mutex_type_e;
|
||||
|
||||
|
||||
/**
|
||||
* Create mutex of the specified type.
|
||||
*
|
||||
* @param pool The pool.
|
||||
* @param name Name to be associated with the mutex (for debugging).
|
||||
* @param type The type of the mutex, of type #pj_mutex_type_e.
|
||||
* @param mutex Pointer to hold the returned mutex instance.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_mutex_create(pj_pool_t *pool,
|
||||
const char *name,
|
||||
int type,
|
||||
pj_mutex_t **mutex);
|
||||
|
||||
/**
|
||||
* Create simple, non-recursive mutex.
|
||||
* This function is a simple wrapper for #pj_mutex_create to create
|
||||
* non-recursive mutex.
|
||||
*
|
||||
* @param pool The pool.
|
||||
* @param name Mutex name.
|
||||
* @param mutex Pointer to hold the returned mutex instance.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_mutex_create_simple( pj_pool_t *pool, const char *name,
|
||||
pj_mutex_t **mutex );
|
||||
|
||||
/**
|
||||
* Create recursive mutex.
|
||||
* This function is a simple wrapper for #pj_mutex_create to create
|
||||
* recursive mutex.
|
||||
*
|
||||
* @param pool The pool.
|
||||
* @param name Mutex name.
|
||||
* @param mutex Pointer to hold the returned mutex instance.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_mutex_create_recursive( pj_pool_t *pool,
|
||||
const char *name,
|
||||
pj_mutex_t **mutex );
|
||||
|
||||
/**
|
||||
* Acquire mutex lock.
|
||||
*
|
||||
* @param mutex The mutex.
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_mutex_lock(pj_mutex_t *mutex);
|
||||
|
||||
/**
|
||||
* Release mutex lock.
|
||||
*
|
||||
* @param mutex The mutex.
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_mutex_unlock(pj_mutex_t *mutex);
|
||||
|
||||
/**
|
||||
* Try to acquire mutex lock.
|
||||
*
|
||||
* @param mutex The mutex.
|
||||
* @return PJ_SUCCESS on success, or the error code if the
|
||||
* lock couldn't be acquired.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_mutex_trylock(pj_mutex_t *mutex);
|
||||
|
||||
/**
|
||||
* Destroy mutex.
|
||||
*
|
||||
* @param mutex Te mutex.
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_mutex_destroy(pj_mutex_t *mutex);
|
||||
|
||||
/**
|
||||
* Determine whether calling thread is owning the mutex (only available when
|
||||
* PJ_DEBUG is set).
|
||||
* @param mutex The mutex.
|
||||
* @return Non-zero if yes.
|
||||
*/
|
||||
#if defined(PJ_DEBUG) && PJ_DEBUG != 0
|
||||
PJ_DECL(pj_bool_t) pj_mutex_is_locked(pj_mutex_t *mutex);
|
||||
#else
|
||||
# define pj_mutex_is_locked(mutex) 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* @defgroup PJ_CRIT_SEC Critical sections.
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
* Critical section protection can be used to protect regions where:
|
||||
* - mutual exclusion protection is needed.
|
||||
* - it's rather too expensive to create a mutex.
|
||||
* - the time spent in the region is very very brief.
|
||||
*
|
||||
* Critical section is a global object, and it prevents any threads from
|
||||
* entering any regions that are protected by critical section once a thread
|
||||
* is already in the section.
|
||||
*
|
||||
* Critial section is \a not recursive!
|
||||
*
|
||||
* Application <b>MUST NOT</b> call any functions that may cause current
|
||||
* thread to block (such as allocating memory, performing I/O, locking mutex,
|
||||
* etc.) while holding the critical section.
|
||||
*/
|
||||
/**
|
||||
* Enter critical section.
|
||||
*/
|
||||
PJ_DECL(void) pj_enter_critical_section(void);
|
||||
|
||||
/**
|
||||
* Leave critical section.
|
||||
*/
|
||||
PJ_DECL(void) pj_leave_critical_section(void);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
#if defined(PJ_HAS_SEMAPHORE) && PJ_HAS_SEMAPHORE != 0
|
||||
/**
|
||||
* @defgroup PJ_SEM Semaphores.
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
*
|
||||
* This module provides abstraction for semaphores, where available.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create semaphore.
|
||||
*
|
||||
* @param pool The pool.
|
||||
* @param name Name to be assigned to the semaphore (for logging purpose)
|
||||
* @param initial The initial count of the semaphore.
|
||||
* @param max The maximum count of the semaphore.
|
||||
* @param sem Pointer to hold the semaphore created.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sem_create( pj_pool_t *pool,
|
||||
const char *name,
|
||||
unsigned initial,
|
||||
unsigned max,
|
||||
pj_sem_t **sem);
|
||||
|
||||
/**
|
||||
* Wait for semaphore.
|
||||
*
|
||||
* @param sem The semaphore.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sem_wait(pj_sem_t *sem);
|
||||
|
||||
/**
|
||||
* Try wait for semaphore.
|
||||
*
|
||||
* @param sem The semaphore.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sem_trywait(pj_sem_t *sem);
|
||||
|
||||
/**
|
||||
* Release semaphore.
|
||||
*
|
||||
* @param sem The semaphore.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sem_post(pj_sem_t *sem);
|
||||
|
||||
/**
|
||||
* Destroy semaphore.
|
||||
*
|
||||
* @param sem The semaphore.
|
||||
*
|
||||
* @return PJ_SUCCESS on success, or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sem_destroy(pj_sem_t *sem);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
#endif /* PJ_HAS_SEMAPHORE */
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
#if defined(PJ_HAS_EVENT_OBJ) && PJ_HAS_EVENT_OBJ != 0
|
||||
/**
|
||||
* @defgroup PJ_EVENT Event Object.
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
*
|
||||
* This module provides abstraction to event object (e.g. Win32 Event) where
|
||||
* available. Event objects can be used for synchronization among threads.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create event object.
|
||||
*
|
||||
* @param pool The pool.
|
||||
* @param name The name of the event object (for logging purpose).
|
||||
* @param manual_reset Specify whether the event is manual-reset
|
||||
* @param initial Specify the initial state of the event object.
|
||||
* @param event Pointer to hold the returned event object.
|
||||
*
|
||||
* @return event handle, or NULL if failed.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_event_create(pj_pool_t *pool, const char *name,
|
||||
pj_bool_t manual_reset, pj_bool_t initial,
|
||||
pj_event_t **event);
|
||||
|
||||
/**
|
||||
* Wait for event to be signaled.
|
||||
*
|
||||
* @param event The event object.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_event_wait(pj_event_t *event);
|
||||
|
||||
/**
|
||||
* Try wait for event object to be signalled.
|
||||
*
|
||||
* @param event The event object.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_event_trywait(pj_event_t *event);
|
||||
|
||||
/**
|
||||
* Set the event object state to signaled. For auto-reset event, this
|
||||
* will only release the first thread that are waiting on the event. For
|
||||
* manual reset event, the state remains signaled until the event is reset.
|
||||
* If there is no thread waiting on the event, the event object state
|
||||
* remains signaled.
|
||||
*
|
||||
* @param event The event object.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_event_set(pj_event_t *event);
|
||||
|
||||
/**
|
||||
* Set the event object to signaled state to release appropriate number of
|
||||
* waiting threads and then reset the event object to non-signaled. For
|
||||
* manual-reset event, this function will release all waiting threads. For
|
||||
* auto-reset event, this function will only release one waiting thread.
|
||||
*
|
||||
* @param event The event object.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_event_pulse(pj_event_t *event);
|
||||
|
||||
/**
|
||||
* Set the event object state to non-signaled.
|
||||
*
|
||||
* @param event The event object.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_event_reset(pj_event_t *event);
|
||||
|
||||
/**
|
||||
* Destroy the event object.
|
||||
*
|
||||
* @param event The event object.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_event_destroy(pj_event_t *event);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
#endif /* PJ_HAS_EVENT_OBJ */
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* @addtogroup PJ_TIME Time Data Type and Manipulation.
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
* This module provides API for manipulating time.
|
||||
*
|
||||
* \section pj_time_examples_sec Examples
|
||||
*
|
||||
* For examples, please see:
|
||||
* - \ref page_pjlib_sleep_test
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get current time of day in local representation.
|
||||
*
|
||||
* @param tv Variable to store the result.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_gettimeofday(pj_time_val *tv);
|
||||
|
||||
|
||||
/**
|
||||
* Parse time value into date/time representation.
|
||||
*
|
||||
* @param tv The time.
|
||||
* @param pt Variable to store the date time result.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_time_decode(const pj_time_val *tv, pj_parsed_time *pt);
|
||||
|
||||
/**
|
||||
* Encode date/time to time value.
|
||||
*
|
||||
* @param pt The date/time.
|
||||
* @param tv Variable to store time value result.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_time_encode(const pj_parsed_time *pt, pj_time_val *tv);
|
||||
|
||||
/**
|
||||
* Convert local time to GMT.
|
||||
*
|
||||
* @param tv Time to convert.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_time_local_to_gmt(pj_time_val *tv);
|
||||
|
||||
/**
|
||||
* Convert GMT to local time.
|
||||
*
|
||||
* @param tv Time to convert.
|
||||
*
|
||||
* @return zero if successfull.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_time_gmt_to_local(pj_time_val *tv);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
#if defined(PJ_TERM_HAS_COLOR) && PJ_TERM_HAS_COLOR != 0
|
||||
|
||||
/**
|
||||
* @defgroup PJ_TERM Terminal
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set current terminal color.
|
||||
*
|
||||
* @param color The RGB color.
|
||||
*
|
||||
* @return zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_term_set_color(pj_color_t color);
|
||||
|
||||
/**
|
||||
* Get current terminal foreground color.
|
||||
*
|
||||
* @return RGB color.
|
||||
*/
|
||||
PJ_DECL(pj_color_t) pj_term_get_color(void);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* PJ_TERM_HAS_COLOR */
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* @defgroup PJ_TIMESTAMP High Resolution Timestamp
|
||||
* @ingroup PJ_OS
|
||||
* @{
|
||||
*
|
||||
* PJLIB provides <b>High Resolution Timestamp</b> API to access highest
|
||||
* resolution timestamp value provided by the platform. The API is usefull
|
||||
* to measure precise elapsed time, and can be used in applications such
|
||||
* as profiling.
|
||||
*
|
||||
* The timestamp value is represented in cycles, and can be related to
|
||||
* normal time (in seconds or sub-seconds) using various functions provided.
|
||||
*
|
||||
* \section pj_timestamp_examples_sec Examples
|
||||
*
|
||||
* For examples, please see:
|
||||
* - \ref page_pjlib_sleep_test
|
||||
* - \ref page_pjlib_timestamp_test
|
||||
*/
|
||||
|
||||
/*
|
||||
* High resolution timer.
|
||||
*/
|
||||
#if defined(PJ_HAS_HIGH_RES_TIMER) && PJ_HAS_HIGH_RES_TIMER != 0
|
||||
|
||||
/**
|
||||
* This structure represents high resolution (64bit) time value. The time
|
||||
* values represent time in cycles, which is retrieved by calling
|
||||
* #pj_get_timestamp().
|
||||
*/
|
||||
typedef union pj_timestamp
|
||||
{
|
||||
struct
|
||||
{
|
||||
pj_uint32_t lo; /**< Low 32-bit value of the 64-bit value. */
|
||||
pj_uint32_t hi; /**< high 32-bit value of the 64-bit value. */
|
||||
} u32; /**< The 64-bit value as two 32-bit values. */
|
||||
|
||||
#if PJ_HAS_INT64
|
||||
pj_uint64_t u64; /**< The whole 64-bit value, where available. */
|
||||
#endif
|
||||
} pj_timestamp;
|
||||
|
||||
|
||||
/**
|
||||
* Acquire high resolution timer value. The time value are stored
|
||||
* in cycles.
|
||||
*
|
||||
* @param ts High resolution timer value.
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*
|
||||
* @see pj_get_timestamp_freq().
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_get_timestamp(pj_timestamp *ts);
|
||||
|
||||
/**
|
||||
* Get high resolution timer frequency, in cycles per second.
|
||||
*
|
||||
* @param freq Timer frequency, in cycles per second.
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_get_timestamp_freq(pj_timestamp *freq);
|
||||
|
||||
/**
|
||||
* Calculate the elapsed time, and store it in pj_time_val.
|
||||
* This function calculates the elapsed time using highest precision
|
||||
* calculation that is available for current platform, considering
|
||||
* whether floating point or 64-bit precision arithmetic is available.
|
||||
* For maximum portability, application should prefer to use this function
|
||||
* rather than calculating the elapsed time by itself.
|
||||
*
|
||||
* @param start The starting timestamp.
|
||||
* @param stop The end timestamp.
|
||||
*
|
||||
* @return Elapsed time as #pj_time_val.
|
||||
*
|
||||
* @see pj_elapsed_usec(), pj_elapsed_cycle(), pj_elapsed_nanosec()
|
||||
*/
|
||||
PJ_DECL(pj_time_val) pj_elapsed_time( const pj_timestamp *start,
|
||||
const pj_timestamp *stop );
|
||||
|
||||
/**
|
||||
* Calculate the elapsed time in 32-bit microseconds.
|
||||
* This function calculates the elapsed time using highest precision
|
||||
* calculation that is available for current platform, considering
|
||||
* whether floating point or 64-bit precision arithmetic is available.
|
||||
* For maximum portability, application should prefer to use this function
|
||||
* rather than calculating the elapsed time by itself.
|
||||
*
|
||||
* @param start The starting timestamp.
|
||||
* @param stop The end timestamp.
|
||||
*
|
||||
* @return Elapsed time in microsecond.
|
||||
*
|
||||
* @see pj_elapsed_time(), pj_elapsed_cycle(), pj_elapsed_nanosec()
|
||||
*/
|
||||
PJ_DECL(pj_uint32_t) pj_elapsed_usec( const pj_timestamp *start,
|
||||
const pj_timestamp *stop );
|
||||
|
||||
/**
|
||||
* Calculate the elapsed time in 32-bit nanoseconds.
|
||||
* This function calculates the elapsed time using highest precision
|
||||
* calculation that is available for current platform, considering
|
||||
* whether floating point or 64-bit precision arithmetic is available.
|
||||
* For maximum portability, application should prefer to use this function
|
||||
* rather than calculating the elapsed time by itself.
|
||||
*
|
||||
* @param start The starting timestamp.
|
||||
* @param stop The end timestamp.
|
||||
*
|
||||
* @return Elapsed time in nanoseconds.
|
||||
*
|
||||
* @see pj_elapsed_time(), pj_elapsed_cycle(), pj_elapsed_usec()
|
||||
*/
|
||||
PJ_DECL(pj_uint32_t) pj_elapsed_nanosec( const pj_timestamp *start,
|
||||
const pj_timestamp *stop );
|
||||
|
||||
/**
|
||||
* Calculate the elapsed time in 32-bit cycles.
|
||||
* This function calculates the elapsed time using highest precision
|
||||
* calculation that is available for current platform, considering
|
||||
* whether floating point or 64-bit precision arithmetic is available.
|
||||
* For maximum portability, application should prefer to use this function
|
||||
* rather than calculating the elapsed time by itself.
|
||||
*
|
||||
* @param start The starting timestamp.
|
||||
* @param stop The end timestamp.
|
||||
*
|
||||
* @return Elapsed time in cycles.
|
||||
*
|
||||
* @see pj_elapsed_usec(), pj_elapsed_time(), pj_elapsed_nanosec()
|
||||
*/
|
||||
PJ_DECL(pj_uint32_t) pj_elapsed_cycle( const pj_timestamp *start,
|
||||
const pj_timestamp *stop );
|
||||
|
||||
|
||||
#endif /* PJ_HAS_HIGH_RES_TIMER */
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* Internal PJLIB function to initialize the threading subsystem.
|
||||
* @return PJ_SUCCESS or the appropriate error code.
|
||||
*/
|
||||
pj_status_t pj_thread_init(void);
|
||||
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_OS_H__ */
|
||||
|
|
@ -0,0 +1,570 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/pool.h 10 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_POOL_H__
|
||||
#define __PJ_POOL_H__
|
||||
|
||||
/**
|
||||
* @file pool.h
|
||||
* @brief Memory Pool.
|
||||
*/
|
||||
|
||||
#include <pj/list.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_POOL_GROUP Memory Pool Management
|
||||
* @ingroup PJ
|
||||
* @brief
|
||||
* Memory pool management provides API to allocate and deallocate memory from
|
||||
* memory pool and to manage and establish policy for pool creation and
|
||||
* destruction in pool factory.
|
||||
*
|
||||
* \section PJ_POOL_FACTORY_SEC Pool Factory
|
||||
* See: \ref PJ_POOL_FACTORY "Pool Factory"
|
||||
*
|
||||
* A memory pool must be created through a factory. A factory not only provides
|
||||
* generic interface functions to create and release pool, but also provides
|
||||
* strategy to manage the life time of pools. One sample implementation,
|
||||
* \a pj_caching_pool, can be set to keep the pools released by application for
|
||||
* future use as long as the total memory is below the limit.
|
||||
*
|
||||
* The pool factory interface declared in PJLIB is designed to be extensible.
|
||||
* Application can define its own strategy by creating it's own pool factory
|
||||
* implementation, and this strategy can be used even by existing library
|
||||
* without recompilation.
|
||||
*
|
||||
*
|
||||
* \section PJ_POOL_POLICY_SEC Pool Factory Policy
|
||||
* See: \ref PJ_POOL_FACTORY "Pool Factory Policy"
|
||||
*
|
||||
* A pool factory only defines functions to create and release pool and how
|
||||
* to manage pools, but the rest of the functionalities are controlled by
|
||||
* policy. A pool policy defines:
|
||||
* - how memory block is allocated and deallocated (the default implementation
|
||||
* allocates and deallocate memory by calling malloc() and free()).
|
||||
* - callback to be called when memory allocation inside a pool fails (the
|
||||
* default implementation will throw PJ_NO_MEMORY_EXCEPTION exception).
|
||||
* - concurrency when creating and releasing pool from/to the factory.
|
||||
*
|
||||
* A pool factory can be given different policy during creation to make
|
||||
* it behave differently. For example, caching pool factory can be configured
|
||||
* to allocate and deallocate from a static/contiguous/preallocated memory
|
||||
* instead of using malloc()/free().
|
||||
*
|
||||
* What strategy/factory and what policy to use is not defined by PJLIB, but
|
||||
* instead is left to application to make use whichever is most efficient for
|
||||
* itself.
|
||||
*
|
||||
*
|
||||
* \section PJ_POOL_POOL_SEC The Pool
|
||||
* See: \ref PJ_POOL "Pool"
|
||||
*
|
||||
* The memory pool is an opaque object created by pool factory.
|
||||
* Application uses this object to request a memory chunk, by calling
|
||||
* #pj_pool_alloc or #pj_pool_calloc. When the application has finished using
|
||||
* the pool, it must call #pj_pool_release to free all the chunks previously
|
||||
* allocated and release the pool back to the factory.
|
||||
*
|
||||
* \section PJ_POOL_THREADING_SEC More on Threading Policies:
|
||||
* - By design, memory allocation from a pool is not thread safe. We assumed
|
||||
* that a pool will be owned by an object, and thread safety should be
|
||||
* handled by that object. Thus these functions are not thread safe:
|
||||
* - #pj_pool_alloc,
|
||||
* - #pj_pool_calloc,
|
||||
* - and other pool statistic functions.
|
||||
* - Threading in the pool factory is decided by the policy set for the
|
||||
* factory when it was created.
|
||||
*
|
||||
* \section PJ_POOL_EXAMPLES_SEC Examples
|
||||
*
|
||||
* For some sample codes on how to use the pool, please see:
|
||||
* - @ref page_pjlib_pool_test
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup PJ_POOL Memory Pool.
|
||||
* @ingroup PJ_POOL_GROUP
|
||||
* @brief
|
||||
* A memory pool is initialized with an initial amount of memory, which is
|
||||
* called a block. Pool can be configured to dynamically allocate more memory
|
||||
* blocks when it runs out of memory. Subsequent memory allocations by user
|
||||
* will use up portions of these block.
|
||||
* The pool doesn't keep track of individual memory allocations
|
||||
* by user, and the user doesn't have to free these indidual allocations. This
|
||||
* makes memory allocation simple and very fast. All the memory allocated from
|
||||
* the pool will be destroyed when the pool itself is destroyed.
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* The type for function to receive callback from the pool when it is unable
|
||||
* to allocate memory. The elegant way to handle this condition is to throw
|
||||
* exception, and this is what is expected by most of this library
|
||||
* components.
|
||||
*/
|
||||
typedef void pj_pool_callback(pj_pool_t *pool, pj_size_t size);
|
||||
|
||||
/**
|
||||
* This class, which is used internally by the pool, describes a single
|
||||
* block of memory from which user memory allocations will be allocated from.
|
||||
*/
|
||||
typedef struct pj_pool_block
|
||||
{
|
||||
PJ_DECL_LIST_MEMBER(struct pj_pool_block) /**< List's prev and next. */
|
||||
unsigned char *buf; /**< Start of buffer. */
|
||||
unsigned char *cur; /**< Current alloc ptr. */
|
||||
unsigned char *end; /**< End of buffer. */
|
||||
} pj_pool_block;
|
||||
|
||||
|
||||
/**
|
||||
* This structure describes the memory pool. Only implementors of pool factory
|
||||
* need to care about the contents of this structure.
|
||||
*/
|
||||
struct pj_pool_t
|
||||
{
|
||||
PJ_DECL_LIST_MEMBER(struct pj_pool_t)
|
||||
|
||||
/** Pool name */
|
||||
char obj_name[PJ_MAX_OBJ_NAME];
|
||||
|
||||
/** Pool factory. */
|
||||
pj_pool_factory *factory;
|
||||
|
||||
/** Current capacity allocated by the pool. */
|
||||
pj_size_t capacity;
|
||||
|
||||
/** Number of memory used/allocated. */
|
||||
pj_size_t used_size;
|
||||
|
||||
/** Size of memory block to be allocated when the pool runs out of memory */
|
||||
pj_size_t increment_size;
|
||||
|
||||
/** List of memory blocks allcoated by the pool. */
|
||||
pj_pool_block block_list;
|
||||
|
||||
/** The callback to be called when the pool is unable to allocate memory. */
|
||||
pj_pool_callback *callback;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Guidance on how much memory required for initial pool administrative data.
|
||||
*/
|
||||
#define PJ_POOL_SIZE (sizeof(struct pj_pool_t))
|
||||
|
||||
/**
|
||||
* Pool memory alignment (must be power of 2).
|
||||
*/
|
||||
#ifndef PJ_POOL_ALIGNMENT
|
||||
# define PJ_POOL_ALIGNMENT 4
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Create a new pool from the pool factory. This wrapper will call create_pool
|
||||
* member of the pool factory.
|
||||
*
|
||||
* @param factory The pool factory.
|
||||
* @param name The name to be assigned to the pool. The name should
|
||||
* not be longer than PJ_MAX_OBJ_NAME (32 chars), or
|
||||
* otherwise it will be truncated.
|
||||
* @param initial_size The size of initial memory blocks taken by the pool.
|
||||
* Note that the pool will take 68+20 bytes for
|
||||
* administrative area from this block.
|
||||
* @param increment_size the size of each additional blocks to be allocated
|
||||
* when the pool is running out of memory. If user
|
||||
* requests memory which is larger than this size, then
|
||||
* an error occurs.
|
||||
* Note that each time a pool allocates additional block,
|
||||
* it needs PJ_POOL_SIZE more to store some
|
||||
* administrative info.
|
||||
* @param callback Callback to be called when error occurs in the pool.
|
||||
* If this value is NULL, then the callback from pool
|
||||
* factory policy will be used.
|
||||
* Note that when an error occurs during pool creation,
|
||||
* the callback itself is not called. Instead, NULL
|
||||
* will be returned.
|
||||
*
|
||||
* @return The memory pool, or NULL.
|
||||
*/
|
||||
PJ_IDECL(pj_pool_t*) pj_pool_create(pj_pool_factory *factory,
|
||||
const char *name,
|
||||
pj_size_t initial_size,
|
||||
pj_size_t increment_size,
|
||||
pj_pool_callback *callback);
|
||||
|
||||
/**
|
||||
* Release the pool back to pool factory.
|
||||
*
|
||||
* @param pool Memory pool.
|
||||
*/
|
||||
PJ_IDECL(void) pj_pool_release( pj_pool_t *pool );
|
||||
|
||||
/**
|
||||
* Get pool object name.
|
||||
*
|
||||
* @param pool the pool.
|
||||
*
|
||||
* @return pool name as NULL terminated string.
|
||||
*/
|
||||
PJ_IDECL(const char *) pj_pool_getobjname( const pj_pool_t *pool );
|
||||
|
||||
/**
|
||||
* Reset the pool to its state when it was initialized.
|
||||
* This means that if additional blocks have been allocated during runtime,
|
||||
* then they will be freed. Only the original block allocated during
|
||||
* initialization is retained. This function will also reset the internal
|
||||
* counters, such as pool capacity and used size.
|
||||
*
|
||||
* @param pool the pool.
|
||||
*/
|
||||
PJ_DECL(void) pj_pool_reset( pj_pool_t *pool );
|
||||
|
||||
|
||||
/**
|
||||
* Get the pool capacity, that is, the system storage that have been allocated
|
||||
* by the pool, and have been used/will be used to allocate user requests.
|
||||
* There's no guarantee that the returned value represent a single
|
||||
* contiguous block, because the capacity may be spread in several blocks.
|
||||
*
|
||||
* @param pool the pool.
|
||||
*
|
||||
* @return the capacity.
|
||||
*/
|
||||
PJ_IDECL(pj_size_t) pj_pool_get_capacity( pj_pool_t *pool );
|
||||
|
||||
/**
|
||||
* Get the total size of user allocation request.
|
||||
*
|
||||
* @param pool the pool.
|
||||
*
|
||||
* @return the total size.
|
||||
*/
|
||||
PJ_IDECL(pj_size_t) pj_pool_get_used_size( pj_pool_t *pool );
|
||||
|
||||
/**
|
||||
* Allocate storage with the specified size from the pool.
|
||||
* If there's no storage available in the pool, then the pool can allocate more
|
||||
* blocks if the increment size is larger than the requested size.
|
||||
*
|
||||
* @param pool the pool.
|
||||
* @param size the requested size.
|
||||
*
|
||||
* @return pointer to the allocated memory.
|
||||
*/
|
||||
PJ_IDECL(void*) pj_pool_alloc( pj_pool_t *pool, pj_size_t size);
|
||||
|
||||
/**
|
||||
* Allocate storage from the pool, and initialize it to zero.
|
||||
* This function behaves like pj_pool_alloc(), except that the storage will
|
||||
* be initialized to zero.
|
||||
*
|
||||
* @param pool the pool.
|
||||
* @param count the number of elements in the array.
|
||||
* @param elem the size of individual element.
|
||||
*
|
||||
* @return pointer to the allocated memory.
|
||||
*/
|
||||
PJ_IDECL(void*) pj_pool_calloc( pj_pool_t *pool, pj_size_t count,
|
||||
pj_size_t elem);
|
||||
|
||||
|
||||
/**
|
||||
* @def pj_pool_zalloc(pj_pool_t *pool, pj_size_t size)
|
||||
* Allocate storage from the pool and initialize it to zero.
|
||||
*
|
||||
* @param pool The pool.
|
||||
* @param size The size to be allocated.
|
||||
*
|
||||
* @return Pointer to the allocated memory.
|
||||
*/
|
||||
#define pj_pool_zalloc(pool, size) pj_pool_calloc(pool, 1, size)
|
||||
|
||||
|
||||
/**
|
||||
* @} // PJ_POOL
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* @defgroup PJ_POOL_FACTORY Pool Factory and Policy.
|
||||
* @ingroup PJ_POOL_GROUP
|
||||
* @brief
|
||||
* Pool factory declares an interface to create and destroy pool. There may
|
||||
* be several strategies for pool creation, and these strategies should
|
||||
* implement the interface defined by pool factory.
|
||||
*
|
||||
* \section PJ_POOL_FACTORY_ITF Pool Factory Interface
|
||||
* The pool factory defines the following interface:
|
||||
* - \a policy: the memory pool factory policy.
|
||||
* - \a create_pool(): create a new memory pool.
|
||||
* - \a release_pool(): release memory pool back to factory.
|
||||
*
|
||||
* \section PJ_POOL_FACTORY_POL Pool Factory Policy.
|
||||
* The pool factory policy controls the behaviour of memory factories, and
|
||||
* defines the following interface:
|
||||
* - \a block_alloc(): allocate memory block from backend memory mgmt/system.
|
||||
* - \a block_free(): free memory block back to backend memory mgmt/system.
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* We unfortunately don't have support for factory policy options as now,
|
||||
so we keep this commented at the moment.
|
||||
enum PJ_POOL_FACTORY_OPTION
|
||||
{
|
||||
PJ_POOL_FACTORY_SERIALIZE = 1
|
||||
};
|
||||
*/
|
||||
|
||||
/**
|
||||
* This structure declares pool factory interface.
|
||||
*/
|
||||
typedef struct pj_pool_factory_policy
|
||||
{
|
||||
/**
|
||||
* Allocate memory block (for use by pool). This function is called
|
||||
* by memory pool to allocate memory block.
|
||||
*
|
||||
* @param factory Pool factory.
|
||||
* @param size The size of memory block to allocate.
|
||||
*
|
||||
* @return Memory block.
|
||||
*/
|
||||
void* (*block_alloc)(pj_pool_factory *factory, pj_size_t size);
|
||||
|
||||
/**
|
||||
* Free memory block.
|
||||
*
|
||||
* @param factory Pool factory.
|
||||
* @param mem Memory block previously allocated by block_alloc().
|
||||
* @param size The size of memory block.
|
||||
*/
|
||||
void (*block_free)(pj_pool_factory *factory, void *mem, pj_size_t size);
|
||||
|
||||
/**
|
||||
* Default callback to be called when memory allocation fails.
|
||||
*/
|
||||
pj_pool_callback *callback;
|
||||
|
||||
/**
|
||||
* Option flags.
|
||||
*/
|
||||
unsigned flags;
|
||||
|
||||
} pj_pool_factory_policy;
|
||||
|
||||
/**
|
||||
* This constant denotes the exception number that will be thrown by default
|
||||
* memory factory policy when memory allocation fails.
|
||||
*/
|
||||
extern int PJ_NO_MEMORY_EXCEPTION;
|
||||
|
||||
/**
|
||||
* This global variable points to default memory pool factory policy.
|
||||
* The behaviour of the default policy is:
|
||||
* - block allocation and deallocation use malloc() and free().
|
||||
* - callback will raise PJ_NO_MEMORY_EXCEPTION exception.
|
||||
* - access to pool factory is not serialized (i.e. not thread safe).
|
||||
*/
|
||||
extern pj_pool_factory_policy pj_pool_factory_default_policy;
|
||||
|
||||
/**
|
||||
* This structure contains the declaration for pool factory interface.
|
||||
*/
|
||||
struct pj_pool_factory
|
||||
{
|
||||
/**
|
||||
* Memory pool policy.
|
||||
*/
|
||||
pj_pool_factory_policy policy;
|
||||
|
||||
/**
|
||||
* Create a new pool from the pool factory.
|
||||
*
|
||||
* @param factory The pool factory.
|
||||
* @param name the name to be assigned to the pool. The name should
|
||||
* not be longer than PJ_MAX_OBJ_NAME (32 chars), or
|
||||
* otherwise it will be truncated.
|
||||
* @param initial_size the size of initial memory blocks taken by the pool.
|
||||
* Note that the pool will take 68+20 bytes for
|
||||
* administrative area from this block.
|
||||
* @param increment_size the size of each additional blocks to be allocated
|
||||
* when the pool is running out of memory. If user
|
||||
* requests memory which is larger than this size, then
|
||||
* an error occurs.
|
||||
* Note that each time a pool allocates additional block,
|
||||
* it needs 20 bytes (equal to sizeof(pj_pool_block)) to
|
||||
* store some administrative info.
|
||||
* @param callback Cllback to be called when error occurs in the pool.
|
||||
* Note that when an error occurs during pool creation,
|
||||
* the callback itself is not called. Instead, NULL
|
||||
* will be returned.
|
||||
*
|
||||
* @return the memory pool, or NULL.
|
||||
*/
|
||||
pj_pool_t* (*create_pool)( pj_pool_factory *factory,
|
||||
const char *name,
|
||||
pj_size_t initial_size,
|
||||
pj_size_t increment_size,
|
||||
pj_pool_callback *callback);
|
||||
|
||||
/**
|
||||
* Release the pool to the pool factory.
|
||||
*
|
||||
* @param factory The pool factory.
|
||||
* @param pool The pool to be released.
|
||||
*/
|
||||
void (*release_pool)( pj_pool_factory *factory, pj_pool_t *pool );
|
||||
|
||||
/**
|
||||
* Dump pool status to log.
|
||||
*
|
||||
* @param factory The pool factory.
|
||||
*/
|
||||
void (*dump_status)( pj_pool_factory *factory, pj_bool_t detail );
|
||||
};
|
||||
|
||||
/**
|
||||
* This function is intended to be used by pool factory implementors.
|
||||
* @param factory Pool factory.
|
||||
* @param name Pool name.
|
||||
* @param initial_size Initial size.
|
||||
* @param increment_size Increment size.
|
||||
* @param callback Callback.
|
||||
* @return The pool object, or NULL.
|
||||
*/
|
||||
PJ_DECL(pj_pool_t*) pj_pool_create_int( pj_pool_factory *factory,
|
||||
const char *name,
|
||||
pj_size_t initial_size,
|
||||
pj_size_t increment_size,
|
||||
pj_pool_callback *callback);
|
||||
|
||||
/**
|
||||
* This function is intended to be used by pool factory implementors.
|
||||
* @param pool The pool.
|
||||
* @param name Pool name.
|
||||
* @param increment_size Increment size.
|
||||
* @param callback Callback function.
|
||||
*/
|
||||
PJ_DECL(void) pj_pool_init_int( pj_pool_t *pool,
|
||||
const char *name,
|
||||
pj_size_t increment_size,
|
||||
pj_pool_callback *callback);
|
||||
|
||||
/**
|
||||
* This function is intended to be used by pool factory implementors.
|
||||
* @param pool The memory pool.
|
||||
*/
|
||||
PJ_DECL(void) pj_pool_destroy_int( pj_pool_t *pool );
|
||||
|
||||
|
||||
/**
|
||||
* @} // PJ_POOL_FACTORY
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* @defgroup PJ_CACHING_POOL Caching Pool Factory.
|
||||
* @ingroup PJ_POOL_GROUP
|
||||
* @brief
|
||||
* Caching pool is one sample implementation of pool factory where the
|
||||
* factory can reuse memory to create a pool. Application defines what the
|
||||
* maximum memory the factory can hold, and when a pool is released the
|
||||
* factory decides whether to destroy the pool or to keep it for future use.
|
||||
* If the total amount of memory in the internal cache is still within the
|
||||
* limit, the factory will keep the pool in the internal cache, otherwise the
|
||||
* pool will be destroyed, thus releasing the memory back to the system.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Number of unique sizes, to be used as index to the free list.
|
||||
* Each pool in the free list is organized by it's size.
|
||||
*/
|
||||
#define PJ_CACHING_POOL_ARRAY_SIZE 16
|
||||
|
||||
/**
|
||||
* Declaration for caching pool. Application doesn't normally need to
|
||||
* care about the contents of this struct, it is only provided here because
|
||||
* application need to define an instance of this struct (we can not allocate
|
||||
* the struct from a pool since there is no pool factory yet!).
|
||||
*/
|
||||
struct pj_caching_pool
|
||||
{
|
||||
/** Pool factory interface, must be declared first. */
|
||||
pj_pool_factory factory;
|
||||
|
||||
/** Current factory's capacity, i.e. number of bytes that are allocated
|
||||
* and available for application in this factory. The factory's
|
||||
* capacity represents the size of all pools kept by this factory
|
||||
* in it's free list, which will be returned to application when it
|
||||
* requests to create a new pool.
|
||||
*/
|
||||
pj_size_t capacity;
|
||||
|
||||
/** Maximum size that can be held by this factory. Once the capacity
|
||||
* has exceeded @a max_capacity, further #pj_pool_release() will
|
||||
* flush the pool. If the capacity is still below the @a max_capacity,
|
||||
* #pj_pool_release() will save the pool to the factory's free list.
|
||||
*/
|
||||
pj_size_t max_capacity;
|
||||
|
||||
/**
|
||||
* Number of pools currently held by applications. This number gets
|
||||
* incremented everytime #pj_pool_create() is called, and gets
|
||||
* decremented when #pj_pool_release() is called.
|
||||
*/
|
||||
pj_size_t used_count;
|
||||
|
||||
/**
|
||||
* Lists of pools in the cache, indexed by pool size.
|
||||
*/
|
||||
pj_list free_list[PJ_CACHING_POOL_ARRAY_SIZE];
|
||||
|
||||
/**
|
||||
* List of pools currently allocated by applications.
|
||||
*/
|
||||
pj_list used_list;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Initialize caching pool.
|
||||
*
|
||||
* @param ch_pool The caching pool factory to be initialized.
|
||||
* @param policy Pool factory policy.
|
||||
* @param max_capacity The total capacity to be retained in the cache. When
|
||||
* the pool is returned to the cache, it will be kept in
|
||||
* recycling list if the total capacity of pools in this
|
||||
* list plus the capacity of the pool is still below this
|
||||
* value.
|
||||
*/
|
||||
PJ_DECL(void) pj_caching_pool_init( pj_caching_pool *ch_pool,
|
||||
const pj_pool_factory_policy *policy,
|
||||
pj_size_t max_capacity);
|
||||
|
||||
|
||||
/**
|
||||
* Destroy caching pool, and release all the pools in the recycling list.
|
||||
*
|
||||
* @param ch_pool The caching pool.
|
||||
*/
|
||||
PJ_DECL(void) pj_caching_pool_destroy( pj_caching_pool *ch_pool );
|
||||
|
||||
/**
|
||||
* @} // PJ_CACHING_POOL
|
||||
*/
|
||||
|
||||
# if PJ_FUNCTIONS_ARE_INLINED
|
||||
# include "pool_i.h"
|
||||
# endif
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_POOL_H__ */
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/pool_i.h 6 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
|
||||
#include <pj/string.h>
|
||||
|
||||
PJ_DECL(void*) pj_pool_allocate_find(pj_pool_t *pool, unsigned size);
|
||||
|
||||
PJ_IDEF(pj_size_t) pj_pool_get_capacity( pj_pool_t *pool )
|
||||
{
|
||||
return pool->capacity;
|
||||
}
|
||||
|
||||
PJ_IDEF(pj_size_t) pj_pool_get_used_size( pj_pool_t *pool )
|
||||
{
|
||||
return pool->used_size;
|
||||
}
|
||||
|
||||
PJ_IDEF(void*) pj_pool_alloc_from_block( pj_pool_t *pool,
|
||||
pj_pool_block *block, pj_size_t size )
|
||||
{
|
||||
/* The operation below is valid for size==0.
|
||||
* When size==0, the function will return the pointer to the pool
|
||||
* memory address, but no memory will be allocated.
|
||||
*/
|
||||
if (size & (PJ_POOL_ALIGNMENT-1)) {
|
||||
size &= ~(PJ_POOL_ALIGNMENT-1);
|
||||
size += PJ_POOL_ALIGNMENT;
|
||||
}
|
||||
if ((unsigned)(block->end - block->cur) >= size) {
|
||||
void *ptr = block->cur;
|
||||
block->cur += size;
|
||||
pool->used_size += size;
|
||||
return ptr;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PJ_IDEF(void*) pj_pool_alloc( pj_pool_t *pool, pj_size_t size)
|
||||
{
|
||||
pj_pool_block *block = pool->block_list.next;
|
||||
void *ptr = pj_pool_alloc_from_block(pool, block, size);
|
||||
if (!ptr)
|
||||
ptr = pj_pool_allocate_find(pool, size);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
PJ_IDEF(void*) pj_pool_calloc( pj_pool_t *pool, pj_size_t count, pj_size_t size)
|
||||
{
|
||||
void *buf = pj_pool_alloc( pool, size*count);
|
||||
if (buf)
|
||||
pj_memset(buf, 0, size * count);
|
||||
return buf;
|
||||
}
|
||||
|
||||
PJ_IDEF(const char *) pj_pool_getobjname( const pj_pool_t *pool )
|
||||
{
|
||||
return pool->obj_name;
|
||||
}
|
||||
|
||||
PJ_IDEF(pj_pool_t*) pj_pool_create( pj_pool_factory *f,
|
||||
const char *name,
|
||||
pj_size_t initial_size,
|
||||
pj_size_t increment_size,
|
||||
pj_pool_callback *callback)
|
||||
{
|
||||
return (*f->create_pool)(f, name, initial_size, increment_size, callback);
|
||||
}
|
||||
|
||||
PJ_IDEF(void) pj_pool_release( pj_pool_t *pool )
|
||||
{
|
||||
(*pool->factory->release_pool)(pool->factory, pool);
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/rand.h 3 10/14/05 12:26a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/include/pj/rand.h $
|
||||
*
|
||||
* 3 10/14/05 12:26a Bennylp
|
||||
* Finished error code framework, some fixes in ioqueue, etc. Pretty
|
||||
* major.
|
||||
*
|
||||
* 2 9/17/05 10:37a Bennylp
|
||||
* Major reorganization towards version 0.3.
|
||||
*
|
||||
* 1 9/15/05 8:40p Bennylp
|
||||
* Created.
|
||||
*/
|
||||
#ifndef __PJ_RAND_H__
|
||||
#define __PJ_RAND_H__
|
||||
|
||||
/**
|
||||
* @file rand.h
|
||||
* @brief Random Number Generator.
|
||||
*/
|
||||
|
||||
#include <pj/config.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
|
||||
/**
|
||||
* @defgroup PJ_RAND Random Number Generator
|
||||
* @ingroup PJ_MISC
|
||||
* @{
|
||||
* This module contains functions for generating random numbers.
|
||||
* This abstraction is needed not only because not all platforms have
|
||||
* \a rand() and \a srand(), but also on some platforms \a rand()
|
||||
* only has 16-bit randomness, which is not good enough.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Put in seed to random number generator.
|
||||
*
|
||||
* @param seed Seed value.
|
||||
*/
|
||||
PJ_DECL(void) pj_srand(unsigned int seed);
|
||||
|
||||
|
||||
/**
|
||||
* Generate random integer with 32bit randomness.
|
||||
*
|
||||
* @return a random integer.
|
||||
*/
|
||||
PJ_DECL(int) pj_rand(void);
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
|
||||
#endif /* __PJ_RAND_H__ */
|
||||
|
|
@ -0,0 +1,193 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/rbtree.h 5 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_RBTREE_H__
|
||||
#define __PJ_RBTREE_H__
|
||||
|
||||
/**
|
||||
* @file rbtree.h
|
||||
* @brief Red/Black Tree
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_RBTREE Red/Black Balanced Tree
|
||||
* @ingroup PJ_DS
|
||||
* @brief
|
||||
* Red/Black tree is the variant of balanced tree, where the search, insert,
|
||||
* and delete operation is \b guaranteed to take at most \a O( lg(n) ).
|
||||
* @{
|
||||
*/
|
||||
/**
|
||||
* Color type for Red-Black tree.
|
||||
*/
|
||||
typedef enum pj_rbcolor_t
|
||||
{
|
||||
PJ_RBCOLOR_BLACK,
|
||||
PJ_RBCOLOR_RED
|
||||
} pj_rbcolor_t;
|
||||
|
||||
/**
|
||||
* The type of the node of the R/B Tree.
|
||||
*/
|
||||
typedef struct pj_rbtree_node
|
||||
{
|
||||
/** Pointers to the node's parent, and left and right siblings. */
|
||||
struct pj_rbtree_node *parent, *left, *right;
|
||||
|
||||
/** Key associated with the node. */
|
||||
const void *key;
|
||||
|
||||
/** User data associated with the node. */
|
||||
void *user_data;
|
||||
|
||||
/** The R/B Tree node color. */
|
||||
pj_rbcolor_t color;
|
||||
|
||||
} pj_rbtree_node;
|
||||
|
||||
|
||||
/**
|
||||
* The type of function use to compare key value of tree node.
|
||||
* @return
|
||||
* 0 if the keys are equal
|
||||
* <0 if key1 is lower than key2
|
||||
* >0 if key1 is greater than key2.
|
||||
*/
|
||||
typedef int pj_rbtree_comp(const void *key1, const void *key2);
|
||||
|
||||
|
||||
/**
|
||||
* Declaration of a red-black tree. All elements in the tree must have UNIQUE
|
||||
* key.
|
||||
* A red black tree always maintains the balance of the tree, so that the
|
||||
* tree height will not be greater than lg(N). Insert, search, and delete
|
||||
* operation will take lg(N) on the worst case. But for insert and delete,
|
||||
* there is additional time needed to maintain the balance of the tree.
|
||||
*/
|
||||
typedef struct pj_rbtree
|
||||
{
|
||||
pj_rbtree_node null_node; /**< Constant to indicate NULL node. */
|
||||
pj_rbtree_node *null; /**< Constant to indicate NULL node. */
|
||||
pj_rbtree_node *root; /**< Root tree node. */
|
||||
unsigned size; /**< Number of elements in the tree. */
|
||||
pj_rbtree_comp *comp; /**< Key comparison function. */
|
||||
} pj_rbtree;
|
||||
|
||||
|
||||
/**
|
||||
* Guidance on how much memory required for each of the node.
|
||||
*/
|
||||
#define PJ_RBTREE_NODE_SIZE (sizeof(pj_rbtree_node))
|
||||
|
||||
|
||||
/**
|
||||
* Guidance on memory required for the tree.
|
||||
*/
|
||||
#define PJ_RBTREE_SIZE (sizeof(pj_rbtree))
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the tree.
|
||||
* @param tree the tree to be initialized.
|
||||
* @param comp key comparison function to be used for this tree.
|
||||
*/
|
||||
PJ_DECL(void) pj_rbtree_init( pj_rbtree *tree, pj_rbtree_comp *comp);
|
||||
|
||||
/**
|
||||
* Get the first element in the tree.
|
||||
* The first element always has the least value for the key, according to
|
||||
* the comparison function.
|
||||
* @param tree the tree.
|
||||
* @return the tree node, or NULL if the tree has no element.
|
||||
*/
|
||||
PJ_DECL(pj_rbtree_node*) pj_rbtree_first( pj_rbtree *tree );
|
||||
|
||||
/**
|
||||
* Get the last element in the tree.
|
||||
* The last element always has the greatest key value, according to the
|
||||
* comparison function defined for the tree.
|
||||
* @param tree the tree.
|
||||
* @return the tree node, or NULL if the tree has no element.
|
||||
*/
|
||||
PJ_DECL(pj_rbtree_node*) pj_rbtree_last( pj_rbtree *tree );
|
||||
|
||||
/**
|
||||
* Get the successive element for the specified node.
|
||||
* The successive element is an element with greater key value.
|
||||
* @param tree the tree.
|
||||
* @param node the node.
|
||||
* @return the successive node, or NULL if the node has no successor.
|
||||
*/
|
||||
PJ_DECL(pj_rbtree_node*) pj_rbtree_next( pj_rbtree *tree,
|
||||
pj_rbtree_node *node );
|
||||
|
||||
/**
|
||||
* The the previous node for the specified node.
|
||||
* The previous node is an element with less key value.
|
||||
* @param tree the tree.
|
||||
* @param node the node.
|
||||
* @return the previous node, or NULL if the node has no previous node.
|
||||
*/
|
||||
PJ_DECL(pj_rbtree_node*) pj_rbtree_prev( pj_rbtree *tree,
|
||||
pj_rbtree_node *node );
|
||||
|
||||
/**
|
||||
* Insert a new node.
|
||||
* The node will be inserted at sorted location. The key of the node must
|
||||
* be UNIQUE, i.e. it hasn't existed in the tree.
|
||||
* @param tree the tree.
|
||||
* @param node the node to be inserted.
|
||||
* @return zero on success, or -1 if the key already exist.
|
||||
*/
|
||||
PJ_DECL(int) pj_rbtree_insert( pj_rbtree *tree,
|
||||
pj_rbtree_node *node );
|
||||
|
||||
/**
|
||||
* Find a node which has the specified key.
|
||||
* @param tree the tree.
|
||||
* @param key the key to search.
|
||||
* @return the tree node with the specified key, or NULL if the key can not
|
||||
* be found.
|
||||
*/
|
||||
PJ_DECL(pj_rbtree_node*) pj_rbtree_find( pj_rbtree *tree,
|
||||
const void *key );
|
||||
|
||||
/**
|
||||
* Erase a node from the tree.
|
||||
* @param tree the tree.
|
||||
* @param node the node to be erased.
|
||||
* @return the tree node itself.
|
||||
*/
|
||||
PJ_DECL(pj_rbtree_node*) pj_rbtree_erase( pj_rbtree *tree,
|
||||
pj_rbtree_node *node );
|
||||
|
||||
/**
|
||||
* Get the maximum tree height from the specified node.
|
||||
* @param tree the tree.
|
||||
* @param node the node, or NULL to get the root of the tree.
|
||||
* @return the maximum height, which should be at most lg(N)
|
||||
*/
|
||||
PJ_DECL(unsigned) pj_rbtree_max_height( pj_rbtree *tree,
|
||||
pj_rbtree_node *node );
|
||||
|
||||
/**
|
||||
* Get the minumum tree height from the specified node.
|
||||
* @param tree the tree.
|
||||
* @param node the node, or NULL to get the root of the tree.
|
||||
* @return the height
|
||||
*/
|
||||
PJ_DECL(unsigned) pj_rbtree_min_height( pj_rbtree *tree,
|
||||
pj_rbtree_node *node );
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_RBTREE_H__ */
|
||||
|
|
@ -0,0 +1,454 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/scanner.h 10 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_PARSER_H__
|
||||
#define __PJ_PARSER_H__
|
||||
|
||||
/**
|
||||
* @file scanner.h
|
||||
* @brief Text Scanning.
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_SCAN Text Scanning
|
||||
* @ingroup PJ_MISC
|
||||
* @brief
|
||||
* Text scanning utility.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup PJ_CHARSPEC Character Filter Specification
|
||||
* @ingroup PJ_SCAN
|
||||
* @brief
|
||||
* The type pj_char_spec is a specification of character set used in
|
||||
* scanner. Application can define multiple character specs, such as to
|
||||
* scan alpha numerics, numbers, tokens, etc.
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* This describes the type of individual character specification in
|
||||
* #pj_char_spec.
|
||||
*/
|
||||
typedef pj_uint8_t pj_char_spec_element_t;
|
||||
|
||||
/**
|
||||
* The character specification is implemented as array of boolean flags. Each
|
||||
* flag indicates the membership of the character in the spec. If the flag
|
||||
* at one position is non-zero, then the character at that position belongs
|
||||
* to the specification, and vice versa.
|
||||
*/
|
||||
typedef pj_char_spec_element_t pj_char_spec[256];
|
||||
// Note: it's got to be 256 (not 128) to cater for extended character in input.
|
||||
|
||||
/**
|
||||
* Initialize character spec.
|
||||
* @param cs the scanner character specification.
|
||||
*/
|
||||
PJ_DECL(void) pj_cs_init( pj_char_spec cs);
|
||||
|
||||
/**
|
||||
* Set the membership of the specified character to TRUE.
|
||||
* @param cs the scanner character specification.
|
||||
* @param c the character.
|
||||
*/
|
||||
PJ_DECL(void) pj_cs_set( pj_char_spec cs, int c);
|
||||
|
||||
/**
|
||||
* Add the characters in the specified range '[cstart, cend)' to the
|
||||
* specification (the last character itself ('cend') is not added).
|
||||
* @param cs the scanner character specification.
|
||||
* @param cstart the first character in the range.
|
||||
* @param cend the next character after the last character in the range.
|
||||
*/
|
||||
PJ_DECL(void) pj_cs_add_range( pj_char_spec cs, int cstart, int cend);
|
||||
|
||||
/**
|
||||
* Add alphabetic characters to the specification.
|
||||
* @param cs the scanner character specification.
|
||||
*/
|
||||
PJ_DECL(void) pj_cs_add_alpha( pj_char_spec cs);
|
||||
|
||||
/**
|
||||
* Add numeric characters to the specification.
|
||||
* @param cs the scanner character specification.
|
||||
*/
|
||||
PJ_DECL(void) pj_cs_add_num( pj_char_spec cs);
|
||||
|
||||
/**
|
||||
* Add the characters in the string to the specification.
|
||||
* @param cs the scanner character specification.
|
||||
* @param str the string.
|
||||
*/
|
||||
PJ_DECL(void) pj_cs_add_str( pj_char_spec cs, const char *str);
|
||||
|
||||
/**
|
||||
* Delete characters in the specified range from the specification.
|
||||
* @param cs the scanner character specification.
|
||||
* @param cstart the first character in the range.
|
||||
* @param cend the next character after the last character in the range.
|
||||
*/
|
||||
PJ_DECL(void) pj_cs_del_range( pj_char_spec cs, int cstart, int cend);
|
||||
|
||||
/**
|
||||
* Delete characters in the specified string from the specification.
|
||||
* @param cs the scanner character specification.
|
||||
* @param str the string.
|
||||
*/
|
||||
PJ_DECL(void) pj_cs_del_str( pj_char_spec cs, const char *str);
|
||||
|
||||
/**
|
||||
* Invert specification.
|
||||
* @param cs the scanner character specification.
|
||||
*/
|
||||
PJ_DECL(void) pj_cs_invert( pj_char_spec cs );
|
||||
|
||||
/**
|
||||
* Check whether the specified character belongs to the specification.
|
||||
* @param cs the scanner character specification.
|
||||
* @param c the character to check for matching.
|
||||
*/
|
||||
PJ_INLINE(int) pj_cs_match( const pj_char_spec cs, int c )
|
||||
{
|
||||
return cs[c];
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup PJ_SCANNER Text Scanner
|
||||
* @ingroup PJ_SCAN
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Flags for scanner.
|
||||
*/
|
||||
enum
|
||||
{
|
||||
/** This flags specifies that the scanner should automatically skip
|
||||
whitespaces
|
||||
*/
|
||||
PJ_SCAN_AUTOSKIP_WS = 1,
|
||||
|
||||
/** This flags specifies that the scanner should automatically skip
|
||||
SIP header continuation. This flag implies PJ_SCAN_AUTOSKIP_WS.
|
||||
*/
|
||||
PJ_SCAN_AUTOSKIP_WS_HEADER = 3,
|
||||
|
||||
/** Auto-skip new lines.
|
||||
*/
|
||||
PJ_SCAN_AUTOSKIP_NEWLINE = 4,
|
||||
};
|
||||
|
||||
|
||||
/* Forward decl. */
|
||||
struct pj_scanner;
|
||||
|
||||
|
||||
/**
|
||||
* The callback function type to be called by the scanner when it encounters
|
||||
* syntax error.
|
||||
* @param scanner The scanner instance that calls the callback .
|
||||
*/
|
||||
typedef void (*pj_syn_err_func_ptr)(struct pj_scanner *scanner);
|
||||
|
||||
|
||||
/**
|
||||
* The text scanner structure.
|
||||
*/
|
||||
typedef struct pj_scanner
|
||||
{
|
||||
char *begin; /**< Start of input buffer. */
|
||||
char *end; /**< End of input buffer. */
|
||||
char *curptr; /**< Current pointer. */
|
||||
int line; /**< Current line. */
|
||||
int col; /**< Current column. */
|
||||
int skip_ws; /**< Skip whitespace flag. */
|
||||
pj_syn_err_func_ptr callback; /**< Syntax error callback. */
|
||||
} pj_scanner;
|
||||
|
||||
|
||||
/**
|
||||
* This structure can be used by application to store the state of the parser,
|
||||
* so that the scanner state can be rollback to this state when necessary.
|
||||
*/
|
||||
typedef struct pj_scan_state
|
||||
{
|
||||
char *curptr; /**< Current scanner's pointer. */
|
||||
int line; /**< Current line. */
|
||||
int col; /**< Current column. */
|
||||
} pj_scan_state;
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the scanner. Note that the input string buffer must have
|
||||
* length at least buflen+1 because the scanner will NULL terminate the
|
||||
* string during initialization.
|
||||
*
|
||||
* @param scanner The scanner to be initialized.
|
||||
* @param bufstart The input buffer to scan. Note that buffer[buflen] will be
|
||||
* filled with NULL char until scanner is destroyed, so
|
||||
* the actual buffer length must be at least buflen+1.
|
||||
* @param buflen The length of the input buffer, which normally is
|
||||
* strlen(bufstart).
|
||||
* @param options Zero, or combination of PJ_SCAN_AUTOSKIP_WS or
|
||||
* PJ_SCAN_AUTOSKIP_WS_HEADER
|
||||
* @param callback Callback to be called when the scanner encounters syntax
|
||||
* error condition.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_init( pj_scanner *scanner, char *bufstart, int buflen,
|
||||
unsigned options,
|
||||
pj_syn_err_func_ptr callback );
|
||||
|
||||
|
||||
/**
|
||||
* Call this function when application has finished using the scanner.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_fini( pj_scanner *scanner );
|
||||
|
||||
|
||||
/**
|
||||
* Determine whether the EOF condition for the scanner has been met.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
*
|
||||
* @return Non-zero if scanner is EOF.
|
||||
*/
|
||||
PJ_INLINE(int) pj_scan_is_eof( const pj_scanner *scanner)
|
||||
{
|
||||
return scanner->curptr >= scanner->end;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Peek strings in current position according to parameter spec, and return
|
||||
* the strings in parameter out. The current scanner position will not be
|
||||
* moved. If the scanner is already in EOF state, syntax error callback will
|
||||
* be called thrown.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param spec The spec to match input string.
|
||||
* @param out String to store the result.
|
||||
*
|
||||
* @return the character right after the peek-ed position or zero if there's
|
||||
* no more characters.
|
||||
*/
|
||||
PJ_DECL(int) pj_scan_peek( pj_scanner *scanner,
|
||||
const pj_char_spec spec, pj_str_t *out);
|
||||
|
||||
|
||||
/**
|
||||
* Peek len characters in current position, and return them in out parameter.
|
||||
* Note that whitespaces or newlines will be returned as it is, regardless
|
||||
* of PJ_SCAN_AUTOSKIP_WS settings. If the character left is less than len,
|
||||
* syntax error callback will be called.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param len Length to peek.
|
||||
* @param out String to store the result.
|
||||
*
|
||||
* @return the character right after the peek-ed position or zero if there's
|
||||
* no more characters.
|
||||
*/
|
||||
PJ_DECL(int) pj_scan_peek_n( pj_scanner *scanner,
|
||||
pj_size_t len, pj_str_t *out);
|
||||
|
||||
|
||||
/**
|
||||
* Peek strings in current position until spec is matched, and return
|
||||
* the strings in parameter out. The current scanner position will not be
|
||||
* moved. If the scanner is already in EOF state, syntax error callback will
|
||||
* be called.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param spec The peeking will stop when the input match this spec.
|
||||
* @param out String to store the result.
|
||||
*
|
||||
* @return the character right after the peek-ed position.
|
||||
*/
|
||||
PJ_DECL(int) pj_scan_peek_until( pj_scanner *scanner,
|
||||
const pj_char_spec spec,
|
||||
pj_str_t *out);
|
||||
|
||||
|
||||
/**
|
||||
* Get characters from the buffer according to the spec, and return them
|
||||
* in out parameter. The scanner will attempt to get as many characters as
|
||||
* possible as long as the spec matches. If the first character doesn't
|
||||
* match the spec, or scanner is already in EOF when this function is called,
|
||||
* an exception will be thrown.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param spec The spec to match input string.
|
||||
* @param out String to store the result.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_get( pj_scanner *scanner,
|
||||
const pj_char_spec spec, pj_str_t *out);
|
||||
|
||||
|
||||
/**
|
||||
* Get characters between quotes. If current input doesn't match begin_quote,
|
||||
* syntax error will be thrown.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param begin_quote The character to begin the quote.
|
||||
* @param end_quote The character to end the quote.
|
||||
* @param out String to store the result.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_get_quote( pj_scanner *scanner,
|
||||
int begin_quote, int end_quote,
|
||||
pj_str_t *out);
|
||||
|
||||
/**
|
||||
* Get N characters from the scanner.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param N Number of characters to get.
|
||||
* @param out String to store the result.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_get_n( pj_scanner *scanner,
|
||||
unsigned N, pj_str_t *out);
|
||||
|
||||
|
||||
/**
|
||||
* Get one character from the scanner.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
*
|
||||
* @return (unknown)
|
||||
*/
|
||||
PJ_DECL(int) pj_scan_get_char( pj_scanner *scanner );
|
||||
|
||||
|
||||
/**
|
||||
* Get a newline from the scanner. A newline is defined as '\\n', or '\\r', or
|
||||
* "\\r\\n". If current input is not newline, syntax error will be thrown.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_get_newline( pj_scanner *scanner );
|
||||
|
||||
|
||||
/**
|
||||
* Get characters from the scanner and move the scanner position until the
|
||||
* current character matches the spec.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param spec Get until the input match this spec.
|
||||
* @param out String to store the result.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_get_until( pj_scanner *scanner,
|
||||
const pj_char_spec spec, pj_str_t *out);
|
||||
|
||||
|
||||
/**
|
||||
* Get characters from the scanner and move the scanner position until the
|
||||
* current character matches until_char.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param until_char Get until the input match this character.
|
||||
* @param out String to store the result.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_get_until_ch( pj_scanner *scanner,
|
||||
int until_char, pj_str_t *out);
|
||||
|
||||
|
||||
/**
|
||||
* Get characters from the scanner and move the scanner position until the
|
||||
* current character matches until_char.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param until_spec Get until the input match any of these characters.
|
||||
* @param out String to store the result.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_get_until_chr( pj_scanner *scanner,
|
||||
const char *until_spec, pj_str_t *out);
|
||||
|
||||
/**
|
||||
* Advance the scanner N characters, and skip whitespace
|
||||
* if necessary.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param N Number of characters to skip.
|
||||
* @param skip Flag to specify whether whitespace should be skipped
|
||||
* after skipping the characters.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_advance_n( pj_scanner *scanner,
|
||||
unsigned N, pj_bool_t skip);
|
||||
|
||||
|
||||
/**
|
||||
* Compare string in current position with the specified string.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param s The string to compare with.
|
||||
* @param len Length of the string to compare.
|
||||
*
|
||||
* @return zero, <0, or >0 (just like strcmp()).
|
||||
*/
|
||||
PJ_DECL(int) pj_scan_strcmp( pj_scanner *scanner, const char *s, int len);
|
||||
|
||||
|
||||
/**
|
||||
* Case-less string comparison of current position with the specified
|
||||
* string.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param s The string to compare with.
|
||||
* @param len Length of the string to compare with.
|
||||
*
|
||||
* @return zero, <0, or >0 (just like strcmp()).
|
||||
*/
|
||||
PJ_DECL(int) pj_scan_stricmp( pj_scanner *scanner, const char *s, int len);
|
||||
|
||||
|
||||
/**
|
||||
* Manually skip whitespaces according to flag that was specified when
|
||||
* the scanner was initialized.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_skip_whitespace( pj_scanner *scanner );
|
||||
|
||||
|
||||
/**
|
||||
* Save the full scanner state.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param state Variable to store scanner's state.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_save_state( pj_scanner *scanner, pj_scan_state *state);
|
||||
|
||||
|
||||
/**
|
||||
* Restore the full scanner state.
|
||||
* Note that this would not restore the string if application has modified
|
||||
* it. This will only restore the scanner scanning position.
|
||||
*
|
||||
* @param scanner The scanner.
|
||||
* @param state State of the scanner.
|
||||
*/
|
||||
PJ_DECL(void) pj_scan_restore_state( pj_scanner *scanner,
|
||||
pj_scan_state *state);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#if PJ_FUNCTIONS_ARE_INLINED
|
||||
# include "scanner_i.h"
|
||||
#endif
|
||||
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,677 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/sock.h 10 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_SOCK_H__
|
||||
#define __PJ_SOCK_H__
|
||||
|
||||
/**
|
||||
* @file sock.h
|
||||
* @brief Socket Abstraction.
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
|
||||
/**
|
||||
* @defgroup PJ_SOCK Socket Abstraction
|
||||
* @ingroup PJ_IO
|
||||
* @{
|
||||
*
|
||||
* The PJLIB socket abstraction layer is a thin and very portable abstraction
|
||||
* for socket API. It provides API similar to BSD socket API. The abstraction
|
||||
* is needed because BSD socket API is not always available on all platforms,
|
||||
* therefore it wouldn't be possible to create a trully portable network
|
||||
* programs unless we provide such abstraction.
|
||||
*
|
||||
* Applications can use this API directly in their application, just
|
||||
* as they would when using traditional BSD socket API, provided they
|
||||
* call #pj_init() first.
|
||||
*
|
||||
* \section pj_sock_examples_sec Examples
|
||||
*
|
||||
* For some examples on how to use the socket API, please see:
|
||||
*
|
||||
* - \ref page_pjlib_sock_test
|
||||
* - \ref page_pjlib_select_test
|
||||
* - \ref page_pjlib_sock_perf_test
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Supported address families.
|
||||
* APPLICATION MUST USE THESE VALUES INSTEAD OF NORMAL AF_*, BECAUSE
|
||||
* THE LIBRARY WILL DO TRANSLATION TO THE NATIVE VALUE.
|
||||
*/
|
||||
extern const pj_uint16_t PJ_AF_UNIX; /**< Unix domain socket. */
|
||||
#define PJ_AF_LOCAL PJ_AF_UNIX; /**< POSIX name for AF_UNIX */
|
||||
extern const pj_uint16_t PJ_AF_INET; /**< Internet IP protocol. */
|
||||
extern const pj_uint16_t PJ_AF_INET6; /**< IP version 6. */
|
||||
extern const pj_uint16_t PJ_AF_PACKET; /**< Packet family. */
|
||||
extern const pj_uint16_t PJ_AF_IRDA; /**< IRDA sockets. */
|
||||
|
||||
|
||||
/**
|
||||
* Supported types of sockets.
|
||||
* APPLICATION MUST USE THESE VALUES INSTEAD OF NORMAL SOCK_*, BECAUSE
|
||||
* THE LIBRARY WILL TRANSLATE THE VALUE TO THE NATIVE VALUE.
|
||||
*/
|
||||
|
||||
extern const pj_uint16_t PJ_SOCK_STREAM; /**< Sequenced, reliable, connection-
|
||||
based byte streams. */
|
||||
extern const pj_uint16_t PJ_SOCK_DGRAM; /**< Connectionless, unreliable
|
||||
datagrams of fixed maximum
|
||||
lengths. */
|
||||
extern const pj_uint16_t PJ_SOCK_RAW; /**< Raw protocol interface. */
|
||||
extern const pj_uint16_t PJ_SOCK_RDM; /**< Reliably-delivered messages. */
|
||||
|
||||
|
||||
/**
|
||||
* Socket level specified in #pj_sock_setsockopt().
|
||||
* APPLICATION MUST USE THESE VALUES INSTEAD OF NORMAL SOL_*, BECAUSE
|
||||
* THE LIBRARY WILL TRANSLATE THE VALUE TO THE NATIVE VALUE.
|
||||
*/
|
||||
extern const pj_uint16_t PJ_SOL_SOCKET; /**< Socket level. */
|
||||
extern const pj_uint16_t PJ_SOL_IP; /**< IP level. */
|
||||
extern const pj_uint16_t PJ_SOL_TCP; /**< TCP level. */
|
||||
extern const pj_uint16_t PJ_SOL_UDP; /**< UDP level. */
|
||||
extern const pj_uint16_t PJ_SOL_IPV6; /**< IP version 6 */
|
||||
|
||||
/**
|
||||
* Flags to be specified in #pj_sock_recv, #pj_sock_send, etc.
|
||||
*/
|
||||
typedef enum pj_sock_msg_flag
|
||||
{
|
||||
PJ_MSG_OOB = 0x01, /**< Out-of-band messages. */
|
||||
PJ_MSG_PEEK = 0x02, /**< Peek, don't remove from buffer. */
|
||||
PJ_MSG_DONTROUTE = 0x04, /**< Don't route. */
|
||||
} pj_sock_msg_flag;
|
||||
|
||||
|
||||
/**
|
||||
* Flag to be specified in #pj_sock_shutdown.
|
||||
*/
|
||||
typedef enum pj_socket_sd_type
|
||||
{
|
||||
PJ_SD_RECEIVE = 0, /**< No more receive. */
|
||||
PJ_SHUT_RD = 0, /**< Alias for SD_RECEIVE. */
|
||||
PJ_SD_SEND = 1, /**< No more sending. */
|
||||
PJ_SHUT_WR = 1, /**< Alias for SD_SEND. */
|
||||
PJ_SD_BOTH = 2, /**< No more send and receive. */
|
||||
PJ_SHUT_RDWR = 2, /**< Alias for SD_BOTH. */
|
||||
} pj_socket_sd_type;
|
||||
|
||||
|
||||
|
||||
/** Address to accept any incoming messages. */
|
||||
#define PJ_INADDR_ANY ((pj_uint32_t)0)
|
||||
|
||||
/** Address indicating an error return */
|
||||
#define PJ_INADDR_NONE ((pj_uint32_t)0xffffffff)
|
||||
|
||||
/** Address to send to all hosts. */
|
||||
#define PJ_INADDR_BROADCAST ((pj_uint32_t)0xffffffff)
|
||||
|
||||
|
||||
/**
|
||||
* Maximum length specifiable by #pj_sock_listen().
|
||||
* If the build system doesn't override this value, then the lowest
|
||||
* denominator (five, in Win32 systems) will be used.
|
||||
*/
|
||||
#if !defined(PJ_SOMAXCONN)
|
||||
# define PJ_SOMAXCONN 5
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Constant for invalid socket returned by #pj_sock_socket() and
|
||||
* #pj_sock_accept().
|
||||
*/
|
||||
#define PJ_INVALID_SOCKET (-1)
|
||||
|
||||
/**
|
||||
* Structure describing a generic socket address.
|
||||
*/
|
||||
typedef struct pj_sockaddr
|
||||
{
|
||||
pj_uint16_t sa_family; /**< Common data: address family. */
|
||||
char sa_data[14]; /**< Address data. */
|
||||
} pj_sockaddr;
|
||||
|
||||
|
||||
/**
|
||||
* This structure describes Internet address.
|
||||
*/
|
||||
typedef struct pj_in_addr
|
||||
{
|
||||
pj_uint32_t s_addr; /**< The 32bit IP address. */
|
||||
} pj_in_addr;
|
||||
|
||||
|
||||
/**
|
||||
* This structure describes Internet socket address.
|
||||
*/
|
||||
typedef struct pj_sockaddr_in
|
||||
{
|
||||
pj_uint16_t sin_family; /**< Address family. */
|
||||
pj_uint16_t sin_port; /**< Transport layer port number. */
|
||||
pj_in_addr sin_addr; /**< IP address. */
|
||||
char sin_zero[8]; /**< Padding. */
|
||||
} pj_sockaddr_in;
|
||||
|
||||
|
||||
/**
|
||||
* This structure describes IPv6 address.
|
||||
*/
|
||||
typedef struct pj_in6_addr
|
||||
{
|
||||
/** Union of address formats. */
|
||||
union {
|
||||
pj_uint8_t u6_addr8[16]; /**< u6_addr8 */
|
||||
pj_uint16_t u6_addr16[8]; /**< u6_addr16 */
|
||||
pj_uint32_t u6_addr32[4]; /**< u6_addr32 */
|
||||
} in6_u;
|
||||
/** Shortcut to access in6_u.u6_addr8. */
|
||||
#define s6_addr in6_u.u6_addr8
|
||||
/** Shortcut to access in6_u.u6_addr16. */
|
||||
#define s6_addr16 in6_u.u6_addr16
|
||||
/** Shortcut to access in6_u.u6_addr32. */
|
||||
#define s6_addr32 in6_u.u6_addr32
|
||||
} pj_in6_addr;
|
||||
|
||||
/** Initializer value for pj_in6_addr. */
|
||||
#define PJ_IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
|
||||
|
||||
/** Initializer value for pj_in6_addr. */
|
||||
#define PJ_IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
|
||||
|
||||
/**
|
||||
* This structure describes IPv6 socket address.
|
||||
*/
|
||||
typedef struct pj_sockaddr_in6
|
||||
{
|
||||
pj_uint16_t sin6_family; /**< Address family */
|
||||
pj_uint16_t sin6_port; /**< Transport layer port number. */
|
||||
pj_uint32_t sin6_flowinfo; /**< IPv6 flow information */
|
||||
pj_in6_addr sin6_addr; /**< IPv6 address. */
|
||||
pj_uint32_t sin6_scope_id; /**< IPv6 scope-id */
|
||||
} pj_sockaddr_in6;
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* SOCKET ADDRESS MANIPULATION.
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Convert 16-bit value from network byte order to host byte order.
|
||||
*
|
||||
* @param netshort 16-bit network value.
|
||||
* @return 16-bit host value.
|
||||
*/
|
||||
PJ_DECL(pj_uint16_t) pj_ntohs(pj_uint16_t netshort);
|
||||
|
||||
/**
|
||||
* Convert 16-bit value from host byte order to network byte order.
|
||||
*
|
||||
* @param hostshort 16-bit host value.
|
||||
* @return 16-bit network value.
|
||||
*/
|
||||
PJ_DECL(pj_uint16_t) pj_htons(pj_uint16_t hostshort);
|
||||
|
||||
/**
|
||||
* Convert 32-bit value from network byte order to host byte order.
|
||||
*
|
||||
* @param netlong 32-bit network value.
|
||||
* @return 32-bit host value.
|
||||
*/
|
||||
PJ_DECL(pj_uint32_t) pj_ntohl(pj_uint32_t netlong);
|
||||
|
||||
/**
|
||||
* Convert 32-bit value from host byte order to network byte order.
|
||||
*
|
||||
* @param hostlong 32-bit host value.
|
||||
* @return 32-bit network value.
|
||||
*/
|
||||
PJ_DECL(pj_uint32_t) pj_htonl(pj_uint32_t hostlong);
|
||||
|
||||
/**
|
||||
* Convert an Internet host address given in network byte order
|
||||
* to string in standard numbers and dots notation.
|
||||
*
|
||||
* @param inaddr The host address.
|
||||
* @return The string address.
|
||||
*/
|
||||
PJ_DECL(char*) pj_inet_ntoa(pj_in_addr inaddr);
|
||||
|
||||
/**
|
||||
* This function converts the Internet host address cp from the standard
|
||||
* numbers-and-dots notation into binary data and stores it in the structure
|
||||
* that inp points to.
|
||||
*
|
||||
* @param cp IP address in standard numbers-and-dots notation.
|
||||
* @param inp Structure that holds the output of the conversion.
|
||||
*
|
||||
* @return nonzero if the address is valid, zero if not.
|
||||
*/
|
||||
PJ_DECL(int) pj_inet_aton(const pj_str_t *cp, struct pj_in_addr *inp);
|
||||
|
||||
/**
|
||||
* Convert address string with numbers and dots to binary IP address.
|
||||
*
|
||||
* @param cp The IP address in numbers and dots notation.
|
||||
* @return If success, the IP address is returned in network
|
||||
* byte order. If failed, PJ_INADDR_NONE will be
|
||||
* returned.
|
||||
* @remark
|
||||
* This is an obsolete interface to #pj_inet_aton(); it is obsolete
|
||||
* because -1 is a valid address (255.255.255.255), and #pj_inet_aton()
|
||||
* provides a cleaner way to indicate error return.
|
||||
*/
|
||||
PJ_DECL(pj_in_addr) pj_inet_addr(const pj_str_t *cp);
|
||||
|
||||
|
||||
/**
|
||||
* Get the transport layer port number of an Internet socket address.
|
||||
* The port is returned in host byte order.
|
||||
*
|
||||
* @param addr The IP socket address.
|
||||
* @return Port number, in host byte order.
|
||||
*/
|
||||
PJ_INLINE(pj_uint16_t) pj_sockaddr_in_get_port(const pj_sockaddr_in *addr)
|
||||
{
|
||||
return pj_ntohs(addr->sin_port);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the port number of an Internet socket address.
|
||||
*
|
||||
* @param addr The IP socket address.
|
||||
* @param hostport The port number, in host byte order.
|
||||
*/
|
||||
PJ_INLINE(void) pj_sockaddr_in_set_port(pj_sockaddr_in *addr,
|
||||
pj_uint16_t hostport)
|
||||
{
|
||||
addr->sin_port = pj_htons(hostport);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the IP address of an Internet socket address.
|
||||
* The address is returned as 32bit value in host byte order.
|
||||
*
|
||||
* @param addr The IP socket address.
|
||||
* @return 32bit address, in host byte order.
|
||||
*/
|
||||
PJ_INLINE(pj_in_addr) pj_sockaddr_in_get_addr(const pj_sockaddr_in *addr)
|
||||
{
|
||||
pj_in_addr in_addr;
|
||||
in_addr.s_addr = pj_ntohl(addr->sin_addr.s_addr);
|
||||
return in_addr;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set the IP address of an Internet socket address.
|
||||
*
|
||||
* @param addr The IP socket address.
|
||||
* @param hostaddr The host address, in host byte order.
|
||||
*/
|
||||
PJ_INLINE(void) pj_sockaddr_in_set_addr(pj_sockaddr_in *addr,
|
||||
pj_uint32_t hostaddr)
|
||||
{
|
||||
addr->sin_addr.s_addr = pj_htonl(hostaddr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the IP address of an IP socket address from string address,
|
||||
* with resolving the host if necessary. The string address may be in a
|
||||
* standard numbers and dots notation or may be a hostname. If hostname
|
||||
* is specified, then the function will resolve the host into the IP
|
||||
* address.
|
||||
*
|
||||
* @param addr The IP socket address to be set.
|
||||
* @param cp The address string, which can be in a standard
|
||||
* dotted numbers or a hostname to be resolved.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sockaddr_in_set_str_addr( pj_sockaddr_in *addr,
|
||||
const pj_str_t *cp);
|
||||
|
||||
/**
|
||||
* Set the IP address and port of an IP socket address.
|
||||
* The string address may be in a standard numbers and dots notation or
|
||||
* may be a hostname. If hostname is specified, then the function will
|
||||
* resolve the host into the IP address.
|
||||
*
|
||||
* @param addr The IP socket address to be set.
|
||||
* @param cp The address string, which can be in a standard
|
||||
* dotted numbers or a hostname to be resolved.
|
||||
* @param port The port number, in host byte order.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sockaddr_in_init( pj_sockaddr_in *addr,
|
||||
const pj_str_t *cp,
|
||||
pj_uint16_t port);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* HOST NAME AND ADDRESS.
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get system's host name.
|
||||
*
|
||||
* @return The hostname, or empty string if the hostname can not
|
||||
* be identified.
|
||||
*/
|
||||
PJ_DECL(const pj_str_t*) pj_gethostname(void);
|
||||
|
||||
/**
|
||||
* Get host's IP address, which the the first IP address that is resolved
|
||||
* from the hostname.
|
||||
*
|
||||
* @return The host's IP address, PJ_INADDR_NONE if the host
|
||||
* IP address can not be identified.
|
||||
*/
|
||||
PJ_DECL(pj_in_addr) pj_gethostaddr(void);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* SOCKET API.
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create new socket/endpoint for communication.
|
||||
*
|
||||
* @param family Specifies a communication domain; this selects the
|
||||
* protocol family which will be used for communication.
|
||||
* @param type The socket has the indicated type, which specifies the
|
||||
* communication semantics.
|
||||
* @param protocol Specifies a particular protocol to be used with the
|
||||
* socket. Normally only a single protocol exists to support
|
||||
* a particular socket type within a given protocol family,
|
||||
* in which a case protocol can be specified as 0.
|
||||
* @param sock New socket descriptor, or PJ_INVALID_SOCKET on error.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_socket(int family,
|
||||
int type,
|
||||
int protocol,
|
||||
pj_sock_t *sock);
|
||||
|
||||
/**
|
||||
* Close the socket descriptor.
|
||||
*
|
||||
* @param sockfd The socket descriptor.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_close(pj_sock_t sockfd);
|
||||
|
||||
|
||||
/**
|
||||
* This function gives the socket sockfd the local address my_addr. my_addr is
|
||||
* addrlen bytes long. Traditionally, this is called assigning a name to
|
||||
* a socket. When a socket is created with #pj_sock_socket(), it exists in a
|
||||
* name space (address family) but has no name assigned.
|
||||
*
|
||||
* @param sockfd The socket desriptor.
|
||||
* @param my_addr The local address to bind the socket to.
|
||||
* @param addrlen The length of the address.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_bind( pj_sock_t sockfd,
|
||||
const pj_sockaddr_t *my_addr,
|
||||
int addrlen);
|
||||
|
||||
/**
|
||||
* Bind the IP socket sockfd to the given address and port.
|
||||
*
|
||||
* @param sockfd The socket descriptor.
|
||||
* @param addr Local address to bind the socket to, in host byte order.
|
||||
* @param port The local port to bind the socket to, in host byte order.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_bind_in( pj_sock_t sockfd,
|
||||
pj_uint32_t addr,
|
||||
pj_uint16_t port);
|
||||
|
||||
#if PJ_HAS_TCP
|
||||
/**
|
||||
* Listen for incoming connection. This function only applies to connection
|
||||
* oriented sockets (such as PJ_SOCK_STREAM or PJ_SOCK_SEQPACKET), and it
|
||||
* indicates the willingness to accept incoming connections.
|
||||
*
|
||||
* @param sockfd The socket descriptor.
|
||||
* @param backlog Defines the maximum length the queue of pending
|
||||
* connections may grow to.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_listen( pj_sock_t sockfd,
|
||||
int backlog );
|
||||
|
||||
/**
|
||||
* Accept new connection on the specified connection oriented server socket.
|
||||
*
|
||||
* @param serverfd The server socket.
|
||||
* @param newsock New socket on success, of PJ_INVALID_SOCKET if failed.
|
||||
* @param addr A pointer to sockaddr type. If the argument is not NULL,
|
||||
* it will be filled by the address of connecting entity.
|
||||
* @param addrlen Initially specifies the length of the address, and upon
|
||||
* return will be filled with the exact address length.
|
||||
*
|
||||
* @return Zero on success, or the error number.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_accept( pj_sock_t serverfd,
|
||||
pj_sock_t *newsock,
|
||||
pj_sockaddr_t *addr,
|
||||
int *addrlen);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The file descriptor sockfd must refer to a socket. If the socket is of
|
||||
* type PJ_SOCK_DGRAM then the serv_addr address is the address to which
|
||||
* datagrams are sent by default, and the only address from which datagrams
|
||||
* are received. If the socket is of type PJ_SOCK_STREAM or PJ_SOCK_SEQPACKET,
|
||||
* this call attempts to make a connection to another socket. The
|
||||
* other socket is specified by serv_addr, which is an address (of length
|
||||
* addrlen) in the communications space of the socket. Each communications
|
||||
* space interprets the serv_addr parameter in its own way.
|
||||
*
|
||||
* @param sockfd The socket descriptor.
|
||||
* @param serv_addr Server address to connect to.
|
||||
* @param addrlen The length of server address.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_connect( pj_sock_t sockfd,
|
||||
const pj_sockaddr_t *serv_addr,
|
||||
int addrlen);
|
||||
|
||||
/**
|
||||
* Return the address of peer which is connected to socket sockfd.
|
||||
*
|
||||
* @param sockfd The socket descriptor.
|
||||
* @param addr Pointer to sockaddr structure to which the address
|
||||
* will be returned.
|
||||
* @param namelen Initially the length of the addr. Upon return the value
|
||||
* will be set to the actual length of the address.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_getpeername(pj_sock_t sockfd,
|
||||
pj_sockaddr_t *addr,
|
||||
int *namelen);
|
||||
|
||||
/**
|
||||
* Return the current name of the specified socket.
|
||||
*
|
||||
* @param sockfd The socket descriptor.
|
||||
* @param addr Pointer to sockaddr structure to which the address
|
||||
* will be returned.
|
||||
* @param namelen Initially the length of the addr. Upon return the value
|
||||
* will be set to the actual length of the address.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_getsockname( pj_sock_t sockfd,
|
||||
pj_sockaddr_t *addr,
|
||||
int *namelen);
|
||||
|
||||
/**
|
||||
* Get socket option associated with a socket. Options may exist at multiple
|
||||
* protocol levels; they are always present at the uppermost socket level.
|
||||
*
|
||||
* @param sockfd The socket descriptor.
|
||||
* @param level The level which to get the option from.
|
||||
* @param optname The option name, which will be passed uninterpreted
|
||||
* by the library.
|
||||
* @param optval Identifies the buffer which the value will be
|
||||
* returned.
|
||||
* @param optlen Initially contains the length of the buffer, upon
|
||||
* return will be set to the actual size of the value.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_getsockopt( pj_sock_t sockfd,
|
||||
int level,
|
||||
int optname,
|
||||
void *optval,
|
||||
int *optlen);
|
||||
/**
|
||||
* Manipulate the options associated with a socket. Options may exist at
|
||||
* multiple protocol levels; they are always present at the uppermost socket
|
||||
* level.
|
||||
*
|
||||
* @param sockfd The socket descriptor.
|
||||
* @param level The level which to get the option from.
|
||||
* @param optname The option name, which will be passed uninterpreted
|
||||
* by the library.
|
||||
* @param optval Identifies the buffer which contain the value.
|
||||
* @param optlen The length of the value.
|
||||
*
|
||||
* @return PJ_SUCCESS or the status code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_setsockopt( pj_sock_t sockfd,
|
||||
int level,
|
||||
int optname,
|
||||
const void *optval,
|
||||
int optlen);
|
||||
|
||||
|
||||
/**
|
||||
* Receives data stream or message coming to the specified socket.
|
||||
*
|
||||
* @param sockfd The socket descriptor.
|
||||
* @param buf The buffer to receive the data or message.
|
||||
* @param len On input, the length of the buffer. On return,
|
||||
* contains the length of data received.
|
||||
* @param flags Combination of #pj_sock_msg_flag.
|
||||
*
|
||||
* @return PJ_SUCCESS or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_recv(pj_sock_t sockfd,
|
||||
void *buf,
|
||||
pj_ssize_t *len,
|
||||
unsigned flags);
|
||||
|
||||
/**
|
||||
* Receives data stream or message coming to the specified socket.
|
||||
*
|
||||
* @param sockfd The socket descriptor.
|
||||
* @param buf The buffer to receive the data or message.
|
||||
* @param len On input, the length of the buffer. On return,
|
||||
* contains the length of data received.
|
||||
* @param flags Bitmask combination of #pj_sock_msg_flag.
|
||||
* @param from If not NULL, it will be filled with the source
|
||||
* address of the connection.
|
||||
* @param fromlen Initially contains the length of from address,
|
||||
* and upon return will be filled with the actual
|
||||
* length of the address.
|
||||
*
|
||||
* @return PJ_SUCCESS or the error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_recvfrom( pj_sock_t sockfd,
|
||||
void *buf,
|
||||
pj_ssize_t *len,
|
||||
unsigned flags,
|
||||
pj_sockaddr_t *from,
|
||||
int *fromlen);
|
||||
|
||||
/**
|
||||
* Transmit data to the socket.
|
||||
*
|
||||
* @param sockfd Socket descriptor.
|
||||
* @param buf Buffer containing data to be sent.
|
||||
* @param len On input, the length of the data in the buffer.
|
||||
* Upon return, it will be filled with the length
|
||||
* of data sent.
|
||||
* @param flags Bitmask combination of #pj_sock_msg_flag.
|
||||
*
|
||||
* @return PJ_SUCCESS or the status code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_send(pj_sock_t sockfd,
|
||||
const void *buf,
|
||||
pj_ssize_t *len,
|
||||
unsigned flags);
|
||||
|
||||
/**
|
||||
* Transmit data to the socket to the specified address.
|
||||
*
|
||||
* @param sockfd Socket descriptor.
|
||||
* @param buf Buffer containing data to be sent.
|
||||
* @param len On input, the length of the data in the buffer.
|
||||
* Upon return, it will be filled with the length
|
||||
* of data sent.
|
||||
* @param flags Bitmask combination of #pj_sock_msg_flag.
|
||||
* @param to The address to send.
|
||||
* @param tolen The length of the address in bytes.
|
||||
*
|
||||
* @return The length of data successfully sent.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_sendto(pj_sock_t sockfd,
|
||||
const void *buf,
|
||||
pj_ssize_t *len,
|
||||
unsigned flags,
|
||||
const pj_sockaddr_t *to,
|
||||
int tolen);
|
||||
|
||||
#if PJ_HAS_TCP
|
||||
/**
|
||||
* The shutdown call causes all or part of a full-duplex connection on the
|
||||
* socket associated with sockfd to be shut down.
|
||||
*
|
||||
* @param sockfd The socket descriptor.
|
||||
* @param how If how is PJ_SHUT_RD, further receptions will be
|
||||
* disallowed. If how is PJ_SHUT_WR, further transmissions
|
||||
* will be disallowed. If how is PJ_SHUT_RDWR, further
|
||||
* receptions andtransmissions will be disallowed.
|
||||
*
|
||||
* @return Zero on success.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_sock_shutdown( pj_sock_t sockfd,
|
||||
int how);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_SOCK_H__ */
|
||||
|
|
@ -0,0 +1,141 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/sock_select.h 3 10/14/05 12:26a Bennylp $ */
|
||||
/* $Log: /pjproject-0.3/pjlib/include/pj/sock_select.h $
|
||||
*
|
||||
* 3 10/14/05 12:26a Bennylp
|
||||
* Finished error code framework, some fixes in ioqueue, etc. Pretty
|
||||
* major.
|
||||
*
|
||||
* 2 9/21/05 1:39p Bennylp
|
||||
* Periodic checkin for backup.
|
||||
*
|
||||
* 1 9/15/05 8:40p Bennylp
|
||||
* Created.
|
||||
*/
|
||||
#ifndef __PJ_SELECT_H__
|
||||
#define __PJ_SELECT_H__
|
||||
|
||||
/**
|
||||
* @file sock_select.h
|
||||
* @brief Socket select().
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_SOCK_SELECT Socket select() API.
|
||||
* @ingroup PJ_IO
|
||||
* @{
|
||||
* This module provides portable abstraction for \a select() like API.
|
||||
* The abstraction is needed so that it can utilize various event
|
||||
* dispatching mechanisms that are available across platforms.
|
||||
*
|
||||
* The API is very similar to normal \a select() usage.
|
||||
*
|
||||
* \section pj_sock_select_examples_sec Examples
|
||||
*
|
||||
* For some examples on how to use the select API, please see:
|
||||
*
|
||||
* - \ref page_pjlib_select_test
|
||||
*/
|
||||
|
||||
/**
|
||||
* Portable structure declarations for pj_fd_set.
|
||||
* The implementation of pj_sock_select() does not use this structure
|
||||
* per-se, but instead it will use the native fd_set structure. However,
|
||||
* we must make sure that the size of pj_fd_set_t can accomodate the
|
||||
* native fd_set structure.
|
||||
*/
|
||||
typedef struct pj_fd_set_t
|
||||
{
|
||||
pj_sock_t data[FD_SETSIZE + 4]; /**< Opaque buffer for fd_set */
|
||||
} pj_fd_set_t;
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the descriptor set pointed to by fdsetp to the null set.
|
||||
*
|
||||
* @param fdsetp The descriptor set.
|
||||
*/
|
||||
PJ_DECL(void) PJ_FD_ZERO(pj_fd_set_t *fdsetp);
|
||||
|
||||
|
||||
/**
|
||||
* Add the file descriptor fd to the set pointed to by fdsetp.
|
||||
* If the file descriptor fd is already in this set, there shall be no effect
|
||||
* on the set, nor will an error be returned.
|
||||
*
|
||||
* @param fd The socket descriptor.
|
||||
* @param fdsetp The descriptor set.
|
||||
*/
|
||||
PJ_DECL(void) PJ_FD_SET(pj_sock_t fd, pj_fd_set_t *fdsetp);
|
||||
|
||||
/**
|
||||
* Remove the file descriptor fd from the set pointed to by fdsetp.
|
||||
* If fd is not a member of this set, there shall be no effect on the set,
|
||||
* nor will an error be returned.
|
||||
*
|
||||
* @param fd The socket descriptor.
|
||||
* @param fdsetp The descriptor set.
|
||||
*/
|
||||
PJ_DECL(void) PJ_FD_CLR(pj_sock_t fd, pj_fd_set_t *fdsetp);
|
||||
|
||||
|
||||
/**
|
||||
* Evaluate to non-zero if the file descriptor fd is a member of the set
|
||||
* pointed to by fdsetp, and shall evaluate to zero otherwise.
|
||||
*
|
||||
* @param fd The socket descriptor.
|
||||
* @param fdsetp The descriptor set.
|
||||
*
|
||||
* @return Nonzero if fd is member of the descriptor set.
|
||||
*/
|
||||
PJ_DECL(pj_bool_t) PJ_FD_ISSET(pj_sock_t fd, const pj_fd_set_t *fdsetp);
|
||||
|
||||
|
||||
/**
|
||||
* Get the number of descriptors in the set.
|
||||
*
|
||||
* @param fdsetp The descriptor set.
|
||||
*
|
||||
* @return Number of descriptors in the set.
|
||||
*/
|
||||
PJ_DECL(pj_size_t) PJ_FD_COUNT(const pj_fd_set_t *fdsetp);
|
||||
|
||||
|
||||
/**
|
||||
* This function wait for a number of file descriptors to change status.
|
||||
* The behaviour is the same as select() function call which appear in
|
||||
* standard BSD socket libraries.
|
||||
*
|
||||
* @param n On Unices, this specifies the highest-numbered
|
||||
* descriptor in any of the three set, plus 1. On Windows,
|
||||
* the value is ignored.
|
||||
* @param readfds Optional pointer to a set of sockets to be checked for
|
||||
* readability.
|
||||
* @param writefds Optional pointer to a set of sockets to be checked for
|
||||
* writability.
|
||||
* @param exceptfds Optional pointer to a set of sockets to be checked for
|
||||
* errors.
|
||||
* @param timeout Maximum time for select to wait, or null for blocking
|
||||
* operations.
|
||||
*
|
||||
* @return The total number of socket handles that are ready, or
|
||||
* zero if the time limit expired, or -1 if an error occurred.
|
||||
*/
|
||||
PJ_DECL(int) pj_sock_select( int n,
|
||||
pj_fd_set_t *readfds,
|
||||
pj_fd_set_t *writefds,
|
||||
pj_fd_set_t *exceptfds,
|
||||
const pj_time_val *timeout);
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_SELECT_H__ */
|
|
@ -0,0 +1,515 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/string.h 8 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_STRING_H__
|
||||
#define __PJ_STRING_H__
|
||||
|
||||
/**
|
||||
* @file string.h
|
||||
* @brief PJLIB String Operations.
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
#include <pj/compat/string.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_PSTR String Operations
|
||||
* @ingroup PJ_DS
|
||||
* @{
|
||||
* This module provides string manipulation API.
|
||||
*
|
||||
* \section pj_pstr_not_null_sec PJLIB String is NOT Null Terminated!
|
||||
*
|
||||
* That is the first information that developers need to know. Instead
|
||||
* of using normal C string, strings in PJLIB are represented as
|
||||
* pj_str_t structure below:
|
||||
*
|
||||
* <pre>
|
||||
* typedef struct pj_str_t
|
||||
* {
|
||||
* char *ptr;
|
||||
* pj_size_t slen;
|
||||
* } pj_str_t;
|
||||
* </pre>
|
||||
*
|
||||
* There are some advantages of using this approach:
|
||||
* - the string can point to arbitrary location in memory even
|
||||
* if the string in that location is not null terminated. This is
|
||||
* most usefull for text parsing, where the parsed text can just
|
||||
* point to the original text in the input. If we use C string,
|
||||
* then we will have to copy the text portion from the input
|
||||
* to a string variable.
|
||||
* - because the length of the string is known, string copy operation
|
||||
* can be made more efficient.
|
||||
*
|
||||
* Most of APIs in PJLIB that expect or return string will represent
|
||||
* the string as pj_str_t instead of normal C string.
|
||||
*
|
||||
* \section pj_pstr_examples_sec Examples
|
||||
*
|
||||
* For some examples, please see:
|
||||
* - @ref page_pjlib_string_test
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create string initializer from a normal C string.
|
||||
*
|
||||
* @param str Null terminated string to be stored.
|
||||
*
|
||||
* @return pj_str_t.
|
||||
*/
|
||||
PJ_IDECL(pj_str_t) pj_str(char *str);
|
||||
|
||||
/**
|
||||
* Create constant string from normal C string.
|
||||
*
|
||||
* @param str The string to be initialized.
|
||||
* @param s Null terminated string.
|
||||
*
|
||||
* @return pj_str_t.
|
||||
*/
|
||||
PJ_INLINE(const pj_str_t*) pj_cstr(pj_str_t *str, const char *s)
|
||||
{
|
||||
str->ptr = (char*)s;
|
||||
str->slen = s ? strlen(s) : 0;
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the pointer and length to the specified value.
|
||||
*
|
||||
* @param str the string.
|
||||
* @param ptr pointer to set.
|
||||
* @param length length to set.
|
||||
*
|
||||
* @return the string.
|
||||
*/
|
||||
PJ_INLINE(pj_str_t*) pj_strset( pj_str_t *str, char *ptr, pj_size_t length)
|
||||
{
|
||||
str->ptr = ptr;
|
||||
str->slen = length;
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the pointer and length of the string to the source string, which
|
||||
* must be NULL terminated.
|
||||
*
|
||||
* @param str the string.
|
||||
* @param src pointer to set.
|
||||
*
|
||||
* @return the string.
|
||||
*/
|
||||
PJ_INLINE(pj_str_t*) pj_strset2( pj_str_t *str, char *src)
|
||||
{
|
||||
str->ptr = src;
|
||||
str->slen = src ? strlen(src) : 0;
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the pointer and the length of the string.
|
||||
*
|
||||
* @param str The target string.
|
||||
* @param begin The start of the string.
|
||||
* @param end The end of the string.
|
||||
*
|
||||
* @return the target string.
|
||||
*/
|
||||
PJ_INLINE(pj_str_t*) pj_strset3( pj_str_t *str, char *begin, char *end )
|
||||
{
|
||||
str->ptr = begin;
|
||||
str->slen = end-begin;
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assign string.
|
||||
*
|
||||
* @param dst The target string.
|
||||
* @param src The source string.
|
||||
*
|
||||
* @return the target string.
|
||||
*/
|
||||
PJ_IDECL(pj_str_t*) pj_strassign( pj_str_t *dst, pj_str_t *src );
|
||||
|
||||
/**
|
||||
* Copy string contents.
|
||||
*
|
||||
* @param dst The target string.
|
||||
* @param src The source string.
|
||||
*
|
||||
* @return the target string.
|
||||
*/
|
||||
PJ_IDECL(pj_str_t*) pj_strcpy(pj_str_t *dst, const pj_str_t *src);
|
||||
|
||||
/**
|
||||
* Copy string contents.
|
||||
*
|
||||
* @param dst The target string.
|
||||
* @param src The source string.
|
||||
*
|
||||
* @return the target string.
|
||||
*/
|
||||
PJ_IDECL(pj_str_t*) pj_strcpy2(pj_str_t *dst, const char *src);
|
||||
|
||||
/**
|
||||
* Duplicate string.
|
||||
*
|
||||
* @param pool The pool.
|
||||
* @param dst The string result.
|
||||
* @param src The string to duplicate.
|
||||
*
|
||||
* @return the string result.
|
||||
*/
|
||||
PJ_IDECL(pj_str_t*) pj_strdup(pj_pool_t *pool,
|
||||
pj_str_t *dst,
|
||||
const pj_str_t *src);
|
||||
|
||||
/**
|
||||
* Duplicate string and NULL terminate the destination string.
|
||||
*
|
||||
* @param pool
|
||||
* @param dst
|
||||
* @param src
|
||||
*/
|
||||
PJ_IDECL(pj_str_t*) pj_strdup_with_null(pj_pool_t *pool,
|
||||
pj_str_t *dst,
|
||||
const pj_str_t *src);
|
||||
|
||||
/**
|
||||
* Duplicate string.
|
||||
*
|
||||
* @param pool The pool.
|
||||
* @param dst The string result.
|
||||
* @param src The string to duplicate.
|
||||
*
|
||||
* @return the string result.
|
||||
*/
|
||||
PJ_IDECL(pj_str_t*) pj_strdup2(pj_pool_t *pool,
|
||||
pj_str_t *dst,
|
||||
const char *src);
|
||||
|
||||
/**
|
||||
* Duplicate string.
|
||||
*
|
||||
* @param pool The pool.
|
||||
* @param src The string to duplicate.
|
||||
*
|
||||
* @return the string result.
|
||||
*/
|
||||
PJ_IDECL(pj_str_t) pj_strdup3(pj_pool_t *pool, const char *src);
|
||||
|
||||
/**
|
||||
* Return the length of the string.
|
||||
*
|
||||
* @param str The string.
|
||||
*
|
||||
* @return the length of the string.
|
||||
*/
|
||||
PJ_INLINE(pj_size_t) pj_strlen( const pj_str_t *str )
|
||||
{
|
||||
return str->slen;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the pointer to the string data.
|
||||
*
|
||||
* @param str The string.
|
||||
*
|
||||
* @return the pointer to the string buffer.
|
||||
*/
|
||||
PJ_INLINE(const char*) pj_strbuf( const pj_str_t *str )
|
||||
{
|
||||
return str->ptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare strings.
|
||||
*
|
||||
* @param str1 The string to compare.
|
||||
* @param str2 The string to compare.
|
||||
*
|
||||
* @return
|
||||
* - < 0 if str1 is less than str2
|
||||
* - 0 if str1 is identical to str2
|
||||
* - > 0 if str1 is greater than str2
|
||||
*/
|
||||
PJ_IDECL(int) pj_strcmp( const pj_str_t *str1, const pj_str_t *str2);
|
||||
|
||||
/**
|
||||
* Compare strings.
|
||||
*
|
||||
* @param str1 The string to compare.
|
||||
* @param str2 The string to compare.
|
||||
*
|
||||
* @return
|
||||
* - < 0 if str1 is less than str2
|
||||
* - 0 if str1 is identical to str2
|
||||
* - > 0 if str1 is greater than str2
|
||||
*/
|
||||
PJ_IDECL(int) pj_strcmp2( const pj_str_t *str1, const char *str2 );
|
||||
|
||||
/**
|
||||
* Compare strings.
|
||||
*
|
||||
* @param str1 The string to compare.
|
||||
* @param str2 The string to compare.
|
||||
* @param len The maximum number of characters to compare.
|
||||
*
|
||||
* @return
|
||||
* - < 0 if str1 is less than str2
|
||||
* - 0 if str1 is identical to str2
|
||||
* - > 0 if str1 is greater than str2
|
||||
*/
|
||||
PJ_IDECL(int) pj_strncmp( const pj_str_t *str1, const pj_str_t *str2,
|
||||
pj_size_t len);
|
||||
|
||||
/**
|
||||
* Compare strings.
|
||||
*
|
||||
* @param str1 The string to compare.
|
||||
* @param str2 The string to compare.
|
||||
* @param len The maximum number of characters to compare.
|
||||
*
|
||||
* @return
|
||||
* - < 0 if str1 is less than str2
|
||||
* - 0 if str1 is identical to str2
|
||||
* - > 0 if str1 is greater than str2
|
||||
*/
|
||||
PJ_IDECL(int) pj_strncmp2( const pj_str_t *str1, const char *str2,
|
||||
pj_size_t len);
|
||||
|
||||
/**
|
||||
* Perform lowercase comparison to the strings.
|
||||
*
|
||||
* @param str1 The string to compare.
|
||||
* @param str2 The string to compare.
|
||||
*
|
||||
* @return
|
||||
* - < 0 if str1 is less than str2
|
||||
* - 0 if str1 is identical to str2
|
||||
* - > 0 if str1 is greater than str2
|
||||
*/
|
||||
PJ_IDECL(int) pj_stricmp( const pj_str_t *str1, const pj_str_t *str2);
|
||||
|
||||
/**
|
||||
* Perform lowercase comparison to the strings.
|
||||
*
|
||||
* @param str1 The string to compare.
|
||||
* @param str2 The string to compare.
|
||||
*
|
||||
* @return
|
||||
* - < 0 if str1 is less than str2
|
||||
* - 0 if str1 is identical to str2
|
||||
* - > 0 if str1 is greater than str2
|
||||
*/
|
||||
PJ_IDECL(int) pj_stricmp2( const pj_str_t *str1, const char *str2);
|
||||
|
||||
/**
|
||||
* Perform lowercase comparison to the strings.
|
||||
*
|
||||
* @param str1 The string to compare.
|
||||
* @param str2 The string to compare.
|
||||
* @param len The maximum number of characters to compare.
|
||||
*
|
||||
* @return
|
||||
* - < 0 if str1 is less than str2
|
||||
* - 0 if str1 is identical to str2
|
||||
* - > 0 if str1 is greater than str2
|
||||
*/
|
||||
PJ_IDECL(int) pj_strnicmp( const pj_str_t *str1, const pj_str_t *str2,
|
||||
pj_size_t len);
|
||||
|
||||
/**
|
||||
* Perform lowercase comparison to the strings.
|
||||
*
|
||||
* @param str1 The string to compare.
|
||||
* @param str2 The string to compare.
|
||||
* @param len The maximum number of characters to compare.
|
||||
*
|
||||
* @return
|
||||
* - < 0 if str1 is less than str2
|
||||
* - 0 if str1 is identical to str2
|
||||
* - > 0 if str1 is greater than str2
|
||||
*/
|
||||
PJ_IDECL(int) pj_strnicmp2( const pj_str_t *str1, const char *str2,
|
||||
pj_size_t len);
|
||||
|
||||
/**
|
||||
* Concatenate strings.
|
||||
*
|
||||
* @param dst The destination string.
|
||||
* @param src The source string.
|
||||
*/
|
||||
PJ_IDECL(void) pj_strcat(pj_str_t *dst, const pj_str_t *src);
|
||||
|
||||
/**
|
||||
* Finds a character in a string.
|
||||
*
|
||||
* @param str The string.
|
||||
* @param chr The character to find.
|
||||
*
|
||||
* @return the pointer to first character found, or NULL.
|
||||
*/
|
||||
PJ_INLINE(char*) pj_strchr( pj_str_t *str, int chr)
|
||||
{
|
||||
return (char*) memchr(str->ptr, chr, str->slen);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove (trim) leading whitespaces from the string.
|
||||
*
|
||||
* @param str The string.
|
||||
*
|
||||
* @return the string.
|
||||
*/
|
||||
PJ_DECL(pj_str_t*) pj_strltrim( pj_str_t *str );
|
||||
|
||||
/**
|
||||
* Remove (trim) the trailing whitespaces from the string.
|
||||
*
|
||||
* @param str The string.
|
||||
*
|
||||
* @return the string.
|
||||
*/
|
||||
PJ_DECL(pj_str_t*) pj_strrtrim( pj_str_t *str );
|
||||
|
||||
/**
|
||||
* Remove (trim) leading and trailing whitespaces from the string.
|
||||
*
|
||||
* @param str The string.
|
||||
*
|
||||
* @return the string.
|
||||
*/
|
||||
PJ_IDECL(pj_str_t*) pj_strtrim( pj_str_t *str );
|
||||
|
||||
/**
|
||||
* Initialize the buffer with some random string.
|
||||
*
|
||||
* @param str the string to store the result.
|
||||
* @param length the length of the random string to generate.
|
||||
*
|
||||
* @return the string.
|
||||
*/
|
||||
PJ_DECL(char*) pj_create_random_string(char *str, pj_size_t length);
|
||||
|
||||
/**
|
||||
* Convert string to unsigned integer.
|
||||
*
|
||||
* @param str the string.
|
||||
*
|
||||
* @return the unsigned integer.
|
||||
*/
|
||||
PJ_DECL(unsigned long) pj_strtoul(const pj_str_t *str);
|
||||
|
||||
/**
|
||||
* Utility to convert unsigned integer to string. Note that the
|
||||
* string will be NULL terminated.
|
||||
*
|
||||
* @param val the unsigned integer value.
|
||||
* @param buf the buffer
|
||||
*
|
||||
* @return the number of characters written
|
||||
*/
|
||||
PJ_DECL(int) pj_utoa(unsigned long val, char *buf);
|
||||
|
||||
/**
|
||||
* Convert unsigned integer to string with minimum digits. Note that the
|
||||
* string will be NULL terminated.
|
||||
*
|
||||
* @param val The unsigned integer value.
|
||||
* @param buf The buffer.
|
||||
* @param min_dig Minimum digits to be printed, or zero to specify no
|
||||
* minimum digit.
|
||||
* @param pad The padding character to be put in front of the string
|
||||
* when the digits is less than minimum.
|
||||
*
|
||||
* @return the number of characters written.
|
||||
*/
|
||||
PJ_DECL(int) pj_utoa_pad( unsigned long val, char *buf, int min_dig, int pad);
|
||||
|
||||
/**
|
||||
* Fill the memory location with value.
|
||||
*
|
||||
* @param dst The destination buffer.
|
||||
* @param c Character to set.
|
||||
* @param size The number of characters.
|
||||
*
|
||||
* @return the value of dst.
|
||||
*/
|
||||
PJ_INLINE(void*) pj_memset(void *dst, int c, pj_size_t size)
|
||||
{
|
||||
return memset(dst, c, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy buffer.
|
||||
*
|
||||
* @param dst The destination buffer.
|
||||
* @param src The source buffer.
|
||||
* @param size The size to copy.
|
||||
*
|
||||
* @return the destination buffer.
|
||||
*/
|
||||
PJ_INLINE(void*) pj_memcpy(void *dst, const void *src, pj_size_t size)
|
||||
{
|
||||
return memcpy(dst, src, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* Move memory.
|
||||
*
|
||||
* @param dst The destination buffer.
|
||||
* @param src The source buffer.
|
||||
* @param size The size to copy.
|
||||
*
|
||||
* @return the destination buffer.
|
||||
*/
|
||||
PJ_INLINE(void*) pj_memmove(void *dst, const void *src, pj_size_t size)
|
||||
{
|
||||
return memmove(dst, src, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare buffers.
|
||||
*
|
||||
* @param buf1 The first buffer.
|
||||
* @param buf2 The second buffer.
|
||||
* @param size The size to compare.
|
||||
*
|
||||
* @return negative, zero, or positive value.
|
||||
*/
|
||||
PJ_INLINE(int) pj_memcmp(const void *buf1, const void *buf2, pj_size_t size)
|
||||
{
|
||||
return memcmp(buf1, buf2, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find character in the buffer.
|
||||
*
|
||||
* @param buf The buffer.
|
||||
* @param c The character to find.
|
||||
* @param size The size to check.
|
||||
*
|
||||
* @return the pointer to location where the character is found, or NULL if
|
||||
* not found.
|
||||
*/
|
||||
PJ_INLINE(void*) pj_memchr(const void *buf, int c, pj_size_t size)
|
||||
{
|
||||
return memchr(buf, c, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#if PJ_FUNCTIONS_ARE_INLINED
|
||||
# include <pj/string_i.h>
|
||||
#endif
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_STRING_H__ */
|
||||
|
|
@ -0,0 +1,162 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/string_i.h 8 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
PJ_IDEF(pj_str_t) pj_str(char *str)
|
||||
{
|
||||
pj_str_t dst;
|
||||
dst.ptr = str;
|
||||
dst.slen = str ? strlen(str) : 0;
|
||||
return dst;
|
||||
}
|
||||
|
||||
PJ_IDEF(pj_str_t*) pj_strdup(pj_pool_t *pool,
|
||||
pj_str_t *dst,
|
||||
const pj_str_t *src)
|
||||
{
|
||||
if (src->slen) {
|
||||
dst->ptr = (char*)pj_pool_alloc(pool, src->slen);
|
||||
pj_memcpy(dst->ptr, src->ptr, src->slen);
|
||||
}
|
||||
dst->slen = src->slen;
|
||||
return dst;
|
||||
}
|
||||
|
||||
PJ_IDEF(pj_str_t*) pj_strdup_with_null( pj_pool_t *pool,
|
||||
pj_str_t *dst,
|
||||
const pj_str_t *src)
|
||||
{
|
||||
if (src->slen) {
|
||||
dst->ptr = (char*)pj_pool_alloc(pool, src->slen+1);
|
||||
pj_memcpy(dst->ptr, src->ptr, src->slen);
|
||||
} else {
|
||||
dst->ptr = (char*)pj_pool_alloc(pool, 1);
|
||||
}
|
||||
dst->slen = src->slen;
|
||||
dst->ptr[dst->slen] = '\0';
|
||||
return dst;
|
||||
}
|
||||
|
||||
PJ_IDEF(pj_str_t*) pj_strdup2(pj_pool_t *pool,
|
||||
pj_str_t *dst,
|
||||
const char *src)
|
||||
{
|
||||
dst->slen = src ? strlen(src) : 0;
|
||||
if (dst->slen) {
|
||||
dst->ptr = (char*)pj_pool_alloc(pool, dst->slen);
|
||||
pj_memcpy(dst->ptr, src, dst->slen);
|
||||
} else {
|
||||
dst->ptr = NULL;
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
||||
PJ_IDEF(pj_str_t) pj_strdup3(pj_pool_t *pool, const char *src)
|
||||
{
|
||||
pj_str_t temp;
|
||||
pj_strdup2(pool, &temp, src);
|
||||
return temp;
|
||||
}
|
||||
|
||||
PJ_IDEF(pj_str_t*) pj_strassign( pj_str_t *dst, pj_str_t *src )
|
||||
{
|
||||
dst->ptr = src->ptr;
|
||||
dst->slen = src->slen;
|
||||
return dst;
|
||||
}
|
||||
|
||||
PJ_IDEF(pj_str_t*) pj_strcpy(pj_str_t *dst, const pj_str_t *src)
|
||||
{
|
||||
dst->slen = src->slen;
|
||||
if (src->slen > 0)
|
||||
pj_memcpy(dst->ptr, src->ptr, src->slen);
|
||||
return dst;
|
||||
}
|
||||
|
||||
PJ_IDEF(pj_str_t*) pj_strcpy2(pj_str_t *dst, const char *src)
|
||||
{
|
||||
dst->slen = src ? strlen(src) : 0;
|
||||
if (dst->slen > 0)
|
||||
pj_memcpy(dst->ptr, src, dst->slen);
|
||||
return dst;
|
||||
}
|
||||
|
||||
PJ_IDEF(int) pj_strcmp( const pj_str_t *str1, const pj_str_t *str2)
|
||||
{
|
||||
pj_ssize_t diff;
|
||||
|
||||
diff = str1->slen - str2->slen;
|
||||
if (diff) {
|
||||
return (int)diff;
|
||||
} else if (str1->ptr) {
|
||||
return strncmp(str1->ptr, str2->ptr, str1->slen);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
PJ_IDEF(int) pj_strncmp( const pj_str_t *str1, const pj_str_t *str2,
|
||||
pj_size_t len)
|
||||
{
|
||||
return (str1->ptr && str2->ptr) ? strncmp(str1->ptr, str2->ptr, len) :
|
||||
(str1->ptr == str2->ptr ? 0 : 1);
|
||||
}
|
||||
|
||||
PJ_IDEF(int) pj_strncmp2( const pj_str_t *str1, const char *str2,
|
||||
pj_size_t len)
|
||||
{
|
||||
return (str1->ptr && str2) ? strncmp(str1->ptr, str2, len) :
|
||||
(str1->ptr==str2 ? 0 : 1);
|
||||
}
|
||||
|
||||
PJ_IDEF(int) pj_strcmp2( const pj_str_t *str1, const char *str2 )
|
||||
{
|
||||
return pj_strncmp2( str1, str2, str1->slen);
|
||||
}
|
||||
|
||||
PJ_IDEF(int) pj_stricmp( const pj_str_t *str1, const pj_str_t *str2)
|
||||
{
|
||||
pj_ssize_t diff;
|
||||
|
||||
diff = str1->slen - str2->slen;
|
||||
if (diff) {
|
||||
return (int)diff;
|
||||
} else {
|
||||
return strnicmp(str1->ptr, str2->ptr, str1->slen);
|
||||
}
|
||||
}
|
||||
|
||||
PJ_IDEF(int) pj_stricmp2( const pj_str_t *str1, const char *str2)
|
||||
{
|
||||
return (str1->ptr && str2) ? strnicmp(str1->ptr, str2, str1->slen) :
|
||||
(str1->ptr==str2 ? 0 : 1);
|
||||
}
|
||||
|
||||
PJ_IDEF(int) pj_strnicmp( const pj_str_t *str1, const pj_str_t *str2,
|
||||
pj_size_t len)
|
||||
{
|
||||
return (str1->ptr && str2->ptr) ? strnicmp(str1->ptr, str2->ptr, len) :
|
||||
(str1->ptr == str2->ptr ? 0 : 1);
|
||||
}
|
||||
|
||||
PJ_IDEF(int) pj_strnicmp2( const pj_str_t *str1, const char *str2,
|
||||
pj_size_t len)
|
||||
{
|
||||
return (str1->ptr && str2) ? strnicmp(str1->ptr, str2, len) :
|
||||
(str1->ptr == str2 ? 0 : 1);
|
||||
}
|
||||
|
||||
PJ_IDEF(void) pj_strcat(pj_str_t *dst, const pj_str_t *src)
|
||||
{
|
||||
if (src->slen) {
|
||||
pj_memcpy(dst->ptr + dst->slen, src->ptr, src->slen);
|
||||
dst->slen += src->slen;
|
||||
}
|
||||
}
|
||||
|
||||
PJ_IDEF(pj_str_t*) pj_strtrim( pj_str_t *str )
|
||||
{
|
||||
pj_strltrim(str);
|
||||
pj_strrtrim(str);
|
||||
return str;
|
||||
}
|
||||
|
|
@ -0,0 +1,123 @@
|
|||
#ifndef __PJ_STUN_H__
|
||||
#define __PJ_STUN_H__
|
||||
|
||||
#include <pj/types.h>
|
||||
#include <pj/sock.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
#define PJ_STUN_MAX_ATTR 16
|
||||
|
||||
typedef enum pj_stun_msg_type
|
||||
{
|
||||
PJ_STUN_BINDING_REQUEST = 0x0001,
|
||||
PJ_STUN_BINDING_RESPONSE = 0x0101,
|
||||
PJ_STUN_BINDING_ERROR_RESPONSE = 0x0111,
|
||||
PJ_STUN_SHARED_SECRET_REQUEST = 0x0002,
|
||||
PJ_STUN_SHARED_SECRET_RESPONSE = 0x0102,
|
||||
PJ_STUN_SHARED_SECRET_ERROR_RESPONSE = 0x0112
|
||||
} pj_stun_msg_type;
|
||||
|
||||
typedef enum pj_stun_attr_type
|
||||
{
|
||||
PJ_STUN_ATTR_MAPPED_ADDR = 1,
|
||||
PJ_STUN_ATTR_RESPONSE_ADDR,
|
||||
PJ_STUN_ATTR_CHANGE_REQUEST,
|
||||
PJ_STUN_ATTR_SOURCE_ADDR,
|
||||
PJ_STUN_ATTR_CHANGED_ADDR,
|
||||
PJ_STUN_ATTR_USERNAME,
|
||||
PJ_STUN_ATTR_PASSWORD,
|
||||
PJ_STUN_ATTR_MESSAGE_INTEGRITY,
|
||||
PJ_STUN_ATTR_ERROR_CODE,
|
||||
PJ_STUN_ATTR_UNKNOWN_ATTRIBUTES,
|
||||
PJ_STUN_ATTR_REFLECTED_FORM
|
||||
} pj_stun_attr_type;
|
||||
|
||||
typedef struct pj_stun_msg_hdr
|
||||
{
|
||||
pj_uint16_t type;
|
||||
pj_uint16_t length;
|
||||
pj_uint32_t tsx[4];
|
||||
} pj_stun_msg_hdr;
|
||||
|
||||
typedef struct pj_stun_attr_hdr
|
||||
{
|
||||
pj_uint16_t type;
|
||||
pj_uint16_t length;
|
||||
} pj_stun_attr_hdr;
|
||||
|
||||
typedef struct pj_stun_mapped_addr_attr
|
||||
{
|
||||
pj_stun_attr_hdr hdr;
|
||||
pj_uint8_t ignored;
|
||||
pj_uint8_t family;
|
||||
pj_uint16_t port;
|
||||
pj_uint32_t addr;
|
||||
} pj_stun_mapped_addr_attr;
|
||||
|
||||
typedef pj_stun_mapped_addr_attr pj_stun_response_addr_attr;
|
||||
typedef pj_stun_mapped_addr_attr pj_stun_changed_addr_attr;
|
||||
typedef pj_stun_mapped_addr_attr pj_stun_src_addr_attr;
|
||||
typedef pj_stun_mapped_addr_attr pj_stun_reflected_form_attr;
|
||||
|
||||
typedef struct pj_stun_change_request_attr
|
||||
{
|
||||
pj_stun_attr_hdr hdr;
|
||||
pj_uint32_t value;
|
||||
} pj_stun_change_request_attr;
|
||||
|
||||
typedef struct pj_stun_username_attr
|
||||
{
|
||||
pj_stun_attr_hdr hdr;
|
||||
pj_uint32_t value[1];
|
||||
} pj_stun_username_attr;
|
||||
|
||||
typedef pj_stun_username_attr pj_stun_password_attr;
|
||||
|
||||
typedef struct pj_stun_error_code_attr
|
||||
{
|
||||
pj_stun_attr_hdr hdr;
|
||||
pj_uint16_t ignored;
|
||||
pj_uint8_t err_class;
|
||||
pj_uint8_t number;
|
||||
char reason[4];
|
||||
} pj_stun_error_code_attr;
|
||||
|
||||
typedef struct pj_stun_msg
|
||||
{
|
||||
pj_stun_msg_hdr *hdr;
|
||||
int attr_count;
|
||||
pj_stun_attr_hdr *attr[PJ_STUN_MAX_ATTR];
|
||||
} pj_stun_msg;
|
||||
|
||||
/* STUN message API (stun.c). */
|
||||
|
||||
PJ_DECL(pj_status_t) pj_stun_create_bind_req( pj_pool_t *pool,
|
||||
void **msg, pj_size_t *len,
|
||||
pj_uint32_t id_hi,
|
||||
pj_uint32_t id_lo);
|
||||
PJ_DECL(pj_status_t) pj_stun_parse_msg( void *buf, pj_size_t len,
|
||||
pj_stun_msg *msg);
|
||||
PJ_DECL(void*) pj_stun_msg_find_attr( pj_stun_msg *msg, pj_stun_attr_type t);
|
||||
|
||||
/* STUN simple client API (stun_client.c) */
|
||||
enum pj_stun_err_code {
|
||||
PJ_STUN_ERR_MEMORY = (-2),
|
||||
PJ_STUN_ERR_RESOLVE = (-3),
|
||||
PJ_STUN_ERR_TRANSPORT = (-4),
|
||||
PJ_STUN_ERR_INVALID_MSG = (-5),
|
||||
PJ_STUN_ERR_NO_RESPONSE = (-6),
|
||||
PJ_STUN_ERR_SYMETRIC = (-7),
|
||||
};
|
||||
|
||||
PJ_DECL(pj_status_t) pj_stun_get_mapped_addr( pj_pool_factory *pf,
|
||||
int sock_cnt, pj_sock_t sock[],
|
||||
const pj_str_t *srv1, int port1,
|
||||
const pj_str_t *srv2, int port2,
|
||||
pj_sockaddr_in mapped_addr[]);
|
||||
PJ_DECL(const char*) pj_stun_get_err_msg(pj_status_t status);
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_STUN_H__ */
|
||||
|
|
@ -0,0 +1,237 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/timer.h 7 10/14/05 12:26a Bennylp $ */
|
||||
/* (C)1993-2003 Douglas C. Schmidt
|
||||
*
|
||||
* This file is originaly from ACE library by Doug Schmidt
|
||||
* ACE(TM), TAO(TM) and CIAO(TM) are copyrighted by Douglas C. Schmidt and his research
|
||||
* group at Washington University, University of California, Irvine, and Vanderbilt
|
||||
* University Copyright (c) 1993-2003, all rights reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __PJ_TIMER_H__
|
||||
#define __PJ_TIMER_H__
|
||||
|
||||
/**
|
||||
* @file timer.h
|
||||
* @brief Timer Heap
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_TIMER Timer Heap Management.
|
||||
* @ingroup PJ_MISC
|
||||
* @brief
|
||||
* The timer scheduling implementation here is based on ACE library's
|
||||
* ACE_Timer_Heap, with only little modification to suit our library's style
|
||||
* (I even left most of the comments in the original source).
|
||||
*
|
||||
* To quote the original quote in ACE_Timer_Heap_T class:
|
||||
*
|
||||
* This implementation uses a heap-based callout queue of
|
||||
* absolute times. Therefore, in the average and worst case,
|
||||
* scheduling, canceling, and expiring timers is O(log N) (where
|
||||
* N is the total number of timers). In addition, we can also
|
||||
* preallocate as many \a ACE_Timer_Nodes as there are slots in
|
||||
* the heap. This allows us to completely remove the need for
|
||||
* dynamic memory allocation, which is important for real-time
|
||||
* systems.
|
||||
* @{
|
||||
*
|
||||
* \section pj_timer_examples_sec Examples
|
||||
*
|
||||
* For some examples on how to use the timer heap, please see the link below.
|
||||
*
|
||||
* - \ref page_pjlib_timer_test
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* The type for internal timer ID.
|
||||
*/
|
||||
typedef int pj_timer_id_t;
|
||||
|
||||
/**
|
||||
* Forward declaration for pj_timer_entry.
|
||||
*/
|
||||
struct pj_timer_entry;
|
||||
|
||||
/**
|
||||
* The type of callback function to be called by timer scheduler when a timer
|
||||
* has expired.
|
||||
*
|
||||
* @param timer_heap The timer heap.
|
||||
* @param entry Timer entry which timer's has expired.
|
||||
*/
|
||||
typedef void pj_timer_heap_callback(pj_timer_heap_t *timer_heap,
|
||||
struct pj_timer_entry *entry);
|
||||
|
||||
|
||||
/**
|
||||
* This structure represents an entry to the timer.
|
||||
*/
|
||||
struct pj_timer_entry
|
||||
{
|
||||
/**
|
||||
* User data to be associated with this entry.
|
||||
* Applications normally will put the instance of object that
|
||||
* owns the timer entry in this field.
|
||||
*/
|
||||
void *user_data;
|
||||
|
||||
/**
|
||||
* Arbitrary ID assigned by the user/owner of this entry.
|
||||
* Applications can use this ID to distinguish multiple
|
||||
* timer entries that share the same callback and user_data.
|
||||
*/
|
||||
int id;
|
||||
|
||||
/**
|
||||
* Callback to be called when the timer expires.
|
||||
*/
|
||||
pj_timer_heap_callback *cb;
|
||||
|
||||
/**
|
||||
* Internal unique timer ID, which is assigned by the timer heap.
|
||||
* Application should not touch this ID.
|
||||
*/
|
||||
pj_timer_id_t _timer_id;
|
||||
|
||||
/**
|
||||
* The future time when the timer expires, which the value is updated
|
||||
* by timer heap when the timer is scheduled.
|
||||
*/
|
||||
pj_time_val _timer_value;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Default flag for timer heap, indicates that synchronization will be
|
||||
* used.
|
||||
*/
|
||||
#define PJ_TIMER_HEAP_SYNCHRONIZE (0)
|
||||
|
||||
/**
|
||||
* Flag to indicate that thread synchronization is NOT needed for the
|
||||
* timer heap.
|
||||
*/
|
||||
#define PJ_TIMER_HEAP_NO_SYNCHRONIZE (1)
|
||||
|
||||
/**
|
||||
* Calculate memory size required to create a timer heap.
|
||||
*
|
||||
* @param count Number of timer entries to be supported.
|
||||
* @return Memory size requirement in bytes.
|
||||
*/
|
||||
PJ_DECL(pj_size_t) pj_timer_heap_mem_size(pj_size_t count);
|
||||
|
||||
/**
|
||||
* Create a timer heap.
|
||||
*
|
||||
* @param pool The pool where allocations in the timer heap will be
|
||||
* allocated. The timer heap will dynamicly allocate
|
||||
* more storate from the pool if the number of timer
|
||||
* entries registered is more than the size originally
|
||||
* requested when calling this function.
|
||||
* @param count The maximum number of timer entries to be supported
|
||||
* initially. If the application registers more entries
|
||||
* during runtime, then the timer heap will resize.
|
||||
* @param flag Creation flag, currently only PJ_TIMER_HEAP_NO_SYNCHRONIZE
|
||||
* is recognized..
|
||||
* @param ht Pointer to receive the created timer heap.
|
||||
*
|
||||
* @return PJ_SUCCESS, or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_timer_heap_create( pj_pool_t *pool,
|
||||
pj_size_t count,
|
||||
unsigned flag,
|
||||
pj_timer_heap_t **ht);
|
||||
|
||||
/**
|
||||
* Initialize a timer entry. Application should call this function at least
|
||||
* once before scheduling the entry to the timer heap, to properly initialize
|
||||
* the timer entry.
|
||||
*
|
||||
* @param entry The timer entry to be initialized.
|
||||
* @param id Arbitrary ID assigned by the user/owner of this entry.
|
||||
* Applications can use this ID to distinguish multiple
|
||||
* timer entries that share the same callback and user_data.
|
||||
* @param user_data User data to be associated with this entry.
|
||||
* Applications normally will put the instance of object that
|
||||
* owns the timer entry in this field.
|
||||
* @param cb Callback function to be called when the timer elapses.
|
||||
*
|
||||
* @return The timer entry itself.
|
||||
*/
|
||||
PJ_DECL(pj_timer_entry*) pj_timer_entry_init( pj_timer_entry *entry,
|
||||
int id,
|
||||
void *user_data,
|
||||
pj_timer_heap_callback *cb );
|
||||
|
||||
/**
|
||||
* Schedule a timer entry which will expire AFTER the specified delay.
|
||||
*
|
||||
* @param ht The timer heap.
|
||||
* @param entry The entry to be registered.
|
||||
* @param delay The interval to expire.
|
||||
* @return PJ_SUCCESS, or the appropriate error code.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_timer_heap_schedule( pj_timer_heap_t *ht,
|
||||
pj_timer_entry *entry,
|
||||
const pj_time_val *delay);
|
||||
|
||||
/**
|
||||
* Cancel a previously registered timer.
|
||||
*
|
||||
* @param ht The timer heap.
|
||||
* @param entry The entry to be cancelled.
|
||||
* @return The number of timer cancelled, which should be one if the
|
||||
* entry has really been registered, or zero if no timer was
|
||||
* cancelled.
|
||||
*/
|
||||
PJ_DECL(int) pj_timer_heap_cancel( pj_timer_heap_t *ht,
|
||||
pj_timer_entry *entry);
|
||||
|
||||
/**
|
||||
* Get the number of timer entries.
|
||||
*
|
||||
* @param ht The timer heap.
|
||||
* @return The number of timer entries.
|
||||
*/
|
||||
PJ_DECL(pj_size_t) pj_timer_heap_count( pj_timer_heap_t *ht );
|
||||
|
||||
/**
|
||||
* Get the earliest time registered in the timer heap. The timer heap
|
||||
* MUST have at least one timer being scheduled (application should use
|
||||
* #pj_timer_heap_count() before calling this function).
|
||||
*
|
||||
* @param ht The timer heap.
|
||||
* @param timeval The time deadline of the earliest timer entry.
|
||||
*
|
||||
* @return PJ_SUCCESS, or PJ_ENOTFOUND if no entry is scheduled.
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_timer_heap_earliest_time( pj_timer_heap_t *ht,
|
||||
pj_time_val *timeval);
|
||||
|
||||
/**
|
||||
* Poll the timer heap, check for expired timers and call the callback for
|
||||
* each of the expired timers.
|
||||
*
|
||||
* @param ht The timer heap.
|
||||
* @param next_delay If this parameter is not NULL, it will be filled up with
|
||||
* the time delay until the next timer elapsed, or -1 in
|
||||
* the sec part if no entry exist.
|
||||
* @return The number of timers expired.
|
||||
*/
|
||||
PJ_DECL(int) pj_timer_heap_poll( pj_timer_heap_t *ht, pj_time_val *next_delay);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_TIMER_H__ */
|
||||
|
|
@ -0,0 +1,418 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/types.h 11 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_TYPES_H__
|
||||
#define __PJ_TYPES_H__
|
||||
|
||||
|
||||
/**
|
||||
* @defgroup PJ PJ Library
|
||||
*/
|
||||
/**
|
||||
* @file types.h
|
||||
* @brief Declaration of basic types and utility.
|
||||
*/
|
||||
/**
|
||||
* @defgroup PJ_BASIC Basic Data Types and Library Functionality.
|
||||
* @ingroup PJ_DS
|
||||
* @{
|
||||
*/
|
||||
#include <pj/config.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/** Unsigned 32bit integer. */
|
||||
typedef int pj_int32_t;
|
||||
|
||||
/** Signed 32bit integer. */
|
||||
typedef unsigned int pj_uint32_t;
|
||||
|
||||
/** Unsigned 16bit integer. */
|
||||
typedef short pj_int16_t;
|
||||
|
||||
/** Signed 16bit integer. */
|
||||
typedef unsigned short pj_uint16_t;
|
||||
|
||||
/** Unsigned 8bit integer. */
|
||||
typedef signed char pj_int8_t;
|
||||
|
||||
/** Signed 16bit integer. */
|
||||
typedef unsigned char pj_uint8_t;
|
||||
|
||||
/** Large unsigned integer. */
|
||||
typedef size_t pj_size_t;
|
||||
|
||||
/** Large signed integer. */
|
||||
typedef long pj_ssize_t;
|
||||
|
||||
/** Status code. */
|
||||
typedef int pj_status_t;
|
||||
|
||||
/** Boolean. */
|
||||
typedef int pj_bool_t;
|
||||
|
||||
/** Status is OK. */
|
||||
#define PJ_SUCCESS 0
|
||||
|
||||
/** True value. */
|
||||
#define PJ_TRUE 1
|
||||
|
||||
/** False value. */
|
||||
#define PJ_FALSE 0
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
* Data structure types.
|
||||
*/
|
||||
/**
|
||||
* This type is used as replacement to legacy C string, and used throughout
|
||||
* the library. By convention, the string is NOT null terminated.
|
||||
*/
|
||||
struct pj_str_t
|
||||
{
|
||||
/** Buffer pointer, which is by convention NOT null terminated. */
|
||||
char *ptr;
|
||||
|
||||
/** The length of the string. */
|
||||
pj_ssize_t slen;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* The opaque data type for linked list, which is used as arguments throughout
|
||||
* the linked list operations.
|
||||
*/
|
||||
typedef void pj_list_type;
|
||||
|
||||
/**
|
||||
* List.
|
||||
*/
|
||||
typedef struct pj_list pj_list;
|
||||
|
||||
/**
|
||||
* Opaque data type for hash tables.
|
||||
*/
|
||||
typedef struct pj_hash_table_t pj_hash_table_t;
|
||||
|
||||
/**
|
||||
* Opaque data type for hash entry (only used internally by hash table).
|
||||
*/
|
||||
typedef struct pj_hash_entry pj_hash_entry;
|
||||
|
||||
/**
|
||||
* Data type for hash search iterator.
|
||||
* This structure should be opaque, however applications need to declare
|
||||
* concrete variable of this type, that's why the declaration is visible here.
|
||||
*/
|
||||
typedef struct pj_hash_iterator_t
|
||||
{
|
||||
pj_uint32_t index; /**< Internal index. */
|
||||
pj_hash_entry *entry; /**< Internal entry. */
|
||||
} pj_hash_iterator_t;
|
||||
|
||||
|
||||
/**
|
||||
* Forward declaration for memory pool factory.
|
||||
*/
|
||||
typedef struct pj_pool_factory pj_pool_factory;
|
||||
|
||||
/**
|
||||
* Opaque data type for memory pool.
|
||||
*/
|
||||
typedef struct pj_pool_t pj_pool_t;
|
||||
|
||||
/**
|
||||
* Forward declaration for caching pool, a pool factory implementation.
|
||||
*/
|
||||
typedef struct pj_caching_pool pj_caching_pool;
|
||||
|
||||
/**
|
||||
* This type is used as replacement to legacy C string, and used throughout
|
||||
* the library.
|
||||
*/
|
||||
typedef struct pj_str_t pj_str_t;
|
||||
|
||||
/**
|
||||
* Opaque data type for I/O Queue structure.
|
||||
*/
|
||||
typedef struct pj_ioqueue_t pj_ioqueue_t;
|
||||
|
||||
/**
|
||||
* Opaque data type for key that identifies a handle registered to the
|
||||
* I/O queue framework.
|
||||
*/
|
||||
typedef struct pj_ioqueue_key_t pj_ioqueue_key_t;
|
||||
|
||||
/**
|
||||
* Opaque data to identify timer heap.
|
||||
*/
|
||||
typedef struct pj_timer_heap_t pj_timer_heap_t;
|
||||
|
||||
/**
|
||||
* Forward declaration for timer entry.
|
||||
*/
|
||||
typedef struct pj_timer_entry pj_timer_entry;
|
||||
|
||||
/**
|
||||
* Opaque data type for atomic operations.
|
||||
*/
|
||||
typedef struct pj_atomic_t pj_atomic_t;
|
||||
|
||||
/**
|
||||
* Value type of an atomic variable.
|
||||
*/
|
||||
typedef PJ_ATOMIC_VALUE_TYPE pj_atomic_value_t;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/** Thread handle. */
|
||||
typedef struct pj_thread_t pj_thread_t;
|
||||
|
||||
/** Lock object. */
|
||||
typedef struct pj_lock_t pj_lock_t;
|
||||
|
||||
/** Mutex handle. */
|
||||
typedef struct pj_mutex_t pj_mutex_t;
|
||||
|
||||
/** Semaphore handle. */
|
||||
typedef struct pj_sem_t pj_sem_t;
|
||||
|
||||
/** Event object. */
|
||||
typedef struct pj_event_t pj_event_t;
|
||||
|
||||
/** Unidirectional stream pipe object. */
|
||||
typedef struct pj_pipe_t pj_pipe_t;
|
||||
|
||||
/** Operating system handle. */
|
||||
typedef void *pj_oshandle_t;
|
||||
|
||||
/** Socket handle. */
|
||||
typedef long pj_sock_t;
|
||||
|
||||
/** Generic socket address. */
|
||||
typedef void pj_sockaddr_t;
|
||||
|
||||
/** Color type. */
|
||||
typedef unsigned int pj_color_t;
|
||||
|
||||
/** Exception id. */
|
||||
typedef int pj_exception_id_t;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/** Utility macro to compute the number of elements in static array. */
|
||||
#define PJ_ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
|
||||
|
||||
/** Maximum value for signed 32-bit integer. */
|
||||
#define PJ_MAXINT32 0x7FFFFFFFL
|
||||
|
||||
/**
|
||||
* Length of object names.
|
||||
*/
|
||||
#define PJ_MAX_OBJ_NAME 16
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
* General.
|
||||
*/
|
||||
/**
|
||||
* Initialize the PJ Library.
|
||||
* This function must be called before using the library. The purpose of this
|
||||
* function is to initialize static library data, such as character table used
|
||||
* in random string generation, and to initialize operating system dependent
|
||||
* functionality (such as WSAStartup() in Windows).
|
||||
*/
|
||||
PJ_DECL(pj_status_t) pj_init(void);
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
/**
|
||||
* @addtogroup PJ_TIME Time Data Type and Manipulation.
|
||||
* @ingroup PJ_MISC
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Representation of time value in this library.
|
||||
* This type can be used to represent either an interval or a specific time
|
||||
* or date.
|
||||
*/
|
||||
typedef struct pj_time_val
|
||||
{
|
||||
/** The seconds part of the time. */
|
||||
long sec;
|
||||
|
||||
/** The miliseconds fraction of the time. */
|
||||
long msec;
|
||||
|
||||
} pj_time_val;
|
||||
|
||||
/**
|
||||
* Normalize the value in time value.
|
||||
* @param t Time value to be normalized.
|
||||
*/
|
||||
PJ_DECL(void) pj_time_val_normalize(pj_time_val *t);
|
||||
|
||||
/**
|
||||
* Get the total time value in miliseconds. This is the same as
|
||||
* multiplying the second part with 1000 and then add the miliseconds
|
||||
* part to the result.
|
||||
*
|
||||
* @param t The time value.
|
||||
* @return Total time in miliseconds.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_TIME_VAL_MSEC(t) ((t).sec * 1000 + (t).msec)
|
||||
|
||||
/**
|
||||
* This macro will check if \a t1 is equal to \a t2.
|
||||
*
|
||||
* @param t1 The first time value to compare.
|
||||
* @param t2 The second time value to compare.
|
||||
* @return Non-zero if both time values are equal.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_TIME_VAL_EQ(t1, t2) ((t1).sec==(t2).sec && (t1).msec==(t2).msec)
|
||||
|
||||
/**
|
||||
* This macro will check if \a t1 is greater than \a t2
|
||||
*
|
||||
* @param t1 The first time value to compare.
|
||||
* @param t2 The second time value to compare.
|
||||
* @return Non-zero if t1 is greater than t2.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_TIME_VAL_GT(t1, t2) ((t1).sec>(t2).sec || \
|
||||
((t1).sec==(t2).sec && (t1).msec>(t2).msec))
|
||||
|
||||
/**
|
||||
* This macro will check if \a t1 is greater than or equal to \a t2
|
||||
*
|
||||
* @param t1 The first time value to compare.
|
||||
* @param t2 The second time value to compare.
|
||||
* @return Non-zero if t1 is greater than or equal to t2.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_TIME_VAL_GTE(t1, t2) (PJ_TIME_VAL_GT(t1,t2) || \
|
||||
PJ_TIME_VAL_EQ(t1,t2))
|
||||
|
||||
/**
|
||||
* This macro will check if \a t1 is less than \a t2
|
||||
*
|
||||
* @param t1 The first time value to compare.
|
||||
* @param t2 The second time value to compare.
|
||||
* @return Non-zero if t1 is less than t2.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_TIME_VAL_LT(t1, t2) (!(PJ_TIME_VAL_GTE(t1,t2)))
|
||||
|
||||
/**
|
||||
* This macro will check if \a t1 is less than or equal to \a t2.
|
||||
*
|
||||
* @param t1 The first time value to compare.
|
||||
* @param t2 The second time value to compare.
|
||||
* @return Non-zero if t1 is less than or equal to t2.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_TIME_VAL_LTE(t1, t2) (!PJ_TIME_VAL_GT(t1, t2))
|
||||
|
||||
/**
|
||||
* Add \a t2 to \a t1 and store the result in \a t1. Effectively
|
||||
*
|
||||
* this macro will expand as: (\a t1 += \a t2).
|
||||
* @param t1 The time value to add.
|
||||
* @param t2 The time value to be added to \a t1.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_TIME_VAL_ADD(t1, t2) do { \
|
||||
(t1).sec += (t2).sec; \
|
||||
(t1).msec += (t2).msec; \
|
||||
pj_time_val_normalize(&(t1)); \
|
||||
} while (0)
|
||||
|
||||
|
||||
/**
|
||||
* Substract \a t2 from \a t1 and store the result in \a t1. Effectively
|
||||
* this macro will expand as (\a t1 -= \a t2).
|
||||
*
|
||||
* @param t1 The time value to subsctract.
|
||||
* @param t2 The time value to be substracted from \a t1.
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define PJ_TIME_VAL_SUB(t1, t2) do { \
|
||||
(t1).sec -= (t2).sec; \
|
||||
(t1).msec -= (t2).msec; \
|
||||
pj_time_val_normalize(&(t1)); \
|
||||
} while (0)
|
||||
|
||||
|
||||
/**
|
||||
* This structure represent the parsed representation of time.
|
||||
* It is acquired by calling #pj_time_decode().
|
||||
*/
|
||||
typedef struct pj_parsed_time
|
||||
{
|
||||
/** This represents day of week where value zero means Sunday */
|
||||
int wday;
|
||||
|
||||
/** This represents day of the year, 0-365, where zero means
|
||||
* 1st of January.
|
||||
*/
|
||||
int yday;
|
||||
|
||||
/** This represents day of month: 1-31 */
|
||||
int day;
|
||||
|
||||
/** This represents month, with the value is 0 - 11 (zero is January) */
|
||||
int mon;
|
||||
|
||||
/** This represent the actual year (unlike in ANSI libc where
|
||||
* the value must be added by 1900).
|
||||
*/
|
||||
int year;
|
||||
|
||||
/** This represents the second part, with the value is 0-59 */
|
||||
int sec;
|
||||
|
||||
/** This represents the minute part, with the value is: 0-59 */
|
||||
int min;
|
||||
|
||||
/** This represents the hour part, with the value is 0-23 */
|
||||
int hour;
|
||||
|
||||
/** This represents the milisecond part, with the value is 0-999 */
|
||||
int msec;
|
||||
|
||||
} pj_parsed_time;
|
||||
|
||||
|
||||
/**
|
||||
* @} // Time Management
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
* Terminal.
|
||||
*/
|
||||
/**
|
||||
* Color code combination.
|
||||
*/
|
||||
enum {
|
||||
PJ_TERM_COLOR_R = 2, /**< Red */
|
||||
PJ_TERM_COLOR_G = 4, /**< Green */
|
||||
PJ_TERM_COLOR_B = 1, /**< Blue. */
|
||||
PJ_TERM_COLOR_BRIGHT = 8 /**< Bright mask. */
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
|
||||
#endif /* __PJ_TYPES_H__ */
|
||||
|
|
@ -0,0 +1,155 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pj/xml.h 4 10/14/05 12:26a Bennylp $ */
|
||||
|
||||
#ifndef __PJ_XML_H__
|
||||
#define __PJ_XML_H__
|
||||
|
||||
/**
|
||||
* @file xml.h
|
||||
* @brief PJLIB XML Parser/Helper.
|
||||
*/
|
||||
|
||||
#include <pj/types.h>
|
||||
#include <pj/list.h>
|
||||
|
||||
PJ_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* @defgroup PJ_XML XML Parser/Helper.
|
||||
* @ingroup PJ
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** Typedef for XML attribute. */
|
||||
typedef struct pj_xml_attr pj_xml_attr;
|
||||
|
||||
/** Typedef for XML nodes. */
|
||||
typedef struct pj_xml_node pj_xml_node;
|
||||
|
||||
/** This structure declares XML attribute. */
|
||||
struct pj_xml_attr
|
||||
{
|
||||
PJ_DECL_LIST_MEMBER(pj_xml_attr)
|
||||
pj_str_t name; /**< Attribute name. */
|
||||
pj_str_t value; /**< Attribute value. */
|
||||
};
|
||||
|
||||
/** This structure describes XML node head inside XML node structure.
|
||||
*/
|
||||
typedef struct pj_xml_node_head
|
||||
{
|
||||
PJ_DECL_LIST_MEMBER(pj_xml_node)
|
||||
} pj_xml_node_head;
|
||||
|
||||
/** This structure describes XML node. */
|
||||
struct pj_xml_node
|
||||
{
|
||||
PJ_DECL_LIST_MEMBER(pj_xml_node) /** List @a prev and @a next member */
|
||||
pj_str_t name; /** Node name. */
|
||||
pj_xml_attr attr_head; /** Attribute list. */
|
||||
pj_xml_node_head node_head; /** Node list. */
|
||||
pj_str_t content; /** Node content. */
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse XML message into XML document with a single root node. The parser
|
||||
* is capable of parsing XML processing instruction construct ("<?") and
|
||||
* XML comments ("<!--"), however such constructs will be ignored and will not
|
||||
* be included in the resulted XML node tree.
|
||||
*
|
||||
* @param pool Pool to allocate memory from.
|
||||
* @param msg The XML message to parse.
|
||||
* @param len The length of the message.
|
||||
*
|
||||
* @return XML root node, or NULL if the XML document can not be parsed.
|
||||
*/
|
||||
PJ_DECL(pj_xml_node*) pj_xml_parse( pj_pool_t *pool, char *msg, pj_size_t len);
|
||||
|
||||
|
||||
/**
|
||||
* Print XML into XML message. Note that the function WILL NOT NULL terminate
|
||||
* the output.
|
||||
*
|
||||
* @param node The XML node to print.
|
||||
* @param buf Buffer to hold the output message.
|
||||
* @param len The length of the buffer.
|
||||
* @param prolog If set to nonzero, will print XML prolog ("<?xml..")
|
||||
*
|
||||
* @return The size of the printed message, or -1 if there is not
|
||||
* sufficient space in the buffer to print the message.
|
||||
*/
|
||||
PJ_DECL(int) pj_xml_print( const pj_xml_node *node, char *buf, pj_size_t len,
|
||||
pj_bool_t include_prolog);
|
||||
|
||||
/**
|
||||
* Add node to another node.
|
||||
*
|
||||
* @param parent Parent node.
|
||||
* @param node Node to be added to parent.
|
||||
*/
|
||||
PJ_DECL(void) pj_xml_add_node( pj_xml_node *parent, pj_xml_node *node );
|
||||
|
||||
|
||||
/**
|
||||
* Add attribute to a node.
|
||||
*
|
||||
* @param node Node.
|
||||
* @param attr Attribute to add to node.
|
||||
*/
|
||||
PJ_DECL(void) pj_xml_add_attr( pj_xml_node *node, pj_xml_attr *attr );
|
||||
|
||||
/**
|
||||
* Find first node with the specified name.
|
||||
*
|
||||
* @param parent Parent node.
|
||||
* @param name Node name to find.
|
||||
*
|
||||
* @return XML node found or NULL.
|
||||
*/
|
||||
PJ_DECL(pj_xml_node*) pj_xml_find_node(pj_xml_node *parent, const pj_str_t *name);
|
||||
|
||||
/**
|
||||
* Find first node with the specified name.
|
||||
*
|
||||
* @param parent Parent node.
|
||||
* @param name Node name to find.
|
||||
*
|
||||
* @return XML node found or NULL.
|
||||
*/
|
||||
PJ_DECL(pj_xml_node*) pj_xml_find_next_node(pj_xml_node *parent, pj_xml_node *node,
|
||||
const pj_str_t *name);
|
||||
|
||||
/**
|
||||
* Find first attribute within a node with the specified name and optional value.
|
||||
*
|
||||
* @param node XML Node.
|
||||
* @param name Attribute name to find.
|
||||
* @param value Optional value to match.
|
||||
*
|
||||
* @return XML attribute found, or NULL.
|
||||
*/
|
||||
PJ_DECL(pj_xml_attr*) pj_xml_find_attr(pj_xml_node *node, const pj_str_t *name,
|
||||
const pj_str_t *value);
|
||||
|
||||
|
||||
/**
|
||||
* Find a direct child node with the specified name and match the function.
|
||||
*
|
||||
* @param node Parent node.
|
||||
* @param name Optional name.
|
||||
* @param data Data to be passed to matching function.
|
||||
* @param match Optional matching function.
|
||||
*
|
||||
* @return The first matched node, or NULL.
|
||||
*/
|
||||
PJ_DECL(pj_xml_node*) pj_xml_find( pj_xml_node *parent, const pj_str_t *name,
|
||||
const void *data,
|
||||
pj_bool_t (*match)(pj_xml_node *, const void*));
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
PJ_END_DECL
|
||||
|
||||
#endif /* __PJ_XML_H__ */
|
|
@ -0,0 +1,17 @@
|
|||
/* $Header: /pjproject/pjlib/src/pjlib++.hpp 1 7/05/05 12:58a Bennylp $ */
|
||||
#ifndef __PJLIBPP_H__
|
||||
#define __PJLIBPP_H__
|
||||
|
||||
#include <pj++/pool.hpp>
|
||||
#include <pj++/hash.hpp>
|
||||
//#include <pj++/ioqueue.hpp>
|
||||
#include <pj++/list.hpp>
|
||||
#include <pj++/os.hpp>
|
||||
#include <pj++/proactor.hpp>
|
||||
#include <pj++/scanner.hpp>
|
||||
#include <pj++/sock.hpp>
|
||||
#include <pj++/string.hpp>
|
||||
#include <pj++/timer.hpp>
|
||||
#include <pj++/tree.hpp>
|
||||
|
||||
#endif /* __PJLIBPP_H__ */
|
|
@ -0,0 +1,39 @@
|
|||
/* $Header: /pjproject-0.3/pjlib/include/pjlib.h 6 10/29/05 11:30a Bennylp $ */
|
||||
#ifndef __PJLIB_H__
|
||||
#define __PJLIB_H__
|
||||
|
||||
/**
|
||||
* @file pjlib.h
|
||||
* @brief Include all PJLIB header files.
|
||||
*/
|
||||
|
||||
#include <pj/addr_resolv.h>
|
||||
#include <pj/array.h>
|
||||
#include <pj/assert.h>
|
||||
#include <pj/ctype.h>
|
||||
#include <pj/errno.h>
|
||||
#include <pj/except.h>
|
||||
#include <pj/fifobuf.h>
|
||||
#include <pj/guid.h>
|
||||
#include <pj/hash.h>
|
||||
#include <pj/ioqueue.h>
|
||||
#include <pj/list.h>
|
||||
#include <pj/lock.h>
|
||||
#include <pj/log.h>
|
||||
#include <pj/md5.h>
|
||||
#include <pj/os.h>
|
||||
#include <pj/pool.h>
|
||||
#include <pj/rand.h>
|
||||
#include <pj/rbtree.h>
|
||||
#include <pj/scanner.h>
|
||||
#include <pj/sock.h>
|
||||
#include <pj/sock_select.h>
|
||||
#include <pj/string.h>
|
||||
#include <pj/stun.h>
|
||||
#include <pj/timer.h>
|
||||
#include <pj/xml.h>
|
||||
|
||||
#include <pj/compat/high_precision.h>
|
||||
|
||||
#endif /* __PJLIB_H__ */
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
/* $Header: /pjproject/pjlib/src/pj++/compiletest.cpp 4 8/24/05 10:29a Bennylp $ */
|
||||
#include <pjlib++.hpp>
|
||||
|
||||
|
||||
#if 0
|
||||
struct MyNode
|
||||
{
|
||||
PJ_DECL_LIST_MEMBER(struct MyNode)
|
||||
int data;
|
||||
};
|
||||
|
||||
int test()
|
||||
{
|
||||
typedef PJ_List<MyNode> MyList;
|
||||
MyList list;
|
||||
MyList::iterator it, end = list.end();
|
||||
|
||||
for (it=list.begin(); it!=end; ++it) {
|
||||
MyNode *n = *it;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int test_scan()
|
||||
{
|
||||
PJ_Scanner scan;
|
||||
PJ_String s;
|
||||
PJ_CharSpec cs;
|
||||
|
||||
scan.get(&cs, &s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int test_scan_c()
|
||||
{
|
||||
pj_scanner scan;
|
||||
pj_str_t s;
|
||||
pj_char_spec cs;
|
||||
|
||||
pj_scan_get(&scan, cs, &s);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,71 @@
|
|||
/* $Header: /pjproject/pjlib/src/pj++/hash.hpp 5 8/24/05 10:29a Bennylp $ */
|
||||
#ifndef __PJPP_HASH_H__
|
||||
#define __PJPP_HASH_H__
|
||||
|
||||
#include <pj++/types.hpp>
|
||||
#include <pj/hash.h>
|
||||
|
||||
class PJ_Hash_Table
|
||||
{
|
||||
public:
|
||||
class iterator
|
||||
{
|
||||
public:
|
||||
iterator() {}
|
||||
explicit iterator(pj_hash_table_t *h, pj_hash_iterator_t *i) : ht_(h), it_(i) {}
|
||||
iterator(const iterator &rhs) : ht_(rhs.ht_), it_(rhs.it_) {}
|
||||
void operator++() { it_ = pj_hash_next(ht_, it_); }
|
||||
bool operator==(const iterator &rhs) { return ht_ == rhs.ht_ && it_ == rhs.it_; }
|
||||
iterator & operator=(const iterator &rhs) { ht_=rhs.ht_; it_=rhs.it_; return *this; }
|
||||
private:
|
||||
pj_hash_table_t *ht_;
|
||||
pj_hash_iterator_t it_val_;
|
||||
pj_hash_iterator_t *it_;
|
||||
|
||||
friend class PJ_Hash_Table;
|
||||
};
|
||||
|
||||
static PJ_Hash_Table *create(PJ_Pool *pool, unsigned size)
|
||||
{
|
||||
return (PJ_Hash_Table*) pj_hash_create(pool->pool_(), size);
|
||||
}
|
||||
|
||||
static pj_uint32_t calc(pj_uint32_t initial_hval, const void *key, unsigned keylen)
|
||||
{
|
||||
return pj_hash_calc(initial_hval, key, keylen);
|
||||
}
|
||||
|
||||
pj_hash_table_t *hash_table_()
|
||||
{
|
||||
return (pj_hash_table_t*)this;
|
||||
}
|
||||
|
||||
void *get(const void *key, unsigned keylen)
|
||||
{
|
||||
return pj_hash_get(this->hash_table_(), key, keylen);
|
||||
}
|
||||
|
||||
void set(PJ_Pool *pool, const void *key, unsigned keylen, void *value)
|
||||
{
|
||||
pj_hash_set(pool->pool_(), this->hash_table_(), key, keylen, value);
|
||||
}
|
||||
|
||||
unsigned count()
|
||||
{
|
||||
return pj_hash_count(this->hash_table_());
|
||||
}
|
||||
|
||||
iterator begin()
|
||||
{
|
||||
iterator it(this->hash_table_(), NULL);
|
||||
it.it_ = pj_hash_first(this->hash_table_(), &it.it_val_);
|
||||
return it;
|
||||
}
|
||||
|
||||
iterator end()
|
||||
{
|
||||
return iterator(this->hash_table_(), NULL);
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* __PJPP_HASH_H__ */
|
|
@ -0,0 +1,172 @@
|
|||
/* $Header: /pjproject/pjlib/src/pj++/ioqueue.hpp 4 8/24/05 10:29a Bennylp $ */
|
||||
#ifndef __PJPP_IOQUEUE_H__
|
||||
#define __PJPP_IOQUEUE_H__
|
||||
|
||||
#include <pj++/sock.hpp>
|
||||
#include <pj++/pool.hpp>
|
||||
#include <pj++/types.hpp>
|
||||
#include <pj/ioqueue.h>
|
||||
|
||||
class PJ_IOQueue;
|
||||
|
||||
class PJ_IOQueue_Event_Handler
|
||||
{
|
||||
public:
|
||||
virtual ~PJ_IOQueue_Event_Handler()
|
||||
{
|
||||
}
|
||||
|
||||
pj_ioqueue_key_t* get_key() const
|
||||
{
|
||||
return key_;
|
||||
}
|
||||
|
||||
protected:
|
||||
//
|
||||
// Override this to get notification from I/O Queue
|
||||
//
|
||||
virtual void on_read_complete(pj_ssize_t bytes_read)
|
||||
{
|
||||
}
|
||||
|
||||
virtual void on_write_complete(pj_ssize_t bytes_sent)
|
||||
{
|
||||
}
|
||||
|
||||
virtual void on_accept_complete(int status)
|
||||
{
|
||||
}
|
||||
|
||||
virtual void on_connect_complete(int status)
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
PJ_IOQueue_Event_Handler()
|
||||
: ioqueue_(NULL), key_(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
PJ_IOQueue *ioqueue_;
|
||||
pj_ioqueue_key_t *key_;
|
||||
|
||||
static void read_complete_cb(pj_ioqueue_key_t *key, pj_ssize_t bytes_read)
|
||||
{
|
||||
PJ_IOQueue_Event_Handler *handler =
|
||||
(PJ_IOQueue_Event_Handler*)pj_ioqueue_get_user_data(key);
|
||||
handler->on_read_complete(bytes_read);
|
||||
}
|
||||
|
||||
static void write_complete_cb(pj_ioqueue_key_t *key, pj_ssize_t bytes_sent);
|
||||
static void accept_complete_cb(pj_ioqueue_key_t *key, int status);
|
||||
static void connect_complete_cb(pj_ioqueue_key_t *key, int status);
|
||||
|
||||
friend class PJ_IOQueue;
|
||||
};
|
||||
|
||||
|
||||
class PJ_IOQueue
|
||||
{
|
||||
typedef pj_ioqueue_t *B_;
|
||||
|
||||
public:
|
||||
typedef pj_ioqueue_key_t Key;
|
||||
|
||||
enum Operation
|
||||
{
|
||||
OP_NONE = PJ_IOQUEUE_OP_NONE,
|
||||
OP_READ = PJ_IOQUEUE_OP_READ,
|
||||
OP_RECV_FROM = PJ_IOQUEUE_OP_RECV_FROM,
|
||||
OP_WRITE = PJ_IOQUEUE_OP_WRITE,
|
||||
OP_SEND_TO = PJ_IOQUEUE_OP_SEND_TO,
|
||||
#if PJ_HAS_TCP
|
||||
OP_ACCEPT = PJ_IOQUEUE_OP_ACCEPT,
|
||||
OP_CONNECT = PJ_IOQUEUE_OP_CONNECT,
|
||||
#endif
|
||||
};
|
||||
|
||||
enum Status
|
||||
{
|
||||
IS_PENDING = PJ_IOQUEUE_PENDING
|
||||
};
|
||||
|
||||
static PJ_IOQueue *create(PJ_Pool *pool, pj_size_t max_fd)
|
||||
{
|
||||
return (PJ_IOQueue*) pj_ioqueue_create(pool->pool_(), max_fd);
|
||||
}
|
||||
|
||||
operator B_()
|
||||
{
|
||||
return (pj_ioqueue_t*)(PJ_IOQueue*)this;
|
||||
}
|
||||
|
||||
pj_ioqueue_t *ioq_()
|
||||
{
|
||||
return (B_)this;
|
||||
}
|
||||
|
||||
void destroy()
|
||||
{
|
||||
pj_ioqueue_destroy(this->ioq_());
|
||||
}
|
||||
|
||||
Key *register_handle(PJ_Pool *pool, pj_oshandle_t hnd, void *user_data)
|
||||
{
|
||||
return pj_ioqueue_register(pool->pool_(), this->ioq_(), hnd, user_data);
|
||||
}
|
||||
|
||||
Key *register_socket(PJ_Pool *pool, pj_sock_t hnd, void *user_data)
|
||||
{
|
||||
return pj_ioqueue_register(pool->pool_(), this->ioq_(), (pj_oshandle_t)hnd, user_data);
|
||||
}
|
||||
|
||||
pj_status_t unregister(Key *key)
|
||||
{
|
||||
return pj_ioqueue_unregister(this->ioq_(), key);
|
||||
}
|
||||
|
||||
void *get_user_data(Key *key)
|
||||
{
|
||||
return pj_ioqueue_get_user_data(key);
|
||||
}
|
||||
|
||||
int poll(Key **key, pj_ssize_t *bytes_status, Operation *op, const PJ_Time_Val *timeout)
|
||||
{
|
||||
return pj_ioqueue_poll(this->ioq_(), key, bytes_status, (pj_ioqueue_operation_e*)op, timeout);
|
||||
}
|
||||
|
||||
#if PJ_HAS_TCP
|
||||
pj_status_t connect(Key *key, const pj_sockaddr_t *addr, int addrlen)
|
||||
{
|
||||
return pj_ioqueue_connect(this->ioq_(), key, addr, addrlen);
|
||||
}
|
||||
|
||||
pj_status_t accept(Key *key, PJ_Socket *sock, pj_sockaddr_t *local, pj_sockaddr_t *remote, int *addrlen)
|
||||
{
|
||||
return pj_ioqueue_accept(this->ioq_(), key, &sock->get_handle(), local, remote, addrlen);
|
||||
}
|
||||
#endif
|
||||
|
||||
int read(Key *key, void *buf, pj_size_t len)
|
||||
{
|
||||
return pj_ioqueue_read(this->ioq_(), key, buf, len);
|
||||
}
|
||||
|
||||
int recvfrom(Key *key, void *buf, pj_size_t len, pj_sockaddr_t *addr, int *addrlen)
|
||||
{
|
||||
return pj_ioqueue_recvfrom(this->ioq_(), key, buf, len, addr, addrlen);
|
||||
}
|
||||
|
||||
int write(Key *key, const void *data, pj_size_t len)
|
||||
{
|
||||
return pj_ioqueue_write(this->ioq_(), key, data, len);
|
||||
}
|
||||
|
||||
int sendto(Key *key, const void *data, pj_size_t len, const pj_sockaddr_t *addr, int addrlen)
|
||||
{
|
||||
return pj_ioqueue_sendto(this->ioq_(), key, data, len, addr, addrlen);
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* __PJPP_IOQUEUE_H__ */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue