Browse Source

* json-rpc examples, and compile it as well

git-svn-id: trunk@15361 -
michael 15 năm trước cách đây
mục cha
commit
3d414fe91b

+ 9 - 0
.gitattributes

@@ -2164,6 +2164,15 @@ packages/fcl-res/xml/versiontypes.xml svneol=native#text/plain
 packages/fcl-res/xml/winpeimagereader.xml svneol=native#text/plain
 packages/fcl-res/xml/winpeimagereader.xml svneol=native#text/plain
 packages/fcl-web/Makefile svneol=native#text/plain
 packages/fcl-web/Makefile svneol=native#text/plain
 packages/fcl-web/Makefile.fpc svneol=native#text/plain
 packages/fcl-web/Makefile.fpc svneol=native#text/plain
+packages/fcl-web/examples/jsonrpc/demo1/demo.lpi svneol=native#text/plain
+packages/fcl-web/examples/jsonrpc/demo1/demo.lpr svneol=native#text/plain
+packages/fcl-web/examples/jsonrpc/demo1/echo.in svneol=native#text/plain
+packages/fcl-web/examples/jsonrpc/demo1/echobatch.in svneol=native#text/plain
+packages/fcl-web/examples/jsonrpc/demo1/extdirect.in svneol=native#text/plain
+packages/fcl-web/examples/jsonrpc/demo1/notification.in svneol=native#text/plain
+packages/fcl-web/examples/jsonrpc/demo1/wmdemo.lfm svneol=native#text/plain
+packages/fcl-web/examples/jsonrpc/demo1/wmdemo.lrs svneol=native#text/plain
+packages/fcl-web/examples/jsonrpc/demo1/wmdemo.pp svneol=native#text/plain
 packages/fcl-web/examples/webdata/demo/createusers.lpi svneol=native#text/plain
 packages/fcl-web/examples/webdata/demo/createusers.lpi svneol=native#text/plain
 packages/fcl-web/examples/webdata/demo/createusers.lpr svneol=native#text/plain
 packages/fcl-web/examples/webdata/demo/createusers.lpr svneol=native#text/plain
 packages/fcl-web/examples/webdata/demo/extgrid-json.html svneol=native#text/plain
 packages/fcl-web/examples/webdata/demo/extgrid-json.html svneol=native#text/plain

+ 165 - 149
packages/fcl-web/Makefile

@@ -1,10 +1,10 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2010/05/22]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2009/11/05]
 #
 #
 default: all
 default: all
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-solaris x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded mipsel-linux
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded
 BSDs = freebsd netbsd openbsd darwin
 BSDs = freebsd netbsd openbsd darwin
-UNIXs = linux $(BSDs) solaris qnx haiku
+UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
 LIMIT83fs = go32v2 os2 emx watcom
 OSNeedsComspecToRunBatch = go32v2 watcom
 OSNeedsComspecToRunBatch = go32v2 watcom
 FORCE:
 FORCE:
@@ -59,11 +59,9 @@ endif
 endif
 endif
 ifdef COMSPEC
 ifdef COMSPEC
 ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
 ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
-ifndef RUNBATCH
 RUNBATCH=$(COMSPEC) /C
 RUNBATCH=$(COMSPEC) /C
 endif
 endif
 endif
 endif
-endif
 ifdef inUnix
 ifdef inUnix
 PATHSEP=/
 PATHSEP=/
 else
 else
@@ -267,187 +265,178 @@ PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(F
 override PACKAGE_NAME=fcl-web
 override PACKAGE_NAME=fcl-web
 override PACKAGE_VERSION=2.5.1
 override PACKAGE_VERSION=2.5.1
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-haiku)
 ifeq ($(FULL_TARGET),i386-haiku)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netware)
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
 ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_DIRS+=src/base src/webdata
-endif
-ifeq ($(FULL_TARGET),i386-nativent)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
 ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_DIRS+=src/base src/webdata
-endif
-ifeq ($(FULL_TARGET),x86_64-solaris)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
 ifeq ($(FULL_TARGET),arm-darwin)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),arm-nds)
 ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
 ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
 ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),avr-embedded)
 ifeq ($(FULL_TARGET),avr-embedded)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
 ifeq ($(FULL_TARGET),armeb-linux)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
 ifeq ($(FULL_TARGET),armeb-embedded)
-override TARGET_DIRS+=src/base src/webdata
-endif
-ifeq ($(FULL_TARGET),mipsel-linux)
-override TARGET_DIRS+=src/base src/webdata
+override TARGET_DIRS+=src/base src/webdata src/jsonrpc
 endif
 endif
 override INSTALL_FPCPACKAGE=y
 override INSTALL_FPCPACKAGE=y
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
@@ -510,9 +499,6 @@ endif
 ifeq ($(FULL_TARGET),i386-symbian)
 ifeq ($(FULL_TARGET),i386-symbian)
 override COMPILER_OPTIONS+=-S2h
 override COMPILER_OPTIONS+=-S2h
 endif
 endif
-ifeq ($(FULL_TARGET),i386-nativent)
-override COMPILER_OPTIONS+=-S2h
-endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
 override COMPILER_OPTIONS+=-S2h
 override COMPILER_OPTIONS+=-S2h
 endif
 endif
@@ -576,9 +562,6 @@ endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 override COMPILER_OPTIONS+=-S2h
 override COMPILER_OPTIONS+=-S2h
 endif
 endif
-ifeq ($(FULL_TARGET),x86_64-solaris)
-override COMPILER_OPTIONS+=-S2h
-endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
 override COMPILER_OPTIONS+=-S2h
 override COMPILER_OPTIONS+=-S2h
 endif
 endif
@@ -630,9 +613,6 @@ endif
 ifeq ($(FULL_TARGET),armeb-embedded)
 ifeq ($(FULL_TARGET),armeb-embedded)
 override COMPILER_OPTIONS+=-S2h
 override COMPILER_OPTIONS+=-S2h
 endif
 endif
-ifeq ($(FULL_TARGET),mipsel-linux)
-override COMPILER_OPTIONS+=-S2h
-endif
 ifdef REQUIRE_UNITSDIR
 ifdef REQUIRE_UNITSDIR
 override UNITSDIR+=$(REQUIRE_UNITSDIR)
 override UNITSDIR+=$(REQUIRE_UNITSDIR)
 endif
 endif
@@ -1006,10 +986,6 @@ ifeq ($(OS_TARGET),symbian)
 SHAREDLIBEXT=.dll
 SHAREDLIBEXT=.dll
 SHORTSUFFIX=symbian
 SHORTSUFFIX=symbian
 endif
 endif
-ifeq ($(OS_TARGET),NativeNT)
-SHAREDLIBEXT=.dll
-SHORTSUFFIX=nativent
-endif
 else
 else
 ifeq ($(OS_TARGET),go32v1)
 ifeq ($(OS_TARGET),go32v1)
 PPUEXT=.pp1
 PPUEXT=.pp1
@@ -1738,18 +1714,6 @@ REQUIRE_PACKAGES_FCL-PROCESS=1
 REQUIRE_PACKAGES_HTTPD22=1
 REQUIRE_PACKAGES_HTTPD22=1
 REQUIRE_PACKAGES_FASTCGI=1
 REQUIRE_PACKAGES_FASTCGI=1
 endif
 endif
-ifeq ($(FULL_TARGET),i386-nativent)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
-REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
-endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_ICONVENC=1
 REQUIRE_PACKAGES_ICONVENC=1
@@ -2087,19 +2051,6 @@ REQUIRE_PACKAGES_FCL-PROCESS=1
 REQUIRE_PACKAGES_HTTPD22=1
 REQUIRE_PACKAGES_HTTPD22=1
 REQUIRE_PACKAGES_FASTCGI=1
 REQUIRE_PACKAGES_FASTCGI=1
 endif
 endif
-ifeq ($(FULL_TARGET),x86_64-solaris)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
-endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
 REQUIRE_PACKAGES_UNIVINT=1
 REQUIRE_PACKAGES_UNIVINT=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-BASE=1
@@ -2362,26 +2313,6 @@ REQUIRE_PACKAGES_FCL-PROCESS=1
 REQUIRE_PACKAGES_HTTPD22=1
 REQUIRE_PACKAGES_HTTPD22=1
 REQUIRE_PACKAGES_FASTCGI=1
 REQUIRE_PACKAGES_FASTCGI=1
 endif
 endif
-ifeq ($(FULL_TARGET),mipsel-linux)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
-endif
 ifdef REQUIRE_PACKAGES_FCL-BASE
 ifdef REQUIRE_PACKAGES_FCL-BASE
 PACKAGEDIR_FCL-BASE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-base/Makefile.fpc,$(PACKAGESDIR))))))
 PACKAGEDIR_FCL-BASE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-base/Makefile.fpc,$(PACKAGESDIR))))))
 ifneq ($(PACKAGEDIR_FCL-BASE),)
 ifneq ($(PACKAGEDIR_FCL-BASE),)
@@ -3154,7 +3085,7 @@ ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
 ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
 ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
 ifdef USETAR
 ifdef USETAR
 ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
 ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
-ZIPCMD_ZIP:=$(TARPROG) c$(TAROPT)f $(ZIPDESTFILE) *
+ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) *
 else
 else
 ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
 ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
 ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
 ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
@@ -3199,9 +3130,6 @@ fpc_zipdistinstall:
 ifdef EXEFILES
 ifdef EXEFILES
 override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
 override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
 endif
 endif
-ifdef CLEAN_PROGRAMS
-override CLEANEXEFILES+=$(addprefix $(TARGETDIRPREFIX),$(addsuffix $(EXEEXT), $(CLEAN_PROGRAMS)))
-endif
 ifdef CLEAN_UNITS
 ifdef CLEAN_UNITS
 override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
 override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
 endif
 endif
@@ -3248,9 +3176,6 @@ endif
 ifdef CLEANRSTFILES
 ifdef CLEANRSTFILES
 	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
 	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
 endif
 endif
-endif
-ifdef CLEAN_FILES
-	-$(DEL) $(CLEAN_FILES)
 endif
 endif
 	-$(DELTREE) units
 	-$(DELTREE) units
 	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
 	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
@@ -3377,246 +3302,292 @@ fpc_makefiles: fpc_makefile fpc_makefile_dirs
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-haiku)
 ifeq ($(FULL_TARGET),i386-haiku)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netware)
 ifeq ($(FULL_TARGET),i386-netware)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
 ifeq ($(FULL_TARGET),i386-watcom)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
 ifeq ($(FULL_TARGET),i386-netwlibc)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 ifeq ($(FULL_TARGET),i386-wince)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 ifeq ($(FULL_TARGET),i386-embedded)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
 ifeq ($(FULL_TARGET),i386-symbian)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
-endif
-ifeq ($(FULL_TARGET),i386-nativent)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
 ifeq ($(FULL_TARGET),m68k-atari)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
 ifeq ($(FULL_TARGET),m68k-embedded)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 ifeq ($(FULL_TARGET),powerpc-macos)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
 ifeq ($(FULL_TARGET),powerpc-embedded)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
-endif
-ifeq ($(FULL_TARGET),x86_64-solaris)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
 ifeq ($(FULL_TARGET),arm-darwin)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 ifeq ($(FULL_TARGET),arm-wince)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 ifeq ($(FULL_TARGET),arm-gba)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-nds)
 ifeq ($(FULL_TARGET),arm-nds)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
 ifeq ($(FULL_TARGET),arm-embedded)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
 ifeq ($(FULL_TARGET),arm-symbian)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),avr-embedded)
 ifeq ($(FULL_TARGET),avr-embedded)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
 ifeq ($(FULL_TARGET),armeb-linux)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
 ifeq ($(FULL_TARGET),armeb-embedded)
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/BASE=1
 TARGET_DIRS_SRC/WEBDATA=1
 TARGET_DIRS_SRC/WEBDATA=1
-endif
-ifeq ($(FULL_TARGET),mipsel-linux)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
+TARGET_DIRS_SRC/JSONRPC=1
 endif
 endif
 ifdef TARGET_DIRS_SRC/BASE
 ifdef TARGET_DIRS_SRC/BASE
 src/base_all:
 src/base_all:
@@ -3708,6 +3679,51 @@ src/webdata:
 	$(MAKE) -C src/webdata all
 	$(MAKE) -C src/webdata all
 .PHONY: src/webdata_all src/webdata_debug src/webdata_smart src/webdata_release src/webdata_units src/webdata_examples src/webdata_shared src/webdata_install src/webdata_sourceinstall src/webdata_exampleinstall src/webdata_distinstall src/webdata_zipinstall src/webdata_zipsourceinstall src/webdata_zipexampleinstall src/webdata_zipdistinstall src/webdata_clean src/webdata_distclean src/webdata_cleanall src/webdata_info src/webdata_makefiles src/webdata
 .PHONY: src/webdata_all src/webdata_debug src/webdata_smart src/webdata_release src/webdata_units src/webdata_examples src/webdata_shared src/webdata_install src/webdata_sourceinstall src/webdata_exampleinstall src/webdata_distinstall src/webdata_zipinstall src/webdata_zipsourceinstall src/webdata_zipexampleinstall src/webdata_zipdistinstall src/webdata_clean src/webdata_distclean src/webdata_cleanall src/webdata_info src/webdata_makefiles src/webdata
 endif
 endif
+ifdef TARGET_DIRS_SRC/JSONRPC
+src/jsonrpc_all:
+	$(MAKE) -C src/jsonrpc all
+src/jsonrpc_debug:
+	$(MAKE) -C src/jsonrpc debug
+src/jsonrpc_smart:
+	$(MAKE) -C src/jsonrpc smart
+src/jsonrpc_release:
+	$(MAKE) -C src/jsonrpc release
+src/jsonrpc_units:
+	$(MAKE) -C src/jsonrpc units
+src/jsonrpc_examples:
+	$(MAKE) -C src/jsonrpc examples
+src/jsonrpc_shared:
+	$(MAKE) -C src/jsonrpc shared
+src/jsonrpc_install:
+	$(MAKE) -C src/jsonrpc install
+src/jsonrpc_sourceinstall:
+	$(MAKE) -C src/jsonrpc sourceinstall
+src/jsonrpc_exampleinstall:
+	$(MAKE) -C src/jsonrpc exampleinstall
+src/jsonrpc_distinstall:
+	$(MAKE) -C src/jsonrpc distinstall
+src/jsonrpc_zipinstall:
+	$(MAKE) -C src/jsonrpc zipinstall
+src/jsonrpc_zipsourceinstall:
+	$(MAKE) -C src/jsonrpc zipsourceinstall
+src/jsonrpc_zipexampleinstall:
+	$(MAKE) -C src/jsonrpc zipexampleinstall
+src/jsonrpc_zipdistinstall:
+	$(MAKE) -C src/jsonrpc zipdistinstall
+src/jsonrpc_clean:
+	$(MAKE) -C src/jsonrpc clean
+src/jsonrpc_distclean:
+	$(MAKE) -C src/jsonrpc distclean
+src/jsonrpc_cleanall:
+	$(MAKE) -C src/jsonrpc cleanall
+src/jsonrpc_info:
+	$(MAKE) -C src/jsonrpc info
+src/jsonrpc_makefiles:
+	$(MAKE) -C src/jsonrpc makefiles
+src/jsonrpc:
+	$(MAKE) -C src/jsonrpc all
+.PHONY: src/jsonrpc_all src/jsonrpc_debug src/jsonrpc_smart src/jsonrpc_release src/jsonrpc_units src/jsonrpc_examples src/jsonrpc_shared src/jsonrpc_install src/jsonrpc_sourceinstall src/jsonrpc_exampleinstall src/jsonrpc_distinstall src/jsonrpc_zipinstall src/jsonrpc_zipsourceinstall src/jsonrpc_zipexampleinstall src/jsonrpc_zipdistinstall src/jsonrpc_clean src/jsonrpc_distclean src/jsonrpc_cleanall src/jsonrpc_info src/jsonrpc_makefiles src/jsonrpc
+endif
 all: $(addsuffix _all,$(TARGET_DIRS))
 all: $(addsuffix _all,$(TARGET_DIRS))
 debug: $(addsuffix _debug,$(TARGET_DIRS))
 debug: $(addsuffix _debug,$(TARGET_DIRS))
 smart: $(addsuffix _smart,$(TARGET_DIRS))
 smart: $(addsuffix _smart,$(TARGET_DIRS))

+ 1 - 1
packages/fcl-web/Makefile.fpc

@@ -7,7 +7,7 @@ name=fcl-web
 version=2.5.1
 version=2.5.1
 
 
 [target]
 [target]
-dirs=src/base src/webdata
+dirs=src/base src/webdata src/jsonrpc
 
 
 [require]
 [require]
 packages=fcl-base fcl-xml fcl-db fcl-json fcl-net
 packages=fcl-base fcl-xml fcl-db fcl-json fcl-net

+ 93 - 0
packages/fcl-web/examples/jsonrpc/demo1/demo.lpi

@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="7"/>
+    <General>
+      <Flags>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <Runnable Value="False"/>
+      </Flags>
+      <SessionStorage Value="InProjectDir"/>
+      <MainUnit Value="0"/>
+      <TargetFileExt Value=""/>
+      <Title Value="FPC JSON-RPC demo "/>
+      <ResourceType Value="res"/>
+      <UseXPManifest Value="True"/>
+      <Icon Value="0"/>
+    </General>
+    <VersionInfo>
+      <Language Value=""/>
+      <CharSet Value=""/>
+      <StringTable Comments="" CompanyName="" FileDescription="" FileVersion="" InternalName="" LegalCopyright="" LegalTrademarks="" OriginalFilename="" ProductName="" ProductVersion=""/>
+    </VersionInfo>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IgnoreBinaries Value="False"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="3">
+      <Item1>
+        <PackageName Value="WebLaz"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="LCL"/>
+      </Item2>
+      <Item3>
+        <PackageName Value="FCL"/>
+      </Item3>
+    </RequiredPackages>
+    <Units Count="2">
+      <Unit0>
+        <Filename Value="demo.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="demo"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="wmdemo.pp"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FPWebModule1"/>
+        <ResourceBaseClass Value="DataModule"/>
+        <UnitName Value="wmdemo"/>
+      </Unit1>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="8"/>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)/"/>
+    </SearchPaths>
+    <Parsing>
+      <SyntaxOptions>
+        <UseAnsiStrings Value="True"/>
+      </SyntaxOptions>
+    </Parsing>
+    <Linking>
+      <Debugging>
+        <UseHeaptrc Value="True"/>
+      </Debugging>
+    </Linking>
+    <Other>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions Count="3">
+      <Item1>
+        <Name Value="EAbort"/>
+      </Item1>
+      <Item2>
+        <Name Value="ECodetoolError"/>
+      </Item2>
+      <Item3>
+        <Name Value="EFOpenError"/>
+      </Item3>
+    </Exceptions>
+  </Debugging>
+</CONFIG>

+ 16 - 0
packages/fcl-web/examples/jsonrpc/demo1/demo.lpr

@@ -0,0 +1,16 @@
+program demo;
+
+{$mode objfpc}{$H+}
+
+uses
+  fpCGI, wmdemo;
+
+// {$R *.res}
+
+
+begin
+  Application.Title:='FPC JSON-RPC demo';
+  Application.Initialize;
+  Application.Run;
+end.
+

+ 1 - 0
packages/fcl-web/examples/jsonrpc/demo1/echo.in

@@ -0,0 +1 @@
+{ "method": "echo", "params": ["Hello JSON-RPC"], "id": 1 }

+ 4 - 0
packages/fcl-web/examples/jsonrpc/demo1/echobatch.in

@@ -0,0 +1,4 @@
+[
+  { "method": "echo", "params": ["Hello JSON-RPC 1"], "id": 1 },
+  { "method": "echo", "params": ["Hello JSON-RPC 2"], "id": 2 }
+]

+ 4 - 0
packages/fcl-web/examples/jsonrpc/demo1/extdirect.in

@@ -0,0 +1,4 @@
+[
+  { "action": "test", "method": "echo", "data": ["Hello JSON-RPC 1"], "tid": 1 },
+  { "action": "test", "method": "echo", "data": ["Hello JSON-RPC 2"], "tid": 2 }
+]

+ 1 - 0
packages/fcl-web/examples/jsonrpc/demo1/notification.in

@@ -0,0 +1 @@
+{ "method": "echo", "params": ["Hello JSON-RPC"], "id": null }

+ 46 - 0
packages/fcl-web/examples/jsonrpc/demo1/wmdemo.lfm

@@ -0,0 +1,46 @@
+object FPWebModule1: TFPWebModule1
+  OnCreate = DataModuleCreate
+  OldCreateOrder = False
+  Actions = <  
+    item
+      Name = 'Manual'
+      Default = True
+      OnRequest = TFPWebActions0Request
+    end  
+    item
+      Name = 'Dispatch'
+      Default = False
+      OnRequest = TFPWebActions1Request
+    end  
+    item
+      Name = 'Registered'
+      Default = False
+      OnRequest = TFPWebActions2Request
+    end  
+    item
+      Name = 'ExtDirect'
+      Default = False
+      OnRequest = TFPWebActions3Request
+    end  
+    item
+      Name = 'Content'
+      Default = False
+      OnRequest = TFPWebActions4Request
+    end  
+    item
+      Name = 'ExtDirectAPI'
+      Default = False
+      OnRequest = TFPWebActions5Request
+    end  
+    item
+      Name = 'Module'
+      Default = False
+      OnRequest = TFPWebActions6Request
+    end>
+  ActionVar = 'Action'
+  CreateSession = False
+  Height = 260
+  HorizontalOffset = 578
+  VerticalOffset = 373
+  Width = 442
+end

+ 15 - 0
packages/fcl-web/examples/jsonrpc/demo1/wmdemo.lrs

@@ -0,0 +1,15 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TFPWebModule1','FORMDATA',[
+  'TPF0'#13'TFPWebModule1'#12'FPWebModule1'#8'OnCreate'#7#16'DataModuleCreate'
+  +#14'OldCreateOrder'#8#7'Actions'#14#1#4'Name'#6#6'Manual'#7'Default'#9#9'OnR'
+  +'equest'#7#21'TFPWebActions0Request'#0#1#4'Name'#6#8'Dispatch'#7'Default'#8#9
+  +'OnRequest'#7#21'TFPWebActions1Request'#0#1#4'Name'#6#10'Registered'#7'Defau'
+  +'lt'#8#9'OnRequest'#7#21'TFPWebActions2Request'#0#1#4'Name'#6#9'ExtDirect'#7
+  +'Default'#8#9'OnRequest'#7#21'TFPWebActions3Request'#0#1#4'Name'#6#7'Content'
+  +#7'Default'#8#9'OnRequest'#7#21'TFPWebActions4Request'#0#1#4'Name'#6#12'ExtD'
+  +'irectAPI'#7'Default'#8#9'OnRequest'#7#21'TFPWebActions5Request'#0#1#4'Name'
+  +#6#6'Module'#7'Default'#8#9'OnRequest'#7#21'TFPWebActions6Request'#0#0#9'Act'
+  +'ionVar'#6#6'Action'#13'CreateSession'#8#6'Height'#3#4#1#16'HorizontalOffset'
+  +#3'B'#2#14'VerticalOffset'#3'u'#1#5'Width'#3#186#1#0#0
+]);

+ 383 - 0
packages/fcl-web/examples/jsonrpc/demo1/wmdemo.pp

@@ -0,0 +1,383 @@
+unit wmdemo; 
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb; 
+
+type
+
+  { TFPWebModule1 }
+
+  TFPWebModule1 = class(TFPWebModule)
+    procedure DataModuleCreate(Sender: TObject);
+    procedure TFPWebActions0Request(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+    procedure TFPWebActions1Request(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+    procedure TFPWebActions2Request(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+    procedure TFPWebActions3Request(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+    procedure TFPWebActions4Request(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+    procedure TFPWebActions5Request(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+    procedure TFPWebActions6Request(Sender: TObject; ARequest: TRequest;
+      AResponse: TResponse; var Handled: Boolean);
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end; 
+
+var
+  FPWebModule1: TFPWebModule1; 
+
+implementation
+
+Uses fpjson,jsonparser,fpjsonrpc,webjsonrpc, fpextdirect;
+
+{ TFPWebModule1 }
+
+procedure TFPWebModule1.DataModuleCreate(Sender: TObject);
+begin
+end;
+
+procedure TFPWebModule1.TFPWebActions0Request(Sender: TObject;
+  ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
+{
+  Demo 1. Manually do everything.
+  Only a single method call is supported.
+}
+Var
+  P : TJSONParser;
+  Req,Res : TJSONData;
+  Env,O : TJSONObject;
+  M : TJSONStringType;
+  E : TJSONRPCEcho;
+  I : Integer;
+  ID : TJSONData;
+  Err : TJSONData;
+
+begin
+  Res:=Nil;
+  Err:=Nil;
+  ID:=Nil;
+  try
+    P:=TJSONParser.Create(ARequest.Content);
+    try
+      Req:=P.Parse;
+      try
+        If Not (Req is TJSONObject) then
+          JSONRPCError(SErrRequestMustBeObject);
+        O:=(Req as TJSONObject);
+        I:=O.IndexOfName('id');
+        If (I=-1) then
+          JSONRPCError(SErrNoIDProperty);
+        ID:=O.Items[i].Clone;
+        if O.IndexOfName('method')=-1 then
+          JSONRPCError(SErrNoMethodName);
+        M:=O.Strings['method'];
+        If (m<>'echo') then
+          JSONRPCError('Only echo method is supported');
+        E:=TJSONRPCEcho.Create(Self);
+        try
+          I:=O.IndexOfName('params');
+          Res:=E.Execute(O.Items[i],Nil);
+        finally
+          E.Free;
+        end;
+      finally
+        Req.Free;
+      end;
+    finally
+      P.Free;
+    end;
+  except
+    On E : Exception do
+      Err:=TJSONObject.Create(['message',E.Message,'name',E.ClassName,'code',-1]);
+  end;
+  If Assigned(ID) and (ID.JSONType<>jtNull) then
+    begin
+    Env:=TJSONObject.Create();
+    try
+      If not Assigned(Res) then
+        Res:=TJSONNull.Create;
+      Env.Add('result',Res);
+      If (Err=Nil) then
+        Err:=TJSONNull.Create;
+      Env.Add('error',Err);
+      Env.Add('id',ID);
+      AResponse.Content:=Env.AsJSON;
+    finally
+      Env.Free;
+    end;
+    end;
+  AResponse.SendContent;
+  Handled:=True;
+end;
+
+procedure TFPWebModule1.TFPWebActions1Request(Sender: TObject;
+  ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
+
+{
+  Demo 2. Use a dispatcher to dispatch the requests.
+  The handler is located on the owner module
+  (it is created run-time, though)
+}
+
+Var
+  Echohandler:TJSONRPCEcho;
+  Disp : TJSONRPCDispatcher;
+  P : TJSONParser;
+  Req,res : TJSONData;
+  O : TJSONRPCDispatchOptions;
+
+begin
+  Echohandler:=TJSONRPCEcho.Create(Self);
+  try
+    EchoHandler.Name:='echo';
+    Disp:=TJSONRPCDispatcher.Create(Self);
+    try
+      O:=Disp.Options;
+      Include(O,jdoRequireClass);
+      Disp.Options:=O;
+      P:= TJSONParser.Create(ARequest.Content);
+      try
+        Req:=P.Parse;
+        try
+          Res:=Nil;
+          Res:=Disp.Execute(Req,Nil);
+          try
+            If Assigned(Res) then
+              begin
+              AResponse.Content:=Res.AsJSON;
+              end;
+            AResponse.SendContent;
+            Handled:=True;
+          finally
+            FreeAndNil(Res);
+          end;
+        finally
+          Req.Free;
+        end;
+      finally
+        P.Free;
+      end;
+    finally
+      Disp.Free;
+    end;
+  finally
+    EchoHandler.Free;
+  end;
+
+end;
+
+procedure TFPWebModule1.TFPWebActions2Request(Sender: TObject;
+  ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
+{
+  Demo 3. Use a dispatcher to dispatch the requests,
+  The handler is registered in the JSONFPCHandlerManager.
+  (it is created run-time, though)
+}
+
+Var
+  Disp : TJSONRPCDispatcher;
+  P : TJSONParser;
+  Req,res : TJSONData;
+  O : TJSONRPCDispatchOptions;
+
+begin
+  JSONRpcHandlerManager.RegisterHandler('','echo',TJSONRPCEcho);
+  try
+    Disp:=TJSONRPCDispatcher.Create(Self);
+    try
+      O:=Disp.Options;
+      Include(O,jdoSearchRegistry);
+      Disp.Options:=O;
+      P:= TJSONParser.Create(ARequest.Content);
+      try
+        Req:=P.Parse;
+        try
+          Res:=Nil;
+          Res:=Disp.Execute(Req,Nil);
+          try
+            If Assigned(Res) then
+              begin
+              AResponse.Content:=Res.AsJSON;
+              end;
+            AResponse.SendContent;
+            Handled:=True;
+          finally
+            FreeAndNil(Res);
+          end;
+        finally
+          Req.Free;
+        end;
+      finally
+        P.Free;
+      end;
+    finally
+      Disp.Free;
+    end;
+  finally
+    JSONRpcHandlerManager.UnRegisterHandler('','echo');
+  end;
+end;
+
+procedure TFPWebModule1.TFPWebActions3Request(Sender: TObject;
+  ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
+
+{
+  Demo 4. Ext.Direct dispatcher
+  The handler is registered in the JSONFPCHandlerManager.
+  (it is created run-time, though)
+}
+
+Var
+  Disp : TExtDirectDispatcher;
+  P : TJSONParser;
+  Req,res : TJSONData;
+  O : TJSONRPCDispatchOptions;
+
+begin
+  JSONRpcHandlerManager.RegisterHandler('test','echo',TJSONRPCEcho);
+  try
+    Disp:=TExtDirectDispatcher.Create(Self);
+    try
+      O:=Disp.Options;
+      Include(O,jdoSearchRegistry);
+      Disp.Options:=O;
+      P:= TJSONParser.Create(ARequest.Content);
+      try
+        Req:=P.Parse;
+        try
+          Res:=Nil;
+          Res:=Disp.Execute(Req,Nil);
+          try
+            If Assigned(Res) then
+              begin
+              AResponse.Content:=Res.AsJSON;
+              end;
+            AResponse.ContentLength:=Length(AResponse.Content);
+            AResponse.SendContent;
+            Handled:=True;
+          finally
+            FreeAndNil(Res);
+          end;
+        finally
+          Req.Free;
+        end;
+      finally
+        P.Free;
+      end;
+    finally
+      Disp.Free;
+    end;
+  finally
+    JSONRpcHandlerManager.UnRegisterHandler('','echo');
+  end;
+end;
+
+procedure TFPWebModule1.TFPWebActions4Request(Sender: TObject;
+  ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
+
+{
+  Demo 5. Using a TJSONRPCContentProducer.
+  The handler is registered in the JSONFPCHandlerManager.
+  (it is created run-time, though)
+}
+
+Var
+  Cont : TJSONRPCContentProducer;
+  disp : TJSONRPCDispatcher;
+
+begin
+  JSONRpcHandlerManager.RegisterHandler('test','echo',TJSONRPCEcho);
+  try
+    Cont:=TJSONRPCContentProducer.Create(Self);
+    try
+      disp:=TJSONRPCDispatcher.Create(Cont);
+      Disp.Options:=Disp.OPtions+[jdoSearchRegistry];
+      Cont.Dispatcher:=Disp;
+      AResponse.ContentStream:=TMemoryStream.Create;
+      try
+        Cont.GetContent(ARequest,AResponse.ContentStream,Handled);
+        AResponse.ContentLength:=AResponse.ContentStream.Size;
+        If Handled then
+          AResponse.SendContent;
+      finally
+        AResponse.ContentStream.Free;
+      end;
+    finally
+      Cont.Free;
+    end;
+  finally
+    JSONRpcHandlerManager.UnRegisterHandler('','echo');
+  end;
+end;
+
+procedure TFPWebModule1.TFPWebActions5Request(Sender: TObject;
+  ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
+{
+  Demo 6. creating an API response for Ext.Direct
+  The handler is registered in the JSONFPCHandlerManager.
+  (it is created run-time, though)
+}
+
+Var
+  D : TExtDirectDispatcher;
+  I : Integer;
+
+begin
+  JSONRpcHandlerManager.RegisterHandler('test','echo',TJSONRPCEcho);
+  try
+    D:=TExtDirectDispatcher.Create(Self);
+    try
+      D.URL:=BaseURL+'ExtDirect';
+      D.Options:=D.Options+[jdoSearchRegistry];
+      AResponse.Content:=D.APIAsString;
+      AResponse.ContentLength:=Length(AResponse.Content);
+    finally
+      D.Free;
+    end;
+  finally
+    JSONRpcHandlerManager.UnRegisterHandler('','echo');
+  end;
+end;
+
+procedure TFPWebModule1.TFPWebActions6Request(Sender: TObject;
+  ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
+{
+  Demo 6. Using a TJSONRPCModule instance to handle the request.
+  The handler is registered in the JSONFPCHandlerManager.
+  (it is created run-time, though)
+}
+
+Var
+  M : TJSONRPCModule;
+
+begin
+  JSONRpcHandlerManager.RegisterHandler('test','echo',TJSONRPCEcho);
+  try
+    M:=TJSONRPCModule.CreateNew(Self,0);
+    try
+      M.HandleRequest(ARequest,AResponse);
+      Handled:=True;
+    finally
+      M.Free;
+    end;
+  finally
+    JSONRpcHandlerManager.UnRegisterHandler('','echo');
+  end;
+end;
+
+initialization
+  {$I wmdemo.lrs}
+
+  RegisterHTTPModule('echo', TFPWebModule1);
+end.
+

+ 14 - 1
packages/fcl-web/fpmake.pp

@@ -35,6 +35,7 @@ begin
 
 
     P.SourcePath.Add('src/base');
     P.SourcePath.Add('src/base');
     P.SourcePath.Add('src/webdata');
     P.SourcePath.Add('src/webdata');
+    P.SourcePath.Add('src/jsonrpc');
 
 
     T:=P.Targets.AddUnit('cgiapp.pp');
     T:=P.Targets.AddUnit('cgiapp.pp');
     T.ResourceStrings:=true;
     T.ResourceStrings:=true;
@@ -152,13 +153,25 @@ begin
       AddUnit('httpdefs');
       AddUnit('httpdefs');
       AddUnit('fpextjs');
       AddUnit('fpextjs');
       end;
       end;
-    T:=P.Targets.AddUnit('extjsjson.pp');
+    T:=P.Targets.AddUnit('extjsjson.pp'); 
     With T.Dependencies do
     With T.Dependencies do
       begin
       begin
       AddUnit('fpwebdata');
       AddUnit('fpwebdata');
       AddUnit('httpdefs');
       AddUnit('httpdefs');
       AddUnit('fpextjs');
       AddUnit('fpextjs');
       end;
       end;
+    T:=P.Targets.AddUnit('fpjsonrpc.pp');
+    T:=P.Targets.AddUnit('webjsonrpc.pp');
+    With T.Dependencies do
+      begin
+      AddUnit('fpjsonrpc');
+      end;
+    T:=P.Targets.AddUnit('fpextdirect.pp');
+    With T.Dependencies do
+      begin
+      AddUnit('fpjsonrpc');
+      AddUnit('webjsonrpc');
+      end;
 {$ifndef ALLPACKAGES}
 {$ifndef ALLPACKAGES}
     Run;
     Run;
     end;
     end;

+ 1 - 0
packages/fcl-web/src/base/fphttp.pp

@@ -258,6 +258,7 @@ begin
   M:=TMemoryStream.Create;
   M:=TMemoryStream.Create;
   DoGetContent(ARequest,M,Handled);
   DoGetContent(ARequest,M,Handled);
   AResponse.ContentStream:=M;
   AResponse.ContentStream:=M;
+  AResponse.ContentLength:=M.Size;
 end;
 end;
 
 
 procedure THTTPContentProducer.DoGetContent(ARequest: TRequest; Content: TStream; Var Handled : Boolean);
 procedure THTTPContentProducer.DoGetContent(ARequest: TRequest; Content: TStream; Var Handled : Boolean);