diff --git a/.cvsignore b/.cvsignore
index 561ab7a607a..d3f1850fa97 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -1,3 +1,3 @@
-index.php
-documents
-*.htaccess
+index.php
+documents
+*.htaccess
diff --git a/build/pad/Dolibarr developpers.cml b/build/pad/Dolibarr developpers.cml
index 145e00011cb..c925bd71fc2 100644
--- a/build/pad/Dolibarr developpers.cml
+++ b/build/pad/Dolibarr developpers.cml
@@ -1,31 +1,31 @@
-
-
- PADGen 2.0.2.30
-
- Dolibarr Developpers
-
-
- Paris
-
-
- FRANCE
- http://www.dolibarr.org
-
- Dolibarr team
- Dolibarr team
- dolibarr-dev@nongnu.org
- Dolibarr team
- Dolibarr team
- dolibarr-dev@nongnu.org
-
-
- dolibarr-dev@nongnu.org
- dolibarr-dev@nongnu.org
- dolibarr-dev@nongnu.org
-
-
-
-
-
-
-
+
+
+ PADGen 2.0.2.30
+
+ Dolibarr Developpers
+
+
+ Paris
+
+
+ FRANCE
+ http://www.dolibarr.org
+
+ Dolibarr team
+ Dolibarr team
+ dolibarr-dev@nongnu.org
+ Dolibarr team
+ Dolibarr team
+ dolibarr-dev@nongnu.org
+
+
+ dolibarr-dev@nongnu.org
+ dolibarr-dev@nongnu.org
+ dolibarr-dev@nongnu.org
+
+
+
+
+
+
+
diff --git a/build/pad/Dolibarr v2.0.pml b/build/pad/Dolibarr v2.0.pml
index 95593e67bc5..1f89e0d15e8 100644
--- a/build/pad/Dolibarr v2.0.pml
+++ b/build/pad/Dolibarr v2.0.pml
@@ -1,178 +1,178 @@
-
-
- PADGen 2.0.2.30
-
-
- Dolibarr
- 2.1
- 07
- 14
- 2006
- 0
-
- 0
- Freeware
- Major Update
- Uninstall Only
- Win95,Win98,WinME,WinNT 4.x,Windows2000,WinXP,Windows2003,Windows Vista Starter,Windows Vista Home Basic,Windows Vista Home Premium,Windows Vista Business,Windows Vista Enterprise,Windows Vista Ultimate,Windows Vista Home Basic x64,Windows Vista Home Premium x64,Windows Vista Business x64,Windows Vista Enterprise x64,Windows Vista Ultimate x64,Unix,Linux,OS/2,OS/2 Warp,OS/2 Warp 4,MAC 68k,Mac PPC,Mac OS X,Mac Other,BEOS
- English,French
- http://www.dolibarr.org
- Business
- Business::Accounting & Finance
- None
-
- 1016660
- 992
- 0.97
-
-
- N
-
- Days
-
-
-
-
-
-
-
-
- dolibarr
- Dolibarr ERP/CRM
- Dolibarr ERP/CRM
- Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
- Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
- Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
-
-
-
-
-
-
-
-
-
-
-
-
- http://www.dolibarr.org
- http://www.dolibarr.org
- http://www.dolibarr.org/demo/doc/images/dolibarr_screenshot2.png
- http://www.dolibarr.org/demo/doc/images/dolibarr.ico
- http://www.dolibarr.org/demo/build/pad/pad_dolibarr.xml
-
-
-
-
-
-
-
-
-
- GNU GPL
- GNU GPL
-
-
- Y
- N
-
-
-
- Y
- 1.2
- http://www.asp-shareware.org/pad/extensions/Affiliates.htm
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ PADGen 2.0.2.30
+
+
+ Dolibarr
+ 2.1
+ 07
+ 14
+ 2006
+ 0
+
+ 0
+ Freeware
+ Major Update
+ Uninstall Only
+ Win95,Win98,WinME,WinNT 4.x,Windows2000,WinXP,Windows2003,Windows Vista Starter,Windows Vista Home Basic,Windows Vista Home Premium,Windows Vista Business,Windows Vista Enterprise,Windows Vista Ultimate,Windows Vista Home Basic x64,Windows Vista Home Premium x64,Windows Vista Business x64,Windows Vista Enterprise x64,Windows Vista Ultimate x64,Unix,Linux,OS/2,OS/2 Warp,OS/2 Warp 4,MAC 68k,Mac PPC,Mac OS X,Mac Other,BEOS
+ English,French
+ http://www.dolibarr.org
+ Business
+ Business::Accounting & Finance
+ None
+
+ 1016660
+ 992
+ 0.97
+
+
+ N
+
+ Days
+
+
+
+
+
+
+
+
+ dolibarr
+ Dolibarr ERP/CRM
+ Dolibarr ERP/CRM
+ Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
+ Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
+ Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
+
+
+
+
+
+
+
+
+
+
+
+
+ http://www.dolibarr.org
+ http://www.dolibarr.org
+ http://www.dolibarr.org/demo/doc/images/dolibarr_screenshot2.png
+ http://www.dolibarr.org/demo/doc/images/dolibarr.ico
+ http://www.dolibarr.org/demo/build/pad/pad_dolibarr.xml
+
+
+
+
+
+
+
+
+
+ GNU GPL
+ GNU GPL
+
+
+ Y
+ N
+
+
+
+ Y
+ 1.2
+ http://www.asp-shareware.org/pad/extensions/Affiliates.htm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/pad/Dolibarr v2.1.pml b/build/pad/Dolibarr v2.1.pml
index 858bee44e68..8cbf705d598 100644
--- a/build/pad/Dolibarr v2.1.pml
+++ b/build/pad/Dolibarr v2.1.pml
@@ -1,178 +1,178 @@
-
-
- PADGen 3.0.1.35
-
-
- Dolibarr
- 2.1
- 04
- 27
- 2007
-
-
-
- Freeware
- Major Update
- No Install Support
- Win95,Win98,WinME,WinNT 4.x,Windows2000,WinXP,Windows2003,Windows Vista Starter,Windows Vista Home Basic,Windows Vista Home Premium,Windows Vista Business,Windows Vista Enterprise,Windows Vista Ultimate,Windows Vista Home Basic x64,Windows Vista Home Premium x64,Windows Vista Business x64,Windows Vista Enterprise x64,Windows Vista Ultimate x64,Unix,Linux,OS/2,OS/2 Warp,OS/2 Warp 4,MAC 68k,Mac PPC,Mac OS X,Mac Other,BEOS
- English,French
- http://www.dolibarr.org
- Business
- Business::Accounting & Finance
- None
-
- 1016660
- 992
- 0.97
-
-
- N
-
- Days
-
-
-
-
-
-
-
-
- dolibarr
- Dolibarr ERP/CRM
- Dolibarr ERP/CRM
- Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
- Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
- Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
-
-
-
-
-
-
-
-
-
-
-
-
- http://www.dolibarr.org
- http://www.dolibarr.org
- http://www.dolibarr.org/demo/doc/images/dolibarr_screenshot2.png
- http://www.dolibarr.org/demo/doc/images/mylogo.png
- http://www.dolibarr.org/demo/build/pad/pad_dolibarr.xml
-
-
- http://www.dolibarr.org/en/files/documents/dolibarr.tgz
-
-
-
-
-
-
- GNU GPL
- GNU GPL
-
-
- Y
- N
-
-
-
- Y
- 1.2
- http://www.asp-shareware.org/pad/extensions/Affiliates.htm
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ PADGen 3.0.1.35
+
+
+ Dolibarr
+ 2.1
+ 04
+ 27
+ 2007
+
+
+
+ Freeware
+ Major Update
+ No Install Support
+ Win95,Win98,WinME,WinNT 4.x,Windows2000,WinXP,Windows2003,Windows Vista Starter,Windows Vista Home Basic,Windows Vista Home Premium,Windows Vista Business,Windows Vista Enterprise,Windows Vista Ultimate,Windows Vista Home Basic x64,Windows Vista Home Premium x64,Windows Vista Business x64,Windows Vista Enterprise x64,Windows Vista Ultimate x64,Unix,Linux,OS/2,OS/2 Warp,OS/2 Warp 4,MAC 68k,Mac PPC,Mac OS X,Mac Other,BEOS
+ English,French
+ http://www.dolibarr.org
+ Business
+ Business::Accounting & Finance
+ None
+
+ 1016660
+ 992
+ 0.97
+
+
+ N
+
+ Days
+
+
+
+
+
+
+
+
+ dolibarr
+ Dolibarr ERP/CRM
+ Dolibarr ERP/CRM
+ Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
+ Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
+ Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
+
+
+
+
+
+
+
+
+
+
+
+
+ http://www.dolibarr.org
+ http://www.dolibarr.org
+ http://www.dolibarr.org/demo/doc/images/dolibarr_screenshot2.png
+ http://www.dolibarr.org/demo/doc/images/mylogo.png
+ http://www.dolibarr.org/demo/build/pad/pad_dolibarr.xml
+
+
+ http://www.dolibarr.org/en/files/documents/dolibarr.tgz
+
+
+
+
+
+
+ GNU GPL
+ GNU GPL
+
+
+ Y
+ N
+
+
+
+ Y
+ 1.2
+ http://www.asp-shareware.org/pad/extensions/Affiliates.htm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/pad/pad_dolibarr.htm b/build/pad/pad_dolibarr.htm
index 1446ce8dad3..6870e758c8a 100644
Binary files a/build/pad/pad_dolibarr.htm and b/build/pad/pad_dolibarr.htm differ
diff --git a/build/pad/pad_dolibarr.xml b/build/pad/pad_dolibarr.xml
index 28862b57737..56a33357544 100644
--- a/build/pad/pad_dolibarr.xml
+++ b/build/pad/pad_dolibarr.xml
@@ -1,208 +1,208 @@
-
-
-
- 3.01
- PADGen 3.0.1.35 http://www.padgen.org
- Portable Application Description, or PAD for short, is a data set that is used by shareware authors to disseminate information to anyone interested in their software products. To find out more go to http://www.asp-shareware.org/pad
-
-
- Laurent Destailleur
- 61 Boulevard Vauban
-
- Montigny-le-Bretonneux
- Yvelines
- 78180
- FRANCE
- http://www.destailleur.fr
-
- Laurent
- Destailleur
- eldy@users.sourceforge.net
- Laurent
- Destailleur
- eldy@users.sourceforge.net
-
-
- eldy@users.sourceforge.net
- eldy@users.sourceforge.net
- eldy@users.sourceforge.net
-
-
-
-
-
-
-
- Dolibarr
- 2.1
- 04
- 27
- 2007
-
-
-
- Freeware
- Major Update
- No Install Support
- Win95,Win98,WinME,WinNT 4.x,Windows2000,WinXP,Windows2003,Windows Vista Starter,Windows Vista Home Basic,Windows Vista Home Premium,Windows Vista Business,Windows Vista Enterprise,Windows Vista Ultimate,Windows Vista Home Basic x64,Windows Vista Home Premium x64,Windows Vista Business x64,Windows Vista Enterprise x64,Windows Vista Ultimate x64,Unix,Linux,OS/2,OS/2 Warp,OS/2 Warp 4,MAC 68k,Mac PPC,Mac OS X,Mac Other,BEOS
- English,French
- http://www.dolibarr.org
- Business
- Business::Accounting & Finance
- None
-
- 1016660
- 992
- 0.97
-
-
- N
-
- Days
-
-
-
-
-
-
-
-
- dolibarr
- Dolibarr ERP/CRM
- Dolibarr ERP/CRM
- Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
- Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
- Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
-
-
-
-
-
-
-
-
-
-
-
-
- http://www.dolibarr.org
- http://www.dolibarr.org
- http://www.dolibarr.org/demo/doc/images/dolibarr_screenshot2.png
- http://www.dolibarr.org/demo/doc/images/mylogo.png
- http://www.dolibarr.org/demo/build/pad/pad_dolibarr.xml
-
-
- http://www.dolibarr.org/en/files/documents/dolibarr.tgz
-
-
-
-
-
-
- GNU GPL
- GNU GPL
-
-
- Y
- N
-
-
-
- Y
- 1.2
- http://www.asp-shareware.org/pad/extensions/Affiliates.htm
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ 3.01
+ PADGen 3.0.1.35 http://www.padgen.org
+ Portable Application Description, or PAD for short, is a data set that is used by shareware authors to disseminate information to anyone interested in their software products. To find out more go to http://www.asp-shareware.org/pad
+
+
+ Laurent Destailleur
+ 61 Boulevard Vauban
+
+ Montigny-le-Bretonneux
+ Yvelines
+ 78180
+ FRANCE
+ http://www.destailleur.fr
+
+ Laurent
+ Destailleur
+ eldy@users.sourceforge.net
+ Laurent
+ Destailleur
+ eldy@users.sourceforge.net
+
+
+ eldy@users.sourceforge.net
+ eldy@users.sourceforge.net
+ eldy@users.sourceforge.net
+
+
+
+
+
+
+
+ Dolibarr
+ 2.1
+ 04
+ 27
+ 2007
+
+
+
+ Freeware
+ Major Update
+ No Install Support
+ Win95,Win98,WinME,WinNT 4.x,Windows2000,WinXP,Windows2003,Windows Vista Starter,Windows Vista Home Basic,Windows Vista Home Premium,Windows Vista Business,Windows Vista Enterprise,Windows Vista Ultimate,Windows Vista Home Basic x64,Windows Vista Home Premium x64,Windows Vista Business x64,Windows Vista Enterprise x64,Windows Vista Ultimate x64,Unix,Linux,OS/2,OS/2 Warp,OS/2 Warp 4,MAC 68k,Mac PPC,Mac OS X,Mac Other,BEOS
+ English,French
+ http://www.dolibarr.org
+ Business
+ Business::Accounting & Finance
+ None
+
+ 1016660
+ 992
+ 0.97
+
+
+ N
+
+ Days
+
+
+
+
+
+
+
+
+ dolibarr
+ Dolibarr ERP/CRM
+ Dolibarr ERP/CRM
+ Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
+ Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
+ Dolibarr ERP/CRM is an open source tool to manage invoices, customers, suppliers, contracts and any other things a small or medium company needs.
+
+
+
+
+
+
+
+
+
+
+
+
+ http://www.dolibarr.org
+ http://www.dolibarr.org
+ http://www.dolibarr.org/demo/doc/images/dolibarr_screenshot2.png
+ http://www.dolibarr.org/demo/doc/images/mylogo.png
+ http://www.dolibarr.org/demo/build/pad/pad_dolibarr.xml
+
+
+ http://www.dolibarr.org/en/files/documents/dolibarr.tgz
+
+
+
+
+
+
+ GNU GPL
+ GNU GPL
+
+
+ Y
+ N
+
+
+
+ Y
+ 1.2
+ http://www.asp-shareware.org/pad/extensions/Affiliates.htm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/ldap/ldapadd_sample2.txt b/dev/ldap/ldapadd_sample2.txt
index c739f1d291a..356481fe247 100644
--- a/dev/ldap/ldapadd_sample2.txt
+++ b/dev/ldap/ldapadd_sample2.txt
@@ -1,10 +1,10 @@
-# ldapadd_sample2.txt
-#
-# Use this sample to add a ou "contacts"
-# This is the second thing to create after creating the root my-domain
-#
-# ldapadd -c -v -D cn=Manager,dc=my-domain,dc=com -W -f ldapadd_sample2.txt
-
-dn: ou=contacts,dc=my-domain,dc=com
-objectClass: organizationalUnit
+# ldapadd_sample2.txt
+#
+# Use this sample to add a ou "contacts"
+# This is the second thing to create after creating the root my-domain
+#
+# ldapadd -c -v -D cn=Manager,dc=my-domain,dc=com -W -f ldapadd_sample2.txt
+
+dn: ou=contacts,dc=my-domain,dc=com
+objectClass: organizationalUnit
ou: contacts
\ No newline at end of file
diff --git a/doc/wiki/titres_page_wiki.txt b/doc/wiki/titres_page_wiki.txt
index ad0563a327f..05a3d9398f6 100644
--- a/doc/wiki/titres_page_wiki.txt
+++ b/doc/wiki/titres_page_wiki.txt
@@ -1,142 +1,142 @@
-Accueil
-Actualités
-ApercuDesModeles
-Authentification
-Benoit Mortier
-Charte de nommage
-Commande
-Constantes
-Contrat
-Customisation des documents dolibarr
-Developpement module
-Devenir développeur
-DocUtilisateur
-DocumentFacture
-DocumentPropale
-Document générés
-Documentation Développeur
-Documentation développeur
-Documentation traducteur
-Documentation utilisateur
-Dolibarr
-Dépendances
-Développement
-Export
-Compta
-FAQUtilisateur
-FAQ Développeur
-FAQ Langue
-FAQ Montants
-FAQ Utilisateur
-Facturation
-Facturation/Comptabilité
-Facture
-FactureConfiguration
-FactureFournisseur
-FactureModele
-Fichier de configuration
-Glossaire
-Imports de masse
-Installation
-Installation / Mise a jour
-Interface OSCommerce
-Interfaces Dolibarr vers exterieur
-Interfaces Exterieur vers Dolibarr
-Langages
-Langages et normes
-Languages
-Laurent Destailleur (Eldy) - Profession de foi
-Laurent Destailleur - Profession de foi
-Librairies externes
-Librairies externes et dépendances
-Liste des tables
-Mailing
-Main Page
-Mise à jour du format de la base
-Module Adhérents
-Module Avoir
-Module Banque
-Module Banque-Caisse
-Module Barcode
-Module Commandes
-Module Comptabilité
-Module Contrat
-Module Facture
-Module Fournisseur
-Module Mailing
-Module Propositions commerciales
-Module Prélèvements bancaires
-Module Société
-Module Stock
-Module Utilisateurs
-Module comptabilité
-Modules
-Nomination chef de projet
-Normes développeur
-Module Proposition commerciales
-Normes développeur
-Module Stock
-OpenXtrem
-Outils et principes
-Permissions
-Premiers paramétrages
-Presse en ligne
-Presse papier
-Produits
-Produits 7.1
-Projet
-Projet comptabilité légale
-Proposition commerciale
-Prérequis
-Roadmap
-Roadmap 1.2.0
-Roadmap 1.3.0
-Roadmap 1.4.0
-Roadmap 1.6.0
-Roadmap 2.0.0
-Roadmap 2.1.0
-Roadmap 2.3.0
-Roadmap 2.4.0
-Roadmap 2.6.0
-Régles de développement
-Rôle du chef de projet
-Salon Solutions Linux 2005
-Salon Solutions Linux 2006
-Salon Solutions Linux 2007
-Sauvegarder ses_données avant mise à jour
-Script facturation-calcul.php
-Script facturation-verif.php
-Script import-cdr.php
-Script mailing-send.php
-Script prelevement-verif.php
-Services
-Sociétés
-Stocks Librairies externes et dépendances
-Suggestions utilisateurs
-Système de menus
-Système des boites
-Table llx adherent
-Table llx action def
-Table llx commande
-Table llx commandedet
-Table llx const
-Table llx contrat
-Table llx dolibarr modules
-Table llx export compta
-Table llx facturedet
-Table llx paiement
-Table llx paiementfourn facturefourn
-Table llx prelevement
-Table llx prelevement bons
-Table llx prelevement facture
-Table llx prelevement facture demande
-Table llx prelevement lignes
-Table llx prelevement rejet
-Table llx rights def
-Table llx user param
-Table llx usergroup
-Table llx usergroup rights
-Table llx usergroup user
-Themes
-Téléphonie
-Utiliser ses données pour tester la dernière version
+Accueil
+Actualités
+ApercuDesModeles
+Authentification
+Benoit Mortier
+Charte de nommage
+Commande
+Constantes
+Contrat
+Customisation des documents dolibarr
+Developpement module
+Devenir développeur
+DocUtilisateur
+DocumentFacture
+DocumentPropale
+Document générés
+Documentation Développeur
+Documentation développeur
+Documentation traducteur
+Documentation utilisateur
+Dolibarr
+Dépendances
+Développement
+Export
+Compta
+FAQUtilisateur
+FAQ Développeur
+FAQ Langue
+FAQ Montants
+FAQ Utilisateur
+Facturation
+Facturation/Comptabilité
+Facture
+FactureConfiguration
+FactureFournisseur
+FactureModele
+Fichier de configuration
+Glossaire
+Imports de masse
+Installation
+Installation / Mise a jour
+Interface OSCommerce
+Interfaces Dolibarr vers exterieur
+Interfaces Exterieur vers Dolibarr
+Langages
+Langages et normes
+Languages
+Laurent Destailleur (Eldy) - Profession de foi
+Laurent Destailleur - Profession de foi
+Librairies externes
+Librairies externes et dépendances
+Liste des tables
+Mailing
+Main Page
+Mise à jour du format de la base
+Module Adhérents
+Module Avoir
+Module Banque
+Module Banque-Caisse
+Module Barcode
+Module Commandes
+Module Comptabilité
+Module Contrat
+Module Facture
+Module Fournisseur
+Module Mailing
+Module Propositions commerciales
+Module Prélèvements bancaires
+Module Société
+Module Stock
+Module Utilisateurs
+Module comptabilité
+Modules
+Nomination chef de projet
+Normes développeur
+Module Proposition commerciales
+Normes développeur
+Module Stock
+OpenXtrem
+Outils et principes
+Permissions
+Premiers paramétrages
+Presse en ligne
+Presse papier
+Produits
+Produits 7.1
+Projet
+Projet comptabilité légale
+Proposition commerciale
+Prérequis
+Roadmap
+Roadmap 1.2.0
+Roadmap 1.3.0
+Roadmap 1.4.0
+Roadmap 1.6.0
+Roadmap 2.0.0
+Roadmap 2.1.0
+Roadmap 2.3.0
+Roadmap 2.4.0
+Roadmap 2.6.0
+Régles de développement
+Rôle du chef de projet
+Salon Solutions Linux 2005
+Salon Solutions Linux 2006
+Salon Solutions Linux 2007
+Sauvegarder ses_données avant mise à jour
+Script facturation-calcul.php
+Script facturation-verif.php
+Script import-cdr.php
+Script mailing-send.php
+Script prelevement-verif.php
+Services
+Sociétés
+Stocks Librairies externes et dépendances
+Suggestions utilisateurs
+Système de menus
+Système des boites
+Table llx adherent
+Table llx action def
+Table llx commande
+Table llx commandedet
+Table llx const
+Table llx contrat
+Table llx dolibarr modules
+Table llx export compta
+Table llx facturedet
+Table llx paiement
+Table llx paiementfourn facturefourn
+Table llx prelevement
+Table llx prelevement bons
+Table llx prelevement facture
+Table llx prelevement facture demande
+Table llx prelevement lignes
+Table llx prelevement rejet
+Table llx rights def
+Table llx user param
+Table llx usergroup
+Table llx usergroup rights
+Table llx usergroup user
+Themes
+Téléphonie
+Utiliser ses données pour tester la dernière version
diff --git a/htdocs/adherents/cartes/carte.php b/htdocs/adherents/cartes/carte.php
index 978b693252a..6316a183db8 100755
--- a/htdocs/adherents/cartes/carte.php
+++ b/htdocs/adherents/cartes/carte.php
@@ -1,125 +1,125 @@
-
- * Copyright (C) 2003 Jean-Louis Bergamo
+
+ * Copyright (C) 2003 Jean-Louis Bergamo
* Copyright (C) 2006 Laurent Destailleur
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id$
- * $Source$
- */
-
-/**
- \file htdocs/adherents/cartes/carte.php
- \ingroup adherent
- \brief Page de creation d'une carte PDF
- \version $Revision$
-*/
-
-require("./pre.inc.php");
-require(DOL_DOCUMENT_ROOT."/adherents/adherent.class.php");
-
-require_once('PDF_card.class.php');
-
-// liste des patterns remplacable dans le texte a imprimer
-$patterns = array (
- '/%PRENOM%/',
- '/%NOM%/',
- '/%SERVEUR%/',
- '/%SOCIETE%/',
- '/%ADRESSE%/',
- '/%CP%/',
- '/%VILLE%/',
- '/%PAYS%/',
- '/%EMAIL%/',
- '/%NAISS%/',
- '/%PHOTO%/',
- '/%TYPE%/',
- '/%ID%/',
- '/%ANNEE%/'
- );
-/*
- *-------------------------------------------------
- * Pour créer l'objet on a 2 moyens :
- * Soit on donne les valeurs en les passant dans un tableau (sert pour un format personnel)
- * Soit on donne le type d'étiquette au format AVERY
- *-------------------------------------------------
-*/
-
-//$pdf = new PDF_Label(array('name'=>'perso1', 'marginLeft'=>1, 'marginTop'=>1, 'NX'=>2, 'NY'=>7, 'SpaceX'=>0, 'SpaceY'=>0, 'width'=>99.1, 'height'=>'38.1', 'metric'=>'mm', 'font-size'=>14), 1, 2);
-$pdf = new PDF_card('CARD', 1, 1);
-
-$pdf->Open();
-$pdf->AddPage();
-
-// Choix de l'annee d'impression ou annee courante.
-if (!isset($annee)){
- $now = getdate();
- $annee=$now['year'];
-}
-
-// requete en prenant que les adherents a jour de cotisation
-$sql = "SELECT d.rowid, d.prenom, d.nom, d.societe, ".$db->pdate("d.datefin")." as datefin,";
-$sql.= " d.adresse, d.cp, d.ville, d.naiss, d.email, d.photo,";
-$sql.= " t.libelle as type,";
-$sql.= " p.libelle as pays";
-$sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as t, ".MAIN_DB_PREFIX."adherent as d";
-$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_pays as p ON d.pays = p.rowid";
-$sql.= " WHERE d.fk_adherent_type = t.rowid AND d.statut = 1 AND datefin >= now()";
-$sql.= " ORDER BY d.rowid ASC";
-
-$result = $db->query($sql);
-if ($result)
-{
- $num = $db->num_rows($result);
- $i = 0;
- while ($i < $num)
- {
- $objp = $db->fetch_object($result);
- // attribut a remplacer
- $replace = array (
- ucfirst(strtolower($objp->prenom)),
- strtoupper($objp->nom),
- "http://".$_SERVER["SERVER_NAME"]."/",
- $objp->societe,
- ucwords(strtolower($objp->adresse)),
- $objp->cp,
- strtoupper($objp->ville),
- ucfirst(strtolower($objp->pays)),
- $objp->email,
- $objp->naiss,
- $objp->photo,
- $objp->type,
- $objp->rowid,
- $annee
- );
-
- // imprime le texte specifique sur la carte
- //$pdf->Add_PDF_card(sprintf("%s\n%s\n%s\n%s\n%s, %s\n%s", $objp->type." n° ".$objp->rowid,ucfirst(strtolower($objp->prenom))." ".strtoupper($objp->nom),"<".$objp->email.">", ucwords(strtolower($objp->adresse)), $objp->cp, strtoupper($objp->ville), ucfirst(strtolower($objp->pays))),$annee,"Association FreeLUG http://www.freelug.org/");
- $pdf->Add_PDF_card(preg_replace ($patterns, $replace, ADHERENT_CARD_TEXT),preg_replace ($patterns, $replace, ADHERENT_CARD_HEADER_TEXT),preg_replace ($patterns, $replace, ADHERENT_CARD_FOOTER_TEXT));
- $i++;
- }
-
- $db->close();
- $pdf->Output();
-}
-else
-{
- dolibarr_print_error($db);
-
- llxFooter('$Date$ - $Revision$');
-}
-
-?>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ * $Source$
+ */
+
+/**
+ \file htdocs/adherents/cartes/carte.php
+ \ingroup adherent
+ \brief Page de creation d'une carte PDF
+ \version $Revision$
+*/
+
+require("./pre.inc.php");
+require(DOL_DOCUMENT_ROOT."/adherents/adherent.class.php");
+
+require_once('PDF_card.class.php');
+
+// liste des patterns remplacable dans le texte a imprimer
+$patterns = array (
+ '/%PRENOM%/',
+ '/%NOM%/',
+ '/%SERVEUR%/',
+ '/%SOCIETE%/',
+ '/%ADRESSE%/',
+ '/%CP%/',
+ '/%VILLE%/',
+ '/%PAYS%/',
+ '/%EMAIL%/',
+ '/%NAISS%/',
+ '/%PHOTO%/',
+ '/%TYPE%/',
+ '/%ID%/',
+ '/%ANNEE%/'
+ );
+/*
+ *-------------------------------------------------
+ * Pour créer l'objet on a 2 moyens :
+ * Soit on donne les valeurs en les passant dans un tableau (sert pour un format personnel)
+ * Soit on donne le type d'étiquette au format AVERY
+ *-------------------------------------------------
+*/
+
+//$pdf = new PDF_Label(array('name'=>'perso1', 'marginLeft'=>1, 'marginTop'=>1, 'NX'=>2, 'NY'=>7, 'SpaceX'=>0, 'SpaceY'=>0, 'width'=>99.1, 'height'=>'38.1', 'metric'=>'mm', 'font-size'=>14), 1, 2);
+$pdf = new PDF_card('CARD', 1, 1);
+
+$pdf->Open();
+$pdf->AddPage();
+
+// Choix de l'annee d'impression ou annee courante.
+if (!isset($annee)){
+ $now = getdate();
+ $annee=$now['year'];
+}
+
+// requete en prenant que les adherents a jour de cotisation
+$sql = "SELECT d.rowid, d.prenom, d.nom, d.societe, ".$db->pdate("d.datefin")." as datefin,";
+$sql.= " d.adresse, d.cp, d.ville, d.naiss, d.email, d.photo,";
+$sql.= " t.libelle as type,";
+$sql.= " p.libelle as pays";
+$sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as t, ".MAIN_DB_PREFIX."adherent as d";
+$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_pays as p ON d.pays = p.rowid";
+$sql.= " WHERE d.fk_adherent_type = t.rowid AND d.statut = 1 AND datefin >= now()";
+$sql.= " ORDER BY d.rowid ASC";
+
+$result = $db->query($sql);
+if ($result)
+{
+ $num = $db->num_rows($result);
+ $i = 0;
+ while ($i < $num)
+ {
+ $objp = $db->fetch_object($result);
+ // attribut a remplacer
+ $replace = array (
+ ucfirst(strtolower($objp->prenom)),
+ strtoupper($objp->nom),
+ "http://".$_SERVER["SERVER_NAME"]."/",
+ $objp->societe,
+ ucwords(strtolower($objp->adresse)),
+ $objp->cp,
+ strtoupper($objp->ville),
+ ucfirst(strtolower($objp->pays)),
+ $objp->email,
+ $objp->naiss,
+ $objp->photo,
+ $objp->type,
+ $objp->rowid,
+ $annee
+ );
+
+ // imprime le texte specifique sur la carte
+ //$pdf->Add_PDF_card(sprintf("%s\n%s\n%s\n%s\n%s, %s\n%s", $objp->type." n° ".$objp->rowid,ucfirst(strtolower($objp->prenom))." ".strtoupper($objp->nom),"<".$objp->email.">", ucwords(strtolower($objp->adresse)), $objp->cp, strtoupper($objp->ville), ucfirst(strtolower($objp->pays))),$annee,"Association FreeLUG http://www.freelug.org/");
+ $pdf->Add_PDF_card(preg_replace ($patterns, $replace, ADHERENT_CARD_TEXT),preg_replace ($patterns, $replace, ADHERENT_CARD_HEADER_TEXT),preg_replace ($patterns, $replace, ADHERENT_CARD_FOOTER_TEXT));
+ $i++;
+ }
+
+ $db->close();
+ $pdf->Output();
+}
+else
+{
+ dolibarr_print_error($db);
+
+ llxFooter('$Date$ - $Revision$');
+}
+
+?>
diff --git a/htdocs/adherents/cartes/etiquette.php b/htdocs/adherents/cartes/etiquette.php
index 1ea3e2bb3ba..521620e32df 100755
--- a/htdocs/adherents/cartes/etiquette.php
+++ b/htdocs/adherents/cartes/etiquette.php
@@ -1,94 +1,94 @@
-
- * Copyright (C) 2003 Jean-Louis Bergamo
+
+ * Copyright (C) 2003 Jean-Louis Bergamo
* Copyright (C) 2006 Laurent Destailleur
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id$
- * $Source$
- */
-
-/**
- \file htdocs/adherents/cartes/etiquette.php
- \ingroup adherent
- \brief Page de creation d'etiquettes
- \version $Revision$
-*/
-
-require("./pre.inc.php");
-require(DOL_DOCUMENT_ROOT."/adherents/adherent.class.php");
-
-require_once('PDF_card.class.php');
-
-/*
- *-------------------------------------------------
- * Pour créer l'objet on a 2 moyens :
- * Soit on donne les valeurs en les passant dans un tableau (sert pour un format personnel)
- * Soit on donne le type d'étiquette au format AVERY
- *-------------------------------------------------
-*/
-
-//$pdf = new PDF_Label(array('name'=>'perso1', 'marginLeft'=>1, 'marginTop'=>1, 'NX'=>2, 'NY'=>7, 'SpaceX'=>0, 'SpaceY'=>0, 'width'=>99.1, 'height'=>'38.1', 'metric'=>'mm', 'font-size'=>14), 1, 2);
-//$pdf = new PDF_card('CARD', 1, 1);
-if (defined("ADHERENT_ETIQUETTE_TYPE") && ADHERENT_ETIQUETTE_TYPE !=''){
- $pdf = new PDF_card(ADHERENT_ETIQUETTE_TYPE, 1, 1);
-}else{
- $pdf = new PDF_card('L7163', 1, 1);
-}
-
-$pdf->Open();
-$pdf->AddPage();
-
-// Choix de l'annee d'impression ou annee courante.
-if (!isset($annee)){
- $now = getdate();
- $annee=$now['year'];
-}
-
-// requete en prenant que les adherents a jour de cotisation
-$sql = "SELECT d.rowid, d.prenom, d.nom, d.societe, ".$db->pdate("d.datefin")." as datefin,";
-$sql.= " d.adresse, d.cp, d.ville, d.naiss, d.email, d.photo,";
-$sql.= " t.libelle as type,";
-$sql.= " p.libelle as pays";
-$sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as t, ".MAIN_DB_PREFIX."adherent as d";
-$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_pays as p ON d.pays = p.rowid";
-$sql.= " WHERE d.fk_adherent_type = t.rowid AND d.statut = 1 AND datefin >= now()";
-$sql.= " ORDER BY d.rowid ASC";
-
-$result = $db->query($sql);
-if ($result)
-{
- $num = $db->num_rows();
- $i = 0;
- while ($i < $num)
- {
- $objp = $db->fetch_object($result);
- // imprime le texte specifique sur la carte
- $pdf->Add_PDF_card(sprintf("%s\n%s\n%s %s\n%s", ucfirst(strtolower($objp->prenom))." ".strtoupper($objp->nom), ucwords(strtolower($objp->adresse)), $objp->cp, strtoupper($objp->ville), ucfirst(strtolower($objp->pays))),'','');
- $i++;
- }
-
- $db->close();
- $pdf->Output();
-}
-else
-{
- dolibarr_print_error($db);
-
- llxFooter('$Date$ - $Revision$');
-}
-
-?>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ * $Source$
+ */
+
+/**
+ \file htdocs/adherents/cartes/etiquette.php
+ \ingroup adherent
+ \brief Page de creation d'etiquettes
+ \version $Revision$
+*/
+
+require("./pre.inc.php");
+require(DOL_DOCUMENT_ROOT."/adherents/adherent.class.php");
+
+require_once('PDF_card.class.php');
+
+/*
+ *-------------------------------------------------
+ * Pour créer l'objet on a 2 moyens :
+ * Soit on donne les valeurs en les passant dans un tableau (sert pour un format personnel)
+ * Soit on donne le type d'étiquette au format AVERY
+ *-------------------------------------------------
+*/
+
+//$pdf = new PDF_Label(array('name'=>'perso1', 'marginLeft'=>1, 'marginTop'=>1, 'NX'=>2, 'NY'=>7, 'SpaceX'=>0, 'SpaceY'=>0, 'width'=>99.1, 'height'=>'38.1', 'metric'=>'mm', 'font-size'=>14), 1, 2);
+//$pdf = new PDF_card('CARD', 1, 1);
+if (defined("ADHERENT_ETIQUETTE_TYPE") && ADHERENT_ETIQUETTE_TYPE !=''){
+ $pdf = new PDF_card(ADHERENT_ETIQUETTE_TYPE, 1, 1);
+}else{
+ $pdf = new PDF_card('L7163', 1, 1);
+}
+
+$pdf->Open();
+$pdf->AddPage();
+
+// Choix de l'annee d'impression ou annee courante.
+if (!isset($annee)){
+ $now = getdate();
+ $annee=$now['year'];
+}
+
+// requete en prenant que les adherents a jour de cotisation
+$sql = "SELECT d.rowid, d.prenom, d.nom, d.societe, ".$db->pdate("d.datefin")." as datefin,";
+$sql.= " d.adresse, d.cp, d.ville, d.naiss, d.email, d.photo,";
+$sql.= " t.libelle as type,";
+$sql.= " p.libelle as pays";
+$sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as t, ".MAIN_DB_PREFIX."adherent as d";
+$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_pays as p ON d.pays = p.rowid";
+$sql.= " WHERE d.fk_adherent_type = t.rowid AND d.statut = 1 AND datefin >= now()";
+$sql.= " ORDER BY d.rowid ASC";
+
+$result = $db->query($sql);
+if ($result)
+{
+ $num = $db->num_rows();
+ $i = 0;
+ while ($i < $num)
+ {
+ $objp = $db->fetch_object($result);
+ // imprime le texte specifique sur la carte
+ $pdf->Add_PDF_card(sprintf("%s\n%s\n%s %s\n%s", ucfirst(strtolower($objp->prenom))." ".strtoupper($objp->nom), ucwords(strtolower($objp->adresse)), $objp->cp, strtoupper($objp->ville), ucfirst(strtolower($objp->pays))),'','');
+ $i++;
+ }
+
+ $db->close();
+ $pdf->Output();
+}
+else
+{
+ dolibarr_print_error($db);
+
+ llxFooter('$Date$ - $Revision$');
+}
+
+?>
diff --git a/htdocs/admin/menus/images/.cvsignore b/htdocs/admin/menus/images/.cvsignore
index a92ea3e3f61..98e6ef67fad 100644
--- a/htdocs/admin/menus/images/.cvsignore
+++ b/htdocs/admin/menus/images/.cvsignore
@@ -1 +1 @@
-*.db
+*.db
diff --git a/htdocs/admin/tools/dolibarr_export.php b/htdocs/admin/tools/dolibarr_export.php
index 283e7002f0e..fd3b474c718 100644
--- a/htdocs/admin/tools/dolibarr_export.php
+++ b/htdocs/admin/tools/dolibarr_export.php
@@ -23,8 +23,8 @@
\file htdocs/admin/tools/dolibarr_export.php
\brief Page export de la base
\version $Revision$
-*/
-
+*/
+
require("./pre.inc.php");
include_once $dolibarr_main_document_root."/lib/databases/".$conf->db->type.".lib.php";
@@ -32,556 +32,556 @@ $langs->load("admin");
if (! $user->admin)
accessforbidden();
-
-$html=new Form($db);
-
-
-/*
-* Affichage page
-*/
+$html=new Form($db);
+
+
+
+/*
+* Affichage page
+*/
llxHeader();
-print_fiche_titre($langs->trans("Backup"),'','setup');
-print ' ';
-
-print $langs->trans("DatabaseName").' : '.$dolibarr_main_db_name.' ';
-print ' ';
-
-if ($_GET["msg"])
-{
- print '
This script supports both standard and extended Code 39 barcodes. The extended mode gives access
-to the full ASCII range (from 0 to 127). The script also gives the possibility to add a checksum.
-
-Code39(float x, float y, string code [, boolean ext [, boolean cks [, float w [, float h [, boolean wide]]]]])
-
-x: abscissa
-y: ordinate
-code: barcode value
-ext: indicates if extended mode must be used (true by default)
-cks: indicates if a checksum must be appended (false by default)
-w: width of a narrow bar (0.4 by default)
-h: height of bars (20 by default)
-wide: indicates if ratio between wide and narrow bars is high; if yes, ratio is 3, if no, it's 2 (true by default)
-
-
+
+
+
+Extended Code 39 barcodes
+
+
+
+
This script supports both standard and extended Code 39 barcodes. The extended mode gives access
+to the full ASCII range (from 0 to 127). The script also gives the possibility to add a checksum.
+
+Code39(float x, float y, string code [, boolean ext [, boolean cks [, float w [, float h [, boolean wide]]]]])
+
+x: abscissa
+y: ordinate
+code: barcode value
+ext: indicates if extended mode must be used (true by default)
+cks: indicates if a checksum must be appended (false by default)
+w: width of a narrow bar (0.4 by default)
+h: height of bars (20 by default)
+wide: indicates if ratio between wide and narrow bars is high; if yes, ratio is 3, if no, it's 2 (true by default)
+
+
diff --git a/htdocs/includes/fpdf/fpdf/FAQ.htm b/htdocs/includes/fpdf/fpdf/FAQ.htm
index 8ffe0dcbac5..839dcc4b875 100644
--- a/htdocs/includes/fpdf/fpdf/FAQ.htm
+++ b/htdocs/includes/fpdf/fpdf/FAQ.htm
@@ -1,302 +1,302 @@
-
-
-
-
-FAQ
-
-
-
-
1.Quelle est exactement la licence de FPDF ? Y a-t-il des restrictions d'utilisation ?
-FPDF est Freeware (c'est indiqué au début du fichier source). Il n'y a pas de restriction
-d'usage. Vous pouvez l'incorporer librement dans votre application (commerciale ou non), avec
-ou sans modification. Vous pouvez également le redistribuer.
-
2.Lorsque j'essaie de créer un PDF, plein de caractères bizarres s'affichent à l'écran.
-Ces caractères "bizarres" sont en fait le contenu réel du PDF. Ce comportement est un bug d'IE.
-Lorsqu'il reçoit d'abord une page HTML, puis un PDF à partir de la même URL, il l'affiche
-directement sans lancer le plug-in Acrobat. Cela arrive fréquemment en cours de développement :
-à la moindre erreur de script, une page HTML est envoyée, et après correction, le PDF arrive.
-
-Pour résoudre le problème, il suffit de fermer IE et de le relancer. On peut aussi aller sur
-une autre URL et revenir.
-
-Pour éviter ce genre de désagrément durant le développement, on peut générer le PDF directement
-dans un fichier et l'ouvrir via l'explorateur.
-
3.J'essaie de générer un PDF et IE m'affiche une page blanche. Que se passe-t-il ?
-Tout d'abord, vérifiez que vous n'envoyez rien au navigateur après le PDF (même pas un espace
-ou un retour-chariot). Vous pouvez mettre un exit juste après l'appel à la méthode Output()
-pour en être sûr.
-
-Si ce n'est pas ça, c'est que vous êtes victime du syndrome de la "page blanche". IE utilisé
-en conjonction avec le plug-in Acrobat souffre de très nombreux bugs, quelles que soient les
-versions. Essayez de tester votre application avec le plus de versions d'IE possible (en tout cas
-si elle est sur Internet). Le problème survient surtout lorsqu'on utilise la méthode POST, c'est
-pourquoi il est fortement déconseillé de l'utiliser (d'autant qu'elle pose d'autres problèmes,
-voir la question suivante). Le GET marche mieux mais peut échouer lorsque l'URL devient trop
-longue : il ne faut pas dépasser 45 caractères pour la query string. Il existe cependant une
-astuce pour dépasser cette limite : terminer l'URL par .pdf, ce qui trompe IE. Si vous utilisez
-un formulaire, il suffit de rajouter un champ caché en dernière position :
-
-
-
-L'utilisation de session PHP cause également souvent des dysfonctionnements (il faut éviter
-d'envoyer des en-têtes HTTP empêchant la mise en cache). Voir la question 5 pour un moyen
-de résoudre le problème.
-
-
-Pour éviter tous ces problèmes de manière fiable, il existe deux principales techniques :
-
-
-- Désactiver le plug-in et utiliser Acrobat comme application externe. Pour cela, lancez
-Acrobat ; dans le menu Fichier, Préférences, Générales, désactivez l'option "Intégrer au
-navigateur Web" (pour Acrobat 5 : Edition, Préférences, Options, "Afficher dans le navigateur").
-Puis, lorsque vous récupérez un PDF dans IE, ce dernier affiche la boîte "Ouvrir ce fichier" ou
-"Enregistrer ce fichier". Décochez la case "Toujours demander avant d'ouvrir ce type de fichier"
-et choisissez Ouvrir. Dorénavant les PDF s'ouvriront automatiquement dans une fenêtre Acrobat
-indépendante.
-
-L'inconvénient de la méthode est qu'il faut toucher à la configuration du poste client, ce
-qu'on peut faire en intranet mais pas pour Internet.
-
-
-- Utiliser une technique de redirection. Le principe consiste à générer le PDF dans un fichier
-temporaire sur le serveur et à rediriger le client dessus (en utilisant du JavaScript, pas
-l'en-tête HTTP Location qui pose aussi des problèmes). Par exemple, à la fin du script, on
-peut mettre :
-
-
-
-
-//Détermination d'un nom de fichier temporaire dans le répertoire courant
-$file=basename(tempnam(getcwd(),'tmp'));
-//Sauvegarde du PDF dans le fichier
-$pdf->Output($file);
-//Redirection JavaScript
-echo "<HTML><SCRIPT>document.location='getpdf.php?f=$file';</SCRIPT></HTML>";
-
-
-Puis ceci dans getpdf.php :
-
-
-
-
-<?php
-$f=$HTTP_GET_VARS['f'];
-//Contrôle du fichier (à ne pas oublier !)
-if(substr($f,0,3)!='tmp' or strpos($f,'/') or strpos($f,'\\'))
- die("Nom de fichier incorrect");
-if(!file_exists($f))
- die("Le fichier n'existe pas");
-//Traitement de la requête spéciale IE au cas où
-if($HTTP_SERVER_VARS['HTTP_USER_AGENT']=='contype')
-{
- Header('Content-Type: application/pdf');
- exit;
-}
-//Envoi du PDF
-Header('Content-Type: application/pdf');
-Header('Content-Length: '.filesize($f));
-readfile($f);
-//Suppression du fichier
-unlink($f);
-exit;
-?>
-
-
-Cette méthode fonctionne dans la plupart des cas, mais pose encore des problèmes avec IE6. La
-méthode "ultime" consiste à rediriger directement sur le fichier temporaire. Ce dernier doit
-donc avoir l'extension .pdf :
-
-
-
-
-//Détermination d'un nom de fichier temporaire dans le répertoire courant
-$file=basename(tempnam(getcwd(),'tmp'));
-rename($file,$file.'.pdf');
-$file.='.pdf';
-//Sauvegarde du PDF dans le fichier
-$pdf->Output($file);
-//Redirection JavaScript
-echo "<HTML><SCRIPT>document.location='$file';</SCRIPT></HTML>";
-
-
-Cette méthode transforme un PDF dynamique en PDF statique et évite ainsi tous les ennuis.
-Par contre, il faut prévoir une procédure de nettoyage pour effacer les fichiers temporaires.
-Par exemple :
-
-
-
-Cette fonction efface tous les fichiers de la forme tmp*.pdf dans le répertoire spécifié qui
-datent de plus d'une heure. Vous pouvez l'appeler où vous voulez, par exemple dans le script
-qui génère le PDF.
-
-
-Remarque : il est nécessaire d'ouvrir une nouvelle fenêtre pour le PDF, car on ne peut plus
-revenir en arrière à cause de la redirection.
-
4.J'envoie des paramètres en utilisant la méthode POST et les valeurs n'apparaissent pas dans le PDF.
-C'est un problème qui affecte certaines versions d'IE (en particulier la première 5.5). Voir la
-question précédente pour les moyens de le contourner.
-
5.Lorsque j'utilise une session PHP, IE n'affiche plus mon PDF mais propose de le télécharger.
-C'est un problème qui affecte certaines versions d'IE. Pour le contourner, ajoutez la ligne
-suivante avant session_start() :
-
-
-
-session_cache_limiter('private');
-
-
-ou bien faites une redirection comme expliqué à la question 3.
-
6.Quand je suis en SSL, IE n'arrive pas à ouvrir le PDF.
-Le problème peut être résolu en ajoutant cette ligne :
-
-
-
-Header('Pragma: public');
-
-
-
-
7.Quand j'exécute un script j'obtiens le message "FPDF error: Don't alter the locale before including class file".
-Lorsqu'on configure le séparateur décimal comme virgule avant d'inclure un fichier, il y a un
-bug dans certaines versions de PHP et les
-nombres décimaux sont tronqués. Il ne faut donc pas faire d'appel à setlocale() avant d'inclure la
-classe. Sous Unix, il ne faut pas non plus définir la variable d'environnement LC_ALL, car cela
-est équivalent à faire un appel à setlocale().
-
8.J'essaie de mettre un PNG et Acrobat me dit "Une erreur est survenue lors du traitement d'une page. Une erreur d'affichage est survenue".
-Acrobat 5 a un bug et ne peut pas afficher les images transparentes monochromes (i.e. avec 1 bit par pixel).
-Enlevez la transparence ou passez votre image en 16 couleurs (4 bits par pixel) ou plus.
-
9.J'ai l'erreur suivante quand j'essaie de générer un PDF : Warning: Cannot add header information - headers already sent by (output started at script.php:X)
-Il ne faut rien envoyer d'autre au navigateur que le PDF lui-même : pas d'HTML, pas d'espace, pas
-de retour-chariot, ni avant ni après. Le script envoie quelque chose à la ligne X.
-
10.J'essaie d'afficher une variable dans la méthode Header mais rien ne s'imprime.
-Il faut utiliser le mot-clé global, par exemple :
-
-
-
11.J'ai défini les méthodes Header et Footer dans ma classe PDF mais rien ne s'affiche.
-Il faut créer un objet de la classe PDF et non pas FPDF :
-
-
-
-$pdf=new PDF();
-
-
-
-
12.Je n'arrive pas à faire de retour à la ligne. J'ai bien mis \n dans la chaîne imprimée par MultiCell mais ça ne marche pas.
-Il faut mettre la chaîne entre guillemets et non pas entre apostrophes.
-
13.J'essaie de mettre le caractère euro mais je n'y arrive pas.
-Pour les polices standard, le caractère euro a pour code 128. Vous pouvez par commodité définir
-une constante comme suit :
-
-
-
-
-define('EURO',chr(128));
-
-
-Note : Acrobat 4 ou supérieur est requis pour afficher l'euro.
-
14.Je dessine un cadre avec des dimensions très précises, mais à l'impression je constate des écarts.
-Pour respecter les dimensions, il faut décocher la case "Ajuster" dans la boîte de dialogue
-d'impression.
-
15.Je voudrais utiliser toute la surface de la page mais à l'impression j'ai toujours des marges. Comment les enlever ?
-Les imprimantes ont toutes des marges physiques (variables en fonction du modèle), il est donc
-impossible de les supprimer et d'imprimer sur la totalité de la page.
-
16.Quelle est la taille limite des fichiers que je peux générer avec FPDF ?
-Il n'y a pas de limite particulière. Il existe cependant certaines contraintes :
-
-
-- La taille mémoire allouée par défaut aux scripts PHP est de 8 Mo. Pour de très gros
-documents, en particulier avec des images, cette limite peut être atteinte (le fichier étant
-construit en mémoire). Elle est paramétrée dans php.ini.
-
-
-- Le temps d'exécution alloué par défaut est de 30 secondes. Cette limite peut bien entendu
-être facilement dépassée. Elle est paramétrée dans php.ini et peut être éventuellement modifiée
-à l'exécution par set_time_limit().
-
-
-- Les navigateurs ont généralement un time-out de 5 minutes. Si vous envoyez le PDF directement
-au navigateur et que vous dépassez cette limite, il sera perdu. Il est donc conseillé pour les
-très gros documents de les générer dans un fichier, et d'envoyer des données de temps en temps
-au navigateur (par exemple page 1, page 2... en utilisant flush() pour forcer l'envoi).
-Lorsque le fichier est terminé, vous pouvez effectuer une redirection dessus avec JavaScript
-ou bien créer un lien.
-
-Remarque : même lorsque le navigateur part en time-out, il est possible que le script continue
-à s'exécuter sur le serveur.
-
-Il est possible d'importer un PDF existant grâce à l'extension FPDI :
-
-http://fpdi.setasign.de
-
18.Je voudrais faire un moteur de recherche en PHP et indexer des PDF. Est-ce que je peux le faire avec FPDF ?
-Non. Par contre il existe un utilitaire GPL en C, pdftotext, capable d'extraire le contenu
-textuel d'un PDF. Il est fourni avec l'archive de Xpdf :
-
-http://www.foolabs.com/xpdf/
-
19.Est-ce que je peux transformer une page HTML en PDF avec FPDF ?
-Non, on ne peut convertir que de l'HTML très simple, pas des pages réelles. Par contre il
-existe un utilitaire GPL en C, htmldoc, qui permet de le faire et donne de bons résultats :
-
-http://www.htmldoc.org
-
20.Est-ce que je peux concaténer des PDF avec FPDF ?
1.Quelle est exactement la licence de FPDF ? Y a-t-il des restrictions d'utilisation ?
+FPDF est Freeware (c'est indiqué au début du fichier source). Il n'y a pas de restriction
+d'usage. Vous pouvez l'incorporer librement dans votre application (commerciale ou non), avec
+ou sans modification. Vous pouvez également le redistribuer.
+
2.Lorsque j'essaie de créer un PDF, plein de caractères bizarres s'affichent à l'écran.
+Ces caractères "bizarres" sont en fait le contenu réel du PDF. Ce comportement est un bug d'IE.
+Lorsqu'il reçoit d'abord une page HTML, puis un PDF à partir de la même URL, il l'affiche
+directement sans lancer le plug-in Acrobat. Cela arrive fréquemment en cours de développement :
+à la moindre erreur de script, une page HTML est envoyée, et après correction, le PDF arrive.
+
+Pour résoudre le problème, il suffit de fermer IE et de le relancer. On peut aussi aller sur
+une autre URL et revenir.
+
+Pour éviter ce genre de désagrément durant le développement, on peut générer le PDF directement
+dans un fichier et l'ouvrir via l'explorateur.
+
3.J'essaie de générer un PDF et IE m'affiche une page blanche. Que se passe-t-il ?
+Tout d'abord, vérifiez que vous n'envoyez rien au navigateur après le PDF (même pas un espace
+ou un retour-chariot). Vous pouvez mettre un exit juste après l'appel à la méthode Output()
+pour en être sûr.
+
+Si ce n'est pas ça, c'est que vous êtes victime du syndrome de la "page blanche". IE utilisé
+en conjonction avec le plug-in Acrobat souffre de très nombreux bugs, quelles que soient les
+versions. Essayez de tester votre application avec le plus de versions d'IE possible (en tout cas
+si elle est sur Internet). Le problème survient surtout lorsqu'on utilise la méthode POST, c'est
+pourquoi il est fortement déconseillé de l'utiliser (d'autant qu'elle pose d'autres problèmes,
+voir la question suivante). Le GET marche mieux mais peut échouer lorsque l'URL devient trop
+longue : il ne faut pas dépasser 45 caractères pour la query string. Il existe cependant une
+astuce pour dépasser cette limite : terminer l'URL par .pdf, ce qui trompe IE. Si vous utilisez
+un formulaire, il suffit de rajouter un champ caché en dernière position :
+
+
+
+L'utilisation de session PHP cause également souvent des dysfonctionnements (il faut éviter
+d'envoyer des en-têtes HTTP empêchant la mise en cache). Voir la question 5 pour un moyen
+de résoudre le problème.
+
+
+Pour éviter tous ces problèmes de manière fiable, il existe deux principales techniques :
+
+
+- Désactiver le plug-in et utiliser Acrobat comme application externe. Pour cela, lancez
+Acrobat ; dans le menu Fichier, Préférences, Générales, désactivez l'option "Intégrer au
+navigateur Web" (pour Acrobat 5 : Edition, Préférences, Options, "Afficher dans le navigateur").
+Puis, lorsque vous récupérez un PDF dans IE, ce dernier affiche la boîte "Ouvrir ce fichier" ou
+"Enregistrer ce fichier". Décochez la case "Toujours demander avant d'ouvrir ce type de fichier"
+et choisissez Ouvrir. Dorénavant les PDF s'ouvriront automatiquement dans une fenêtre Acrobat
+indépendante.
+
+L'inconvénient de la méthode est qu'il faut toucher à la configuration du poste client, ce
+qu'on peut faire en intranet mais pas pour Internet.
+
+
+- Utiliser une technique de redirection. Le principe consiste à générer le PDF dans un fichier
+temporaire sur le serveur et à rediriger le client dessus (en utilisant du JavaScript, pas
+l'en-tête HTTP Location qui pose aussi des problèmes). Par exemple, à la fin du script, on
+peut mettre :
+
+
+
+
+//Détermination d'un nom de fichier temporaire dans le répertoire courant
+$file=basename(tempnam(getcwd(),'tmp'));
+//Sauvegarde du PDF dans le fichier
+$pdf->Output($file);
+//Redirection JavaScript
+echo "<HTML><SCRIPT>document.location='getpdf.php?f=$file';</SCRIPT></HTML>";
+
+
+Puis ceci dans getpdf.php :
+
+
+
+
+<?php
+$f=$HTTP_GET_VARS['f'];
+//Contrôle du fichier (à ne pas oublier !)
+if(substr($f,0,3)!='tmp' or strpos($f,'/') or strpos($f,'\\'))
+ die("Nom de fichier incorrect");
+if(!file_exists($f))
+ die("Le fichier n'existe pas");
+//Traitement de la requête spéciale IE au cas où
+if($HTTP_SERVER_VARS['HTTP_USER_AGENT']=='contype')
+{
+ Header('Content-Type: application/pdf');
+ exit;
+}
+//Envoi du PDF
+Header('Content-Type: application/pdf');
+Header('Content-Length: '.filesize($f));
+readfile($f);
+//Suppression du fichier
+unlink($f);
+exit;
+?>
+
+
+Cette méthode fonctionne dans la plupart des cas, mais pose encore des problèmes avec IE6. La
+méthode "ultime" consiste à rediriger directement sur le fichier temporaire. Ce dernier doit
+donc avoir l'extension .pdf :
+
+
+
+
+//Détermination d'un nom de fichier temporaire dans le répertoire courant
+$file=basename(tempnam(getcwd(),'tmp'));
+rename($file,$file.'.pdf');
+$file.='.pdf';
+//Sauvegarde du PDF dans le fichier
+$pdf->Output($file);
+//Redirection JavaScript
+echo "<HTML><SCRIPT>document.location='$file';</SCRIPT></HTML>";
+
+
+Cette méthode transforme un PDF dynamique en PDF statique et évite ainsi tous les ennuis.
+Par contre, il faut prévoir une procédure de nettoyage pour effacer les fichiers temporaires.
+Par exemple :
+
+
+
+Cette fonction efface tous les fichiers de la forme tmp*.pdf dans le répertoire spécifié qui
+datent de plus d'une heure. Vous pouvez l'appeler où vous voulez, par exemple dans le script
+qui génère le PDF.
+
+
+Remarque : il est nécessaire d'ouvrir une nouvelle fenêtre pour le PDF, car on ne peut plus
+revenir en arrière à cause de la redirection.
+
4.J'envoie des paramètres en utilisant la méthode POST et les valeurs n'apparaissent pas dans le PDF.
+C'est un problème qui affecte certaines versions d'IE (en particulier la première 5.5). Voir la
+question précédente pour les moyens de le contourner.
+
5.Lorsque j'utilise une session PHP, IE n'affiche plus mon PDF mais propose de le télécharger.
+C'est un problème qui affecte certaines versions d'IE. Pour le contourner, ajoutez la ligne
+suivante avant session_start() :
+
+
+
+session_cache_limiter('private');
+
+
+ou bien faites une redirection comme expliqué à la question 3.
+
6.Quand je suis en SSL, IE n'arrive pas à ouvrir le PDF.
+Le problème peut être résolu en ajoutant cette ligne :
+
+
+
+Header('Pragma: public');
+
+
+
+
7.Quand j'exécute un script j'obtiens le message "FPDF error: Don't alter the locale before including class file".
+Lorsqu'on configure le séparateur décimal comme virgule avant d'inclure un fichier, il y a un
+bug dans certaines versions de PHP et les
+nombres décimaux sont tronqués. Il ne faut donc pas faire d'appel à setlocale() avant d'inclure la
+classe. Sous Unix, il ne faut pas non plus définir la variable d'environnement LC_ALL, car cela
+est équivalent à faire un appel à setlocale().
+
8.J'essaie de mettre un PNG et Acrobat me dit "Une erreur est survenue lors du traitement d'une page. Une erreur d'affichage est survenue".
+Acrobat 5 a un bug et ne peut pas afficher les images transparentes monochromes (i.e. avec 1 bit par pixel).
+Enlevez la transparence ou passez votre image en 16 couleurs (4 bits par pixel) ou plus.
+
9.J'ai l'erreur suivante quand j'essaie de générer un PDF : Warning: Cannot add header information - headers already sent by (output started at script.php:X)
+Il ne faut rien envoyer d'autre au navigateur que le PDF lui-même : pas d'HTML, pas d'espace, pas
+de retour-chariot, ni avant ni après. Le script envoie quelque chose à la ligne X.
+
10.J'essaie d'afficher une variable dans la méthode Header mais rien ne s'imprime.
+Il faut utiliser le mot-clé global, par exemple :
+
+
+
11.J'ai défini les méthodes Header et Footer dans ma classe PDF mais rien ne s'affiche.
+Il faut créer un objet de la classe PDF et non pas FPDF :
+
+
+
+$pdf=new PDF();
+
+
+
+
12.Je n'arrive pas à faire de retour à la ligne. J'ai bien mis \n dans la chaîne imprimée par MultiCell mais ça ne marche pas.
+Il faut mettre la chaîne entre guillemets et non pas entre apostrophes.
+
13.J'essaie de mettre le caractère euro mais je n'y arrive pas.
+Pour les polices standard, le caractère euro a pour code 128. Vous pouvez par commodité définir
+une constante comme suit :
+
+
+
+
+define('EURO',chr(128));
+
+
+Note : Acrobat 4 ou supérieur est requis pour afficher l'euro.
+
14.Je dessine un cadre avec des dimensions très précises, mais à l'impression je constate des écarts.
+Pour respecter les dimensions, il faut décocher la case "Ajuster" dans la boîte de dialogue
+d'impression.
+
15.Je voudrais utiliser toute la surface de la page mais à l'impression j'ai toujours des marges. Comment les enlever ?
+Les imprimantes ont toutes des marges physiques (variables en fonction du modèle), il est donc
+impossible de les supprimer et d'imprimer sur la totalité de la page.
+
16.Quelle est la taille limite des fichiers que je peux générer avec FPDF ?
+Il n'y a pas de limite particulière. Il existe cependant certaines contraintes :
+
+
+- La taille mémoire allouée par défaut aux scripts PHP est de 8 Mo. Pour de très gros
+documents, en particulier avec des images, cette limite peut être atteinte (le fichier étant
+construit en mémoire). Elle est paramétrée dans php.ini.
+
+
+- Le temps d'exécution alloué par défaut est de 30 secondes. Cette limite peut bien entendu
+être facilement dépassée. Elle est paramétrée dans php.ini et peut être éventuellement modifiée
+à l'exécution par set_time_limit().
+
+
+- Les navigateurs ont généralement un time-out de 5 minutes. Si vous envoyez le PDF directement
+au navigateur et que vous dépassez cette limite, il sera perdu. Il est donc conseillé pour les
+très gros documents de les générer dans un fichier, et d'envoyer des données de temps en temps
+au navigateur (par exemple page 1, page 2... en utilisant flush() pour forcer l'envoi).
+Lorsque le fichier est terminé, vous pouvez effectuer une redirection dessus avec JavaScript
+ou bien créer un lien.
+
+Remarque : même lorsque le navigateur part en time-out, il est possible que le script continue
+à s'exécuter sur le serveur.
+
+Il est possible d'importer un PDF existant grâce à l'extension FPDI :
+
+http://fpdi.setasign.de
+
18.Je voudrais faire un moteur de recherche en PHP et indexer des PDF. Est-ce que je peux le faire avec FPDF ?
+Non. Par contre il existe un utilitaire GPL en C, pdftotext, capable d'extraire le contenu
+textuel d'un PDF. Il est fourni avec l'archive de Xpdf :
+
+http://www.foolabs.com/xpdf/
+
19.Est-ce que je peux transformer une page HTML en PDF avec FPDF ?
+Non, on ne peut convertir que de l'HTML très simple, pas des pages réelles. Par contre il
+existe un utilitaire GPL en C, htmldoc, qui permet de le faire et donne de bons résultats :
+
+http://www.htmldoc.org
+
20.Est-ce que je peux concaténer des PDF avec FPDF ?
-- Lorsque le sous-répertoire font se trouve dans le même répertoire que fpdf.php, il n'est maintenant plus nécessaire de définir la constante FPDF_FONTPATH.
-- Le tableau $HTTP_SERVER_VARS n'est plus utilisé. Cela pouvait poser des problèmes avec les configurations PHP 5 ayant désactivé l'option register_long_arrays.
-- L'incorporation des polices Type1 posait des problèmes avec certains processeurs de PDF.
-- Le nom du PDF envoyé au navigateur ne pouvait pas comporter d'espace.
-- La méthode Cell() ne pouvait pas imprimer le nombre 0 (seulement la chaîne '0').
-
-v1.52 (30/12/2003)
-
-- Image() affiche maintenant l'image en 72 dpi si aucune dimension n'est indiquée.
-- Output() prend un second paramètre chaîne pour indiquer la destination.
-- Open() est maintenant appelé automatiquement par AddPage().
-- L'insertion d'image JPEG distante ne génère plus d'erreur.
-- Le séparateur décimal est forcé au point dans le constructeur.
-- Ajout de différents encodages (turc, thaïlandais, hébreu, ukrainien et vietnamien).
-- La dernière ligne d'un MultiCell() cadré à droite n'était pas bien alignée si elle se terminait par un retour-chariot.
-- Plus de message d'erreur sur les en-têtes déjà envoyés lorsque le PDF est généré sur la sortie standard en mode ligne de commande.
-- Le souligné allait trop loin lorsque le texte comportait les caractères \, ( ou ).
-- $HTTP_ENV_VARS a été remplacé par $HTTP_SERVER_VARS.
-
-v1.51 (03/08/2002)
-
-- Support des polices Type1.
-- Ajout des encodages pour les pays baltes.
-- La classe travaille maintenant en interne en points avec l'origine en bas afin d'éviter deux bugs avec Acrobat 5 : * L'épaisseur des traits était trop importante lors des impressions sous Windows 98 SE et ME. * Les polices TrueType n'apparaissaient pas immédiatement dans le plug-in (une police de substitution était utilisée), il fallait provoquer un rafraîchissement de la fenêtre pour les voir apparaître.
-- La zone cliquable dans une cellule était toujours positionnée à gauche indépendamment de l'alignement du texte.
-- Les images JPEG en mode CMYK apparaissaient en couleurs inversées.
-- Les images PNG transparentes en niveaux de gris ou couleurs vraies étaient incorrectement traitées.
-- L'ajout de nouvelles polices fonctionne maintenant correctement même avec l'option magic_quotes_runtime à on.
-
-v1.5 (28/05/2002)
-
-- Support des polices TrueType (AddFont()) et des encodages (Europe de l'Ouest, de l'Est, cyrillique et grec).
-- Ajout de la méthode Write().
-- Ajout du style souligné.
-- Support des liens internes et externes (AddLink(), SetLink(), Link()).
-- Gestion de la marge droite et ajout des méthodes SetRightMargin() et SetTopMargin().
-- Modification de SetDisplayMode() pour sélectionner un affichage continu ou en colonnes.
-- Le paramètre border de MultiCell() permet de choisir les bords à tracer comme Cell().
-- Lorsqu'un document ne contient aucune page, Close() appelle maintenant AddPage() au lieu de provoquer une erreur fatale.
-
-v1.41 (13/03/2002)
-
-- Correction de SetDisplayMode() qui ne fonctionnait plus (le visualiseur PDF utilisait l'affichage par défaut).
-
-v1.4 (02/03/2002)
-
-- PHP3 n'est plus supporté.
-- Compression des pages (SetCompression()).
-- Choix du format des pages et possibilité de changer l'orientation en cours de document.
-- Ajout de la méthode AcceptPageBreak().
-- Ajout de la méthode SetLeftMargin().
-- Possibilité d'imprimer le nombre total de pages (AliasNbPages()).
-- Choix des bords des cellules à tracer.
-- Nouveau mode pour la méthode Cell() : la position courante se déplace sous la cellule.
-- Possibilité d'inclure une image en n'indiquant que la hauteur (la largeur est déterminée automatiquement).
-- Correction d'un bug : lorsqu'une ligne justifiée provoquait un saut de page, le pied de page héritait de l'espacement inter-mot correspondant.
-
-v1.31 (12/01/2002)
-
-- Correction d'un bug dans le tracé du cadre avec MultiCell() : la dernière ligne partait toujours de la marge gauche.
-- Suppression de l'en-tête HTTP Expires (pose des problèmes dans certains cas).
-- Ajout de l'en-tête HTTP Content-disposition (semble aider dans certains cas).
-
-v1.3 (03/12/2001)
-
-- Gestion des sauts de ligne avec justification du texte (MultiCell()).
-- Ajout du support de la couleur (SetDrawColor(), SetFillColor(), SetTextColor()). Possibilité de dessiner des rectangles pleins et de colorer le fond des cellules.
-- Une cellule dont la largeur est déclarée nulle s'étend jusqu'à la marge droite de la page.
-- L'épaisseur des traits est maintenant conservée de page en page et vaut 0,2 mm par défaut.
-- Ajout de la méthode SetXY().
-- Correction d'un passage par référence effectué d'une manière obsolète en PHP4.
-
-v1.2 (11/11/2001)
-
-- Ajout des fichiers de métrique des polices et de la méthode GetStringWidth().
-- Possibilité de centrer et d'aligner à droite le texte dans les cellules.
-- Réglage du mode d'affichage (SetDisplayMode()).
-- Ajout des méthodes de propriété du document (SetAuthor(), SetCreator(), SetKeywords(), SetSubject(), SetTitle()).
-- Possibilité de forcer le téléchargement du PDF.
-- Ajout des méthodes SetX() et GetX().
-- Lors du saut de page automatique, l'abscisse courante est maintenant conservée.
-
-v1.11 (20/10/2001)
-
-- L'utilisation des PNG ne nécessite plus PHP4 et l'extension Zlib. Les données sont intégrées directement dans le document PDF sans étape de décompression/recompression.
-- L'insertion d'image fonctionne maintenant correctement même avec l'option magic_quotes_runtime à on.
-
-v1.1 (07/10/2001)
-
-- Support des images JPEG et PNG.
-
-v1.01 (03/10/2001)
-
-- Correction d'un bug lors du saut de page : dans le cas où la méthode Header() ne spécifiait pas de police, celle de la page précédente n'était pas restaurée et produisait un document incorrect.
-
-v1.0 (17/09/2001)
-
-- Première version.
-
-
-
+
+
+
+Historique
+
+
+
+
Historique
+v1.53 (31/12/2004)
+
+- Lorsque le sous-répertoire font se trouve dans le même répertoire que fpdf.php, il n'est maintenant plus nécessaire de définir la constante FPDF_FONTPATH.
+- Le tableau $HTTP_SERVER_VARS n'est plus utilisé. Cela pouvait poser des problèmes avec les configurations PHP 5 ayant désactivé l'option register_long_arrays.
+- L'incorporation des polices Type1 posait des problèmes avec certains processeurs de PDF.
+- Le nom du PDF envoyé au navigateur ne pouvait pas comporter d'espace.
+- La méthode Cell() ne pouvait pas imprimer le nombre 0 (seulement la chaîne '0').
+
+v1.52 (30/12/2003)
+
+- Image() affiche maintenant l'image en 72 dpi si aucune dimension n'est indiquée.
+- Output() prend un second paramètre chaîne pour indiquer la destination.
+- Open() est maintenant appelé automatiquement par AddPage().
+- L'insertion d'image JPEG distante ne génère plus d'erreur.
+- Le séparateur décimal est forcé au point dans le constructeur.
+- Ajout de différents encodages (turc, thaïlandais, hébreu, ukrainien et vietnamien).
+- La dernière ligne d'un MultiCell() cadré à droite n'était pas bien alignée si elle se terminait par un retour-chariot.
+- Plus de message d'erreur sur les en-têtes déjà envoyés lorsque le PDF est généré sur la sortie standard en mode ligne de commande.
+- Le souligné allait trop loin lorsque le texte comportait les caractères \, ( ou ).
+- $HTTP_ENV_VARS a été remplacé par $HTTP_SERVER_VARS.
+
+v1.51 (03/08/2002)
+
+- Support des polices Type1.
+- Ajout des encodages pour les pays baltes.
+- La classe travaille maintenant en interne en points avec l'origine en bas afin d'éviter deux bugs avec Acrobat 5 : * L'épaisseur des traits était trop importante lors des impressions sous Windows 98 SE et ME. * Les polices TrueType n'apparaissaient pas immédiatement dans le plug-in (une police de substitution était utilisée), il fallait provoquer un rafraîchissement de la fenêtre pour les voir apparaître.
+- La zone cliquable dans une cellule était toujours positionnée à gauche indépendamment de l'alignement du texte.
+- Les images JPEG en mode CMYK apparaissaient en couleurs inversées.
+- Les images PNG transparentes en niveaux de gris ou couleurs vraies étaient incorrectement traitées.
+- L'ajout de nouvelles polices fonctionne maintenant correctement même avec l'option magic_quotes_runtime à on.
+
+v1.5 (28/05/2002)
+
+- Support des polices TrueType (AddFont()) et des encodages (Europe de l'Ouest, de l'Est, cyrillique et grec).
+- Ajout de la méthode Write().
+- Ajout du style souligné.
+- Support des liens internes et externes (AddLink(), SetLink(), Link()).
+- Gestion de la marge droite et ajout des méthodes SetRightMargin() et SetTopMargin().
+- Modification de SetDisplayMode() pour sélectionner un affichage continu ou en colonnes.
+- Le paramètre border de MultiCell() permet de choisir les bords à tracer comme Cell().
+- Lorsqu'un document ne contient aucune page, Close() appelle maintenant AddPage() au lieu de provoquer une erreur fatale.
+
+v1.41 (13/03/2002)
+
+- Correction de SetDisplayMode() qui ne fonctionnait plus (le visualiseur PDF utilisait l'affichage par défaut).
+
+v1.4 (02/03/2002)
+
+- PHP3 n'est plus supporté.
+- Compression des pages (SetCompression()).
+- Choix du format des pages et possibilité de changer l'orientation en cours de document.
+- Ajout de la méthode AcceptPageBreak().
+- Ajout de la méthode SetLeftMargin().
+- Possibilité d'imprimer le nombre total de pages (AliasNbPages()).
+- Choix des bords des cellules à tracer.
+- Nouveau mode pour la méthode Cell() : la position courante se déplace sous la cellule.
+- Possibilité d'inclure une image en n'indiquant que la hauteur (la largeur est déterminée automatiquement).
+- Correction d'un bug : lorsqu'une ligne justifiée provoquait un saut de page, le pied de page héritait de l'espacement inter-mot correspondant.
+
+v1.31 (12/01/2002)
+
+- Correction d'un bug dans le tracé du cadre avec MultiCell() : la dernière ligne partait toujours de la marge gauche.
+- Suppression de l'en-tête HTTP Expires (pose des problèmes dans certains cas).
+- Ajout de l'en-tête HTTP Content-disposition (semble aider dans certains cas).
+
+v1.3 (03/12/2001)
+
+- Gestion des sauts de ligne avec justification du texte (MultiCell()).
+- Ajout du support de la couleur (SetDrawColor(), SetFillColor(), SetTextColor()). Possibilité de dessiner des rectangles pleins et de colorer le fond des cellules.
+- Une cellule dont la largeur est déclarée nulle s'étend jusqu'à la marge droite de la page.
+- L'épaisseur des traits est maintenant conservée de page en page et vaut 0,2 mm par défaut.
+- Ajout de la méthode SetXY().
+- Correction d'un passage par référence effectué d'une manière obsolète en PHP4.
+
+v1.2 (11/11/2001)
+
+- Ajout des fichiers de métrique des polices et de la méthode GetStringWidth().
+- Possibilité de centrer et d'aligner à droite le texte dans les cellules.
+- Réglage du mode d'affichage (SetDisplayMode()).
+- Ajout des méthodes de propriété du document (SetAuthor(), SetCreator(), SetKeywords(), SetSubject(), SetTitle()).
+- Possibilité de forcer le téléchargement du PDF.
+- Ajout des méthodes SetX() et GetX().
+- Lors du saut de page automatique, l'abscisse courante est maintenant conservée.
+
+v1.11 (20/10/2001)
+
+- L'utilisation des PNG ne nécessite plus PHP4 et l'extension Zlib. Les données sont intégrées directement dans le document PDF sans étape de décompression/recompression.
+- L'insertion d'image fonctionne maintenant correctement même avec l'option magic_quotes_runtime à on.
+
+v1.1 (07/10/2001)
+
+- Support des images JPEG et PNG.
+
+v1.01 (03/10/2001)
+
+- Correction d'un bug lors du saut de page : dans le cas où la méthode Header() ne spécifiait pas de police, celle de la page précédente n'était pas restaurée et produisait un document incorrect.
+
+v1.0 (17/09/2001)
+
+- Première version.
+
+
+
diff --git a/htdocs/includes/fpdf/fpdf/install.txt b/htdocs/includes/fpdf/fpdf/install.txt
index 0e2cfaba92b..a2f01fa5e78 100644
--- a/htdocs/includes/fpdf/fpdf/install.txt
+++ b/htdocs/includes/fpdf/fpdf/install.txt
@@ -1,26 +1,26 @@
-FPDF est constitué des éléments suivants :
-
-- le fichier principal fpdf.php contenant la classe
-- les fichiers de métrique des polices (contenus dans le répertoire font de cette archive)
-
-Les fichiers de métrique sont indispensables dès que l'on veut écrire du texte dans un document.
-Ils peuvent se trouver en trois endroits différents :
-
-- dans le répertoire défini par la constante FPDF_FONTPATH (si cette constante est définie)
-- dans le répertoire font s'il se trouve au même niveau que fpdf.php (comme c'est le cas dans cette archive)
-- dans un des répertoires accessibles par include()
-
-Voici un exemple de définition de FPDF_FONTPATH (notez le slash final obligatoire) :
-
-define('FPDF_FONTPATH','/home/www/font/');
-require('fpdf.php');
-
-Si ces fichiers ne sont pas accessibles, la méthode SetFont() produira l'erreur suivante :
-
-FPDF error: Could not include font metric file
-
-
-Remarques :
-
-- Seuls les fichiers correspondant aux polices effectivement utilisées sont nécessaires
-- Les tutoriels fournis dans l'archive sont prêts à être exécutés
+FPDF est constitué des éléments suivants :
+
+- le fichier principal fpdf.php contenant la classe
+- les fichiers de métrique des polices (contenus dans le répertoire font de cette archive)
+
+Les fichiers de métrique sont indispensables dès que l'on veut écrire du texte dans un document.
+Ils peuvent se trouver en trois endroits différents :
+
+- dans le répertoire défini par la constante FPDF_FONTPATH (si cette constante est définie)
+- dans le répertoire font s'il se trouve au même niveau que fpdf.php (comme c'est le cas dans cette archive)
+- dans un des répertoires accessibles par include()
+
+Voici un exemple de définition de FPDF_FONTPATH (notez le slash final obligatoire) :
+
+define('FPDF_FONTPATH','/home/www/font/');
+require('fpdf.php');
+
+Si ces fichiers ne sont pas accessibles, la méthode SetFont() produira l'erreur suivante :
+
+FPDF error: Could not include font metric file
+
+
+Remarques :
+
+- Seuls les fichiers correspondant aux polices effectivement utilisées sont nécessaires
+- Les tutoriels fournis dans l'archive sont prêts à être exécutés
diff --git a/htdocs/includes/fpdf/i25/ex.php b/htdocs/includes/fpdf/i25/ex.php
index dafc00116aa..07bf9db7bc0 100755
--- a/htdocs/includes/fpdf/i25/ex.php
+++ b/htdocs/includes/fpdf/i25/ex.php
@@ -1,9 +1,9 @@
-AddPage();
-$pdf->i25(90,40,'12345678');
-$pdf->Output();
-?>
+AddPage();
+$pdf->i25(90,40,'12345678');
+$pdf->Output();
+?>
diff --git a/htdocs/includes/fpdf/i25/info.htm b/htdocs/includes/fpdf/i25/info.htm
index 3840769a520..7a0c1dafd08 100755
--- a/htdocs/includes/fpdf/i25/info.htm
+++ b/htdocs/includes/fpdf/i25/info.htm
@@ -1,28 +1,28 @@
-
-
-
-i25 barcodes
-
-
-
-
i25 barcodes
-
Informations
Author: Matthias Lau License: Freeware
-
Description
This script implements Interleaved 2 of 5 barcodes. An Interleaved 2 of 5 barcode contains
-digits (0 to 9) and encodes the data in the width of both bars and spaces. It is used primarily
-in the distribution and warehouse industry.
-
-i25(float xpos, float ypos, string code [, float basewidth [, float height]])
-
-xpos: abscissa of barcode
-ypos: ordinate of barcode
-code: value of barcode
-basewidth: corresponds to the width of a wide bar (defaults to 1)
-height: bar height (defaults to 10)
-
-Note: if the length of the code is not even, a 0 is preprended.
-
-
+
+
+
+i25 barcodes
+
+
+
+
i25 barcodes
+
Informations
Author: Matthias Lau License: Freeware
+
Description
This script implements Interleaved 2 of 5 barcodes. An Interleaved 2 of 5 barcode contains
+digits (0 to 9) and encodes the data in the width of both bars and spaces. It is used primarily
+in the distribution and warehouse industry.
+
+i25(float xpos, float ypos, string code [, float basewidth [, float height]])
+
+xpos: abscissa of barcode
+ypos: ordinate of barcode
+code: value of barcode
+basewidth: corresponds to the width of a wide bar (defaults to 1)
+height: bar height (defaults to 10)
+
+Note: if the length of the code is not even, a 0 is preprended.
+
+
diff --git a/htdocs/includes/modules/mailings/README b/htdocs/includes/modules/mailings/README
index f0abdae931d..1bc9de00d37 100644
--- a/htdocs/includes/modules/mailings/README
+++ b/htdocs/includes/modules/mailings/README
@@ -1,47 +1,47 @@
-
-If you want to add your own emails selector/import module. This is steps to follow
-to add you own email predefined selector:
-
-
-***** STEP 1 *****
-
-Copy file
-htdocs/includes/modules/mailings/example.modules.php
-into
-htdocs/includes/modules/mailings/myselector.modules.php
-
-You can choose value of your choice instead of "myselector" in name
-of new file.
-
-
-***** STEP 2 *****
-
-Edit this file myselector.modules.php and change following text:
-
-"class mailing_example" into "class mailing_myselector"
-"var $name='example';" into var $name='myselector';
-"var $desc='...';" into var $desc='A text to describe selector';
-"function mailing_example" into "function mailing_myselector"
-
-Then add code inside the "add_to_target" function. What you must do is simply
-fill the $target PHP array with one record for each email your selector must return.
-
-You can choose the way you get data: From a file, a database. You are free,
-the only requirement is that the $target array is filled by records that are
-themselves array of: ('email', 'name', 'firstname').
-
-This is for example how you can fill the $target array:
-
+
+If you want to add your own emails selector/import module. This is steps to follow
+to add you own email predefined selector:
+
+
+***** STEP 1 *****
+
+Copy file
+htdocs/includes/modules/mailings/example.modules.php
+into
+htdocs/includes/modules/mailings/myselector.modules.php
+
+You can choose value of your choice instead of "myselector" in name
+of new file.
+
+
+***** STEP 2 *****
+
+Edit this file myselector.modules.php and change following text:
+
+"class mailing_example" into "class mailing_myselector"
+"var $name='example';" into var $name='myselector';
+"var $desc='...';" into var $desc='A text to describe selector';
+"function mailing_example" into "function mailing_myselector"
+
+Then add code inside the "add_to_target" function. What you must do is simply
+fill the $target PHP array with one record for each email your selector must return.
+
+You can choose the way you get data: From a file, a database. You are free,
+the only requirement is that the $target array is filled by records that are
+themselves array of: ('email', 'name', 'firstname').
+
+This is for example how you can fill the $target array:
+
// ----- Your code start here -----
$target[0]=array('email'=>'email_0','name'=>'name_0','firstname'=>'firstname_0');
...
$target[n]=array('email'=>'email_n','name'=>'name_n','firstname'=>'firstname_n');
// ----- Your code end here -----
-
-
-
-***** STEP 3 *****
-
-Once this file has been edited, you can go to the Dolibarr emailing feature,
-you will see a new line selector in the "targets" editor of emailing tool.
-
+
+
+
+***** STEP 3 *****
+
+Once this file has been edited, you can go to the Dolibarr emailing feature,
+you will see a new line selector in the "targets" editor of emailing tool.
+
diff --git a/htdocs/includes/nusoap/.cvsignore b/htdocs/includes/nusoap/.cvsignore
index 72012cbe2eb..81154dd4d19 100644
--- a/htdocs/includes/nusoap/.cvsignore
+++ b/htdocs/includes/nusoap/.cvsignore
@@ -1 +1 @@
-samples
+samples
diff --git a/htdocs/includes/nusoap/lib/changelog b/htdocs/includes/nusoap/lib/changelog
index fe8c5ca59f1..b59d38c6d27 100644
--- a/htdocs/includes/nusoap/lib/changelog
+++ b/htdocs/includes/nusoap/lib/changelog
@@ -1,438 +1,438 @@
-2003-07-21, version 0.6.5
-- soap_transport_http: SOAPAction header is quoted again, fixes problem w/ Weblogic Server
-- applied Jason Levitt patch for proper array serialization, fixes problem w/ Amazon shopping cart services
-- fixed null value serialization
-- applied patch from "BZC ToOn'S" - fixes wsdl serialization when no parameters
-- applied John's patch, implementing compression for the server
-
-2003-07-22, version 0.6.5
-- soap_server: fixed bug causing charset encoding not to be passed to the parser
-- soap_fault: added default encoding to the fault serialization
-- soap_parser: changed the parser to pre-load the parent's result array when processing scalar values. This increases parsing speed.
-
-2003-07-23, version 0.6.5
-- soap_base: fix code that overwrites user-supplied attributes in serialize_val
-- soap_base: use arrays-of-arrays rather than attempting multi-dimensional in serialize_val
-- xmlschema: emit import statements and qualify all elements with prefix in serializeSchema (better interop with validation tools)
-- soapclient: get xml character encoding from HTTP Content-Type header if provided, e.g. text/xml;charset="UTF-8"
-- soapclient: use headers in call if provided (previously ignored this parameter)
-- soap_server: in parse_request, if neither getallheaders nor $_SERVER are available, use $HTTP_SERVER_VARS to get SOAPAction and xml encoding
-
-2003-07-24, version 0.6.5
-- soap_transport_http: apply patch from Steven Brown "if the server closes connection prematurely, nusoap would spin trying to read data that isn't there"
-
-2003-07-25, version 0.6.5
-- wsdl: apply patch from Sven to workaround single schema limitation
-- wsdl: apply a variant of the patch from Holger to handle empty values for array by serializing an array with 0 elements
-- xmlschema: remove the redundant default namespace attribute on the schema element; everything in xsd is explicitly specified as being from xsd
-- soap_transport_http: fix setCredentials and add TODO comments in sendHTTPS about what to change if this setCredentials stays
-
-2003-07-30, version 0.6.5
-- nusoap_base: change documentation of soap_defencoding to specify it is the encoding for outgoing messages
-- nusoap_base: only change &, <, > to entities, not all HTML entities
-- soap_transport_http: update the Content-Type header in sendRequest, since soap_defencoding could be changed after ctor is called
-- soap_server: use soap_defencoding instead of charset_encoding
-- soap_server: read encoding from _SERVER if available
-- nusoap_base: do entity translation for string parameters with an xsd type specified (thanks David Derr)
-
-2003-07-31, version 0.6.5
-- soap_transport_http: add proxy authentication
-- soap_transport_http: build payload the same way for http and https
-- wsdl: add proxy authentication
-- soapclient: add proxy authentication
-- soapclient: allow proxy information in ctor, so that it can be used for wsdl
-
-2003-08-01, version 0.6.5
-- soap_transport_http: close a persistent connection that's at EOF
-- soap_transport_http: prevent conflicts between setEncoding and usePersistentConnection
-- soap_transport_http: fix use of $headers instead of $this->incoming_headers in getResponse
-- soapclient: improve handling of persistent connections
-- soapclient: force xml_encoding to upper case
-- soap_server: let the Web server decide whether to close the connection (no Connection: close header)
-- soap_server: force xml_encoding to upper case
-
-2003-08-04, version 0.6.5
-- soap_parser: use XML type information to pick a PHP data type; also decode base64
-- soap_server: read all HTTP headers when using _SERVER or HTTP_SERVER_VARS
-- soap_server: add gzip encoding support for outgoing messages
-- soap_transport_http: deflate is gzcompress/gzuncompress (cf. http://archive.develooper.com/libwww@perl.org/msg04650.html)
-- soap_transport_http: clean use of persistentConnection so it's always a set boolean
-- soapclient: add responseData member to access deflated/gunzipped payload
-
-2003-08-05, version 0.6.5
-- soap_server: look multiple places when setting debug_flag
-
-2003-08-07, version 0.6.5
-- nusoap_base: serialize specified type (e.g. ArrayOfString) even for simple array
-- wsdl: only specify encodingStyle in the input/output soap bindings when it is not empty (thanks Guillaume)
-
-2003-08-15, version 0.6.5
-- soap_parser: fix parsing of elements with no XSD type specified
-- soap_parser: use PHP string type for XSD long and unsignedLong types
-
-2003-08-16, version 0.6.5
-- soap_parser: fix code generating warning (thanks Torsten)
-
-2003-08-19, version 0.6.5
-- soap_parser: fix another line of code generating a warning (thanks Torsten)
-
-2003-08-22, version 0.6.5
-- soap_server: remove all '--' from debug_str; previous code changed '---' to '- --'
-- wsdl, soapclient, soap_parser: patch submitted by Mark Spavin as described by
- the following...
-> Changes for the multiple/nested imports from the wsdl file. This builds an
-> array of files not just the last one and also checks for relative paths to
-> the parent. This will then get the imported files from the remote site
-> instead of your local disk. Local wsdl files should still work (untested).
->
-> Changes for multiple encoding sytles as previously posted
-
-2003-08-24, version 0.6.5
-- wsdl, soapclient: fix some PHP notices from previous update
-
-2003-08-26, version 0.6.5
-- wsdl: support multiple SOAP ports
-- soapclient, soap_server: when no charset is specified, use UTF-8, even though HTTP specifies US-ASCII.
-- soap_transport_http: do not prepend $host with 'ssl://' for https (is this required for older cURL versions?)
-
-2003-08-27, version 0.6.5
-- soap_server: support compressed request messages (thanks John Huong)
-- soap_parser: deserialize Apache Vector as an array
-- xmlschema: use $this->typemap in getPHPType (which is not used)
-- soapclient, wsdl: check for WSDL errors after serializing parameters
-- nusoap_base: add serialization of Apache Map (when not using WSDL)
-- wsdl: add serialization of Apache Map (when using WSDL)
-- wsdl: only change &, <, > to entities, not all HTML entities
-
-2003-08-28, version 0.6.5
-- soap_transport_http: disable cURL verification of peer and server (formerly the cURL default)
-- soap_transport_http: mingle cURL code with straight http, so sendHTTP is no longer needed
-
-2003-08-29, version 0.6.6
-- soap_transport_http: add setContentType
-- soapclient: call setContentType using new getHTTPContentType and getHTTPContentTypeCharset
-
-2003-09-05, version 0.6.6
-- wsdl: add some more code to handle null/nil values (but there's still a way to go)
-
-2003-10-21, version 0.6.6
-- soap_transport_http: only include port in Host header if it was specified in the URL
-- soap_transport_http: add some code to use OpenSSL for PHP ssl:// scheme, but comment out since it's not ready
-- soap_server: use $_SERVER['PHP_SELF'] if $GLOBALS['PHP_SELF'] is not set
-- wsdl: add WSDL request and response and transport debug to debug
-- wsdl: handle custom type extending xmlschema namespace (GLUE ... Thanks Matt)
-- soap_parser: add param to docs
-- soapclient: add getHTTPBody, getHTTPContentType, getHTTPContentTypeCharset (anticipating MIME subclass)
-
-2003-10-28, version 0.6.6
-- nusoap_base: add expandEntities method
-- wsdl: use expandEntities
-- soap_fault: use expandEntities
-- soap_transport_http: Allow credentials to be included in URL, rather than requiring setCredentials
-- soap_transport_http: Merge HTTP headers that span multiple lines
-- soap_parser: Properly set errors in ctor
-- soapclient: Pass headers to parseResponse and parse them in that method
-
-2003-10-30, version 0.6.6
-- xmlschema: Add some information for the related type to an element
-
-2003-12-09, version 0.6.6
-- nusoap_base: Add some namespace methods previously in xmlschema
-- xmlschema: Improve parsing of complexType, element and simpleType
-- xmlschema: Improve serialization
-- xmlschema: Track imports
-- xmlschema: Track elementFormDefault and form attributes
-- wsdl: Support multiple (note that setting $server->wsdl->schemaTargetNamespace no longer does anything! Use configureWSDL instead.)
-- wsdl: Use form attribute of element to control namespace specification
-- wsdl: Support chained imports (A imports B which imports C)
-- wsdl: Include port in endpoint address when serializing
-- soap_server: Fix use of style (rpc|document) and use (encoded|literal)
-- soap_server: Support _SERVER[CONTENT_TYPE] in addition to _SERVER[HTTP_CONTENT_TYPE]
-- soap_server: Support wsdl with multiple
-- soap_client: Remove a var_dump
-- soap_client: Add style and use parameters to call method to support doc/lit without WSDL
-- soap_transport_http: Check that $this->fp exists when doing persistent connections
-
-2003-12-17, version 0.6.6
-- soap_server: pass namespaces to xmlschema constructor
-- wsdl: post-process after all imports
-- wsdl: remove some debug, add some error handling
-- xmlschema: allow enclosing namespaces to be specified in constructor
-- xmlschema: improve handling of compositors and simple types
-
-2004-01-08, version 0.6.6
-- soap_server: when requested WSDL is in a file, return to client using passthru (thanks Ingo Fischer)
-- soapclient: have proxy inherit more client state
-- soapclient: allow timeout and response timeout to be specified in the constructor
-- wsdl: allow timeout and response timeout to be specified in the constructor
-- soap_transport_http: allow response timeout to be specified in send and sendHTTPS
-
-2004-01-28, version 0.6.6
-- wsdl: add namespace for array and scalar when form is qualified
-- wsdl: fix a bug in which data type of complexType elements were ignored in serialization
-- wsdl: enhance handling of URLs with file scheme
-- wsdl: add addSimpleType
-- xmlschema: add addSimpleType
-- xmlschema: always set phpType elements
-- soapclient: allow a wsdl instance to be specified in constructor
-- soap_server: allow a wsdl instance to be specified in constructor (not tested!)
-- soap_server: fix default SOAPAction created in register method
-- soap_transport_http: accept chunking with LF separators in addition to CRLF.
-- wsdlcache: added class
-- nusoapmime: fix comments
-
-2004-02-23, version 0.6.6
-- soap_transport_http: don't try to unchunk cURL data, since cURL already does it
-- soap_transport_http: append CVS revision to version in User-Agent
-- wsdl: serialize boolean as true|false, not 1|0, to agree with XML Schema
-- soap_server: always exit() after returning WSDL
-- soap_server: use the WSDL URL scheme as the default endpoint URL scheme
-- soap_server: append CVS revision to version in X-SOAP-Server
-- nusoap_base: add (CVS) revision
-- wsdlcache: synchronize using a per-WSDL lock file (Thanks Ingo)
-- wsdlcache: add cache lifetime, after which cache contents are invalidated (Thanks Ingo)
-
-2004-03-15, version 0.6.6
-- nusoap_base: add isArraySimpleOrStruct method
-- soap_server: improve WSDL URL scheme determination
-- soap_server: only deflate/gzip payloads > 1024 bytes
-- soap_server: fix parameter order in fault method (always used as faultcode, faultstring)
-- soap_server: refactor parse_request into multiple functions (for sanity)
-- soap_server: set the namespace on the Response element to the same as the request
-- soap_server: name the return value element 'return' by default
-- soap_server: added and documented data fields, so that service programmers can use them if desired
-- soap_parser: standardize parsing error message
-- soap_parser: fix document and responseHeaders so they are the correct XML text (as documented)
-- soap_transport_http: fix read from persistent connection
-- soapclient: clean up debugging for persistent connection
-- wsdl: enforce correct naming of messages parts when an associative array is used for parameters
-- wsdl: better serialization of null values
-- wsdl: standardize parsing error message
-- xmlschema: standardize parsing error message
-
-2004-03-24, version 0.6.7
-- soap_transport_http: add digest authentication (based on code by Kevin A. Miller)
-- xmlschema: improve parsing of import elements
-- wsdl: do schema imports even if there are no wsdl imports
-
-2004-04-12, version 0.6.7
-- wsdl: serialize multiple elements when maxOccurs="unbounded" and value is an array
-- wsdl: serialize soapval values (used to force an XML type, e.g. when WSDL uses an abstract type)
-- nusoapmime: do not require nusoap.php (it is now the programmer's responsibility)
-
-2004-04-21, version 0.6.7
-- soap_parser: parse repeated element name into an array (de-serializes doc/lit array into a PHP array when there is more than 1 array element)
-- soap_server: do not wrap response in a response element for a document style service
-
-2004-04-30, version 0.6.7
-- soap_transport_http: allow digest auth params to be separated by "," as well as ", "
-- soap_transport_http: re-initialize incoming headers for each response
-- soap_server: add methodreturnisliteralxml property to allow service function to return XML as a string
-- soapclient: improve rpc/literal support
-- soapclient: allow XML string as call params in addition to array
-- soapclient: support document style and literal encoding when not using WSDL
-
-2004-05-05, version 0.6.7
-- wsdl: serialize PHP objects for WSDL XML Schema complexTypes, in addition to associative arrays
-- wsdl: fix WSDL generation when there is no encodingStyle
-- soap_transport_http: suppress fsockopen warnings
-- soap_transport_http: detect socket timeouts when reading (0 bytes returned)
-- soap_transport_http: read chunked content "in-line" so it works on a persistent connection
-- nusoap_base: serialize boolean as true|false, not 1|0, to agree with XML Schema
-- nusoap_base: serialize array of struct differently than array of array
-
-2004-06-25, version 0.6.8
-- soap_server: prefer gzip to deflate, since IE does not like our deflate
-- soap_server: move webDescription to the wsdl class
-- soap_server: allow class and instance method calls for service (thanks Ingo Fischer and Roland Knall)
-- wsdl: get webDescription from the soap_server class
-- wsdl: allow compression from the server
-- wsdl: fix serialization of soapval without a type
-- wsdl: propagate debug value from query string to SOAP endpoint in programmatic WSDL generation
-- nusoap_base: add anyType, anySimpleType for 2001 XML Schema
-- nusoap_base: provide additional debug functions
-- soap_transport_http: ignore Content-Length when chunked encoding is used
-- soap_transport_http: remove ':' from username for Basic authentication (cf. RFC 2617)
-- soap_transport_http: urldecode username and password taken from URL
-- soap_transport_http: use raw inflate/deflate for IE/IIS compatibility, rather than having Zlib headers according to HTTP 1.1 spec
-- soap_transport_http: attempt to handle the case when both the service application and Web server compress the response
-- soapclient: when creating proxy methods, replace '.' in operation name with '__' in function name
-- soapclient: initialize requestHeaders in proxy
-- general: use new debug methods; never access debug_str directly
-
-2004-09-30, version 0.6.8
-- soapclient: do not allow getProxy call when WSDL is not used
-- soapclient: use ISO-8859-1 as the charset if not specified in the Content-Type header
-- soapclient: when an empty string is specified for the call namespace, do not put the method element in a namespace
-- soapclient: let soap_transport_http check for SSL support
-- soapclient: have proxy inherit soap_defencoding from the client from which it is generated
-- soapclient: do not assume that 'ns1' is an unused namespace prefix; always generate namespace prefixes randomly
-- soap_parser: compare any encoding in the XML declaration to the charset from the HTTP Content-Type header (thanks Ingo Fischer)
-- soap_parser: improve parse repeated element name into an array (de-serializes doc/lit array into a PHP array when there is more than 1 array element)
-- soap_server: use ISO-8859-1 as the charset if not specified in the Content-Type header
-- soap_server: allow suppression of automatic UTF-8 decoding
-- soap_server: fix a bug when call_user_func_array() is used
-- soap_transport_http: correct digest authentication through a proxy
-- wsdl: serialize SOAP-ENC types similarly to XSD types
-- xmlschema: force unprefixed type into default namespace
-- xmlschema: fix serialization of definition of simple types
-
-2004-10-01, version 0.6.8
-- soap_parser: handle default namespace attributes
-- soap_server: add default_utf8 field
-- soap_server: support literal encoding (with RPC style)
-- soap_transport_http: parse HTTP status and generate error for 300, 302-307, 400, 401-417, 501-505 (thanks for the idea Ghislain)
-- soap_transport_http: follow HTTP redirection (HTTP status 301 and Location header) (thanks for the idea Ghislain)
-- xmlschema: allow any attributes to be specified in an element of a complexType, e.g., abstract, default, form, minOccurs, maxOccurs, nillable (thanks Jirka Pech for the original patch)
-
-2004-10-02, version 0.6.8
-- soapclient: read/write cookies (thanks Ingo)
-- soap_server: change faultcode on non-resendable faults to Client
-- soap_transport_http: read/write cookies (thanks Ingo)
-
-2004-10-05, version 0.6.8
-- wsdl: add addElement method
-- wsdl: support the document style in the register method
-- xmlschema: parse unnamed simpleTypes, rather than ignoring them
-- xmlschema: include untyped elements when parsing a complexType
-- xmlschema: add addElement method
-
-2004-10-14, version 0.6.8
-- soapclient: support client certificates
-- soap_parser: deserialize attributes, prefixing names with "!"
-- soap_server: notify the client with HTML when WSDL is requested but not supported by service
-- soap_transport_http: support client certificates
-- wsdl: support defaults for elements of a complexType
-- wsdl: serialize elements from complexType extension base
-- wsdl: serialize data (associative array elements) as attributes according to XML Schema
-- xmlschema: record extension base if present for a complexType
-
-2004-12-15, version 0.6.8
-- nusoap_base: add 2000 XML Schema (rare, but used by Akamai)
-- soap_parser: avoid deserializing more common attributes that are not data
-- soap_parser: be lax when HTTP specifies ISO-8859-1 (the default) and XML specifies UTF-8 (the norm)
-- soap_server: account for the fact that get_class_methods returns methods in all lower case (thanks Steve Haldane)
-- soap_transport_http: parse digest info that includes '=' in the data (thanks Jinsuk Kim)
-- wsdl: feably handle some cases for literal serialization of form="unqualified" elements
-- wsdl: don't serialize the decimal portion of a PHP double when the XML type is long
-- wsdl: fix serialization of attributes for complexType that is an extension
-- wsdlcache: enhance diagnostics
-- xmlschema: handle untyped elements
-- xmlschema: handle WSDL for SOAP Array that uses the base attribute plus a sequence of element
-
-2005-01-22, version 0.6.8
-- wsdl: allow an element in one schema to have a type from another schema
-
-2005-01-24, version 0.6.8
-- xmlschema: correctly parse nested complexType definitions
-
-2005-02-14, version 0.6.8
-- nusoap_base: fix a bug in which attributes were sometimes not serialized with a value
-- nusoap_base: improve serialization of null values (thanks Dominique Stender)
-- soap_parser: parse null values by handling the nil attribute (thanks Dominique Stender)
-- soap_server: set character encoding for a fault to be the same as for the server (thanks Mark Scott)
-- soap_server: correctly check for null value returned from method when WSDL is used (without WSDL, cannot distinguish whether NULL or void return is desired)
-- soapclient: for document style, call should always return an array rooted at the response part (all bets are off when there are multiple parts)
-- xmlschema: save enumeration values parsed from WSDL
-
-2005-02-10, version 0.6.9
-- soapclient: only set SOAP headers when they are specified in call params (so setHeaders still works)
-
-2005-04-04, version 0.6.9
-- soap_server: use get_class instead of is_a (thanks Thomas Noel)
-- soapclient: use get_class instead of is_a (thanks Thomas Noel)
-- soapclient: add setEndpoint method
-- soap_transport_http: fix client certificates (thanks Doug Anarino and Eryan Eriobowo)
-
-2005-04-29, version 0.6.9
-- nusoap_base: add global variable and methods for setting debug level
-- nusoap_base: use xsd:anyType instead of xsd:ur-type to serialize arrays with multiple element types (thanks Ingo Fischer)
-- nusoap_base: expand entities in attributes (thanks Gaetano Giunta)
-- soapclient: call parent constructor
-- soapval: call parent constructor
-- soap_fault: call parent constructor
-- soap_parser: call parent constructor
-- soap_server: assume get_class_methods always returns lower case for PHP 4.x only
-- soap_server: call parent constructor
-- soap_transport_http: do nothing in setEncoding if gzdeflate is not present (thanks Franck Touanen for pointing this out)
-- soap_transport_http: fix check for server request for digest authentication (thanks Mark Spavin)
-- soap_transport_http: call parent constructor
-- wsdl: fix documentation page popup of one method after another (thanks Owen)
-- wsdl: call parent constructor
-- wsdl: expand entities in attributes (thanks Gaetano Giunta)
-- xmlschema: call parent constructor
-
-2005-06-03, version 0.6.9
-- nusoap_base: serialize empty arrays as having elements xsd:anyType[0]
-- nusoap_base: add encodingStyle parameter to serializeEnvelope
-- nusoap_base: serialize xsi:type with nil values
-- nusoap_base: improve debug and comments
-- soap_parser: correctly parse an empty array to an empty array, not an empty string
-- soap_parser: improve debug and comments
-- soap_server: specify encodingStyle for envelope when WSDL is used
-- soapclient: factor out new getProxyClassCode method
-- soapclient: specify encodingStyle for envelope
-- soapclient: improve debug and comments
-- wsdl: add namespace for Apache SOAP types if a variable of such type is serialized
-- wsdl: serialize nil value for nillable elements when no value is provided
-- wsdl: serialize xsi:type with nil values
-- wsdl: copy attributes as well as elements to an element from its complexType
-- wsdl: specify encodingStyle for operations
-- wsdl: improve debug and comments
-- xmlschema: improve debug and comments
-
-2005-06-03, version 0.7.0
-- nusoap_base: improve debug and comments
-- nusoap_base: fix version, which should have been 0.7.0 since 2005-03-04
-
-2005-06-06, version 0.7.1
-- nusoap_base: adjust numeric element names for serialization, instead of forcing them to 'soapVal'
-- nusoapmime: add type=text/xml to multipart/related (thanks Emmanuel Cordonnier)
-- soap_fault: fix serialization of detail
-- soap_server: check required parameters for register method
-- soap_server: when getallheaders is used, massage header names
-- soap_server: use SOAPAction to determine operation when doc/lit service does not wrap parameters in an element with the method name (thanks Peter Hrastnik)
-- soap_transport_http: correctly handle multiple HTTP/1.1 100 responses for https (thanks Jan Slabon)
-- wsdl: fixed documentation for addComplexType (thanks Csintalan Ádám)
-- wsdl: serialize array data when maxOccurs = 'unbounded' OR maxOccurs > 1 (thanks Dominique Schreckling)
-- wsdl: when serializing a string == 'false' as a boolean, set the value to false
-- wsdl: when serializing a complexType, require the PHP value supplied to be an array
-
-2005-07-01, version 0.7.1
-- nusoap_base: Allow SOAP headers to be supplied as an array like parameters
-- soap_parser: de-serialize simpleContent that accompanies complexContent
-- soap_server: append debug information when programmatically-defined WSDL is returned
-- soap_transport_http: Add debug when an outgoing header is set
-- soapclient: Allow SOAP headers to be supplied as an array like parameters
-- xmlschema: serialize attributes more generally, rather than assuming they are for SOAP 1.1 Array
-- wsdl: when serializing, look up types by namespace, not prefix (simple programmatic doc/lit WSDL now seems to work)
-- wsdl: process namespace declarations first when parsing an element
-
-2005-07-27, version 0.7.1
-- nusoap_base: do not override supplied element name with class name when serializing an object in serialize_val
-- nusoap_base: remove http://soapinterop.org/xsd (si) from namespaces array
-- nusoapmime: add nusoapservermime class to implement MIME attachments on the server
-- soap_fault: improve documentation
-- soap_server: improve documentation
-- soap_server: make consistent use of _SERVER and HTTP_SERVER_VARS
-- soap_server: make all incoming HTTP header keys lower case
-- soap_server: add hook functions to support subclassing for MIME attachments
-- soap_transport_http: remove an unnecessary global statement
-- soapclient: when creating a proxy, make $params within each function an associative array
-- soapval: improve documentation
-- wsdl: when serializing complexType elements, used typed serialization if there is either a type or a reference for the element
-- wsdl: allow PHP objects to be serialized as SOAP structs in serializeType
-- wsdl: for WSDL and XML Schema imports, don't forget to use the TCP port number (thanks Luca GIOPPO)
-- wsdl: make consistent use of _SERVER and HTTP_SERVER_VARS
-- xmlschema: improve documentation
-
-2005-07-31, version 0.7.2
-- nusoap_base: correctly serialize attributes in serialize_val (thanks Hidran Arias)
-- soap_parser: when resolving references, do not assume that buildVal returns an array (thanks Akshell)
-- soap_parser: removed decode_entities, which does not work (thanks Martin Sarsale)
-- soap_server: fix a bug parsing headers from _SERVER and HTTP_SERVER_VARS (thanks Bert Catsburg)
-- soap_server: parse all "headers" from HTTP_SERVER_VARS (not just HTTP_*)
-- soap_server: use PHP_SELF instead of SCRIPT_NAME for WSDL endpoint
-- soap_server: when generating a fault while debug_flag is true, put debug into faultdetail
-- wsdl: add enumeration parameter to addSimpleType
-- xmlschema: add enumeration parameter to addSimpleType
+2003-07-21, version 0.6.5
+- soap_transport_http: SOAPAction header is quoted again, fixes problem w/ Weblogic Server
+- applied Jason Levitt patch for proper array serialization, fixes problem w/ Amazon shopping cart services
+- fixed null value serialization
+- applied patch from "BZC ToOn'S" - fixes wsdl serialization when no parameters
+- applied John's patch, implementing compression for the server
+
+2003-07-22, version 0.6.5
+- soap_server: fixed bug causing charset encoding not to be passed to the parser
+- soap_fault: added default encoding to the fault serialization
+- soap_parser: changed the parser to pre-load the parent's result array when processing scalar values. This increases parsing speed.
+
+2003-07-23, version 0.6.5
+- soap_base: fix code that overwrites user-supplied attributes in serialize_val
+- soap_base: use arrays-of-arrays rather than attempting multi-dimensional in serialize_val
+- xmlschema: emit import statements and qualify all elements with prefix in serializeSchema (better interop with validation tools)
+- soapclient: get xml character encoding from HTTP Content-Type header if provided, e.g. text/xml;charset="UTF-8"
+- soapclient: use headers in call if provided (previously ignored this parameter)
+- soap_server: in parse_request, if neither getallheaders nor $_SERVER are available, use $HTTP_SERVER_VARS to get SOAPAction and xml encoding
+
+2003-07-24, version 0.6.5
+- soap_transport_http: apply patch from Steven Brown "if the server closes connection prematurely, nusoap would spin trying to read data that isn't there"
+
+2003-07-25, version 0.6.5
+- wsdl: apply patch from Sven to workaround single schema limitation
+- wsdl: apply a variant of the patch from Holger to handle empty values for array by serializing an array with 0 elements
+- xmlschema: remove the redundant default namespace attribute on the schema element; everything in xsd is explicitly specified as being from xsd
+- soap_transport_http: fix setCredentials and add TODO comments in sendHTTPS about what to change if this setCredentials stays
+
+2003-07-30, version 0.6.5
+- nusoap_base: change documentation of soap_defencoding to specify it is the encoding for outgoing messages
+- nusoap_base: only change &, <, > to entities, not all HTML entities
+- soap_transport_http: update the Content-Type header in sendRequest, since soap_defencoding could be changed after ctor is called
+- soap_server: use soap_defencoding instead of charset_encoding
+- soap_server: read encoding from _SERVER if available
+- nusoap_base: do entity translation for string parameters with an xsd type specified (thanks David Derr)
+
+2003-07-31, version 0.6.5
+- soap_transport_http: add proxy authentication
+- soap_transport_http: build payload the same way for http and https
+- wsdl: add proxy authentication
+- soapclient: add proxy authentication
+- soapclient: allow proxy information in ctor, so that it can be used for wsdl
+
+2003-08-01, version 0.6.5
+- soap_transport_http: close a persistent connection that's at EOF
+- soap_transport_http: prevent conflicts between setEncoding and usePersistentConnection
+- soap_transport_http: fix use of $headers instead of $this->incoming_headers in getResponse
+- soapclient: improve handling of persistent connections
+- soapclient: force xml_encoding to upper case
+- soap_server: let the Web server decide whether to close the connection (no Connection: close header)
+- soap_server: force xml_encoding to upper case
+
+2003-08-04, version 0.6.5
+- soap_parser: use XML type information to pick a PHP data type; also decode base64
+- soap_server: read all HTTP headers when using _SERVER or HTTP_SERVER_VARS
+- soap_server: add gzip encoding support for outgoing messages
+- soap_transport_http: deflate is gzcompress/gzuncompress (cf. http://archive.develooper.com/libwww@perl.org/msg04650.html)
+- soap_transport_http: clean use of persistentConnection so it's always a set boolean
+- soapclient: add responseData member to access deflated/gunzipped payload
+
+2003-08-05, version 0.6.5
+- soap_server: look multiple places when setting debug_flag
+
+2003-08-07, version 0.6.5
+- nusoap_base: serialize specified type (e.g. ArrayOfString) even for simple array
+- wsdl: only specify encodingStyle in the input/output soap bindings when it is not empty (thanks Guillaume)
+
+2003-08-15, version 0.6.5
+- soap_parser: fix parsing of elements with no XSD type specified
+- soap_parser: use PHP string type for XSD long and unsignedLong types
+
+2003-08-16, version 0.6.5
+- soap_parser: fix code generating warning (thanks Torsten)
+
+2003-08-19, version 0.6.5
+- soap_parser: fix another line of code generating a warning (thanks Torsten)
+
+2003-08-22, version 0.6.5
+- soap_server: remove all '--' from debug_str; previous code changed '---' to '- --'
+- wsdl, soapclient, soap_parser: patch submitted by Mark Spavin as described by
+ the following...
+> Changes for the multiple/nested imports from the wsdl file. This builds an
+> array of files not just the last one and also checks for relative paths to
+> the parent. This will then get the imported files from the remote site
+> instead of your local disk. Local wsdl files should still work (untested).
+>
+> Changes for multiple encoding sytles as previously posted
+
+2003-08-24, version 0.6.5
+- wsdl, soapclient: fix some PHP notices from previous update
+
+2003-08-26, version 0.6.5
+- wsdl: support multiple SOAP ports
+- soapclient, soap_server: when no charset is specified, use UTF-8, even though HTTP specifies US-ASCII.
+- soap_transport_http: do not prepend $host with 'ssl://' for https (is this required for older cURL versions?)
+
+2003-08-27, version 0.6.5
+- soap_server: support compressed request messages (thanks John Huong)
+- soap_parser: deserialize Apache Vector as an array
+- xmlschema: use $this->typemap in getPHPType (which is not used)
+- soapclient, wsdl: check for WSDL errors after serializing parameters
+- nusoap_base: add serialization of Apache Map (when not using WSDL)
+- wsdl: add serialization of Apache Map (when using WSDL)
+- wsdl: only change &, <, > to entities, not all HTML entities
+
+2003-08-28, version 0.6.5
+- soap_transport_http: disable cURL verification of peer and server (formerly the cURL default)
+- soap_transport_http: mingle cURL code with straight http, so sendHTTP is no longer needed
+
+2003-08-29, version 0.6.6
+- soap_transport_http: add setContentType
+- soapclient: call setContentType using new getHTTPContentType and getHTTPContentTypeCharset
+
+2003-09-05, version 0.6.6
+- wsdl: add some more code to handle null/nil values (but there's still a way to go)
+
+2003-10-21, version 0.6.6
+- soap_transport_http: only include port in Host header if it was specified in the URL
+- soap_transport_http: add some code to use OpenSSL for PHP ssl:// scheme, but comment out since it's not ready
+- soap_server: use $_SERVER['PHP_SELF'] if $GLOBALS['PHP_SELF'] is not set
+- wsdl: add WSDL request and response and transport debug to debug
+- wsdl: handle custom type extending xmlschema namespace (GLUE ... Thanks Matt)
+- soap_parser: add param to docs
+- soapclient: add getHTTPBody, getHTTPContentType, getHTTPContentTypeCharset (anticipating MIME subclass)
+
+2003-10-28, version 0.6.6
+- nusoap_base: add expandEntities method
+- wsdl: use expandEntities
+- soap_fault: use expandEntities
+- soap_transport_http: Allow credentials to be included in URL, rather than requiring setCredentials
+- soap_transport_http: Merge HTTP headers that span multiple lines
+- soap_parser: Properly set errors in ctor
+- soapclient: Pass headers to parseResponse and parse them in that method
+
+2003-10-30, version 0.6.6
+- xmlschema: Add some information for the related type to an element
+
+2003-12-09, version 0.6.6
+- nusoap_base: Add some namespace methods previously in xmlschema
+- xmlschema: Improve parsing of complexType, element and simpleType
+- xmlschema: Improve serialization
+- xmlschema: Track imports
+- xmlschema: Track elementFormDefault and form attributes
+- wsdl: Support multiple (note that setting $server->wsdl->schemaTargetNamespace no longer does anything! Use configureWSDL instead.)
+- wsdl: Use form attribute of element to control namespace specification
+- wsdl: Support chained imports (A imports B which imports C)
+- wsdl: Include port in endpoint address when serializing
+- soap_server: Fix use of style (rpc|document) and use (encoded|literal)
+- soap_server: Support _SERVER[CONTENT_TYPE] in addition to _SERVER[HTTP_CONTENT_TYPE]
+- soap_server: Support wsdl with multiple
+- soap_client: Remove a var_dump
+- soap_client: Add style and use parameters to call method to support doc/lit without WSDL
+- soap_transport_http: Check that $this->fp exists when doing persistent connections
+
+2003-12-17, version 0.6.6
+- soap_server: pass namespaces to xmlschema constructor
+- wsdl: post-process after all imports
+- wsdl: remove some debug, add some error handling
+- xmlschema: allow enclosing namespaces to be specified in constructor
+- xmlschema: improve handling of compositors and simple types
+
+2004-01-08, version 0.6.6
+- soap_server: when requested WSDL is in a file, return to client using passthru (thanks Ingo Fischer)
+- soapclient: have proxy inherit more client state
+- soapclient: allow timeout and response timeout to be specified in the constructor
+- wsdl: allow timeout and response timeout to be specified in the constructor
+- soap_transport_http: allow response timeout to be specified in send and sendHTTPS
+
+2004-01-28, version 0.6.6
+- wsdl: add namespace for array and scalar when form is qualified
+- wsdl: fix a bug in which data type of complexType elements were ignored in serialization
+- wsdl: enhance handling of URLs with file scheme
+- wsdl: add addSimpleType
+- xmlschema: add addSimpleType
+- xmlschema: always set phpType elements
+- soapclient: allow a wsdl instance to be specified in constructor
+- soap_server: allow a wsdl instance to be specified in constructor (not tested!)
+- soap_server: fix default SOAPAction created in register method
+- soap_transport_http: accept chunking with LF separators in addition to CRLF.
+- wsdlcache: added class
+- nusoapmime: fix comments
+
+2004-02-23, version 0.6.6
+- soap_transport_http: don't try to unchunk cURL data, since cURL already does it
+- soap_transport_http: append CVS revision to version in User-Agent
+- wsdl: serialize boolean as true|false, not 1|0, to agree with XML Schema
+- soap_server: always exit() after returning WSDL
+- soap_server: use the WSDL URL scheme as the default endpoint URL scheme
+- soap_server: append CVS revision to version in X-SOAP-Server
+- nusoap_base: add (CVS) revision
+- wsdlcache: synchronize using a per-WSDL lock file (Thanks Ingo)
+- wsdlcache: add cache lifetime, after which cache contents are invalidated (Thanks Ingo)
+
+2004-03-15, version 0.6.6
+- nusoap_base: add isArraySimpleOrStruct method
+- soap_server: improve WSDL URL scheme determination
+- soap_server: only deflate/gzip payloads > 1024 bytes
+- soap_server: fix parameter order in fault method (always used as faultcode, faultstring)
+- soap_server: refactor parse_request into multiple functions (for sanity)
+- soap_server: set the namespace on the Response element to the same as the request
+- soap_server: name the return value element 'return' by default
+- soap_server: added and documented data fields, so that service programmers can use them if desired
+- soap_parser: standardize parsing error message
+- soap_parser: fix document and responseHeaders so they are the correct XML text (as documented)
+- soap_transport_http: fix read from persistent connection
+- soapclient: clean up debugging for persistent connection
+- wsdl: enforce correct naming of messages parts when an associative array is used for parameters
+- wsdl: better serialization of null values
+- wsdl: standardize parsing error message
+- xmlschema: standardize parsing error message
+
+2004-03-24, version 0.6.7
+- soap_transport_http: add digest authentication (based on code by Kevin A. Miller)
+- xmlschema: improve parsing of import elements
+- wsdl: do schema imports even if there are no wsdl imports
+
+2004-04-12, version 0.6.7
+- wsdl: serialize multiple elements when maxOccurs="unbounded" and value is an array
+- wsdl: serialize soapval values (used to force an XML type, e.g. when WSDL uses an abstract type)
+- nusoapmime: do not require nusoap.php (it is now the programmer's responsibility)
+
+2004-04-21, version 0.6.7
+- soap_parser: parse repeated element name into an array (de-serializes doc/lit array into a PHP array when there is more than 1 array element)
+- soap_server: do not wrap response in a response element for a document style service
+
+2004-04-30, version 0.6.7
+- soap_transport_http: allow digest auth params to be separated by "," as well as ", "
+- soap_transport_http: re-initialize incoming headers for each response
+- soap_server: add methodreturnisliteralxml property to allow service function to return XML as a string
+- soapclient: improve rpc/literal support
+- soapclient: allow XML string as call params in addition to array
+- soapclient: support document style and literal encoding when not using WSDL
+
+2004-05-05, version 0.6.7
+- wsdl: serialize PHP objects for WSDL XML Schema complexTypes, in addition to associative arrays
+- wsdl: fix WSDL generation when there is no encodingStyle
+- soap_transport_http: suppress fsockopen warnings
+- soap_transport_http: detect socket timeouts when reading (0 bytes returned)
+- soap_transport_http: read chunked content "in-line" so it works on a persistent connection
+- nusoap_base: serialize boolean as true|false, not 1|0, to agree with XML Schema
+- nusoap_base: serialize array of struct differently than array of array
+
+2004-06-25, version 0.6.8
+- soap_server: prefer gzip to deflate, since IE does not like our deflate
+- soap_server: move webDescription to the wsdl class
+- soap_server: allow class and instance method calls for service (thanks Ingo Fischer and Roland Knall)
+- wsdl: get webDescription from the soap_server class
+- wsdl: allow compression from the server
+- wsdl: fix serialization of soapval without a type
+- wsdl: propagate debug value from query string to SOAP endpoint in programmatic WSDL generation
+- nusoap_base: add anyType, anySimpleType for 2001 XML Schema
+- nusoap_base: provide additional debug functions
+- soap_transport_http: ignore Content-Length when chunked encoding is used
+- soap_transport_http: remove ':' from username for Basic authentication (cf. RFC 2617)
+- soap_transport_http: urldecode username and password taken from URL
+- soap_transport_http: use raw inflate/deflate for IE/IIS compatibility, rather than having Zlib headers according to HTTP 1.1 spec
+- soap_transport_http: attempt to handle the case when both the service application and Web server compress the response
+- soapclient: when creating proxy methods, replace '.' in operation name with '__' in function name
+- soapclient: initialize requestHeaders in proxy
+- general: use new debug methods; never access debug_str directly
+
+2004-09-30, version 0.6.8
+- soapclient: do not allow getProxy call when WSDL is not used
+- soapclient: use ISO-8859-1 as the charset if not specified in the Content-Type header
+- soapclient: when an empty string is specified for the call namespace, do not put the method element in a namespace
+- soapclient: let soap_transport_http check for SSL support
+- soapclient: have proxy inherit soap_defencoding from the client from which it is generated
+- soapclient: do not assume that 'ns1' is an unused namespace prefix; always generate namespace prefixes randomly
+- soap_parser: compare any encoding in the XML declaration to the charset from the HTTP Content-Type header (thanks Ingo Fischer)
+- soap_parser: improve parse repeated element name into an array (de-serializes doc/lit array into a PHP array when there is more than 1 array element)
+- soap_server: use ISO-8859-1 as the charset if not specified in the Content-Type header
+- soap_server: allow suppression of automatic UTF-8 decoding
+- soap_server: fix a bug when call_user_func_array() is used
+- soap_transport_http: correct digest authentication through a proxy
+- wsdl: serialize SOAP-ENC types similarly to XSD types
+- xmlschema: force unprefixed type into default namespace
+- xmlschema: fix serialization of definition of simple types
+
+2004-10-01, version 0.6.8
+- soap_parser: handle default namespace attributes
+- soap_server: add default_utf8 field
+- soap_server: support literal encoding (with RPC style)
+- soap_transport_http: parse HTTP status and generate error for 300, 302-307, 400, 401-417, 501-505 (thanks for the idea Ghislain)
+- soap_transport_http: follow HTTP redirection (HTTP status 301 and Location header) (thanks for the idea Ghislain)
+- xmlschema: allow any attributes to be specified in an element of a complexType, e.g., abstract, default, form, minOccurs, maxOccurs, nillable (thanks Jirka Pech for the original patch)
+
+2004-10-02, version 0.6.8
+- soapclient: read/write cookies (thanks Ingo)
+- soap_server: change faultcode on non-resendable faults to Client
+- soap_transport_http: read/write cookies (thanks Ingo)
+
+2004-10-05, version 0.6.8
+- wsdl: add addElement method
+- wsdl: support the document style in the register method
+- xmlschema: parse unnamed simpleTypes, rather than ignoring them
+- xmlschema: include untyped elements when parsing a complexType
+- xmlschema: add addElement method
+
+2004-10-14, version 0.6.8
+- soapclient: support client certificates
+- soap_parser: deserialize attributes, prefixing names with "!"
+- soap_server: notify the client with HTML when WSDL is requested but not supported by service
+- soap_transport_http: support client certificates
+- wsdl: support defaults for elements of a complexType
+- wsdl: serialize elements from complexType extension base
+- wsdl: serialize data (associative array elements) as attributes according to XML Schema
+- xmlschema: record extension base if present for a complexType
+
+2004-12-15, version 0.6.8
+- nusoap_base: add 2000 XML Schema (rare, but used by Akamai)
+- soap_parser: avoid deserializing more common attributes that are not data
+- soap_parser: be lax when HTTP specifies ISO-8859-1 (the default) and XML specifies UTF-8 (the norm)
+- soap_server: account for the fact that get_class_methods returns methods in all lower case (thanks Steve Haldane)
+- soap_transport_http: parse digest info that includes '=' in the data (thanks Jinsuk Kim)
+- wsdl: feably handle some cases for literal serialization of form="unqualified" elements
+- wsdl: don't serialize the decimal portion of a PHP double when the XML type is long
+- wsdl: fix serialization of attributes for complexType that is an extension
+- wsdlcache: enhance diagnostics
+- xmlschema: handle untyped elements
+- xmlschema: handle WSDL for SOAP Array that uses the base attribute plus a sequence of element
+
+2005-01-22, version 0.6.8
+- wsdl: allow an element in one schema to have a type from another schema
+
+2005-01-24, version 0.6.8
+- xmlschema: correctly parse nested complexType definitions
+
+2005-02-14, version 0.6.8
+- nusoap_base: fix a bug in which attributes were sometimes not serialized with a value
+- nusoap_base: improve serialization of null values (thanks Dominique Stender)
+- soap_parser: parse null values by handling the nil attribute (thanks Dominique Stender)
+- soap_server: set character encoding for a fault to be the same as for the server (thanks Mark Scott)
+- soap_server: correctly check for null value returned from method when WSDL is used (without WSDL, cannot distinguish whether NULL or void return is desired)
+- soapclient: for document style, call should always return an array rooted at the response part (all bets are off when there are multiple parts)
+- xmlschema: save enumeration values parsed from WSDL
+
+2005-02-10, version 0.6.9
+- soapclient: only set SOAP headers when they are specified in call params (so setHeaders still works)
+
+2005-04-04, version 0.6.9
+- soap_server: use get_class instead of is_a (thanks Thomas Noel)
+- soapclient: use get_class instead of is_a (thanks Thomas Noel)
+- soapclient: add setEndpoint method
+- soap_transport_http: fix client certificates (thanks Doug Anarino and Eryan Eriobowo)
+
+2005-04-29, version 0.6.9
+- nusoap_base: add global variable and methods for setting debug level
+- nusoap_base: use xsd:anyType instead of xsd:ur-type to serialize arrays with multiple element types (thanks Ingo Fischer)
+- nusoap_base: expand entities in attributes (thanks Gaetano Giunta)
+- soapclient: call parent constructor
+- soapval: call parent constructor
+- soap_fault: call parent constructor
+- soap_parser: call parent constructor
+- soap_server: assume get_class_methods always returns lower case for PHP 4.x only
+- soap_server: call parent constructor
+- soap_transport_http: do nothing in setEncoding if gzdeflate is not present (thanks Franck Touanen for pointing this out)
+- soap_transport_http: fix check for server request for digest authentication (thanks Mark Spavin)
+- soap_transport_http: call parent constructor
+- wsdl: fix documentation page popup of one method after another (thanks Owen)
+- wsdl: call parent constructor
+- wsdl: expand entities in attributes (thanks Gaetano Giunta)
+- xmlschema: call parent constructor
+
+2005-06-03, version 0.6.9
+- nusoap_base: serialize empty arrays as having elements xsd:anyType[0]
+- nusoap_base: add encodingStyle parameter to serializeEnvelope
+- nusoap_base: serialize xsi:type with nil values
+- nusoap_base: improve debug and comments
+- soap_parser: correctly parse an empty array to an empty array, not an empty string
+- soap_parser: improve debug and comments
+- soap_server: specify encodingStyle for envelope when WSDL is used
+- soapclient: factor out new getProxyClassCode method
+- soapclient: specify encodingStyle for envelope
+- soapclient: improve debug and comments
+- wsdl: add namespace for Apache SOAP types if a variable of such type is serialized
+- wsdl: serialize nil value for nillable elements when no value is provided
+- wsdl: serialize xsi:type with nil values
+- wsdl: copy attributes as well as elements to an element from its complexType
+- wsdl: specify encodingStyle for operations
+- wsdl: improve debug and comments
+- xmlschema: improve debug and comments
+
+2005-06-03, version 0.7.0
+- nusoap_base: improve debug and comments
+- nusoap_base: fix version, which should have been 0.7.0 since 2005-03-04
+
+2005-06-06, version 0.7.1
+- nusoap_base: adjust numeric element names for serialization, instead of forcing them to 'soapVal'
+- nusoapmime: add type=text/xml to multipart/related (thanks Emmanuel Cordonnier)
+- soap_fault: fix serialization of detail
+- soap_server: check required parameters for register method
+- soap_server: when getallheaders is used, massage header names
+- soap_server: use SOAPAction to determine operation when doc/lit service does not wrap parameters in an element with the method name (thanks Peter Hrastnik)
+- soap_transport_http: correctly handle multiple HTTP/1.1 100 responses for https (thanks Jan Slabon)
+- wsdl: fixed documentation for addComplexType (thanks Csintalan Ádám)
+- wsdl: serialize array data when maxOccurs = 'unbounded' OR maxOccurs > 1 (thanks Dominique Schreckling)
+- wsdl: when serializing a string == 'false' as a boolean, set the value to false
+- wsdl: when serializing a complexType, require the PHP value supplied to be an array
+
+2005-07-01, version 0.7.1
+- nusoap_base: Allow SOAP headers to be supplied as an array like parameters
+- soap_parser: de-serialize simpleContent that accompanies complexContent
+- soap_server: append debug information when programmatically-defined WSDL is returned
+- soap_transport_http: Add debug when an outgoing header is set
+- soapclient: Allow SOAP headers to be supplied as an array like parameters
+- xmlschema: serialize attributes more generally, rather than assuming they are for SOAP 1.1 Array
+- wsdl: when serializing, look up types by namespace, not prefix (simple programmatic doc/lit WSDL now seems to work)
+- wsdl: process namespace declarations first when parsing an element
+
+2005-07-27, version 0.7.1
+- nusoap_base: do not override supplied element name with class name when serializing an object in serialize_val
+- nusoap_base: remove http://soapinterop.org/xsd (si) from namespaces array
+- nusoapmime: add nusoapservermime class to implement MIME attachments on the server
+- soap_fault: improve documentation
+- soap_server: improve documentation
+- soap_server: make consistent use of _SERVER and HTTP_SERVER_VARS
+- soap_server: make all incoming HTTP header keys lower case
+- soap_server: add hook functions to support subclassing for MIME attachments
+- soap_transport_http: remove an unnecessary global statement
+- soapclient: when creating a proxy, make $params within each function an associative array
+- soapval: improve documentation
+- wsdl: when serializing complexType elements, used typed serialization if there is either a type or a reference for the element
+- wsdl: allow PHP objects to be serialized as SOAP structs in serializeType
+- wsdl: for WSDL and XML Schema imports, don't forget to use the TCP port number (thanks Luca GIOPPO)
+- wsdl: make consistent use of _SERVER and HTTP_SERVER_VARS
+- xmlschema: improve documentation
+
+2005-07-31, version 0.7.2
+- nusoap_base: correctly serialize attributes in serialize_val (thanks Hidran Arias)
+- soap_parser: when resolving references, do not assume that buildVal returns an array (thanks Akshell)
+- soap_parser: removed decode_entities, which does not work (thanks Martin Sarsale)
+- soap_server: fix a bug parsing headers from _SERVER and HTTP_SERVER_VARS (thanks Bert Catsburg)
+- soap_server: parse all "headers" from HTTP_SERVER_VARS (not just HTTP_*)
+- soap_server: use PHP_SELF instead of SCRIPT_NAME for WSDL endpoint
+- soap_server: when generating a fault while debug_flag is true, put debug into faultdetail
+- wsdl: add enumeration parameter to addSimpleType
+- xmlschema: add enumeration parameter to addSimpleType
diff --git a/htdocs/includes/nusoap/lib/class.nusoap_base.php b/htdocs/includes/nusoap/lib/class.nusoap_base.php
index fdf7fb7771d..a74e83e0e03 100644
--- a/htdocs/includes/nusoap/lib/class.nusoap_base.php
+++ b/htdocs/includes/nusoap/lib/class.nusoap_base.php
@@ -1,905 +1,905 @@
-globalDebugLevel = 9;
-
-/**
-*
-* nusoap_base
-*
-* @author Dietrich Ayala
-* @version $Id$
-* @access public
-*/
-class nusoap_base {
- /**
- * Identification for HTTP headers.
- *
- * @var string
- * @access private
- */
- var $title = 'NuSOAP';
- /**
- * Version for HTTP headers.
- *
- * @var string
- * @access private
- */
- var $version = '0.7.2';
- /**
- * CVS revision for HTTP headers.
- *
- * @var string
- * @access private
- */
- var $revision = '$Revision$';
- /**
- * Current error string (manipulated by getError/setError)
- *
- * @var string
- * @access private
- */
- var $error_str = '';
- /**
- * Current debug string (manipulated by debug/appendDebug/clearDebug/getDebug/getDebugAsXMLComment)
- *
- * @var string
- * @access private
- */
- var $debug_str = '';
- /**
- * toggles automatic encoding of special characters as entities
- * (should always be true, I think)
- *
- * @var boolean
- * @access private
- */
- var $charencoding = true;
- /**
- * the debug level for this instance
- *
- * @var integer
- * @access private
- */
- var $debugLevel;
-
- /**
- * set schema version
- *
- * @var string
- * @access public
- */
- var $XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema';
-
- /**
- * charset encoding for outgoing messages
- *
- * @var string
- * @access public
- */
- var $soap_defencoding = 'ISO-8859-1';
- //var $soap_defencoding = 'UTF-8';
-
- /**
- * namespaces in an array of prefix => uri
- *
- * this is "seeded" by a set of constants, but it may be altered by code
- *
- * @var array
- * @access public
- */
- var $namespaces = array(
- 'SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/',
- 'xsd' => 'http://www.w3.org/2001/XMLSchema',
- 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
- 'SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/'
- );
-
- /**
- * namespaces used in the current context, e.g. during serialization
- *
- * @var array
- * @access private
- */
- var $usedNamespaces = array();
-
- /**
- * XML Schema types in an array of uri => (array of xml type => php type)
- * is this legacy yet?
- * no, this is used by the xmlschema class to verify type => namespace mappings.
- * @var array
- * @access public
- */
- var $typemap = array(
- 'http://www.w3.org/2001/XMLSchema' => array(
- 'string'=>'string','boolean'=>'boolean','float'=>'double','double'=>'double','decimal'=>'double',
- 'duration'=>'','dateTime'=>'string','time'=>'string','date'=>'string','gYearMonth'=>'',
- 'gYear'=>'','gMonthDay'=>'','gDay'=>'','gMonth'=>'','hexBinary'=>'string','base64Binary'=>'string',
- // abstract "any" types
- 'anyType'=>'string','anySimpleType'=>'string',
- // derived datatypes
- 'normalizedString'=>'string','token'=>'string','language'=>'','NMTOKEN'=>'','NMTOKENS'=>'','Name'=>'','NCName'=>'','ID'=>'',
- 'IDREF'=>'','IDREFS'=>'','ENTITY'=>'','ENTITIES'=>'','integer'=>'integer','nonPositiveInteger'=>'integer',
- 'negativeInteger'=>'integer','long'=>'integer','int'=>'integer','short'=>'integer','byte'=>'integer','nonNegativeInteger'=>'integer',
- 'unsignedLong'=>'','unsignedInt'=>'','unsignedShort'=>'','unsignedByte'=>'','positiveInteger'=>''),
- 'http://www.w3.org/2000/10/XMLSchema' => array(
- 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double',
- 'float'=>'double','dateTime'=>'string',
- 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'),
- 'http://www.w3.org/1999/XMLSchema' => array(
- 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double',
- 'float'=>'double','dateTime'=>'string',
- 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'),
- 'http://soapinterop.org/xsd' => array('SOAPStruct'=>'struct'),
- 'http://schemas.xmlsoap.org/soap/encoding/' => array('base64'=>'string','array'=>'array','Array'=>'array'),
- 'http://xml.apache.org/xml-soap' => array('Map')
- );
-
- /**
- * XML entities to convert
- *
- * @var array
- * @access public
- * @deprecated
- * @see expandEntities
- */
- var $xmlEntities = array('quot' => '"','amp' => '&',
- 'lt' => '<','gt' => '>','apos' => "'");
-
- /**
- * constructor
- *
- * @access public
- */
- function nusoap_base() {
- $this->debugLevel = $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel;
- }
-
- /**
- * gets the global debug level, which applies to future instances
- *
- * @return integer Debug level 0-9, where 0 turns off
- * @access public
- */
- function getGlobalDebugLevel() {
- return $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel;
- }
-
- /**
- * sets the global debug level, which applies to future instances
- *
- * @param int $level Debug level 0-9, where 0 turns off
- * @access public
- */
- function setGlobalDebugLevel($level) {
- $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = $level;
- }
-
- /**
- * gets the debug level for this instance
- *
- * @return int Debug level 0-9, where 0 turns off
- * @access public
- */
- function getDebugLevel() {
- return $this->debugLevel;
- }
-
- /**
- * sets the debug level for this instance
- *
- * @param int $level Debug level 0-9, where 0 turns off
- * @access public
- */
- function setDebugLevel($level) {
- $this->debugLevel = $level;
- }
-
- /**
- * adds debug data to the instance debug string with formatting
- *
- * @param string $string debug data
- * @access private
- */
- function debug($string){
- if ($this->debugLevel > 0) {
- $this->appendDebug($this->getmicrotime().' '.get_class($this).": $string\n");
- }
- }
-
- /**
- * adds debug data to the instance debug string without formatting
- *
- * @param string $string debug data
- * @access public
- */
- function appendDebug($string){
- if ($this->debugLevel > 0) {
- // it would be nice to use a memory stream here to use
- // memory more efficiently
- $this->debug_str .= $string;
- }
- }
-
- /**
- * clears the current debug data for this instance
- *
- * @access public
- */
- function clearDebug() {
- // it would be nice to use a memory stream here to use
- // memory more efficiently
- $this->debug_str = '';
- }
-
- /**
- * gets the current debug data for this instance
- *
- * @return debug data
- * @access public
- */
- function &getDebug() {
- // it would be nice to use a memory stream here to use
- // memory more efficiently
- return $this->debug_str;
- }
-
- /**
- * gets the current debug data for this instance as an XML comment
- * this may change the contents of the debug data
- *
- * @return debug data as an XML comment
- * @access public
- */
- function &getDebugAsXMLComment() {
- // it would be nice to use a memory stream here to use
- // memory more efficiently
- while (strpos($this->debug_str, '--')) {
- $this->debug_str = str_replace('--', '- -', $this->debug_str);
- }
- return "";
- }
-
- /**
- * expands entities, e.g. changes '<' to '<'.
- *
- * @param string $val The string in which to expand entities.
- * @access private
- */
- function expandEntities($val) {
- if ($this->charencoding) {
- $val = str_replace('&', '&', $val);
- $val = str_replace("'", ''', $val);
- $val = str_replace('"', '"', $val);
- $val = str_replace('<', '<', $val);
- $val = str_replace('>', '>', $val);
- }
- return $val;
- }
-
- /**
- * returns error string if present
- *
- * @return mixed error string or false
- * @access public
- */
- function getError(){
- if($this->error_str != ''){
- return $this->error_str;
- }
- return false;
- }
-
- /**
- * sets error string
- *
- * @return boolean $string error string
- * @access private
- */
- function setError($str){
- $this->error_str = $str;
- }
-
- /**
- * detect if array is a simple array or a struct (associative array)
- *
- * @param mixed $val The PHP array
- * @return string (arraySimple|arrayStruct)
- * @access private
- */
- function isArraySimpleOrStruct($val) {
- $keyList = array_keys($val);
- foreach ($keyList as $keyListValue) {
- if (!is_int($keyListValue)) {
- return 'arrayStruct';
- }
- }
- return 'arraySimple';
- }
-
- /**
- * serializes PHP values in accordance w/ section 5. Type information is
- * not serialized if $use == 'literal'.
- *
- * @param mixed $val The value to serialize
- * @param string $name The name (local part) of the XML element
- * @param string $type The XML schema type (local part) for the element
- * @param string $name_ns The namespace for the name of the XML element
- * @param string $type_ns The namespace for the type of the element
- * @param array $attributes The attributes to serialize as name=>value pairs
- * @param string $use The WSDL "use" (encoded|literal)
- * @return string The serialized element, possibly with child elements
- * @access public
- */
- function serialize_val($val,$name=false,$type=false,$name_ns=false,$type_ns=false,$attributes=false,$use='encoded'){
- $this->debug("in serialize_val: name=$name, type=$type, name_ns=$name_ns, type_ns=$type_ns, use=$use");
- $this->appendDebug('value=' . $this->varDump($val));
- $this->appendDebug('attributes=' . $this->varDump($attributes));
-
- if(is_object($val) && get_class($val) == 'soapval'){
- return $val->serialize($use);
- }
- // force valid name if necessary
- if (is_numeric($name)) {
- $name = '__numeric_' . $name;
- } elseif (! $name) {
- $name = 'noname';
- }
- // if name has ns, add ns prefix to name
- $xmlns = '';
- if($name_ns){
- $prefix = 'nu'.rand(1000,9999);
- $name = $prefix.':'.$name;
- $xmlns .= " xmlns:$prefix=\"$name_ns\"";
- }
- // if type is prefixed, create type prefix
- if($type_ns != '' && $type_ns == $this->namespaces['xsd']){
- // need to fix this. shouldn't default to xsd if no ns specified
- // w/o checking against typemap
- $type_prefix = 'xsd';
- } elseif($type_ns){
- $type_prefix = 'ns'.rand(1000,9999);
- $xmlns .= " xmlns:$type_prefix=\"$type_ns\"";
- }
- // serialize attributes if present
- $atts = '';
- if($attributes){
- foreach($attributes as $k => $v){
- $atts .= " $k=\"".$this->expandEntities($v).'"';
- }
- }
- // serialize null value
- if (is_null($val)) {
- if ($use == 'literal') {
- // TODO: depends on minOccurs
- return "<$name$xmlns $atts/>";
- } else {
- if (isset($type) && isset($type_prefix)) {
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = '';
- }
- return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>";
- }
- }
- // serialize if an xsd built-in primitive type
- if($type != '' && isset($this->typemap[$this->XMLSchemaVersion][$type])){
- if (is_bool($val)) {
- if ($type == 'boolean') {
- $val = $val ? 'true' : 'false';
- } elseif (! $val) {
- $val = 0;
- }
- } else if (is_string($val)) {
- $val = $this->expandEntities($val);
- }
- if ($use == 'literal') {
- return "<$name$xmlns $atts>$val$name>";
- } else {
- return "<$name$xmlns $atts xsi:type=\"xsd:$type\">$val$name>";
- }
- }
- // detect type and serialize
- $xml = '';
- switch(true) {
- case (is_bool($val) || $type == 'boolean'):
- if ($type == 'boolean') {
- $val = $val ? 'true' : 'false';
- } elseif (! $val) {
- $val = 0;
- }
- if ($use == 'literal') {
- $xml .= "<$name$xmlns $atts>$val$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val$name>";
- }
- break;
- case (is_int($val) || is_long($val) || $type == 'int'):
- if ($use == 'literal') {
- $xml .= "<$name$xmlns $atts>$val$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:int\"$atts>$val$name>";
- }
- break;
- case (is_float($val)|| is_double($val) || $type == 'float'):
- if ($use == 'literal') {
- $xml .= "<$name$xmlns $atts>$val$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:float\"$atts>$val$name>";
- }
- break;
- case (is_string($val) || $type == 'string'):
- $val = $this->expandEntities($val);
- if ($use == 'literal') {
- $xml .= "<$name$xmlns $atts>$val$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:string\"$atts>$val$name>";
- }
- break;
- case is_object($val):
- if (! $name) {
- $name = get_class($val);
- $this->debug("In serialize_val, used class name $name as element name");
- } else {
- $this->debug("In serialize_val, do not override name $name for element name for class " . get_class($val));
- }
- foreach(get_object_vars($val) as $k => $v){
- $pXml = isset($pXml) ? $pXml.$this->serialize_val($v,$k,false,false,false,false,$use) : $this->serialize_val($v,$k,false,false,false,false,$use);
- }
- $xml .= '<'.$name.'>'.$pXml.''.$name.'>';
- break;
- break;
- case (is_array($val) || $type):
- // detect if struct or array
- $valueType = $this->isArraySimpleOrStruct($val);
- if($valueType=='arraySimple' || ereg('^ArrayOf',$type)){
- $i = 0;
- if(is_array($val) && count($val)> 0){
- foreach($val as $v){
- if(is_object($v) && get_class($v) == 'soapval'){
- $tt_ns = $v->type_ns;
- $tt = $v->type;
- } elseif (is_array($v)) {
- $tt = $this->isArraySimpleOrStruct($v);
- } else {
- $tt = gettype($v);
- }
- $array_types[$tt] = 1;
- // TODO: for literal, the name should be $name
- $xml .= $this->serialize_val($v,'item',false,false,false,false,$use);
- ++$i;
- }
- if(count($array_types) > 1){
- $array_typename = 'xsd:anyType';
- } elseif(isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) {
- if ($tt == 'integer') {
- $tt = 'int';
- }
- $array_typename = 'xsd:'.$tt;
- } elseif(isset($tt) && $tt == 'arraySimple'){
- $array_typename = 'SOAP-ENC:Array';
- } elseif(isset($tt) && $tt == 'arrayStruct'){
- $array_typename = 'unnamed_struct_use_soapval';
- } else {
- // if type is prefixed, create type prefix
- if ($tt_ns != '' && $tt_ns == $this->namespaces['xsd']){
- $array_typename = 'xsd:' . $tt;
- } elseif ($tt_ns) {
- $tt_prefix = 'ns' . rand(1000, 9999);
- $array_typename = "$tt_prefix:$tt";
- $xmlns .= " xmlns:$tt_prefix=\"$tt_ns\"";
- } else {
- $array_typename = $tt;
- }
- }
- $array_type = $i;
- if ($use == 'literal') {
- $type_str = '';
- } else if (isset($type) && isset($type_prefix)) {
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_typename."[$array_type]\"";
- }
- // empty array
- } else {
- if ($use == 'literal') {
- $type_str = '';
- } else if (isset($type) && isset($type_prefix)) {
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"xsd:anyType[0]\"";
- }
- }
- // TODO: for array in literal, there is no wrapper here
- $xml = "<$name$xmlns$type_str$atts>".$xml."$name>";
- } else {
- // got a struct
- if(isset($type) && isset($type_prefix)){
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = '';
- }
- if ($use == 'literal') {
- $xml .= "<$name$xmlns $atts>";
- } else {
- $xml .= "<$name$xmlns$type_str$atts>";
- }
- foreach($val as $k => $v){
- // Apache Map
- if ($type == 'Map' && $type_ns == 'http://xml.apache.org/xml-soap') {
- $xml .= '';
- $xml .= $this->serialize_val($k,'key',false,false,false,false,$use);
- $xml .= $this->serialize_val($v,'value',false,false,false,false,$use);
- $xml .= '';
- } else {
- $xml .= $this->serialize_val($v,$k,false,false,false,false,$use);
- }
- }
- $xml .= "$name>";
- }
- break;
- default:
- $xml .= 'not detected, got '.gettype($val).' for '.$val;
- break;
- }
- return $xml;
- }
-
- /**
- * serializes a message
- *
- * @param string $body the XML of the SOAP body
- * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers
- * @param array $namespaces optional the namespaces used in generating the body and headers
- * @param string $style optional (rpc|document)
- * @param string $use optional (encoded|literal)
- * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded)
- * @return string the message
- * @access public
- */
- function serializeEnvelope($body,$headers=false,$namespaces=array(),$style='rpc',$use='encoded',$encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'){
- // TODO: add an option to automatically run utf8_encode on $body and $headers
- // if $this->soap_defencoding is UTF-8. Not doing this automatically allows
- // one to send arbitrary UTF-8 characters, not just characters that map to ISO-8859-1
-
- $this->debug("In serializeEnvelope length=" . strlen($body) . " body (max 1000 characters)=" . substr($body, 0, 1000) . " style=$style use=$use encodingStyle=$encodingStyle");
- $this->debug("headers:");
- $this->appendDebug($this->varDump($headers));
- $this->debug("namespaces:");
- $this->appendDebug($this->varDump($namespaces));
-
- // serialize namespaces
- $ns_string = '';
- foreach(array_merge($this->namespaces,$namespaces) as $k => $v){
- $ns_string .= " xmlns:$k=\"$v\"";
- }
- if($encodingStyle) {
- $ns_string = " SOAP-ENV:encodingStyle=\"$encodingStyle\"$ns_string";
- }
-
- // serialize headers
- if($headers){
- if (is_array($headers)) {
- $xml = '';
- foreach ($headers as $header) {
- $xml .= $this->serialize_val($header, false, false, false, false, false, $use);
- }
- $headers = $xml;
- $this->debug("In serializeEnvelope, serialzied array of headers to $headers");
- }
- $headers = "".$headers."";
- }
- // serialize envelope
- return
- 'soap_defencoding .'"?'.">".
- '".
- $headers.
- "".
- $body.
- "".
- "";
- }
-
- /**
- * formats a string to be inserted into an HTML stream
- *
- * @param string $str The string to format
- * @return string The formatted string
- * @access public
- * @deprecated
- */
- function formatDump($str){
- $str = htmlspecialchars($str);
- return nl2br($str);
- }
-
- /**
- * contracts (changes namespace to prefix) a qualified name
- *
- * @param string $qname qname
- * @return string contracted qname
- * @access private
- */
- function contractQname($qname){
- // get element namespace
- //$this->xdebug("Contract $qname");
- if (strrpos($qname, ':')) {
- // get unqualified name
- $name = substr($qname, strrpos($qname, ':') + 1);
- // get ns
- $ns = substr($qname, 0, strrpos($qname, ':'));
- $p = $this->getPrefixFromNamespace($ns);
- if ($p) {
- return $p . ':' . $name;
- }
- return $qname;
- } else {
- return $qname;
- }
- }
-
- /**
- * expands (changes prefix to namespace) a qualified name
- *
- * @param string $string qname
- * @return string expanded qname
- * @access private
- */
- function expandQname($qname){
- // get element prefix
- if(strpos($qname,':') && !ereg('^http://',$qname)){
- // get unqualified name
- $name = substr(strstr($qname,':'),1);
- // get ns prefix
- $prefix = substr($qname,0,strpos($qname,':'));
- if(isset($this->namespaces[$prefix])){
- return $this->namespaces[$prefix].':'.$name;
- } else {
- return $qname;
- }
- } else {
- return $qname;
- }
- }
-
- /**
- * returns the local part of a prefixed string
- * returns the original string, if not prefixed
- *
- * @param string $str The prefixed string
- * @return string The local part
- * @access public
- */
- function getLocalPart($str){
- if($sstr = strrchr($str,':')){
- // get unqualified name
- return substr( $sstr, 1 );
- } else {
- return $str;
- }
- }
-
- /**
- * returns the prefix part of a prefixed string
- * returns false, if not prefixed
- *
- * @param string $str The prefixed string
- * @return mixed The prefix or false if there is no prefix
- * @access public
- */
- function getPrefix($str){
- if($pos = strrpos($str,':')){
- // get prefix
- return substr($str,0,$pos);
- }
- return false;
- }
-
- /**
- * pass it a prefix, it returns a namespace
- *
- * @param string $prefix The prefix
- * @return mixed The namespace, false if no namespace has the specified prefix
- * @access public
- */
- function getNamespaceFromPrefix($prefix){
- if (isset($this->namespaces[$prefix])) {
- return $this->namespaces[$prefix];
- }
- //$this->setError("No namespace registered for prefix '$prefix'");
- return false;
- }
-
- /**
- * returns the prefix for a given namespace (or prefix)
- * or false if no prefixes registered for the given namespace
- *
- * @param string $ns The namespace
- * @return mixed The prefix, false if the namespace has no prefixes
- * @access public
- */
- function getPrefixFromNamespace($ns) {
- foreach ($this->namespaces as $p => $n) {
- if ($ns == $n || $ns == $p) {
- $this->usedNamespaces[$p] = $n;
- return $p;
- }
- }
- return false;
- }
-
- /**
- * returns the time in ODBC canonical form with microseconds
- *
- * @return string The time in ODBC canonical form with microseconds
- * @access public
- */
- function getmicrotime() {
- if (function_exists('gettimeofday')) {
- $tod = gettimeofday();
- $sec = $tod['sec'];
- $usec = $tod['usec'];
- } else {
- $sec = time();
- $usec = 0;
- }
- return strftime('%Y-%m-%d %H:%M:%S', $sec) . '.' . sprintf('%06d', $usec);
- }
-
- /**
- * Returns a string with the output of var_dump
- *
- * @param mixed $data The variable to var_dump
- * @return string The output of var_dump
- * @access public
- */
- function varDump($data) {
- ob_start();
- var_dump($data);
- $ret_val = ob_get_contents();
- ob_end_clean();
- return $ret_val;
- }
-}
-
-// XML Schema Datatype Helper Functions
-
-//xsd:dateTime helpers
-
-/**
-* convert unix timestamp to ISO 8601 compliant date string
-*
-* @param string $timestamp Unix time stamp
-* @access public
-*/
-function timestamp_to_iso8601($timestamp,$utc=true){
- $datestr = date('Y-m-d\TH:i:sO',$timestamp);
- if($utc){
- $eregStr =
- '([0-9]{4})-'. // centuries & years CCYY-
- '([0-9]{2})-'. // months MM-
- '([0-9]{2})'. // days DD
- 'T'. // separator T
- '([0-9]{2}):'. // hours hh:
- '([0-9]{2}):'. // minutes mm:
- '([0-9]{2})(\.[0-9]*)?'. // seconds ss.ss...
- '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's
-
- if(ereg($eregStr,$datestr,$regs)){
- return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]);
- }
- return false;
- } else {
- return $datestr;
- }
-}
-
-/**
-* convert ISO 8601 compliant date string to unix timestamp
-*
-* @param string $datestr ISO 8601 compliant date string
-* @access public
-*/
-function iso8601_to_timestamp($datestr){
- $eregStr =
- '([0-9]{4})-'. // centuries & years CCYY-
- '([0-9]{2})-'. // months MM-
- '([0-9]{2})'. // days DD
- 'T'. // separator T
- '([0-9]{2}):'. // hours hh:
- '([0-9]{2}):'. // minutes mm:
- '([0-9]{2})(\.[0-9]+)?'. // seconds ss.ss...
- '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's
- if(ereg($eregStr,$datestr,$regs)){
- // not utc
- if($regs[8] != 'Z'){
- $op = substr($regs[8],0,1);
- $h = substr($regs[8],1,2);
- $m = substr($regs[8],strlen($regs[8])-2,2);
- if($op == '-'){
- $regs[4] = $regs[4] + $h;
- $regs[5] = $regs[5] + $m;
- } elseif($op == '+'){
- $regs[4] = $regs[4] - $h;
- $regs[5] = $regs[5] - $m;
- }
- }
- return strtotime("$regs[1]-$regs[2]-$regs[3] $regs[4]:$regs[5]:$regs[6]Z");
- } else {
- return false;
- }
-}
-
-/**
-* sleeps some number of microseconds
-*
-* @param string $usec the number of microseconds to sleep
-* @access public
-* @deprecated
-*/
-function usleepWindows($usec)
-{
- $start = gettimeofday();
-
- do
- {
- $stop = gettimeofday();
- $timePassed = 1000000 * ($stop['sec'] - $start['sec'])
- + $stop['usec'] - $start['usec'];
- }
- while ($timePassed < $usec);
-}
-
-
+globalDebugLevel = 9;
+
+/**
+*
+* nusoap_base
+*
+* @author Dietrich Ayala
+* @version $Id$
+* @access public
+*/
+class nusoap_base {
+ /**
+ * Identification for HTTP headers.
+ *
+ * @var string
+ * @access private
+ */
+ var $title = 'NuSOAP';
+ /**
+ * Version for HTTP headers.
+ *
+ * @var string
+ * @access private
+ */
+ var $version = '0.7.2';
+ /**
+ * CVS revision for HTTP headers.
+ *
+ * @var string
+ * @access private
+ */
+ var $revision = '$Revision$';
+ /**
+ * Current error string (manipulated by getError/setError)
+ *
+ * @var string
+ * @access private
+ */
+ var $error_str = '';
+ /**
+ * Current debug string (manipulated by debug/appendDebug/clearDebug/getDebug/getDebugAsXMLComment)
+ *
+ * @var string
+ * @access private
+ */
+ var $debug_str = '';
+ /**
+ * toggles automatic encoding of special characters as entities
+ * (should always be true, I think)
+ *
+ * @var boolean
+ * @access private
+ */
+ var $charencoding = true;
+ /**
+ * the debug level for this instance
+ *
+ * @var integer
+ * @access private
+ */
+ var $debugLevel;
+
+ /**
+ * set schema version
+ *
+ * @var string
+ * @access public
+ */
+ var $XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema';
+
+ /**
+ * charset encoding for outgoing messages
+ *
+ * @var string
+ * @access public
+ */
+ var $soap_defencoding = 'ISO-8859-1';
+ //var $soap_defencoding = 'UTF-8';
+
+ /**
+ * namespaces in an array of prefix => uri
+ *
+ * this is "seeded" by a set of constants, but it may be altered by code
+ *
+ * @var array
+ * @access public
+ */
+ var $namespaces = array(
+ 'SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/',
+ 'xsd' => 'http://www.w3.org/2001/XMLSchema',
+ 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
+ 'SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/'
+ );
+
+ /**
+ * namespaces used in the current context, e.g. during serialization
+ *
+ * @var array
+ * @access private
+ */
+ var $usedNamespaces = array();
+
+ /**
+ * XML Schema types in an array of uri => (array of xml type => php type)
+ * is this legacy yet?
+ * no, this is used by the xmlschema class to verify type => namespace mappings.
+ * @var array
+ * @access public
+ */
+ var $typemap = array(
+ 'http://www.w3.org/2001/XMLSchema' => array(
+ 'string'=>'string','boolean'=>'boolean','float'=>'double','double'=>'double','decimal'=>'double',
+ 'duration'=>'','dateTime'=>'string','time'=>'string','date'=>'string','gYearMonth'=>'',
+ 'gYear'=>'','gMonthDay'=>'','gDay'=>'','gMonth'=>'','hexBinary'=>'string','base64Binary'=>'string',
+ // abstract "any" types
+ 'anyType'=>'string','anySimpleType'=>'string',
+ // derived datatypes
+ 'normalizedString'=>'string','token'=>'string','language'=>'','NMTOKEN'=>'','NMTOKENS'=>'','Name'=>'','NCName'=>'','ID'=>'',
+ 'IDREF'=>'','IDREFS'=>'','ENTITY'=>'','ENTITIES'=>'','integer'=>'integer','nonPositiveInteger'=>'integer',
+ 'negativeInteger'=>'integer','long'=>'integer','int'=>'integer','short'=>'integer','byte'=>'integer','nonNegativeInteger'=>'integer',
+ 'unsignedLong'=>'','unsignedInt'=>'','unsignedShort'=>'','unsignedByte'=>'','positiveInteger'=>''),
+ 'http://www.w3.org/2000/10/XMLSchema' => array(
+ 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double',
+ 'float'=>'double','dateTime'=>'string',
+ 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'),
+ 'http://www.w3.org/1999/XMLSchema' => array(
+ 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double',
+ 'float'=>'double','dateTime'=>'string',
+ 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'),
+ 'http://soapinterop.org/xsd' => array('SOAPStruct'=>'struct'),
+ 'http://schemas.xmlsoap.org/soap/encoding/' => array('base64'=>'string','array'=>'array','Array'=>'array'),
+ 'http://xml.apache.org/xml-soap' => array('Map')
+ );
+
+ /**
+ * XML entities to convert
+ *
+ * @var array
+ * @access public
+ * @deprecated
+ * @see expandEntities
+ */
+ var $xmlEntities = array('quot' => '"','amp' => '&',
+ 'lt' => '<','gt' => '>','apos' => "'");
+
+ /**
+ * constructor
+ *
+ * @access public
+ */
+ function nusoap_base() {
+ $this->debugLevel = $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel;
+ }
+
+ /**
+ * gets the global debug level, which applies to future instances
+ *
+ * @return integer Debug level 0-9, where 0 turns off
+ * @access public
+ */
+ function getGlobalDebugLevel() {
+ return $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel;
+ }
+
+ /**
+ * sets the global debug level, which applies to future instances
+ *
+ * @param int $level Debug level 0-9, where 0 turns off
+ * @access public
+ */
+ function setGlobalDebugLevel($level) {
+ $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = $level;
+ }
+
+ /**
+ * gets the debug level for this instance
+ *
+ * @return int Debug level 0-9, where 0 turns off
+ * @access public
+ */
+ function getDebugLevel() {
+ return $this->debugLevel;
+ }
+
+ /**
+ * sets the debug level for this instance
+ *
+ * @param int $level Debug level 0-9, where 0 turns off
+ * @access public
+ */
+ function setDebugLevel($level) {
+ $this->debugLevel = $level;
+ }
+
+ /**
+ * adds debug data to the instance debug string with formatting
+ *
+ * @param string $string debug data
+ * @access private
+ */
+ function debug($string){
+ if ($this->debugLevel > 0) {
+ $this->appendDebug($this->getmicrotime().' '.get_class($this).": $string\n");
+ }
+ }
+
+ /**
+ * adds debug data to the instance debug string without formatting
+ *
+ * @param string $string debug data
+ * @access public
+ */
+ function appendDebug($string){
+ if ($this->debugLevel > 0) {
+ // it would be nice to use a memory stream here to use
+ // memory more efficiently
+ $this->debug_str .= $string;
+ }
+ }
+
+ /**
+ * clears the current debug data for this instance
+ *
+ * @access public
+ */
+ function clearDebug() {
+ // it would be nice to use a memory stream here to use
+ // memory more efficiently
+ $this->debug_str = '';
+ }
+
+ /**
+ * gets the current debug data for this instance
+ *
+ * @return debug data
+ * @access public
+ */
+ function &getDebug() {
+ // it would be nice to use a memory stream here to use
+ // memory more efficiently
+ return $this->debug_str;
+ }
+
+ /**
+ * gets the current debug data for this instance as an XML comment
+ * this may change the contents of the debug data
+ *
+ * @return debug data as an XML comment
+ * @access public
+ */
+ function &getDebugAsXMLComment() {
+ // it would be nice to use a memory stream here to use
+ // memory more efficiently
+ while (strpos($this->debug_str, '--')) {
+ $this->debug_str = str_replace('--', '- -', $this->debug_str);
+ }
+ return "";
+ }
+
+ /**
+ * expands entities, e.g. changes '<' to '<'.
+ *
+ * @param string $val The string in which to expand entities.
+ * @access private
+ */
+ function expandEntities($val) {
+ if ($this->charencoding) {
+ $val = str_replace('&', '&', $val);
+ $val = str_replace("'", ''', $val);
+ $val = str_replace('"', '"', $val);
+ $val = str_replace('<', '<', $val);
+ $val = str_replace('>', '>', $val);
+ }
+ return $val;
+ }
+
+ /**
+ * returns error string if present
+ *
+ * @return mixed error string or false
+ * @access public
+ */
+ function getError(){
+ if($this->error_str != ''){
+ return $this->error_str;
+ }
+ return false;
+ }
+
+ /**
+ * sets error string
+ *
+ * @return boolean $string error string
+ * @access private
+ */
+ function setError($str){
+ $this->error_str = $str;
+ }
+
+ /**
+ * detect if array is a simple array or a struct (associative array)
+ *
+ * @param mixed $val The PHP array
+ * @return string (arraySimple|arrayStruct)
+ * @access private
+ */
+ function isArraySimpleOrStruct($val) {
+ $keyList = array_keys($val);
+ foreach ($keyList as $keyListValue) {
+ if (!is_int($keyListValue)) {
+ return 'arrayStruct';
+ }
+ }
+ return 'arraySimple';
+ }
+
+ /**
+ * serializes PHP values in accordance w/ section 5. Type information is
+ * not serialized if $use == 'literal'.
+ *
+ * @param mixed $val The value to serialize
+ * @param string $name The name (local part) of the XML element
+ * @param string $type The XML schema type (local part) for the element
+ * @param string $name_ns The namespace for the name of the XML element
+ * @param string $type_ns The namespace for the type of the element
+ * @param array $attributes The attributes to serialize as name=>value pairs
+ * @param string $use The WSDL "use" (encoded|literal)
+ * @return string The serialized element, possibly with child elements
+ * @access public
+ */
+ function serialize_val($val,$name=false,$type=false,$name_ns=false,$type_ns=false,$attributes=false,$use='encoded'){
+ $this->debug("in serialize_val: name=$name, type=$type, name_ns=$name_ns, type_ns=$type_ns, use=$use");
+ $this->appendDebug('value=' . $this->varDump($val));
+ $this->appendDebug('attributes=' . $this->varDump($attributes));
+
+ if(is_object($val) && get_class($val) == 'soapval'){
+ return $val->serialize($use);
+ }
+ // force valid name if necessary
+ if (is_numeric($name)) {
+ $name = '__numeric_' . $name;
+ } elseif (! $name) {
+ $name = 'noname';
+ }
+ // if name has ns, add ns prefix to name
+ $xmlns = '';
+ if($name_ns){
+ $prefix = 'nu'.rand(1000,9999);
+ $name = $prefix.':'.$name;
+ $xmlns .= " xmlns:$prefix=\"$name_ns\"";
+ }
+ // if type is prefixed, create type prefix
+ if($type_ns != '' && $type_ns == $this->namespaces['xsd']){
+ // need to fix this. shouldn't default to xsd if no ns specified
+ // w/o checking against typemap
+ $type_prefix = 'xsd';
+ } elseif($type_ns){
+ $type_prefix = 'ns'.rand(1000,9999);
+ $xmlns .= " xmlns:$type_prefix=\"$type_ns\"";
+ }
+ // serialize attributes if present
+ $atts = '';
+ if($attributes){
+ foreach($attributes as $k => $v){
+ $atts .= " $k=\"".$this->expandEntities($v).'"';
+ }
+ }
+ // serialize null value
+ if (is_null($val)) {
+ if ($use == 'literal') {
+ // TODO: depends on minOccurs
+ return "<$name$xmlns $atts/>";
+ } else {
+ if (isset($type) && isset($type_prefix)) {
+ $type_str = " xsi:type=\"$type_prefix:$type\"";
+ } else {
+ $type_str = '';
+ }
+ return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>";
+ }
+ }
+ // serialize if an xsd built-in primitive type
+ if($type != '' && isset($this->typemap[$this->XMLSchemaVersion][$type])){
+ if (is_bool($val)) {
+ if ($type == 'boolean') {
+ $val = $val ? 'true' : 'false';
+ } elseif (! $val) {
+ $val = 0;
+ }
+ } else if (is_string($val)) {
+ $val = $this->expandEntities($val);
+ }
+ if ($use == 'literal') {
+ return "<$name$xmlns $atts>$val$name>";
+ } else {
+ return "<$name$xmlns $atts xsi:type=\"xsd:$type\">$val$name>";
+ }
+ }
+ // detect type and serialize
+ $xml = '';
+ switch(true) {
+ case (is_bool($val) || $type == 'boolean'):
+ if ($type == 'boolean') {
+ $val = $val ? 'true' : 'false';
+ } elseif (! $val) {
+ $val = 0;
+ }
+ if ($use == 'literal') {
+ $xml .= "<$name$xmlns $atts>$val$name>";
+ } else {
+ $xml .= "<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val$name>";
+ }
+ break;
+ case (is_int($val) || is_long($val) || $type == 'int'):
+ if ($use == 'literal') {
+ $xml .= "<$name$xmlns $atts>$val$name>";
+ } else {
+ $xml .= "<$name$xmlns xsi:type=\"xsd:int\"$atts>$val$name>";
+ }
+ break;
+ case (is_float($val)|| is_double($val) || $type == 'float'):
+ if ($use == 'literal') {
+ $xml .= "<$name$xmlns $atts>$val$name>";
+ } else {
+ $xml .= "<$name$xmlns xsi:type=\"xsd:float\"$atts>$val$name>";
+ }
+ break;
+ case (is_string($val) || $type == 'string'):
+ $val = $this->expandEntities($val);
+ if ($use == 'literal') {
+ $xml .= "<$name$xmlns $atts>$val$name>";
+ } else {
+ $xml .= "<$name$xmlns xsi:type=\"xsd:string\"$atts>$val$name>";
+ }
+ break;
+ case is_object($val):
+ if (! $name) {
+ $name = get_class($val);
+ $this->debug("In serialize_val, used class name $name as element name");
+ } else {
+ $this->debug("In serialize_val, do not override name $name for element name for class " . get_class($val));
+ }
+ foreach(get_object_vars($val) as $k => $v){
+ $pXml = isset($pXml) ? $pXml.$this->serialize_val($v,$k,false,false,false,false,$use) : $this->serialize_val($v,$k,false,false,false,false,$use);
+ }
+ $xml .= '<'.$name.'>'.$pXml.''.$name.'>';
+ break;
+ break;
+ case (is_array($val) || $type):
+ // detect if struct or array
+ $valueType = $this->isArraySimpleOrStruct($val);
+ if($valueType=='arraySimple' || ereg('^ArrayOf',$type)){
+ $i = 0;
+ if(is_array($val) && count($val)> 0){
+ foreach($val as $v){
+ if(is_object($v) && get_class($v) == 'soapval'){
+ $tt_ns = $v->type_ns;
+ $tt = $v->type;
+ } elseif (is_array($v)) {
+ $tt = $this->isArraySimpleOrStruct($v);
+ } else {
+ $tt = gettype($v);
+ }
+ $array_types[$tt] = 1;
+ // TODO: for literal, the name should be $name
+ $xml .= $this->serialize_val($v,'item',false,false,false,false,$use);
+ ++$i;
+ }
+ if(count($array_types) > 1){
+ $array_typename = 'xsd:anyType';
+ } elseif(isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) {
+ if ($tt == 'integer') {
+ $tt = 'int';
+ }
+ $array_typename = 'xsd:'.$tt;
+ } elseif(isset($tt) && $tt == 'arraySimple'){
+ $array_typename = 'SOAP-ENC:Array';
+ } elseif(isset($tt) && $tt == 'arrayStruct'){
+ $array_typename = 'unnamed_struct_use_soapval';
+ } else {
+ // if type is prefixed, create type prefix
+ if ($tt_ns != '' && $tt_ns == $this->namespaces['xsd']){
+ $array_typename = 'xsd:' . $tt;
+ } elseif ($tt_ns) {
+ $tt_prefix = 'ns' . rand(1000, 9999);
+ $array_typename = "$tt_prefix:$tt";
+ $xmlns .= " xmlns:$tt_prefix=\"$tt_ns\"";
+ } else {
+ $array_typename = $tt;
+ }
+ }
+ $array_type = $i;
+ if ($use == 'literal') {
+ $type_str = '';
+ } else if (isset($type) && isset($type_prefix)) {
+ $type_str = " xsi:type=\"$type_prefix:$type\"";
+ } else {
+ $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_typename."[$array_type]\"";
+ }
+ // empty array
+ } else {
+ if ($use == 'literal') {
+ $type_str = '';
+ } else if (isset($type) && isset($type_prefix)) {
+ $type_str = " xsi:type=\"$type_prefix:$type\"";
+ } else {
+ $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"xsd:anyType[0]\"";
+ }
+ }
+ // TODO: for array in literal, there is no wrapper here
+ $xml = "<$name$xmlns$type_str$atts>".$xml."$name>";
+ } else {
+ // got a struct
+ if(isset($type) && isset($type_prefix)){
+ $type_str = " xsi:type=\"$type_prefix:$type\"";
+ } else {
+ $type_str = '';
+ }
+ if ($use == 'literal') {
+ $xml .= "<$name$xmlns $atts>";
+ } else {
+ $xml .= "<$name$xmlns$type_str$atts>";
+ }
+ foreach($val as $k => $v){
+ // Apache Map
+ if ($type == 'Map' && $type_ns == 'http://xml.apache.org/xml-soap') {
+ $xml .= '';
+ $xml .= $this->serialize_val($k,'key',false,false,false,false,$use);
+ $xml .= $this->serialize_val($v,'value',false,false,false,false,$use);
+ $xml .= '';
+ } else {
+ $xml .= $this->serialize_val($v,$k,false,false,false,false,$use);
+ }
+ }
+ $xml .= "$name>";
+ }
+ break;
+ default:
+ $xml .= 'not detected, got '.gettype($val).' for '.$val;
+ break;
+ }
+ return $xml;
+ }
+
+ /**
+ * serializes a message
+ *
+ * @param string $body the XML of the SOAP body
+ * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers
+ * @param array $namespaces optional the namespaces used in generating the body and headers
+ * @param string $style optional (rpc|document)
+ * @param string $use optional (encoded|literal)
+ * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded)
+ * @return string the message
+ * @access public
+ */
+ function serializeEnvelope($body,$headers=false,$namespaces=array(),$style='rpc',$use='encoded',$encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'){
+ // TODO: add an option to automatically run utf8_encode on $body and $headers
+ // if $this->soap_defencoding is UTF-8. Not doing this automatically allows
+ // one to send arbitrary UTF-8 characters, not just characters that map to ISO-8859-1
+
+ $this->debug("In serializeEnvelope length=" . strlen($body) . " body (max 1000 characters)=" . substr($body, 0, 1000) . " style=$style use=$use encodingStyle=$encodingStyle");
+ $this->debug("headers:");
+ $this->appendDebug($this->varDump($headers));
+ $this->debug("namespaces:");
+ $this->appendDebug($this->varDump($namespaces));
+
+ // serialize namespaces
+ $ns_string = '';
+ foreach(array_merge($this->namespaces,$namespaces) as $k => $v){
+ $ns_string .= " xmlns:$k=\"$v\"";
+ }
+ if($encodingStyle) {
+ $ns_string = " SOAP-ENV:encodingStyle=\"$encodingStyle\"$ns_string";
+ }
+
+ // serialize headers
+ if($headers){
+ if (is_array($headers)) {
+ $xml = '';
+ foreach ($headers as $header) {
+ $xml .= $this->serialize_val($header, false, false, false, false, false, $use);
+ }
+ $headers = $xml;
+ $this->debug("In serializeEnvelope, serialzied array of headers to $headers");
+ }
+ $headers = "".$headers."";
+ }
+ // serialize envelope
+ return
+ 'soap_defencoding .'"?'.">".
+ '".
+ $headers.
+ "".
+ $body.
+ "".
+ "";
+ }
+
+ /**
+ * formats a string to be inserted into an HTML stream
+ *
+ * @param string $str The string to format
+ * @return string The formatted string
+ * @access public
+ * @deprecated
+ */
+ function formatDump($str){
+ $str = htmlspecialchars($str);
+ return nl2br($str);
+ }
+
+ /**
+ * contracts (changes namespace to prefix) a qualified name
+ *
+ * @param string $qname qname
+ * @return string contracted qname
+ * @access private
+ */
+ function contractQname($qname){
+ // get element namespace
+ //$this->xdebug("Contract $qname");
+ if (strrpos($qname, ':')) {
+ // get unqualified name
+ $name = substr($qname, strrpos($qname, ':') + 1);
+ // get ns
+ $ns = substr($qname, 0, strrpos($qname, ':'));
+ $p = $this->getPrefixFromNamespace($ns);
+ if ($p) {
+ return $p . ':' . $name;
+ }
+ return $qname;
+ } else {
+ return $qname;
+ }
+ }
+
+ /**
+ * expands (changes prefix to namespace) a qualified name
+ *
+ * @param string $string qname
+ * @return string expanded qname
+ * @access private
+ */
+ function expandQname($qname){
+ // get element prefix
+ if(strpos($qname,':') && !ereg('^http://',$qname)){
+ // get unqualified name
+ $name = substr(strstr($qname,':'),1);
+ // get ns prefix
+ $prefix = substr($qname,0,strpos($qname,':'));
+ if(isset($this->namespaces[$prefix])){
+ return $this->namespaces[$prefix].':'.$name;
+ } else {
+ return $qname;
+ }
+ } else {
+ return $qname;
+ }
+ }
+
+ /**
+ * returns the local part of a prefixed string
+ * returns the original string, if not prefixed
+ *
+ * @param string $str The prefixed string
+ * @return string The local part
+ * @access public
+ */
+ function getLocalPart($str){
+ if($sstr = strrchr($str,':')){
+ // get unqualified name
+ return substr( $sstr, 1 );
+ } else {
+ return $str;
+ }
+ }
+
+ /**
+ * returns the prefix part of a prefixed string
+ * returns false, if not prefixed
+ *
+ * @param string $str The prefixed string
+ * @return mixed The prefix or false if there is no prefix
+ * @access public
+ */
+ function getPrefix($str){
+ if($pos = strrpos($str,':')){
+ // get prefix
+ return substr($str,0,$pos);
+ }
+ return false;
+ }
+
+ /**
+ * pass it a prefix, it returns a namespace
+ *
+ * @param string $prefix The prefix
+ * @return mixed The namespace, false if no namespace has the specified prefix
+ * @access public
+ */
+ function getNamespaceFromPrefix($prefix){
+ if (isset($this->namespaces[$prefix])) {
+ return $this->namespaces[$prefix];
+ }
+ //$this->setError("No namespace registered for prefix '$prefix'");
+ return false;
+ }
+
+ /**
+ * returns the prefix for a given namespace (or prefix)
+ * or false if no prefixes registered for the given namespace
+ *
+ * @param string $ns The namespace
+ * @return mixed The prefix, false if the namespace has no prefixes
+ * @access public
+ */
+ function getPrefixFromNamespace($ns) {
+ foreach ($this->namespaces as $p => $n) {
+ if ($ns == $n || $ns == $p) {
+ $this->usedNamespaces[$p] = $n;
+ return $p;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * returns the time in ODBC canonical form with microseconds
+ *
+ * @return string The time in ODBC canonical form with microseconds
+ * @access public
+ */
+ function getmicrotime() {
+ if (function_exists('gettimeofday')) {
+ $tod = gettimeofday();
+ $sec = $tod['sec'];
+ $usec = $tod['usec'];
+ } else {
+ $sec = time();
+ $usec = 0;
+ }
+ return strftime('%Y-%m-%d %H:%M:%S', $sec) . '.' . sprintf('%06d', $usec);
+ }
+
+ /**
+ * Returns a string with the output of var_dump
+ *
+ * @param mixed $data The variable to var_dump
+ * @return string The output of var_dump
+ * @access public
+ */
+ function varDump($data) {
+ ob_start();
+ var_dump($data);
+ $ret_val = ob_get_contents();
+ ob_end_clean();
+ return $ret_val;
+ }
+}
+
+// XML Schema Datatype Helper Functions
+
+//xsd:dateTime helpers
+
+/**
+* convert unix timestamp to ISO 8601 compliant date string
+*
+* @param string $timestamp Unix time stamp
+* @access public
+*/
+function timestamp_to_iso8601($timestamp,$utc=true){
+ $datestr = date('Y-m-d\TH:i:sO',$timestamp);
+ if($utc){
+ $eregStr =
+ '([0-9]{4})-'. // centuries & years CCYY-
+ '([0-9]{2})-'. // months MM-
+ '([0-9]{2})'. // days DD
+ 'T'. // separator T
+ '([0-9]{2}):'. // hours hh:
+ '([0-9]{2}):'. // minutes mm:
+ '([0-9]{2})(\.[0-9]*)?'. // seconds ss.ss...
+ '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's
+
+ if(ereg($eregStr,$datestr,$regs)){
+ return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]);
+ }
+ return false;
+ } else {
+ return $datestr;
+ }
+}
+
+/**
+* convert ISO 8601 compliant date string to unix timestamp
+*
+* @param string $datestr ISO 8601 compliant date string
+* @access public
+*/
+function iso8601_to_timestamp($datestr){
+ $eregStr =
+ '([0-9]{4})-'. // centuries & years CCYY-
+ '([0-9]{2})-'. // months MM-
+ '([0-9]{2})'. // days DD
+ 'T'. // separator T
+ '([0-9]{2}):'. // hours hh:
+ '([0-9]{2}):'. // minutes mm:
+ '([0-9]{2})(\.[0-9]+)?'. // seconds ss.ss...
+ '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's
+ if(ereg($eregStr,$datestr,$regs)){
+ // not utc
+ if($regs[8] != 'Z'){
+ $op = substr($regs[8],0,1);
+ $h = substr($regs[8],1,2);
+ $m = substr($regs[8],strlen($regs[8])-2,2);
+ if($op == '-'){
+ $regs[4] = $regs[4] + $h;
+ $regs[5] = $regs[5] + $m;
+ } elseif($op == '+'){
+ $regs[4] = $regs[4] - $h;
+ $regs[5] = $regs[5] - $m;
+ }
+ }
+ return strtotime("$regs[1]-$regs[2]-$regs[3] $regs[4]:$regs[5]:$regs[6]Z");
+ } else {
+ return false;
+ }
+}
+
+/**
+* sleeps some number of microseconds
+*
+* @param string $usec the number of microseconds to sleep
+* @access public
+* @deprecated
+*/
+function usleepWindows($usec)
+{
+ $start = gettimeofday();
+
+ do
+ {
+ $stop = gettimeofday();
+ $timePassed = 1000000 * ($stop['sec'] - $start['sec'])
+ + $stop['usec'] - $start['usec'];
+ }
+ while ($timePassed < $usec);
+}
+
+
?>
\ No newline at end of file
diff --git a/htdocs/includes/nusoap/lib/class.soap_fault.php b/htdocs/includes/nusoap/lib/class.soap_fault.php
index d6859084e2b..62509a24fb2 100644
--- a/htdocs/includes/nusoap/lib/class.soap_fault.php
+++ b/htdocs/includes/nusoap/lib/class.soap_fault.php
@@ -1,86 +1,86 @@
-
-* @version $Id$
-* @access public
-*/
-class soap_fault extends nusoap_base {
- /**
- * The fault code (client|server)
- * @var string
- * @access private
- */
- var $faultcode;
- /**
- * The fault actor
- * @var string
- * @access private
- */
- var $faultactor;
- /**
- * The fault string, a description of the fault
- * @var string
- * @access private
- */
- var $faultstring;
- /**
- * The fault detail, typically a string or array of string
- * @var mixed
- * @access private
- */
- var $faultdetail;
-
- /**
- * constructor
- *
- * @param string $faultcode (client | server)
- * @param string $faultactor only used when msg routed between multiple actors
- * @param string $faultstring human readable error message
- * @param mixed $faultdetail detail, typically a string or array of string
- */
- function soap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){
- parent::nusoap_base();
- $this->faultcode = $faultcode;
- $this->faultactor = $faultactor;
- $this->faultstring = $faultstring;
- $this->faultdetail = $faultdetail;
- }
-
- /**
- * serialize a fault
- *
- * @return string The serialization of the fault instance.
- * @access public
- */
- function serialize(){
- $ns_string = '';
- foreach($this->namespaces as $k => $v){
- $ns_string .= "\n xmlns:$k=\"$v\"";
- }
- $return_msg =
- 'soap_defencoding.'"?>'.
- '\n".
- ''.
- ''.
- $this->serialize_val($this->faultcode, 'faultcode').
- $this->serialize_val($this->faultactor, 'faultactor').
- $this->serialize_val($this->faultstring, 'faultstring').
- $this->serialize_val($this->faultdetail, 'detail').
- ''.
- ''.
- '';
- return $return_msg;
- }
-}
-
-
-
-
+
+* @version $Id$
+* @access public
+*/
+class soap_fault extends nusoap_base {
+ /**
+ * The fault code (client|server)
+ * @var string
+ * @access private
+ */
+ var $faultcode;
+ /**
+ * The fault actor
+ * @var string
+ * @access private
+ */
+ var $faultactor;
+ /**
+ * The fault string, a description of the fault
+ * @var string
+ * @access private
+ */
+ var $faultstring;
+ /**
+ * The fault detail, typically a string or array of string
+ * @var mixed
+ * @access private
+ */
+ var $faultdetail;
+
+ /**
+ * constructor
+ *
+ * @param string $faultcode (client | server)
+ * @param string $faultactor only used when msg routed between multiple actors
+ * @param string $faultstring human readable error message
+ * @param mixed $faultdetail detail, typically a string or array of string
+ */
+ function soap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){
+ parent::nusoap_base();
+ $this->faultcode = $faultcode;
+ $this->faultactor = $faultactor;
+ $this->faultstring = $faultstring;
+ $this->faultdetail = $faultdetail;
+ }
+
+ /**
+ * serialize a fault
+ *
+ * @return string The serialization of the fault instance.
+ * @access public
+ */
+ function serialize(){
+ $ns_string = '';
+ foreach($this->namespaces as $k => $v){
+ $ns_string .= "\n xmlns:$k=\"$v\"";
+ }
+ $return_msg =
+ 'soap_defencoding.'"?>'.
+ '\n".
+ ''.
+ ''.
+ $this->serialize_val($this->faultcode, 'faultcode').
+ $this->serialize_val($this->faultactor, 'faultactor').
+ $this->serialize_val($this->faultstring, 'faultstring').
+ $this->serialize_val($this->faultdetail, 'detail').
+ ''.
+ ''.
+ '';
+ return $return_msg;
+ }
+}
+
+
+
+
?>
\ No newline at end of file
diff --git a/htdocs/includes/nusoap/lib/class.soap_parser.php b/htdocs/includes/nusoap/lib/class.soap_parser.php
index 37b1920fc0e..1c70a8cbdc1 100644
--- a/htdocs/includes/nusoap/lib/class.soap_parser.php
+++ b/htdocs/includes/nusoap/lib/class.soap_parser.php
@@ -1,599 +1,599 @@
-
-* @version $Id$
-* @access public
-*/
-class soap_parser extends nusoap_base {
-
- var $xml = '';
- var $xml_encoding = '';
- var $method = '';
- var $root_struct = '';
- var $root_struct_name = '';
- var $root_struct_namespace = '';
- var $root_header = '';
- var $document = ''; // incoming SOAP body (text)
- // determines where in the message we are (envelope,header,body,method)
- var $status = '';
- var $position = 0;
- var $depth = 0;
- var $default_namespace = '';
- var $namespaces = array();
- var $message = array();
- var $parent = '';
- var $fault = false;
- var $fault_code = '';
- var $fault_str = '';
- var $fault_detail = '';
- var $depth_array = array();
- var $debug_flag = true;
- var $soapresponse = NULL;
- var $responseHeaders = ''; // incoming SOAP headers (text)
- var $body_position = 0;
- // for multiref parsing:
- // array of id => pos
- var $ids = array();
- // array of id => hrefs => pos
- var $multirefs = array();
- // toggle for auto-decoding element content
- var $decode_utf8 = true;
-
- /**
- * constructor that actually does the parsing
- *
- * @param string $xml SOAP message
- * @param string $encoding character encoding scheme of message
- * @param string $method method for which XML is parsed (unused?)
- * @param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1
- * @access public
- */
- function soap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){
- parent::nusoap_base();
- $this->xml = $xml;
- $this->xml_encoding = $encoding;
- $this->method = $method;
- $this->decode_utf8 = $decode_utf8;
-
- // Check whether content has been read.
- if(!empty($xml)){
- // Check XML encoding
- $pos_xml = strpos($xml, '', $pos_xml + 2) - $pos_xml + 1);
- if (preg_match("/encoding=[\"']([^\"']*)[\"']/", $xml_decl, $res)) {
- $xml_encoding = $res[1];
- if (strtoupper($xml_encoding) != $encoding) {
- $err = "Charset from HTTP Content-Type '" . $encoding . "' does not match encoding from XML declaration '" . $xml_encoding . "'";
- $this->debug($err);
- if ($encoding != 'ISO-8859-1' || strtoupper($xml_encoding) != 'UTF-8') {
- $this->setError($err);
- return;
- }
- // when HTTP says ISO-8859-1 (the default) and XML says UTF-8 (the typical), assume the other endpoint is just sloppy and proceed
- } else {
- $this->debug('Charset from HTTP Content-Type matches encoding from XML declaration');
- }
- } else {
- $this->debug('No encoding specified in XML declaration');
- }
- } else {
- $this->debug('No XML declaration');
- }
- $this->debug('Entering soap_parser(), length='.strlen($xml).', encoding='.$encoding);
- // Create an XML parser - why not xml_parser_create_ns?
- $this->parser = xml_parser_create($this->xml_encoding);
- // Set the options for parsing the XML data.
- //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
- xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
- xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding);
- // Set the object for the parser.
- xml_set_object($this->parser, $this);
- // Set the element handlers for the parser.
- xml_set_element_handler($this->parser, 'start_element','end_element');
- xml_set_character_data_handler($this->parser,'character_data');
-
- // Parse the XML file.
- if(!xml_parse($this->parser,$xml,true)){
- // Display an error message.
- $err = sprintf('XML error parsing SOAP payload on line %d: %s',
- xml_get_current_line_number($this->parser),
- xml_error_string(xml_get_error_code($this->parser)));
- $this->debug($err);
- $this->debug("XML payload:\n" . $xml);
- $this->setError($err);
- } else {
- $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name);
- // get final value
- $this->soapresponse = $this->message[$this->root_struct]['result'];
- // get header value: no, because this is documented as XML string
-// if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){
-// $this->responseHeaders = $this->message[$this->root_header]['result'];
-// }
- // resolve hrefs/ids
- if(sizeof($this->multirefs) > 0){
- foreach($this->multirefs as $id => $hrefs){
- $this->debug('resolving multirefs for id: '.$id);
- $idVal = $this->buildVal($this->ids[$id]);
- if (is_array($idVal) && isset($idVal['!id'])) {
- unset($idVal['!id']);
- }
- foreach($hrefs as $refPos => $ref){
- $this->debug('resolving href at pos '.$refPos);
- $this->multirefs[$id][$refPos] = $idVal;
- }
- }
- }
- }
- xml_parser_free($this->parser);
- } else {
- $this->debug('xml was empty, didn\'t parse!');
- $this->setError('xml was empty, didn\'t parse!');
- }
- }
-
- /**
- * start-element handler
- *
- * @param resource $parser XML parser object
- * @param string $name element name
- * @param array $attrs associative array of attributes
- * @access private
- */
- function start_element($parser, $name, $attrs) {
- // position in a total number of elements, starting from 0
- // update class level pos
- $pos = $this->position++;
- // and set mine
- $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>'');
- // depth = how many levels removed from root?
- // set mine as current global depth and increment global depth value
- $this->message[$pos]['depth'] = $this->depth++;
-
- // else add self as child to whoever the current parent is
- if($pos != 0){
- $this->message[$this->parent]['children'] .= '|'.$pos;
- }
- // set my parent
- $this->message[$pos]['parent'] = $this->parent;
- // set self as current parent
- $this->parent = $pos;
- // set self as current value for this depth
- $this->depth_array[$this->depth] = $pos;
- // get element prefix
- if(strpos($name,':')){
- // get ns prefix
- $prefix = substr($name,0,strpos($name,':'));
- // get unqualified name
- $name = substr(strstr($name,':'),1);
- }
- // set status
- if($name == 'Envelope'){
- $this->status = 'envelope';
- } elseif($name == 'Header'){
- $this->root_header = $pos;
- $this->status = 'header';
- } elseif($name == 'Body'){
- $this->status = 'body';
- $this->body_position = $pos;
- // set method
- } elseif($this->status == 'body' && $pos == ($this->body_position+1)){
- $this->status = 'method';
- $this->root_struct_name = $name;
- $this->root_struct = $pos;
- $this->message[$pos]['type'] = 'struct';
- $this->debug("found root struct $this->root_struct_name, pos $this->root_struct");
- }
- // set my status
- $this->message[$pos]['status'] = $this->status;
- // set name
- $this->message[$pos]['name'] = htmlspecialchars($name);
- // set attrs
- $this->message[$pos]['attrs'] = $attrs;
-
- // loop through atts, logging ns and type declarations
- $attstr = '';
- foreach($attrs as $key => $value){
- $key_prefix = $this->getPrefix($key);
- $key_localpart = $this->getLocalPart($key);
- // if ns declarations, add to class level array of valid namespaces
- if($key_prefix == 'xmlns'){
- if(ereg('^http://www.w3.org/[0-9]{4}/XMLSchema$',$value)){
- $this->XMLSchemaVersion = $value;
- $this->namespaces['xsd'] = $this->XMLSchemaVersion;
- $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance';
- }
- $this->namespaces[$key_localpart] = $value;
- // set method namespace
- if($name == $this->root_struct_name){
- $this->methodNamespace = $value;
- }
- // if it's a type declaration, set type
- } elseif($key_localpart == 'type'){
- $value_prefix = $this->getPrefix($value);
- $value_localpart = $this->getLocalPart($value);
- $this->message[$pos]['type'] = $value_localpart;
- $this->message[$pos]['typePrefix'] = $value_prefix;
- if(isset($this->namespaces[$value_prefix])){
- $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix];
- } else if(isset($attrs['xmlns:'.$value_prefix])) {
- $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix];
- }
- // should do something here with the namespace of specified type?
- } elseif($key_localpart == 'arrayType'){
- $this->message[$pos]['type'] = 'array';
- /* do arrayType ereg here
- [1] arrayTypeValue ::= atype asize
- [2] atype ::= QName rank*
- [3] rank ::= '[' (',')* ']'
- [4] asize ::= '[' length~ ']'
- [5] length ::= nextDimension* Digit+
- [6] nextDimension ::= Digit+ ','
- */
- $expr = '([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]';
- if(ereg($expr,$value,$regs)){
- $this->message[$pos]['typePrefix'] = $regs[1];
- $this->message[$pos]['arrayTypePrefix'] = $regs[1];
- if (isset($this->namespaces[$regs[1]])) {
- $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]];
- } else if (isset($attrs['xmlns:'.$regs[1]])) {
- $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]];
- }
- $this->message[$pos]['arrayType'] = $regs[2];
- $this->message[$pos]['arraySize'] = $regs[3];
- $this->message[$pos]['arrayCols'] = $regs[4];
- }
- // specifies nil value (or not)
- } elseif ($key_localpart == 'nil'){
- $this->message[$pos]['nil'] = ($value == 'true' || $value == '1');
- // some other attribute
- } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') {
- $this->message[$pos]['xattrs']['!' . $key] = $value;
- }
-
- if ($key == 'xmlns') {
- $this->default_namespace = $value;
- }
- // log id
- if($key == 'id'){
- $this->ids[$value] = $pos;
- }
- // root
- if($key_localpart == 'root' && $value == 1){
- $this->status = 'method';
- $this->root_struct_name = $name;
- $this->root_struct = $pos;
- $this->debug("found root struct $this->root_struct_name, pos $pos");
- }
- // for doclit
- $attstr .= " $key=\"$value\"";
- }
- // get namespace - must be done after namespace atts are processed
- if(isset($prefix)){
- $this->message[$pos]['namespace'] = $this->namespaces[$prefix];
- $this->default_namespace = $this->namespaces[$prefix];
- } else {
- $this->message[$pos]['namespace'] = $this->default_namespace;
- }
- if($this->status == 'header'){
- if ($this->root_header != $pos) {
- $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
- }
- } elseif($this->root_struct_name != ''){
- $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
- }
- }
-
- /**
- * end-element handler
- *
- * @param resource $parser XML parser object
- * @param string $name element name
- * @access private
- */
- function end_element($parser, $name) {
- // position of current element is equal to the last value left in depth_array for my depth
- $pos = $this->depth_array[$this->depth--];
-
- // get element prefix
- if(strpos($name,':')){
- // get ns prefix
- $prefix = substr($name,0,strpos($name,':'));
- // get unqualified name
- $name = substr(strstr($name,':'),1);
- }
-
- // build to native type
- if(isset($this->body_position) && $pos > $this->body_position){
- // deal w/ multirefs
- if(isset($this->message[$pos]['attrs']['href'])){
- // get id
- $id = substr($this->message[$pos]['attrs']['href'],1);
- // add placeholder to href array
- $this->multirefs[$id][$pos] = 'placeholder';
- // add set a reference to it as the result value
- $this->message[$pos]['result'] =& $this->multirefs[$id][$pos];
- // build complexType values
- } elseif($this->message[$pos]['children'] != ''){
- // if result has already been generated (struct/array)
- if(!isset($this->message[$pos]['result'])){
- $this->message[$pos]['result'] = $this->buildVal($pos);
- }
- // build complexType values of attributes and possibly simpleContent
- } elseif (isset($this->message[$pos]['xattrs'])) {
- if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) {
- $this->message[$pos]['xattrs']['!'] = null;
- } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') {
- if (isset($this->message[$pos]['type'])) {
- $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
- } else {
- $parent = $this->message[$pos]['parent'];
- if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
- $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
- } else {
- $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata'];
- }
- }
- }
- $this->message[$pos]['result'] = $this->message[$pos]['xattrs'];
- // set value of simpleType (or nil complexType)
- } else {
- //$this->debug('adding data for scalar value '.$this->message[$pos]['name'].' of value '.$this->message[$pos]['cdata']);
- if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) {
- $this->message[$pos]['xattrs']['!'] = null;
- } elseif (isset($this->message[$pos]['type'])) {
- $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
- } else {
- $parent = $this->message[$pos]['parent'];
- if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
- $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
- } else {
- $this->message[$pos]['result'] = $this->message[$pos]['cdata'];
- }
- }
-
- /* add value to parent's result, if parent is struct/array
- $parent = $this->message[$pos]['parent'];
- if($this->message[$parent]['type'] != 'map'){
- if(strtolower($this->message[$parent]['type']) == 'array'){
- $this->message[$parent]['result'][] = $this->message[$pos]['result'];
- } else {
- $this->message[$parent]['result'][$this->message[$pos]['name']] = $this->message[$pos]['result'];
- }
- }
- */
- }
- }
-
- // for doclit
- if($this->status == 'header'){
- if ($this->root_header != $pos) {
- $this->responseHeaders .= "" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
- }
- } elseif($pos >= $this->root_struct){
- $this->document .= "" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
- }
- // switch status
- if($pos == $this->root_struct){
- $this->status = 'body';
- $this->root_struct_namespace = $this->message[$pos]['namespace'];
- } elseif($name == 'Body'){
- $this->status = 'envelope';
- } elseif($name == 'Header'){
- $this->status = 'envelope';
- } elseif($name == 'Envelope'){
- //
- }
- // set parent back to my parent
- $this->parent = $this->message[$pos]['parent'];
- }
-
- /**
- * element content handler
- *
- * @param resource $parser XML parser object
- * @param string $data element content
- * @access private
- */
- function character_data($parser, $data){
- $pos = $this->depth_array[$this->depth];
- if ($this->xml_encoding=='UTF-8'){
- // TODO: add an option to disable this for folks who want
- // raw UTF-8 that, e.g., might not map to iso-8859-1
- // TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
- if($this->decode_utf8){
- $data = utf8_decode($data);
- }
- }
- $this->message[$pos]['cdata'] .= $data;
- // for doclit
- if($this->status == 'header'){
- $this->responseHeaders .= $data;
- } else {
- $this->document .= $data;
- }
- }
-
- /**
- * get the parsed message
- *
- * @return mixed
- * @access public
- */
- function get_response(){
- return $this->soapresponse;
- }
-
- /**
- * get the parsed headers
- *
- * @return string XML or empty if no headers
- * @access public
- */
- function getHeaders(){
- return $this->responseHeaders;
- }
-
- /**
- * decodes simple types into PHP variables
- *
- * @param string $value value to decode
- * @param string $type XML type to decode
- * @param string $typens XML type namespace to decode
- * @return mixed PHP value
- * @access private
- */
- function decodeSimple($value, $type, $typens) {
- // TODO: use the namespace!
- if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') {
- return (string) $value;
- }
- if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') {
- return (int) $value;
- }
- if ($type == 'float' || $type == 'double' || $type == 'decimal') {
- return (double) $value;
- }
- if ($type == 'boolean') {
- if (strtolower($value) == 'false' || strtolower($value) == 'f') {
- return false;
- }
- return (boolean) $value;
- }
- if ($type == 'base64' || $type == 'base64Binary') {
- $this->debug('Decode base64 value');
- return base64_decode($value);
- }
- // obscure numeric types
- if ($type == 'nonPositiveInteger' || $type == 'negativeInteger'
- || $type == 'nonNegativeInteger' || $type == 'positiveInteger'
- || $type == 'unsignedInt'
- || $type == 'unsignedShort' || $type == 'unsignedByte') {
- return (int) $value;
- }
- // bogus: parser treats array with no elements as a simple type
- if ($type == 'array') {
- return array();
- }
- // everything else
- return (string) $value;
- }
-
- /**
- * builds response structures for compound values (arrays/structs)
- * and scalars
- *
- * @param integer $pos position in node tree
- * @return mixed PHP value
- * @access private
- */
- function buildVal($pos){
- if(!isset($this->message[$pos]['type'])){
- $this->message[$pos]['type'] = '';
- }
- $this->debug('in buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']);
- // if there are children...
- if($this->message[$pos]['children'] != ''){
- $this->debug('in buildVal, there are children');
- $children = explode('|',$this->message[$pos]['children']);
- array_shift($children); // knock off empty
- // md array
- if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){
- $r=0; // rowcount
- $c=0; // colcount
- foreach($children as $child_pos){
- $this->debug("in buildVal, got an MD array element: $r, $c");
- $params[$r][] = $this->message[$child_pos]['result'];
- $c++;
- if($c == $this->message[$pos]['arrayCols']){
- $c = 0;
- $r++;
- }
- }
- // array
- } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){
- $this->debug('in buildVal, adding array '.$this->message[$pos]['name']);
- foreach($children as $child_pos){
- $params[] = &$this->message[$child_pos]['result'];
- }
- // apache Map type: java hashtable
- } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){
- $this->debug('in buildVal, Java Map '.$this->message[$pos]['name']);
- foreach($children as $child_pos){
- $kv = explode("|",$this->message[$child_pos]['children']);
- $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result'];
- }
- // generic compound type
- //} elseif($this->message[$pos]['type'] == 'SOAPStruct' || $this->message[$pos]['type'] == 'struct') {
- } else {
- // Apache Vector type: treat as an array
- $this->debug('in buildVal, adding Java Vector '.$this->message[$pos]['name']);
- if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') {
- $notstruct = 1;
- } else {
- $notstruct = 0;
- }
- //
- foreach($children as $child_pos){
- if($notstruct){
- $params[] = &$this->message[$child_pos]['result'];
- } else {
- if (isset($params[$this->message[$child_pos]['name']])) {
- // de-serialize repeated element name into an array
- if ((!is_array($params[$this->message[$child_pos]['name']])) || (!isset($params[$this->message[$child_pos]['name']][0]))) {
- $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]);
- }
- $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result'];
- } else {
- $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result'];
- }
- }
- }
- }
- if (isset($this->message[$pos]['xattrs'])) {
- $this->debug('in buildVal, handling attributes');
- foreach ($this->message[$pos]['xattrs'] as $n => $v) {
- $params[$n] = $v;
- }
- }
- // handle simpleContent
- if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') {
- $this->debug('in buildVal, handling simpleContent');
- if (isset($this->message[$pos]['type'])) {
- $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
- } else {
- $parent = $this->message[$pos]['parent'];
- if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
- $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
- } else {
- $params['!'] = $this->message[$pos]['cdata'];
- }
- }
- }
- return is_array($params) ? $params : array();
- } else {
- $this->debug('in buildVal, no children, building scalar');
- $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : '';
- if (isset($this->message[$pos]['type'])) {
- return $this->decodeSimple($cdata, $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
- }
- $parent = $this->message[$pos]['parent'];
- if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
- return $this->decodeSimple($cdata, $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
- }
- return $this->message[$pos]['cdata'];
- }
- }
-}
-
-
-
-
+
+* @version $Id$
+* @access public
+*/
+class soap_parser extends nusoap_base {
+
+ var $xml = '';
+ var $xml_encoding = '';
+ var $method = '';
+ var $root_struct = '';
+ var $root_struct_name = '';
+ var $root_struct_namespace = '';
+ var $root_header = '';
+ var $document = ''; // incoming SOAP body (text)
+ // determines where in the message we are (envelope,header,body,method)
+ var $status = '';
+ var $position = 0;
+ var $depth = 0;
+ var $default_namespace = '';
+ var $namespaces = array();
+ var $message = array();
+ var $parent = '';
+ var $fault = false;
+ var $fault_code = '';
+ var $fault_str = '';
+ var $fault_detail = '';
+ var $depth_array = array();
+ var $debug_flag = true;
+ var $soapresponse = NULL;
+ var $responseHeaders = ''; // incoming SOAP headers (text)
+ var $body_position = 0;
+ // for multiref parsing:
+ // array of id => pos
+ var $ids = array();
+ // array of id => hrefs => pos
+ var $multirefs = array();
+ // toggle for auto-decoding element content
+ var $decode_utf8 = true;
+
+ /**
+ * constructor that actually does the parsing
+ *
+ * @param string $xml SOAP message
+ * @param string $encoding character encoding scheme of message
+ * @param string $method method for which XML is parsed (unused?)
+ * @param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1
+ * @access public
+ */
+ function soap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){
+ parent::nusoap_base();
+ $this->xml = $xml;
+ $this->xml_encoding = $encoding;
+ $this->method = $method;
+ $this->decode_utf8 = $decode_utf8;
+
+ // Check whether content has been read.
+ if(!empty($xml)){
+ // Check XML encoding
+ $pos_xml = strpos($xml, '', $pos_xml + 2) - $pos_xml + 1);
+ if (preg_match("/encoding=[\"']([^\"']*)[\"']/", $xml_decl, $res)) {
+ $xml_encoding = $res[1];
+ if (strtoupper($xml_encoding) != $encoding) {
+ $err = "Charset from HTTP Content-Type '" . $encoding . "' does not match encoding from XML declaration '" . $xml_encoding . "'";
+ $this->debug($err);
+ if ($encoding != 'ISO-8859-1' || strtoupper($xml_encoding) != 'UTF-8') {
+ $this->setError($err);
+ return;
+ }
+ // when HTTP says ISO-8859-1 (the default) and XML says UTF-8 (the typical), assume the other endpoint is just sloppy and proceed
+ } else {
+ $this->debug('Charset from HTTP Content-Type matches encoding from XML declaration');
+ }
+ } else {
+ $this->debug('No encoding specified in XML declaration');
+ }
+ } else {
+ $this->debug('No XML declaration');
+ }
+ $this->debug('Entering soap_parser(), length='.strlen($xml).', encoding='.$encoding);
+ // Create an XML parser - why not xml_parser_create_ns?
+ $this->parser = xml_parser_create($this->xml_encoding);
+ // Set the options for parsing the XML data.
+ //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
+ xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
+ xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding);
+ // Set the object for the parser.
+ xml_set_object($this->parser, $this);
+ // Set the element handlers for the parser.
+ xml_set_element_handler($this->parser, 'start_element','end_element');
+ xml_set_character_data_handler($this->parser,'character_data');
+
+ // Parse the XML file.
+ if(!xml_parse($this->parser,$xml,true)){
+ // Display an error message.
+ $err = sprintf('XML error parsing SOAP payload on line %d: %s',
+ xml_get_current_line_number($this->parser),
+ xml_error_string(xml_get_error_code($this->parser)));
+ $this->debug($err);
+ $this->debug("XML payload:\n" . $xml);
+ $this->setError($err);
+ } else {
+ $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name);
+ // get final value
+ $this->soapresponse = $this->message[$this->root_struct]['result'];
+ // get header value: no, because this is documented as XML string
+// if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){
+// $this->responseHeaders = $this->message[$this->root_header]['result'];
+// }
+ // resolve hrefs/ids
+ if(sizeof($this->multirefs) > 0){
+ foreach($this->multirefs as $id => $hrefs){
+ $this->debug('resolving multirefs for id: '.$id);
+ $idVal = $this->buildVal($this->ids[$id]);
+ if (is_array($idVal) && isset($idVal['!id'])) {
+ unset($idVal['!id']);
+ }
+ foreach($hrefs as $refPos => $ref){
+ $this->debug('resolving href at pos '.$refPos);
+ $this->multirefs[$id][$refPos] = $idVal;
+ }
+ }
+ }
+ }
+ xml_parser_free($this->parser);
+ } else {
+ $this->debug('xml was empty, didn\'t parse!');
+ $this->setError('xml was empty, didn\'t parse!');
+ }
+ }
+
+ /**
+ * start-element handler
+ *
+ * @param resource $parser XML parser object
+ * @param string $name element name
+ * @param array $attrs associative array of attributes
+ * @access private
+ */
+ function start_element($parser, $name, $attrs) {
+ // position in a total number of elements, starting from 0
+ // update class level pos
+ $pos = $this->position++;
+ // and set mine
+ $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>'');
+ // depth = how many levels removed from root?
+ // set mine as current global depth and increment global depth value
+ $this->message[$pos]['depth'] = $this->depth++;
+
+ // else add self as child to whoever the current parent is
+ if($pos != 0){
+ $this->message[$this->parent]['children'] .= '|'.$pos;
+ }
+ // set my parent
+ $this->message[$pos]['parent'] = $this->parent;
+ // set self as current parent
+ $this->parent = $pos;
+ // set self as current value for this depth
+ $this->depth_array[$this->depth] = $pos;
+ // get element prefix
+ if(strpos($name,':')){
+ // get ns prefix
+ $prefix = substr($name,0,strpos($name,':'));
+ // get unqualified name
+ $name = substr(strstr($name,':'),1);
+ }
+ // set status
+ if($name == 'Envelope'){
+ $this->status = 'envelope';
+ } elseif($name == 'Header'){
+ $this->root_header = $pos;
+ $this->status = 'header';
+ } elseif($name == 'Body'){
+ $this->status = 'body';
+ $this->body_position = $pos;
+ // set method
+ } elseif($this->status == 'body' && $pos == ($this->body_position+1)){
+ $this->status = 'method';
+ $this->root_struct_name = $name;
+ $this->root_struct = $pos;
+ $this->message[$pos]['type'] = 'struct';
+ $this->debug("found root struct $this->root_struct_name, pos $this->root_struct");
+ }
+ // set my status
+ $this->message[$pos]['status'] = $this->status;
+ // set name
+ $this->message[$pos]['name'] = htmlspecialchars($name);
+ // set attrs
+ $this->message[$pos]['attrs'] = $attrs;
+
+ // loop through atts, logging ns and type declarations
+ $attstr = '';
+ foreach($attrs as $key => $value){
+ $key_prefix = $this->getPrefix($key);
+ $key_localpart = $this->getLocalPart($key);
+ // if ns declarations, add to class level array of valid namespaces
+ if($key_prefix == 'xmlns'){
+ if(ereg('^http://www.w3.org/[0-9]{4}/XMLSchema$',$value)){
+ $this->XMLSchemaVersion = $value;
+ $this->namespaces['xsd'] = $this->XMLSchemaVersion;
+ $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance';
+ }
+ $this->namespaces[$key_localpart] = $value;
+ // set method namespace
+ if($name == $this->root_struct_name){
+ $this->methodNamespace = $value;
+ }
+ // if it's a type declaration, set type
+ } elseif($key_localpart == 'type'){
+ $value_prefix = $this->getPrefix($value);
+ $value_localpart = $this->getLocalPart($value);
+ $this->message[$pos]['type'] = $value_localpart;
+ $this->message[$pos]['typePrefix'] = $value_prefix;
+ if(isset($this->namespaces[$value_prefix])){
+ $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix];
+ } else if(isset($attrs['xmlns:'.$value_prefix])) {
+ $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix];
+ }
+ // should do something here with the namespace of specified type?
+ } elseif($key_localpart == 'arrayType'){
+ $this->message[$pos]['type'] = 'array';
+ /* do arrayType ereg here
+ [1] arrayTypeValue ::= atype asize
+ [2] atype ::= QName rank*
+ [3] rank ::= '[' (',')* ']'
+ [4] asize ::= '[' length~ ']'
+ [5] length ::= nextDimension* Digit+
+ [6] nextDimension ::= Digit+ ','
+ */
+ $expr = '([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]';
+ if(ereg($expr,$value,$regs)){
+ $this->message[$pos]['typePrefix'] = $regs[1];
+ $this->message[$pos]['arrayTypePrefix'] = $regs[1];
+ if (isset($this->namespaces[$regs[1]])) {
+ $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]];
+ } else if (isset($attrs['xmlns:'.$regs[1]])) {
+ $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]];
+ }
+ $this->message[$pos]['arrayType'] = $regs[2];
+ $this->message[$pos]['arraySize'] = $regs[3];
+ $this->message[$pos]['arrayCols'] = $regs[4];
+ }
+ // specifies nil value (or not)
+ } elseif ($key_localpart == 'nil'){
+ $this->message[$pos]['nil'] = ($value == 'true' || $value == '1');
+ // some other attribute
+ } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') {
+ $this->message[$pos]['xattrs']['!' . $key] = $value;
+ }
+
+ if ($key == 'xmlns') {
+ $this->default_namespace = $value;
+ }
+ // log id
+ if($key == 'id'){
+ $this->ids[$value] = $pos;
+ }
+ // root
+ if($key_localpart == 'root' && $value == 1){
+ $this->status = 'method';
+ $this->root_struct_name = $name;
+ $this->root_struct = $pos;
+ $this->debug("found root struct $this->root_struct_name, pos $pos");
+ }
+ // for doclit
+ $attstr .= " $key=\"$value\"";
+ }
+ // get namespace - must be done after namespace atts are processed
+ if(isset($prefix)){
+ $this->message[$pos]['namespace'] = $this->namespaces[$prefix];
+ $this->default_namespace = $this->namespaces[$prefix];
+ } else {
+ $this->message[$pos]['namespace'] = $this->default_namespace;
+ }
+ if($this->status == 'header'){
+ if ($this->root_header != $pos) {
+ $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
+ }
+ } elseif($this->root_struct_name != ''){
+ $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
+ }
+ }
+
+ /**
+ * end-element handler
+ *
+ * @param resource $parser XML parser object
+ * @param string $name element name
+ * @access private
+ */
+ function end_element($parser, $name) {
+ // position of current element is equal to the last value left in depth_array for my depth
+ $pos = $this->depth_array[$this->depth--];
+
+ // get element prefix
+ if(strpos($name,':')){
+ // get ns prefix
+ $prefix = substr($name,0,strpos($name,':'));
+ // get unqualified name
+ $name = substr(strstr($name,':'),1);
+ }
+
+ // build to native type
+ if(isset($this->body_position) && $pos > $this->body_position){
+ // deal w/ multirefs
+ if(isset($this->message[$pos]['attrs']['href'])){
+ // get id
+ $id = substr($this->message[$pos]['attrs']['href'],1);
+ // add placeholder to href array
+ $this->multirefs[$id][$pos] = 'placeholder';
+ // add set a reference to it as the result value
+ $this->message[$pos]['result'] =& $this->multirefs[$id][$pos];
+ // build complexType values
+ } elseif($this->message[$pos]['children'] != ''){
+ // if result has already been generated (struct/array)
+ if(!isset($this->message[$pos]['result'])){
+ $this->message[$pos]['result'] = $this->buildVal($pos);
+ }
+ // build complexType values of attributes and possibly simpleContent
+ } elseif (isset($this->message[$pos]['xattrs'])) {
+ if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) {
+ $this->message[$pos]['xattrs']['!'] = null;
+ } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') {
+ if (isset($this->message[$pos]['type'])) {
+ $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
+ } else {
+ $parent = $this->message[$pos]['parent'];
+ if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
+ $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
+ } else {
+ $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata'];
+ }
+ }
+ }
+ $this->message[$pos]['result'] = $this->message[$pos]['xattrs'];
+ // set value of simpleType (or nil complexType)
+ } else {
+ //$this->debug('adding data for scalar value '.$this->message[$pos]['name'].' of value '.$this->message[$pos]['cdata']);
+ if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) {
+ $this->message[$pos]['xattrs']['!'] = null;
+ } elseif (isset($this->message[$pos]['type'])) {
+ $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
+ } else {
+ $parent = $this->message[$pos]['parent'];
+ if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
+ $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
+ } else {
+ $this->message[$pos]['result'] = $this->message[$pos]['cdata'];
+ }
+ }
+
+ /* add value to parent's result, if parent is struct/array
+ $parent = $this->message[$pos]['parent'];
+ if($this->message[$parent]['type'] != 'map'){
+ if(strtolower($this->message[$parent]['type']) == 'array'){
+ $this->message[$parent]['result'][] = $this->message[$pos]['result'];
+ } else {
+ $this->message[$parent]['result'][$this->message[$pos]['name']] = $this->message[$pos]['result'];
+ }
+ }
+ */
+ }
+ }
+
+ // for doclit
+ if($this->status == 'header'){
+ if ($this->root_header != $pos) {
+ $this->responseHeaders .= "" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
+ }
+ } elseif($pos >= $this->root_struct){
+ $this->document .= "" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
+ }
+ // switch status
+ if($pos == $this->root_struct){
+ $this->status = 'body';
+ $this->root_struct_namespace = $this->message[$pos]['namespace'];
+ } elseif($name == 'Body'){
+ $this->status = 'envelope';
+ } elseif($name == 'Header'){
+ $this->status = 'envelope';
+ } elseif($name == 'Envelope'){
+ //
+ }
+ // set parent back to my parent
+ $this->parent = $this->message[$pos]['parent'];
+ }
+
+ /**
+ * element content handler
+ *
+ * @param resource $parser XML parser object
+ * @param string $data element content
+ * @access private
+ */
+ function character_data($parser, $data){
+ $pos = $this->depth_array[$this->depth];
+ if ($this->xml_encoding=='UTF-8'){
+ // TODO: add an option to disable this for folks who want
+ // raw UTF-8 that, e.g., might not map to iso-8859-1
+ // TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
+ if($this->decode_utf8){
+ $data = utf8_decode($data);
+ }
+ }
+ $this->message[$pos]['cdata'] .= $data;
+ // for doclit
+ if($this->status == 'header'){
+ $this->responseHeaders .= $data;
+ } else {
+ $this->document .= $data;
+ }
+ }
+
+ /**
+ * get the parsed message
+ *
+ * @return mixed
+ * @access public
+ */
+ function get_response(){
+ return $this->soapresponse;
+ }
+
+ /**
+ * get the parsed headers
+ *
+ * @return string XML or empty if no headers
+ * @access public
+ */
+ function getHeaders(){
+ return $this->responseHeaders;
+ }
+
+ /**
+ * decodes simple types into PHP variables
+ *
+ * @param string $value value to decode
+ * @param string $type XML type to decode
+ * @param string $typens XML type namespace to decode
+ * @return mixed PHP value
+ * @access private
+ */
+ function decodeSimple($value, $type, $typens) {
+ // TODO: use the namespace!
+ if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') {
+ return (string) $value;
+ }
+ if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') {
+ return (int) $value;
+ }
+ if ($type == 'float' || $type == 'double' || $type == 'decimal') {
+ return (double) $value;
+ }
+ if ($type == 'boolean') {
+ if (strtolower($value) == 'false' || strtolower($value) == 'f') {
+ return false;
+ }
+ return (boolean) $value;
+ }
+ if ($type == 'base64' || $type == 'base64Binary') {
+ $this->debug('Decode base64 value');
+ return base64_decode($value);
+ }
+ // obscure numeric types
+ if ($type == 'nonPositiveInteger' || $type == 'negativeInteger'
+ || $type == 'nonNegativeInteger' || $type == 'positiveInteger'
+ || $type == 'unsignedInt'
+ || $type == 'unsignedShort' || $type == 'unsignedByte') {
+ return (int) $value;
+ }
+ // bogus: parser treats array with no elements as a simple type
+ if ($type == 'array') {
+ return array();
+ }
+ // everything else
+ return (string) $value;
+ }
+
+ /**
+ * builds response structures for compound values (arrays/structs)
+ * and scalars
+ *
+ * @param integer $pos position in node tree
+ * @return mixed PHP value
+ * @access private
+ */
+ function buildVal($pos){
+ if(!isset($this->message[$pos]['type'])){
+ $this->message[$pos]['type'] = '';
+ }
+ $this->debug('in buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']);
+ // if there are children...
+ if($this->message[$pos]['children'] != ''){
+ $this->debug('in buildVal, there are children');
+ $children = explode('|',$this->message[$pos]['children']);
+ array_shift($children); // knock off empty
+ // md array
+ if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){
+ $r=0; // rowcount
+ $c=0; // colcount
+ foreach($children as $child_pos){
+ $this->debug("in buildVal, got an MD array element: $r, $c");
+ $params[$r][] = $this->message[$child_pos]['result'];
+ $c++;
+ if($c == $this->message[$pos]['arrayCols']){
+ $c = 0;
+ $r++;
+ }
+ }
+ // array
+ } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){
+ $this->debug('in buildVal, adding array '.$this->message[$pos]['name']);
+ foreach($children as $child_pos){
+ $params[] = &$this->message[$child_pos]['result'];
+ }
+ // apache Map type: java hashtable
+ } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){
+ $this->debug('in buildVal, Java Map '.$this->message[$pos]['name']);
+ foreach($children as $child_pos){
+ $kv = explode("|",$this->message[$child_pos]['children']);
+ $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result'];
+ }
+ // generic compound type
+ //} elseif($this->message[$pos]['type'] == 'SOAPStruct' || $this->message[$pos]['type'] == 'struct') {
+ } else {
+ // Apache Vector type: treat as an array
+ $this->debug('in buildVal, adding Java Vector '.$this->message[$pos]['name']);
+ if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') {
+ $notstruct = 1;
+ } else {
+ $notstruct = 0;
+ }
+ //
+ foreach($children as $child_pos){
+ if($notstruct){
+ $params[] = &$this->message[$child_pos]['result'];
+ } else {
+ if (isset($params[$this->message[$child_pos]['name']])) {
+ // de-serialize repeated element name into an array
+ if ((!is_array($params[$this->message[$child_pos]['name']])) || (!isset($params[$this->message[$child_pos]['name']][0]))) {
+ $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]);
+ }
+ $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result'];
+ } else {
+ $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result'];
+ }
+ }
+ }
+ }
+ if (isset($this->message[$pos]['xattrs'])) {
+ $this->debug('in buildVal, handling attributes');
+ foreach ($this->message[$pos]['xattrs'] as $n => $v) {
+ $params[$n] = $v;
+ }
+ }
+ // handle simpleContent
+ if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') {
+ $this->debug('in buildVal, handling simpleContent');
+ if (isset($this->message[$pos]['type'])) {
+ $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
+ } else {
+ $parent = $this->message[$pos]['parent'];
+ if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
+ $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
+ } else {
+ $params['!'] = $this->message[$pos]['cdata'];
+ }
+ }
+ }
+ return is_array($params) ? $params : array();
+ } else {
+ $this->debug('in buildVal, no children, building scalar');
+ $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : '';
+ if (isset($this->message[$pos]['type'])) {
+ return $this->decodeSimple($cdata, $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
+ }
+ $parent = $this->message[$pos]['parent'];
+ if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
+ return $this->decodeSimple($cdata, $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
+ }
+ return $this->message[$pos]['cdata'];
+ }
+ }
+}
+
+
+
+
?>
\ No newline at end of file
diff --git a/htdocs/includes/nusoap/lib/class.soap_server.php b/htdocs/includes/nusoap/lib/class.soap_server.php
index 88afe2059af..4033d325134 100644
--- a/htdocs/includes/nusoap/lib/class.soap_server.php
+++ b/htdocs/includes/nusoap/lib/class.soap_server.php
@@ -1,1038 +1,1038 @@
-
-* @version $Id$
-* @access public
-*/
-class soap_server extends nusoap_base {
- /**
- * HTTP headers of request
- * @var array
- * @access private
- */
- var $headers = array();
- /**
- * HTTP request
- * @var string
- * @access private
- */
- var $request = '';
- /**
- * SOAP headers from request (incomplete namespace resolution; special characters not escaped) (text)
- * @var string
- * @access public
- */
- var $requestHeaders = '';
- /**
- * SOAP body request portion (incomplete namespace resolution; special characters not escaped) (text)
- * @var string
- * @access public
- */
- var $document = '';
- /**
- * SOAP payload for request (text)
- * @var string
- * @access public
- */
- var $requestSOAP = '';
- /**
- * requested method namespace URI
- * @var string
- * @access private
- */
- var $methodURI = '';
- /**
- * name of method requested
- * @var string
- * @access private
- */
- var $methodname = '';
- /**
- * method parameters from request
- * @var array
- * @access private
- */
- var $methodparams = array();
- /**
- * SOAP Action from request
- * @var string
- * @access private
- */
- var $SOAPAction = '';
- /**
- * character set encoding of incoming (request) messages
- * @var string
- * @access public
- */
- var $xml_encoding = '';
- /**
- * toggles whether the parser decodes element content w/ utf8_decode()
- * @var boolean
- * @access public
- */
- var $decode_utf8 = true;
-
- /**
- * HTTP headers of response
- * @var array
- * @access public
- */
- var $outgoing_headers = array();
- /**
- * HTTP response
- * @var string
- * @access private
- */
- var $response = '';
- /**
- * SOAP headers for response (text)
- * @var string
- * @access public
- */
- var $responseHeaders = '';
- /**
- * SOAP payload for response (text)
- * @var string
- * @access private
- */
- var $responseSOAP = '';
- /**
- * method return value to place in response
- * @var mixed
- * @access private
- */
- var $methodreturn = false;
- /**
- * whether $methodreturn is a string of literal XML
- * @var boolean
- * @access public
- */
- var $methodreturnisliteralxml = false;
- /**
- * SOAP fault for response (or false)
- * @var mixed
- * @access private
- */
- var $fault = false;
- /**
- * text indication of result (for debugging)
- * @var string
- * @access private
- */
- var $result = 'successful';
-
- /**
- * assoc array of operations => opData; operations are added by the register()
- * method or by parsing an external WSDL definition
- * @var array
- * @access private
- */
- var $operations = array();
- /**
- * wsdl instance (if one)
- * @var mixed
- * @access private
- */
- var $wsdl = false;
- /**
- * URL for WSDL (if one)
- * @var mixed
- * @access private
- */
- var $externalWSDLURL = false;
- /**
- * whether to append debug to response as XML comment
- * @var boolean
- * @access public
- */
- var $debug_flag = false;
-
-
- /**
- * constructor
- * the optional parameter is a path to a WSDL file that you'd like to bind the server instance to.
- *
- * @param mixed $wsdl file path or URL (string), or wsdl instance (object)
- * @access public
- */
- function soap_server($wsdl=false){
- parent::nusoap_base();
- // turn on debugging?
- global $debug;
- global $HTTP_SERVER_VARS;
-
- if (isset($_SERVER)) {
- $this->debug("_SERVER is defined:");
- $this->appendDebug($this->varDump($_SERVER));
- } elseif (isset($HTTP_SERVER_VARS)) {
- $this->debug("HTTP_SERVER_VARS is defined:");
- $this->appendDebug($this->varDump($HTTP_SERVER_VARS));
- } else {
- $this->debug("Neither _SERVER nor HTTP_SERVER_VARS is defined.");
- }
-
- if (isset($debug)) {
- $this->debug("In soap_server, set debug_flag=$debug based on global flag");
- $this->debug_flag = $debug;
- } elseif (isset($_SERVER['QUERY_STRING'])) {
- $qs = explode('&', $_SERVER['QUERY_STRING']);
- foreach ($qs as $v) {
- if (substr($v, 0, 6) == 'debug=') {
- $this->debug("In soap_server, set debug_flag=" . substr($v, 6) . " based on query string #1");
- $this->debug_flag = substr($v, 6);
- }
- }
- } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
- $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']);
- foreach ($qs as $v) {
- if (substr($v, 0, 6) == 'debug=') {
- $this->debug("In soap_server, set debug_flag=" . substr($v, 6) . " based on query string #2");
- $this->debug_flag = substr($v, 6);
- }
- }
- }
-
- // wsdl
- if($wsdl){
- $this->debug("In soap_server, WSDL is specified");
- if (is_object($wsdl) && (get_class($wsdl) == 'wsdl')) {
- $this->wsdl = $wsdl;
- $this->externalWSDLURL = $this->wsdl->wsdl;
- $this->debug('Use existing wsdl instance from ' . $this->externalWSDLURL);
- } else {
- $this->debug('Create wsdl from ' . $wsdl);
- $this->wsdl = new wsdl($wsdl);
- $this->externalWSDLURL = $wsdl;
- }
- $this->appendDebug($this->wsdl->getDebug());
- $this->wsdl->clearDebug();
- if($err = $this->wsdl->getError()){
- die('WSDL ERROR: '.$err);
- }
- }
- }
-
- /**
- * processes request and returns response
- *
- * @param string $data usually is the value of $HTTP_RAW_POST_DATA
- * @access public
- */
- function service($data){
- global $HTTP_SERVER_VARS;
-
- if (isset($_SERVER['QUERY_STRING'])) {
- $qs = $_SERVER['QUERY_STRING'];
- } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
- $qs = $HTTP_SERVER_VARS['QUERY_STRING'];
- } else {
- $qs = '';
- }
- $this->debug("In service, query string=$qs");
-
- if (ereg('wsdl', $qs) ){
- $this->debug("In service, this is a request for WSDL");
- if($this->externalWSDLURL){
- if (strpos($this->externalWSDLURL,"://")!==false) { // assume URL
- header('Location: '.$this->externalWSDLURL);
- } else { // assume file
- header("Content-Type: text/xml\r\n");
- $fp = fopen($this->externalWSDLURL, 'r');
- fpassthru($fp);
- }
- } elseif ($this->wsdl) {
- header("Content-Type: text/xml; charset=ISO-8859-1\r\n");
- print $this->wsdl->serialize($this->debug_flag);
- if ($this->debug_flag) {
- $this->debug('wsdl:');
- $this->appendDebug($this->varDump($this->wsdl));
- print $this->getDebugAsXMLComment();
- }
- } else {
- header("Content-Type: text/html; charset=ISO-8859-1\r\n");
- print "This service does not provide WSDL";
- }
- } elseif ($data == '' && $this->wsdl) {
- $this->debug("In service, there is no data, so return Web description");
- print $this->wsdl->webDescription();
- } else {
- $this->debug("In service, invoke the request");
- $this->parse_request($data);
- if (! $this->fault) {
- $this->invoke_method();
- }
- if (! $this->fault) {
- $this->serialize_return();
- }
- $this->send_response();
- }
- }
-
- /**
- * parses HTTP request headers.
- *
- * The following fields are set by this function (when successful)
- *
- * headers
- * request
- * xml_encoding
- * SOAPAction
- *
- * @access private
- */
- function parse_http_headers() {
- global $HTTP_SERVER_VARS;
-
- $this->request = '';
- $this->SOAPAction = '';
- if(function_exists('getallheaders')){
- $this->debug("In parse_http_headers, use getallheaders");
- $headers = getallheaders();
- foreach($headers as $k=>$v){
- $k = strtolower($k);
- $this->headers[$k] = $v;
- $this->request .= "$k: $v\r\n";
- $this->debug("$k: $v");
- }
- // get SOAPAction header
- if(isset($this->headers['soapaction'])){
- $this->SOAPAction = str_replace('"','',$this->headers['soapaction']);
- }
- // get the character encoding of the incoming request
- if(isset($this->headers['content-type']) && strpos($this->headers['content-type'],'=')){
- $enc = str_replace('"','',substr(strstr($this->headers["content-type"],'='),1));
- if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
- // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1
- $this->xml_encoding = 'ISO-8859-1';
- }
- } elseif(isset($_SERVER) && is_array($_SERVER)){
- $this->debug("In parse_http_headers, use _SERVER");
- foreach ($_SERVER as $k => $v) {
- if (substr($k, 0, 5) == 'HTTP_') {
- $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5));
- } else {
- $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k);
- }
- if ($k == 'soapaction') {
- // get SOAPAction header
- $k = 'SOAPAction';
- $v = str_replace('"', '', $v);
- $v = str_replace('\\', '', $v);
- $this->SOAPAction = $v;
- } else if ($k == 'content-type') {
- // get the character encoding of the incoming request
- if (strpos($v, '=')) {
- $enc = substr(strstr($v, '='), 1);
- $enc = str_replace('"', '', $enc);
- $enc = str_replace('\\', '', $enc);
- if (eregi('^(ISO-8859-1|US-ASCII|UTF-8)$', $enc)) {
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
- // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1
- $this->xml_encoding = 'ISO-8859-1';
- }
- }
- $this->headers[$k] = $v;
- $this->request .= "$k: $v\r\n";
- $this->debug("$k: $v");
- }
- } elseif (is_array($HTTP_SERVER_VARS)) {
- $this->debug("In parse_http_headers, use HTTP_SERVER_VARS");
- foreach ($HTTP_SERVER_VARS as $k => $v) {
- if (substr($k, 0, 5) == 'HTTP_') {
- $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5));
- } else {
- $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k);
- }
- if ($k == 'soapaction') {
- // get SOAPAction header
- $k = 'SOAPAction';
- $v = str_replace('"', '', $v);
- $v = str_replace('\\', '', $v);
- $this->SOAPAction = $v;
- } else if ($k == 'content-type') {
- // get the character encoding of the incoming request
- if (strpos($v, '=')) {
- $enc = substr(strstr($v, '='), 1);
- $enc = str_replace('"', '', $enc);
- $enc = str_replace('\\', '', $enc);
- if (eregi('^(ISO-8859-1|US-ASCII|UTF-8)$', $enc)) {
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
- // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1
- $this->xml_encoding = 'ISO-8859-1';
- }
- }
- $this->headers[$k] = $v;
- $this->request .= "$k: $v\r\n";
- $this->debug("$k: $v");
- }
- } else {
- $this->debug("In parse_http_headers, HTTP headers not accessible");
- $this->setError("HTTP headers not accessible");
- }
- }
-
- /**
- * parses a request
- *
- * The following fields are set by this function (when successful)
- *
- * headers
- * request
- * xml_encoding
- * SOAPAction
- * request
- * requestSOAP
- * methodURI
- * methodname
- * methodparams
- * requestHeaders
- * document
- *
- * This sets the fault field on error
- *
- * @param string $data XML string
- * @access private
- */
- function parse_request($data='') {
- $this->debug('entering parse_request()');
- $this->parse_http_headers();
- $this->debug('got character encoding: '.$this->xml_encoding);
- // uncompress if necessary
- if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] != '') {
- $this->debug('got content encoding: ' . $this->headers['content-encoding']);
- if ($this->headers['content-encoding'] == 'deflate' || $this->headers['content-encoding'] == 'gzip') {
- // if decoding works, use it. else assume data wasn't gzencoded
- if (function_exists('gzuncompress')) {
- if ($this->headers['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) {
- $data = $degzdata;
- } elseif ($this->headers['content-encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))) {
- $data = $degzdata;
- } else {
- $this->fault('Client', 'Errors occurred when trying to decode the data');
- return;
- }
- } else {
- $this->fault('Client', 'This Server does not support compressed data');
- return;
- }
- }
- }
- $this->request .= "\r\n".$data;
- $data = $this->parseRequest($this->headers, $data);
- $this->requestSOAP = $data;
- $this->debug('leaving parse_request');
- }
-
- /**
- * invokes a PHP function for the requested SOAP method
- *
- * The following fields are set by this function (when successful)
- *
- * methodreturn
- *
- * Note that the PHP function that is called may also set the following
- * fields to affect the response sent to the client
- *
- * responseHeaders
- * outgoing_headers
- *
- * This sets the fault field on error
- *
- * @access private
- */
- function invoke_method() {
- $this->debug('in invoke_method, methodname=' . $this->methodname . ' methodURI=' . $this->methodURI . ' SOAPAction=' . $this->SOAPAction);
-
- if ($this->wsdl) {
- if ($this->opData = $this->wsdl->getOperationData($this->methodname)) {
- $this->debug('in invoke_method, found WSDL operation=' . $this->methodname);
- $this->appendDebug('opData=' . $this->varDump($this->opData));
- } elseif ($this->opData = $this->wsdl->getOperationDataForSoapAction($this->SOAPAction)) {
- // Note: hopefully this case will only be used for doc/lit, since rpc services should have wrapper element
- $this->debug('in invoke_method, found WSDL soapAction=' . $this->SOAPAction . ' for operation=' . $this->opData['name']);
- $this->appendDebug('opData=' . $this->varDump($this->opData));
- $this->methodname = $this->opData['name'];
- } else {
- $this->debug('in invoke_method, no WSDL for operation=' . $this->methodname);
- $this->fault('Client', "Operation '" . $this->methodname . "' is not defined in the WSDL for this service");
- return;
- }
- } else {
- $this->debug('in invoke_method, no WSDL to validate method');
- }
-
- // if a . is present in $this->methodname, we see if there is a class in scope,
- // which could be referred to. We will also distinguish between two deliminators,
- // to allow methods to be called a the class or an instance
- $class = '';
- $method = '';
- if (strpos($this->methodname, '..') > 0) {
- $delim = '..';
- } else if (strpos($this->methodname, '.') > 0) {
- $delim = '.';
- } else {
- $delim = '';
- }
-
- if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1 &&
- class_exists(substr($this->methodname, 0, strpos($this->methodname, $delim)))) {
- // get the class and method name
- $class = substr($this->methodname, 0, strpos($this->methodname, $delim));
- $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim));
- $this->debug("in invoke_method, class=$class method=$method delim=$delim");
- }
-
- // does method exist?
- if ($class == '') {
- if (!function_exists($this->methodname)) {
- $this->debug("in invoke_method, function '$this->methodname' not found!");
- $this->result = 'fault: method not found';
- $this->fault('Client',"method '$this->methodname' not defined in service");
- return;
- }
- } else {
- $method_to_compare = (substr(phpversion(), 0, 2) == '4.') ? strtolower($method) : $method;
- if (!in_array($method_to_compare, get_class_methods($class))) {
- $this->debug("in invoke_method, method '$this->methodname' not found in class '$class'!");
- $this->result = 'fault: method not found';
- $this->fault('Client',"method '$this->methodname' not defined in service");
- return;
- }
- }
-
- // evaluate message, getting back parameters
- // verify that request parameters match the method's signature
- if(! $this->verify_method($this->methodname,$this->methodparams)){
- // debug
- $this->debug('ERROR: request not verified against method signature');
- $this->result = 'fault: request failed validation against method signature';
- // return fault
- $this->fault('Client',"Operation '$this->methodname' not defined in service.");
- return;
- }
-
- // if there are parameters to pass
- $this->debug('in invoke_method, params:');
- $this->appendDebug($this->varDump($this->methodparams));
- $this->debug("in invoke_method, calling '$this->methodname'");
- if (!function_exists('call_user_func_array')) {
- if ($class == '') {
- $this->debug('in invoke_method, calling function using eval()');
- $funcCall = "\$this->methodreturn = $this->methodname(";
- } else {
- if ($delim == '..') {
- $this->debug('in invoke_method, calling class method using eval()');
- $funcCall = "\$this->methodreturn = ".$class."::".$method."(";
- } else {
- $this->debug('in invoke_method, calling instance method using eval()');
- // generate unique instance name
- $instname = "\$inst_".time();
- $funcCall = $instname." = new ".$class."(); ";
- $funcCall .= "\$this->methodreturn = ".$instname."->".$method."(";
- }
- }
- if ($this->methodparams) {
- foreach ($this->methodparams as $param) {
- if (is_array($param)) {
- $this->fault('Client', 'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available');
- return;
- }
- $funcCall .= "\"$param\",";
- }
- $funcCall = substr($funcCall, 0, -1);
- }
- $funcCall .= ');';
- $this->debug('in invoke_method, function call: '.$funcCall);
- @eval($funcCall);
- } else {
- if ($class == '') {
- $this->debug('in invoke_method, calling function using call_user_func_array()');
- $call_arg = "$this->methodname"; // straight assignment changes $this->methodname to lower case after call_user_func_array()
- } elseif ($delim == '..') {
- $this->debug('in invoke_method, calling class method using call_user_func_array()');
- $call_arg = array ($class, $method);
- } else {
- $this->debug('in invoke_method, calling instance method using call_user_func_array()');
- $instance = new $class ();
- $call_arg = array(&$instance, $method);
- }
- $this->methodreturn = call_user_func_array($call_arg, $this->methodparams);
- }
- $this->debug('in invoke_method, methodreturn:');
- $this->appendDebug($this->varDump($this->methodreturn));
- $this->debug("in invoke_method, called method $this->methodname, received $this->methodreturn of type ".gettype($this->methodreturn));
- }
-
- /**
- * serializes the return value from a PHP function into a full SOAP Envelope
- *
- * The following fields are set by this function (when successful)
- *
- * responseSOAP
- *
- * This sets the fault field on error
- *
- * @access private
- */
- function serialize_return() {
- $this->debug('Entering serialize_return methodname: ' . $this->methodname . ' methodURI: ' . $this->methodURI);
- // if fault
- if (isset($this->methodreturn) && (get_class($this->methodreturn) == 'soap_fault')) {
- $this->debug('got a fault object from method');
- $this->fault = $this->methodreturn;
- return;
- } elseif ($this->methodreturnisliteralxml) {
- $return_val = $this->methodreturn;
- // returned value(s)
- } else {
- $this->debug('got a(n) '.gettype($this->methodreturn).' from method');
- $this->debug('serializing return value');
- if($this->wsdl){
- // weak attempt at supporting multiple output params
- if(sizeof($this->opData['output']['parts']) > 1){
- $opParams = $this->methodreturn;
- } else {
- // TODO: is this really necessary?
- $opParams = array($this->methodreturn);
- }
- $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams);
- $this->appendDebug($this->wsdl->getDebug());
- $this->wsdl->clearDebug();
- if($errstr = $this->wsdl->getError()){
- $this->debug('got wsdl error: '.$errstr);
- $this->fault('Server', 'unable to serialize result');
- return;
- }
- } else {
- if (isset($this->methodreturn)) {
- $return_val = $this->serialize_val($this->methodreturn, 'return');
- } else {
- $return_val = '';
- $this->debug('in absence of WSDL, assume void return for backward compatibility');
- }
- }
- }
- $this->debug('return value:');
- $this->appendDebug($this->varDump($return_val));
-
- $this->debug('serializing response');
- if ($this->wsdl) {
- $this->debug('have WSDL for serialization: style is ' . $this->opData['style']);
- if ($this->opData['style'] == 'rpc') {
- $this->debug('style is rpc for serialization: use is ' . $this->opData['output']['use']);
- if ($this->opData['output']['use'] == 'literal') {
- $payload = '<'.$this->methodname.'Response xmlns="'.$this->methodURI.'">'.$return_val.''.$this->methodname."Response>";
- } else {
- $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>";
- }
- } else {
- $this->debug('style is not rpc for serialization: assume document');
- $payload = $return_val;
- }
- } else {
- $this->debug('do not have WSDL for serialization: assume rpc/encoded');
- $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>";
- }
- $this->result = 'successful';
- if($this->wsdl){
- //if($this->debug_flag){
- $this->appendDebug($this->wsdl->getDebug());
- // }
- if (isset($opData['output']['encodingStyle'])) {
- $encodingStyle = $opData['output']['encodingStyle'];
- } else {
- $encodingStyle = '';
- }
- // Added: In case we use a WSDL, return a serialized env. WITH the usedNamespaces.
- $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces,$this->opData['style'],$encodingStyle);
- } else {
- $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders);
- }
- $this->debug("Leaving serialize_return");
- }
-
- /**
- * sends an HTTP response
- *
- * The following fields are set by this function (when successful)
- *
- * outgoing_headers
- * response
- *
- * @access private
- */
- function send_response() {
- $this->debug('Enter send_response');
- if ($this->fault) {
- $payload = $this->fault->serialize();
- $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error";
- $this->outgoing_headers[] = "Status: 500 Internal Server Error";
- } else {
- $payload = $this->responseSOAP;
- // Some combinations of PHP+Web server allow the Status
- // to come through as a header. Since OK is the default
- // just do nothing.
- // $this->outgoing_headers[] = "HTTP/1.0 200 OK";
- // $this->outgoing_headers[] = "Status: 200 OK";
- }
- // add debug data if in debug mode
- if(isset($this->debug_flag) && $this->debug_flag){
- $payload .= $this->getDebugAsXMLComment();
- }
- $this->outgoing_headers[] = "Server: $this->title Server v$this->version";
- ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev);
- $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".$rev[1].")";
- // Let the Web server decide about this
- //$this->outgoing_headers[] = "Connection: Close\r\n";
- $payload = $this->getHTTPBody($payload);
- $type = $this->getHTTPContentType();
- $charset = $this->getHTTPContentTypeCharset();
- $this->outgoing_headers[] = "Content-Type: $type" . ($charset ? '; charset=' . $charset : '');
- //begin code to compress payload - by John
- // NOTE: there is no way to know whether the Web server will also compress
- // this data.
- if (strlen($payload) > 1024 && isset($this->headers) && isset($this->headers['accept-encoding'])) {
- if (strstr($this->headers['accept-encoding'], 'gzip')) {
- if (function_exists('gzencode')) {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "";
- }
- $this->outgoing_headers[] = "Content-Encoding: gzip";
- $payload = gzencode($payload);
- } else {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "";
- }
- }
- } elseif (strstr($this->headers['accept-encoding'], 'deflate')) {
- // Note: MSIE requires gzdeflate output (no Zlib header and checksum),
- // instead of gzcompress output,
- // which conflicts with HTTP 1.1 spec (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5)
- if (function_exists('gzdeflate')) {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "";
- }
- $this->outgoing_headers[] = "Content-Encoding: deflate";
- $payload = gzdeflate($payload);
- } else {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "";
- }
- }
- }
- }
- //end code
- $this->outgoing_headers[] = "Content-Length: ".strlen($payload);
- reset($this->outgoing_headers);
- foreach($this->outgoing_headers as $hdr){
- header($hdr, false);
- }
- print $payload;
- $this->response = join("\r\n",$this->outgoing_headers)."\r\n\r\n".$payload;
- }
-
- /**
- * takes the value that was created by parsing the request
- * and compares to the method's signature, if available.
- *
- * @param string $operation The operation to be invoked
- * @param array $request The array of parameter values
- * @return boolean Whether the operation was found
- * @access private
- */
- function verify_method($operation,$request){
- if(isset($this->wsdl) && is_object($this->wsdl)){
- if($this->wsdl->getOperationData($operation)){
- return true;
- }
- } elseif(isset($this->operations[$operation])){
- return true;
- }
- return false;
- }
-
- /**
- * processes SOAP message received from client
- *
- * @param array $headers The HTTP headers
- * @param string $data unprocessed request data from client
- * @return mixed value of the message, decoded into a PHP type
- * @access private
- */
- function parseRequest($headers, $data) {
- $this->debug('Entering parseRequest() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']);
- if (!strstr($headers['content-type'], 'text/xml')) {
- $this->setError('Request not of type text/xml');
- return false;
- }
- if (strpos($headers['content-type'], '=')) {
- $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1));
- $this->debug('Got response encoding: ' . $enc);
- if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
- // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1
- $this->xml_encoding = 'ISO-8859-1';
- }
- $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating soap_parser');
- // parse response, get soap parser obj
- $parser = new soap_parser($data,$this->xml_encoding,'',$this->decode_utf8);
- // parser debug
- $this->debug("parser debug: \n".$parser->getDebug());
- // if fault occurred during message parsing
- if($err = $parser->getError()){
- $this->result = 'fault: error in msg parsing: '.$err;
- $this->fault('Client',"error in msg parsing:\n".$err);
- // else successfully parsed request into soapval object
- } else {
- // get/set methodname
- $this->methodURI = $parser->root_struct_namespace;
- $this->methodname = $parser->root_struct_name;
- $this->debug('methodname: '.$this->methodname.' methodURI: '.$this->methodURI);
- $this->debug('calling parser->get_response()');
- $this->methodparams = $parser->get_response();
- // get SOAP headers
- $this->requestHeaders = $parser->getHeaders();
- // add document for doclit support
- $this->document = $parser->document;
- }
- }
-
- /**
- * gets the HTTP body for the current response.
- *
- * @param string $soapmsg The SOAP payload
- * @return string The HTTP body, which includes the SOAP payload
- * @access private
- */
- function getHTTPBody($soapmsg) {
- return $soapmsg;
- }
-
- /**
- * gets the HTTP content type for the current response.
- *
- * Note: getHTTPBody must be called before this.
- *
- * @return string the HTTP content type for the current response.
- * @access private
- */
- function getHTTPContentType() {
- return 'text/xml';
- }
-
- /**
- * gets the HTTP content type charset for the current response.
- * returns false for non-text content types.
- *
- * Note: getHTTPBody must be called before this.
- *
- * @return string the HTTP content type charset for the current response.
- * @access private
- */
- function getHTTPContentTypeCharset() {
- return $this->soap_defencoding;
- }
-
- /**
- * add a method to the dispatch map (this has been replaced by the register method)
- *
- * @param string $methodname
- * @param string $in array of input values
- * @param string $out array of output values
- * @access public
- * @deprecated
- */
- function add_to_map($methodname,$in,$out){
- $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out);
- }
-
- /**
- * register a service function with the server
- *
- * @param string $name the name of the PHP function, class.method or class..method
- * @param array $in assoc array of input values: key = param name, value = param type
- * @param array $out assoc array of output values: key = param name, value = param type
- * @param mixed $namespace the element namespace for the method or false
- * @param mixed $soapaction the soapaction for the method or false
- * @param mixed $style optional (rpc|document) or false Note: when 'document' is specified, parameter and return wrappers are created for you automatically
- * @param mixed $use optional (encoded|literal) or false
- * @param string $documentation optional Description to include in WSDL
- * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded)
- * @access public
- */
- function register($name,$in=array(),$out=array(),$namespace=false,$soapaction=false,$style=false,$use=false,$documentation='',$encodingStyle=''){
- global $HTTP_SERVER_VARS;
-
- if($this->externalWSDLURL){
- die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.');
- }
- if (! $name) {
- die('You must specify a name when you register an operation');
- }
- if (!is_array($in)) {
- die('You must provide an array for operation inputs');
- }
- if (!is_array($out)) {
- die('You must provide an array for operation outputs');
- }
- if(false == $namespace) {
- }
- if(false == $soapaction) {
- if (isset($_SERVER)) {
- $SERVER_NAME = $_SERVER['SERVER_NAME'];
- $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
- } elseif (isset($HTTP_SERVER_VARS)) {
- $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME'];
- $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME'];
- } else {
- $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available");
- }
- $soapaction = "http://$SERVER_NAME$SCRIPT_NAME/$name";
- }
- if(false == $style) {
- $style = "rpc";
- }
- if(false == $use) {
- $use = "encoded";
- }
- if ($use == 'encoded' && $encodingStyle = '') {
- $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
- }
-
- $this->operations[$name] = array(
- 'name' => $name,
- 'in' => $in,
- 'out' => $out,
- 'namespace' => $namespace,
- 'soapaction' => $soapaction,
- 'style' => $style);
- if($this->wsdl){
- $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use,$documentation,$encodingStyle);
- }
- return true;
- }
-
- /**
- * Specify a fault to be returned to the client.
- * This also acts as a flag to the server that a fault has occured.
- *
- * @param string $faultcode
- * @param string $faultstring
- * @param string $faultactor
- * @param string $faultdetail
- * @access public
- */
- function fault($faultcode,$faultstring,$faultactor='',$faultdetail=''){
- if ($faultdetail == '' && $this->debug_flag) {
- $faultdetail = $this->getDebug();
- }
- $this->fault = new soap_fault($faultcode,$faultactor,$faultstring,$faultdetail);
- $this->fault->soap_defencoding = $this->soap_defencoding;
- }
-
- /**
- * Sets up wsdl object.
- * Acts as a flag to enable internal WSDL generation
- *
- * @param string $serviceName, name of the service
- * @param mixed $namespace optional 'tns' service namespace or false
- * @param mixed $endpoint optional URL of service endpoint or false
- * @param string $style optional (rpc|document) WSDL style (also specified by operation)
- * @param string $transport optional SOAP transport
- * @param mixed $schemaTargetNamespace optional 'types' targetNamespace for service schema or false
- */
- function configureWSDL($serviceName,$namespace = false,$endpoint = false,$style='rpc', $transport = 'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace = false)
- {
- global $HTTP_SERVER_VARS;
-
- if (isset($_SERVER)) {
- $SERVER_NAME = $_SERVER['SERVER_NAME'];
- $SERVER_PORT = $_SERVER['SERVER_PORT'];
- $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
- $HTTPS = $_SERVER['HTTPS'];
- } elseif (isset($HTTP_SERVER_VARS)) {
- $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME'];
- $SERVER_PORT = $HTTP_SERVER_VARS['SERVER_PORT'];
- $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME'];
- $HTTPS = $HTTP_SERVER_VARS['HTTPS'];
- } else {
- $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available");
- }
- if ($SERVER_PORT == 80) {
- $SERVER_PORT = '';
- } else {
- $SERVER_PORT = ':' . $SERVER_PORT;
- }
- if(false == $namespace) {
- $namespace = "http://$SERVER_NAME/soap/$serviceName";
- }
-
- if(false == $endpoint) {
- if ($HTTPS == '1' || $HTTPS == 'on') {
- $SCHEME = 'https';
- } else {
- $SCHEME = 'http';
- }
- $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME";
- }
-
- if(false == $schemaTargetNamespace) {
- $schemaTargetNamespace = $namespace;
- }
-
- $this->wsdl = new wsdl;
- $this->wsdl->serviceName = $serviceName;
- $this->wsdl->endpoint = $endpoint;
- $this->wsdl->namespaces['tns'] = $namespace;
- $this->wsdl->namespaces['soap'] = 'http://schemas.xmlsoap.org/wsdl/soap/';
- $this->wsdl->namespaces['wsdl'] = 'http://schemas.xmlsoap.org/wsdl/';
- if ($schemaTargetNamespace != $namespace) {
- $this->wsdl->namespaces['types'] = $schemaTargetNamespace;
- }
- $this->wsdl->schemas[$schemaTargetNamespace][0] = new xmlschema('', '', $this->wsdl->namespaces);
- $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace;
- $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/soap/encoding/'][0] = array('location' => '', 'loaded' => true);
- $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/wsdl/'][0] = array('location' => '', 'loaded' => true);
- $this->wsdl->bindings[$serviceName.'Binding'] = array(
- 'name'=>$serviceName.'Binding',
- 'style'=>$style,
- 'transport'=>$transport,
- 'portType'=>$serviceName.'PortType');
- $this->wsdl->ports[$serviceName.'Port'] = array(
- 'binding'=>$serviceName.'Binding',
- 'location'=>$endpoint,
- 'bindingType'=>'http://schemas.xmlsoap.org/wsdl/soap/');
- }
-}
-
-
-
-
+
+* @version $Id$
+* @access public
+*/
+class soap_server extends nusoap_base {
+ /**
+ * HTTP headers of request
+ * @var array
+ * @access private
+ */
+ var $headers = array();
+ /**
+ * HTTP request
+ * @var string
+ * @access private
+ */
+ var $request = '';
+ /**
+ * SOAP headers from request (incomplete namespace resolution; special characters not escaped) (text)
+ * @var string
+ * @access public
+ */
+ var $requestHeaders = '';
+ /**
+ * SOAP body request portion (incomplete namespace resolution; special characters not escaped) (text)
+ * @var string
+ * @access public
+ */
+ var $document = '';
+ /**
+ * SOAP payload for request (text)
+ * @var string
+ * @access public
+ */
+ var $requestSOAP = '';
+ /**
+ * requested method namespace URI
+ * @var string
+ * @access private
+ */
+ var $methodURI = '';
+ /**
+ * name of method requested
+ * @var string
+ * @access private
+ */
+ var $methodname = '';
+ /**
+ * method parameters from request
+ * @var array
+ * @access private
+ */
+ var $methodparams = array();
+ /**
+ * SOAP Action from request
+ * @var string
+ * @access private
+ */
+ var $SOAPAction = '';
+ /**
+ * character set encoding of incoming (request) messages
+ * @var string
+ * @access public
+ */
+ var $xml_encoding = '';
+ /**
+ * toggles whether the parser decodes element content w/ utf8_decode()
+ * @var boolean
+ * @access public
+ */
+ var $decode_utf8 = true;
+
+ /**
+ * HTTP headers of response
+ * @var array
+ * @access public
+ */
+ var $outgoing_headers = array();
+ /**
+ * HTTP response
+ * @var string
+ * @access private
+ */
+ var $response = '';
+ /**
+ * SOAP headers for response (text)
+ * @var string
+ * @access public
+ */
+ var $responseHeaders = '';
+ /**
+ * SOAP payload for response (text)
+ * @var string
+ * @access private
+ */
+ var $responseSOAP = '';
+ /**
+ * method return value to place in response
+ * @var mixed
+ * @access private
+ */
+ var $methodreturn = false;
+ /**
+ * whether $methodreturn is a string of literal XML
+ * @var boolean
+ * @access public
+ */
+ var $methodreturnisliteralxml = false;
+ /**
+ * SOAP fault for response (or false)
+ * @var mixed
+ * @access private
+ */
+ var $fault = false;
+ /**
+ * text indication of result (for debugging)
+ * @var string
+ * @access private
+ */
+ var $result = 'successful';
+
+ /**
+ * assoc array of operations => opData; operations are added by the register()
+ * method or by parsing an external WSDL definition
+ * @var array
+ * @access private
+ */
+ var $operations = array();
+ /**
+ * wsdl instance (if one)
+ * @var mixed
+ * @access private
+ */
+ var $wsdl = false;
+ /**
+ * URL for WSDL (if one)
+ * @var mixed
+ * @access private
+ */
+ var $externalWSDLURL = false;
+ /**
+ * whether to append debug to response as XML comment
+ * @var boolean
+ * @access public
+ */
+ var $debug_flag = false;
+
+
+ /**
+ * constructor
+ * the optional parameter is a path to a WSDL file that you'd like to bind the server instance to.
+ *
+ * @param mixed $wsdl file path or URL (string), or wsdl instance (object)
+ * @access public
+ */
+ function soap_server($wsdl=false){
+ parent::nusoap_base();
+ // turn on debugging?
+ global $debug;
+ global $HTTP_SERVER_VARS;
+
+ if (isset($_SERVER)) {
+ $this->debug("_SERVER is defined:");
+ $this->appendDebug($this->varDump($_SERVER));
+ } elseif (isset($HTTP_SERVER_VARS)) {
+ $this->debug("HTTP_SERVER_VARS is defined:");
+ $this->appendDebug($this->varDump($HTTP_SERVER_VARS));
+ } else {
+ $this->debug("Neither _SERVER nor HTTP_SERVER_VARS is defined.");
+ }
+
+ if (isset($debug)) {
+ $this->debug("In soap_server, set debug_flag=$debug based on global flag");
+ $this->debug_flag = $debug;
+ } elseif (isset($_SERVER['QUERY_STRING'])) {
+ $qs = explode('&', $_SERVER['QUERY_STRING']);
+ foreach ($qs as $v) {
+ if (substr($v, 0, 6) == 'debug=') {
+ $this->debug("In soap_server, set debug_flag=" . substr($v, 6) . " based on query string #1");
+ $this->debug_flag = substr($v, 6);
+ }
+ }
+ } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
+ $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']);
+ foreach ($qs as $v) {
+ if (substr($v, 0, 6) == 'debug=') {
+ $this->debug("In soap_server, set debug_flag=" . substr($v, 6) . " based on query string #2");
+ $this->debug_flag = substr($v, 6);
+ }
+ }
+ }
+
+ // wsdl
+ if($wsdl){
+ $this->debug("In soap_server, WSDL is specified");
+ if (is_object($wsdl) && (get_class($wsdl) == 'wsdl')) {
+ $this->wsdl = $wsdl;
+ $this->externalWSDLURL = $this->wsdl->wsdl;
+ $this->debug('Use existing wsdl instance from ' . $this->externalWSDLURL);
+ } else {
+ $this->debug('Create wsdl from ' . $wsdl);
+ $this->wsdl = new wsdl($wsdl);
+ $this->externalWSDLURL = $wsdl;
+ }
+ $this->appendDebug($this->wsdl->getDebug());
+ $this->wsdl->clearDebug();
+ if($err = $this->wsdl->getError()){
+ die('WSDL ERROR: '.$err);
+ }
+ }
+ }
+
+ /**
+ * processes request and returns response
+ *
+ * @param string $data usually is the value of $HTTP_RAW_POST_DATA
+ * @access public
+ */
+ function service($data){
+ global $HTTP_SERVER_VARS;
+
+ if (isset($_SERVER['QUERY_STRING'])) {
+ $qs = $_SERVER['QUERY_STRING'];
+ } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
+ $qs = $HTTP_SERVER_VARS['QUERY_STRING'];
+ } else {
+ $qs = '';
+ }
+ $this->debug("In service, query string=$qs");
+
+ if (ereg('wsdl', $qs) ){
+ $this->debug("In service, this is a request for WSDL");
+ if($this->externalWSDLURL){
+ if (strpos($this->externalWSDLURL,"://")!==false) { // assume URL
+ header('Location: '.$this->externalWSDLURL);
+ } else { // assume file
+ header("Content-Type: text/xml\r\n");
+ $fp = fopen($this->externalWSDLURL, 'r');
+ fpassthru($fp);
+ }
+ } elseif ($this->wsdl) {
+ header("Content-Type: text/xml; charset=ISO-8859-1\r\n");
+ print $this->wsdl->serialize($this->debug_flag);
+ if ($this->debug_flag) {
+ $this->debug('wsdl:');
+ $this->appendDebug($this->varDump($this->wsdl));
+ print $this->getDebugAsXMLComment();
+ }
+ } else {
+ header("Content-Type: text/html; charset=ISO-8859-1\r\n");
+ print "This service does not provide WSDL";
+ }
+ } elseif ($data == '' && $this->wsdl) {
+ $this->debug("In service, there is no data, so return Web description");
+ print $this->wsdl->webDescription();
+ } else {
+ $this->debug("In service, invoke the request");
+ $this->parse_request($data);
+ if (! $this->fault) {
+ $this->invoke_method();
+ }
+ if (! $this->fault) {
+ $this->serialize_return();
+ }
+ $this->send_response();
+ }
+ }
+
+ /**
+ * parses HTTP request headers.
+ *
+ * The following fields are set by this function (when successful)
+ *
+ * headers
+ * request
+ * xml_encoding
+ * SOAPAction
+ *
+ * @access private
+ */
+ function parse_http_headers() {
+ global $HTTP_SERVER_VARS;
+
+ $this->request = '';
+ $this->SOAPAction = '';
+ if(function_exists('getallheaders')){
+ $this->debug("In parse_http_headers, use getallheaders");
+ $headers = getallheaders();
+ foreach($headers as $k=>$v){
+ $k = strtolower($k);
+ $this->headers[$k] = $v;
+ $this->request .= "$k: $v\r\n";
+ $this->debug("$k: $v");
+ }
+ // get SOAPAction header
+ if(isset($this->headers['soapaction'])){
+ $this->SOAPAction = str_replace('"','',$this->headers['soapaction']);
+ }
+ // get the character encoding of the incoming request
+ if(isset($this->headers['content-type']) && strpos($this->headers['content-type'],'=')){
+ $enc = str_replace('"','',substr(strstr($this->headers["content-type"],'='),1));
+ if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){
+ $this->xml_encoding = strtoupper($enc);
+ } else {
+ $this->xml_encoding = 'US-ASCII';
+ }
+ } else {
+ // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1
+ $this->xml_encoding = 'ISO-8859-1';
+ }
+ } elseif(isset($_SERVER) && is_array($_SERVER)){
+ $this->debug("In parse_http_headers, use _SERVER");
+ foreach ($_SERVER as $k => $v) {
+ if (substr($k, 0, 5) == 'HTTP_') {
+ $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5));
+ } else {
+ $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k);
+ }
+ if ($k == 'soapaction') {
+ // get SOAPAction header
+ $k = 'SOAPAction';
+ $v = str_replace('"', '', $v);
+ $v = str_replace('\\', '', $v);
+ $this->SOAPAction = $v;
+ } else if ($k == 'content-type') {
+ // get the character encoding of the incoming request
+ if (strpos($v, '=')) {
+ $enc = substr(strstr($v, '='), 1);
+ $enc = str_replace('"', '', $enc);
+ $enc = str_replace('\\', '', $enc);
+ if (eregi('^(ISO-8859-1|US-ASCII|UTF-8)$', $enc)) {
+ $this->xml_encoding = strtoupper($enc);
+ } else {
+ $this->xml_encoding = 'US-ASCII';
+ }
+ } else {
+ // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1
+ $this->xml_encoding = 'ISO-8859-1';
+ }
+ }
+ $this->headers[$k] = $v;
+ $this->request .= "$k: $v\r\n";
+ $this->debug("$k: $v");
+ }
+ } elseif (is_array($HTTP_SERVER_VARS)) {
+ $this->debug("In parse_http_headers, use HTTP_SERVER_VARS");
+ foreach ($HTTP_SERVER_VARS as $k => $v) {
+ if (substr($k, 0, 5) == 'HTTP_') {
+ $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5));
+ } else {
+ $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k);
+ }
+ if ($k == 'soapaction') {
+ // get SOAPAction header
+ $k = 'SOAPAction';
+ $v = str_replace('"', '', $v);
+ $v = str_replace('\\', '', $v);
+ $this->SOAPAction = $v;
+ } else if ($k == 'content-type') {
+ // get the character encoding of the incoming request
+ if (strpos($v, '=')) {
+ $enc = substr(strstr($v, '='), 1);
+ $enc = str_replace('"', '', $enc);
+ $enc = str_replace('\\', '', $enc);
+ if (eregi('^(ISO-8859-1|US-ASCII|UTF-8)$', $enc)) {
+ $this->xml_encoding = strtoupper($enc);
+ } else {
+ $this->xml_encoding = 'US-ASCII';
+ }
+ } else {
+ // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1
+ $this->xml_encoding = 'ISO-8859-1';
+ }
+ }
+ $this->headers[$k] = $v;
+ $this->request .= "$k: $v\r\n";
+ $this->debug("$k: $v");
+ }
+ } else {
+ $this->debug("In parse_http_headers, HTTP headers not accessible");
+ $this->setError("HTTP headers not accessible");
+ }
+ }
+
+ /**
+ * parses a request
+ *
+ * The following fields are set by this function (when successful)
+ *
+ * headers
+ * request
+ * xml_encoding
+ * SOAPAction
+ * request
+ * requestSOAP
+ * methodURI
+ * methodname
+ * methodparams
+ * requestHeaders
+ * document
+ *
+ * This sets the fault field on error
+ *
+ * @param string $data XML string
+ * @access private
+ */
+ function parse_request($data='') {
+ $this->debug('entering parse_request()');
+ $this->parse_http_headers();
+ $this->debug('got character encoding: '.$this->xml_encoding);
+ // uncompress if necessary
+ if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] != '') {
+ $this->debug('got content encoding: ' . $this->headers['content-encoding']);
+ if ($this->headers['content-encoding'] == 'deflate' || $this->headers['content-encoding'] == 'gzip') {
+ // if decoding works, use it. else assume data wasn't gzencoded
+ if (function_exists('gzuncompress')) {
+ if ($this->headers['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) {
+ $data = $degzdata;
+ } elseif ($this->headers['content-encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))) {
+ $data = $degzdata;
+ } else {
+ $this->fault('Client', 'Errors occurred when trying to decode the data');
+ return;
+ }
+ } else {
+ $this->fault('Client', 'This Server does not support compressed data');
+ return;
+ }
+ }
+ }
+ $this->request .= "\r\n".$data;
+ $data = $this->parseRequest($this->headers, $data);
+ $this->requestSOAP = $data;
+ $this->debug('leaving parse_request');
+ }
+
+ /**
+ * invokes a PHP function for the requested SOAP method
+ *
+ * The following fields are set by this function (when successful)
+ *
+ * methodreturn
+ *
+ * Note that the PHP function that is called may also set the following
+ * fields to affect the response sent to the client
+ *
+ * responseHeaders
+ * outgoing_headers
+ *
+ * This sets the fault field on error
+ *
+ * @access private
+ */
+ function invoke_method() {
+ $this->debug('in invoke_method, methodname=' . $this->methodname . ' methodURI=' . $this->methodURI . ' SOAPAction=' . $this->SOAPAction);
+
+ if ($this->wsdl) {
+ if ($this->opData = $this->wsdl->getOperationData($this->methodname)) {
+ $this->debug('in invoke_method, found WSDL operation=' . $this->methodname);
+ $this->appendDebug('opData=' . $this->varDump($this->opData));
+ } elseif ($this->opData = $this->wsdl->getOperationDataForSoapAction($this->SOAPAction)) {
+ // Note: hopefully this case will only be used for doc/lit, since rpc services should have wrapper element
+ $this->debug('in invoke_method, found WSDL soapAction=' . $this->SOAPAction . ' for operation=' . $this->opData['name']);
+ $this->appendDebug('opData=' . $this->varDump($this->opData));
+ $this->methodname = $this->opData['name'];
+ } else {
+ $this->debug('in invoke_method, no WSDL for operation=' . $this->methodname);
+ $this->fault('Client', "Operation '" . $this->methodname . "' is not defined in the WSDL for this service");
+ return;
+ }
+ } else {
+ $this->debug('in invoke_method, no WSDL to validate method');
+ }
+
+ // if a . is present in $this->methodname, we see if there is a class in scope,
+ // which could be referred to. We will also distinguish between two deliminators,
+ // to allow methods to be called a the class or an instance
+ $class = '';
+ $method = '';
+ if (strpos($this->methodname, '..') > 0) {
+ $delim = '..';
+ } else if (strpos($this->methodname, '.') > 0) {
+ $delim = '.';
+ } else {
+ $delim = '';
+ }
+
+ if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1 &&
+ class_exists(substr($this->methodname, 0, strpos($this->methodname, $delim)))) {
+ // get the class and method name
+ $class = substr($this->methodname, 0, strpos($this->methodname, $delim));
+ $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim));
+ $this->debug("in invoke_method, class=$class method=$method delim=$delim");
+ }
+
+ // does method exist?
+ if ($class == '') {
+ if (!function_exists($this->methodname)) {
+ $this->debug("in invoke_method, function '$this->methodname' not found!");
+ $this->result = 'fault: method not found';
+ $this->fault('Client',"method '$this->methodname' not defined in service");
+ return;
+ }
+ } else {
+ $method_to_compare = (substr(phpversion(), 0, 2) == '4.') ? strtolower($method) : $method;
+ if (!in_array($method_to_compare, get_class_methods($class))) {
+ $this->debug("in invoke_method, method '$this->methodname' not found in class '$class'!");
+ $this->result = 'fault: method not found';
+ $this->fault('Client',"method '$this->methodname' not defined in service");
+ return;
+ }
+ }
+
+ // evaluate message, getting back parameters
+ // verify that request parameters match the method's signature
+ if(! $this->verify_method($this->methodname,$this->methodparams)){
+ // debug
+ $this->debug('ERROR: request not verified against method signature');
+ $this->result = 'fault: request failed validation against method signature';
+ // return fault
+ $this->fault('Client',"Operation '$this->methodname' not defined in service.");
+ return;
+ }
+
+ // if there are parameters to pass
+ $this->debug('in invoke_method, params:');
+ $this->appendDebug($this->varDump($this->methodparams));
+ $this->debug("in invoke_method, calling '$this->methodname'");
+ if (!function_exists('call_user_func_array')) {
+ if ($class == '') {
+ $this->debug('in invoke_method, calling function using eval()');
+ $funcCall = "\$this->methodreturn = $this->methodname(";
+ } else {
+ if ($delim == '..') {
+ $this->debug('in invoke_method, calling class method using eval()');
+ $funcCall = "\$this->methodreturn = ".$class."::".$method."(";
+ } else {
+ $this->debug('in invoke_method, calling instance method using eval()');
+ // generate unique instance name
+ $instname = "\$inst_".time();
+ $funcCall = $instname." = new ".$class."(); ";
+ $funcCall .= "\$this->methodreturn = ".$instname."->".$method."(";
+ }
+ }
+ if ($this->methodparams) {
+ foreach ($this->methodparams as $param) {
+ if (is_array($param)) {
+ $this->fault('Client', 'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available');
+ return;
+ }
+ $funcCall .= "\"$param\",";
+ }
+ $funcCall = substr($funcCall, 0, -1);
+ }
+ $funcCall .= ');';
+ $this->debug('in invoke_method, function call: '.$funcCall);
+ @eval($funcCall);
+ } else {
+ if ($class == '') {
+ $this->debug('in invoke_method, calling function using call_user_func_array()');
+ $call_arg = "$this->methodname"; // straight assignment changes $this->methodname to lower case after call_user_func_array()
+ } elseif ($delim == '..') {
+ $this->debug('in invoke_method, calling class method using call_user_func_array()');
+ $call_arg = array ($class, $method);
+ } else {
+ $this->debug('in invoke_method, calling instance method using call_user_func_array()');
+ $instance = new $class ();
+ $call_arg = array(&$instance, $method);
+ }
+ $this->methodreturn = call_user_func_array($call_arg, $this->methodparams);
+ }
+ $this->debug('in invoke_method, methodreturn:');
+ $this->appendDebug($this->varDump($this->methodreturn));
+ $this->debug("in invoke_method, called method $this->methodname, received $this->methodreturn of type ".gettype($this->methodreturn));
+ }
+
+ /**
+ * serializes the return value from a PHP function into a full SOAP Envelope
+ *
+ * The following fields are set by this function (when successful)
+ *
+ * responseSOAP
+ *
+ * This sets the fault field on error
+ *
+ * @access private
+ */
+ function serialize_return() {
+ $this->debug('Entering serialize_return methodname: ' . $this->methodname . ' methodURI: ' . $this->methodURI);
+ // if fault
+ if (isset($this->methodreturn) && (get_class($this->methodreturn) == 'soap_fault')) {
+ $this->debug('got a fault object from method');
+ $this->fault = $this->methodreturn;
+ return;
+ } elseif ($this->methodreturnisliteralxml) {
+ $return_val = $this->methodreturn;
+ // returned value(s)
+ } else {
+ $this->debug('got a(n) '.gettype($this->methodreturn).' from method');
+ $this->debug('serializing return value');
+ if($this->wsdl){
+ // weak attempt at supporting multiple output params
+ if(sizeof($this->opData['output']['parts']) > 1){
+ $opParams = $this->methodreturn;
+ } else {
+ // TODO: is this really necessary?
+ $opParams = array($this->methodreturn);
+ }
+ $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams);
+ $this->appendDebug($this->wsdl->getDebug());
+ $this->wsdl->clearDebug();
+ if($errstr = $this->wsdl->getError()){
+ $this->debug('got wsdl error: '.$errstr);
+ $this->fault('Server', 'unable to serialize result');
+ return;
+ }
+ } else {
+ if (isset($this->methodreturn)) {
+ $return_val = $this->serialize_val($this->methodreturn, 'return');
+ } else {
+ $return_val = '';
+ $this->debug('in absence of WSDL, assume void return for backward compatibility');
+ }
+ }
+ }
+ $this->debug('return value:');
+ $this->appendDebug($this->varDump($return_val));
+
+ $this->debug('serializing response');
+ if ($this->wsdl) {
+ $this->debug('have WSDL for serialization: style is ' . $this->opData['style']);
+ if ($this->opData['style'] == 'rpc') {
+ $this->debug('style is rpc for serialization: use is ' . $this->opData['output']['use']);
+ if ($this->opData['output']['use'] == 'literal') {
+ $payload = '<'.$this->methodname.'Response xmlns="'.$this->methodURI.'">'.$return_val.''.$this->methodname."Response>";
+ } else {
+ $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>";
+ }
+ } else {
+ $this->debug('style is not rpc for serialization: assume document');
+ $payload = $return_val;
+ }
+ } else {
+ $this->debug('do not have WSDL for serialization: assume rpc/encoded');
+ $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>";
+ }
+ $this->result = 'successful';
+ if($this->wsdl){
+ //if($this->debug_flag){
+ $this->appendDebug($this->wsdl->getDebug());
+ // }
+ if (isset($opData['output']['encodingStyle'])) {
+ $encodingStyle = $opData['output']['encodingStyle'];
+ } else {
+ $encodingStyle = '';
+ }
+ // Added: In case we use a WSDL, return a serialized env. WITH the usedNamespaces.
+ $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces,$this->opData['style'],$encodingStyle);
+ } else {
+ $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders);
+ }
+ $this->debug("Leaving serialize_return");
+ }
+
+ /**
+ * sends an HTTP response
+ *
+ * The following fields are set by this function (when successful)
+ *
+ * outgoing_headers
+ * response
+ *
+ * @access private
+ */
+ function send_response() {
+ $this->debug('Enter send_response');
+ if ($this->fault) {
+ $payload = $this->fault->serialize();
+ $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error";
+ $this->outgoing_headers[] = "Status: 500 Internal Server Error";
+ } else {
+ $payload = $this->responseSOAP;
+ // Some combinations of PHP+Web server allow the Status
+ // to come through as a header. Since OK is the default
+ // just do nothing.
+ // $this->outgoing_headers[] = "HTTP/1.0 200 OK";
+ // $this->outgoing_headers[] = "Status: 200 OK";
+ }
+ // add debug data if in debug mode
+ if(isset($this->debug_flag) && $this->debug_flag){
+ $payload .= $this->getDebugAsXMLComment();
+ }
+ $this->outgoing_headers[] = "Server: $this->title Server v$this->version";
+ ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev);
+ $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".$rev[1].")";
+ // Let the Web server decide about this
+ //$this->outgoing_headers[] = "Connection: Close\r\n";
+ $payload = $this->getHTTPBody($payload);
+ $type = $this->getHTTPContentType();
+ $charset = $this->getHTTPContentTypeCharset();
+ $this->outgoing_headers[] = "Content-Type: $type" . ($charset ? '; charset=' . $charset : '');
+ //begin code to compress payload - by John
+ // NOTE: there is no way to know whether the Web server will also compress
+ // this data.
+ if (strlen($payload) > 1024 && isset($this->headers) && isset($this->headers['accept-encoding'])) {
+ if (strstr($this->headers['accept-encoding'], 'gzip')) {
+ if (function_exists('gzencode')) {
+ if (isset($this->debug_flag) && $this->debug_flag) {
+ $payload .= "";
+ }
+ $this->outgoing_headers[] = "Content-Encoding: gzip";
+ $payload = gzencode($payload);
+ } else {
+ if (isset($this->debug_flag) && $this->debug_flag) {
+ $payload .= "";
+ }
+ }
+ } elseif (strstr($this->headers['accept-encoding'], 'deflate')) {
+ // Note: MSIE requires gzdeflate output (no Zlib header and checksum),
+ // instead of gzcompress output,
+ // which conflicts with HTTP 1.1 spec (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5)
+ if (function_exists('gzdeflate')) {
+ if (isset($this->debug_flag) && $this->debug_flag) {
+ $payload .= "";
+ }
+ $this->outgoing_headers[] = "Content-Encoding: deflate";
+ $payload = gzdeflate($payload);
+ } else {
+ if (isset($this->debug_flag) && $this->debug_flag) {
+ $payload .= "";
+ }
+ }
+ }
+ }
+ //end code
+ $this->outgoing_headers[] = "Content-Length: ".strlen($payload);
+ reset($this->outgoing_headers);
+ foreach($this->outgoing_headers as $hdr){
+ header($hdr, false);
+ }
+ print $payload;
+ $this->response = join("\r\n",$this->outgoing_headers)."\r\n\r\n".$payload;
+ }
+
+ /**
+ * takes the value that was created by parsing the request
+ * and compares to the method's signature, if available.
+ *
+ * @param string $operation The operation to be invoked
+ * @param array $request The array of parameter values
+ * @return boolean Whether the operation was found
+ * @access private
+ */
+ function verify_method($operation,$request){
+ if(isset($this->wsdl) && is_object($this->wsdl)){
+ if($this->wsdl->getOperationData($operation)){
+ return true;
+ }
+ } elseif(isset($this->operations[$operation])){
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * processes SOAP message received from client
+ *
+ * @param array $headers The HTTP headers
+ * @param string $data unprocessed request data from client
+ * @return mixed value of the message, decoded into a PHP type
+ * @access private
+ */
+ function parseRequest($headers, $data) {
+ $this->debug('Entering parseRequest() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']);
+ if (!strstr($headers['content-type'], 'text/xml')) {
+ $this->setError('Request not of type text/xml');
+ return false;
+ }
+ if (strpos($headers['content-type'], '=')) {
+ $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1));
+ $this->debug('Got response encoding: ' . $enc);
+ if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){
+ $this->xml_encoding = strtoupper($enc);
+ } else {
+ $this->xml_encoding = 'US-ASCII';
+ }
+ } else {
+ // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1
+ $this->xml_encoding = 'ISO-8859-1';
+ }
+ $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating soap_parser');
+ // parse response, get soap parser obj
+ $parser = new soap_parser($data,$this->xml_encoding,'',$this->decode_utf8);
+ // parser debug
+ $this->debug("parser debug: \n".$parser->getDebug());
+ // if fault occurred during message parsing
+ if($err = $parser->getError()){
+ $this->result = 'fault: error in msg parsing: '.$err;
+ $this->fault('Client',"error in msg parsing:\n".$err);
+ // else successfully parsed request into soapval object
+ } else {
+ // get/set methodname
+ $this->methodURI = $parser->root_struct_namespace;
+ $this->methodname = $parser->root_struct_name;
+ $this->debug('methodname: '.$this->methodname.' methodURI: '.$this->methodURI);
+ $this->debug('calling parser->get_response()');
+ $this->methodparams = $parser->get_response();
+ // get SOAP headers
+ $this->requestHeaders = $parser->getHeaders();
+ // add document for doclit support
+ $this->document = $parser->document;
+ }
+ }
+
+ /**
+ * gets the HTTP body for the current response.
+ *
+ * @param string $soapmsg The SOAP payload
+ * @return string The HTTP body, which includes the SOAP payload
+ * @access private
+ */
+ function getHTTPBody($soapmsg) {
+ return $soapmsg;
+ }
+
+ /**
+ * gets the HTTP content type for the current response.
+ *
+ * Note: getHTTPBody must be called before this.
+ *
+ * @return string the HTTP content type for the current response.
+ * @access private
+ */
+ function getHTTPContentType() {
+ return 'text/xml';
+ }
+
+ /**
+ * gets the HTTP content type charset for the current response.
+ * returns false for non-text content types.
+ *
+ * Note: getHTTPBody must be called before this.
+ *
+ * @return string the HTTP content type charset for the current response.
+ * @access private
+ */
+ function getHTTPContentTypeCharset() {
+ return $this->soap_defencoding;
+ }
+
+ /**
+ * add a method to the dispatch map (this has been replaced by the register method)
+ *
+ * @param string $methodname
+ * @param string $in array of input values
+ * @param string $out array of output values
+ * @access public
+ * @deprecated
+ */
+ function add_to_map($methodname,$in,$out){
+ $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out);
+ }
+
+ /**
+ * register a service function with the server
+ *
+ * @param string $name the name of the PHP function, class.method or class..method
+ * @param array $in assoc array of input values: key = param name, value = param type
+ * @param array $out assoc array of output values: key = param name, value = param type
+ * @param mixed $namespace the element namespace for the method or false
+ * @param mixed $soapaction the soapaction for the method or false
+ * @param mixed $style optional (rpc|document) or false Note: when 'document' is specified, parameter and return wrappers are created for you automatically
+ * @param mixed $use optional (encoded|literal) or false
+ * @param string $documentation optional Description to include in WSDL
+ * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded)
+ * @access public
+ */
+ function register($name,$in=array(),$out=array(),$namespace=false,$soapaction=false,$style=false,$use=false,$documentation='',$encodingStyle=''){
+ global $HTTP_SERVER_VARS;
+
+ if($this->externalWSDLURL){
+ die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.');
+ }
+ if (! $name) {
+ die('You must specify a name when you register an operation');
+ }
+ if (!is_array($in)) {
+ die('You must provide an array for operation inputs');
+ }
+ if (!is_array($out)) {
+ die('You must provide an array for operation outputs');
+ }
+ if(false == $namespace) {
+ }
+ if(false == $soapaction) {
+ if (isset($_SERVER)) {
+ $SERVER_NAME = $_SERVER['SERVER_NAME'];
+ $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
+ } elseif (isset($HTTP_SERVER_VARS)) {
+ $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME'];
+ $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME'];
+ } else {
+ $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available");
+ }
+ $soapaction = "http://$SERVER_NAME$SCRIPT_NAME/$name";
+ }
+ if(false == $style) {
+ $style = "rpc";
+ }
+ if(false == $use) {
+ $use = "encoded";
+ }
+ if ($use == 'encoded' && $encodingStyle = '') {
+ $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
+ }
+
+ $this->operations[$name] = array(
+ 'name' => $name,
+ 'in' => $in,
+ 'out' => $out,
+ 'namespace' => $namespace,
+ 'soapaction' => $soapaction,
+ 'style' => $style);
+ if($this->wsdl){
+ $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use,$documentation,$encodingStyle);
+ }
+ return true;
+ }
+
+ /**
+ * Specify a fault to be returned to the client.
+ * This also acts as a flag to the server that a fault has occured.
+ *
+ * @param string $faultcode
+ * @param string $faultstring
+ * @param string $faultactor
+ * @param string $faultdetail
+ * @access public
+ */
+ function fault($faultcode,$faultstring,$faultactor='',$faultdetail=''){
+ if ($faultdetail == '' && $this->debug_flag) {
+ $faultdetail = $this->getDebug();
+ }
+ $this->fault = new soap_fault($faultcode,$faultactor,$faultstring,$faultdetail);
+ $this->fault->soap_defencoding = $this->soap_defencoding;
+ }
+
+ /**
+ * Sets up wsdl object.
+ * Acts as a flag to enable internal WSDL generation
+ *
+ * @param string $serviceName, name of the service
+ * @param mixed $namespace optional 'tns' service namespace or false
+ * @param mixed $endpoint optional URL of service endpoint or false
+ * @param string $style optional (rpc|document) WSDL style (also specified by operation)
+ * @param string $transport optional SOAP transport
+ * @param mixed $schemaTargetNamespace optional 'types' targetNamespace for service schema or false
+ */
+ function configureWSDL($serviceName,$namespace = false,$endpoint = false,$style='rpc', $transport = 'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace = false)
+ {
+ global $HTTP_SERVER_VARS;
+
+ if (isset($_SERVER)) {
+ $SERVER_NAME = $_SERVER['SERVER_NAME'];
+ $SERVER_PORT = $_SERVER['SERVER_PORT'];
+ $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
+ $HTTPS = $_SERVER['HTTPS'];
+ } elseif (isset($HTTP_SERVER_VARS)) {
+ $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME'];
+ $SERVER_PORT = $HTTP_SERVER_VARS['SERVER_PORT'];
+ $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME'];
+ $HTTPS = $HTTP_SERVER_VARS['HTTPS'];
+ } else {
+ $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available");
+ }
+ if ($SERVER_PORT == 80) {
+ $SERVER_PORT = '';
+ } else {
+ $SERVER_PORT = ':' . $SERVER_PORT;
+ }
+ if(false == $namespace) {
+ $namespace = "http://$SERVER_NAME/soap/$serviceName";
+ }
+
+ if(false == $endpoint) {
+ if ($HTTPS == '1' || $HTTPS == 'on') {
+ $SCHEME = 'https';
+ } else {
+ $SCHEME = 'http';
+ }
+ $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME";
+ }
+
+ if(false == $schemaTargetNamespace) {
+ $schemaTargetNamespace = $namespace;
+ }
+
+ $this->wsdl = new wsdl;
+ $this->wsdl->serviceName = $serviceName;
+ $this->wsdl->endpoint = $endpoint;
+ $this->wsdl->namespaces['tns'] = $namespace;
+ $this->wsdl->namespaces['soap'] = 'http://schemas.xmlsoap.org/wsdl/soap/';
+ $this->wsdl->namespaces['wsdl'] = 'http://schemas.xmlsoap.org/wsdl/';
+ if ($schemaTargetNamespace != $namespace) {
+ $this->wsdl->namespaces['types'] = $schemaTargetNamespace;
+ }
+ $this->wsdl->schemas[$schemaTargetNamespace][0] = new xmlschema('', '', $this->wsdl->namespaces);
+ $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace;
+ $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/soap/encoding/'][0] = array('location' => '', 'loaded' => true);
+ $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/wsdl/'][0] = array('location' => '', 'loaded' => true);
+ $this->wsdl->bindings[$serviceName.'Binding'] = array(
+ 'name'=>$serviceName.'Binding',
+ 'style'=>$style,
+ 'transport'=>$transport,
+ 'portType'=>$serviceName.'PortType');
+ $this->wsdl->ports[$serviceName.'Port'] = array(
+ 'binding'=>$serviceName.'Binding',
+ 'location'=>$endpoint,
+ 'bindingType'=>'http://schemas.xmlsoap.org/wsdl/soap/');
+ }
+}
+
+
+
+
?>
\ No newline at end of file
diff --git a/htdocs/includes/nusoap/lib/class.soap_transport_http.php b/htdocs/includes/nusoap/lib/class.soap_transport_http.php
index 71bd0678207..078850080ea 100644
--- a/htdocs/includes/nusoap/lib/class.soap_transport_http.php
+++ b/htdocs/includes/nusoap/lib/class.soap_transport_http.php
@@ -1,1038 +1,1038 @@
-
-* @version $Id$
-* @access public
-*/
-class soap_transport_http extends nusoap_base {
-
- var $url = '';
- var $uri = '';
- var $digest_uri = '';
- var $scheme = '';
- var $host = '';
- var $port = '';
- var $path = '';
- var $request_method = 'POST';
- var $protocol_version = '1.0';
- var $encoding = '';
- var $outgoing_headers = array();
- var $incoming_headers = array();
- var $incoming_cookies = array();
- var $outgoing_payload = '';
- var $incoming_payload = '';
- var $useSOAPAction = true;
- var $persistentConnection = false;
- var $ch = false; // cURL handle
- var $username = '';
- var $password = '';
- var $authtype = '';
- var $digestRequest = array();
- var $certRequest = array(); // keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional)
- // cainfofile: certificate authority file, e.g. '$pathToPemFiles/rootca.pem'
- // sslcertfile: SSL certificate file, e.g. '$pathToPemFiles/mycert.pem'
- // sslkeyfile: SSL key file, e.g. '$pathToPemFiles/mykey.pem'
- // passphrase: SSL key password/passphrase
- // verifypeer: default is 1
- // verifyhost: default is 1
-
- /**
- * constructor
- */
- function soap_transport_http($url){
- parent::nusoap_base();
- $this->setURL($url);
- ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev);
- $this->outgoing_headers['User-Agent'] = $this->title.'/'.$this->version.' ('.$rev[1].')';
- $this->debug('set User-Agent: ' . $this->outgoing_headers['User-Agent']);
- }
-
- function setURL($url) {
- $this->url = $url;
-
- $u = parse_url($url);
- foreach($u as $k => $v){
- $this->debug("$k = $v");
- $this->$k = $v;
- }
-
- // add any GET params to path
- if(isset($u['query']) && $u['query'] != ''){
- $this->path .= '?' . $u['query'];
- }
-
- // set default port
- if(!isset($u['port'])){
- if($u['scheme'] == 'https'){
- $this->port = 443;
- } else {
- $this->port = 80;
- }
- }
-
- $this->uri = $this->path;
- $this->digest_uri = $this->uri;
-
- // build headers
- if (!isset($u['port'])) {
- $this->outgoing_headers['Host'] = $this->host;
- } else {
- $this->outgoing_headers['Host'] = $this->host.':'.$this->port;
- }
- $this->debug('set Host: ' . $this->outgoing_headers['Host']);
-
- if (isset($u['user']) && $u['user'] != '') {
- $this->setCredentials(urldecode($u['user']), isset($u['pass']) ? urldecode($u['pass']) : '');
- }
- }
-
- function connect($connection_timeout=0,$response_timeout=30){
- // For PHP 4.3 with OpenSSL, change https scheme to ssl, then treat like
- // "regular" socket.
- // TODO: disabled for now because OpenSSL must be *compiled* in (not just
- // loaded), and until PHP5 stream_get_wrappers is not available.
-// if ($this->scheme == 'https') {
-// if (version_compare(phpversion(), '4.3.0') >= 0) {
-// if (extension_loaded('openssl')) {
-// $this->scheme = 'ssl';
-// $this->debug('Using SSL over OpenSSL');
-// }
-// }
-// }
- $this->debug("connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port");
- if ($this->scheme == 'http' || $this->scheme == 'ssl') {
- // use persistent connection
- if($this->persistentConnection && isset($this->fp) && is_resource($this->fp)){
- if (!feof($this->fp)) {
- $this->debug('Re-use persistent connection');
- return true;
- }
- fclose($this->fp);
- $this->debug('Closed persistent connection at EOF');
- }
-
- // munge host if using OpenSSL
- if ($this->scheme == 'ssl') {
- $host = 'ssl://' . $this->host;
- } else {
- $host = $this->host;
- }
- $this->debug('calling fsockopen with host ' . $host . ' connection_timeout ' . $connection_timeout);
-
- // open socket
- if($connection_timeout > 0){
- $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str, $connection_timeout);
- } else {
- $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str);
- }
-
- // test pointer
- if(!$this->fp) {
- $msg = 'Couldn\'t open socket connection to server ' . $this->url;
- if ($this->errno) {
- $msg .= ', Error ('.$this->errno.'): '.$this->error_str;
- } else {
- $msg .= ' prior to connect(). This is often a problem looking up the host name.';
- }
- $this->debug($msg);
- $this->setError($msg);
- return false;
- }
-
- // set response timeout
- $this->debug('set response timeout to ' . $response_timeout);
- socket_set_timeout( $this->fp, $response_timeout);
-
- $this->debug('socket connected');
- return true;
- } else if ($this->scheme == 'https') {
- if (!extension_loaded('curl')) {
- $this->setError('CURL Extension, or OpenSSL extension w/ PHP version >= 4.3 is required for HTTPS');
- return false;
- }
- $this->debug('connect using https');
- // init CURL
- $this->ch = curl_init();
- // set url
- $hostURL = ($this->port != '') ? "https://$this->host:$this->port" : "https://$this->host";
- // add path
- $hostURL .= $this->path;
- curl_setopt($this->ch, CURLOPT_URL, $hostURL);
- // follow location headers (re-directs)
- curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 1);
- // ask for headers in the response output
- curl_setopt($this->ch, CURLOPT_HEADER, 1);
- // ask for the response output as the return value
- curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);
- // encode
- // We manage this ourselves through headers and encoding
-// if(function_exists('gzuncompress')){
-// curl_setopt($this->ch, CURLOPT_ENCODING, 'deflate');
-// }
- // persistent connection
- if ($this->persistentConnection) {
- // The way we send data, we cannot use persistent connections, since
- // there will be some "junk" at the end of our request.
- //curl_setopt($this->ch, CURL_HTTP_VERSION_1_1, true);
- $this->persistentConnection = false;
- $this->outgoing_headers['Connection'] = 'close';
- $this->debug('set Connection: ' . $this->outgoing_headers['Connection']);
- }
- // set timeout
- if ($connection_timeout != 0) {
- curl_setopt($this->ch, CURLOPT_TIMEOUT, $connection_timeout);
- }
- // TODO: cURL has added a connection timeout separate from the response timeout
- //if ($connection_timeout != 0) {
- // curl_setopt($this->ch, CURLOPT_CONNECTIONTIMEOUT, $connection_timeout);
- //}
- //if ($response_timeout != 0) {
- // curl_setopt($this->ch, CURLOPT_TIMEOUT, $response_timeout);
- //}
-
- // recent versions of cURL turn on peer/host checking by default,
- // while PHP binaries are not compiled with a default location for the
- // CA cert bundle, so disable peer/host checking.
-//curl_setopt($this->ch, CURLOPT_CAINFO, 'f:\php-4.3.2-win32\extensions\curl-ca-bundle.crt');
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
-
- // support client certificates (thanks Tobias Boes, Doug Anarino, Eryan Ariobowo)
- if ($this->authtype == 'certificate') {
- if (isset($this->certRequest['cainfofile'])) {
- curl_setopt($this->ch, CURLOPT_CAINFO, $this->certRequest['cainfofile']);
- }
- if (isset($this->certRequest['verifypeer'])) {
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, $this->certRequest['verifypeer']);
- } else {
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 1);
- }
- if (isset($this->certRequest['verifyhost'])) {
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, $this->certRequest['verifyhost']);
- } else {
- curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 1);
- }
- if (isset($this->certRequest['sslcertfile'])) {
- curl_setopt($this->ch, CURLOPT_SSLCERT, $this->certRequest['sslcertfile']);
- }
- if (isset($this->certRequest['sslkeyfile'])) {
- curl_setopt($this->ch, CURLOPT_SSLKEY, $this->certRequest['sslkeyfile']);
- }
- if (isset($this->certRequest['passphrase'])) {
- curl_setopt($this->ch, CURLOPT_SSLKEYPASSWD , $this->certRequest['passphrase']);
- }
- }
- $this->debug('cURL connection set up');
- return true;
- } else {
- $this->setError('Unknown scheme ' . $this->scheme);
- $this->debug('Unknown scheme ' . $this->scheme);
- return false;
- }
- }
-
- /**
- * send the SOAP message via HTTP
- *
- * @param string $data message data
- * @param integer $timeout set connection timeout in seconds
- * @param integer $response_timeout set response timeout in seconds
- * @param array $cookies cookies to send
- * @return string data
- * @access public
- */
- function send($data, $timeout=0, $response_timeout=30, $cookies=NULL) {
-
- $this->debug('entered send() with data of length: '.strlen($data));
-
- $this->tryagain = true;
- $tries = 0;
- while ($this->tryagain) {
- $this->tryagain = false;
- if ($tries++ < 2) {
- // make connnection
- if (!$this->connect($timeout, $response_timeout)){
- return false;
- }
-
- // send request
- if (!$this->sendRequest($data, $cookies)){
- return false;
- }
-
- // get response
- $respdata = $this->getResponse();
- } else {
- $this->setError('Too many tries to get an OK response');
- }
- }
- $this->debug('end of send()');
- return $respdata;
- }
-
-
- /**
- * send the SOAP message via HTTPS 1.0 using CURL
- *
- * @param string $msg message data
- * @param integer $timeout set connection timeout in seconds
- * @param integer $response_timeout set response timeout in seconds
- * @param array $cookies cookies to send
- * @return string data
- * @access public
- */
- function sendHTTPS($data, $timeout=0, $response_timeout=30, $cookies) {
- return $this->send($data, $timeout, $response_timeout, $cookies);
- }
-
- /**
- * if authenticating, set user credentials here
- *
- * @param string $username
- * @param string $password
- * @param string $authtype (basic, digest, certificate)
- * @param array $digestRequest (keys must be nonce, nc, realm, qop)
- * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs)
- * @access public
- */
- function setCredentials($username, $password, $authtype = 'basic', $digestRequest = array(), $certRequest = array()) {
- $this->debug("Set credentials for authtype $authtype");
- // cf. RFC 2617
- if ($authtype == 'basic') {
- $this->outgoing_headers['Authorization'] = 'Basic '.base64_encode(str_replace(':','',$username).':'.$password);
- } elseif ($authtype == 'digest') {
- if (isset($digestRequest['nonce'])) {
- $digestRequest['nc'] = isset($digestRequest['nc']) ? $digestRequest['nc']++ : 1;
-
- // calculate the Digest hashes (calculate code based on digest implementation found at: http://www.rassoc.com/gregr/weblog/stories/2002/07/09/webServicesSecurityHttpDigestAuthenticationWithoutActiveDirectory.html)
-
- // A1 = unq(username-value) ":" unq(realm-value) ":" passwd
- $A1 = $username. ':' . (isset($digestRequest['realm']) ? $digestRequest['realm'] : '') . ':' . $password;
-
- // H(A1) = MD5(A1)
- $HA1 = md5($A1);
-
- // A2 = Method ":" digest-uri-value
- $A2 = 'POST:' . $this->digest_uri;
-
- // H(A2)
- $HA2 = md5($A2);
-
- // KD(secret, data) = H(concat(secret, ":", data))
- // if qop == auth:
- // request-digest = <"> < KD ( H(A1), unq(nonce-value)
- // ":" nc-value
- // ":" unq(cnonce-value)
- // ":" unq(qop-value)
- // ":" H(A2)
- // ) <">
- // if qop is missing,
- // request-digest = <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <">
-
- $unhashedDigest = '';
- $nonce = isset($digestRequest['nonce']) ? $digestRequest['nonce'] : '';
- $cnonce = $nonce;
- if ($digestRequest['qop'] != '') {
- $unhashedDigest = $HA1 . ':' . $nonce . ':' . sprintf("%08d", $digestRequest['nc']) . ':' . $cnonce . ':' . $digestRequest['qop'] . ':' . $HA2;
- } else {
- $unhashedDigest = $HA1 . ':' . $nonce . ':' . $HA2;
- }
-
- $hashedDigest = md5($unhashedDigest);
-
- $this->outgoing_headers['Authorization'] = 'Digest username="' . $username . '", realm="' . $digestRequest['realm'] . '", nonce="' . $nonce . '", uri="' . $this->digest_uri . '", cnonce="' . $cnonce . '", nc=' . sprintf("%08x", $digestRequest['nc']) . ', qop="' . $digestRequest['qop'] . '", response="' . $hashedDigest . '"';
- }
- } elseif ($authtype == 'certificate') {
- $this->certRequest = $certRequest;
- }
- $this->username = $username;
- $this->password = $password;
- $this->authtype = $authtype;
- $this->digestRequest = $digestRequest;
-
- if (isset($this->outgoing_headers['Authorization'])) {
- $this->debug('set Authorization: ' . substr($this->outgoing_headers['Authorization'], 0, 12) . '...');
- } else {
- $this->debug('Authorization header not set');
- }
- }
-
- /**
- * set the soapaction value
- *
- * @param string $soapaction
- * @access public
- */
- function setSOAPAction($soapaction) {
- $this->outgoing_headers['SOAPAction'] = '"' . $soapaction . '"';
- $this->debug('set SOAPAction: ' . $this->outgoing_headers['SOAPAction']);
- }
-
- /**
- * use http encoding
- *
- * @param string $enc encoding style. supported values: gzip, deflate, or both
- * @access public
- */
- function setEncoding($enc='gzip, deflate') {
- if (function_exists('gzdeflate')) {
- $this->protocol_version = '1.1';
- $this->outgoing_headers['Accept-Encoding'] = $enc;
- $this->debug('set Accept-Encoding: ' . $this->outgoing_headers['Accept-Encoding']);
- if (!isset($this->outgoing_headers['Connection'])) {
- $this->outgoing_headers['Connection'] = 'close';
- $this->persistentConnection = false;
- $this->debug('set Connection: ' . $this->outgoing_headers['Connection']);
- }
- set_magic_quotes_runtime(0);
- // deprecated
- $this->encoding = $enc;
- }
- }
-
- /**
- * set proxy info here
- *
- * @param string $proxyhost
- * @param string $proxyport
- * @param string $proxyusername
- * @param string $proxypassword
- * @access public
- */
- function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') {
- $this->uri = $this->url;
- $this->host = $proxyhost;
- $this->port = $proxyport;
- if ($proxyusername != '' && $proxypassword != '') {
- $this->outgoing_headers['Proxy-Authorization'] = ' Basic '.base64_encode($proxyusername.':'.$proxypassword);
- $this->debug('set Proxy-Authorization: ' . $this->outgoing_headers['Proxy-Authorization']);
- }
- }
-
- /**
- * decode a string that is encoded w/ "chunked' transfer encoding
- * as defined in RFC2068 19.4.6
- *
- * @param string $buffer
- * @param string $lb
- * @returns string
- * @access public
- * @deprecated
- */
- function decodeChunked($buffer, $lb){
- // length := 0
- $length = 0;
- $new = '';
-
- // read chunk-size, chunk-extension (if any) and CRLF
- // get the position of the linebreak
- $chunkend = strpos($buffer, $lb);
- if ($chunkend == FALSE) {
- $this->debug('no linebreak found in decodeChunked');
- return $new;
- }
- $temp = substr($buffer,0,$chunkend);
- $chunk_size = hexdec( trim($temp) );
- $chunkstart = $chunkend + strlen($lb);
- // while (chunk-size > 0) {
- while ($chunk_size > 0) {
- $this->debug("chunkstart: $chunkstart chunk_size: $chunk_size");
- $chunkend = strpos( $buffer, $lb, $chunkstart + $chunk_size);
-
- // Just in case we got a broken connection
- if ($chunkend == FALSE) {
- $chunk = substr($buffer,$chunkstart);
- // append chunk-data to entity-body
- $new .= $chunk;
- $length += strlen($chunk);
- break;
- }
-
- // read chunk-data and CRLF
- $chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart);
- // append chunk-data to entity-body
- $new .= $chunk;
- // length := length + chunk-size
- $length += strlen($chunk);
- // read chunk-size and CRLF
- $chunkstart = $chunkend + strlen($lb);
-
- $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb);
- if ($chunkend == FALSE) {
- break; //Just in case we got a broken connection
- }
- $temp = substr($buffer,$chunkstart,$chunkend-$chunkstart);
- $chunk_size = hexdec( trim($temp) );
- $chunkstart = $chunkend;
- }
- return $new;
- }
-
- /*
- * Writes payload, including HTTP headers, to $this->outgoing_payload.
- */
- function buildPayload($data, $cookie_str = '') {
- // add content-length header
- $this->outgoing_headers['Content-Length'] = strlen($data);
- $this->debug('set Content-Length: ' . $this->outgoing_headers['Content-Length']);
-
- // start building outgoing payload:
- $req = "$this->request_method $this->uri HTTP/$this->protocol_version";
- $this->debug("HTTP request: $req");
- $this->outgoing_payload = "$req\r\n";
-
- // loop thru headers, serializing
- foreach($this->outgoing_headers as $k => $v){
- $hdr = $k.': '.$v;
- $this->debug("HTTP header: $hdr");
- $this->outgoing_payload .= "$hdr\r\n";
- }
-
- // add any cookies
- if ($cookie_str != '') {
- $hdr = 'Cookie: '.$cookie_str;
- $this->debug("HTTP header: $hdr");
- $this->outgoing_payload .= "$hdr\r\n";
- }
-
- // header/body separator
- $this->outgoing_payload .= "\r\n";
-
- // add data
- $this->outgoing_payload .= $data;
- }
-
- function sendRequest($data, $cookies = NULL) {
- // build cookie string
- $cookie_str = $this->getCookiesForRequest($cookies, (($this->scheme == 'ssl') || ($this->scheme == 'https')));
-
- // build payload
- $this->buildPayload($data, $cookie_str);
-
- if ($this->scheme == 'http' || $this->scheme == 'ssl') {
- // send payload
- if(!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) {
- $this->setError('couldn\'t write message data to socket');
- $this->debug('couldn\'t write message data to socket');
- return false;
- }
- $this->debug('wrote data to socket, length = ' . strlen($this->outgoing_payload));
- return true;
- } else if ($this->scheme == 'https') {
- // set payload
- // TODO: cURL does say this should only be the verb, and in fact it
- // turns out that the URI and HTTP version are appended to this, which
- // some servers refuse to work with
- //curl_setopt($this->ch, CURLOPT_CUSTOMREQUEST, $this->outgoing_payload);
- foreach($this->outgoing_headers as $k => $v){
- $curl_headers[] = "$k: $v";
- }
- if ($cookie_str != '') {
- $curl_headers[] = 'Cookie: ' . $cookie_str;
- }
- curl_setopt($this->ch, CURLOPT_HTTPHEADER, $curl_headers);
- if ($this->request_method == "POST") {
- curl_setopt($this->ch, CURLOPT_POST, 1);
- curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);
- } else {
- }
- $this->debug('set cURL payload');
- return true;
- }
- }
-
- function getResponse(){
- $this->incoming_payload = '';
-
- if ($this->scheme == 'http' || $this->scheme == 'ssl') {
- // loop until headers have been retrieved
- $data = '';
- while (!isset($lb)){
-
- // We might EOF during header read.
- if(feof($this->fp)) {
- $this->incoming_payload = $data;
- $this->debug('found no headers before EOF after length ' . strlen($data));
- $this->debug("received before EOF:\n" . $data);
- $this->setError('server failed to send headers');
- return false;
- }
-
- $tmp = fgets($this->fp, 256);
- $tmplen = strlen($tmp);
- $this->debug("read line of $tmplen bytes: " . trim($tmp));
-
- if ($tmplen == 0) {
- $this->incoming_payload = $data;
- $this->debug('socket read of headers timed out after length ' . strlen($data));
- $this->debug("read before timeout: " . $data);
- $this->setError('socket read of headers timed out');
- return false;
- }
-
- $data .= $tmp;
- $pos = strpos($data,"\r\n\r\n");
- if($pos > 1){
- $lb = "\r\n";
- } else {
- $pos = strpos($data,"\n\n");
- if($pos > 1){
- $lb = "\n";
- }
- }
- // remove 100 header
- if(isset($lb) && ereg('^HTTP/1.1 100',$data)){
- unset($lb);
- $data = '';
- }//
- }
- // store header data
- $this->incoming_payload .= $data;
- $this->debug('found end of headers after length ' . strlen($data));
- // process headers
- $header_data = trim(substr($data,0,$pos));
- $header_array = explode($lb,$header_data);
- $this->incoming_headers = array();
- $this->incoming_cookies = array();
- foreach($header_array as $header_line){
- $arr = explode(':',$header_line, 2);
- if(count($arr) > 1){
- $header_name = strtolower(trim($arr[0]));
- $this->incoming_headers[$header_name] = trim($arr[1]);
- if ($header_name == 'set-cookie') {
- // TODO: allow multiple cookies from parseCookie
- $cookie = $this->parseCookie(trim($arr[1]));
- if ($cookie) {
- $this->incoming_cookies[] = $cookie;
- $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']);
- } else {
- $this->debug('did not find cookie in ' . trim($arr[1]));
- }
- }
- } else if (isset($header_name)) {
- // append continuation line to previous header
- $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line;
- }
- }
-
- // loop until msg has been received
- if (isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked') {
- $content_length = 2147483647; // ignore any content-length header
- $chunked = true;
- $this->debug("want to read chunked content");
- } elseif (isset($this->incoming_headers['content-length'])) {
- $content_length = $this->incoming_headers['content-length'];
- $chunked = false;
- $this->debug("want to read content of length $content_length");
- } else {
- $content_length = 2147483647;
- $chunked = false;
- $this->debug("want to read content to EOF");
- }
- $data = '';
- do {
- if ($chunked) {
- $tmp = fgets($this->fp, 256);
- $tmplen = strlen($tmp);
- $this->debug("read chunk line of $tmplen bytes");
- if ($tmplen == 0) {
- $this->incoming_payload = $data;
- $this->debug('socket read of chunk length timed out after length ' . strlen($data));
- $this->debug("read before timeout:\n" . $data);
- $this->setError('socket read of chunk length timed out');
- return false;
- }
- $content_length = hexdec(trim($tmp));
- $this->debug("chunk length $content_length");
- }
- $strlen = 0;
- while (($strlen < $content_length) && (!feof($this->fp))) {
- $readlen = min(8192, $content_length - $strlen);
- $tmp = fread($this->fp, $readlen);
- $tmplen = strlen($tmp);
- $this->debug("read buffer of $tmplen bytes");
- if (($tmplen == 0) && (!feof($this->fp))) {
- $this->incoming_payload = $data;
- $this->debug('socket read of body timed out after length ' . strlen($data));
- $this->debug("read before timeout:\n" . $data);
- $this->setError('socket read of body timed out');
- return false;
- }
- $strlen += $tmplen;
- $data .= $tmp;
- }
- if ($chunked && ($content_length > 0)) {
- $tmp = fgets($this->fp, 256);
- $tmplen = strlen($tmp);
- $this->debug("read chunk terminator of $tmplen bytes");
- if ($tmplen == 0) {
- $this->incoming_payload = $data;
- $this->debug('socket read of chunk terminator timed out after length ' . strlen($data));
- $this->debug("read before timeout:\n" . $data);
- $this->setError('socket read of chunk terminator timed out');
- return false;
- }
- }
- } while ($chunked && ($content_length > 0) && (!feof($this->fp)));
- if (feof($this->fp)) {
- $this->debug('read to EOF');
- }
- $this->debug('read body of length ' . strlen($data));
- $this->incoming_payload .= $data;
- $this->debug('received a total of '.strlen($this->incoming_payload).' bytes of data from server');
-
- // close filepointer
- if(
- (isset($this->incoming_headers['connection']) && strtolower($this->incoming_headers['connection']) == 'close') ||
- (! $this->persistentConnection) || feof($this->fp)){
- fclose($this->fp);
- $this->fp = false;
- $this->debug('closed socket');
- }
-
- // connection was closed unexpectedly
- if($this->incoming_payload == ''){
- $this->setError('no response from server');
- return false;
- }
-
- // decode transfer-encoding
-// if(isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked'){
-// if(!$data = $this->decodeChunked($data, $lb)){
-// $this->setError('Decoding of chunked data failed');
-// return false;
-// }
- //print "
';
+ return $b;
+ }
+
+ /**
+ * serialize the parsed wsdl
+ *
+ * @param mixed $debug whether to put debug=1 in endpoint URL
+ * @return string serialization of WSDL
+ * @access public
+ */
+ function serialize($debug = 0)
+ {
+ $xml = '';
+ $xml .= "\nnamespaces as $k => $v) {
+ $xml .= " xmlns:$k=\"$v\"";
+ }
+ // 10.9.02 - add poulter fix for wsdl and tns declarations
+ if (isset($this->namespaces['wsdl'])) {
+ $xml .= " xmlns=\"" . $this->namespaces['wsdl'] . "\"";
+ }
+ if (isset($this->namespaces['tns'])) {
+ $xml .= " targetNamespace=\"" . $this->namespaces['tns'] . "\"";
+ }
+ $xml .= '>';
+ // imports
+ if (sizeof($this->import) > 0) {
+ foreach($this->import as $ns => $list) {
+ foreach ($list as $ii) {
+ if ($ii['location'] != '') {
+ $xml .= '';
+ } else {
+ $xml .= '';
+ }
+ }
+ }
+ }
+ // types
+ if (count($this->schemas)>=1) {
+ $xml .= "\n";
+ foreach ($this->schemas as $ns => $list) {
+ foreach ($list as $xs) {
+ $xml .= $xs->serializeSchema();
+ }
+ }
+ $xml .= '';
+ }
+ // messages
+ if (count($this->messages) >= 1) {
+ foreach($this->messages as $msgName => $msgParts) {
+ $xml .= "\n';
+ if(is_array($msgParts)){
+ foreach($msgParts as $partName => $partType) {
+ // print 'serializing '.$partType.', sv: '.$this->XMLSchemaVersion.' ';
+ if (strpos($partType, ':')) {
+ $typePrefix = $this->getPrefixFromNamespace($this->getPrefix($partType));
+ } elseif (isset($this->typemap[$this->namespaces['xsd']][$partType])) {
+ // print 'checking typemap: '.$this->XMLSchemaVersion.' ';
+ $typePrefix = 'xsd';
+ } else {
+ foreach($this->typemap as $ns => $types) {
+ if (isset($types[$partType])) {
+ $typePrefix = $this->getPrefixFromNamespace($ns);
+ }
+ }
+ if (!isset($typePrefix)) {
+ die("$partType has no namespace!");
+ }
+ }
+ $ns = $this->getNamespaceFromPrefix($typePrefix);
+ $typeDef = $this->getTypeDef($this->getLocalPart($partType), $ns);
+ if ($typeDef['typeClass'] == 'element') {
+ $elementortype = 'element';
+ } else {
+ $elementortype = 'type';
+ }
+ $xml .= 'getLocalPart($partType) . '" />';
+ }
+ }
+ $xml .= '';
+ }
+ }
+ // bindings & porttypes
+ if (count($this->bindings) >= 1) {
+ $binding_xml = '';
+ $portType_xml = '';
+ foreach($this->bindings as $bindingName => $attrs) {
+ $binding_xml .= "\n';
+ $binding_xml .= '';
+ $portType_xml .= "\n';
+ foreach($attrs['operations'] as $opName => $opParts) {
+ $binding_xml .= '';
+ $binding_xml .= '';
+ if (isset($opParts['input']['encodingStyle']) && $opParts['input']['encodingStyle'] != '') {
+ $enc_style = ' encodingStyle="' . $opParts['input']['encodingStyle'] . '"';
+ } else {
+ $enc_style = '';
+ }
+ $binding_xml .= '';
+ if (isset($opParts['output']['encodingStyle']) && $opParts['output']['encodingStyle'] != '') {
+ $enc_style = ' encodingStyle="' . $opParts['output']['encodingStyle'] . '"';
+ } else {
+ $enc_style = '';
+ }
+ $binding_xml .= '';
+ $binding_xml .= '';
+ $portType_xml .= '';
+ }
+ $portType_xml .= '';
+ $portType_xml .= '';
+ $portType_xml .= '';
+ }
+ $portType_xml .= '';
+ $binding_xml .= '';
+ }
+ $xml .= $portType_xml . $binding_xml;
+ }
+ // services
+ $xml .= "\nserviceName . '">';
+ if (count($this->ports) >= 1) {
+ foreach($this->ports as $pName => $attrs) {
+ $xml .= '';
+ $xml .= '';
+ $xml .= '';
+ }
+ }
+ $xml .= '';
+ return $xml . "\n";
+ }
+
+ /**
+ * serialize PHP values according to a WSDL message definition
+ *
+ * TODO
+ * - multi-ref serialization
+ * - validate PHP values against type definitions, return errors if invalid
+ *
+ * @param string $operation operation name
+ * @param string $direction (input|output)
+ * @param mixed $parameters parameter value(s)
+ * @return mixed parameters serialized as XML or false on error (e.g. operation not found)
+ * @access public
+ */
+ function serializeRPCParameters($operation, $direction, $parameters)
+ {
+ $this->debug("in serializeRPCParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion");
+ $this->appendDebug('parameters=' . $this->varDump($parameters));
+
+ if ($direction != 'input' && $direction != 'output') {
+ $this->debug('The value of the \$direction argument needs to be either "input" or "output"');
+ $this->setError('The value of the \$direction argument needs to be either "input" or "output"');
+ return false;
+ }
+ if (!$opData = $this->getOperationData($operation)) {
+ $this->debug('Unable to retrieve WSDL data for operation: ' . $operation);
+ $this->setError('Unable to retrieve WSDL data for operation: ' . $operation);
+ return false;
+ }
+ $this->debug('opData:');
+ $this->appendDebug($this->varDump($opData));
+
+ // Get encoding style for output and set to current
+ $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
+ if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) {
+ $encodingStyle = $opData['output']['encodingStyle'];
+ $enc_style = $encodingStyle;
+ }
+
+ // set input params
+ $xml = '';
+ if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) {
+
+ $use = $opData[$direction]['use'];
+ $this->debug('have ' . count($opData[$direction]['parts']) . ' part(s) to serialize');
+ if (is_array($parameters)) {
+ $parametersArrayType = $this->isArraySimpleOrStruct($parameters);
+ $this->debug('have ' . count($parameters) . ' parameter(s) provided as ' . $parametersArrayType . ' to serialize');
+ foreach($opData[$direction]['parts'] as $name => $type) {
+ $this->debug('serializing part "'.$name.'" of type "'.$type.'"');
+ // Track encoding style
+ if (isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) {
+ $encodingStyle = $opData[$direction]['encodingStyle'];
+ $enc_style = $encodingStyle;
+ } else {
+ $enc_style = false;
+ }
+ // NOTE: add error handling here
+ // if serializeType returns false, then catch global error and fault
+ if ($parametersArrayType == 'arraySimple') {
+ $p = array_shift($parameters);
+ $this->debug('calling serializeType w/indexed param');
+ $xml .= $this->serializeType($name, $type, $p, $use, $enc_style);
+ } elseif (isset($parameters[$name])) {
+ $this->debug('calling serializeType w/named param');
+ $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style);
+ } else {
+ // TODO: only send nillable
+ $this->debug('calling serializeType w/null param');
+ $xml .= $this->serializeType($name, $type, null, $use, $enc_style);
+ }
+ }
+ } else {
+ $this->debug('no parameters passed.');
+ }
+ }
+ $this->debug("serializeRPCParameters returning: $xml");
+ return $xml;
+ }
+
+ /**
+ * serialize a PHP value according to a WSDL message definition
+ *
+ * TODO
+ * - multi-ref serialization
+ * - validate PHP values against type definitions, return errors if invalid
+ *
+ * @param string $ type name
+ * @param mixed $ param value
+ * @return mixed new param or false if initial value didn't validate
+ * @access public
+ * @deprecated
+ */
+ function serializeParameters($operation, $direction, $parameters)
+ {
+ $this->debug("in serializeParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion");
+ $this->appendDebug('parameters=' . $this->varDump($parameters));
+
+ if ($direction != 'input' && $direction != 'output') {
+ $this->debug('The value of the \$direction argument needs to be either "input" or "output"');
+ $this->setError('The value of the \$direction argument needs to be either "input" or "output"');
+ return false;
+ }
+ if (!$opData = $this->getOperationData($operation)) {
+ $this->debug('Unable to retrieve WSDL data for operation: ' . $operation);
+ $this->setError('Unable to retrieve WSDL data for operation: ' . $operation);
+ return false;
+ }
+ $this->debug('opData:');
+ $this->appendDebug($this->varDump($opData));
+
+ // Get encoding style for output and set to current
+ $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
+ if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) {
+ $encodingStyle = $opData['output']['encodingStyle'];
+ $enc_style = $encodingStyle;
+ }
+
+ // set input params
+ $xml = '';
+ if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) {
+
+ $use = $opData[$direction]['use'];
+ $this->debug("use=$use");
+ $this->debug('got ' . count($opData[$direction]['parts']) . ' part(s)');
+ if (is_array($parameters)) {
+ $parametersArrayType = $this->isArraySimpleOrStruct($parameters);
+ $this->debug('have ' . $parametersArrayType . ' parameters');
+ foreach($opData[$direction]['parts'] as $name => $type) {
+ $this->debug('serializing part "'.$name.'" of type "'.$type.'"');
+ // Track encoding style
+ if(isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) {
+ $encodingStyle = $opData[$direction]['encodingStyle'];
+ $enc_style = $encodingStyle;
+ } else {
+ $enc_style = false;
+ }
+ // NOTE: add error handling here
+ // if serializeType returns false, then catch global error and fault
+ if ($parametersArrayType == 'arraySimple') {
+ $p = array_shift($parameters);
+ $this->debug('calling serializeType w/indexed param');
+ $xml .= $this->serializeType($name, $type, $p, $use, $enc_style);
+ } elseif (isset($parameters[$name])) {
+ $this->debug('calling serializeType w/named param');
+ $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style);
+ } else {
+ // TODO: only send nillable
+ $this->debug('calling serializeType w/null param');
+ $xml .= $this->serializeType($name, $type, null, $use, $enc_style);
+ }
+ }
+ } else {
+ $this->debug('no parameters passed.');
+ }
+ }
+ $this->debug("serializeParameters returning: $xml");
+ return $xml;
+ }
+
+ /**
+ * serializes a PHP value according a given type definition
+ *
+ * @param string $name name of value (part or element)
+ * @param string $type XML schema type of value (type or element)
+ * @param mixed $value a native PHP value (parameter value)
+ * @param string $use use for part (encoded|literal)
+ * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style)
+ * @param boolean $unqualified a kludge for what should be XML namespace form handling
+ * @return string value serialized as an XML string
+ * @access private
+ */
+ function serializeType($name, $type, $value, $use='encoded', $encodingStyle=false, $unqualified=false)
+ {
+ $this->debug("in serializeType: name=$name, type=$type, use=$use, encodingStyle=$encodingStyle, unqualified=" . ($unqualified ? "unqualified" : "qualified"));
+ $this->appendDebug("value=" . $this->varDump($value));
+ if($use == 'encoded' && $encodingStyle) {
+ $encodingStyle = ' SOAP-ENV:encodingStyle="' . $encodingStyle . '"';
+ }
+
+ // if a soapval has been supplied, let its type override the WSDL
+ if (is_object($value) && get_class($value) == 'soapval') {
+ if ($value->type_ns) {
+ $type = $value->type_ns . ':' . $value->type;
+ $forceType = true;
+ $this->debug("in serializeType: soapval overrides type to $type");
+ } elseif ($value->type) {
+ $type = $value->type;
+ $forceType = true;
+ $this->debug("in serializeType: soapval overrides type to $type");
+ } else {
+ $forceType = false;
+ $this->debug("in serializeType: soapval does not override type");
+ }
+ $attrs = $value->attributes;
+ $value = $value->value;
+ $this->debug("in serializeType: soapval overrides value to $value");
+ if ($attrs) {
+ if (!is_array($value)) {
+ $value['!'] = $value;
+ }
+ foreach ($attrs as $n => $v) {
+ $value['!' . $n] = $v;
+ }
+ $this->debug("in serializeType: soapval provides attributes");
+ }
+ } else {
+ $forceType = false;
+ }
+
+ $xml = '';
+ if (strpos($type, ':')) {
+ $uqType = substr($type, strrpos($type, ':') + 1);
+ $ns = substr($type, 0, strrpos($type, ':'));
+ $this->debug("in serializeType: got a prefixed type: $uqType, $ns");
+ if ($this->getNamespaceFromPrefix($ns)) {
+ $ns = $this->getNamespaceFromPrefix($ns);
+ $this->debug("in serializeType: expanded prefixed type: $uqType, $ns");
+ }
+
+ if($ns == $this->XMLSchemaVersion || $ns == 'http://schemas.xmlsoap.org/soap/encoding/'){
+ $this->debug('in serializeType: type namespace indicates XML Schema or SOAP Encoding type');
+ if ($unqualified && $use == 'literal') {
+ $elementNS = " xmlns=\"\"";
+ } else {
+ $elementNS = '';
+ }
+ if (is_null($value)) {
+ if ($use == 'literal') {
+ // TODO: depends on minOccurs
+ $xml = "<$name$elementNS/>";
+ } else {
+ // TODO: depends on nillable, which should be checked before calling this method
+ $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>";
+ }
+ $this->debug("in serializeType: returning: $xml");
+ return $xml;
+ }
+ if ($uqType == 'boolean') {
+ if ((is_string($value) && $value == 'false') || (! $value)) {
+ $value = 'false';
+ } else {
+ $value = 'true';
+ }
+ }
+ if ($uqType == 'string' && gettype($value) == 'string') {
+ $value = $this->expandEntities($value);
+ }
+ if (($uqType == 'long' || $uqType == 'unsignedLong') && gettype($value) == 'double') {
+ $value = sprintf("%.0lf", $value);
+ }
+ // it's a scalar
+ // TODO: what about null/nil values?
+ // check type isn't a custom type extending xmlschema namespace
+ if (!$this->getTypeDef($uqType, $ns)) {
+ if ($use == 'literal') {
+ if ($forceType) {
+ $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value$name>";
+ } else {
+ $xml = "<$name$elementNS>$value$name>";
+ }
+ } else {
+ $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value$name>";
+ }
+ $this->debug("in serializeType: returning: $xml");
+ return $xml;
+ }
+ $this->debug('custom type extends XML Schema or SOAP Encoding namespace (yuck)');
+ } else if ($ns == 'http://xml.apache.org/xml-soap') {
+ $this->debug('in serializeType: appears to be Apache SOAP type');
+ if ($uqType == 'Map') {
+ $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap');
+ if (! $tt_prefix) {
+ $this->debug('in serializeType: Add namespace for Apache SOAP type');
+ $tt_prefix = 'ns' . rand(1000, 9999);
+ $this->namespaces[$tt_prefix] = 'http://xml.apache.org/xml-soap';
+ // force this to be added to usedNamespaces
+ $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap');
+ }
+ $contents = '';
+ foreach($value as $k => $v) {
+ $this->debug("serializing map element: key $k, value $v");
+ $contents .= '';
+ $contents .= $this->serialize_val($k,'key',false,false,false,false,$use);
+ $contents .= $this->serialize_val($v,'value',false,false,false,false,$use);
+ $contents .= '';
+ }
+ if ($use == 'literal') {
+ if ($forceType) {
+ $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\">$contents$name>";
+ } else {
+ $xml = "<$name>$contents$name>";
+ }
+ } else {
+ $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\"$encodingStyle>$contents$name>";
+ }
+ $this->debug("in serializeType: returning: $xml");
+ return $xml;
+ }
+ $this->debug('in serializeType: Apache SOAP type, but only support Map');
+ }
+ } else {
+ // TODO: should the type be compared to types in XSD, and the namespace
+ // set to XSD if the type matches?
+ $this->debug("in serializeType: No namespace for type $type");
+ $ns = '';
+ $uqType = $type;
+ }
+ if(!$typeDef = $this->getTypeDef($uqType, $ns)){
+ $this->setError("$type ($uqType) is not a supported type.");
+ $this->debug("in serializeType: $type ($uqType) is not a supported type.");
+ return false;
+ } else {
+ $this->debug("in serializeType: found typeDef");
+ $this->appendDebug('typeDef=' . $this->varDump($typeDef));
+ }
+ $phpType = $typeDef['phpType'];
+ $this->debug("in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '') );
+ // if php type == struct, map value to the element names
+ if ($phpType == 'struct') {
+ if (isset($typeDef['typeClass']) && $typeDef['typeClass'] == 'element') {
+ $elementName = $uqType;
+ if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
+ $elementNS = " xmlns=\"$ns\"";
+ } else {
+ $elementNS = " xmlns=\"\"";
+ }
+ } else {
+ $elementName = $name;
+ if ($unqualified) {
+ $elementNS = " xmlns=\"\"";
+ } else {
+ $elementNS = '';
+ }
+ }
+ if (is_null($value)) {
+ if ($use == 'literal') {
+ // TODO: depends on minOccurs
+ $xml = "<$elementName$elementNS/>";
+ } else {
+ $xml = "<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>";
+ }
+ $this->debug("in serializeType: returning: $xml");
+ return $xml;
+ }
+ if (is_object($value)) {
+ $value = get_object_vars($value);
+ }
+ if (is_array($value)) {
+ $elementAttrs = $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType);
+ if ($use == 'literal') {
+ if ($forceType) {
+ $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">";
+ } else {
+ $xml = "<$elementName$elementNS$elementAttrs>";
+ }
+ } else {
+ $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>";
+ }
+
+ $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle);
+ $xml .= "$elementName>";
+ } else {
+ $this->debug("in serializeType: phpType is struct, but value is not an array");
+ $this->setError("phpType is struct, but value is not an array: see debug output for details");
+ $xml = '';
+ }
+ } elseif ($phpType == 'array') {
+ if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
+ $elementNS = " xmlns=\"$ns\"";
+ } else {
+ if ($unqualified) {
+ $elementNS = " xmlns=\"\"";
+ } else {
+ $elementNS = '';
+ }
+ }
+ if (is_null($value)) {
+ if ($use == 'literal') {
+ // TODO: depends on minOccurs
+ $xml = "<$name$elementNS/>";
+ } else {
+ $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" .
+ $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') .
+ ":Array\" " .
+ $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') .
+ ':arrayType="' .
+ $this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) .
+ ':' .
+ $this->getLocalPart($typeDef['arrayType'])."[0]\"/>";
+ }
+ $this->debug("in serializeType: returning: $xml");
+ return $xml;
+ }
+ if (isset($typeDef['multidimensional'])) {
+ $nv = array();
+ foreach($value as $v) {
+ $cols = ',' . sizeof($v);
+ $nv = array_merge($nv, $v);
+ }
+ $value = $nv;
+ } else {
+ $cols = '';
+ }
+ if (is_array($value) && sizeof($value) >= 1) {
+ $rows = sizeof($value);
+ $contents = '';
+ foreach($value as $k => $v) {
+ $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]");
+ //if (strpos($typeDef['arrayType'], ':') ) {
+ if (!in_array($typeDef['arrayType'],$this->typemap['http://www.w3.org/2001/XMLSchema'])) {
+ $contents .= $this->serializeType('item', $typeDef['arrayType'], $v, $use);
+ } else {
+ $contents .= $this->serialize_val($v, 'item', $typeDef['arrayType'], null, $this->XMLSchemaVersion, false, $use);
+ }
+ }
+ } else {
+ $rows = 0;
+ $contents = null;
+ }
+ // TODO: for now, an empty value will be serialized as a zero element
+ // array. Revisit this when coding the handling of null/nil values.
+ if ($use == 'literal') {
+ $xml = "<$name$elementNS>"
+ .$contents
+ ."$name>";
+ } else {
+ $xml = "<$name$elementNS xsi:type=\"".$this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/').':Array" '.
+ $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/')
+ .':arrayType="'
+ .$this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType']))
+ .":".$this->getLocalPart($typeDef['arrayType'])."[$rows$cols]\">"
+ .$contents
+ ."$name>";
+ }
+ } elseif ($phpType == 'scalar') {
+ if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
+ $elementNS = " xmlns=\"$ns\"";
+ } else {
+ if ($unqualified) {
+ $elementNS = " xmlns=\"\"";
+ } else {
+ $elementNS = '';
+ }
+ }
+ if ($use == 'literal') {
+ if ($forceType) {
+ $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value$name>";
+ } else {
+ $xml = "<$name$elementNS>$value$name>";
+ }
+ } else {
+ $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value$name>";
+ }
+ }
+ $this->debug("in serializeType: returning: $xml");
+ return $xml;
+ }
+
+ /**
+ * serializes the attributes for a complexType
+ *
+ * @param array $typeDef our internal representation of an XML schema type (or element)
+ * @param mixed $value a native PHP value (parameter value)
+ * @param string $ns the namespace of the type
+ * @param string $uqType the local part of the type
+ * @return string value serialized as an XML string
+ * @access private
+ */
+ function serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType) {
+ $xml = '';
+ if (isset($typeDef['attrs']) && is_array($typeDef['attrs'])) {
+ $this->debug("serialize attributes for XML Schema type $ns:$uqType");
+ if (is_array($value)) {
+ $xvalue = $value;
+ } elseif (is_object($value)) {
+ $xvalue = get_object_vars($value);
+ } else {
+ $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType");
+ $xvalue = array();
+ }
+ foreach ($typeDef['attrs'] as $aName => $attrs) {
+ if (isset($xvalue['!' . $aName])) {
+ $xname = '!' . $aName;
+ $this->debug("value provided for attribute $aName with key $xname");
+ } elseif (isset($xvalue[$aName])) {
+ $xname = $aName;
+ $this->debug("value provided for attribute $aName with key $xname");
+ } elseif (isset($attrs['default'])) {
+ $xname = '!' . $aName;
+ $xvalue[$xname] = $attrs['default'];
+ $this->debug('use default value of ' . $xvalue[$aName] . ' for attribute ' . $aName);
+ } else {
+ $xname = '';
+ $this->debug("no value provided for attribute $aName");
+ }
+ if ($xname) {
+ $xml .= " $aName=\"" . $this->expandEntities($xvalue[$xname]) . "\"";
+ }
+ }
+ } else {
+ $this->debug("no attributes to serialize for XML Schema type $ns:$uqType");
+ }
+ if (isset($typeDef['extensionBase'])) {
+ $ns = $this->getPrefix($typeDef['extensionBase']);
+ $uqType = $this->getLocalPart($typeDef['extensionBase']);
+ if ($this->getNamespaceFromPrefix($ns)) {
+ $ns = $this->getNamespaceFromPrefix($ns);
+ }
+ if ($typeDef = $this->getTypeDef($uqType, $ns)) {
+ $this->debug("serialize attributes for extension base $ns:$uqType");
+ $xml .= $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType);
+ } else {
+ $this->debug("extension base $ns:$uqType is not a supported type");
+ }
+ }
+ return $xml;
+ }
+
+ /**
+ * serializes the elements for a complexType
+ *
+ * @param array $typeDef our internal representation of an XML schema type (or element)
+ * @param mixed $value a native PHP value (parameter value)
+ * @param string $ns the namespace of the type
+ * @param string $uqType the local part of the type
+ * @param string $use use for part (encoded|literal)
+ * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style)
+ * @return string value serialized as an XML string
+ * @access private
+ */
+ function serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use='encoded', $encodingStyle=false) {
+ $xml = '';
+ if (isset($typeDef['elements']) && is_array($typeDef['elements'])) {
+ $this->debug("in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType");
+ if (is_array($value)) {
+ $xvalue = $value;
+ } elseif (is_object($value)) {
+ $xvalue = get_object_vars($value);
+ } else {
+ $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType");
+ $xvalue = array();
+ }
+ // toggle whether all elements are present - ideally should validate against schema
+ if (count($typeDef['elements']) != count($xvalue)){
+ $optionals = true;
+ }
+ foreach ($typeDef['elements'] as $eName => $attrs) {
+ if (!isset($xvalue[$eName])) {
+ if (isset($attrs['default'])) {
+ $xvalue[$eName] = $attrs['default'];
+ $this->debug('use default value of ' . $xvalue[$eName] . ' for element ' . $eName);
+ }
+ }
+ // if user took advantage of a minOccurs=0, then only serialize named parameters
+ if (isset($optionals)
+ && (!isset($xvalue[$eName]))
+ && ( (!isset($attrs['nillable'])) || $attrs['nillable'] != 'true')
+ ){
+ if (isset($attrs['minOccurs']) && $attrs['minOccurs'] <> '0') {
+ $this->debug("apparent error: no value provided for element $eName with minOccurs=" . $attrs['minOccurs']);
+ }
+ // do nothing
+ $this->debug("no value provided for complexType element $eName and element is not nillable, so serialize nothing");
+ } else {
+ // get value
+ if (isset($xvalue[$eName])) {
+ $v = $xvalue[$eName];
+ } else {
+ $v = null;
+ }
+ if (isset($attrs['form'])) {
+ $unqualified = ($attrs['form'] == 'unqualified');
+ } else {
+ $unqualified = false;
+ }
+ if (isset($attrs['maxOccurs']) && ($attrs['maxOccurs'] == 'unbounded' || $attrs['maxOccurs'] > 1) && isset($v) && is_array($v) && $this->isArraySimpleOrStruct($v) == 'arraySimple') {
+ $vv = $v;
+ foreach ($vv as $k => $v) {
+ if (isset($attrs['type']) || isset($attrs['ref'])) {
+ // serialize schema-defined type
+ $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified);
+ } else {
+ // serialize generic type (can this ever really happen?)
+ $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use");
+ $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use);
+ }
+ }
+ } else {
+ if (isset($attrs['type']) || isset($attrs['ref'])) {
+ // serialize schema-defined type
+ $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified);
+ } else {
+ // serialize generic type (can this ever really happen?)
+ $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use");
+ $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use);
+ }
+ }
+ }
+ }
+ } else {
+ $this->debug("no elements to serialize for XML Schema type $ns:$uqType");
+ }
+ if (isset($typeDef['extensionBase'])) {
+ $ns = $this->getPrefix($typeDef['extensionBase']);
+ $uqType = $this->getLocalPart($typeDef['extensionBase']);
+ if ($this->getNamespaceFromPrefix($ns)) {
+ $ns = $this->getNamespaceFromPrefix($ns);
+ }
+ if ($typeDef = $this->getTypeDef($uqType, $ns)) {
+ $this->debug("serialize elements for extension base $ns:$uqType");
+ $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle);
+ } else {
+ $this->debug("extension base $ns:$uqType is not a supported type");
+ }
+ }
+ return $xml;
+ }
+
+ /**
+ * adds an XML Schema complex type to the WSDL types
+ *
+ * @param string name
+ * @param string typeClass (complexType|simpleType|attribute)
+ * @param string phpType: currently supported are array and struct (php assoc array)
+ * @param string compositor (all|sequence|choice)
+ * @param string restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
+ * @param array elements = array ( name => array(name=>'',type=>'') )
+ * @param array attrs = array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'xsd:string[]'))
+ * @param string arrayType: namespace:name (xsd:string)
+ * @see xmlschema
+ * @access public
+ */
+ function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType='') {
+ if (count($elements) > 0) {
+ foreach($elements as $n => $e){
+ // expand each element
+ foreach ($e as $k => $v) {
+ $k = strpos($k,':') ? $this->expandQname($k) : $k;
+ $v = strpos($v,':') ? $this->expandQname($v) : $v;
+ $ee[$k] = $v;
+ }
+ $eElements[$n] = $ee;
+ }
+ $elements = $eElements;
+ }
+
+ if (count($attrs) > 0) {
+ foreach($attrs as $n => $a){
+ // expand each attribute
+ foreach ($a as $k => $v) {
+ $k = strpos($k,':') ? $this->expandQname($k) : $k;
+ $v = strpos($v,':') ? $this->expandQname($v) : $v;
+ $aa[$k] = $v;
+ }
+ $eAttrs[$n] = $aa;
+ }
+ $attrs = $eAttrs;
+ }
+
+ $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase;
+ $arrayType = strpos($arrayType,':') ? $this->expandQname($arrayType) : $arrayType;
+
+ $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns'];
+ $this->schemas[$typens][0]->addComplexType($name,$typeClass,$phpType,$compositor,$restrictionBase,$elements,$attrs,$arrayType);
+ }
+
+ /**
+ * adds an XML Schema simple type to the WSDL types
+ *
+ * @param string $name
+ * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
+ * @param string $typeClass (should always be simpleType)
+ * @param string $phpType (should always be scalar)
+ * @param array $enumeration array of values
+ * @see xmlschema
+ * @access public
+ */
+ function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) {
+ $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase;
+
+ $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns'];
+ $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType, $enumeration);
+ }
+
+ /**
+ * adds an element to the WSDL types
+ *
+ * @param array $attrs attributes that must include name and type
+ * @see xmlschema
+ * @access public
+ */
+ function addElement($attrs) {
+ $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns'];
+ $this->schemas[$typens][0]->addElement($attrs);
+ }
+
+ /**
+ * register an operation with the server
+ *
+ * @param string $name operation (method) name
+ * @param array $in assoc array of input values: key = param name, value = param type
+ * @param array $out assoc array of output values: key = param name, value = param type
+ * @param string $namespace optional The namespace for the operation
+ * @param string $soapaction optional The soapaction for the operation
+ * @param string $style (rpc|document) optional The style for the operation Note: when 'document' is specified, parameter and return wrappers are created for you automatically
+ * @param string $use (encoded|literal) optional The use for the parameters (cannot mix right now)
+ * @param string $documentation optional The description to include in the WSDL
+ * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded)
+ * @access public
+ */
+ function addOperation($name, $in = false, $out = false, $namespace = false, $soapaction = false, $style = 'rpc', $use = 'encoded', $documentation = '', $encodingStyle = ''){
+ if ($use == 'encoded' && $encodingStyle == '') {
+ $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
+ }
+
+ if ($style == 'document') {
+ $elements = array();
+ foreach ($in as $n => $t) {
+ $elements[$n] = array('name' => $n, 'type' => $t);
+ }
+ $this->addComplexType($name . 'RequestType', 'complexType', 'struct', 'all', '', $elements);
+ $this->addElement(array('name' => $name, 'type' => $name . 'RequestType'));
+ $in = array('parameters' => 'tns:' . $name);
+
+ $elements = array();
+ foreach ($out as $n => $t) {
+ $elements[$n] = array('name' => $n, 'type' => $t);
+ }
+ $this->addComplexType($name . 'ResponseType', 'complexType', 'struct', 'all', '', $elements);
+ $this->addElement(array('name' => $name . 'Response', 'type' => $name . 'ResponseType'));
+ $out = array('parameters' => 'tns:' . $name . 'Response');
+ }
+
+ // get binding
+ $this->bindings[ $this->serviceName . 'Binding' ]['operations'][$name] =
+ array(
+ 'name' => $name,
+ 'binding' => $this->serviceName . 'Binding',
+ 'endpoint' => $this->endpoint,
+ 'soapAction' => $soapaction,
+ 'style' => $style,
+ 'input' => array(
+ 'use' => $use,
+ 'namespace' => $namespace,
+ 'encodingStyle' => $encodingStyle,
+ 'message' => $name . 'Request',
+ 'parts' => $in),
+ 'output' => array(
+ 'use' => $use,
+ 'namespace' => $namespace,
+ 'encodingStyle' => $encodingStyle,
+ 'message' => $name . 'Response',
+ 'parts' => $out),
+ 'namespace' => $namespace,
+ 'transport' => 'http://schemas.xmlsoap.org/soap/http',
+ 'documentation' => $documentation);
+ // add portTypes
+ // add messages
+ if($in)
+ {
+ foreach($in as $pName => $pType)
+ {
+ if(strpos($pType,':')) {
+ $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType);
+ }
+ $this->messages[$name.'Request'][$pName] = $pType;
+ }
+ } else {
+ $this->messages[$name.'Request']= '0';
+ }
+ if($out)
+ {
+ foreach($out as $pName => $pType)
+ {
+ if(strpos($pType,':')) {
+ $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType);
+ }
+ $this->messages[$name.'Response'][$pName] = $pType;
+ }
+ } else {
+ $this->messages[$name.'Response']= '0';
+ }
+ return true;
+ }
+}
+?>
+* @version $Id$
+* @access public
+*/
+class soap_parser extends nusoap_base {
+
+ var $xml = '';
+ var $xml_encoding = '';
+ var $method = '';
+ var $root_struct = '';
+ var $root_struct_name = '';
+ var $root_struct_namespace = '';
+ var $root_header = '';
+ var $document = ''; // incoming SOAP body (text)
+ // determines where in the message we are (envelope,header,body,method)
+ var $status = '';
+ var $position = 0;
+ var $depth = 0;
+ var $default_namespace = '';
+ var $namespaces = array();
+ var $message = array();
+ var $parent = '';
+ var $fault = false;
+ var $fault_code = '';
+ var $fault_str = '';
+ var $fault_detail = '';
+ var $depth_array = array();
+ var $debug_flag = true;
+ var $soapresponse = NULL;
+ var $responseHeaders = ''; // incoming SOAP headers (text)
+ var $body_position = 0;
+ // for multiref parsing:
+ // array of id => pos
+ var $ids = array();
+ // array of id => hrefs => pos
+ var $multirefs = array();
+ // toggle for auto-decoding element content
+ var $decode_utf8 = true;
+
+ /**
+ * constructor that actually does the parsing
+ *
+ * @param string $xml SOAP message
+ * @param string $encoding character encoding scheme of message
+ * @param string $method method for which XML is parsed (unused?)
+ * @param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1
+ * @access public
+ */
+ function soap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){
+ parent::nusoap_base();
+ $this->xml = $xml;
+ $this->xml_encoding = $encoding;
+ $this->method = $method;
+ $this->decode_utf8 = $decode_utf8;
+
+ // Check whether content has been read.
+ if(!empty($xml)){
+ // Check XML encoding
+ $pos_xml = strpos($xml, '', $pos_xml + 2) - $pos_xml + 1);
+ if (preg_match("/encoding=[\"']([^\"']*)[\"']/", $xml_decl, $res)) {
+ $xml_encoding = $res[1];
+ if (strtoupper($xml_encoding) != $encoding) {
+ $err = "Charset from HTTP Content-Type '" . $encoding . "' does not match encoding from XML declaration '" . $xml_encoding . "'";
+ $this->debug($err);
+ if ($encoding != 'ISO-8859-1' || strtoupper($xml_encoding) != 'UTF-8') {
+ $this->setError($err);
+ return;
+ }
+ // when HTTP says ISO-8859-1 (the default) and XML says UTF-8 (the typical), assume the other endpoint is just sloppy and proceed
+ } else {
+ $this->debug('Charset from HTTP Content-Type matches encoding from XML declaration');
+ }
+ } else {
+ $this->debug('No encoding specified in XML declaration');
+ }
+ } else {
+ $this->debug('No XML declaration');
+ }
+ $this->debug('Entering soap_parser(), length='.strlen($xml).', encoding='.$encoding);
+ // Create an XML parser - why not xml_parser_create_ns?
+ $this->parser = xml_parser_create($this->xml_encoding);
+ // Set the options for parsing the XML data.
+ //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
+ xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
+ xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding);
+ // Set the object for the parser.
+ xml_set_object($this->parser, $this);
+ // Set the element handlers for the parser.
+ xml_set_element_handler($this->parser, 'start_element','end_element');
+ xml_set_character_data_handler($this->parser,'character_data');
+
+ // Parse the XML file.
+ if(!xml_parse($this->parser,$xml,true)){
+ // Display an error message.
+ $err = sprintf('XML error parsing SOAP payload on line %d: %s',
+ xml_get_current_line_number($this->parser),
+ xml_error_string(xml_get_error_code($this->parser)));
+ $this->debug($err);
+ $this->debug("XML payload:\n" . $xml);
+ $this->setError($err);
+ } else {
+ $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name);
+ // get final value
+ $this->soapresponse = $this->message[$this->root_struct]['result'];
+ // get header value: no, because this is documented as XML string
+// if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){
+// $this->responseHeaders = $this->message[$this->root_header]['result'];
+// }
+ // resolve hrefs/ids
+ if(sizeof($this->multirefs) > 0){
+ foreach($this->multirefs as $id => $hrefs){
+ $this->debug('resolving multirefs for id: '.$id);
+ $idVal = $this->buildVal($this->ids[$id]);
+ if (is_array($idVal) && isset($idVal['!id'])) {
+ unset($idVal['!id']);
+ }
+ foreach($hrefs as $refPos => $ref){
+ $this->debug('resolving href at pos '.$refPos);
+ $this->multirefs[$id][$refPos] = $idVal;
+ }
+ }
+ }
+ }
+ xml_parser_free($this->parser);
+ } else {
+ $this->debug('xml was empty, didn\'t parse!');
+ $this->setError('xml was empty, didn\'t parse!');
+ }
+ }
+
+ /**
+ * start-element handler
+ *
+ * @param resource $parser XML parser object
+ * @param string $name element name
+ * @param array $attrs associative array of attributes
+ * @access private
+ */
+ function start_element($parser, $name, $attrs) {
+ // position in a total number of elements, starting from 0
+ // update class level pos
+ $pos = $this->position++;
+ // and set mine
+ $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>'');
+ // depth = how many levels removed from root?
+ // set mine as current global depth and increment global depth value
+ $this->message[$pos]['depth'] = $this->depth++;
+
+ // else add self as child to whoever the current parent is
+ if($pos != 0){
+ $this->message[$this->parent]['children'] .= '|'.$pos;
+ }
+ // set my parent
+ $this->message[$pos]['parent'] = $this->parent;
+ // set self as current parent
+ $this->parent = $pos;
+ // set self as current value for this depth
+ $this->depth_array[$this->depth] = $pos;
+ // get element prefix
+ if(strpos($name,':')){
+ // get ns prefix
+ $prefix = substr($name,0,strpos($name,':'));
+ // get unqualified name
+ $name = substr(strstr($name,':'),1);
+ }
+ // set status
+ if($name == 'Envelope'){
+ $this->status = 'envelope';
+ } elseif($name == 'Header'){
+ $this->root_header = $pos;
+ $this->status = 'header';
+ } elseif($name == 'Body'){
+ $this->status = 'body';
+ $this->body_position = $pos;
+ // set method
+ } elseif($this->status == 'body' && $pos == ($this->body_position+1)){
+ $this->status = 'method';
+ $this->root_struct_name = $name;
+ $this->root_struct = $pos;
+ $this->message[$pos]['type'] = 'struct';
+ $this->debug("found root struct $this->root_struct_name, pos $this->root_struct");
+ }
+ // set my status
+ $this->message[$pos]['status'] = $this->status;
+ // set name
+ $this->message[$pos]['name'] = htmlspecialchars($name);
+ // set attrs
+ $this->message[$pos]['attrs'] = $attrs;
+
+ // loop through atts, logging ns and type declarations
+ $attstr = '';
+ foreach($attrs as $key => $value){
+ $key_prefix = $this->getPrefix($key);
+ $key_localpart = $this->getLocalPart($key);
+ // if ns declarations, add to class level array of valid namespaces
+ if($key_prefix == 'xmlns'){
+ if(ereg('^http://www.w3.org/[0-9]{4}/XMLSchema$',$value)){
+ $this->XMLSchemaVersion = $value;
+ $this->namespaces['xsd'] = $this->XMLSchemaVersion;
+ $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance';
+ }
+ $this->namespaces[$key_localpart] = $value;
+ // set method namespace
+ if($name == $this->root_struct_name){
+ $this->methodNamespace = $value;
+ }
+ // if it's a type declaration, set type
+ } elseif($key_localpart == 'type'){
+ $value_prefix = $this->getPrefix($value);
+ $value_localpart = $this->getLocalPart($value);
+ $this->message[$pos]['type'] = $value_localpart;
+ $this->message[$pos]['typePrefix'] = $value_prefix;
+ if(isset($this->namespaces[$value_prefix])){
+ $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix];
+ } else if(isset($attrs['xmlns:'.$value_prefix])) {
+ $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix];
+ }
+ // should do something here with the namespace of specified type?
+ } elseif($key_localpart == 'arrayType'){
+ $this->message[$pos]['type'] = 'array';
+ /* do arrayType ereg here
+ [1] arrayTypeValue ::= atype asize
+ [2] atype ::= QName rank*
+ [3] rank ::= '[' (',')* ']'
+ [4] asize ::= '[' length~ ']'
+ [5] length ::= nextDimension* Digit+
+ [6] nextDimension ::= Digit+ ','
+ */
+ $expr = '([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]';
+ if(ereg($expr,$value,$regs)){
+ $this->message[$pos]['typePrefix'] = $regs[1];
+ $this->message[$pos]['arrayTypePrefix'] = $regs[1];
+ if (isset($this->namespaces[$regs[1]])) {
+ $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]];
+ } else if (isset($attrs['xmlns:'.$regs[1]])) {
+ $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]];
+ }
+ $this->message[$pos]['arrayType'] = $regs[2];
+ $this->message[$pos]['arraySize'] = $regs[3];
+ $this->message[$pos]['arrayCols'] = $regs[4];
+ }
+ // specifies nil value (or not)
+ } elseif ($key_localpart == 'nil'){
+ $this->message[$pos]['nil'] = ($value == 'true' || $value == '1');
+ // some other attribute
+ } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') {
+ $this->message[$pos]['xattrs']['!' . $key] = $value;
+ }
+
+ if ($key == 'xmlns') {
+ $this->default_namespace = $value;
+ }
+ // log id
+ if($key == 'id'){
+ $this->ids[$value] = $pos;
+ }
+ // root
+ if($key_localpart == 'root' && $value == 1){
+ $this->status = 'method';
+ $this->root_struct_name = $name;
+ $this->root_struct = $pos;
+ $this->debug("found root struct $this->root_struct_name, pos $pos");
+ }
+ // for doclit
+ $attstr .= " $key=\"$value\"";
+ }
+ // get namespace - must be done after namespace atts are processed
+ if(isset($prefix)){
+ $this->message[$pos]['namespace'] = $this->namespaces[$prefix];
+ $this->default_namespace = $this->namespaces[$prefix];
+ } else {
+ $this->message[$pos]['namespace'] = $this->default_namespace;
+ }
+ if($this->status == 'header'){
+ if ($this->root_header != $pos) {
+ $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
+ }
+ } elseif($this->root_struct_name != ''){
+ $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
+ }
+ }
+
+ /**
+ * end-element handler
+ *
+ * @param resource $parser XML parser object
+ * @param string $name element name
+ * @access private
+ */
+ function end_element($parser, $name) {
+ // position of current element is equal to the last value left in depth_array for my depth
+ $pos = $this->depth_array[$this->depth--];
+
+ // get element prefix
+ if(strpos($name,':')){
+ // get ns prefix
+ $prefix = substr($name,0,strpos($name,':'));
+ // get unqualified name
+ $name = substr(strstr($name,':'),1);
+ }
+
+ // build to native type
+ if(isset($this->body_position) && $pos > $this->body_position){
+ // deal w/ multirefs
+ if(isset($this->message[$pos]['attrs']['href'])){
+ // get id
+ $id = substr($this->message[$pos]['attrs']['href'],1);
+ // add placeholder to href array
+ $this->multirefs[$id][$pos] = 'placeholder';
+ // add set a reference to it as the result value
+ $this->message[$pos]['result'] =& $this->multirefs[$id][$pos];
+ // build complexType values
+ } elseif($this->message[$pos]['children'] != ''){
+ // if result has already been generated (struct/array)
+ if(!isset($this->message[$pos]['result'])){
+ $this->message[$pos]['result'] = $this->buildVal($pos);
+ }
+ // build complexType values of attributes and possibly simpleContent
+ } elseif (isset($this->message[$pos]['xattrs'])) {
+ if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) {
+ $this->message[$pos]['xattrs']['!'] = null;
+ } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') {
+ if (isset($this->message[$pos]['type'])) {
+ $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
+ } else {
+ $parent = $this->message[$pos]['parent'];
+ if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
+ $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
+ } else {
+ $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata'];
+ }
+ }
+ }
+ $this->message[$pos]['result'] = $this->message[$pos]['xattrs'];
+ // set value of simpleType (or nil complexType)
+ } else {
+ //$this->debug('adding data for scalar value '.$this->message[$pos]['name'].' of value '.$this->message[$pos]['cdata']);
+ if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) {
+ $this->message[$pos]['xattrs']['!'] = null;
+ } elseif (isset($this->message[$pos]['type'])) {
+ $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
+ } else {
+ $parent = $this->message[$pos]['parent'];
+ if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
+ $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
+ } else {
+ $this->message[$pos]['result'] = $this->message[$pos]['cdata'];
+ }
+ }
+
+ /* add value to parent's result, if parent is struct/array
+ $parent = $this->message[$pos]['parent'];
+ if($this->message[$parent]['type'] != 'map'){
+ if(strtolower($this->message[$parent]['type']) == 'array'){
+ $this->message[$parent]['result'][] = $this->message[$pos]['result'];
+ } else {
+ $this->message[$parent]['result'][$this->message[$pos]['name']] = $this->message[$pos]['result'];
+ }
+ }
+ */
+ }
+ }
+
+ // for doclit
+ if($this->status == 'header'){
+ if ($this->root_header != $pos) {
+ $this->responseHeaders .= "" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
+ }
+ } elseif($pos >= $this->root_struct){
+ $this->document .= "" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
+ }
+ // switch status
+ if($pos == $this->root_struct){
+ $this->status = 'body';
+ $this->root_struct_namespace = $this->message[$pos]['namespace'];
+ } elseif($name == 'Body'){
+ $this->status = 'envelope';
+ } elseif($name == 'Header'){
+ $this->status = 'envelope';
+ } elseif($name == 'Envelope'){
+ //
+ }
+ // set parent back to my parent
+ $this->parent = $this->message[$pos]['parent'];
+ }
+
+ /**
+ * element content handler
+ *
+ * @param resource $parser XML parser object
+ * @param string $data element content
+ * @access private
+ */
+ function character_data($parser, $data){
+ $pos = $this->depth_array[$this->depth];
+ if ($this->xml_encoding=='UTF-8'){
+ // TODO: add an option to disable this for folks who want
+ // raw UTF-8 that, e.g., might not map to iso-8859-1
+ // TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
+ if($this->decode_utf8){
+ $data = utf8_decode($data);
+ }
+ }
+ $this->message[$pos]['cdata'] .= $data;
+ // for doclit
+ if($this->status == 'header'){
+ $this->responseHeaders .= $data;
+ } else {
+ $this->document .= $data;
+ }
+ }
+
+ /**
+ * get the parsed message
+ *
+ * @return mixed
+ * @access public
+ */
+ function get_response(){
+ return $this->soapresponse;
+ }
+
+ /**
+ * get the parsed headers
+ *
+ * @return string XML or empty if no headers
+ * @access public
+ */
+ function getHeaders(){
+ return $this->responseHeaders;
+ }
+
+ /**
+ * decodes simple types into PHP variables
+ *
+ * @param string $value value to decode
+ * @param string $type XML type to decode
+ * @param string $typens XML type namespace to decode
+ * @return mixed PHP value
+ * @access private
+ */
+ function decodeSimple($value, $type, $typens) {
+ // TODO: use the namespace!
+ if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') {
+ return (string) $value;
+ }
+ if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') {
+ return (int) $value;
+ }
+ if ($type == 'float' || $type == 'double' || $type == 'decimal') {
+ return (double) $value;
+ }
+ if ($type == 'boolean') {
+ if (strtolower($value) == 'false' || strtolower($value) == 'f') {
+ return false;
+ }
+ return (boolean) $value;
+ }
+ if ($type == 'base64' || $type == 'base64Binary') {
+ $this->debug('Decode base64 value');
+ return base64_decode($value);
+ }
+ // obscure numeric types
+ if ($type == 'nonPositiveInteger' || $type == 'negativeInteger'
+ || $type == 'nonNegativeInteger' || $type == 'positiveInteger'
+ || $type == 'unsignedInt'
+ || $type == 'unsignedShort' || $type == 'unsignedByte') {
+ return (int) $value;
+ }
+ // bogus: parser treats array with no elements as a simple type
+ if ($type == 'array') {
+ return array();
+ }
+ // everything else
+ return (string) $value;
+ }
+
+ /**
+ * builds response structures for compound values (arrays/structs)
+ * and scalars
+ *
+ * @param integer $pos position in node tree
+ * @return mixed PHP value
+ * @access private
+ */
+ function buildVal($pos){
+ if(!isset($this->message[$pos]['type'])){
+ $this->message[$pos]['type'] = '';
+ }
+ $this->debug('in buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']);
+ // if there are children...
+ if($this->message[$pos]['children'] != ''){
+ $this->debug('in buildVal, there are children');
+ $children = explode('|',$this->message[$pos]['children']);
+ array_shift($children); // knock off empty
+ // md array
+ if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){
+ $r=0; // rowcount
+ $c=0; // colcount
+ foreach($children as $child_pos){
+ $this->debug("in buildVal, got an MD array element: $r, $c");
+ $params[$r][] = $this->message[$child_pos]['result'];
+ $c++;
+ if($c == $this->message[$pos]['arrayCols']){
+ $c = 0;
+ $r++;
+ }
+ }
+ // array
+ } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){
+ $this->debug('in buildVal, adding array '.$this->message[$pos]['name']);
+ foreach($children as $child_pos){
+ $params[] = &$this->message[$child_pos]['result'];
+ }
+ // apache Map type: java hashtable
+ } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){
+ $this->debug('in buildVal, Java Map '.$this->message[$pos]['name']);
+ foreach($children as $child_pos){
+ $kv = explode("|",$this->message[$child_pos]['children']);
+ $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result'];
+ }
+ // generic compound type
+ //} elseif($this->message[$pos]['type'] == 'SOAPStruct' || $this->message[$pos]['type'] == 'struct') {
+ } else {
+ // Apache Vector type: treat as an array
+ $this->debug('in buildVal, adding Java Vector '.$this->message[$pos]['name']);
+ if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') {
+ $notstruct = 1;
+ } else {
+ $notstruct = 0;
+ }
+ //
+ foreach($children as $child_pos){
+ if($notstruct){
+ $params[] = &$this->message[$child_pos]['result'];
+ } else {
+ if (isset($params[$this->message[$child_pos]['name']])) {
+ // de-serialize repeated element name into an array
+ if ((!is_array($params[$this->message[$child_pos]['name']])) || (!isset($params[$this->message[$child_pos]['name']][0]))) {
+ $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]);
+ }
+ $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result'];
+ } else {
+ $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result'];
+ }
+ }
+ }
+ }
+ if (isset($this->message[$pos]['xattrs'])) {
+ $this->debug('in buildVal, handling attributes');
+ foreach ($this->message[$pos]['xattrs'] as $n => $v) {
+ $params[$n] = $v;
+ }
+ }
+ // handle simpleContent
+ if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') {
+ $this->debug('in buildVal, handling simpleContent');
+ if (isset($this->message[$pos]['type'])) {
+ $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
+ } else {
+ $parent = $this->message[$pos]['parent'];
+ if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
+ $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
+ } else {
+ $params['!'] = $this->message[$pos]['cdata'];
+ }
+ }
+ }
+ return is_array($params) ? $params : array();
+ } else {
+ $this->debug('in buildVal, no children, building scalar');
+ $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : '';
+ if (isset($this->message[$pos]['type'])) {
+ return $this->decodeSimple($cdata, $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
+ }
+ $parent = $this->message[$pos]['parent'];
+ if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
+ return $this->decodeSimple($cdata, $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
+ }
+ return $this->message[$pos]['cdata'];
+ }
+ }
+}
+
+
+
+?>call( string methodname [ ,array parameters] );
+*
+* // bye bye client
+* unset($soapclient);
+*
+* @author Dietrich Ayala
+* @version $Id$
+* @access public
+*/
+class soapclient extends nusoap_base {
+
+ var $username = '';
+ var $password = '';
+ var $authtype = '';
+ var $certRequest = array();
+ var $requestHeaders = false; // SOAP headers in request (text)
+ var $responseHeaders = ''; // SOAP headers from response (incomplete namespace resolution) (text)
+ var $document = ''; // SOAP body response portion (incomplete namespace resolution) (text)
+ var $endpoint;
+ var $forceEndpoint = ''; // overrides WSDL endpoint
+ var $proxyhost = '';
+ var $proxyport = '';
+ var $proxyusername = '';
+ var $proxypassword = '';
+ var $xml_encoding = ''; // character set encoding of incoming (response) messages
+ var $http_encoding = false;
+ var $timeout = 0; // HTTP connection timeout
+ var $response_timeout = 30; // HTTP response timeout
+ var $endpointType = ''; // soap|wsdl, empty for WSDL initialization error
+ var $persistentConnection = false;
+ var $defaultRpcParams = false; // This is no longer used
+ var $request = ''; // HTTP request
+ var $response = ''; // HTTP response
+ var $responseData = ''; // SOAP payload of response
+ var $cookies = array(); // Cookies from response or for request
+ var $decode_utf8 = true; // toggles whether the parser decodes element content w/ utf8_decode()
+ var $operations = array(); // WSDL operations, empty for WSDL initialization error
+
+ /*
+ * fault related variables
+ */
+ /**
+ * @var fault
+ * @access public
+ */
+ var $fault;
+ /**
+ * @var faultcode
+ * @access public
+ */
+ var $faultcode;
+ /**
+ * @var faultstring
+ * @access public
+ */
+ var $faultstring;
+ /**
+ * @var faultdetail
+ * @access public
+ */
+ var $faultdetail;
+
+ /**
+ * constructor
+ *
+ * @param mixed $endpoint SOAP server or WSDL URL (string), or wsdl instance (object)
+ * @param bool $wsdl optional, set to true if using WSDL
+ * @param int $portName optional portName in WSDL document
+ * @param string $proxyhost
+ * @param string $proxyport
+ * @param string $proxyusername
+ * @param string $proxypassword
+ * @param integer $timeout set the connection timeout
+ * @param integer $response_timeout set the response timeout
+ * @access public
+ */
+ function soapclient($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30){
+ parent::nusoap_base();
+ $this->endpoint = $endpoint;
+ $this->proxyhost = $proxyhost;
+ $this->proxyport = $proxyport;
+ $this->proxyusername = $proxyusername;
+ $this->proxypassword = $proxypassword;
+ $this->timeout = $timeout;
+ $this->response_timeout = $response_timeout;
+
+ // make values
+ if($wsdl){
+ if (is_object($endpoint) && (get_class($endpoint) == 'wsdl')) {
+ $this->wsdl = $endpoint;
+ $this->endpoint = $this->wsdl->wsdl;
+ $this->wsdlFile = $this->endpoint;
+ $this->debug('existing wsdl instance created from ' . $this->endpoint);
+ } else {
+ $this->wsdlFile = $this->endpoint;
+
+ // instantiate wsdl object and parse wsdl file
+ $this->debug('instantiating wsdl class with doc: '.$endpoint);
+ $this->wsdl =& new wsdl($this->wsdlFile,$this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword,$this->timeout,$this->response_timeout);
+ }
+ $this->appendDebug($this->wsdl->getDebug());
+ $this->wsdl->clearDebug();
+ // catch errors
+ if($errstr = $this->wsdl->getError()){
+ $this->debug('got wsdl error: '.$errstr);
+ $this->setError('wsdl error: '.$errstr);
+ } elseif($this->operations = $this->wsdl->getOperations()){
+ $this->debug( 'got '.count($this->operations).' operations from wsdl '.$this->wsdlFile);
+ $this->endpointType = 'wsdl';
+ } else {
+ $this->debug( 'getOperations returned false');
+ $this->setError('no operations defined in the WSDL document!');
+ }
+ } else {
+ $this->debug("instantiate SOAP with endpoint at $endpoint");
+ $this->endpointType = 'soap';
+ }
+ }
+
+ /**
+ * calls method, returns PHP native type
+ *
+ * @param string $method SOAP server URL or path
+ * @param mixed $params An array, associative or simple, of the parameters
+ * for the method call, or a string that is the XML
+ * for the call. For rpc style, this call will
+ * wrap the XML in a tag named after the method, as
+ * well as the SOAP Envelope and Body. For document
+ * style, this will only wrap with the Envelope and Body.
+ * IMPORTANT: when using an array with document style,
+ * in which case there
+ * is really one parameter, the root of the fragment
+ * used in the call, which encloses what programmers
+ * normally think of parameters. A parameter array
+ * *must* include the wrapper.
+ * @param string $namespace optional method namespace (WSDL can override)
+ * @param string $soapAction optional SOAPAction value (WSDL can override)
+ * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers
+ * @param boolean $rpcParams optional (no longer used)
+ * @param string $style optional (rpc|document) the style to use when serializing parameters (WSDL can override)
+ * @param string $use optional (encoded|literal) the use when serializing parameters (WSDL can override)
+ * @return mixed response from SOAP call
+ * @access public
+ */
+ function call($operation,$params=array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){
+ $this->operation = $operation;
+ $this->fault = false;
+ $this->setError('');
+ $this->request = '';
+ $this->response = '';
+ $this->responseData = '';
+ $this->faultstring = '';
+ $this->faultcode = '';
+ $this->opData = array();
+
+ $this->debug("call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType");
+ $this->appendDebug('params=' . $this->varDump($params));
+ $this->appendDebug('headers=' . $this->varDump($headers));
+ if ($headers) {
+ $this->requestHeaders = $headers;
+ }
+ // serialize parameters
+ if($this->endpointType == 'wsdl' && $opData = $this->getOperationData($operation)){
+ // use WSDL for operation
+ $this->opData = $opData;
+ $this->debug("found operation");
+ $this->appendDebug('opData=' . $this->varDump($opData));
+ if (isset($opData['soapAction'])) {
+ $soapAction = $opData['soapAction'];
+ }
+ if (! $this->forceEndpoint) {
+ $this->endpoint = $opData['endpoint'];
+ } else {
+ $this->endpoint = $this->forceEndpoint;
+ }
+ $namespace = isset($opData['input']['namespace']) ? $opData['input']['namespace'] : $namespace;
+ $style = $opData['style'];
+ $use = $opData['input']['use'];
+ // add ns to ns array
+ if($namespace != '' && !isset($this->wsdl->namespaces[$namespace])){
+ $nsPrefix = 'ns' . rand(1000, 9999);
+ $this->wsdl->namespaces[$nsPrefix] = $namespace;
+ }
+ $nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace);
+ // serialize payload
+ if (is_string($params)) {
+ $this->debug("serializing param string for WSDL operation $operation");
+ $payload = $params;
+ } elseif (is_array($params)) {
+ $this->debug("serializing param array for WSDL operation $operation");
+ $payload = $this->wsdl->serializeRPCParameters($operation,'input',$params);
+ } else {
+ $this->debug('params must be array or string');
+ $this->setError('params must be array or string');
+ return false;
+ }
+ $usedNamespaces = $this->wsdl->usedNamespaces;
+ if (isset($opData['input']['encodingStyle'])) {
+ $encodingStyle = $opData['input']['encodingStyle'];
+ } else {
+ $encodingStyle = '';
+ }
+ $this->appendDebug($this->wsdl->getDebug());
+ $this->wsdl->clearDebug();
+ if ($errstr = $this->wsdl->getError()) {
+ $this->debug('got wsdl error: '.$errstr);
+ $this->setError('wsdl error: '.$errstr);
+ return false;
+ }
+ } elseif($this->endpointType == 'wsdl') {
+ // operation not in WSDL
+ $this->appendDebug($this->wsdl->getDebug());
+ $this->wsdl->clearDebug();
+ $this->setError( 'operation '.$operation.' not present.');
+ $this->debug("operation '$operation' not present.");
+ return false;
+ } else {
+ // no WSDL
+ //$this->namespaces['ns1'] = $namespace;
+ $nsPrefix = 'ns' . rand(1000, 9999);
+ // serialize
+ $payload = '';
+ if (is_string($params)) {
+ $this->debug("serializing param string for operation $operation");
+ $payload = $params;
+ } elseif (is_array($params)) {
+ $this->debug("serializing param array for operation $operation");
+ foreach($params as $k => $v){
+ $payload .= $this->serialize_val($v,$k,false,false,false,false,$use);
+ }
+ } else {
+ $this->debug('params must be array or string');
+ $this->setError('params must be array or string');
+ return false;
+ }
+ $usedNamespaces = array();
+ if ($use == 'encoded') {
+ $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
+ } else {
+ $encodingStyle = '';
+ }
+ }
+ // wrap RPC calls with method element
+ if ($style == 'rpc') {
+ if ($use == 'literal') {
+ $this->debug("wrapping RPC request with literal method element");
+ if ($namespace) {
+ $payload = "<$operation xmlns=\"$namespace\">" . $payload . "$operation>";
+ } else {
+ $payload = "<$operation>" . $payload . "$operation>";
+ }
+ } else {
+ $this->debug("wrapping RPC request with encoded method element");
+ if ($namespace) {
+ $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" .
+ $payload .
+ "$nsPrefix:$operation>";
+ } else {
+ $payload = "<$operation>" .
+ $payload .
+ "$operation>";
+ }
+ }
+ }
+ // serialize envelope
+ $soapmsg = $this->serializeEnvelope($payload,$this->requestHeaders,$usedNamespaces,$style,$use,$encodingStyle);
+ $this->debug("endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle");
+ $this->debug('SOAP message length=' . strlen($soapmsg) . ' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000));
+ // send
+ $return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout);
+ if($errstr = $this->getError()){
+ $this->debug('Error: '.$errstr);
+ return false;
+ } else {
+ $this->return = $return;
+ $this->debug('sent message successfully and got a(n) '.gettype($return));
+ $this->appendDebug('return=' . $this->varDump($return));
+
+ // fault?
+ if(is_array($return) && isset($return['faultcode'])){
+ $this->debug('got fault');
+ $this->setError($return['faultcode'].': '.$return['faultstring']);
+ $this->fault = true;
+ foreach($return as $k => $v){
+ $this->$k = $v;
+ $this->debug("$k = $v ");
+ }
+ return $return;
+ } elseif ($style == 'document') {
+ // NOTE: if the response is defined to have multiple parts (i.e. unwrapped),
+ // we are only going to return the first part here...sorry about that
+ return $return;
+ } else {
+ // array of return values
+ if(is_array($return)){
+ // multiple 'out' parameters, which we return wrapped up
+ // in the array
+ if(sizeof($return) > 1){
+ return $return;
+ }
+ // single 'out' parameter (normally the return value)
+ $return = array_shift($return);
+ $this->debug('return shifted value: ');
+ $this->appendDebug($this->varDump($return));
+ return $return;
+ // nothing returned (ie, echoVoid)
+ } else {
+ return "";
+ }
+ }
+ }
+ }
+
+ /**
+ * get available data pertaining to an operation
+ *
+ * @param string $operation operation name
+ * @return array array of data pertaining to the operation
+ * @access public
+ */
+ function getOperationData($operation){
+ if(isset($this->operations[$operation])){
+ return $this->operations[$operation];
+ }
+ $this->debug("No data for operation: $operation");
+ }
+
+ /**
+ * send the SOAP message
+ *
+ * Note: if the operation has multiple return values
+ * the return value of this method will be an array
+ * of those values.
+ *
+ * @param string $msg a SOAPx4 soapmsg object
+ * @param string $soapaction SOAPAction value
+ * @param integer $timeout set connection timeout in seconds
+ * @param integer $response_timeout set response timeout in seconds
+ * @return mixed native PHP types.
+ * @access private
+ */
+ function send($msg, $soapaction = '', $timeout=0, $response_timeout=30) {
+ $this->checkCookies();
+ // detect transport
+ switch(true){
+ // http(s)
+ case ereg('^http',$this->endpoint):
+ $this->debug('transporting via HTTP');
+ if($this->persistentConnection == true && is_object($this->persistentConnection)){
+ $http =& $this->persistentConnection;
+ } else {
+ $http = new soap_transport_http($this->endpoint);
+ if ($this->persistentConnection) {
+ $http->usePersistentConnection();
+ }
+ }
+ $http->setContentType($this->getHTTPContentType(), $this->getHTTPContentTypeCharset());
+ $http->setSOAPAction($soapaction);
+ if($this->proxyhost && $this->proxyport){
+ $http->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword);
+ }
+ if($this->authtype != '') {
+ $http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest);
+ }
+ if($this->http_encoding != ''){
+ $http->setEncoding($this->http_encoding);
+ }
+ $this->debug('sending message, length='.strlen($msg));
+ if(ereg('^http:',$this->endpoint)){
+ //if(strpos($this->endpoint,'http:')){
+ $this->responseData = $http->send($msg,$timeout,$response_timeout,$this->cookies);
+ } elseif(ereg('^https',$this->endpoint)){
+ //} elseif(strpos($this->endpoint,'https:')){
+ //if(phpversion() == '4.3.0-dev'){
+ //$response = $http->send($msg,$timeout,$response_timeout);
+ //$this->request = $http->outgoing_payload;
+ //$this->response = $http->incoming_payload;
+ //} else
+ $this->responseData = $http->sendHTTPS($msg,$timeout,$response_timeout,$this->cookies);
+ } else {
+ $this->setError('no http/s in endpoint url');
+ }
+ $this->request = $http->outgoing_payload;
+ $this->response = $http->incoming_payload;
+ $this->appendDebug($http->getDebug());
+ $this->UpdateCookies($http->incoming_cookies);
+
+ // save transport object if using persistent connections
+ if ($this->persistentConnection) {
+ $http->clearDebug();
+ if (!is_object($this->persistentConnection)) {
+ $this->persistentConnection = $http;
+ }
+ }
+
+ if($err = $http->getError()){
+ $this->setError('HTTP Error: '.$err);
+ return false;
+ } elseif($this->getError()){
+ return false;
+ } else {
+ $this->debug('got response, length='. strlen($this->responseData).' type='.$http->incoming_headers['content-type']);
+ return $this->parseResponse($http->incoming_headers, $this->responseData);
+ }
+ break;
+ default:
+ $this->setError('no transport found, or selected transport is not yet supported!');
+ return false;
+ break;
+ }
+ }
+
+ /**
+ * processes SOAP message returned from server
+ *
+ * @param array $headers The HTTP headers
+ * @param string $data unprocessed response data from server
+ * @return mixed value of the message, decoded into a PHP type
+ * @access private
+ */
+ function parseResponse($headers, $data) {
+ $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']);
+ if (!strstr($headers['content-type'], 'text/xml')) {
+ $this->setError('Response not of type text/xml');
+ return false;
+ }
+ if (strpos($headers['content-type'], '=')) {
+ $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1));
+ $this->debug('Got response encoding: ' . $enc);
+ if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){
+ $this->xml_encoding = strtoupper($enc);
+ } else {
+ $this->xml_encoding = 'US-ASCII';
+ }
+ } else {
+ // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1
+ $this->xml_encoding = 'ISO-8859-1';
+ }
+ $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating soap_parser');
+ $parser = new soap_parser($data,$this->xml_encoding,$this->operation,$this->decode_utf8);
+ // add parser debug data to our debug
+ $this->appendDebug($parser->getDebug());
+ // if parse errors
+ if($errstr = $parser->getError()){
+ $this->setError( $errstr);
+ // destroy the parser object
+ unset($parser);
+ return false;
+ } else {
+ // get SOAP headers
+ $this->responseHeaders = $parser->getHeaders();
+ // get decoded message
+ $return = $parser->get_response();
+ // add document for doclit support
+ $this->document = $parser->document;
+ // destroy the parser object
+ unset($parser);
+ // return decode message
+ return $return;
+ }
+ }
+
+ /**
+ * sets the SOAP endpoint, which can override WSDL
+ *
+ * @param $endpoint string The endpoint URL to use, or empty string or false to prevent override
+ * @access public
+ */
+ function setEndpoint($endpoint) {
+ $this->forceEndpoint = $endpoint;
+ }
+
+ /**
+ * set the SOAP headers
+ *
+ * @param $headers mixed String of XML with SOAP header content, or array of soapval objects for SOAP headers
+ * @access public
+ */
+ function setHeaders($headers){
+ $this->requestHeaders = $headers;
+ }
+
+ /**
+ * get the SOAP response headers (namespace resolution incomplete)
+ *
+ * @return string
+ * @access public
+ */
+ function getHeaders(){
+ return $this->responseHeaders;
+ }
+
+ /**
+ * set proxy info here
+ *
+ * @param string $proxyhost
+ * @param string $proxyport
+ * @param string $proxyusername
+ * @param string $proxypassword
+ * @access public
+ */
+ function setHTTPProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') {
+ $this->proxyhost = $proxyhost;
+ $this->proxyport = $proxyport;
+ $this->proxyusername = $proxyusername;
+ $this->proxypassword = $proxypassword;
+ }
+
+ /**
+ * if authenticating, set user credentials here
+ *
+ * @param string $username
+ * @param string $password
+ * @param string $authtype (basic|digest|certificate)
+ * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs)
+ * @access public
+ */
+ function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) {
+ $this->username = $username;
+ $this->password = $password;
+ $this->authtype = $authtype;
+ $this->certRequest = $certRequest;
+ }
+
+ /**
+ * use HTTP encoding
+ *
+ * @param string $enc
+ * @access public
+ */
+ function setHTTPEncoding($enc='gzip, deflate'){
+ $this->http_encoding = $enc;
+ }
+
+ /**
+ * use HTTP persistent connections if possible
+ *
+ * @access public
+ */
+ function useHTTPPersistentConnection(){
+ $this->persistentConnection = true;
+ }
+
+ /**
+ * gets the default RPC parameter setting.
+ * If true, default is that call params are like RPC even for document style.
+ * Each call() can override this value.
+ *
+ * This is no longer used.
+ *
+ * @return boolean
+ * @access public
+ * @deprecated
+ */
+ function getDefaultRpcParams() {
+ return $this->defaultRpcParams;
+ }
+
+ /**
+ * sets the default RPC parameter setting.
+ * If true, default is that call params are like RPC even for document style
+ * Each call() can override this value.
+ *
+ * This is no longer used.
+ *
+ * @param boolean $rpcParams
+ * @access public
+ * @deprecated
+ */
+ function setDefaultRpcParams($rpcParams) {
+ $this->defaultRpcParams = $rpcParams;
+ }
+
+ /**
+ * dynamically creates an instance of a proxy class,
+ * allowing user to directly call methods from wsdl
+ *
+ * @return object soap_proxy object
+ * @access public
+ */
+ function getProxy(){
+ $r = rand();
+ $evalStr = $this->_getProxyClassCode($r);
+ //$this->debug("proxy class: $evalStr";
+ // eval the class
+ eval($evalStr);
+ // instantiate proxy object
+ eval("\$proxy = new soap_proxy_$r('');");
+ // transfer current wsdl data to the proxy thereby avoiding parsing the wsdl twice
+ $proxy->endpointType = 'wsdl';
+ $proxy->wsdlFile = $this->wsdlFile;
+ $proxy->wsdl = $this->wsdl;
+ $proxy->operations = $this->operations;
+ $proxy->defaultRpcParams = $this->defaultRpcParams;
+ // transfer other state
+ $proxy->username = $this->username;
+ $proxy->password = $this->password;
+ $proxy->authtype = $this->authtype;
+ $proxy->proxyhost = $this->proxyhost;
+ $proxy->proxyport = $this->proxyport;
+ $proxy->proxyusername = $this->proxyusername;
+ $proxy->proxypassword = $this->proxypassword;
+ $proxy->timeout = $this->timeout;
+ $proxy->response_timeout = $this->response_timeout;
+ $proxy->http_encoding = $this->http_encoding;
+ $proxy->persistentConnection = $this->persistentConnection;
+ $proxy->requestHeaders = $this->requestHeaders;
+ $proxy->soap_defencoding = $this->soap_defencoding;
+ $proxy->endpoint = $this->endpoint;
+ $proxy->forceEndpoint = $this->forceEndpoint;
+ return $proxy;
+ }
+
+ /**
+ * dynamically creates proxy class code
+ *
+ * @return string PHP/NuSOAP code for the proxy class
+ * @access private
+ */
+ function _getProxyClassCode($r) {
+ if ($this->endpointType != 'wsdl') {
+ $evalStr = 'A proxy can only be created for a WSDL client';
+ $this->setError($evalStr);
+ return $evalStr;
+ }
+ $evalStr = '';
+ foreach ($this->operations as $operation => $opData) {
+ if ($operation != '') {
+ // create param string and param comment string
+ if (sizeof($opData['input']['parts']) > 0) {
+ $paramStr = '';
+ $paramArrayStr = '';
+ $paramCommentStr = '';
+ foreach ($opData['input']['parts'] as $name => $type) {
+ $paramStr .= "\$$name, ";
+ $paramArrayStr .= "'$name' => \$$name, ";
+ $paramCommentStr .= "$type \$$name, ";
+ }
+ $paramStr = substr($paramStr, 0, strlen($paramStr)-2);
+ $paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr)-2);
+ $paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr)-2);
+ } else {
+ $paramStr = '';
+ $paramCommentStr = 'void';
+ }
+ $opData['namespace'] = !isset($opData['namespace']) ? 'http://testuri.com' : $opData['namespace'];
+ $evalStr .= "// $paramCommentStr
+ function " . str_replace('.', '__', $operation) . "($paramStr) {
+ \$params = array($paramArrayStr);
+ return \$this->call('$operation', \$params, '".$opData['namespace']."', '".(isset($opData['soapAction']) ? $opData['soapAction'] : '')."');
+ }
+ ";
+ unset($paramStr);
+ unset($paramCommentStr);
+ }
+ }
+ $evalStr = 'class soap_proxy_'.$r.' extends soapclient {
+ '.$evalStr.'
+}';
+ return $evalStr;
+ }
+
+ /**
+ * dynamically creates proxy class code
+ *
+ * @return string PHP/NuSOAP code for the proxy class
+ * @access public
+ */
+ function getProxyClassCode() {
+ $r = rand();
+ return $this->_getProxyClassCode($r);
+ }
+
+ /**
+ * gets the HTTP body for the current request.
+ *
+ * @param string $soapmsg The SOAP payload
+ * @return string The HTTP body, which includes the SOAP payload
+ * @access private
+ */
+ function getHTTPBody($soapmsg) {
+ return $soapmsg;
+ }
+
+ /**
+ * gets the HTTP content type for the current request.
+ *
+ * Note: getHTTPBody must be called before this.
+ *
+ * @return string the HTTP content type for the current request.
+ * @access private
+ */
+ function getHTTPContentType() {
+ return 'text/xml';
+ }
+
+ /**
+ * gets the HTTP content type charset for the current request.
+ * returns false for non-text content types.
+ *
+ * Note: getHTTPBody must be called before this.
+ *
+ * @return string the HTTP content type charset for the current request.
+ * @access private
+ */
+ function getHTTPContentTypeCharset() {
+ return $this->soap_defencoding;
+ }
+
+ /*
+ * whether or not parser should decode utf8 element content
+ *
+ * @return always returns true
+ * @access public
+ */
+ function decodeUTF8($bool){
+ $this->decode_utf8 = $bool;
+ return true;
+ }
+
+ /**
+ * adds a new Cookie into $this->cookies array
+ *
+ * @param string $name Cookie Name
+ * @param string $value Cookie Value
+ * @return if cookie-set was successful returns true, else false
+ * @access public
+ */
+ function setCookie($name, $value) {
+ if (strlen($name) == 0) {
+ return false;
+ }
+ $this->cookies[] = array('name' => $name, 'value' => $value);
+ return true;
+ }
+
+ /**
+ * gets all Cookies
+ *
+ * @return array with all internal cookies
+ * @access public
+ */
+ function getCookies() {
+ return $this->cookies;
+ }
+
+ /**
+ * checks all Cookies and delete those which are expired
+ *
+ * @return always return true
+ * @access private
+ */
+ function checkCookies() {
+ if (sizeof($this->cookies) == 0) {
+ return true;
+ }
+ $this->debug('checkCookie: check ' . sizeof($this->cookies) . ' cookies');
+ $curr_cookies = $this->cookies;
+ $this->cookies = array();
+ foreach ($curr_cookies as $cookie) {
+ if (! is_array($cookie)) {
+ $this->debug('Remove cookie that is not an array');
+ continue;
+ }
+ if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) {
+ if (strtotime($cookie['expires']) > time()) {
+ $this->cookies[] = $cookie;
+ } else {
+ $this->debug('Remove expired cookie ' . $cookie['name']);
+ }
+ } else {
+ $this->cookies[] = $cookie;
+ }
+ }
+ $this->debug('checkCookie: '.sizeof($this->cookies).' cookies left in array');
+ return true;
+ }
+
+ /**
+ * updates the current cookies with a new set
+ *
+ * @param array $cookies new cookies with which to update current ones
+ * @return always return true
+ * @access private
+ */
+ function UpdateCookies($cookies) {
+ if (sizeof($this->cookies) == 0) {
+ // no existing cookies: take whatever is new
+ if (sizeof($cookies) > 0) {
+ $this->debug('Setting new cookie(s)');
+ $this->cookies = $cookies;
+ }
+ return true;
+ }
+ if (sizeof($cookies) == 0) {
+ // no new cookies: keep what we've got
+ return true;
+ }
+ // merge
+ foreach ($cookies as $newCookie) {
+ if (!is_array($newCookie)) {
+ continue;
+ }
+ if ((!isset($newCookie['name'])) || (!isset($newCookie['value']))) {
+ continue;
+ }
+ $newName = $newCookie['name'];
+
+ $found = false;
+ for ($i = 0; $i < count($this->cookies); $i++) {
+ $cookie = $this->cookies[$i];
+ if (!is_array($cookie)) {
+ continue;
+ }
+ if (!isset($cookie['name'])) {
+ continue;
+ }
+ if ($newName != $cookie['name']) {
+ continue;
+ }
+ $newDomain = isset($newCookie['domain']) ? $newCookie['domain'] : 'NODOMAIN';
+ $domain = isset($cookie['domain']) ? $cookie['domain'] : 'NODOMAIN';
+ if ($newDomain != $domain) {
+ continue;
+ }
+ $newPath = isset($newCookie['path']) ? $newCookie['path'] : 'NOPATH';
+ $path = isset($cookie['path']) ? $cookie['path'] : 'NOPATH';
+ if ($newPath != $path) {
+ continue;
+ }
+ $this->cookies[$i] = $newCookie;
+ $found = true;
+ $this->debug('Update cookie ' . $newName . '=' . $newCookie['value']);
+ break;
+ }
+ if (! $found) {
+ $this->debug('Add cookie ' . $newName . '=' . $newCookie['value']);
+ $this->cookies[] = $newCookie;
+ }
+ }
+ return true;
+ }
+}
+?>
diff --git a/htdocs/includes/nusoap/lib/nusoapmime.php b/htdocs/includes/nusoap/lib/nusoapmime.php
index 7334c9a9317..88fa9946be1 100644
--- a/htdocs/includes/nusoap/lib/nusoapmime.php
+++ b/htdocs/includes/nusoap/lib/nusoapmime.php
@@ -1,478 +1,478 @@
-
-* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list
-* @version $Id$
-* @access public
-*/
-class soapclientmime extends soapclient {
- /**
- * @var array Each array element in the return is an associative array with keys
- * data, filename, contenttype, cid
- * @access private
- */
- var $requestAttachments = array();
- /**
- * @var array Each array element in the return is an associative array with keys
- * data, filename, contenttype, cid
- * @access private
- */
- var $responseAttachments;
- /**
- * @var string
- * @access private
- */
- var $mimeContentType;
-
- /**
- * adds a MIME attachment to the current request.
- *
- * If the $data parameter contains an empty string, this method will read
- * the contents of the file named by the $filename parameter.
- *
- * If the $cid parameter is false, this method will generate the cid.
- *
- * @param string $data The data of the attachment
- * @param string $filename The filename of the attachment (default is empty string)
- * @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream)
- * @param string $cid The content-id (cid) of the attachment (default is false)
- * @return string The content-id (cid) of the attachment
- * @access public
- */
- function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) {
- if (! $cid) {
- $cid = md5(uniqid(time()));
- }
-
- $info['data'] = $data;
- $info['filename'] = $filename;
- $info['contenttype'] = $contenttype;
- $info['cid'] = $cid;
-
- $this->requestAttachments[] = $info;
-
- return $cid;
- }
-
- /**
- * clears the MIME attachments for the current request.
- *
- * @access public
- */
- function clearAttachments() {
- $this->requestAttachments = array();
- }
-
- /**
- * gets the MIME attachments from the current response.
- *
- * Each array element in the return is an associative array with keys
- * data, filename, contenttype, cid. These keys correspond to the parameters
- * for addAttachment.
- *
- * @return array The attachments.
- * @access public
- */
- function getAttachments() {
- return $this->responseAttachments;
- }
-
- /**
- * gets the HTTP body for the current request.
- *
- * @param string $soapmsg The SOAP payload
- * @return string The HTTP body, which includes the SOAP payload
- * @access private
- */
- function getHTTPBody($soapmsg) {
- if (count($this->requestAttachments) > 0) {
- $params['content_type'] = 'multipart/related; type=text/xml';
- $mimeMessage =& new Mail_mimePart('', $params);
- unset($params);
-
- $params['content_type'] = 'text/xml';
- $params['encoding'] = '8bit';
- $params['charset'] = $this->soap_defencoding;
- $mimeMessage->addSubpart($soapmsg, $params);
-
- foreach ($this->requestAttachments as $att) {
- unset($params);
-
- $params['content_type'] = $att['contenttype'];
- $params['encoding'] = 'base64';
- $params['disposition'] = 'attachment';
- $params['dfilename'] = $att['filename'];
- $params['cid'] = $att['cid'];
-
- if ($att['data'] == '' && $att['filename'] <> '') {
- if ($fd = fopen($att['filename'], 'rb')) {
- $data = fread($fd, filesize($att['filename']));
- fclose($fd);
- } else {
- $data = '';
- }
- $mimeMessage->addSubpart($data, $params);
- } else {
- $mimeMessage->addSubpart($att['data'], $params);
- }
- }
-
- $output = $mimeMessage->encode();
- $mimeHeaders = $output['headers'];
-
- foreach ($mimeHeaders as $k => $v) {
- $this->debug("MIME header $k: $v");
- if (strtolower($k) == 'content-type') {
- // PHP header() seems to strip leading whitespace starting
- // the second line, so force everything to one line
- $this->mimeContentType = str_replace("\r\n", " ", $v);
- }
- }
-
- return $output['body'];
- }
-
- return parent::getHTTPBody($soapmsg);
- }
-
- /**
- * gets the HTTP content type for the current request.
- *
- * Note: getHTTPBody must be called before this.
- *
- * @return string the HTTP content type for the current request.
- * @access private
- */
- function getHTTPContentType() {
- if (count($this->requestAttachments) > 0) {
- return $this->mimeContentType;
- }
- return parent::getHTTPContentType();
- }
-
- /**
- * gets the HTTP content type charset for the current request.
- * returns false for non-text content types.
- *
- * Note: getHTTPBody must be called before this.
- *
- * @return string the HTTP content type charset for the current request.
- * @access private
- */
- function getHTTPContentTypeCharset() {
- if (count($this->requestAttachments) > 0) {
- return false;
- }
- return parent::getHTTPContentTypeCharset();
- }
-
- /**
- * processes SOAP message returned from server
- *
- * @param array $headers The HTTP headers
- * @param string $data unprocessed response data from server
- * @return mixed value of the message, decoded into a PHP type
- * @access private
- */
- function parseResponse($headers, $data) {
- $this->debug('Entering parseResponse() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']);
- $this->responseAttachments = array();
- if (strstr($headers['content-type'], 'multipart/related')) {
- $this->debug('Decode multipart/related');
- $input = '';
- foreach ($headers as $k => $v) {
- $input .= "$k: $v\r\n";
- }
- $params['input'] = $input . "\r\n" . $data;
- $params['include_bodies'] = true;
- $params['decode_bodies'] = true;
- $params['decode_headers'] = true;
-
- $structure = Mail_mimeDecode::decode($params);
-
- foreach ($structure->parts as $part) {
- if (!isset($part->disposition)) {
- $this->debug('Have root part of type ' . $part->headers['content-type']);
- $return = parent::parseResponse($part->headers, $part->body);
- } else {
- $this->debug('Have an attachment of type ' . $part->headers['content-type']);
- $info['data'] = $part->body;
- $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : '';
- $info['contenttype'] = $part->headers['content-type'];
- $info['cid'] = $part->headers['content-id'];
- $this->responseAttachments[] = $info;
- }
- }
-
- if (isset($return)) {
- return $return;
- }
-
- $this->setError('No root part found in multipart/related content');
- return;
- }
- $this->debug('Not multipart/related');
- return parent::parseResponse($headers, $data);
- }
-}
-
-/**
-* nusoapservermime server supporting MIME attachments defined at
-* http://www.w3.org/TR/SOAP-attachments. It depends on the PEAR Mail_MIME library.
-*
-* @author Scott Nichol
-* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list
-* @version $Id$
-* @access public
-*/
-class nusoapservermime extends soap_server {
- /**
- * @var array Each array element in the return is an associative array with keys
- * data, filename, contenttype, cid
- * @access private
- */
- var $requestAttachments = array();
- /**
- * @var array Each array element in the return is an associative array with keys
- * data, filename, contenttype, cid
- * @access private
- */
- var $responseAttachments;
- /**
- * @var string
- * @access private
- */
- var $mimeContentType;
-
- /**
- * adds a MIME attachment to the current response.
- *
- * If the $data parameter contains an empty string, this method will read
- * the contents of the file named by the $filename parameter.
- *
- * If the $cid parameter is false, this method will generate the cid.
- *
- * @param string $data The data of the attachment
- * @param string $filename The filename of the attachment (default is empty string)
- * @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream)
- * @param string $cid The content-id (cid) of the attachment (default is false)
- * @return string The content-id (cid) of the attachment
- * @access public
- */
- function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) {
- if (! $cid) {
- $cid = md5(uniqid(time()));
- }
-
- $info['data'] = $data;
- $info['filename'] = $filename;
- $info['contenttype'] = $contenttype;
- $info['cid'] = $cid;
-
- $this->responseAttachments[] = $info;
-
- return $cid;
- }
-
- /**
- * clears the MIME attachments for the current response.
- *
- * @access public
- */
- function clearAttachments() {
- $this->responseAttachments = array();
- }
-
- /**
- * gets the MIME attachments from the current request.
- *
- * Each array element in the return is an associative array with keys
- * data, filename, contenttype, cid. These keys correspond to the parameters
- * for addAttachment.
- *
- * @return array The attachments.
- * @access public
- */
- function getAttachments() {
- return $this->requestAttachments;
- }
-
- /**
- * gets the HTTP body for the current response.
- *
- * @param string $soapmsg The SOAP payload
- * @return string The HTTP body, which includes the SOAP payload
- * @access private
- */
- function getHTTPBody($soapmsg) {
- if (count($this->responseAttachments) > 0) {
- $params['content_type'] = 'multipart/related; type=text/xml';
- $mimeMessage =& new Mail_mimePart('', $params);
- unset($params);
-
- $params['content_type'] = 'text/xml';
- $params['encoding'] = '8bit';
- $params['charset'] = $this->soap_defencoding;
- $mimeMessage->addSubpart($soapmsg, $params);
-
- foreach ($this->responseAttachments as $att) {
- unset($params);
-
- $params['content_type'] = $att['contenttype'];
- $params['encoding'] = 'base64';
- $params['disposition'] = 'attachment';
- $params['dfilename'] = $att['filename'];
- $params['cid'] = $att['cid'];
-
- if ($att['data'] == '' && $att['filename'] <> '') {
- if ($fd = fopen($att['filename'], 'rb')) {
- $data = fread($fd, filesize($att['filename']));
- fclose($fd);
- } else {
- $data = '';
- }
- $mimeMessage->addSubpart($data, $params);
- } else {
- $mimeMessage->addSubpart($att['data'], $params);
- }
- }
-
- $output = $mimeMessage->encode();
- $mimeHeaders = $output['headers'];
-
- foreach ($mimeHeaders as $k => $v) {
- $this->debug("MIME header $k: $v");
- if (strtolower($k) == 'content-type') {
- // PHP header() seems to strip leading whitespace starting
- // the second line, so force everything to one line
- $this->mimeContentType = str_replace("\r\n", " ", $v);
- }
- }
-
- return $output['body'];
- }
-
- return parent::getHTTPBody($soapmsg);
- }
-
- /**
- * gets the HTTP content type for the current response.
- *
- * Note: getHTTPBody must be called before this.
- *
- * @return string the HTTP content type for the current response.
- * @access private
- */
- function getHTTPContentType() {
- if (count($this->responseAttachments) > 0) {
- return $this->mimeContentType;
- }
- return parent::getHTTPContentType();
- }
-
- /**
- * gets the HTTP content type charset for the current response.
- * returns false for non-text content types.
- *
- * Note: getHTTPBody must be called before this.
- *
- * @return string the HTTP content type charset for the current response.
- * @access private
- */
- function getHTTPContentTypeCharset() {
- if (count($this->responseAttachments) > 0) {
- return false;
- }
- return parent::getHTTPContentTypeCharset();
- }
-
- /**
- * processes SOAP message received from client
- *
- * @param array $headers The HTTP headers
- * @param string $data unprocessed request data from client
- * @return mixed value of the message, decoded into a PHP type
- * @access private
- */
- function parseRequest($headers, $data) {
- $this->debug('Entering parseRequest() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']);
- $this->requestAttachments = array();
- if (strstr($headers['content-type'], 'multipart/related')) {
- $this->debug('Decode multipart/related');
- $input = '';
- foreach ($headers as $k => $v) {
- $input .= "$k: $v\r\n";
- }
- $params['input'] = $input . "\r\n" . $data;
- $params['include_bodies'] = true;
- $params['decode_bodies'] = true;
- $params['decode_headers'] = true;
-
- $structure = Mail_mimeDecode::decode($params);
-
- foreach ($structure->parts as $part) {
- if (!isset($part->disposition)) {
- $this->debug('Have root part of type ' . $part->headers['content-type']);
- $return = parent::parseRequest($part->headers, $part->body);
- } else {
- $this->debug('Have an attachment of type ' . $part->headers['content-type']);
- $info['data'] = $part->body;
- $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : '';
- $info['contenttype'] = $part->headers['content-type'];
- $info['cid'] = $part->headers['content-id'];
- $this->requestAttachments[] = $info;
- }
- }
-
- if (isset($return)) {
- return $return;
- }
-
- $this->setError('No root part found in multipart/related content');
- return;
- }
- $this->debug('Not multipart/related');
- return parent::parseRequest($headers, $data);
- }
-}
-?>
+
+* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list
+* @version $Id$
+* @access public
+*/
+class soapclientmime extends soapclient {
+ /**
+ * @var array Each array element in the return is an associative array with keys
+ * data, filename, contenttype, cid
+ * @access private
+ */
+ var $requestAttachments = array();
+ /**
+ * @var array Each array element in the return is an associative array with keys
+ * data, filename, contenttype, cid
+ * @access private
+ */
+ var $responseAttachments;
+ /**
+ * @var string
+ * @access private
+ */
+ var $mimeContentType;
+
+ /**
+ * adds a MIME attachment to the current request.
+ *
+ * If the $data parameter contains an empty string, this method will read
+ * the contents of the file named by the $filename parameter.
+ *
+ * If the $cid parameter is false, this method will generate the cid.
+ *
+ * @param string $data The data of the attachment
+ * @param string $filename The filename of the attachment (default is empty string)
+ * @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream)
+ * @param string $cid The content-id (cid) of the attachment (default is false)
+ * @return string The content-id (cid) of the attachment
+ * @access public
+ */
+ function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) {
+ if (! $cid) {
+ $cid = md5(uniqid(time()));
+ }
+
+ $info['data'] = $data;
+ $info['filename'] = $filename;
+ $info['contenttype'] = $contenttype;
+ $info['cid'] = $cid;
+
+ $this->requestAttachments[] = $info;
+
+ return $cid;
+ }
+
+ /**
+ * clears the MIME attachments for the current request.
+ *
+ * @access public
+ */
+ function clearAttachments() {
+ $this->requestAttachments = array();
+ }
+
+ /**
+ * gets the MIME attachments from the current response.
+ *
+ * Each array element in the return is an associative array with keys
+ * data, filename, contenttype, cid. These keys correspond to the parameters
+ * for addAttachment.
+ *
+ * @return array The attachments.
+ * @access public
+ */
+ function getAttachments() {
+ return $this->responseAttachments;
+ }
+
+ /**
+ * gets the HTTP body for the current request.
+ *
+ * @param string $soapmsg The SOAP payload
+ * @return string The HTTP body, which includes the SOAP payload
+ * @access private
+ */
+ function getHTTPBody($soapmsg) {
+ if (count($this->requestAttachments) > 0) {
+ $params['content_type'] = 'multipart/related; type=text/xml';
+ $mimeMessage =& new Mail_mimePart('', $params);
+ unset($params);
+
+ $params['content_type'] = 'text/xml';
+ $params['encoding'] = '8bit';
+ $params['charset'] = $this->soap_defencoding;
+ $mimeMessage->addSubpart($soapmsg, $params);
+
+ foreach ($this->requestAttachments as $att) {
+ unset($params);
+
+ $params['content_type'] = $att['contenttype'];
+ $params['encoding'] = 'base64';
+ $params['disposition'] = 'attachment';
+ $params['dfilename'] = $att['filename'];
+ $params['cid'] = $att['cid'];
+
+ if ($att['data'] == '' && $att['filename'] <> '') {
+ if ($fd = fopen($att['filename'], 'rb')) {
+ $data = fread($fd, filesize($att['filename']));
+ fclose($fd);
+ } else {
+ $data = '';
+ }
+ $mimeMessage->addSubpart($data, $params);
+ } else {
+ $mimeMessage->addSubpart($att['data'], $params);
+ }
+ }
+
+ $output = $mimeMessage->encode();
+ $mimeHeaders = $output['headers'];
+
+ foreach ($mimeHeaders as $k => $v) {
+ $this->debug("MIME header $k: $v");
+ if (strtolower($k) == 'content-type') {
+ // PHP header() seems to strip leading whitespace starting
+ // the second line, so force everything to one line
+ $this->mimeContentType = str_replace("\r\n", " ", $v);
+ }
+ }
+
+ return $output['body'];
+ }
+
+ return parent::getHTTPBody($soapmsg);
+ }
+
+ /**
+ * gets the HTTP content type for the current request.
+ *
+ * Note: getHTTPBody must be called before this.
+ *
+ * @return string the HTTP content type for the current request.
+ * @access private
+ */
+ function getHTTPContentType() {
+ if (count($this->requestAttachments) > 0) {
+ return $this->mimeContentType;
+ }
+ return parent::getHTTPContentType();
+ }
+
+ /**
+ * gets the HTTP content type charset for the current request.
+ * returns false for non-text content types.
+ *
+ * Note: getHTTPBody must be called before this.
+ *
+ * @return string the HTTP content type charset for the current request.
+ * @access private
+ */
+ function getHTTPContentTypeCharset() {
+ if (count($this->requestAttachments) > 0) {
+ return false;
+ }
+ return parent::getHTTPContentTypeCharset();
+ }
+
+ /**
+ * processes SOAP message returned from server
+ *
+ * @param array $headers The HTTP headers
+ * @param string $data unprocessed response data from server
+ * @return mixed value of the message, decoded into a PHP type
+ * @access private
+ */
+ function parseResponse($headers, $data) {
+ $this->debug('Entering parseResponse() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']);
+ $this->responseAttachments = array();
+ if (strstr($headers['content-type'], 'multipart/related')) {
+ $this->debug('Decode multipart/related');
+ $input = '';
+ foreach ($headers as $k => $v) {
+ $input .= "$k: $v\r\n";
+ }
+ $params['input'] = $input . "\r\n" . $data;
+ $params['include_bodies'] = true;
+ $params['decode_bodies'] = true;
+ $params['decode_headers'] = true;
+
+ $structure = Mail_mimeDecode::decode($params);
+
+ foreach ($structure->parts as $part) {
+ if (!isset($part->disposition)) {
+ $this->debug('Have root part of type ' . $part->headers['content-type']);
+ $return = parent::parseResponse($part->headers, $part->body);
+ } else {
+ $this->debug('Have an attachment of type ' . $part->headers['content-type']);
+ $info['data'] = $part->body;
+ $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : '';
+ $info['contenttype'] = $part->headers['content-type'];
+ $info['cid'] = $part->headers['content-id'];
+ $this->responseAttachments[] = $info;
+ }
+ }
+
+ if (isset($return)) {
+ return $return;
+ }
+
+ $this->setError('No root part found in multipart/related content');
+ return;
+ }
+ $this->debug('Not multipart/related');
+ return parent::parseResponse($headers, $data);
+ }
+}
+
+/**
+* nusoapservermime server supporting MIME attachments defined at
+* http://www.w3.org/TR/SOAP-attachments. It depends on the PEAR Mail_MIME library.
+*
+* @author Scott Nichol
+* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list
+* @version $Id$
+* @access public
+*/
+class nusoapservermime extends soap_server {
+ /**
+ * @var array Each array element in the return is an associative array with keys
+ * data, filename, contenttype, cid
+ * @access private
+ */
+ var $requestAttachments = array();
+ /**
+ * @var array Each array element in the return is an associative array with keys
+ * data, filename, contenttype, cid
+ * @access private
+ */
+ var $responseAttachments;
+ /**
+ * @var string
+ * @access private
+ */
+ var $mimeContentType;
+
+ /**
+ * adds a MIME attachment to the current response.
+ *
+ * If the $data parameter contains an empty string, this method will read
+ * the contents of the file named by the $filename parameter.
+ *
+ * If the $cid parameter is false, this method will generate the cid.
+ *
+ * @param string $data The data of the attachment
+ * @param string $filename The filename of the attachment (default is empty string)
+ * @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream)
+ * @param string $cid The content-id (cid) of the attachment (default is false)
+ * @return string The content-id (cid) of the attachment
+ * @access public
+ */
+ function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) {
+ if (! $cid) {
+ $cid = md5(uniqid(time()));
+ }
+
+ $info['data'] = $data;
+ $info['filename'] = $filename;
+ $info['contenttype'] = $contenttype;
+ $info['cid'] = $cid;
+
+ $this->responseAttachments[] = $info;
+
+ return $cid;
+ }
+
+ /**
+ * clears the MIME attachments for the current response.
+ *
+ * @access public
+ */
+ function clearAttachments() {
+ $this->responseAttachments = array();
+ }
+
+ /**
+ * gets the MIME attachments from the current request.
+ *
+ * Each array element in the return is an associative array with keys
+ * data, filename, contenttype, cid. These keys correspond to the parameters
+ * for addAttachment.
+ *
+ * @return array The attachments.
+ * @access public
+ */
+ function getAttachments() {
+ return $this->requestAttachments;
+ }
+
+ /**
+ * gets the HTTP body for the current response.
+ *
+ * @param string $soapmsg The SOAP payload
+ * @return string The HTTP body, which includes the SOAP payload
+ * @access private
+ */
+ function getHTTPBody($soapmsg) {
+ if (count($this->responseAttachments) > 0) {
+ $params['content_type'] = 'multipart/related; type=text/xml';
+ $mimeMessage =& new Mail_mimePart('', $params);
+ unset($params);
+
+ $params['content_type'] = 'text/xml';
+ $params['encoding'] = '8bit';
+ $params['charset'] = $this->soap_defencoding;
+ $mimeMessage->addSubpart($soapmsg, $params);
+
+ foreach ($this->responseAttachments as $att) {
+ unset($params);
+
+ $params['content_type'] = $att['contenttype'];
+ $params['encoding'] = 'base64';
+ $params['disposition'] = 'attachment';
+ $params['dfilename'] = $att['filename'];
+ $params['cid'] = $att['cid'];
+
+ if ($att['data'] == '' && $att['filename'] <> '') {
+ if ($fd = fopen($att['filename'], 'rb')) {
+ $data = fread($fd, filesize($att['filename']));
+ fclose($fd);
+ } else {
+ $data = '';
+ }
+ $mimeMessage->addSubpart($data, $params);
+ } else {
+ $mimeMessage->addSubpart($att['data'], $params);
+ }
+ }
+
+ $output = $mimeMessage->encode();
+ $mimeHeaders = $output['headers'];
+
+ foreach ($mimeHeaders as $k => $v) {
+ $this->debug("MIME header $k: $v");
+ if (strtolower($k) == 'content-type') {
+ // PHP header() seems to strip leading whitespace starting
+ // the second line, so force everything to one line
+ $this->mimeContentType = str_replace("\r\n", " ", $v);
+ }
+ }
+
+ return $output['body'];
+ }
+
+ return parent::getHTTPBody($soapmsg);
+ }
+
+ /**
+ * gets the HTTP content type for the current response.
+ *
+ * Note: getHTTPBody must be called before this.
+ *
+ * @return string the HTTP content type for the current response.
+ * @access private
+ */
+ function getHTTPContentType() {
+ if (count($this->responseAttachments) > 0) {
+ return $this->mimeContentType;
+ }
+ return parent::getHTTPContentType();
+ }
+
+ /**
+ * gets the HTTP content type charset for the current response.
+ * returns false for non-text content types.
+ *
+ * Note: getHTTPBody must be called before this.
+ *
+ * @return string the HTTP content type charset for the current response.
+ * @access private
+ */
+ function getHTTPContentTypeCharset() {
+ if (count($this->responseAttachments) > 0) {
+ return false;
+ }
+ return parent::getHTTPContentTypeCharset();
+ }
+
+ /**
+ * processes SOAP message received from client
+ *
+ * @param array $headers The HTTP headers
+ * @param string $data unprocessed request data from client
+ * @return mixed value of the message, decoded into a PHP type
+ * @access private
+ */
+ function parseRequest($headers, $data) {
+ $this->debug('Entering parseRequest() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']);
+ $this->requestAttachments = array();
+ if (strstr($headers['content-type'], 'multipart/related')) {
+ $this->debug('Decode multipart/related');
+ $input = '';
+ foreach ($headers as $k => $v) {
+ $input .= "$k: $v\r\n";
+ }
+ $params['input'] = $input . "\r\n" . $data;
+ $params['include_bodies'] = true;
+ $params['decode_bodies'] = true;
+ $params['decode_headers'] = true;
+
+ $structure = Mail_mimeDecode::decode($params);
+
+ foreach ($structure->parts as $part) {
+ if (!isset($part->disposition)) {
+ $this->debug('Have root part of type ' . $part->headers['content-type']);
+ $return = parent::parseRequest($part->headers, $part->body);
+ } else {
+ $this->debug('Have an attachment of type ' . $part->headers['content-type']);
+ $info['data'] = $part->body;
+ $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : '';
+ $info['contenttype'] = $part->headers['content-type'];
+ $info['cid'] = $part->headers['content-id'];
+ $this->requestAttachments[] = $info;
+ }
+ }
+
+ if (isset($return)) {
+ return $return;
+ }
+
+ $this->setError('No root part found in multipart/related content');
+ return;
+ }
+ $this->debug('Not multipart/related');
+ return parent::parseRequest($headers, $data);
+ }
+}
+?>
diff --git a/htdocs/includes/phplot5/.cvsignore b/htdocs/includes/phplot5/.cvsignore
index 6554a8fb276..9204e9e8ec2 100644
--- a/htdocs/includes/phplot5/.cvsignore
+++ b/htdocs/includes/phplot5/.cvsignore
@@ -1,2 +1,2 @@
-doc
-examples
+doc
+examples
diff --git a/htdocs/includes/scriptaculous/.cvsignore b/htdocs/includes/scriptaculous/.cvsignore
index 77356c31404..9daeafb9864 100644
--- a/htdocs/includes/scriptaculous/.cvsignore
+++ b/htdocs/includes/scriptaculous/.cvsignore
@@ -1 +1 @@
-test
+test
diff --git a/htdocs/langs/fr_BE/html/gpl.txt b/htdocs/langs/fr_BE/html/gpl.txt
index 63329a6aa74..ed06504c983 100644
--- a/htdocs/langs/fr_BE/html/gpl.txt
+++ b/htdocs/langs/fr_BE/html/gpl.txt
@@ -1,390 +1,390 @@
GNU GENERAL PUBLIC LICENSE
-
-Traduction de R.Cougnec et M.Makarévitch
-
-Introduction :
-This is an unofficial translation of the GNU General Public License into
-French. It was not published by the Free Software Foundation, and does not
-legally state the distribution terms for software that uses the GNU
-GPL--only the original English text of the GNU GPL does that. However, we
-hope that this translation will help French speakers understand the GNU GPL
-better.
-
-Voici une adaptation non officielle de la Licence Publique Générale du
-projet GNU. Elle n'a pas été publiée par la Free Software Foundation et son
-contenu n'a aucune portée légale car seule la version anglaise de ce
-document détaille le mode de distribution des logiciels sous GNU GPL. Nous
-espérons cependant qu'elle permettra aux francophones de mieux comprendre
-la GPL.
-
- -Licence Publique Générale GNU Version 2, Juin 1991-
-
-Copyright (c) Free Software Foundation, Inc.
-59 Temple Place, Suite 330,
-Boston, MA 02111-1307
-États-Unis, 1989, 1991.
-La copie et la distribution de copies exactes de ce document sont
-autorisées, mais aucune modification n'est permise.
-
- Préambule
-
-Les licences d'utilisation de la plupart des programmes sont définies pour
-limiter ou supprimer toute liberté à l'utilisateur. À l'inverse, la
-Licence Publique Générale (General Public License) est destinée à vous
-garantir la liberté de partager et de modifier les logiciels libres, et de
-s'assurer que ces logiciels sont effectivement accessibles à tout
-utilisateur.
-
-Cette Licence Publique Générale s'applique à la plupart des programmes de
-la Free Software Foundation, comme à tout autre programme dont l'auteur
-l'aura décidé (d'autres logiciels de la FSF sont couverts pour leur part
-par la Licence Publique Générale pour Bibliothèques GNU (LGPL)). Vous
-pouvez aussi appliquer les termes de cette Licence à vos propres
-programmes, si vous le désirez.
-
- _Liberté des logiciels ne signifie pas nécessairement
-gratuité. Notre Licence est conçue pour vous assurer la liberté de
-distribuer des copies des programmes, gratuitement ou non, de recevoir le
-code source ou de pouvoir l'obtenir, de modifier les programmes ou d'en
-utiliser des éléments dans de nouveaux programmes libres, en sachant que
-vous y êtes autorisé.
-
-Afin de garantir ces droits, nous avons dû introduire des restrictions
-interdisant à quiconque de vous les refuser ou de vous demander d'y
-renoncer. Ces restrictions vous imposent en retour certaines obligations si
-vous distribuez ou modifiez des copies de programmes protégés par la
-Licence. En d'autre termes, il vous incombera en ce cas de :
-
- -transmettre aux destinataires tous les droits que vous possédez,
- -expédier aux destinataires le code source ou bien tenir celui-ci à
- leur disposition,
- -leur remettre cette Licence afin qu'ils prennent connaissance de
- leurs droits.
-
-
-Nous protégeons vos droits de deux façons : d'abord par le copyright
-du logiciel, ensuite par la remise de cette Licence qui vous autorise
-légalement à copier, distribuer et/ou modifier le logiciel.
-
-En outre, pour protéger chaque auteur ainsi que la FSF, nous affirmons
-solennellement que le programme concerné ne fait l'objet d'aucune garantie.
-Si un tiers le modifie puis le redistribue, tous ceux qui en recevront une
-copie doivent savoir qu'il ne s'agit pas de l'original afin qu'une copie
-défectueuse n'entache pas la réputation de l'auteur du logiciel.
-
-Enfin, tout programme libre est sans cesse menacé par des dépôts de
-brevets. Nous souhaitons à tout prix éviter que des distributeurs puissent
-déposer des brevets sur les Logiciels Libres pour leur propre compte. Pour
-éviter cela, nous stipulons bien que tout dépôt éventuel de brevet doit
-accorder expressément à tout un chacun le libre usage du produit.
-
-Les dispositions précises et les conditions de copie, de distribution et de
-modification de nos logiciels sont les suivantes :
-
- Stipulations et conditions relatives à la copie, la distribution et la modification
-
-
- _Article 0.
- La présente Licence s'applique à tout Programme (ou autre travail) où
- figure une note, placée par le détenteur des droits, stipulant que ledit
- Programme ou travail peut être distribué selon les termes de la présente
- Licence. Le terme Programme désigne aussi bien le Programme
- lui-même que tout travail qui en est dérivé selon la loi, c'est-à-dire
- tout ouvrage reproduisant le Programme ou une partie de celui-ci, à
- l'identique ou bien modifié, et/ou traduit dans une autre langue (la
- traduction est considérée comme une modification). Chaque personne
- concernée par la Licence Publique Générale sera désignée par le terme
- Vous.
-
- Les activités autres que copie, distribution et modification ne sont pas
- couvertes par la présente Licence et sortent de son cadre. Rien ne
- restreint l'utilisation du Programme et les données issues de celui-ci ne
- sont couvertes que si leur contenu constitue un travail basé sur le
- logiciel (indépendemment du fait d'avoir été réalisé en lançant le
- Programme). Tout dépend de ce que le Programme est censé produire.
-
- _Article 1.
- Vous pouvez copier et distribuer des copies conformes du code source du
- Programme, tel que Vous l'avez reçu, sur n'importe quel support, à
- condition de placer sur chaque copie un copyright approprié et une
- restriction de garantie, de ne pas modifier ou omettre toutes les
- stipulations se référant à la présente Licence et à la limitation de
- garantie, et de fournir avec toute copie du Programme un exemplaire de la
- Licence.
-
- Vous pouvez demander une rétribution financière pour la réalisation de la
- copie et demeurez libre de proposer une garantie assurée par vos soins,
- moyennant finances.
-
- _Article 2.
- Vous pouvez modifier votre copie ou vos copies du Programme ou partie de
- celui-ci, ou d'un travail basé sur ce Programme, et copier et distribuer
- ces modifications selon les termes de l'article 1, à condition de Vous
- conformer également aux conditions suivantes :
-
-
- a) Ajouter aux fichiers modifiés l'indication très claire des
- modifications effectuées, ainsi que la date de chaque changement.
-
- b) Distribuer sous les termes de la Licence Publique Générale
- l'ensemble de toute réalisation contenant tout ou partie du
- Programme, avec ou sans modifications.
- c) Si le Programme modifié lit des commandes de manière interactive
- lors de son exécution, faire en sorte qu'il affiche, lors d'une
- invocation ordinaire, le copyright approprié en indiquant
- clairement la limitation de garantie (ou la garantie que Vous Vous
- engagez à fournir Vous-même), qu'il stipule que tout utilisateur
- peut librement redistribuer le Programme selon les conditions de la
- Licence Publique Générale GNU, et qu'il montre à tout utilisateur
- comment lire une copie de celle-ci (exception : si le
- Programme original est interactif mais n'affiche pas un tel
- message en temps normal, tout travail dérivé de ce Programme ne
- sera pas non plus contraint de l'afficher).
-
- Toutes ces conditions s'appliquent à l'ensemble des modifications. Si des
- éléments identifiables de ce travail ne sont pas dérivés du Programme
- et peuvent être raisonnablement considérés comme indépendants, la
- présente Licence ne s'applique pas à ces éléments lorsque Vous les
- distribuez seuls.
- Mais, si Vous distribuez ces mêmes éléments comme partie d'un ensemble
- cohérent dont le reste est basé sur un Programme soumis à la Licence, ils
- lui sont également soumis, et la Licence s'étend ainsi à l'ensemble du
- produit, quel qu'en soit l'auteur.
-
- Cet article n'a pas pour but de s'approprier ou de contester vos
- droits sur un travail entièrement réalisé par Vous, mais plutôt
- d'ouvrir droit à un contrôle de la libre distribution de tout travail
- dérivé ou collectif basé sur le Programme.
-
- En outre, toute fusion d'un autre travail, non basé sur le Programme,
- avec le Programme (ou avec un travail dérivé de ce dernier),
- effectuée sur un support de stockage ou de distribution, ne fait pas
- tomber cet autre travail sous le contrôle de la Licence.
-
- _Article 3.
- Vous pouvez copier et distribuer le Programme (ou tout travail dérivé
- selon les conditions énoncées dans l'article 1) sous forme de code
- objet ou exécutable, selon les termes des articles 0 et 1, à
- condition de respecter les clauses suivantes :
-
-
- a) Fournir le code source complet du Programme,
- sous une forme lisible par un ordinateur et selon les termes des
- articles 0 et 1, sur un support habituellement utilisé pour
- l'échange de données ou,
-
- b) Faire une offre écrite, valable pendant au moins trois ans,
- prévoyant de donner à tout tiers qui en fera la demande une copie,
- sous forme lisible par un ordinateur, du code source correspondant,
- pour un tarif n'excédant pas le coût de la copie, selon
- les termes des articles 0 et 1, sur un support couramment utilisé
- pour l'échange de données informatiques ou,
-
- c) Informer le destinataire de l'endroit où le code source peut
- être obtenu (cette solution n'est recevable que dans le cas d'une
- distribution non commerciale, et uniquement si Vous avez reçu le
- Programme sous forme de code objet ou exécutable avec l'offre
- prévue à l'alinéa b ci-dessus).
-
-
- Le code source d'un travail désigne la forme de cet ouvrage sous laquelle
- les modifications sont les plus aisées. Sont ainsi désignés la totalité
- du code source de tous les modules composant un Programme exécutable, de
- même que tout fichier de définition associé, ainsi que les scripts
- utilisés pour effectuer la compilation et l'installation du Programme
- exécutable. Toutefois, l'environnement standard de développement du
- système d'exploitation mis en oeuvre (source ou binaire) -- compilateurs,
- bibliothèques, noyau, etc. -- constitue une exception, sauf si ces
- éléments sont diffusés en même temps que le Programme exécutable.
-
- Si la distribution de l'exécutable ou du code objet consiste à offrir un
- accès permettant de copier le Programme depuis un endroit particulier,
- l'offre d'un accès équivalent pour se procurer le code source au même
- endroit est considéré comme une distribution de ce code source, même si
- l'utilisateur choisit de ne pas profiter de cette offre.
-
- _Article 4.
- Vous ne pouvez pas copier, modifier, céder, déposer ou distribuer le
- Programme d'une autre manière que l'autorise la Licence Publique Générale.
- Toute tentative de ce type annule immédiatement vos droits d'utilisation du
- Programme sous cette Licence. Toutefois, les tiers ayant reçu de Vous
- des copies du Programme ou le droit d'utiliser ces copies continueront à
- bénéficier de leur droit d'utilisation tant qu'ils respecteront pleinement
- les conditions de la Licence.
-
- _Article 5.
- Ne l'ayant pas signée, Vous n'êtes pas obligé d'accepter cette
- Licence. Cependant, rien d'autre ne Vous autorise à modifier ou distribuer
- le Programme ou quelque travaux dérivés : la loi l'interdit tant que Vous
- n'acceptez pas les termes de cette Licence. En conséquence, en modifiant
- ou en distribuant le Programme (ou tout travail basé sur lui), Vous
- acceptez implicitement tous les termes et conditions de cette Licence.
-
- _Article 6.
- La diffusion d'un Programme (ou de tout travail dérivé) suppose l'envoi
- simultané d'une licence autorisant la copie, la distribution ou la
- modification du Programme, aux termes et conditions de la Licence. Vous
- n'avez pas le droit d'imposer de restrictions supplémentaires aux droits
- transmis au destinataire. Vous n'êtes pas responsable du respect de la
- Licence par un tiers.
-
- _Article 7.
- Si, à la suite d'une décision de Justice, d'une plainte en contrefaçon ou
- pour toute autre raison (liée ou non à la contrefaçon), des conditions Vous
- sont imposées (que ce soit par ordonnance, accord amiable ou autre) qui se
- révèlent incompatibles avec les termes de la présente Licence, Vous n'êtes
- pas pour autant dégagé des obligations liées à celle-ci : si Vous ne
- pouvez concilier vos obligations légales ou autres avec les conditions de
- cette Licence, Vous ne devez pas distribuer le Programme.
-
- Si une partie quelconque de cet article est invalidée ou inapplicable
- pour quelque raison que ce soit, le reste de l'article continue de
- s'appliquer et l'intégralité de l'article s'appliquera en toute autre
- circonstance.
-
- Le présent article n'a pas pour but de Vous pousser à enfreindre des
- droits ou des dispositions légales ni en contester la validité ;
- son seul objectif est de protéger l'intégrité du système de
- distribution du Logiciel Libre. De nombreuses personnes ont
- généreusement contribué à la large gamme de Programmes distribuée
- de cette façon en toute confiance il appartient à chaque
- auteur/donateur de décider de diffuser ses Programmes selon les critères
- de son choix.
-
- _Article 8.
- Si la distribution et/ou l'utilisation du Programme est limitée dans
- certains pays par des brevets ou des droits sur des interfaces, le
- détenteur original des droits qui place le Programme sous la Licence
- Publique Générale peut ajouter explicitement une clause de limitation
- géographique excluant ces pays. Dans ce cas, cette clause devient une
- partie intégrante de la Licence.
-
- _Article 9.
- La Free Software Foundation se réserve le droit de publier périodiquement
- des mises à jour ou de nouvelles versions de la Licence. Rédigées dans le
- même esprit que la présente version, elles seront cependant susceptibles
- d'en modifier certains détails à mesure que de nouveaux problèmes se font
- jour.
-
- Chaque version possède un numéro distinct. Si le Programme précise un
- numéro de version de cette Licence et « toute version ultérieure », Vous
- avez le choix de suivre les termes et conditions de cette version ou de
- toute autre version plus récente publiée par la Free Software Foundation.
- Si le Programme ne spécifie aucun numéro de version, Vous pouvez alors
- choisir l'une quelconque des versions publiées par la Free Software
- Foundation.
-
-
- _Article 10.
- Si Vous désirez incorporer des éléments du Programme dans d'autres
- Programmes libres dont les conditions de distribution diffèrent, Vous devez
- écrire à l'auteur pour lui en demander la permission. Pour ce qui est des
- Programmes directement déposés par la Free Software Foundation,
- écrivez-nous : une exception est toujours envisageable. Notre décision
- sera basée sur notre volonté de préserver la liberté de notre Programme ou
- de ses dérivés et celle de promouvoir le partage et la réutilisation du
- logiciel en général.
-
-
- LIMITATION DE GARANTIE
-
-
- _Article 11.
-
- Parce que l'utilisation de ce Programme est libre et gratuite, aucune
- garantie n'est fournie, comme le permet la loi. Sauf mention écrite, les
- détenteurs du copyright et/ou les tiers fournissent le Programme en l'état,
- sans aucune sorte de garantie explicite ou implicite, y compris les
- garanties de commercialisation ou d'adaptation dans un but
- particulier. Vous assumez tous les risques quant à la qualité et aux effets
- du Programme. Si le Programme est défectueux, Vous assumez le coût de tous
- les services, corrections ou réparations nécessaires.
-
-
- _Article 12.
- Sauf lorsqu'explicitement prévu par la Loi ou accepté par écrit, ni le
- détenteur des droits, ni quiconque autorisé à modifier et/ou redistribuer
- le Programme comme il est permis ci-dessus ne pourra être tenu pour
- responsable de tout dommage direct, indirect, secondaire ou accessoire
- (pertes financières dues au manque à gagner, à l'interruption d'activités
- ou à la perte de données, etc., découlant de l'utilisation du Programme ou
- de l'impossibilité d'utiliser celui-ci).
-
-
-
- FIN DES TERMES ET CONDITIONS
-
- Comment appliquer ces directives à vos nouveaux programmes
-
-Si vous développez un nouveau programme et désirez en faire bénéficier tout
-un chacun, la meilleure méthode est d'en faire un Logiciel Libre que tout
-le monde pourra redistribuer et modifier selon les termes de la Licence
-Publique Générale.
-
-Pour cela, insérez les indications suivantes dans votre programme (il est
-préférable et plus sûr de les faire figurer au début de chaque fichier
-source dans tous les cas, chaque module source devra comporter au
-minimum la ligne de « copyright » et indiquer où résident toutes les
-autres indications):
-
-
-((une ligne pour donner le nom du programme et donner une idée de
-sa finalité))
-Copyright (C) 19xx ((nom de l'auteur))
-
-Ce programme est libre, vous pouvez le redistribuer et/ou le modifier
-selon les termes de la Licence Publique Générale GNU publiée par la
-Free Software Foundation (version 2 ou bien toute autre version
-ultérieure choisie par vous).
-
-Ce programme est distribué car potentiellement utile, mais SANS AUCUNE
-GARANTIE, ni explicite ni implicite, y compris les garanties de
-commercialisation ou d'adaptation dans un but spécifique.
-Reportez-vous à la Licence Publique Générale GNU pour plus de détails.
-
-Vous devez avoir reçu une copie de la Licence Publique Générale GNU
-en même temps que ce programme si ce n'est pas le cas, écrivez à la
-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-02111-1307, États-Unis.
-
-
-Ajoutez également votre adresse électronique, le cas échéant, ainsi que
-votre adresse postale.
-
-Si le programme est interactif, faites-lui afficher un court avertissement
-du type de celui-ci à chaque invocation:
-
-
-...(nom du programme) version 69, Copyright (C) 19aa nom de l'auteur
-
-...(nom du programme) est fourni sans AUCUNE GARANTIE.
-Pour plus de détails, tapez `g'.
-
-Ce programme est libre et vous êtes encouragé à le redistribuer
-sous certaines conditions tapez `c' pour plus de détails.
-
-Les commandes hypothétiques `g' et `c' doivent afficher les sections
-appropriées de la Licence Publique Générale GNU. Bien entendu, vous pouvez
-implanter ces commandes comme bon vous semble : options dans un menu,
-ou bien accessibles d'un clic de souris, etc., tout dépend de votre
-programme.
-
-Si vous officiez en tant que programmeur, n'omettez pas de demander à votre
-employeur, votre établissement scolaire ou autres de signer une décharge
-stipulant leur renoncement aux droits qu'ils pourraient avoir sur le
-programme:
->
-...((employeur, école...)) déclare par la présente ne pas revendiquer
-de droits sur le programme « (nom du programme) » réalisé par ...((nom de
-l'auteur)).
-
-((signature du responsable)), ...((date)),
-...((nom et qualité du responsable)).
-
-La Licence Publique Générale ne permet pas d'inclure votre programme dans
-des logiciels sous licence commerciale spécifique. Si votre programme est
-une fonction de bibliothèque, vous jugerez probablement plus judicieux de
-le faire relever de la Licence Générale de Bibliothèque GNU (LGPL) plutôt
-que de la présente.
-
+
+Traduction de R.Cougnec et M.Makarévitch
+
+Introduction :
+This is an unofficial translation of the GNU General Public License into
+French. It was not published by the Free Software Foundation, and does not
+legally state the distribution terms for software that uses the GNU
+GPL--only the original English text of the GNU GPL does that. However, we
+hope that this translation will help French speakers understand the GNU GPL
+better.
+
+Voici une adaptation non officielle de la Licence Publique Générale du
+projet GNU. Elle n'a pas été publiée par la Free Software Foundation et son
+contenu n'a aucune portée légale car seule la version anglaise de ce
+document détaille le mode de distribution des logiciels sous GNU GPL. Nous
+espérons cependant qu'elle permettra aux francophones de mieux comprendre
+la GPL.
+
+ -Licence Publique Générale GNU Version 2, Juin 1991-
+
+Copyright (c) Free Software Foundation, Inc.
+59 Temple Place, Suite 330,
+Boston, MA 02111-1307
+États-Unis, 1989, 1991.
+La copie et la distribution de copies exactes de ce document sont
+autorisées, mais aucune modification n'est permise.
+
+ Préambule
+
+Les licences d'utilisation de la plupart des programmes sont définies pour
+limiter ou supprimer toute liberté à l'utilisateur. À l'inverse, la
+Licence Publique Générale (General Public License) est destinée à vous
+garantir la liberté de partager et de modifier les logiciels libres, et de
+s'assurer que ces logiciels sont effectivement accessibles à tout
+utilisateur.
+
+Cette Licence Publique Générale s'applique à la plupart des programmes de
+la Free Software Foundation, comme à tout autre programme dont l'auteur
+l'aura décidé (d'autres logiciels de la FSF sont couverts pour leur part
+par la Licence Publique Générale pour Bibliothèques GNU (LGPL)). Vous
+pouvez aussi appliquer les termes de cette Licence à vos propres
+programmes, si vous le désirez.
+
+ _Liberté des logiciels ne signifie pas nécessairement
+gratuité. Notre Licence est conçue pour vous assurer la liberté de
+distribuer des copies des programmes, gratuitement ou non, de recevoir le
+code source ou de pouvoir l'obtenir, de modifier les programmes ou d'en
+utiliser des éléments dans de nouveaux programmes libres, en sachant que
+vous y êtes autorisé.
+
+Afin de garantir ces droits, nous avons dû introduire des restrictions
+interdisant à quiconque de vous les refuser ou de vous demander d'y
+renoncer. Ces restrictions vous imposent en retour certaines obligations si
+vous distribuez ou modifiez des copies de programmes protégés par la
+Licence. En d'autre termes, il vous incombera en ce cas de :
+
+ -transmettre aux destinataires tous les droits que vous possédez,
+ -expédier aux destinataires le code source ou bien tenir celui-ci à
+ leur disposition,
+ -leur remettre cette Licence afin qu'ils prennent connaissance de
+ leurs droits.
+
+
+Nous protégeons vos droits de deux façons : d'abord par le copyright
+du logiciel, ensuite par la remise de cette Licence qui vous autorise
+légalement à copier, distribuer et/ou modifier le logiciel.
+
+En outre, pour protéger chaque auteur ainsi que la FSF, nous affirmons
+solennellement que le programme concerné ne fait l'objet d'aucune garantie.
+Si un tiers le modifie puis le redistribue, tous ceux qui en recevront une
+copie doivent savoir qu'il ne s'agit pas de l'original afin qu'une copie
+défectueuse n'entache pas la réputation de l'auteur du logiciel.
+
+Enfin, tout programme libre est sans cesse menacé par des dépôts de
+brevets. Nous souhaitons à tout prix éviter que des distributeurs puissent
+déposer des brevets sur les Logiciels Libres pour leur propre compte. Pour
+éviter cela, nous stipulons bien que tout dépôt éventuel de brevet doit
+accorder expressément à tout un chacun le libre usage du produit.
+
+Les dispositions précises et les conditions de copie, de distribution et de
+modification de nos logiciels sont les suivantes :
+
+ Stipulations et conditions relatives à la copie, la distribution et la modification
+
+
+ _Article 0.
+ La présente Licence s'applique à tout Programme (ou autre travail) où
+ figure une note, placée par le détenteur des droits, stipulant que ledit
+ Programme ou travail peut être distribué selon les termes de la présente
+ Licence. Le terme Programme désigne aussi bien le Programme
+ lui-même que tout travail qui en est dérivé selon la loi, c'est-à-dire
+ tout ouvrage reproduisant le Programme ou une partie de celui-ci, à
+ l'identique ou bien modifié, et/ou traduit dans une autre langue (la
+ traduction est considérée comme une modification). Chaque personne
+ concernée par la Licence Publique Générale sera désignée par le terme
+ Vous.
+
+ Les activités autres que copie, distribution et modification ne sont pas
+ couvertes par la présente Licence et sortent de son cadre. Rien ne
+ restreint l'utilisation du Programme et les données issues de celui-ci ne
+ sont couvertes que si leur contenu constitue un travail basé sur le
+ logiciel (indépendemment du fait d'avoir été réalisé en lançant le
+ Programme). Tout dépend de ce que le Programme est censé produire.
+
+ _Article 1.
+ Vous pouvez copier et distribuer des copies conformes du code source du
+ Programme, tel que Vous l'avez reçu, sur n'importe quel support, à
+ condition de placer sur chaque copie un copyright approprié et une
+ restriction de garantie, de ne pas modifier ou omettre toutes les
+ stipulations se référant à la présente Licence et à la limitation de
+ garantie, et de fournir avec toute copie du Programme un exemplaire de la
+ Licence.
+
+ Vous pouvez demander une rétribution financière pour la réalisation de la
+ copie et demeurez libre de proposer une garantie assurée par vos soins,
+ moyennant finances.
+
+ _Article 2.
+ Vous pouvez modifier votre copie ou vos copies du Programme ou partie de
+ celui-ci, ou d'un travail basé sur ce Programme, et copier et distribuer
+ ces modifications selon les termes de l'article 1, à condition de Vous
+ conformer également aux conditions suivantes :
+
+
+ a) Ajouter aux fichiers modifiés l'indication très claire des
+ modifications effectuées, ainsi que la date de chaque changement.
+
+ b) Distribuer sous les termes de la Licence Publique Générale
+ l'ensemble de toute réalisation contenant tout ou partie du
+ Programme, avec ou sans modifications.
+ c) Si le Programme modifié lit des commandes de manière interactive
+ lors de son exécution, faire en sorte qu'il affiche, lors d'une
+ invocation ordinaire, le copyright approprié en indiquant
+ clairement la limitation de garantie (ou la garantie que Vous Vous
+ engagez à fournir Vous-même), qu'il stipule que tout utilisateur
+ peut librement redistribuer le Programme selon les conditions de la
+ Licence Publique Générale GNU, et qu'il montre à tout utilisateur
+ comment lire une copie de celle-ci (exception : si le
+ Programme original est interactif mais n'affiche pas un tel
+ message en temps normal, tout travail dérivé de ce Programme ne
+ sera pas non plus contraint de l'afficher).
+
+ Toutes ces conditions s'appliquent à l'ensemble des modifications. Si des
+ éléments identifiables de ce travail ne sont pas dérivés du Programme
+ et peuvent être raisonnablement considérés comme indépendants, la
+ présente Licence ne s'applique pas à ces éléments lorsque Vous les
+ distribuez seuls.
+ Mais, si Vous distribuez ces mêmes éléments comme partie d'un ensemble
+ cohérent dont le reste est basé sur un Programme soumis à la Licence, ils
+ lui sont également soumis, et la Licence s'étend ainsi à l'ensemble du
+ produit, quel qu'en soit l'auteur.
+
+ Cet article n'a pas pour but de s'approprier ou de contester vos
+ droits sur un travail entièrement réalisé par Vous, mais plutôt
+ d'ouvrir droit à un contrôle de la libre distribution de tout travail
+ dérivé ou collectif basé sur le Programme.
+
+ En outre, toute fusion d'un autre travail, non basé sur le Programme,
+ avec le Programme (ou avec un travail dérivé de ce dernier),
+ effectuée sur un support de stockage ou de distribution, ne fait pas
+ tomber cet autre travail sous le contrôle de la Licence.
+
+ _Article 3.
+ Vous pouvez copier et distribuer le Programme (ou tout travail dérivé
+ selon les conditions énoncées dans l'article 1) sous forme de code
+ objet ou exécutable, selon les termes des articles 0 et 1, à
+ condition de respecter les clauses suivantes :
+
+
+ a) Fournir le code source complet du Programme,
+ sous une forme lisible par un ordinateur et selon les termes des
+ articles 0 et 1, sur un support habituellement utilisé pour
+ l'échange de données ou,
+
+ b) Faire une offre écrite, valable pendant au moins trois ans,
+ prévoyant de donner à tout tiers qui en fera la demande une copie,
+ sous forme lisible par un ordinateur, du code source correspondant,
+ pour un tarif n'excédant pas le coût de la copie, selon
+ les termes des articles 0 et 1, sur un support couramment utilisé
+ pour l'échange de données informatiques ou,
+
+ c) Informer le destinataire de l'endroit où le code source peut
+ être obtenu (cette solution n'est recevable que dans le cas d'une
+ distribution non commerciale, et uniquement si Vous avez reçu le
+ Programme sous forme de code objet ou exécutable avec l'offre
+ prévue à l'alinéa b ci-dessus).
+
+
+ Le code source d'un travail désigne la forme de cet ouvrage sous laquelle
+ les modifications sont les plus aisées. Sont ainsi désignés la totalité
+ du code source de tous les modules composant un Programme exécutable, de
+ même que tout fichier de définition associé, ainsi que les scripts
+ utilisés pour effectuer la compilation et l'installation du Programme
+ exécutable. Toutefois, l'environnement standard de développement du
+ système d'exploitation mis en oeuvre (source ou binaire) -- compilateurs,
+ bibliothèques, noyau, etc. -- constitue une exception, sauf si ces
+ éléments sont diffusés en même temps que le Programme exécutable.
+
+ Si la distribution de l'exécutable ou du code objet consiste à offrir un
+ accès permettant de copier le Programme depuis un endroit particulier,
+ l'offre d'un accès équivalent pour se procurer le code source au même
+ endroit est considéré comme une distribution de ce code source, même si
+ l'utilisateur choisit de ne pas profiter de cette offre.
+
+ _Article 4.
+ Vous ne pouvez pas copier, modifier, céder, déposer ou distribuer le
+ Programme d'une autre manière que l'autorise la Licence Publique Générale.
+ Toute tentative de ce type annule immédiatement vos droits d'utilisation du
+ Programme sous cette Licence. Toutefois, les tiers ayant reçu de Vous
+ des copies du Programme ou le droit d'utiliser ces copies continueront à
+ bénéficier de leur droit d'utilisation tant qu'ils respecteront pleinement
+ les conditions de la Licence.
+
+ _Article 5.
+ Ne l'ayant pas signée, Vous n'êtes pas obligé d'accepter cette
+ Licence. Cependant, rien d'autre ne Vous autorise à modifier ou distribuer
+ le Programme ou quelque travaux dérivés : la loi l'interdit tant que Vous
+ n'acceptez pas les termes de cette Licence. En conséquence, en modifiant
+ ou en distribuant le Programme (ou tout travail basé sur lui), Vous
+ acceptez implicitement tous les termes et conditions de cette Licence.
+
+ _Article 6.
+ La diffusion d'un Programme (ou de tout travail dérivé) suppose l'envoi
+ simultané d'une licence autorisant la copie, la distribution ou la
+ modification du Programme, aux termes et conditions de la Licence. Vous
+ n'avez pas le droit d'imposer de restrictions supplémentaires aux droits
+ transmis au destinataire. Vous n'êtes pas responsable du respect de la
+ Licence par un tiers.
+
+ _Article 7.
+ Si, à la suite d'une décision de Justice, d'une plainte en contrefaçon ou
+ pour toute autre raison (liée ou non à la contrefaçon), des conditions Vous
+ sont imposées (que ce soit par ordonnance, accord amiable ou autre) qui se
+ révèlent incompatibles avec les termes de la présente Licence, Vous n'êtes
+ pas pour autant dégagé des obligations liées à celle-ci : si Vous ne
+ pouvez concilier vos obligations légales ou autres avec les conditions de
+ cette Licence, Vous ne devez pas distribuer le Programme.
+
+ Si une partie quelconque de cet article est invalidée ou inapplicable
+ pour quelque raison que ce soit, le reste de l'article continue de
+ s'appliquer et l'intégralité de l'article s'appliquera en toute autre
+ circonstance.
+
+ Le présent article n'a pas pour but de Vous pousser à enfreindre des
+ droits ou des dispositions légales ni en contester la validité ;
+ son seul objectif est de protéger l'intégrité du système de
+ distribution du Logiciel Libre. De nombreuses personnes ont
+ généreusement contribué à la large gamme de Programmes distribuée
+ de cette façon en toute confiance il appartient à chaque
+ auteur/donateur de décider de diffuser ses Programmes selon les critères
+ de son choix.
+
+ _Article 8.
+ Si la distribution et/ou l'utilisation du Programme est limitée dans
+ certains pays par des brevets ou des droits sur des interfaces, le
+ détenteur original des droits qui place le Programme sous la Licence
+ Publique Générale peut ajouter explicitement une clause de limitation
+ géographique excluant ces pays. Dans ce cas, cette clause devient une
+ partie intégrante de la Licence.
+
+ _Article 9.
+ La Free Software Foundation se réserve le droit de publier périodiquement
+ des mises à jour ou de nouvelles versions de la Licence. Rédigées dans le
+ même esprit que la présente version, elles seront cependant susceptibles
+ d'en modifier certains détails à mesure que de nouveaux problèmes se font
+ jour.
+
+ Chaque version possède un numéro distinct. Si le Programme précise un
+ numéro de version de cette Licence et « toute version ultérieure », Vous
+ avez le choix de suivre les termes et conditions de cette version ou de
+ toute autre version plus récente publiée par la Free Software Foundation.
+ Si le Programme ne spécifie aucun numéro de version, Vous pouvez alors
+ choisir l'une quelconque des versions publiées par la Free Software
+ Foundation.
+
+
+ _Article 10.
+ Si Vous désirez incorporer des éléments du Programme dans d'autres
+ Programmes libres dont les conditions de distribution diffèrent, Vous devez
+ écrire à l'auteur pour lui en demander la permission. Pour ce qui est des
+ Programmes directement déposés par la Free Software Foundation,
+ écrivez-nous : une exception est toujours envisageable. Notre décision
+ sera basée sur notre volonté de préserver la liberté de notre Programme ou
+ de ses dérivés et celle de promouvoir le partage et la réutilisation du
+ logiciel en général.
+
+
+ LIMITATION DE GARANTIE
+
+
+ _Article 11.
+
+ Parce que l'utilisation de ce Programme est libre et gratuite, aucune
+ garantie n'est fournie, comme le permet la loi. Sauf mention écrite, les
+ détenteurs du copyright et/ou les tiers fournissent le Programme en l'état,
+ sans aucune sorte de garantie explicite ou implicite, y compris les
+ garanties de commercialisation ou d'adaptation dans un but
+ particulier. Vous assumez tous les risques quant à la qualité et aux effets
+ du Programme. Si le Programme est défectueux, Vous assumez le coût de tous
+ les services, corrections ou réparations nécessaires.
+
+
+ _Article 12.
+ Sauf lorsqu'explicitement prévu par la Loi ou accepté par écrit, ni le
+ détenteur des droits, ni quiconque autorisé à modifier et/ou redistribuer
+ le Programme comme il est permis ci-dessus ne pourra être tenu pour
+ responsable de tout dommage direct, indirect, secondaire ou accessoire
+ (pertes financières dues au manque à gagner, à l'interruption d'activités
+ ou à la perte de données, etc., découlant de l'utilisation du Programme ou
+ de l'impossibilité d'utiliser celui-ci).
+
+
+
+ FIN DES TERMES ET CONDITIONS
+
+ Comment appliquer ces directives à vos nouveaux programmes
+
+Si vous développez un nouveau programme et désirez en faire bénéficier tout
+un chacun, la meilleure méthode est d'en faire un Logiciel Libre que tout
+le monde pourra redistribuer et modifier selon les termes de la Licence
+Publique Générale.
+
+Pour cela, insérez les indications suivantes dans votre programme (il est
+préférable et plus sûr de les faire figurer au début de chaque fichier
+source dans tous les cas, chaque module source devra comporter au
+minimum la ligne de « copyright » et indiquer où résident toutes les
+autres indications):
+
+
+((une ligne pour donner le nom du programme et donner une idée de
+sa finalité))
+Copyright (C) 19xx ((nom de l'auteur))
+
+Ce programme est libre, vous pouvez le redistribuer et/ou le modifier
+selon les termes de la Licence Publique Générale GNU publiée par la
+Free Software Foundation (version 2 ou bien toute autre version
+ultérieure choisie par vous).
+
+Ce programme est distribué car potentiellement utile, mais SANS AUCUNE
+GARANTIE, ni explicite ni implicite, y compris les garanties de
+commercialisation ou d'adaptation dans un but spécifique.
+Reportez-vous à la Licence Publique Générale GNU pour plus de détails.
+
+Vous devez avoir reçu une copie de la Licence Publique Générale GNU
+en même temps que ce programme si ce n'est pas le cas, écrivez à la
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307, États-Unis.
+
+
+Ajoutez également votre adresse électronique, le cas échéant, ainsi que
+votre adresse postale.
+
+Si le programme est interactif, faites-lui afficher un court avertissement
+du type de celui-ci à chaque invocation:
+
+
+...(nom du programme) version 69, Copyright (C) 19aa nom de l'auteur
+
+...(nom du programme) est fourni sans AUCUNE GARANTIE.
+Pour plus de détails, tapez `g'.
+
+Ce programme est libre et vous êtes encouragé à le redistribuer
+sous certaines conditions tapez `c' pour plus de détails.
+
+Les commandes hypothétiques `g' et `c' doivent afficher les sections
+appropriées de la Licence Publique Générale GNU. Bien entendu, vous pouvez
+implanter ces commandes comme bon vous semble : options dans un menu,
+ou bien accessibles d'un clic de souris, etc., tout dépend de votre
+programme.
+
+Si vous officiez en tant que programmeur, n'omettez pas de demander à votre
+employeur, votre établissement scolaire ou autres de signer une décharge
+stipulant leur renoncement aux droits qu'ils pourraient avoir sur le
+programme:
+>
+...((employeur, école...)) déclare par la présente ne pas revendiquer
+de droits sur le programme « (nom du programme) » réalisé par ...((nom de
+l'auteur)).
+
+((signature du responsable)), ...((date)),
+...((nom et qualité du responsable)).
+
+La Licence Publique Générale ne permet pas d'inclure votre programme dans
+des logiciels sous licence commerciale spécifique. Si votre programme est
+une fonction de bibliothèque, vous jugerez probablement plus judicieux de
+le faire relever de la Licence Générale de Bibliothèque GNU (LGPL) plutôt
+que de la présente.
+
==========================================================================
\ No newline at end of file
diff --git a/htdocs/langs/fr_FR/html/gpl.txt b/htdocs/langs/fr_FR/html/gpl.txt
index 63329a6aa74..ed06504c983 100644
--- a/htdocs/langs/fr_FR/html/gpl.txt
+++ b/htdocs/langs/fr_FR/html/gpl.txt
@@ -1,390 +1,390 @@
GNU GENERAL PUBLIC LICENSE
-
-Traduction de R.Cougnec et M.Makarévitch
-
-Introduction :
-This is an unofficial translation of the GNU General Public License into
-French. It was not published by the Free Software Foundation, and does not
-legally state the distribution terms for software that uses the GNU
-GPL--only the original English text of the GNU GPL does that. However, we
-hope that this translation will help French speakers understand the GNU GPL
-better.
-
-Voici une adaptation non officielle de la Licence Publique Générale du
-projet GNU. Elle n'a pas été publiée par la Free Software Foundation et son
-contenu n'a aucune portée légale car seule la version anglaise de ce
-document détaille le mode de distribution des logiciels sous GNU GPL. Nous
-espérons cependant qu'elle permettra aux francophones de mieux comprendre
-la GPL.
-
- -Licence Publique Générale GNU Version 2, Juin 1991-
-
-Copyright (c) Free Software Foundation, Inc.
-59 Temple Place, Suite 330,
-Boston, MA 02111-1307
-États-Unis, 1989, 1991.
-La copie et la distribution de copies exactes de ce document sont
-autorisées, mais aucune modification n'est permise.
-
- Préambule
-
-Les licences d'utilisation de la plupart des programmes sont définies pour
-limiter ou supprimer toute liberté à l'utilisateur. À l'inverse, la
-Licence Publique Générale (General Public License) est destinée à vous
-garantir la liberté de partager et de modifier les logiciels libres, et de
-s'assurer que ces logiciels sont effectivement accessibles à tout
-utilisateur.
-
-Cette Licence Publique Générale s'applique à la plupart des programmes de
-la Free Software Foundation, comme à tout autre programme dont l'auteur
-l'aura décidé (d'autres logiciels de la FSF sont couverts pour leur part
-par la Licence Publique Générale pour Bibliothèques GNU (LGPL)). Vous
-pouvez aussi appliquer les termes de cette Licence à vos propres
-programmes, si vous le désirez.
-
- _Liberté des logiciels ne signifie pas nécessairement
-gratuité. Notre Licence est conçue pour vous assurer la liberté de
-distribuer des copies des programmes, gratuitement ou non, de recevoir le
-code source ou de pouvoir l'obtenir, de modifier les programmes ou d'en
-utiliser des éléments dans de nouveaux programmes libres, en sachant que
-vous y êtes autorisé.
-
-Afin de garantir ces droits, nous avons dû introduire des restrictions
-interdisant à quiconque de vous les refuser ou de vous demander d'y
-renoncer. Ces restrictions vous imposent en retour certaines obligations si
-vous distribuez ou modifiez des copies de programmes protégés par la
-Licence. En d'autre termes, il vous incombera en ce cas de :
-
- -transmettre aux destinataires tous les droits que vous possédez,
- -expédier aux destinataires le code source ou bien tenir celui-ci à
- leur disposition,
- -leur remettre cette Licence afin qu'ils prennent connaissance de
- leurs droits.
-
-
-Nous protégeons vos droits de deux façons : d'abord par le copyright
-du logiciel, ensuite par la remise de cette Licence qui vous autorise
-légalement à copier, distribuer et/ou modifier le logiciel.
-
-En outre, pour protéger chaque auteur ainsi que la FSF, nous affirmons
-solennellement que le programme concerné ne fait l'objet d'aucune garantie.
-Si un tiers le modifie puis le redistribue, tous ceux qui en recevront une
-copie doivent savoir qu'il ne s'agit pas de l'original afin qu'une copie
-défectueuse n'entache pas la réputation de l'auteur du logiciel.
-
-Enfin, tout programme libre est sans cesse menacé par des dépôts de
-brevets. Nous souhaitons à tout prix éviter que des distributeurs puissent
-déposer des brevets sur les Logiciels Libres pour leur propre compte. Pour
-éviter cela, nous stipulons bien que tout dépôt éventuel de brevet doit
-accorder expressément à tout un chacun le libre usage du produit.
-
-Les dispositions précises et les conditions de copie, de distribution et de
-modification de nos logiciels sont les suivantes :
-
- Stipulations et conditions relatives à la copie, la distribution et la modification
-
-
- _Article 0.
- La présente Licence s'applique à tout Programme (ou autre travail) où
- figure une note, placée par le détenteur des droits, stipulant que ledit
- Programme ou travail peut être distribué selon les termes de la présente
- Licence. Le terme Programme désigne aussi bien le Programme
- lui-même que tout travail qui en est dérivé selon la loi, c'est-à-dire
- tout ouvrage reproduisant le Programme ou une partie de celui-ci, à
- l'identique ou bien modifié, et/ou traduit dans une autre langue (la
- traduction est considérée comme une modification). Chaque personne
- concernée par la Licence Publique Générale sera désignée par le terme
- Vous.
-
- Les activités autres que copie, distribution et modification ne sont pas
- couvertes par la présente Licence et sortent de son cadre. Rien ne
- restreint l'utilisation du Programme et les données issues de celui-ci ne
- sont couvertes que si leur contenu constitue un travail basé sur le
- logiciel (indépendemment du fait d'avoir été réalisé en lançant le
- Programme). Tout dépend de ce que le Programme est censé produire.
-
- _Article 1.
- Vous pouvez copier et distribuer des copies conformes du code source du
- Programme, tel que Vous l'avez reçu, sur n'importe quel support, à
- condition de placer sur chaque copie un copyright approprié et une
- restriction de garantie, de ne pas modifier ou omettre toutes les
- stipulations se référant à la présente Licence et à la limitation de
- garantie, et de fournir avec toute copie du Programme un exemplaire de la
- Licence.
-
- Vous pouvez demander une rétribution financière pour la réalisation de la
- copie et demeurez libre de proposer une garantie assurée par vos soins,
- moyennant finances.
-
- _Article 2.
- Vous pouvez modifier votre copie ou vos copies du Programme ou partie de
- celui-ci, ou d'un travail basé sur ce Programme, et copier et distribuer
- ces modifications selon les termes de l'article 1, à condition de Vous
- conformer également aux conditions suivantes :
-
-
- a) Ajouter aux fichiers modifiés l'indication très claire des
- modifications effectuées, ainsi que la date de chaque changement.
-
- b) Distribuer sous les termes de la Licence Publique Générale
- l'ensemble de toute réalisation contenant tout ou partie du
- Programme, avec ou sans modifications.
- c) Si le Programme modifié lit des commandes de manière interactive
- lors de son exécution, faire en sorte qu'il affiche, lors d'une
- invocation ordinaire, le copyright approprié en indiquant
- clairement la limitation de garantie (ou la garantie que Vous Vous
- engagez à fournir Vous-même), qu'il stipule que tout utilisateur
- peut librement redistribuer le Programme selon les conditions de la
- Licence Publique Générale GNU, et qu'il montre à tout utilisateur
- comment lire une copie de celle-ci (exception : si le
- Programme original est interactif mais n'affiche pas un tel
- message en temps normal, tout travail dérivé de ce Programme ne
- sera pas non plus contraint de l'afficher).
-
- Toutes ces conditions s'appliquent à l'ensemble des modifications. Si des
- éléments identifiables de ce travail ne sont pas dérivés du Programme
- et peuvent être raisonnablement considérés comme indépendants, la
- présente Licence ne s'applique pas à ces éléments lorsque Vous les
- distribuez seuls.
- Mais, si Vous distribuez ces mêmes éléments comme partie d'un ensemble
- cohérent dont le reste est basé sur un Programme soumis à la Licence, ils
- lui sont également soumis, et la Licence s'étend ainsi à l'ensemble du
- produit, quel qu'en soit l'auteur.
-
- Cet article n'a pas pour but de s'approprier ou de contester vos
- droits sur un travail entièrement réalisé par Vous, mais plutôt
- d'ouvrir droit à un contrôle de la libre distribution de tout travail
- dérivé ou collectif basé sur le Programme.
-
- En outre, toute fusion d'un autre travail, non basé sur le Programme,
- avec le Programme (ou avec un travail dérivé de ce dernier),
- effectuée sur un support de stockage ou de distribution, ne fait pas
- tomber cet autre travail sous le contrôle de la Licence.
-
- _Article 3.
- Vous pouvez copier et distribuer le Programme (ou tout travail dérivé
- selon les conditions énoncées dans l'article 1) sous forme de code
- objet ou exécutable, selon les termes des articles 0 et 1, à
- condition de respecter les clauses suivantes :
-
-
- a) Fournir le code source complet du Programme,
- sous une forme lisible par un ordinateur et selon les termes des
- articles 0 et 1, sur un support habituellement utilisé pour
- l'échange de données ou,
-
- b) Faire une offre écrite, valable pendant au moins trois ans,
- prévoyant de donner à tout tiers qui en fera la demande une copie,
- sous forme lisible par un ordinateur, du code source correspondant,
- pour un tarif n'excédant pas le coût de la copie, selon
- les termes des articles 0 et 1, sur un support couramment utilisé
- pour l'échange de données informatiques ou,
-
- c) Informer le destinataire de l'endroit où le code source peut
- être obtenu (cette solution n'est recevable que dans le cas d'une
- distribution non commerciale, et uniquement si Vous avez reçu le
- Programme sous forme de code objet ou exécutable avec l'offre
- prévue à l'alinéa b ci-dessus).
-
-
- Le code source d'un travail désigne la forme de cet ouvrage sous laquelle
- les modifications sont les plus aisées. Sont ainsi désignés la totalité
- du code source de tous les modules composant un Programme exécutable, de
- même que tout fichier de définition associé, ainsi que les scripts
- utilisés pour effectuer la compilation et l'installation du Programme
- exécutable. Toutefois, l'environnement standard de développement du
- système d'exploitation mis en oeuvre (source ou binaire) -- compilateurs,
- bibliothèques, noyau, etc. -- constitue une exception, sauf si ces
- éléments sont diffusés en même temps que le Programme exécutable.
-
- Si la distribution de l'exécutable ou du code objet consiste à offrir un
- accès permettant de copier le Programme depuis un endroit particulier,
- l'offre d'un accès équivalent pour se procurer le code source au même
- endroit est considéré comme une distribution de ce code source, même si
- l'utilisateur choisit de ne pas profiter de cette offre.
-
- _Article 4.
- Vous ne pouvez pas copier, modifier, céder, déposer ou distribuer le
- Programme d'une autre manière que l'autorise la Licence Publique Générale.
- Toute tentative de ce type annule immédiatement vos droits d'utilisation du
- Programme sous cette Licence. Toutefois, les tiers ayant reçu de Vous
- des copies du Programme ou le droit d'utiliser ces copies continueront à
- bénéficier de leur droit d'utilisation tant qu'ils respecteront pleinement
- les conditions de la Licence.
-
- _Article 5.
- Ne l'ayant pas signée, Vous n'êtes pas obligé d'accepter cette
- Licence. Cependant, rien d'autre ne Vous autorise à modifier ou distribuer
- le Programme ou quelque travaux dérivés : la loi l'interdit tant que Vous
- n'acceptez pas les termes de cette Licence. En conséquence, en modifiant
- ou en distribuant le Programme (ou tout travail basé sur lui), Vous
- acceptez implicitement tous les termes et conditions de cette Licence.
-
- _Article 6.
- La diffusion d'un Programme (ou de tout travail dérivé) suppose l'envoi
- simultané d'une licence autorisant la copie, la distribution ou la
- modification du Programme, aux termes et conditions de la Licence. Vous
- n'avez pas le droit d'imposer de restrictions supplémentaires aux droits
- transmis au destinataire. Vous n'êtes pas responsable du respect de la
- Licence par un tiers.
-
- _Article 7.
- Si, à la suite d'une décision de Justice, d'une plainte en contrefaçon ou
- pour toute autre raison (liée ou non à la contrefaçon), des conditions Vous
- sont imposées (que ce soit par ordonnance, accord amiable ou autre) qui se
- révèlent incompatibles avec les termes de la présente Licence, Vous n'êtes
- pas pour autant dégagé des obligations liées à celle-ci : si Vous ne
- pouvez concilier vos obligations légales ou autres avec les conditions de
- cette Licence, Vous ne devez pas distribuer le Programme.
-
- Si une partie quelconque de cet article est invalidée ou inapplicable
- pour quelque raison que ce soit, le reste de l'article continue de
- s'appliquer et l'intégralité de l'article s'appliquera en toute autre
- circonstance.
-
- Le présent article n'a pas pour but de Vous pousser à enfreindre des
- droits ou des dispositions légales ni en contester la validité ;
- son seul objectif est de protéger l'intégrité du système de
- distribution du Logiciel Libre. De nombreuses personnes ont
- généreusement contribué à la large gamme de Programmes distribuée
- de cette façon en toute confiance il appartient à chaque
- auteur/donateur de décider de diffuser ses Programmes selon les critères
- de son choix.
-
- _Article 8.
- Si la distribution et/ou l'utilisation du Programme est limitée dans
- certains pays par des brevets ou des droits sur des interfaces, le
- détenteur original des droits qui place le Programme sous la Licence
- Publique Générale peut ajouter explicitement une clause de limitation
- géographique excluant ces pays. Dans ce cas, cette clause devient une
- partie intégrante de la Licence.
-
- _Article 9.
- La Free Software Foundation se réserve le droit de publier périodiquement
- des mises à jour ou de nouvelles versions de la Licence. Rédigées dans le
- même esprit que la présente version, elles seront cependant susceptibles
- d'en modifier certains détails à mesure que de nouveaux problèmes se font
- jour.
-
- Chaque version possède un numéro distinct. Si le Programme précise un
- numéro de version de cette Licence et « toute version ultérieure », Vous
- avez le choix de suivre les termes et conditions de cette version ou de
- toute autre version plus récente publiée par la Free Software Foundation.
- Si le Programme ne spécifie aucun numéro de version, Vous pouvez alors
- choisir l'une quelconque des versions publiées par la Free Software
- Foundation.
-
-
- _Article 10.
- Si Vous désirez incorporer des éléments du Programme dans d'autres
- Programmes libres dont les conditions de distribution diffèrent, Vous devez
- écrire à l'auteur pour lui en demander la permission. Pour ce qui est des
- Programmes directement déposés par la Free Software Foundation,
- écrivez-nous : une exception est toujours envisageable. Notre décision
- sera basée sur notre volonté de préserver la liberté de notre Programme ou
- de ses dérivés et celle de promouvoir le partage et la réutilisation du
- logiciel en général.
-
-
- LIMITATION DE GARANTIE
-
-
- _Article 11.
-
- Parce que l'utilisation de ce Programme est libre et gratuite, aucune
- garantie n'est fournie, comme le permet la loi. Sauf mention écrite, les
- détenteurs du copyright et/ou les tiers fournissent le Programme en l'état,
- sans aucune sorte de garantie explicite ou implicite, y compris les
- garanties de commercialisation ou d'adaptation dans un but
- particulier. Vous assumez tous les risques quant à la qualité et aux effets
- du Programme. Si le Programme est défectueux, Vous assumez le coût de tous
- les services, corrections ou réparations nécessaires.
-
-
- _Article 12.
- Sauf lorsqu'explicitement prévu par la Loi ou accepté par écrit, ni le
- détenteur des droits, ni quiconque autorisé à modifier et/ou redistribuer
- le Programme comme il est permis ci-dessus ne pourra être tenu pour
- responsable de tout dommage direct, indirect, secondaire ou accessoire
- (pertes financières dues au manque à gagner, à l'interruption d'activités
- ou à la perte de données, etc., découlant de l'utilisation du Programme ou
- de l'impossibilité d'utiliser celui-ci).
-
-
-
- FIN DES TERMES ET CONDITIONS
-
- Comment appliquer ces directives à vos nouveaux programmes
-
-Si vous développez un nouveau programme et désirez en faire bénéficier tout
-un chacun, la meilleure méthode est d'en faire un Logiciel Libre que tout
-le monde pourra redistribuer et modifier selon les termes de la Licence
-Publique Générale.
-
-Pour cela, insérez les indications suivantes dans votre programme (il est
-préférable et plus sûr de les faire figurer au début de chaque fichier
-source dans tous les cas, chaque module source devra comporter au
-minimum la ligne de « copyright » et indiquer où résident toutes les
-autres indications):
-
-
-((une ligne pour donner le nom du programme et donner une idée de
-sa finalité))
-Copyright (C) 19xx ((nom de l'auteur))
-
-Ce programme est libre, vous pouvez le redistribuer et/ou le modifier
-selon les termes de la Licence Publique Générale GNU publiée par la
-Free Software Foundation (version 2 ou bien toute autre version
-ultérieure choisie par vous).
-
-Ce programme est distribué car potentiellement utile, mais SANS AUCUNE
-GARANTIE, ni explicite ni implicite, y compris les garanties de
-commercialisation ou d'adaptation dans un but spécifique.
-Reportez-vous à la Licence Publique Générale GNU pour plus de détails.
-
-Vous devez avoir reçu une copie de la Licence Publique Générale GNU
-en même temps que ce programme si ce n'est pas le cas, écrivez à la
-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-02111-1307, États-Unis.
-
-
-Ajoutez également votre adresse électronique, le cas échéant, ainsi que
-votre adresse postale.
-
-Si le programme est interactif, faites-lui afficher un court avertissement
-du type de celui-ci à chaque invocation:
-
-
-...(nom du programme) version 69, Copyright (C) 19aa nom de l'auteur
-
-...(nom du programme) est fourni sans AUCUNE GARANTIE.
-Pour plus de détails, tapez `g'.
-
-Ce programme est libre et vous êtes encouragé à le redistribuer
-sous certaines conditions tapez `c' pour plus de détails.
-
-Les commandes hypothétiques `g' et `c' doivent afficher les sections
-appropriées de la Licence Publique Générale GNU. Bien entendu, vous pouvez
-implanter ces commandes comme bon vous semble : options dans un menu,
-ou bien accessibles d'un clic de souris, etc., tout dépend de votre
-programme.
-
-Si vous officiez en tant que programmeur, n'omettez pas de demander à votre
-employeur, votre établissement scolaire ou autres de signer une décharge
-stipulant leur renoncement aux droits qu'ils pourraient avoir sur le
-programme:
->
-...((employeur, école...)) déclare par la présente ne pas revendiquer
-de droits sur le programme « (nom du programme) » réalisé par ...((nom de
-l'auteur)).
-
-((signature du responsable)), ...((date)),
-...((nom et qualité du responsable)).
-
-La Licence Publique Générale ne permet pas d'inclure votre programme dans
-des logiciels sous licence commerciale spécifique. Si votre programme est
-une fonction de bibliothèque, vous jugerez probablement plus judicieux de
-le faire relever de la Licence Générale de Bibliothèque GNU (LGPL) plutôt
-que de la présente.
-
+
+Traduction de R.Cougnec et M.Makarévitch
+
+Introduction :
+This is an unofficial translation of the GNU General Public License into
+French. It was not published by the Free Software Foundation, and does not
+legally state the distribution terms for software that uses the GNU
+GPL--only the original English text of the GNU GPL does that. However, we
+hope that this translation will help French speakers understand the GNU GPL
+better.
+
+Voici une adaptation non officielle de la Licence Publique Générale du
+projet GNU. Elle n'a pas été publiée par la Free Software Foundation et son
+contenu n'a aucune portée légale car seule la version anglaise de ce
+document détaille le mode de distribution des logiciels sous GNU GPL. Nous
+espérons cependant qu'elle permettra aux francophones de mieux comprendre
+la GPL.
+
+ -Licence Publique Générale GNU Version 2, Juin 1991-
+
+Copyright (c) Free Software Foundation, Inc.
+59 Temple Place, Suite 330,
+Boston, MA 02111-1307
+États-Unis, 1989, 1991.
+La copie et la distribution de copies exactes de ce document sont
+autorisées, mais aucune modification n'est permise.
+
+ Préambule
+
+Les licences d'utilisation de la plupart des programmes sont définies pour
+limiter ou supprimer toute liberté à l'utilisateur. À l'inverse, la
+Licence Publique Générale (General Public License) est destinée à vous
+garantir la liberté de partager et de modifier les logiciels libres, et de
+s'assurer que ces logiciels sont effectivement accessibles à tout
+utilisateur.
+
+Cette Licence Publique Générale s'applique à la plupart des programmes de
+la Free Software Foundation, comme à tout autre programme dont l'auteur
+l'aura décidé (d'autres logiciels de la FSF sont couverts pour leur part
+par la Licence Publique Générale pour Bibliothèques GNU (LGPL)). Vous
+pouvez aussi appliquer les termes de cette Licence à vos propres
+programmes, si vous le désirez.
+
+ _Liberté des logiciels ne signifie pas nécessairement
+gratuité. Notre Licence est conçue pour vous assurer la liberté de
+distribuer des copies des programmes, gratuitement ou non, de recevoir le
+code source ou de pouvoir l'obtenir, de modifier les programmes ou d'en
+utiliser des éléments dans de nouveaux programmes libres, en sachant que
+vous y êtes autorisé.
+
+Afin de garantir ces droits, nous avons dû introduire des restrictions
+interdisant à quiconque de vous les refuser ou de vous demander d'y
+renoncer. Ces restrictions vous imposent en retour certaines obligations si
+vous distribuez ou modifiez des copies de programmes protégés par la
+Licence. En d'autre termes, il vous incombera en ce cas de :
+
+ -transmettre aux destinataires tous les droits que vous possédez,
+ -expédier aux destinataires le code source ou bien tenir celui-ci à
+ leur disposition,
+ -leur remettre cette Licence afin qu'ils prennent connaissance de
+ leurs droits.
+
+
+Nous protégeons vos droits de deux façons : d'abord par le copyright
+du logiciel, ensuite par la remise de cette Licence qui vous autorise
+légalement à copier, distribuer et/ou modifier le logiciel.
+
+En outre, pour protéger chaque auteur ainsi que la FSF, nous affirmons
+solennellement que le programme concerné ne fait l'objet d'aucune garantie.
+Si un tiers le modifie puis le redistribue, tous ceux qui en recevront une
+copie doivent savoir qu'il ne s'agit pas de l'original afin qu'une copie
+défectueuse n'entache pas la réputation de l'auteur du logiciel.
+
+Enfin, tout programme libre est sans cesse menacé par des dépôts de
+brevets. Nous souhaitons à tout prix éviter que des distributeurs puissent
+déposer des brevets sur les Logiciels Libres pour leur propre compte. Pour
+éviter cela, nous stipulons bien que tout dépôt éventuel de brevet doit
+accorder expressément à tout un chacun le libre usage du produit.
+
+Les dispositions précises et les conditions de copie, de distribution et de
+modification de nos logiciels sont les suivantes :
+
+ Stipulations et conditions relatives à la copie, la distribution et la modification
+
+
+ _Article 0.
+ La présente Licence s'applique à tout Programme (ou autre travail) où
+ figure une note, placée par le détenteur des droits, stipulant que ledit
+ Programme ou travail peut être distribué selon les termes de la présente
+ Licence. Le terme Programme désigne aussi bien le Programme
+ lui-même que tout travail qui en est dérivé selon la loi, c'est-à-dire
+ tout ouvrage reproduisant le Programme ou une partie de celui-ci, à
+ l'identique ou bien modifié, et/ou traduit dans une autre langue (la
+ traduction est considérée comme une modification). Chaque personne
+ concernée par la Licence Publique Générale sera désignée par le terme
+ Vous.
+
+ Les activités autres que copie, distribution et modification ne sont pas
+ couvertes par la présente Licence et sortent de son cadre. Rien ne
+ restreint l'utilisation du Programme et les données issues de celui-ci ne
+ sont couvertes que si leur contenu constitue un travail basé sur le
+ logiciel (indépendemment du fait d'avoir été réalisé en lançant le
+ Programme). Tout dépend de ce que le Programme est censé produire.
+
+ _Article 1.
+ Vous pouvez copier et distribuer des copies conformes du code source du
+ Programme, tel que Vous l'avez reçu, sur n'importe quel support, à
+ condition de placer sur chaque copie un copyright approprié et une
+ restriction de garantie, de ne pas modifier ou omettre toutes les
+ stipulations se référant à la présente Licence et à la limitation de
+ garantie, et de fournir avec toute copie du Programme un exemplaire de la
+ Licence.
+
+ Vous pouvez demander une rétribution financière pour la réalisation de la
+ copie et demeurez libre de proposer une garantie assurée par vos soins,
+ moyennant finances.
+
+ _Article 2.
+ Vous pouvez modifier votre copie ou vos copies du Programme ou partie de
+ celui-ci, ou d'un travail basé sur ce Programme, et copier et distribuer
+ ces modifications selon les termes de l'article 1, à condition de Vous
+ conformer également aux conditions suivantes :
+
+
+ a) Ajouter aux fichiers modifiés l'indication très claire des
+ modifications effectuées, ainsi que la date de chaque changement.
+
+ b) Distribuer sous les termes de la Licence Publique Générale
+ l'ensemble de toute réalisation contenant tout ou partie du
+ Programme, avec ou sans modifications.
+ c) Si le Programme modifié lit des commandes de manière interactive
+ lors de son exécution, faire en sorte qu'il affiche, lors d'une
+ invocation ordinaire, le copyright approprié en indiquant
+ clairement la limitation de garantie (ou la garantie que Vous Vous
+ engagez à fournir Vous-même), qu'il stipule que tout utilisateur
+ peut librement redistribuer le Programme selon les conditions de la
+ Licence Publique Générale GNU, et qu'il montre à tout utilisateur
+ comment lire une copie de celle-ci (exception : si le
+ Programme original est interactif mais n'affiche pas un tel
+ message en temps normal, tout travail dérivé de ce Programme ne
+ sera pas non plus contraint de l'afficher).
+
+ Toutes ces conditions s'appliquent à l'ensemble des modifications. Si des
+ éléments identifiables de ce travail ne sont pas dérivés du Programme
+ et peuvent être raisonnablement considérés comme indépendants, la
+ présente Licence ne s'applique pas à ces éléments lorsque Vous les
+ distribuez seuls.
+ Mais, si Vous distribuez ces mêmes éléments comme partie d'un ensemble
+ cohérent dont le reste est basé sur un Programme soumis à la Licence, ils
+ lui sont également soumis, et la Licence s'étend ainsi à l'ensemble du
+ produit, quel qu'en soit l'auteur.
+
+ Cet article n'a pas pour but de s'approprier ou de contester vos
+ droits sur un travail entièrement réalisé par Vous, mais plutôt
+ d'ouvrir droit à un contrôle de la libre distribution de tout travail
+ dérivé ou collectif basé sur le Programme.
+
+ En outre, toute fusion d'un autre travail, non basé sur le Programme,
+ avec le Programme (ou avec un travail dérivé de ce dernier),
+ effectuée sur un support de stockage ou de distribution, ne fait pas
+ tomber cet autre travail sous le contrôle de la Licence.
+
+ _Article 3.
+ Vous pouvez copier et distribuer le Programme (ou tout travail dérivé
+ selon les conditions énoncées dans l'article 1) sous forme de code
+ objet ou exécutable, selon les termes des articles 0 et 1, à
+ condition de respecter les clauses suivantes :
+
+
+ a) Fournir le code source complet du Programme,
+ sous une forme lisible par un ordinateur et selon les termes des
+ articles 0 et 1, sur un support habituellement utilisé pour
+ l'échange de données ou,
+
+ b) Faire une offre écrite, valable pendant au moins trois ans,
+ prévoyant de donner à tout tiers qui en fera la demande une copie,
+ sous forme lisible par un ordinateur, du code source correspondant,
+ pour un tarif n'excédant pas le coût de la copie, selon
+ les termes des articles 0 et 1, sur un support couramment utilisé
+ pour l'échange de données informatiques ou,
+
+ c) Informer le destinataire de l'endroit où le code source peut
+ être obtenu (cette solution n'est recevable que dans le cas d'une
+ distribution non commerciale, et uniquement si Vous avez reçu le
+ Programme sous forme de code objet ou exécutable avec l'offre
+ prévue à l'alinéa b ci-dessus).
+
+
+ Le code source d'un travail désigne la forme de cet ouvrage sous laquelle
+ les modifications sont les plus aisées. Sont ainsi désignés la totalité
+ du code source de tous les modules composant un Programme exécutable, de
+ même que tout fichier de définition associé, ainsi que les scripts
+ utilisés pour effectuer la compilation et l'installation du Programme
+ exécutable. Toutefois, l'environnement standard de développement du
+ système d'exploitation mis en oeuvre (source ou binaire) -- compilateurs,
+ bibliothèques, noyau, etc. -- constitue une exception, sauf si ces
+ éléments sont diffusés en même temps que le Programme exécutable.
+
+ Si la distribution de l'exécutable ou du code objet consiste à offrir un
+ accès permettant de copier le Programme depuis un endroit particulier,
+ l'offre d'un accès équivalent pour se procurer le code source au même
+ endroit est considéré comme une distribution de ce code source, même si
+ l'utilisateur choisit de ne pas profiter de cette offre.
+
+ _Article 4.
+ Vous ne pouvez pas copier, modifier, céder, déposer ou distribuer le
+ Programme d'une autre manière que l'autorise la Licence Publique Générale.
+ Toute tentative de ce type annule immédiatement vos droits d'utilisation du
+ Programme sous cette Licence. Toutefois, les tiers ayant reçu de Vous
+ des copies du Programme ou le droit d'utiliser ces copies continueront à
+ bénéficier de leur droit d'utilisation tant qu'ils respecteront pleinement
+ les conditions de la Licence.
+
+ _Article 5.
+ Ne l'ayant pas signée, Vous n'êtes pas obligé d'accepter cette
+ Licence. Cependant, rien d'autre ne Vous autorise à modifier ou distribuer
+ le Programme ou quelque travaux dérivés : la loi l'interdit tant que Vous
+ n'acceptez pas les termes de cette Licence. En conséquence, en modifiant
+ ou en distribuant le Programme (ou tout travail basé sur lui), Vous
+ acceptez implicitement tous les termes et conditions de cette Licence.
+
+ _Article 6.
+ La diffusion d'un Programme (ou de tout travail dérivé) suppose l'envoi
+ simultané d'une licence autorisant la copie, la distribution ou la
+ modification du Programme, aux termes et conditions de la Licence. Vous
+ n'avez pas le droit d'imposer de restrictions supplémentaires aux droits
+ transmis au destinataire. Vous n'êtes pas responsable du respect de la
+ Licence par un tiers.
+
+ _Article 7.
+ Si, à la suite d'une décision de Justice, d'une plainte en contrefaçon ou
+ pour toute autre raison (liée ou non à la contrefaçon), des conditions Vous
+ sont imposées (que ce soit par ordonnance, accord amiable ou autre) qui se
+ révèlent incompatibles avec les termes de la présente Licence, Vous n'êtes
+ pas pour autant dégagé des obligations liées à celle-ci : si Vous ne
+ pouvez concilier vos obligations légales ou autres avec les conditions de
+ cette Licence, Vous ne devez pas distribuer le Programme.
+
+ Si une partie quelconque de cet article est invalidée ou inapplicable
+ pour quelque raison que ce soit, le reste de l'article continue de
+ s'appliquer et l'intégralité de l'article s'appliquera en toute autre
+ circonstance.
+
+ Le présent article n'a pas pour but de Vous pousser à enfreindre des
+ droits ou des dispositions légales ni en contester la validité ;
+ son seul objectif est de protéger l'intégrité du système de
+ distribution du Logiciel Libre. De nombreuses personnes ont
+ généreusement contribué à la large gamme de Programmes distribuée
+ de cette façon en toute confiance il appartient à chaque
+ auteur/donateur de décider de diffuser ses Programmes selon les critères
+ de son choix.
+
+ _Article 8.
+ Si la distribution et/ou l'utilisation du Programme est limitée dans
+ certains pays par des brevets ou des droits sur des interfaces, le
+ détenteur original des droits qui place le Programme sous la Licence
+ Publique Générale peut ajouter explicitement une clause de limitation
+ géographique excluant ces pays. Dans ce cas, cette clause devient une
+ partie intégrante de la Licence.
+
+ _Article 9.
+ La Free Software Foundation se réserve le droit de publier périodiquement
+ des mises à jour ou de nouvelles versions de la Licence. Rédigées dans le
+ même esprit que la présente version, elles seront cependant susceptibles
+ d'en modifier certains détails à mesure que de nouveaux problèmes se font
+ jour.
+
+ Chaque version possède un numéro distinct. Si le Programme précise un
+ numéro de version de cette Licence et « toute version ultérieure », Vous
+ avez le choix de suivre les termes et conditions de cette version ou de
+ toute autre version plus récente publiée par la Free Software Foundation.
+ Si le Programme ne spécifie aucun numéro de version, Vous pouvez alors
+ choisir l'une quelconque des versions publiées par la Free Software
+ Foundation.
+
+
+ _Article 10.
+ Si Vous désirez incorporer des éléments du Programme dans d'autres
+ Programmes libres dont les conditions de distribution diffèrent, Vous devez
+ écrire à l'auteur pour lui en demander la permission. Pour ce qui est des
+ Programmes directement déposés par la Free Software Foundation,
+ écrivez-nous : une exception est toujours envisageable. Notre décision
+ sera basée sur notre volonté de préserver la liberté de notre Programme ou
+ de ses dérivés et celle de promouvoir le partage et la réutilisation du
+ logiciel en général.
+
+
+ LIMITATION DE GARANTIE
+
+
+ _Article 11.
+
+ Parce que l'utilisation de ce Programme est libre et gratuite, aucune
+ garantie n'est fournie, comme le permet la loi. Sauf mention écrite, les
+ détenteurs du copyright et/ou les tiers fournissent le Programme en l'état,
+ sans aucune sorte de garantie explicite ou implicite, y compris les
+ garanties de commercialisation ou d'adaptation dans un but
+ particulier. Vous assumez tous les risques quant à la qualité et aux effets
+ du Programme. Si le Programme est défectueux, Vous assumez le coût de tous
+ les services, corrections ou réparations nécessaires.
+
+
+ _Article 12.
+ Sauf lorsqu'explicitement prévu par la Loi ou accepté par écrit, ni le
+ détenteur des droits, ni quiconque autorisé à modifier et/ou redistribuer
+ le Programme comme il est permis ci-dessus ne pourra être tenu pour
+ responsable de tout dommage direct, indirect, secondaire ou accessoire
+ (pertes financières dues au manque à gagner, à l'interruption d'activités
+ ou à la perte de données, etc., découlant de l'utilisation du Programme ou
+ de l'impossibilité d'utiliser celui-ci).
+
+
+
+ FIN DES TERMES ET CONDITIONS
+
+ Comment appliquer ces directives à vos nouveaux programmes
+
+Si vous développez un nouveau programme et désirez en faire bénéficier tout
+un chacun, la meilleure méthode est d'en faire un Logiciel Libre que tout
+le monde pourra redistribuer et modifier selon les termes de la Licence
+Publique Générale.
+
+Pour cela, insérez les indications suivantes dans votre programme (il est
+préférable et plus sûr de les faire figurer au début de chaque fichier
+source dans tous les cas, chaque module source devra comporter au
+minimum la ligne de « copyright » et indiquer où résident toutes les
+autres indications):
+
+
+((une ligne pour donner le nom du programme et donner une idée de
+sa finalité))
+Copyright (C) 19xx ((nom de l'auteur))
+
+Ce programme est libre, vous pouvez le redistribuer et/ou le modifier
+selon les termes de la Licence Publique Générale GNU publiée par la
+Free Software Foundation (version 2 ou bien toute autre version
+ultérieure choisie par vous).
+
+Ce programme est distribué car potentiellement utile, mais SANS AUCUNE
+GARANTIE, ni explicite ni implicite, y compris les garanties de
+commercialisation ou d'adaptation dans un but spécifique.
+Reportez-vous à la Licence Publique Générale GNU pour plus de détails.
+
+Vous devez avoir reçu une copie de la Licence Publique Générale GNU
+en même temps que ce programme si ce n'est pas le cas, écrivez à la
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307, États-Unis.
+
+
+Ajoutez également votre adresse électronique, le cas échéant, ainsi que
+votre adresse postale.
+
+Si le programme est interactif, faites-lui afficher un court avertissement
+du type de celui-ci à chaque invocation:
+
+
+...(nom du programme) version 69, Copyright (C) 19aa nom de l'auteur
+
+...(nom du programme) est fourni sans AUCUNE GARANTIE.
+Pour plus de détails, tapez `g'.
+
+Ce programme est libre et vous êtes encouragé à le redistribuer
+sous certaines conditions tapez `c' pour plus de détails.
+
+Les commandes hypothétiques `g' et `c' doivent afficher les sections
+appropriées de la Licence Publique Générale GNU. Bien entendu, vous pouvez
+implanter ces commandes comme bon vous semble : options dans un menu,
+ou bien accessibles d'un clic de souris, etc., tout dépend de votre
+programme.
+
+Si vous officiez en tant que programmeur, n'omettez pas de demander à votre
+employeur, votre établissement scolaire ou autres de signer une décharge
+stipulant leur renoncement aux droits qu'ils pourraient avoir sur le
+programme:
+>
+...((employeur, école...)) déclare par la présente ne pas revendiquer
+de droits sur le programme « (nom du programme) » réalisé par ...((nom de
+l'auteur)).
+
+((signature du responsable)), ...((date)),
+...((nom et qualité du responsable)).
+
+La Licence Publique Générale ne permet pas d'inclure votre programme dans
+des logiciels sous licence commerciale spécifique. Si votre programme est
+une fonction de bibliothèque, vous jugerez probablement plus judicieux de
+le faire relever de la Licence Générale de Bibliothèque GNU (LGPL) plutôt
+que de la présente.
+
==========================================================================
\ No newline at end of file
diff --git a/htdocs/langs/pt_PT/dict.lang b/htdocs/langs/pt_PT/dict.lang
index 2d96850b5fc..8e1ad5acb11 100644
--- a/htdocs/langs/pt_PT/dict.lang
+++ b/htdocs/langs/pt_PT/dict.lang
@@ -1,25 +1,25 @@
-# Dolibarr language file - pt_PT - dict
-CountryFR=França
-CountryBE=Belgica
-CountryIT=Italia
-CountryES=Espanha
-CountryDE=Alemanha
-CountryCH=Suiça
-CountryGB=Grã-Bretanha
-CountryIE=Irlanda
-CountryCN=China
-CountryTN=Tunísia
-CountryUS=Estados Unidos
-CountryMA=Marrocos
-CountryDZ=Algeria
-CountryCA=Canada
-CountryTG=Togo
-CountryGA=Gabão
-CountryNL=Holanda
-CountryHU=Hungria
-CountryRU=Russia
-CountrySE=Suécia
-CountryCI=Costa do Marfim
-CountrySN=Senegal
-CountryAR=Argentina
+# Dolibarr language file - pt_PT - dict
+CountryFR=França
+CountryBE=Belgica
+CountryIT=Italia
+CountryES=Espanha
+CountryDE=Alemanha
+CountryCH=Suiça
+CountryGB=Grã-Bretanha
+CountryIE=Irlanda
+CountryCN=China
+CountryTN=Tunísia
+CountryUS=Estados Unidos
+CountryMA=Marrocos
+CountryDZ=Algeria
+CountryCA=Canada
+CountryTG=Togo
+CountryGA=Gabão
+CountryNL=Holanda
+CountryHU=Hungria
+CountryRU=Russia
+CountrySE=Suécia
+CountryCI=Costa do Marfim
+CountrySN=Senegal
+CountryAR=Argentina
CountryCM=Camarões
\ No newline at end of file
diff --git a/htdocs/langs/pt_PT/html/gpl.txt b/htdocs/langs/pt_PT/html/gpl.txt
index afdd894c1ec..03d34611e3d 100644
--- a/htdocs/langs/pt_PT/html/gpl.txt
+++ b/htdocs/langs/pt_PT/html/gpl.txt
@@ -1,378 +1,378 @@
-LICENÇA PÚBLICA GERAL GNU
-Versão 2, junho de 1991
-
- This is an unofficial translation of the GNU General Public License into
- Portuguese. It was not published by the Free Software Foundation, and does not
- legally state the distribution terms for software that uses the GNU GPL -- only
- the original English text of the GNU GPL does that. However, we hope that this
- translation will help Portuguese speakers understand the GNU GPL better.
-
- Esta é uma tradução não-oficial da Licença Pública Geral GNU ("GPL GNU") para
- Português. Não foi publicada pela Free Software Foundation, e legalmente não
- afirma os termos de distribuição de software que utilize a GPL GNU -- apenas o
- texto original da GPL GNU, em inglês, faz isso. Contudo, esperamos que esta
- tradução ajude aos que falam português a entender melhor a GPL GNU.
-
-Para sugestões ou correcções a esta tradução, contacte:
-
-miguel.andrade@neoscopio.com
-
-
---- Tradução do documento original a partir desta linha ---
-
-
-LICENÇA PÚBLICA GERAL GNU
-Versão 2, junho de 1991
-
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave,
- Cambridge, MA 02139, USA
-
- A qualquer pessoa é permitido copiar e distribuir cópias deste documento de
- licença, desde que sem qualquer alteração.
-
-Introdução
-
- As licenças de software são normalmente desenvolvidas para restringir a
- liberdade de compartilhá-lo e modifica-lo. Pelo contrário, a Licença Pública
- Geral GNU pretende garantir a sua liberdade de compartilhar e modificar o
- software livre -- garantindo que o software será livre para os seus
- utilizadores. Esta Licença Pública Geral aplica-se à maioria do software da
- Free Software Foundation e a qualquer outro programa ao qual o seu autor decida
- aplicá-la. (Algum software da FSF é cobertos pela Licença Pública Geral de
- Bibliotecas.) Também poderá aplicá-la aos seus programas.
-
- Quando nos referimos a software livre, estamo-nos a referir à liberdade e não
- ao preço. A Licença Pública Geral (GPL - General Public Licence - em Inglês.)
- foi desenvolvida para garantir a sua liberdade de distribuir cópias de software
- livre (e cobrar por isso, se quiser); receber o código-fonte ou ter acesso a
- ele, se quiser; poder modificar o software ou utilizar partes dele em novos
- programas livres; e que saiba que está no seu direito de o fazer.
-
- Para proteger seus direitos, precisamos fazer restrições que impeçam a qualquer
- um negar estes direitos ou solicitar que você abdique deles. Estas restrições
- traduzem-se em certas responsabilidades para si, caso venha a distribuir cópias
- do software, ou modificá-lo.
-
- Por exemplo, se você distribuir cópias de um programa sobre este tipo de
- licenciamento, gratuitamente ou por alguma quantia, tem que fornecer igualmente
- todos os direitos que possui sobre ele. Tem igualmente que garantir que os
- destinatários recebam ou possam obter o código-fonte. Além disto, tem que
- fornecer-lhes estes termos para que possam conhecer seus direitos.
-
- Nós protegemos seus direitos por duas formas que se completam: (1) com
- copyright do software e (2) com a oferta desta licença, que lhe dá permissão
- legal para copiar, distribuir e/ou modificar o software.
-
- Além disso, tanto para a protecção do autor quanto a nossa, gostaríamos de
- certificar-nos de que todos entendam que não há qualquer garantia sobre o
- software livre. Se o software é modificado por alguém e redistribuído, queremos
- que seus destinatários saibam que o que eles obtiveram não é original, de forma
- que qualquer problema introduzido por terceiros não interfira na reputação do
- autor original.
-
- Finalmente, qualquer programa é ameaçado constantemente por patentes de
- software. Queremos evitar o perigo de que distribuidores de software livre
- obtenham patentes individuais sobre o software, o que teria o efeito de tornar
- o software proprietário. Para prevenir isso, deixamos claro que qualquer
- patente tem que ser licenciada para uso livre e gratuito por qualquer pessoa,
- ou então que nem necessite ser licenciada.
-
- Os termos e condições precisas para cópia, distribuição e modificação
- encontram-se abaixo:
-
-LICENÇA PÚBLICA GERAL GNU TERMOS E CONDIÇÕES PARA CÓPIA, DISTRIBUIÇÃO E
-MODIFICAÇÃO
-
- 0. Esta licença aplica-se a qualquer programa ou outro trabalho que contenha um
- aviso colocado pelo detentor dos direitos autorais informando que aquele pode
- ser distribuído sob as condições desta Licença Pública Geral. O "Programa"
- abaixo refere-se a qualquer programa ou trabalho e "trabalho baseado no
- Programa" significa tanto o Programa em si, como quaisquer trabalhos derivados,
- de acordo com a lei de direitos de autor: isto quer dizer um trabalho que
- contenha o Programa ou parte dele, tanto na forma original ou modificado, e/ou
- tradução para outros idiomas. ***(Doravante o termo "modificação" ou sinónimos
- serão usados livremente.) *** Cada licenciado é mencionado como "você".
-
- Actividades outras que a cópia, a distribuição e modificação não estão cobertas
- por esta Licença; elas estão fora do seu âmbito. O acto de executar o Programa
- não é restringido e o resultado do Programa é coberto pela licença apenas se o
- seu conteúdo contenha trabalhos baseados no Programa (independentemente de
- terem sido gerados pela execução do Programa). Este último ponto depende das
- funcionalidades específicas de cada programa.
-
- 1. Você pode copiar e distribuir cópias fiéis do código-fonte do Programa da
- mesma forma que você o recebeu, usando qualquer meio, deste que inclua em cada
- cópia um aviso de direitos de autor e uma declaração de inexistência de
- garantias; mantenha intactos todos os avisos que se referem a esta Licença e à
- ausência total de garantias; e forneça aos destinatários do Programa uma cópia
- desta Licença, em conjunto com o Programa.
-
- Você pode cobrar pelo acto físico de transferir uma cópia e pode,
- opcionalmente, oferecer garantias em troca de pagamento.
-
- 2. Você pode modificar sua cópia ou cópias do Programa, ou qualquer parte dele,
- gerando assim um trabalho derivado, copiar e distribuir essas modificações ou
- trabalhos sob os termos da secção 1 acima, desde que se enquadre nas seguintes
- condições:
-
- a) Os arquivos modificados devem conter avisos proeminentes afirmando que você
- alterou os arquivos, incluindo a data de qualquer alteração.
-
- b) Deve ser licenciado, sob os termos desta Licença, integralmente e sem custo
- algum para terceiros, qualquer trabalho seu que contenha ou seja derivado do
- Programa ou de parte dele.
-
- c) Se qualquer programa modificado, quando executado, lê normalmente comandos
- interactivamente, tem que fazer com que, quando iniciado o uso interactivo,
- seja impresso ou mostrado um anúncio de que não há qualquer garantia (ou então
- que você fornece a garantia) e que os utilizadores podem redistribuir o
- programa sob estas condições, ainda informando os utilizadores como consultar
- uma cópia desta Licença. (Excepção: se o Programa em si é interactivo mas
- normalmente não imprime estes tipos de anúncios, então o seu trabalho derivado
- não precisa imprimir um anúncio.)
-
- Estas exigências aplicam-se ao trabalho derivado como um todo. Se secções
- identificáveis de tal trabalho não são derivadas do Programa, e podem ser
- razoavelmente consideradas trabalhos independentes e separados por si só, então
- esta Licença, e seus termos, não se aplicam a estas secções caso as distribua
- como um trabalho separado. Mas se distribuir as mesmas secções como parte de um
- todo que constitui trabalho derivado, a distribuição como um todo tem que
- enquadrar-se nos termos desta Licença, cujos direitos para outros licenciados
- se estendem ao todo, portanto também para toda e qualquer parte do programa,
- independente de quem a escreveu.
-
- Desta forma, esta secção não tem a intenção de reclamar direitos ou contestar
- seus direitos sobre o trabalho escrito completamente por si; ao invés disso, a
- intenção é a de exercitar o direito de controlar a distribuição de trabalhos,
- derivados ou colectivos, baseados no Programa.
-
- Adicionalmente, a mera adição ao Programa (ou a um trabalho derivado deste) de
- um outro trabalho num volume de armazenamento ou meio de distribuição não faz
- esse outro trabalho seja incluído no âmbito desta Licença.
-
- 3. Você pode copiar e distribuir o Programa (ou trabalho derivado, conforme
- descrito na Secção 2) em código-objecto ou em forma executável sob os termos
- das Secções 1 e 2 acima, desde que cumpra uma das seguintes alienas:
-
- a) O faça acompanhar com o código-fonte completo e em forma acessível por
- máquinas, código esse que tem que ser distribuído sob os termos das Secções 1 e
- 2 acima e em meio normalmente utilizado para o intercâmbio de software; ou,
-
- b) O acompanhe com uma oferta escrita, válida por pelo menos três anos, de
- fornecer a qualquer um, com um custo não superior ao custo de distribuição
- física do material, uma cópia do código-fonte completo e em forma acessível por
- máquinas, código esse que tem que ser distribuído sob os termos das Secções 1
- e 2 acima e em meio normalmente utilizado para o intercâmbio de software; ou,
-
- c) O acompanhe com a informação que você recebeu em relação à oferta de
- distribuição do código-fonte correspondente. (Esta alternativa é permitida
- somente em distribuição não comerciais, e apenas se você recebeu o programa em
- forma de código-objecto ou executável, com uma oferta de acordo com a Subsecção
- b) acima.)
-
- O código-fonte de um trabalho corresponde à forma de trabalho preferida para se
- fazer modificações. Para um trabalho em forma executável, o código-fonte
- completo significa todo o código-fonte de todos os módulos que ele contém, mais
- quaisquer arquivos de definição de "interface", mais os "scripts" utilizados
- para se controlar a compilação e a instalação do executável. Contudo, como
- excepção especial, o código-fonte distribuído não precisa incluir qualquer
- componente normalmente distribuído (tanto em forma original quanto binária) com
- os maiores componentes (o compilador, o "kernel" etc.) do sistema operativo sob
- o qual o executável funciona, a menos que o componente em si acompanhe o
- executável.
-
- Se a distribuição do executável ou código-objecto é feita através da oferta de
- acesso a cópias em algum lugar, então oferecer o acesso equivalente a cópia, no
- mesmo lugar, do código-fonte, equivale à distribuição do código-fonte, mesmo
- que terceiros não sejam compelidos a copiar o código-fonte em conjunto com o
- código-objecto.
-
- 4. Você não pode copiar, modificar, sublicenciar ou distribuir o Programa,
- excepto de acordo com as condições expressas nesta Licença. Qualquer outra
- tentativa de cópia, modificação, sublicenciamento ou distribuição do Programa
- não é valida, e cancelará automaticamente os direitos que lhe foram fornecidos
- por esta Licença. No entanto, terceiros que receberam de si cópias ou direitos,
- fornecidos sob os termos desta Licença, não terão a sua licença terminada,
- desde que permaneçam em total concordância com ela.
-
- 5. Você não é obrigado a aceitar esta Licença já que não a assinou. No entanto,
- nada mais lhe dará permissão para modificar ou distribuir o Programa ou
- trabalhos derivados deste. Estas acções são proibidas por lei, caso você não
- aceite esta Licença. Desta forma, ao modificar ou distribuir o Programa (ou
- qualquer trabalho derivado do Programa), você estará a indicar a sua total
- concordância com os termos desta Licença, nomeadamente os termos e condições
- para copiar, distribuir ou modificar o Programa, ou trabalhos baseados nele.
-
- 6. Cada vez que redistribuir o Programa (ou qualquer trabalho derivado), os
- destinatários adquirirão automaticamente do autor original uma licença para
- copiar, distribuir ou modificar o Programa, sujeitos a estes termos e
- condições. Você não poderá impor aos destinatários qualquer outra restrição ao
- exercício dos direitos então adquiridos. Você não é responsável em garantir a
- concordância de terceiros a esta Licença.
-
- 7. Se, em consequência de decisões judiciais ou alegações de violação de
- patentes ou quaisquer outras razões (não limitadas a assuntos relacionados a
- patentes), lhe forem impostas condições (por ordem judicial, acordos ou outras
- formas) e que contradigam as condições desta Licença, elas não o livram das
- condições desta Licença. Se não puder distribuir de forma a satisfazer
- simultaneamente suas obrigações para com esta Licença e para com as outras
- obrigações pertinentes, então como consequência você não poderá distribuir o
- Programa. Por exemplo, se uma licença de patente não permitir a redistribuição,
- sem obrigação ao pagamento de "royalties", por todos aqueles que receberem
- cópias directa ou indirectamente de si, então a única forma de você satisfazer
- a licença de patente e a esta Licença seria a de desistir completamente de
- distribuir o Programa.
-
- Se qualquer parte desta secção for considerada inválida ou não aplicável em
- qualquer circunstância particular, o restante da secção aplica-se, e a secção
- como um todo aplicar-se-á em outras circunstâncias.
-
- O propósito desta secção não é o de induzi-lo a infringir quaisquer patentes ou
- reivindicação de direitos de propriedade de outros, ou a contestar a validade
- de quaisquer dessas reivindicações; esta secção tem como único propósito
- proteger a integridade dos sistemas de distribuição de software livre, que é
- implementado pela prática de licenças públicas. Várias pessoas têm contribuído
- generosamente e em grande escala para software distribuído usando este sistema,
- na certeza de que sua aplicação é feita de forma consistente; fica a critério
- do autor/doador decidir se ele ou ela está disposto(a) a distribuir software
- utilizando outro sistema, e um outro detentor de uma licença não pode impor
- esta ou qualquer outra escolha.
-
- Esta secção destina-se a tornar bastante claro o que se acredita ser
- consequência do restante desta Licença.
-
- 8. Se a distribuição e/ou uso do Programa são restringidos em certos países por
- patentes ou direitos de autor, o detentor dos direitos de autor original, que
- colocou o Programa sob esta Licença, pode incluir uma limitação geográfica de
- distribuição, excluindo aqueles países, de forma a apenas permitir a
- distribuição nos países não excluídos. Nestes casos, esta Licença incorpora a
- limitação como se a mesma constasse escrita nesta Licença.
-
- 9. A Free Software Foundation pode publicar versões revistas e/ou novas da
- Licença Pública Geral de tempos em tempos. Estas novas versões serão similares
- em espírito à versão actual, mas podem diferir em detalhes que resolvam novos
- problemas ou situações.
-
- A cada versão é dada um número distinto. Se o Programa especifica um número de
- versão específico desta Licença que se aplica a ele e a "qualquer nova versão",
- você tem a opção de aceitar os termos e condições daquela versão ou de qualquer
- outra versão posterior publicada pela Free Software Foundation. Se o programa
- não especificar um número de versão desta Licença, poderá escolher qualquer
- versão publicada pela Free Software Foundation.
-
- 10. Se você pretende incorporar partes do Programa em outros programas livres
- cujas condições de distribuição sejam diferentes, escreva ao autor e solicite
- permissão para tal. Para o software que a Free Software Foundation detém
- direitos de autor, escreva à Free Software Foundation; às vezes nós permitimos
- excepções para estes casos. A nossa decisão será guiada por dois objectivos: o
- de preservar a condição de liberdade de todas os trabalhos derivados do nosso
- software livre, e o de promover a partilha e reutilização de software de um
- modo geral.
-
-
-AUSÊNCIA DE GARANTIAS
-
- 11. UMA VEZ QUE O PROGRAMA É LICENCIADO SEM ÓNUS, NÃO HÁ QUALQUER GARANTIA PARA
- O PROGRAMA, NA EXTENSÃO PERMITIDA PELAS LEIS APLICÁVEIS. EXCEPTO QUANDO
- EXPRESSO DE FORMA ESCRITA, OS DETENTORES DOS DIREITOS AUTORAIS E/OU TERCEIROS
- DISPONIBILIZAM O PROGRAMA "COMO ESTA", SEM QUALQUER TIPO DE GARANTIAS,
- EXPRESSAS OU IMPLÍCITAS, INCLUINDO, MAS NÃO LIMITADO A, ÀS GARANTIAS IMPLÍCITAS
- DE COMERCIALIZAÇÃO E ÀS DE ADEQUAÇÃO A QUALQUER PROPÓSITO. O RISCO COM A
- QUALIDADE E DESEMPENHO DO PROGRAMA É TOTALMENTE SEU. CASO O PROGRAMA SE REVELE
- DEFEITUOSO, VOCÊ ASSUME OS CUSTOS DE TODAS AS MANUTENÇÕES, REPAROS E CORRECÇÕES
- QUE JULGUE NECESSÁRIAS.
-
- 12. EM NENHUMA CIRCUNSTÂNCIA, A MENOS QUE EXIGIDO PELAS LEIS APLICÁVEIS OU
- ACORDO ESCRITO, OS DETENTORES DOS DIREITOS DE AUTOR, OU QUALQUER OUTRA PARTE
- QUE POSSA MODIFICAR E/OU REDISTRIBUIR O PROGRAMA CONFORME PERMITIDO ACIMA,
- SERÃO RESPONSABILIZADOS POR SI OU POR SEU INTERMÉDIO, POR DANOS, INCLUINDO
- QUALQUER DANO EM GERAL, ESPECIAL, ACIDENTAL OU CONSEQUENTE, RESULTANTES DO USO
- OU INCAPACIDADE DE USO DO PROGRAMA (INCLUINDO, MAS NÃO LIMITADO A, A PERDA DE
- DADOS OU DADOS TORNADOS INCORRECTOS, OU PERDAS SOFRIDAS POR SI OU POR OUTRAS
- PARTES, OU FALHAS DO PROGRAMA AO OPERAR COM QUALQUER OUTRO PROGRAMA), MESMO QUE
- TAIS DETENTORES OU PARTES TENHAM SIDO AVISADOS DA POSSIBILIDADE DE TAIS DANOS.
-
-FIM DOS TERMOS E CONDIÇÕES
-
----------------------
-
-
-
-Como Aplicar Estes Termos aos Seus Novos Programas
-
- Se você desenvolver um novo programa, e quer que ele seja utilizado amplamente
- pelo público, a melhor forma de alcançar este objectivo é torná-lo software
- livre, software que qualquer um pode redistribuir e alterar, sob estes termos.
-
- Para tal, inclua os seguintes avisos no programa. É mais seguro inclui-los logo
- no início de cada arquivo-fonte para reforçar mais efectivamente a inexistência
- de garantias; e cada arquivo deve conter pelo menos a linha de "copyright" e
- uma indicação sobre onde encontrar o texto completo da licença.
-
-Exemplo:
-
-
-
- Copyright (C)
-
- Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo sob
- os termos da Licença Pública Geral GNU, conforme publicada pela Free Software
- Foundation; tanto a versão 2 da Licença como (a seu critério) qualquer versão
- mais actual.
-
- Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
- GARANTIA; incluindo as garantias implícitas de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
- A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
- obter mais detalhes.
-
- Você deve ter recebido uma cópia da Licença Pública Geral GNU em conjunto com
- este programa; caso contrário, escreva para a Free Software Foundation, Inc.,
- 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-
-
-
- Inclua também informações sobre como contactá-lo electronicamente e por carta.
-
- Se o programa é interactivo, faça-o mostrar um aviso breve como este, ao
- iniciar um modo interactivo:
-
-Exemplo:
-
-
- Gnomovision versão 69, Copyright (C) O Gnomovision não
- possui QUALQUER GARANTIA; para obter mais detalhes escreva `mostrar g'. É
- software livre e você está convidado a redistribui-lo sob certas condições;
- digite `mostrar c' para obter detalhes.
-
- Os comandos hipotéticos `mostrar g e `mostrar c' devem mostrar as partes
- apropriadas da Licença Pública Geral. É claro que os comandos que escolher usar
- podem ser activados de outra forma que `mostrar g' e `mostrar c'; podem ser
- cliques do rato ou itens de um menu -- o que melhor se adequar ao seu programa.
-
- Você também deve obter da sua entidade patronal (se trabalhar como
- programador) ou escola, conforme o caso, uma "declaração de ausência de
- direitos autorais" sobre o programa, se necessário. Aqui está um exemplo:
-
-
- Neoscopio Lda., declara a ausência de quaisquer direitos autorais sobre o
- programa `Gnomovision' escrito por Jorge Andrade.
-
-10 de Junho de 2004
- ,
-
-Miguel Nunes, Gerente de Neoscopio Lda.
-
-
-
- Esta Licença Pública Geral não permite incorporar o seu programa em programas
- proprietários. Se o seu programa é uma biblioteca de sub-rotinas, poderá
- considerar mais útil permitir ligar aplicações proprietárias com a biblioteca.
- Se é isto que pretende, use a Licença Pública Geral de Bibliotecas GNU, em vez
- desta Licença.
-
-
-
-
-
-
+LICENÇA PÚBLICA GERAL GNU
+Versão 2, junho de 1991
+
+ This is an unofficial translation of the GNU General Public License into
+ Portuguese. It was not published by the Free Software Foundation, and does not
+ legally state the distribution terms for software that uses the GNU GPL -- only
+ the original English text of the GNU GPL does that. However, we hope that this
+ translation will help Portuguese speakers understand the GNU GPL better.
+
+ Esta é uma tradução não-oficial da Licença Pública Geral GNU ("GPL GNU") para
+ Português. Não foi publicada pela Free Software Foundation, e legalmente não
+ afirma os termos de distribuição de software que utilize a GPL GNU -- apenas o
+ texto original da GPL GNU, em inglês, faz isso. Contudo, esperamos que esta
+ tradução ajude aos que falam português a entender melhor a GPL GNU.
+
+Para sugestões ou correcções a esta tradução, contacte:
+
+miguel.andrade@neoscopio.com
+
+
+--- Tradução do documento original a partir desta linha ---
+
+
+LICENÇA PÚBLICA GERAL GNU
+Versão 2, junho de 1991
+
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave,
+ Cambridge, MA 02139, USA
+
+ A qualquer pessoa é permitido copiar e distribuir cópias deste documento de
+ licença, desde que sem qualquer alteração.
+
+Introdução
+
+ As licenças de software são normalmente desenvolvidas para restringir a
+ liberdade de compartilhá-lo e modifica-lo. Pelo contrário, a Licença Pública
+ Geral GNU pretende garantir a sua liberdade de compartilhar e modificar o
+ software livre -- garantindo que o software será livre para os seus
+ utilizadores. Esta Licença Pública Geral aplica-se à maioria do software da
+ Free Software Foundation e a qualquer outro programa ao qual o seu autor decida
+ aplicá-la. (Algum software da FSF é cobertos pela Licença Pública Geral de
+ Bibliotecas.) Também poderá aplicá-la aos seus programas.
+
+ Quando nos referimos a software livre, estamo-nos a referir à liberdade e não
+ ao preço. A Licença Pública Geral (GPL - General Public Licence - em Inglês.)
+ foi desenvolvida para garantir a sua liberdade de distribuir cópias de software
+ livre (e cobrar por isso, se quiser); receber o código-fonte ou ter acesso a
+ ele, se quiser; poder modificar o software ou utilizar partes dele em novos
+ programas livres; e que saiba que está no seu direito de o fazer.
+
+ Para proteger seus direitos, precisamos fazer restrições que impeçam a qualquer
+ um negar estes direitos ou solicitar que você abdique deles. Estas restrições
+ traduzem-se em certas responsabilidades para si, caso venha a distribuir cópias
+ do software, ou modificá-lo.
+
+ Por exemplo, se você distribuir cópias de um programa sobre este tipo de
+ licenciamento, gratuitamente ou por alguma quantia, tem que fornecer igualmente
+ todos os direitos que possui sobre ele. Tem igualmente que garantir que os
+ destinatários recebam ou possam obter o código-fonte. Além disto, tem que
+ fornecer-lhes estes termos para que possam conhecer seus direitos.
+
+ Nós protegemos seus direitos por duas formas que se completam: (1) com
+ copyright do software e (2) com a oferta desta licença, que lhe dá permissão
+ legal para copiar, distribuir e/ou modificar o software.
+
+ Além disso, tanto para a protecção do autor quanto a nossa, gostaríamos de
+ certificar-nos de que todos entendam que não há qualquer garantia sobre o
+ software livre. Se o software é modificado por alguém e redistribuído, queremos
+ que seus destinatários saibam que o que eles obtiveram não é original, de forma
+ que qualquer problema introduzido por terceiros não interfira na reputação do
+ autor original.
+
+ Finalmente, qualquer programa é ameaçado constantemente por patentes de
+ software. Queremos evitar o perigo de que distribuidores de software livre
+ obtenham patentes individuais sobre o software, o que teria o efeito de tornar
+ o software proprietário. Para prevenir isso, deixamos claro que qualquer
+ patente tem que ser licenciada para uso livre e gratuito por qualquer pessoa,
+ ou então que nem necessite ser licenciada.
+
+ Os termos e condições precisas para cópia, distribuição e modificação
+ encontram-se abaixo:
+
+LICENÇA PÚBLICA GERAL GNU TERMOS E CONDIÇÕES PARA CÓPIA, DISTRIBUIÇÃO E
+MODIFICAÇÃO
+
+ 0. Esta licença aplica-se a qualquer programa ou outro trabalho que contenha um
+ aviso colocado pelo detentor dos direitos autorais informando que aquele pode
+ ser distribuído sob as condições desta Licença Pública Geral. O "Programa"
+ abaixo refere-se a qualquer programa ou trabalho e "trabalho baseado no
+ Programa" significa tanto o Programa em si, como quaisquer trabalhos derivados,
+ de acordo com a lei de direitos de autor: isto quer dizer um trabalho que
+ contenha o Programa ou parte dele, tanto na forma original ou modificado, e/ou
+ tradução para outros idiomas. ***(Doravante o termo "modificação" ou sinónimos
+ serão usados livremente.) *** Cada licenciado é mencionado como "você".
+
+ Actividades outras que a cópia, a distribuição e modificação não estão cobertas
+ por esta Licença; elas estão fora do seu âmbito. O acto de executar o Programa
+ não é restringido e o resultado do Programa é coberto pela licença apenas se o
+ seu conteúdo contenha trabalhos baseados no Programa (independentemente de
+ terem sido gerados pela execução do Programa). Este último ponto depende das
+ funcionalidades específicas de cada programa.
+
+ 1. Você pode copiar e distribuir cópias fiéis do código-fonte do Programa da
+ mesma forma que você o recebeu, usando qualquer meio, deste que inclua em cada
+ cópia um aviso de direitos de autor e uma declaração de inexistência de
+ garantias; mantenha intactos todos os avisos que se referem a esta Licença e à
+ ausência total de garantias; e forneça aos destinatários do Programa uma cópia
+ desta Licença, em conjunto com o Programa.
+
+ Você pode cobrar pelo acto físico de transferir uma cópia e pode,
+ opcionalmente, oferecer garantias em troca de pagamento.
+
+ 2. Você pode modificar sua cópia ou cópias do Programa, ou qualquer parte dele,
+ gerando assim um trabalho derivado, copiar e distribuir essas modificações ou
+ trabalhos sob os termos da secção 1 acima, desde que se enquadre nas seguintes
+ condições:
+
+ a) Os arquivos modificados devem conter avisos proeminentes afirmando que você
+ alterou os arquivos, incluindo a data de qualquer alteração.
+
+ b) Deve ser licenciado, sob os termos desta Licença, integralmente e sem custo
+ algum para terceiros, qualquer trabalho seu que contenha ou seja derivado do
+ Programa ou de parte dele.
+
+ c) Se qualquer programa modificado, quando executado, lê normalmente comandos
+ interactivamente, tem que fazer com que, quando iniciado o uso interactivo,
+ seja impresso ou mostrado um anúncio de que não há qualquer garantia (ou então
+ que você fornece a garantia) e que os utilizadores podem redistribuir o
+ programa sob estas condições, ainda informando os utilizadores como consultar
+ uma cópia desta Licença. (Excepção: se o Programa em si é interactivo mas
+ normalmente não imprime estes tipos de anúncios, então o seu trabalho derivado
+ não precisa imprimir um anúncio.)
+
+ Estas exigências aplicam-se ao trabalho derivado como um todo. Se secções
+ identificáveis de tal trabalho não são derivadas do Programa, e podem ser
+ razoavelmente consideradas trabalhos independentes e separados por si só, então
+ esta Licença, e seus termos, não se aplicam a estas secções caso as distribua
+ como um trabalho separado. Mas se distribuir as mesmas secções como parte de um
+ todo que constitui trabalho derivado, a distribuição como um todo tem que
+ enquadrar-se nos termos desta Licença, cujos direitos para outros licenciados
+ se estendem ao todo, portanto também para toda e qualquer parte do programa,
+ independente de quem a escreveu.
+
+ Desta forma, esta secção não tem a intenção de reclamar direitos ou contestar
+ seus direitos sobre o trabalho escrito completamente por si; ao invés disso, a
+ intenção é a de exercitar o direito de controlar a distribuição de trabalhos,
+ derivados ou colectivos, baseados no Programa.
+
+ Adicionalmente, a mera adição ao Programa (ou a um trabalho derivado deste) de
+ um outro trabalho num volume de armazenamento ou meio de distribuição não faz
+ esse outro trabalho seja incluído no âmbito desta Licença.
+
+ 3. Você pode copiar e distribuir o Programa (ou trabalho derivado, conforme
+ descrito na Secção 2) em código-objecto ou em forma executável sob os termos
+ das Secções 1 e 2 acima, desde que cumpra uma das seguintes alienas:
+
+ a) O faça acompanhar com o código-fonte completo e em forma acessível por
+ máquinas, código esse que tem que ser distribuído sob os termos das Secções 1 e
+ 2 acima e em meio normalmente utilizado para o intercâmbio de software; ou,
+
+ b) O acompanhe com uma oferta escrita, válida por pelo menos três anos, de
+ fornecer a qualquer um, com um custo não superior ao custo de distribuição
+ física do material, uma cópia do código-fonte completo e em forma acessível por
+ máquinas, código esse que tem que ser distribuído sob os termos das Secções 1
+ e 2 acima e em meio normalmente utilizado para o intercâmbio de software; ou,
+
+ c) O acompanhe com a informação que você recebeu em relação à oferta de
+ distribuição do código-fonte correspondente. (Esta alternativa é permitida
+ somente em distribuição não comerciais, e apenas se você recebeu o programa em
+ forma de código-objecto ou executável, com uma oferta de acordo com a Subsecção
+ b) acima.)
+
+ O código-fonte de um trabalho corresponde à forma de trabalho preferida para se
+ fazer modificações. Para um trabalho em forma executável, o código-fonte
+ completo significa todo o código-fonte de todos os módulos que ele contém, mais
+ quaisquer arquivos de definição de "interface", mais os "scripts" utilizados
+ para se controlar a compilação e a instalação do executável. Contudo, como
+ excepção especial, o código-fonte distribuído não precisa incluir qualquer
+ componente normalmente distribuído (tanto em forma original quanto binária) com
+ os maiores componentes (o compilador, o "kernel" etc.) do sistema operativo sob
+ o qual o executável funciona, a menos que o componente em si acompanhe o
+ executável.
+
+ Se a distribuição do executável ou código-objecto é feita através da oferta de
+ acesso a cópias em algum lugar, então oferecer o acesso equivalente a cópia, no
+ mesmo lugar, do código-fonte, equivale à distribuição do código-fonte, mesmo
+ que terceiros não sejam compelidos a copiar o código-fonte em conjunto com o
+ código-objecto.
+
+ 4. Você não pode copiar, modificar, sublicenciar ou distribuir o Programa,
+ excepto de acordo com as condições expressas nesta Licença. Qualquer outra
+ tentativa de cópia, modificação, sublicenciamento ou distribuição do Programa
+ não é valida, e cancelará automaticamente os direitos que lhe foram fornecidos
+ por esta Licença. No entanto, terceiros que receberam de si cópias ou direitos,
+ fornecidos sob os termos desta Licença, não terão a sua licença terminada,
+ desde que permaneçam em total concordância com ela.
+
+ 5. Você não é obrigado a aceitar esta Licença já que não a assinou. No entanto,
+ nada mais lhe dará permissão para modificar ou distribuir o Programa ou
+ trabalhos derivados deste. Estas acções são proibidas por lei, caso você não
+ aceite esta Licença. Desta forma, ao modificar ou distribuir o Programa (ou
+ qualquer trabalho derivado do Programa), você estará a indicar a sua total
+ concordância com os termos desta Licença, nomeadamente os termos e condições
+ para copiar, distribuir ou modificar o Programa, ou trabalhos baseados nele.
+
+ 6. Cada vez que redistribuir o Programa (ou qualquer trabalho derivado), os
+ destinatários adquirirão automaticamente do autor original uma licença para
+ copiar, distribuir ou modificar o Programa, sujeitos a estes termos e
+ condições. Você não poderá impor aos destinatários qualquer outra restrição ao
+ exercício dos direitos então adquiridos. Você não é responsável em garantir a
+ concordância de terceiros a esta Licença.
+
+ 7. Se, em consequência de decisões judiciais ou alegações de violação de
+ patentes ou quaisquer outras razões (não limitadas a assuntos relacionados a
+ patentes), lhe forem impostas condições (por ordem judicial, acordos ou outras
+ formas) e que contradigam as condições desta Licença, elas não o livram das
+ condições desta Licença. Se não puder distribuir de forma a satisfazer
+ simultaneamente suas obrigações para com esta Licença e para com as outras
+ obrigações pertinentes, então como consequência você não poderá distribuir o
+ Programa. Por exemplo, se uma licença de patente não permitir a redistribuição,
+ sem obrigação ao pagamento de "royalties", por todos aqueles que receberem
+ cópias directa ou indirectamente de si, então a única forma de você satisfazer
+ a licença de patente e a esta Licença seria a de desistir completamente de
+ distribuir o Programa.
+
+ Se qualquer parte desta secção for considerada inválida ou não aplicável em
+ qualquer circunstância particular, o restante da secção aplica-se, e a secção
+ como um todo aplicar-se-á em outras circunstâncias.
+
+ O propósito desta secção não é o de induzi-lo a infringir quaisquer patentes ou
+ reivindicação de direitos de propriedade de outros, ou a contestar a validade
+ de quaisquer dessas reivindicações; esta secção tem como único propósito
+ proteger a integridade dos sistemas de distribuição de software livre, que é
+ implementado pela prática de licenças públicas. Várias pessoas têm contribuído
+ generosamente e em grande escala para software distribuído usando este sistema,
+ na certeza de que sua aplicação é feita de forma consistente; fica a critério
+ do autor/doador decidir se ele ou ela está disposto(a) a distribuir software
+ utilizando outro sistema, e um outro detentor de uma licença não pode impor
+ esta ou qualquer outra escolha.
+
+ Esta secção destina-se a tornar bastante claro o que se acredita ser
+ consequência do restante desta Licença.
+
+ 8. Se a distribuição e/ou uso do Programa são restringidos em certos países por
+ patentes ou direitos de autor, o detentor dos direitos de autor original, que
+ colocou o Programa sob esta Licença, pode incluir uma limitação geográfica de
+ distribuição, excluindo aqueles países, de forma a apenas permitir a
+ distribuição nos países não excluídos. Nestes casos, esta Licença incorpora a
+ limitação como se a mesma constasse escrita nesta Licença.
+
+ 9. A Free Software Foundation pode publicar versões revistas e/ou novas da
+ Licença Pública Geral de tempos em tempos. Estas novas versões serão similares
+ em espírito à versão actual, mas podem diferir em detalhes que resolvam novos
+ problemas ou situações.
+
+ A cada versão é dada um número distinto. Se o Programa especifica um número de
+ versão específico desta Licença que se aplica a ele e a "qualquer nova versão",
+ você tem a opção de aceitar os termos e condições daquela versão ou de qualquer
+ outra versão posterior publicada pela Free Software Foundation. Se o programa
+ não especificar um número de versão desta Licença, poderá escolher qualquer
+ versão publicada pela Free Software Foundation.
+
+ 10. Se você pretende incorporar partes do Programa em outros programas livres
+ cujas condições de distribuição sejam diferentes, escreva ao autor e solicite
+ permissão para tal. Para o software que a Free Software Foundation detém
+ direitos de autor, escreva à Free Software Foundation; às vezes nós permitimos
+ excepções para estes casos. A nossa decisão será guiada por dois objectivos: o
+ de preservar a condição de liberdade de todas os trabalhos derivados do nosso
+ software livre, e o de promover a partilha e reutilização de software de um
+ modo geral.
+
+
+AUSÊNCIA DE GARANTIAS
+
+ 11. UMA VEZ QUE O PROGRAMA É LICENCIADO SEM ÓNUS, NÃO HÁ QUALQUER GARANTIA PARA
+ O PROGRAMA, NA EXTENSÃO PERMITIDA PELAS LEIS APLICÁVEIS. EXCEPTO QUANDO
+ EXPRESSO DE FORMA ESCRITA, OS DETENTORES DOS DIREITOS AUTORAIS E/OU TERCEIROS
+ DISPONIBILIZAM O PROGRAMA "COMO ESTA", SEM QUALQUER TIPO DE GARANTIAS,
+ EXPRESSAS OU IMPLÍCITAS, INCLUINDO, MAS NÃO LIMITADO A, ÀS GARANTIAS IMPLÍCITAS
+ DE COMERCIALIZAÇÃO E ÀS DE ADEQUAÇÃO A QUALQUER PROPÓSITO. O RISCO COM A
+ QUALIDADE E DESEMPENHO DO PROGRAMA É TOTALMENTE SEU. CASO O PROGRAMA SE REVELE
+ DEFEITUOSO, VOCÊ ASSUME OS CUSTOS DE TODAS AS MANUTENÇÕES, REPAROS E CORRECÇÕES
+ QUE JULGUE NECESSÁRIAS.
+
+ 12. EM NENHUMA CIRCUNSTÂNCIA, A MENOS QUE EXIGIDO PELAS LEIS APLICÁVEIS OU
+ ACORDO ESCRITO, OS DETENTORES DOS DIREITOS DE AUTOR, OU QUALQUER OUTRA PARTE
+ QUE POSSA MODIFICAR E/OU REDISTRIBUIR O PROGRAMA CONFORME PERMITIDO ACIMA,
+ SERÃO RESPONSABILIZADOS POR SI OU POR SEU INTERMÉDIO, POR DANOS, INCLUINDO
+ QUALQUER DANO EM GERAL, ESPECIAL, ACIDENTAL OU CONSEQUENTE, RESULTANTES DO USO
+ OU INCAPACIDADE DE USO DO PROGRAMA (INCLUINDO, MAS NÃO LIMITADO A, A PERDA DE
+ DADOS OU DADOS TORNADOS INCORRECTOS, OU PERDAS SOFRIDAS POR SI OU POR OUTRAS
+ PARTES, OU FALHAS DO PROGRAMA AO OPERAR COM QUALQUER OUTRO PROGRAMA), MESMO QUE
+ TAIS DETENTORES OU PARTES TENHAM SIDO AVISADOS DA POSSIBILIDADE DE TAIS DANOS.
+
+FIM DOS TERMOS E CONDIÇÕES
+
+---------------------
+
+
+
+Como Aplicar Estes Termos aos Seus Novos Programas
+
+ Se você desenvolver um novo programa, e quer que ele seja utilizado amplamente
+ pelo público, a melhor forma de alcançar este objectivo é torná-lo software
+ livre, software que qualquer um pode redistribuir e alterar, sob estes termos.
+
+ Para tal, inclua os seguintes avisos no programa. É mais seguro inclui-los logo
+ no início de cada arquivo-fonte para reforçar mais efectivamente a inexistência
+ de garantias; e cada arquivo deve conter pelo menos a linha de "copyright" e
+ uma indicação sobre onde encontrar o texto completo da licença.
+
+Exemplo:
+
+
+
+ Copyright (C)
+
+ Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo sob
+ os termos da Licença Pública Geral GNU, conforme publicada pela Free Software
+ Foundation; tanto a versão 2 da Licença como (a seu critério) qualquer versão
+ mais actual.
+
+ Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
+ GARANTIA; incluindo as garantias implícitas de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
+ A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
+ obter mais detalhes.
+
+ Você deve ter recebido uma cópia da Licença Pública Geral GNU em conjunto com
+ este programa; caso contrário, escreva para a Free Software Foundation, Inc.,
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+
+
+ Inclua também informações sobre como contactá-lo electronicamente e por carta.
+
+ Se o programa é interactivo, faça-o mostrar um aviso breve como este, ao
+ iniciar um modo interactivo:
+
+Exemplo:
+
+
+ Gnomovision versão 69, Copyright (C) O Gnomovision não
+ possui QUALQUER GARANTIA; para obter mais detalhes escreva `mostrar g'. É
+ software livre e você está convidado a redistribui-lo sob certas condições;
+ digite `mostrar c' para obter detalhes.
+
+ Os comandos hipotéticos `mostrar g e `mostrar c' devem mostrar as partes
+ apropriadas da Licença Pública Geral. É claro que os comandos que escolher usar
+ podem ser activados de outra forma que `mostrar g' e `mostrar c'; podem ser
+ cliques do rato ou itens de um menu -- o que melhor se adequar ao seu programa.
+
+ Você também deve obter da sua entidade patronal (se trabalhar como
+ programador) ou escola, conforme o caso, uma "declaração de ausência de
+ direitos autorais" sobre o programa, se necessário. Aqui está um exemplo:
+
+
+ Neoscopio Lda., declara a ausência de quaisquer direitos autorais sobre o
+ programa `Gnomovision' escrito por Jorge Andrade.
+
+10 de Junho de 2004
+ ,
+
+Miguel Nunes, Gerente de Neoscopio Lda.
+
+
+
+ Esta Licença Pública Geral não permite incorporar o seu programa em programas
+ proprietários. Se o seu programa é uma biblioteca de sub-rotinas, poderá
+ considerar mais útil permitir ligar aplicações proprietárias com a biblioteca.
+ Se é isto que pretende, use a Licença Pública Geral de Bibliotecas GNU, em vez
+ desta Licença.
+
+
+
+
+
+
diff --git a/htdocs/langs/pt_PT/suppliers.lang b/htdocs/langs/pt_PT/suppliers.lang
index 1b6073bb4d4..3c6d055c838 100644
--- a/htdocs/langs/pt_PT/suppliers.lang
+++ b/htdocs/langs/pt_PT/suppliers.lang
@@ -1,10 +1,10 @@
-# Dolibarr language file - pt_PT - fornecedores
-Suppliers=Fornecedores
-Supplier=Fornecedor
-AddSupplier=Adicionar Fornecedor
-SupplierRemoved=Fornecedor removido
-NewSupplier=Novo fornecedor
-History=História
-OrderCard=Cartão de encomenda
-ListOfSuppliers=Lista de fornecedores
+# Dolibarr language file - pt_PT - fornecedores
+Suppliers=Fornecedores
+Supplier=Fornecedor
+AddSupplier=Adicionar Fornecedor
+SupplierRemoved=Fornecedor removido
+NewSupplier=Novo fornecedor
+History=História
+OrderCard=Cartão de encomenda
+ListOfSuppliers=Lista de fornecedores
ShowSupplier=Mostrar fonecedor
\ No newline at end of file
diff --git a/htdocs/oscommerce_ws/ws_server/ws_orders.php b/htdocs/oscommerce_ws/ws_server/ws_orders.php
index 3342ed07550..b2e2fb29db7 100644
--- a/htdocs/oscommerce_ws/ws_server/ws_orders.php
+++ b/htdocs/oscommerce_ws/ws_server/ws_orders.php
@@ -1,4 +1,4 @@
-
*
*
@@ -19,21 +19,21 @@
* $Source$
*
*/
-set_magic_quotes_runtime(0);
-
-// Soap Server.
-require_once('./lib/nusoap.php');
+set_magic_quotes_runtime(0);
+
+// Soap Server.
+require_once('./lib/nusoap.php');
require_once('./includes/configure.php');
-
-// Create the soap Object
-$s = new soap_server;
-
-// Register the methods available for clients
+
+// Create the soap Object
+$s = new soap_server;
+
+// Register the methods available for clients
$s->register('get_CAmensuel');
$s->register('get_orders');
$s->register('get_lastOrderClients');
-$s->register('get_Order');
+$s->register('get_Order');
/*----------------------------------------------
* renvoie un tableau avec le CA mensuel réalisé
@@ -41,7 +41,7 @@ $s->register('get_Order');
function get_CAmensuel() {
//on se connecte
- if (!($connexion = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD))) return new soap_fault("Server", "MySQL 1", "connection impossible");
+ if (!($connexion = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD))) return new soap_fault("Server", "MySQL 1", "connection impossible");
if (!($db = mysql_select_db(DB_DATABASE, $connexion))) return new soap_fault("Server", "MySQL 2", mysql_error());
//la requête
@@ -54,10 +54,10 @@ function get_CAmensuel() {
if (!($resquer = mysql_query($sql,$connexion))) return new soap_fault("Server", "MySQL 3 ".$sql, mysql_error());
- switch ($numrows = mysql_numrows($resquer)) {
- case 0 :
- return new soap_fault("Server", "MySQL 4", $sql);
- break;
+ switch ($numrows = mysql_numrows($resquer)) {
+ case 0 :
+ return new soap_fault("Server", "MySQL 4", $sql);
+ break;
default :
$i = 0;
while ( $i < $numrows) {
@@ -74,7 +74,7 @@ return $result;
function get_orders($limit='', $status='') {
//on se connecte
- if (!($connexion = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD))) return new soap_fault("Server", "MySQL 1", "connection impossible");
+ if (!($connexion = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD))) return new soap_fault("Server", "MySQL 1", "connection impossible");
if (!($db = mysql_select_db(DB_DATABASE, $connexion))) return new soap_fault("Server", "MySQL 2", mysql_error());
//on recherche
@@ -88,10 +88,10 @@ if ($limit > 0) $sql .= " LIMIT ".$limit;
if (!($resquer = mysql_query($sql,$connexion))) return new soap_fault("Server", "MySQL 3 ".$sql, mysql_error());
$result ='';
- switch ($numrows = mysql_numrows($resquer)) {
- case 0 :
+ switch ($numrows = mysql_numrows($resquer)) {
+ case 0 :
//return new soap_fault("Server", "MySQL 4", "produit inexistant");
- break;
+ break;
default :
$i = 0;
while ( $i < $numrows) {
@@ -109,7 +109,7 @@ return $result;
function get_lastOrderClients($id='',$name='',$limit='') {
//on se connecte
- if (!($connexion = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD))) return new soap_fault("Server", "MySQL 1", "connection impossible");
+ if (!($connexion = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD))) return new soap_fault("Server", "MySQL 1", "connection impossible");
if (!($db = mysql_select_db(DB_DATABASE, $connexion))) return new soap_fault("Server", "MySQL 2", mysql_error());
//on recherche
@@ -122,10 +122,10 @@ function get_lastOrderClients($id='',$name='',$limit='') {
if (!($resquer = mysql_query($sql,$connexion))) return new soap_fault("Server", "MySQL 3 ".$sql, mysql_error());
$result ='';
- switch ($numrows = mysql_numrows($resquer)) {
- case 0 :
+ switch ($numrows = mysql_numrows($resquer)) {
+ case 0 :
return new soap_fault("Server", "MySQL 4", "produit inexistant");
- break;
+ break;
default :
$i = 0;
while ( $i < $numrows) {
@@ -145,7 +145,7 @@ function get_Order($orderid="0")
{
//on se connecte
- if (!($connexion = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD))) return new soap_fault("Server", "MySQL 1", "connection impossible");
+ if (!($connexion = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD))) return new soap_fault("Server", "MySQL 1", "connection impossible");
if (!($db = mysql_select_db(DB_DATABASE, $connexion))) return new soap_fault("Server", "MySQL 2", mysql_error());
//on recherche la commande
@@ -166,10 +166,10 @@ $sql .= " ORDER BY o.date_purchased desc";
if (!($resquer = mysql_query($sql,$connexion))) return new soap_fault("Server", "MySQL 3 ".$sql, mysql_error());
$result ='';
- switch ($numrows = mysql_numrows($resquer)) {
- case 0 :
+ switch ($numrows = mysql_numrows($resquer)) {
+ case 0 :
return new soap_fault("Server", "MySQL 4", "commande inexistante ".$sql);
- break;
+ break;
default :
$i = 0;
while ( $i < $numrows) {
@@ -190,10 +190,10 @@ if ($orderid > 0)
if (!($resquer = mysql_query($sql,$connexion))) return new soap_fault("Server", "MySQL 3 ".$sql, mysql_error());
- switch ($numrows = mysql_numrows($resquer)) {
- case 0 :
+ switch ($numrows = mysql_numrows($resquer)) {
+ case 0 :
return new soap_fault("Server", "MySQL 5", "commande sans articles");
- break;
+ break;
default :
while ( $i < $numrows) {
@@ -208,8 +208,8 @@ mysql_close($connexion);
return $result;
}
-
-// Return the results.
+
+// Return the results.
$s->service($HTTP_RAW_POST_DATA);
-
-?>
+
+?>
diff --git a/htdocs/telephonie/contrat/statut7.png b/htdocs/telephonie/contrat/statut7.png
index 41ff0d4681d..f1ad7558e49 100644
Binary files a/htdocs/telephonie/contrat/statut7.png and b/htdocs/telephonie/contrat/statut7.png differ
diff --git a/htdocs/theme/auguria/fckeditor/images/.cvsignore b/htdocs/theme/auguria/fckeditor/images/.cvsignore
index 020f3864407..78d24c23930 100644
--- a/htdocs/theme/auguria/fckeditor/images/.cvsignore
+++ b/htdocs/theme/auguria/fckeditor/images/.cvsignore
@@ -1,2 +1,2 @@
-*.db
-*.db
+*.db
+*.db
diff --git a/htdocs/theme/auguria/img/.cvsignore b/htdocs/theme/auguria/img/.cvsignore
index a92ea3e3f61..98e6ef67fad 100644
--- a/htdocs/theme/auguria/img/.cvsignore
+++ b/htdocs/theme/auguria/img/.cvsignore
@@ -1 +1 @@
-*.db
+*.db
diff --git a/htdocs/theme/auguria/img/bouton/.cvsignore b/htdocs/theme/auguria/img/bouton/.cvsignore
index a92ea3e3f61..98e6ef67fad 100644
--- a/htdocs/theme/auguria/img/bouton/.cvsignore
+++ b/htdocs/theme/auguria/img/bouton/.cvsignore
@@ -1 +1 @@
-*.db
+*.db
diff --git a/htdocs/theme/dev/.cvsignore b/htdocs/theme/dev/.cvsignore
index a92ea3e3f61..98e6ef67fad 100644
--- a/htdocs/theme/dev/.cvsignore
+++ b/htdocs/theme/dev/.cvsignore
@@ -1 +1 @@
-*.db
+*.db
diff --git a/htdocs/theme/dolibarr/.cvsignore b/htdocs/theme/dolibarr/.cvsignore
index a92ea3e3f61..98e6ef67fad 100644
--- a/htdocs/theme/dolibarr/.cvsignore
+++ b/htdocs/theme/dolibarr/.cvsignore
@@ -1 +1 @@
-*.db
+*.db
diff --git a/htdocs/theme/dolibarr/img/filenew.png b/htdocs/theme/dolibarr/img/filenew.png
index 7be37e89a77..f1ad7558e49 100644
Binary files a/htdocs/theme/dolibarr/img/filenew.png and b/htdocs/theme/dolibarr/img/filenew.png differ
diff --git a/htdocs/theme/eldy/.cvsignore b/htdocs/theme/eldy/.cvsignore
index a92ea3e3f61..98e6ef67fad 100644
--- a/htdocs/theme/eldy/.cvsignore
+++ b/htdocs/theme/eldy/.cvsignore
@@ -1 +1 @@
-*.db
+*.db
diff --git a/htdocs/theme/freelug/.cvsignore b/htdocs/theme/freelug/.cvsignore
index a92ea3e3f61..98e6ef67fad 100644
--- a/htdocs/theme/freelug/.cvsignore
+++ b/htdocs/theme/freelug/.cvsignore
@@ -1 +1 @@
-*.db
+*.db
diff --git a/htdocs/theme/freelug/fckeditor/images/.cvsignore b/htdocs/theme/freelug/fckeditor/images/.cvsignore
index 020f3864407..78d24c23930 100644
--- a/htdocs/theme/freelug/fckeditor/images/.cvsignore
+++ b/htdocs/theme/freelug/fckeditor/images/.cvsignore
@@ -1,2 +1,2 @@
-*.db
-*.db
+*.db
+*.db
diff --git a/htdocs/theme/freelug/img/.cvsignore b/htdocs/theme/freelug/img/.cvsignore
index a92ea3e3f61..98e6ef67fad 100644
--- a/htdocs/theme/freelug/img/.cvsignore
+++ b/htdocs/theme/freelug/img/.cvsignore
@@ -1 +1 @@
-*.db
+*.db
diff --git a/htdocs/theme/yellow/.cvsignore b/htdocs/theme/yellow/.cvsignore
index a92ea3e3f61..98e6ef67fad 100644
--- a/htdocs/theme/yellow/.cvsignore
+++ b/htdocs/theme/yellow/.cvsignore
@@ -1 +1 @@
-*.db
+*.db
diff --git a/htdocs/theme/yellow/fckeditor/images/.cvsignore b/htdocs/theme/yellow/fckeditor/images/.cvsignore
index 020f3864407..78d24c23930 100644
--- a/htdocs/theme/yellow/fckeditor/images/.cvsignore
+++ b/htdocs/theme/yellow/fckeditor/images/.cvsignore
@@ -1,2 +1,2 @@
-*.db
-*.db
+*.db
+*.db
diff --git a/htdocs/theme/yellow/img/.cvsignore b/htdocs/theme/yellow/img/.cvsignore
index a92ea3e3f61..98e6ef67fad 100644
--- a/htdocs/theme/yellow/img/.cvsignore
+++ b/htdocs/theme/yellow/img/.cvsignore
@@ -1 +1 @@
-*.db
+*.db
diff --git a/mysql/tables/llx_osc_categories.sql b/mysql/tables/llx_osc_categories.sql
index 1534915c151..d02e02855e7 100644
--- a/mysql/tables/llx_osc_categories.sql
+++ b/mysql/tables/llx_osc_categories.sql
@@ -1,26 +1,26 @@
--- phpMyAdmin SQL Dump
--- version 2.6.2-Debian-3sarge3
--- http://www.phpmyadmin.net
---
--- Serveur: localhost
--- Généré le : Mercredi 20 Juin 2007 à 15:13
--- Version du serveur: 4.0.24
--- Version de PHP: 4.3.10-19
---
--- Base de données: `dolidev`
---
-
--- --------------------------------------------------------
-
---
--- Structure de la table `llx_osc_categories`
---
-
-CREATE TABLE llx_osc_categories (
- rowid int(11) unsigned NOT NULL auto_increment,
- dolicatid int(11) NOT NULL default '0',
- osccatid int(11) NOT NULL default '0',
- PRIMARY KEY (rowid),
- UNIQUE KEY dolicatid (dolicatid),
- UNIQUE KEY osccatid (osccatid)
-) TYPE=InnoDB COMMENT='Correspondance categorie Dolibarr categorie OSC';
+-- phpMyAdmin SQL Dump
+-- version 2.6.2-Debian-3sarge3
+-- http://www.phpmyadmin.net
+--
+-- Serveur: localhost
+-- Généré le : Mercredi 20 Juin 2007 à 15:13
+-- Version du serveur: 4.0.24
+-- Version de PHP: 4.3.10-19
+--
+-- Base de données: `dolidev`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Structure de la table `llx_osc_categories`
+--
+
+CREATE TABLE llx_osc_categories (
+ rowid int(11) unsigned NOT NULL auto_increment,
+ dolicatid int(11) NOT NULL default '0',
+ osccatid int(11) NOT NULL default '0',
+ PRIMARY KEY (rowid),
+ UNIQUE KEY dolicatid (dolicatid),
+ UNIQUE KEY osccatid (osccatid)
+) TYPE=InnoDB COMMENT='Correspondance categorie Dolibarr categorie OSC';
diff --git a/pgsql/tables/llx_accountingaccount.key.sql b/pgsql/tables/llx_accountingaccount.key.sql
index 243e8351274..98a69d9e99e 100644
--- a/pgsql/tables/llx_accountingaccount.key.sql
+++ b/pgsql/tables/llx_accountingaccount.key.sql
@@ -1,31 +1,31 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2003 Rodolphe Quiedeville
--- Copyright (C) 2005-2006 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
--- ===========================================================================
-
-
-ALTER TABLE llx_accountingaccount ADD INDEX idx_accountingaccount_fk_pcg_version (fk_pcg_version);
-
-
-ALTER TABLE llx_accountingaccount ADD CONSTRAINT fk_accountingaccount_fk_pcg_version FOREIGN KEY (fk_pcg_version) REFERENCES llx_accountingsystem (pcg_version);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2003 Rodolphe Quiedeville
+-- Copyright (C) 2005-2006 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+-- ===========================================================================
+
+
+ALTER TABLE llx_accountingaccount ADD INDEX idx_accountingaccount_fk_pcg_version (fk_pcg_version);
+
+
+ALTER TABLE llx_accountingaccount ADD CONSTRAINT fk_accountingaccount_fk_pcg_version FOREIGN KEY (fk_pcg_version) REFERENCES llx_accountingsystem (pcg_version);
diff --git a/pgsql/tables/llx_accountingaccount.sql b/pgsql/tables/llx_accountingaccount.sql
index 4c792346bdc..b69c0332c7d 100644
--- a/pgsql/tables/llx_accountingaccount.sql
+++ b/pgsql/tables/llx_accountingaccount.sql
@@ -1,35 +1,35 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2004-2006 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
--- ============================================================================
-
-create table llx_accountingaccount
-(
- rowid SERIAL PRIMARY KEY,
- "fk_pcg_version" varchar(12) NOT NULL,
- "pcg_type" varchar(20) NOT NULL,
- "pcg_subtype" varchar(20) NOT NULL,
- "label" varchar(128) NOT NULL,
- "account_number" varchar(20) NOT NULL,
- "account_parent" varchar(20)
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2004-2006 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+-- ============================================================================
+
+create table llx_accountingaccount
+(
+ rowid SERIAL PRIMARY KEY,
+ "fk_pcg_version" varchar(12) NOT NULL,
+ "pcg_type" varchar(20) NOT NULL,
+ "pcg_subtype" varchar(20) NOT NULL,
+ "label" varchar(128) NOT NULL,
+ "account_number" varchar(20) NOT NULL,
+ "account_parent" varchar(20)
+);
diff --git a/pgsql/tables/llx_accountingdebcred.sql b/pgsql/tables/llx_accountingdebcred.sql
index 89daac20f3c..1c67fe81cd5 100644
--- a/pgsql/tables/llx_accountingdebcred.sql
+++ b/pgsql/tables/llx_accountingdebcred.sql
@@ -1,32 +1,32 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2004-2006 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
--- ============================================================================
-
-create table llx_accountingdebcred
-(
- "fk_transaction" integer NOT NULL,
- "fk_account" integer NOT NULL,
- "amount" real NOT NULL,
- "direction" varchar(1) NOT NULL
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2004-2006 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+-- ============================================================================
+
+create table llx_accountingdebcred
+(
+ "fk_transaction" integer NOT NULL,
+ "fk_account" integer NOT NULL,
+ "amount" real NOT NULL,
+ "direction" varchar(1) NOT NULL
+);
diff --git a/pgsql/tables/llx_accountingsystem.sql b/pgsql/tables/llx_accountingsystem.sql
index 1258b76c9ed..736f4701944 100644
--- a/pgsql/tables/llx_accountingsystem.sql
+++ b/pgsql/tables/llx_accountingsystem.sql
@@ -1,35 +1,35 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2004-2006 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
--- ============================================================================
-
-create table llx_accountingsystem
-(
- pcg_version varchar(12) PRIMARY KEY,
- "fk_pays" integer NOT NULL,
- "label" varchar(128) NOT NULL,
- "datec" varchar(12) NOT NULL,
- "fk_author" varchar(20),
- "tms" timestamp,
- "active" smallint DEFAULT 0
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2004-2006 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+-- ============================================================================
+
+create table llx_accountingsystem
+(
+ pcg_version varchar(12) PRIMARY KEY,
+ "fk_pays" integer NOT NULL,
+ "label" varchar(128) NOT NULL,
+ "datec" varchar(12) NOT NULL,
+ "fk_author" varchar(20),
+ "tms" timestamp,
+ "active" smallint DEFAULT 0
+);
diff --git a/pgsql/tables/llx_accountingtransaction.sql b/pgsql/tables/llx_accountingtransaction.sql
index 38d05310c78..88790550464 100644
--- a/pgsql/tables/llx_accountingtransaction.sql
+++ b/pgsql/tables/llx_accountingtransaction.sql
@@ -1,37 +1,37 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2004-2006 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
--- ============================================================================
-
-create table llx_accountingtransaction
-(
- rowid SERIAL PRIMARY KEY,
- "label" varchar(128) NOT NULL,
- "datec" date NOT NULL,
- "fk_author" varchar(20) NOT NULL,
- "tms" timestamp,
- "fk_facture" integer,
- "fk_facture_fourn" integer,
- "fk_paiement" integer,
- "fk_paiement_fourn" integer
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2004-2006 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+-- ============================================================================
+
+create table llx_accountingtransaction
+(
+ rowid SERIAL PRIMARY KEY,
+ "label" varchar(128) NOT NULL,
+ "datec" date NOT NULL,
+ "fk_author" varchar(20) NOT NULL,
+ "tms" timestamp,
+ "fk_facture" integer,
+ "fk_facture_fourn" integer,
+ "fk_paiement" integer,
+ "fk_paiement_fourn" integer
+);
diff --git a/pgsql/tables/llx_action_def.sql b/pgsql/tables/llx_action_def.sql
index 99c9dceb3de..9991464cd41 100644
--- a/pgsql/tables/llx_action_def.sql
+++ b/pgsql/tables/llx_action_def.sql
@@ -1,37 +1,37 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2003 Rodolphe Quiedeville
--- Copyright (C) 2004 Benoit Mortier
--- Copyright (C) 2004 Guillaume Delecourt
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
-
-create table llx_action_def
-(
- rowid integer NOT NULL PRIMARY KEY,
- "code" varchar(24) UNIQUE NOT NULL,
- "tms" timestamp,
- "titre" varchar(255) NOT NULL,
- "description" text,
- "objet_type" varchar(10) CHECK (objet_type IN ('ficheinter','facture','propale','mailing'))
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2003 Rodolphe Quiedeville
+-- Copyright (C) 2004 Benoit Mortier
+-- Copyright (C) 2004 Guillaume Delecourt
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+
+create table llx_action_def
+(
+ rowid integer NOT NULL PRIMARY KEY,
+ "code" varchar(24) UNIQUE NOT NULL,
+ "tms" timestamp,
+ "titre" varchar(255) NOT NULL,
+ "description" text,
+ "objet_type" varchar(10) CHECK (objet_type IN ('ficheinter','facture','propale','mailing'))
+);
diff --git a/pgsql/tables/llx_actioncomm.key.sql b/pgsql/tables/llx_actioncomm.key.sql
index f1071fbcaa8..886354ffd78 100644
--- a/pgsql/tables/llx_actioncomm.key.sql
+++ b/pgsql/tables/llx_actioncomm.key.sql
@@ -1,31 +1,31 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2005 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===========================================================================
-
-
-ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_datea (datea);
-ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_fk_soc (fk_soc);
-ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_fk_contact (fk_contact);
-ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_fk_facture (fk_facture);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===========================================================================
+
+
+ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_datea (datea);
+ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_fk_soc (fk_soc);
+ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_fk_contact (fk_contact);
+ALTER TABLE llx_actioncomm ADD INDEX idx_actioncomm_fk_facture (fk_facture);
diff --git a/pgsql/tables/llx_actioncomm.sql b/pgsql/tables/llx_actioncomm.sql
index b0faa459e3a..6a70c462011 100644
--- a/pgsql/tables/llx_actioncomm.sql
+++ b/pgsql/tables/llx_actioncomm.sql
@@ -1,53 +1,53 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2001-2003 Rodolphe Quiedeville
--- Copyright (C) 2005 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- Actions commerciales
---
--- ========================================================================
-
-create table llx_actioncomm
-(
- id SERIAL PRIMARY KEY,
- "datec" timestamp, -- date creation
- "datep" timestamp, -- date 0%
- "datea" timestamp, -- date 100%
- "tms" timestamp, -- date modif
- "fk_action" integer,
- "label" varchar(50) NOT NULL, -- libelle de l'action
- "fk_soc" integer,
- "fk_contact" integer default 0,
- "fk_user_action" integer, -- id de la personne qui doit effectuer l'action
- "fk_user_author" integer,
- "priority" smallint,
- "percent" smallint NOT NULL default 0,
- "note" text,
- "propalrowid" integer,
- "fk_commande" integer,
- "fk_facture" integer
-);
-
-
-
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2001-2003 Rodolphe Quiedeville
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- Actions commerciales
+--
+-- ========================================================================
+
+create table llx_actioncomm
+(
+ id SERIAL PRIMARY KEY,
+ "datec" timestamp, -- date creation
+ "datep" timestamp, -- date 0%
+ "datea" timestamp, -- date 100%
+ "tms" timestamp, -- date modif
+ "fk_action" integer,
+ "label" varchar(50) NOT NULL, -- libelle de l'action
+ "fk_soc" integer,
+ "fk_contact" integer default 0,
+ "fk_user_action" integer, -- id de la personne qui doit effectuer l'action
+ "fk_user_author" integer,
+ "priority" smallint,
+ "percent" smallint NOT NULL default 0,
+ "note" text,
+ "propalrowid" integer,
+ "fk_commande" integer,
+ "fk_facture" integer
+);
+
+
+
+
diff --git a/pgsql/tables/llx_adherent.sql b/pgsql/tables/llx_adherent.sql
index ef404764540..5a86ba2b934 100644
--- a/pgsql/tables/llx_adherent.sql
+++ b/pgsql/tables/llx_adherent.sql
@@ -1,63 +1,63 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2002-2004 Rodolphe Quiedeville
--- Copyright (C) 2002-2003 Jean-Louis Bergamo
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
---
--- statut
--- 0 : non adherent
--- 1 : adherent
-
-create table llx_adherent
-(
- rowid SERIAL PRIMARY KEY,
- "tms" timestamp,
- "statut" smallint NOT NULL DEFAULT 0,
- "public" smallint NOT NULL DEFAULT 0, -- certain champ de la fiche sont ils public ou pas ?
- "fk_adherent_type" smallint,
- "morphy" varchar(3) CHECK (morphy IN ('mor','phy')) NOT NULL, -- personne morale / personne physique
- "datevalid" timestamp, -- date de validation
- "datec" timestamp, -- date de creation
- "prenom" varchar(50),
- "nom" varchar(50),
- "societe" varchar(50),
- "adresse" text,
- "cp" varchar(30),
- "ville" varchar(50),
- "pays" varchar(50),
- "email" varchar(255),
- "login" varchar(50) NOT NULL, -- login utilise pour editer sa fiche
- "pass" varchar(50), -- pass utilise pour editer sa fiche
- "naiss" date, -- date de naissance
- "photo" varchar(255), -- url vers la photo de l'adherent
- "fk_user_author" integer NOT NULL,
- "fk_user_mod" integer NOT NULL,
- "fk_user_valid" integer NOT NULL,
- "datefin" timestamp, -- date de fin de validité de la cotisation
- "note" text,
-
- UNIQUE(login)
-);
-
-CREATE INDEX idx_llx_adherent_login ON llx_adherent (login);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2002-2004 Rodolphe Quiedeville
+-- Copyright (C) 2002-2003 Jean-Louis Bergamo
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+--
+-- statut
+-- 0 : non adherent
+-- 1 : adherent
+
+create table llx_adherent
+(
+ rowid SERIAL PRIMARY KEY,
+ "tms" timestamp,
+ "statut" smallint NOT NULL DEFAULT 0,
+ "public" smallint NOT NULL DEFAULT 0, -- certain champ de la fiche sont ils public ou pas ?
+ "fk_adherent_type" smallint,
+ "morphy" varchar(3) CHECK (morphy IN ('mor','phy')) NOT NULL, -- personne morale / personne physique
+ "datevalid" timestamp, -- date de validation
+ "datec" timestamp, -- date de creation
+ "prenom" varchar(50),
+ "nom" varchar(50),
+ "societe" varchar(50),
+ "adresse" text,
+ "cp" varchar(30),
+ "ville" varchar(50),
+ "pays" varchar(50),
+ "email" varchar(255),
+ "login" varchar(50) NOT NULL, -- login utilise pour editer sa fiche
+ "pass" varchar(50), -- pass utilise pour editer sa fiche
+ "naiss" date, -- date de naissance
+ "photo" varchar(255), -- url vers la photo de l'adherent
+ "fk_user_author" integer NOT NULL,
+ "fk_user_mod" integer NOT NULL,
+ "fk_user_valid" integer NOT NULL,
+ "datefin" timestamp, -- date de fin de validité de la cotisation
+ "note" text,
+
+ UNIQUE(login)
+);
+
+CREATE INDEX idx_llx_adherent_login ON llx_adherent (login);
diff --git a/pgsql/tables/llx_adherent_options.sql b/pgsql/tables/llx_adherent_options.sql
index 16401ff1dc1..fcc8e88ebeb 100644
--- a/pgsql/tables/llx_adherent_options.sql
+++ b/pgsql/tables/llx_adherent_options.sql
@@ -1,37 +1,37 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2002-2003 Rodolphe Quiedeville
--- Copyright (C) 2002-2003 Jean-Louis Bergamo
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
-
-
-create table llx_adherent_options
-(
- optid SERIAL PRIMARY KEY,
- "tms" timestamp,
- "adhid" integer NOT NULL, -- id de l'adherent auquel correspond ces attributs optionnel
- UNIQUE(adhid)
-);
-
-CREATE INDEX idx_llx_adherent_options_adhid ON llx_adherent_options (adhid);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2002-2003 Rodolphe Quiedeville
+-- Copyright (C) 2002-2003 Jean-Louis Bergamo
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+
+
+create table llx_adherent_options
+(
+ optid SERIAL PRIMARY KEY,
+ "tms" timestamp,
+ "adhid" integer NOT NULL, -- id de l'adherent auquel correspond ces attributs optionnel
+ UNIQUE(adhid)
+);
+
+CREATE INDEX idx_llx_adherent_options_adhid ON llx_adherent_options (adhid);
diff --git a/pgsql/tables/llx_adherent_options_label.sql b/pgsql/tables/llx_adherent_options_label.sql
index fdb5b16b09b..534ee7c9980 100644
--- a/pgsql/tables/llx_adherent_options_label.sql
+++ b/pgsql/tables/llx_adherent_options_label.sql
@@ -1,33 +1,33 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2002-2003 Rodolphe Quiedeville
--- Copyright (C) 2002-2003 Jean-Louis Bergamo
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
-
-create table llx_adherent_options_label
-(
- name varchar(64) PRIMARY KEY, -- nom de l'attribut
- "tms" timestamp,
- "label" varchar(255) NOT NULL -- label correspondant a l'attribut
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2002-2003 Rodolphe Quiedeville
+-- Copyright (C) 2002-2003 Jean-Louis Bergamo
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+
+create table llx_adherent_options_label
+(
+ name varchar(64) PRIMARY KEY, -- nom de l'attribut
+ "tms" timestamp,
+ "label" varchar(255) NOT NULL -- label correspondant a l'attribut
+);
diff --git a/pgsql/tables/llx_adherent_type.sql b/pgsql/tables/llx_adherent_type.sql
index c7d502c589d..343250332ba 100644
--- a/pgsql/tables/llx_adherent_type.sql
+++ b/pgsql/tables/llx_adherent_type.sql
@@ -1,42 +1,42 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2002-2003 Rodolphe Quiedeville
--- Copyright (C) 2002-2003 Jean-Louis Bergamo
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
---
--- statut
--- 0 : actif
--- 1 : inactif
-
-create table llx_adherent_type
-(
- rowid SERIAL PRIMARY KEY,
- "tms" timestamp,
- "statut" smallint NOT NULL DEFAULT 0,
- "libelle" varchar(50),
- "cotisation" varchar(3) CHECK (cotisation IN ('yes','no')) NOT NULL DEFAULT 'yes',
- "vote" varchar(3) CHECK (vote IN ('yes','no')) NOT NULL DEFAULT 'yes',
- "note" text,
- "mail_valid" text -- mail envoye a la validation
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2002-2003 Rodolphe Quiedeville
+-- Copyright (C) 2002-2003 Jean-Louis Bergamo
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+--
+-- statut
+-- 0 : actif
+-- 1 : inactif
+
+create table llx_adherent_type
+(
+ rowid SERIAL PRIMARY KEY,
+ "tms" timestamp,
+ "statut" smallint NOT NULL DEFAULT 0,
+ "libelle" varchar(50),
+ "cotisation" varchar(3) CHECK (cotisation IN ('yes','no')) NOT NULL DEFAULT 'yes',
+ "vote" varchar(3) CHECK (vote IN ('yes','no')) NOT NULL DEFAULT 'yes',
+ "note" text,
+ "mail_valid" text -- mail envoye a la validation
+);
diff --git a/pgsql/tables/llx_appro.sql b/pgsql/tables/llx_appro.sql
index 9d166328ec4..aa9cfe3f72c 100644
--- a/pgsql/tables/llx_appro.sql
+++ b/pgsql/tables/llx_appro.sql
@@ -1,37 +1,37 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2003 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ============================================================================
-
-create table llx_appro
-(
- rowid SERIAL PRIMARY KEY,
- "datec" timestamp,
- "tms" timestamp,
- "fk_product" integer NOT NULL,
- "quantity" smallint NOT NULL,
- "price" real,
- "fk_user_author" integer
-);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2003 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ============================================================================
+
+create table llx_appro
+(
+ rowid SERIAL PRIMARY KEY,
+ "datec" timestamp,
+ "tms" timestamp,
+ "fk_product" integer NOT NULL,
+ "quantity" smallint NOT NULL,
+ "price" real,
+ "fk_user_author" integer
+);
+
diff --git a/pgsql/tables/llx_bank.sql b/pgsql/tables/llx_bank.sql
index 879adfa5704..e74ea90ab84 100644
--- a/pgsql/tables/llx_bank.sql
+++ b/pgsql/tables/llx_bank.sql
@@ -1,47 +1,47 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2000-2002 Rodolphe Quiedeville
--- Copyright (C) 2005 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ===================================================================
-
-
-
-create table llx_bank
-(
- rowid SERIAL PRIMARY KEY,
- "datec" timestamp,
- "datev" date, -- date de valeur
- "dateo" date, -- date operation
- "amount" real NOT NULL default 0,
- "label" varchar(255),
- "fk_account" integer,
- "fk_user_author" integer,
- "fk_user_rappro" integer,
- "fk_type" varchar(4), -- CB, Virement, cheque
- "num_releve" varchar(50),
- "num_chq" int,
- "rappro" smallint default 0,
- "note" text,
- "author" varchar(40) -- a supprimer apres migration
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2000-2002 Rodolphe Quiedeville
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ===================================================================
+
+
+
+create table llx_bank
+(
+ rowid SERIAL PRIMARY KEY,
+ "datec" timestamp,
+ "datev" date, -- date de valeur
+ "dateo" date, -- date operation
+ "amount" real NOT NULL default 0,
+ "label" varchar(255),
+ "fk_account" integer,
+ "fk_user_author" integer,
+ "fk_user_rappro" integer,
+ "fk_type" varchar(4), -- CB, Virement, cheque
+ "num_releve" varchar(50),
+ "num_chq" int,
+ "rappro" smallint default 0,
+ "note" text,
+ "author" varchar(40) -- a supprimer apres migration
+);
diff --git a/pgsql/tables/llx_bank_account.key.sql b/pgsql/tables/llx_bank_account.key.sql
index 3652d317e22..eee225dfa7e 100644
--- a/pgsql/tables/llx_bank_account.key.sql
+++ b/pgsql/tables/llx_bank_account.key.sql
@@ -1,28 +1,28 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2005 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ============================================================================
-
-
-ALTER TABLE llx_bank_account ADD UNIQUE uk_bank_account_label (label);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ============================================================================
+
+
+ALTER TABLE llx_bank_account ADD UNIQUE uk_bank_account_label (label);
diff --git a/pgsql/tables/llx_bank_account.sql b/pgsql/tables/llx_bank_account.sql
index 7615ff25717..6d686d7daf3 100644
--- a/pgsql/tables/llx_bank_account.sql
+++ b/pgsql/tables/llx_bank_account.sql
@@ -1,54 +1,54 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- =============================================================================
--- Copyright (C) 2000-2004 Rodolphe Quiedeville
--- Copyright (C) 2004-2005 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
---
--- courant : type de compte: 0 epargne, 1 courant, 2 caisse
--- clos : le compte est-il clos ou encore ouvert
---
--- =============================================================================
-
-create table llx_bank_account
-(
- rowid SERIAL PRIMARY KEY,
- "datec" timestamp,
- "tms" timestamp,
- "ref" varchar(12) NOT NULL,
- "label" varchar(30) NOT NULL,
- "bank" varchar(60),
- "code_banque" varchar(7),
- "code_guichet" varchar(6),
- "number" varchar(255),
- "cle_rib" varchar(5),
- "bic" varchar(10),
- "iban_prefix" varchar(5),
- "domiciliation" varchar(255),
- "proprio" varchar(60),
- "adresse_proprio" varchar(255),
- "courant" smallint DEFAULT 0 NOT NULL,
- "clos" smallint DEFAULT 0 NOT NULL,
- "rappro" smallint DEFAULT 1,
- "url" varchar(128),
- "account_number" varchar(8)
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- =============================================================================
+-- Copyright (C) 2000-2004 Rodolphe Quiedeville
+-- Copyright (C) 2004-2005 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+--
+-- courant : type de compte: 0 epargne, 1 courant, 2 caisse
+-- clos : le compte est-il clos ou encore ouvert
+--
+-- =============================================================================
+
+create table llx_bank_account
+(
+ rowid SERIAL PRIMARY KEY,
+ "datec" timestamp,
+ "tms" timestamp,
+ "ref" varchar(12) NOT NULL,
+ "label" varchar(30) NOT NULL,
+ "bank" varchar(60),
+ "code_banque" varchar(7),
+ "code_guichet" varchar(6),
+ "number" varchar(255),
+ "cle_rib" varchar(5),
+ "bic" varchar(10),
+ "iban_prefix" varchar(5),
+ "domiciliation" varchar(255),
+ "proprio" varchar(60),
+ "adresse_proprio" varchar(255),
+ "courant" smallint DEFAULT 0 NOT NULL,
+ "clos" smallint DEFAULT 0 NOT NULL,
+ "rappro" smallint DEFAULT 1,
+ "url" varchar(128),
+ "account_number" varchar(8)
+);
diff --git a/pgsql/tables/llx_bank_categ.sql b/pgsql/tables/llx_bank_categ.sql
index ae82812d5bf..1b60c922002 100644
--- a/pgsql/tables/llx_bank_categ.sql
+++ b/pgsql/tables/llx_bank_categ.sql
@@ -1,29 +1,29 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ===================================================================
-
-create table llx_bank_categ
-(
- rowid SERIAL PRIMARY KEY,
- "label" varchar(255)
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ===================================================================
+
+create table llx_bank_categ
+(
+ rowid SERIAL PRIMARY KEY,
+ "label" varchar(255)
+);
diff --git a/pgsql/tables/llx_bank_class.sql b/pgsql/tables/llx_bank_class.sql
index 1a7c575e3d2..f4c725d0464 100644
--- a/pgsql/tables/llx_bank_class.sql
+++ b/pgsql/tables/llx_bank_class.sql
@@ -1,32 +1,32 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ===================================================================
-
-
-create table llx_bank_class
-(
- "lineid" integer NOT NULL,
- "fk_categ" integer NOT NULL
-);
-
-CREATE INDEX idx_llx_bank_class_lineid ON llx_bank_class (lineid);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ===================================================================
+
+
+create table llx_bank_class
+(
+ "lineid" integer NOT NULL,
+ "fk_categ" integer NOT NULL
+);
+
+CREATE INDEX idx_llx_bank_class_lineid ON llx_bank_class (lineid);
diff --git a/pgsql/tables/llx_bank_url.key.sql b/pgsql/tables/llx_bank_url.key.sql
index c37e47031e0..47dbb06e060 100644
--- a/pgsql/tables/llx_bank_url.key.sql
+++ b/pgsql/tables/llx_bank_url.key.sql
@@ -1,28 +1,28 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2005 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
-
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+
+
ALTER TABLE llx_bank_url ADD UNIQUE uk_bank_url (fk_bank,url_id);
\ No newline at end of file
diff --git a/pgsql/tables/llx_bank_url.sql b/pgsql/tables/llx_bank_url.sql
index dfe785c4463..00f6b058e05 100644
--- a/pgsql/tables/llx_bank_url.sql
+++ b/pgsql/tables/llx_bank_url.sql
@@ -1,35 +1,35 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2003 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
-
-create table llx_bank_url
-(
- rowid SERIAL PRIMARY KEY,
- "fk_bank" integer,
- "url_id" integer,
- "url" varchar(255),
- "label" varchar(255),
- "type" varchar(8) CHECK (type IN ('company','payment','member','donation','charge'))
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2003 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+
+create table llx_bank_url
+(
+ rowid SERIAL PRIMARY KEY,
+ "fk_bank" integer,
+ "url_id" integer,
+ "url" varchar(255),
+ "label" varchar(255),
+ "type" varchar(8) CHECK (type IN ('company','payment','member','donation','charge'))
+);
diff --git a/pgsql/tables/llx_bookmark.key.sql b/pgsql/tables/llx_bookmark.key.sql
index 136f1e3cdaa..884cda006f1 100644
--- a/pgsql/tables/llx_bookmark.key.sql
+++ b/pgsql/tables/llx_bookmark.key.sql
@@ -1,29 +1,29 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2005 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
-
-
-ALTER TABLE llx_bookmark ADD UNIQUE uk_bookmark_url (fk_user, url);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+
+
+ALTER TABLE llx_bookmark ADD UNIQUE uk_bookmark_url (fk_user, url);
ALTER TABLE llx_bookmark ADD UNIQUE uk_bookmark_title (fk_user, title);
\ No newline at end of file
diff --git a/pgsql/tables/llx_bookmark.sql b/pgsql/tables/llx_bookmark.sql
index 4cd397e6d5c..dba390fbb87 100644
--- a/pgsql/tables/llx_bookmark.sql
+++ b/pgsql/tables/llx_bookmark.sql
@@ -1,35 +1,35 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ===================================================================
-
-create table llx_bookmark
-(
- rowid SERIAL PRIMARY KEY,
- "fk_soc" integer,
- "fk_user" integer NOT NULL,
- "dateb" timestamp,
- "url" varchar(128) NOT NULL,
- "target" varchar(16),
- "title" varchar(64),
- "favicon" varchar(24)
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ===================================================================
+
+create table llx_bookmark
+(
+ rowid SERIAL PRIMARY KEY,
+ "fk_soc" integer,
+ "fk_user" integer NOT NULL,
+ "dateb" timestamp,
+ "url" varchar(128) NOT NULL,
+ "target" varchar(16),
+ "title" varchar(64),
+ "favicon" varchar(24)
+);
diff --git a/pgsql/tables/llx_bookmark4u_login.sql b/pgsql/tables/llx_bookmark4u_login.sql
index ad67ec77ecc..3487873aa64 100644
--- a/pgsql/tables/llx_bookmark4u_login.sql
+++ b/pgsql/tables/llx_bookmark4u_login.sql
@@ -1,36 +1,36 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2004 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===========================================================================
-
-
-create table llx_bookmark4u_login
-(
- rowid SERIAL PRIMARY KEY,
- "fk_user" integer,
- "bk4u_uid" integer,
- UNIQUE(fk_user)
-);
-
-CREATE INDEX idx_llx_bookmark4u_login_fk_user ON llx_bookmark4u_login (fk_user);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2004 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===========================================================================
+
+
+create table llx_bookmark4u_login
+(
+ rowid SERIAL PRIMARY KEY,
+ "fk_user" integer,
+ "bk4u_uid" integer,
+ UNIQUE(fk_user)
+);
+
+CREATE INDEX idx_llx_bookmark4u_login_fk_user ON llx_bookmark4u_login (fk_user);
diff --git a/pgsql/tables/llx_boxes.sql b/pgsql/tables/llx_boxes.sql
index 684004881f0..c5a539ba8b8 100644
--- a/pgsql/tables/llx_boxes.sql
+++ b/pgsql/tables/llx_boxes.sql
@@ -1,37 +1,37 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2003 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===========================================================================
---
--- position : 0-index.php, 1-left, 2-right
---
---
-
-create table llx_boxes
-(
- rowid SERIAL PRIMARY KEY,
- "box_id" integer NOT NULL,
- "position" smallint NOT NULL,
- "box_order" smallint default 0 NOT NULL
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2003 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===========================================================================
+--
+-- position : 0-index.php, 1-left, 2-right
+--
+--
+
+create table llx_boxes
+(
+ rowid SERIAL PRIMARY KEY,
+ "box_id" integer NOT NULL,
+ "position" smallint NOT NULL,
+ "box_order" smallint default 0 NOT NULL
+);
diff --git a/pgsql/tables/llx_boxes_def.sql b/pgsql/tables/llx_boxes_def.sql
index 0e048dd9e3d..b98e2504383 100644
--- a/pgsql/tables/llx_boxes_def.sql
+++ b/pgsql/tables/llx_boxes_def.sql
@@ -1,33 +1,33 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2003 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===========================================================================
-
-create table llx_boxes_def
-(
- rowid SERIAL PRIMARY KEY,
- "name" varchar(255) NOT NULL,
- "file" varchar(255) NOT NULL,
- "note" text
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2003 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===========================================================================
+
+create table llx_boxes_def
+(
+ rowid SERIAL PRIMARY KEY,
+ "name" varchar(255) NOT NULL,
+ "file" varchar(255) NOT NULL,
+ "note" text
+);
diff --git a/pgsql/tables/llx_c_actioncomm.sql b/pgsql/tables/llx_c_actioncomm.sql
index 70375996285..500906e8788 100644
--- a/pgsql/tables/llx_c_actioncomm.sql
+++ b/pgsql/tables/llx_c_actioncomm.sql
@@ -1,36 +1,36 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-create table llx_c_actioncomm
-(
- id integer PRIMARY KEY,
- "code" varchar(12) UNIQUE NOT NULL,
- "type" varchar(10) DEFAULT 'system' NOT NULL,
- "libelle" varchar(30) NOT NULL,
- "active" smallint DEFAULT 1 NOT NULL,
- "todo" smallint
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+create table llx_c_actioncomm
+(
+ id integer PRIMARY KEY,
+ "code" varchar(12) UNIQUE NOT NULL,
+ "type" varchar(10) DEFAULT 'system' NOT NULL,
+ "libelle" varchar(30) NOT NULL,
+ "active" smallint DEFAULT 1 NOT NULL,
+ "todo" smallint
+);
diff --git a/pgsql/tables/llx_c_ape.sql b/pgsql/tables/llx_c_ape.sql
index abca17e00ed..919d0d1596d 100644
--- a/pgsql/tables/llx_c_ape.sql
+++ b/pgsql/tables/llx_c_ape.sql
@@ -1,39 +1,39 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-
-create table llx_c_ape
-(
- rowid SERIAL PRIMARY KEY,
- "code_ape" varchar(5) NOT NULL,
- "libelle" varchar(255),
- "active" smallint DEFAULT 1 NOT NULL,
- UNIQUE(code_ape)
-);
-
-CREATE INDEX idx_llx_c_ape_code_ape ON llx_c_ape (code_ape);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+
+create table llx_c_ape
+(
+ rowid SERIAL PRIMARY KEY,
+ "code_ape" varchar(5) NOT NULL,
+ "libelle" varchar(255),
+ "active" smallint DEFAULT 1 NOT NULL,
+ UNIQUE(code_ape)
+);
+
+CREATE INDEX idx_llx_c_ape_code_ape ON llx_c_ape (code_ape);
+
diff --git a/pgsql/tables/llx_c_chargesociales.sql b/pgsql/tables/llx_c_chargesociales.sql
index d0b29f8d615..cf7ba95b8eb 100644
--- a/pgsql/tables/llx_c_chargesociales.sql
+++ b/pgsql/tables/llx_c_chargesociales.sql
@@ -1,37 +1,37 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ========================================================================
-
-create table llx_c_chargesociales
-(
- id SERIAL PRIMARY KEY,
- "libelle" varchar(80),
- "deductible" smallint DEFAULT 0 NOT NULL,
- "active" smallint DEFAULT 1 NOT NULL
-);
-
-
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ========================================================================
+
+create table llx_c_chargesociales
+(
+ id SERIAL PRIMARY KEY,
+ "libelle" varchar(80),
+ "deductible" smallint DEFAULT 0 NOT NULL,
+ "active" smallint DEFAULT 1 NOT NULL
+);
+
+
+
diff --git a/pgsql/tables/llx_c_civilite.sql b/pgsql/tables/llx_c_civilite.sql
index 1d39bec2155..fb1083c90d6 100644
--- a/pgsql/tables/llx_c_civilite.sql
+++ b/pgsql/tables/llx_c_civilite.sql
@@ -1,34 +1,34 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2004 Benoit Mortier
--- Copyright (C) 2004 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
--- ========================================================================
-
-create table llx_c_civilite
-(
- rowid integer PRIMARY KEY,
- "code" varchar(6) UNIQUE NOT NULL,
- "civilite" varchar(50),
- "active" smallint DEFAULT 1 NOT NULL
-);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2004 Benoit Mortier
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+-- ========================================================================
+
+create table llx_c_civilite
+(
+ rowid integer PRIMARY KEY,
+ "code" varchar(6) UNIQUE NOT NULL,
+ "civilite" varchar(50),
+ "active" smallint DEFAULT 1 NOT NULL
+);
+
diff --git a/pgsql/tables/llx_c_currencies.key.sql b/pgsql/tables/llx_c_currencies.key.sql
index 2c7b36ec8b9..c89b9f82a6b 100644
--- a/pgsql/tables/llx_c_currencies.key.sql
+++ b/pgsql/tables/llx_c_currencies.key.sql
@@ -1,28 +1,28 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2005 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-
-ALTER TABLE llx_c_currencies ADD UNIQUE uk_c_currencies_code_iso(code_iso);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+
+ALTER TABLE llx_c_currencies ADD UNIQUE uk_c_currencies_code_iso(code_iso);
diff --git a/pgsql/tables/llx_c_currencies.sql b/pgsql/tables/llx_c_currencies.sql
index 0cbf4e87877..2f04766d58d 100644
--- a/pgsql/tables/llx_c_currencies.sql
+++ b/pgsql/tables/llx_c_currencies.sql
@@ -1,34 +1,34 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2005 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-create table llx_c_currencies
-(
- code varchar(2) PRIMARY KEY,
- "code_iso" varchar(3) NOT NULL,
- "label" varchar(64),
- "active" smallint DEFAULT 1 NOT NULL
-);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+create table llx_c_currencies
+(
+ code varchar(2) PRIMARY KEY,
+ "code_iso" varchar(3) NOT NULL,
+ "label" varchar(64),
+ "active" smallint DEFAULT 1 NOT NULL
+);
+
diff --git a/pgsql/tables/llx_c_departements.key.sql b/pgsql/tables/llx_c_departements.key.sql
index ff19bcefe7d..21977b2f6e4 100644
--- a/pgsql/tables/llx_c_departements.key.sql
+++ b/pgsql/tables/llx_c_departements.key.sql
@@ -1,31 +1,31 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2005 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ============================================================================
-
-
-ALTER TABLE llx_c_departements ADD UNIQUE uk_departements (code_departement,fk_region);
-
-
-ALTER TABLE llx_c_departements ADD INDEX idx_departements_fk_region (fk_region);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ============================================================================
+
+
+ALTER TABLE llx_c_departements ADD UNIQUE uk_departements (code_departement,fk_region);
+
+
+ALTER TABLE llx_c_departements ADD INDEX idx_departements_fk_region (fk_region);
diff --git a/pgsql/tables/llx_c_departements.sql b/pgsql/tables/llx_c_departements.sql
index 9821327a93b..05697f7ec73 100644
--- a/pgsql/tables/llx_c_departements.sql
+++ b/pgsql/tables/llx_c_departements.sql
@@ -1,41 +1,41 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-create table llx_c_departements
-(
- rowid SERIAL PRIMARY KEY,
- "code_departement" varchar(6) NOT NULL,
- "fk_region" integer,
- "cheflieu" varchar(7),
- "tncc" integer,
- "ncc" varchar(50),
- "nom" varchar(50),
- "active" smallint DEFAULT 1 NOT NULL
-);
-
-
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+create table llx_c_departements
+(
+ rowid SERIAL PRIMARY KEY,
+ "code_departement" varchar(6) NOT NULL,
+ "fk_region" integer,
+ "cheflieu" varchar(7),
+ "tncc" integer,
+ "ncc" varchar(50),
+ "nom" varchar(50),
+ "active" smallint DEFAULT 1 NOT NULL
+);
+
+
+
diff --git a/pgsql/tables/llx_c_effectif.sql b/pgsql/tables/llx_c_effectif.sql
index ea84189e766..16dd84d1ebd 100644
--- a/pgsql/tables/llx_c_effectif.sql
+++ b/pgsql/tables/llx_c_effectif.sql
@@ -1,35 +1,35 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-create table llx_c_effectif
-(
- id integer PRIMARY KEY,
- "code" varchar(12) UNIQUE NOT NULL,
- "libelle" varchar(30),
- "active" smallint DEFAULT 1 NOT NULL
-);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+create table llx_c_effectif
+(
+ id integer PRIMARY KEY,
+ "code" varchar(12) UNIQUE NOT NULL,
+ "libelle" varchar(30),
+ "active" smallint DEFAULT 1 NOT NULL
+);
+
diff --git a/pgsql/tables/llx_c_forme_juridique.sql b/pgsql/tables/llx_c_forme_juridique.sql
index 489240a6f22..707e1c75d7a 100644
--- a/pgsql/tables/llx_c_forme_juridique.sql
+++ b/pgsql/tables/llx_c_forme_juridique.sql
@@ -1,37 +1,37 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ========================================================================
-
-
-create table llx_c_forme_juridique
-(
- rowid SERIAL PRIMARY KEY,
- "code" varchar(12) UNIQUE NOT NULL,
- "fk_pays" integer NOT NULL,
- "libelle" varchar(255),
- "active" smallint DEFAULT 1 NOT NULL
-);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ========================================================================
+
+
+create table llx_c_forme_juridique
+(
+ rowid SERIAL PRIMARY KEY,
+ "code" varchar(12) UNIQUE NOT NULL,
+ "fk_pays" integer NOT NULL,
+ "libelle" varchar(255),
+ "active" smallint DEFAULT 1 NOT NULL
+);
+
diff --git a/pgsql/tables/llx_c_methode_commande_fournisseur.sql b/pgsql/tables/llx_c_methode_commande_fournisseur.sql
index d41af24eda4..6c5470f874e 100644
--- a/pgsql/tables/llx_c_methode_commande_fournisseur.sql
+++ b/pgsql/tables/llx_c_methode_commande_fournisseur.sql
@@ -1,39 +1,39 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2004-2005 Rodolphe Quiedeville
--- Copyright (C) 2005 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-
-create table llx_c_methode_commande_fournisseur
-(
- rowid SERIAL PRIMARY KEY,
- "code" varchar(30),
- "libelle" varchar(60),
- "active" smallint default 1 NOT NULL,
- UNIQUE(code)
-);
-
-CREATE INDEX idx_llx_c_methode_commande_fournisseur_code ON llx_c_methode_commande_fournisseur (code);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2004-2005 Rodolphe Quiedeville
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+
+create table llx_c_methode_commande_fournisseur
+(
+ rowid SERIAL PRIMARY KEY,
+ "code" varchar(30),
+ "libelle" varchar(60),
+ "active" smallint default 1 NOT NULL,
+ UNIQUE(code)
+);
+
+CREATE INDEX idx_llx_c_methode_commande_fournisseur_code ON llx_c_methode_commande_fournisseur (code);
+
diff --git a/pgsql/tables/llx_c_paiement.sql b/pgsql/tables/llx_c_paiement.sql
index 31f7674d247..2d741dd8aeb 100644
--- a/pgsql/tables/llx_c_paiement.sql
+++ b/pgsql/tables/llx_c_paiement.sql
@@ -1,44 +1,44 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2001-2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ========================================================================
---
--- Type :
---
--- 0 : entrée d'argent
--- 1 : sortie d'argent
--- 2 : entrée ou sortie d'argent
-
-create table llx_c_paiement
-(
- id integer PRIMARY KEY,
- "code" varchar(6) UNIQUE NOT NULL,
- "libelle" varchar(30),
- "type" smallint,
- "active" smallint DEFAULT 1 NOT NULL
-);
-
-
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2001-2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ========================================================================
+--
+-- Type :
+--
+-- 0 : entrée d'argent
+-- 1 : sortie d'argent
+-- 2 : entrée ou sortie d'argent
+
+create table llx_c_paiement
+(
+ id integer PRIMARY KEY,
+ "code" varchar(6) UNIQUE NOT NULL,
+ "libelle" varchar(30),
+ "type" smallint,
+ "active" smallint DEFAULT 1 NOT NULL
+);
+
+
+
diff --git a/pgsql/tables/llx_c_pays.key.sql b/pgsql/tables/llx_c_pays.key.sql
index 45ec508c3f0..2682ab572a2 100644
--- a/pgsql/tables/llx_c_pays.key.sql
+++ b/pgsql/tables/llx_c_pays.key.sql
@@ -1,30 +1,30 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2005 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-
-ALTER TABLE llx_c_pays ADD UNIQUE INDEX idx_c_pays_code (code);
-ALTER TABLE llx_c_pays ADD UNIQUE INDEX idx_c_pays_code_iso (code_iso);
-ALTER TABLE llx_c_pays ADD UNIQUE INDEX idx_c_pays_libelle (libelle);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+
+ALTER TABLE llx_c_pays ADD UNIQUE INDEX idx_c_pays_code (code);
+ALTER TABLE llx_c_pays ADD UNIQUE INDEX idx_c_pays_code_iso (code_iso);
+ALTER TABLE llx_c_pays ADD UNIQUE INDEX idx_c_pays_libelle (libelle);
diff --git a/pgsql/tables/llx_c_pays.sql b/pgsql/tables/llx_c_pays.sql
index 77e90a3169d..94889fb7cab 100644
--- a/pgsql/tables/llx_c_pays.sql
+++ b/pgsql/tables/llx_c_pays.sql
@@ -1,35 +1,35 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-create table llx_c_pays
-(
- rowid integer PRIMARY KEY,
- "code" varchar(2) NOT NULL,
- "code_iso" varchar(3) ,
- "libelle" varchar(50) NOT NULL,
- "active" smallint DEFAULT 1 NOT NULL
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+create table llx_c_pays
+(
+ rowid integer PRIMARY KEY,
+ "code" varchar(2) NOT NULL,
+ "code_iso" varchar(3) ,
+ "libelle" varchar(50) NOT NULL,
+ "active" smallint DEFAULT 1 NOT NULL
+);
diff --git a/pgsql/tables/llx_c_propalst.sql b/pgsql/tables/llx_c_propalst.sql
index 3a61a3d6024..4f325b77cf5 100644
--- a/pgsql/tables/llx_c_propalst.sql
+++ b/pgsql/tables/llx_c_propalst.sql
@@ -1,35 +1,35 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ===================================================================
-
-create table llx_c_propalst
-(
- id smallint PRIMARY KEY,
- "code" varchar(12) UNIQUE NOT NULL,
- "label" varchar(30),
- "active" smallint DEFAULT 1 NOT NULL
-);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ===================================================================
+
+create table llx_c_propalst
+(
+ id smallint PRIMARY KEY,
+ "code" varchar(12) UNIQUE NOT NULL,
+ "label" varchar(30),
+ "active" smallint DEFAULT 1 NOT NULL
+);
+
diff --git a/pgsql/tables/llx_c_regions.key.sql b/pgsql/tables/llx_c_regions.key.sql
index 6ae53fb2163..edc91a35f7d 100644
--- a/pgsql/tables/llx_c_regions.key.sql
+++ b/pgsql/tables/llx_c_regions.key.sql
@@ -1,29 +1,29 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2005 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-
-ALTER TABLE llx_c_regions ADD INDEX idx_c_regions_fk_pays (fk_pays);
-ALTER TABLE llx_c_regions ADD CONSTRAINT fk_c_regions_fk_pays FOREIGN KEY (fk_pays) REFERENCES llx_c_pays (rowid);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+
+ALTER TABLE llx_c_regions ADD INDEX idx_c_regions_fk_pays (fk_pays);
+ALTER TABLE llx_c_regions ADD CONSTRAINT fk_c_regions_fk_pays FOREIGN KEY (fk_pays) REFERENCES llx_c_pays (rowid);
diff --git a/pgsql/tables/llx_c_regions.sql b/pgsql/tables/llx_c_regions.sql
index d99dd3bb9dd..9edaa4da125 100644
--- a/pgsql/tables/llx_c_regions.sql
+++ b/pgsql/tables/llx_c_regions.sql
@@ -1,38 +1,38 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-create table llx_c_regions
-(
- rowid SERIAL PRIMARY KEY,
- "code_region" integer UNIQUE NOT NULL,
- "fk_pays" integer NOT NULL,
- "cheflieu" varchar(7),
- "tncc" integer,
- "nom" varchar(50),
- "active" smallint DEFAULT 1 NOT NULL
-);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+create table llx_c_regions
+(
+ rowid SERIAL PRIMARY KEY,
+ "code_region" integer UNIQUE NOT NULL,
+ "fk_pays" integer NOT NULL,
+ "cheflieu" varchar(7),
+ "tncc" integer,
+ "nom" varchar(50),
+ "active" smallint DEFAULT 1 NOT NULL
+);
+
diff --git a/pgsql/tables/llx_c_stcomm.sql b/pgsql/tables/llx_c_stcomm.sql
index 6148d9c9749..22caa785033 100644
--- a/pgsql/tables/llx_c_stcomm.sql
+++ b/pgsql/tables/llx_c_stcomm.sql
@@ -1,35 +1,35 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-create table llx_c_stcomm
-(
- id integer PRIMARY KEY,
- "code" varchar(12) UNIQUE NOT NULL,
- "libelle" varchar(30),
- "active" smallint default 1 NOT NULL
-);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+create table llx_c_stcomm
+(
+ id integer PRIMARY KEY,
+ "code" varchar(12) UNIQUE NOT NULL,
+ "libelle" varchar(30),
+ "active" smallint default 1 NOT NULL
+);
+
diff --git a/pgsql/tables/llx_c_tva.sql b/pgsql/tables/llx_c_tva.sql
index b52ed3a874a..a3eff5ef3a2 100644
--- a/pgsql/tables/llx_c_tva.sql
+++ b/pgsql/tables/llx_c_tva.sql
@@ -1,37 +1,37 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2005 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ========================================================================
-
-
-create table llx_c_tva
-(
- rowid SERIAL PRIMARY KEY,
- "fk_pays" integer NOT NULL,
- "taux" real NOT NULL,
- "recuperableonly" integer NOT NULL DEFAULT 0,
- "note" varchar(128),
- "active" smallint DEFAULT 1 NOT NULL
-);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ========================================================================
+
+
+create table llx_c_tva
+(
+ rowid SERIAL PRIMARY KEY,
+ "fk_pays" integer NOT NULL,
+ "taux" real NOT NULL,
+ "recuperableonly" integer NOT NULL DEFAULT 0,
+ "note" varchar(128),
+ "active" smallint DEFAULT 1 NOT NULL
+);
+
diff --git a/pgsql/tables/llx_c_type_contact.key.sql b/pgsql/tables/llx_c_type_contact.key.sql
index fbeefa53077..8cebdee3acb 100644
--- a/pgsql/tables/llx_c_type_contact.key.sql
+++ b/pgsql/tables/llx_c_type_contact.key.sql
@@ -1,39 +1,39 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2005 Patrick Rouillon
--- Copyright (C) 2005 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- Defini les types de contact d'un element sert de reference pour
--- la table llx_element_contact
---
--- element est le nom de la table utilisant le type de contact.
--- i.e. contact, facture, projet, societe (sans le llx_ devant).
--- Libelle est un texte décrivant le type de contact.
--- active précide si cette valeur est active ou 'archivé'.
---
--- ========================================================================
-
-
-ALTER TABLE llx_c_type_contact
- ADD UNIQUE INDEX idx_c_type_contact_uk (element, source, code);
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2005 Patrick Rouillon
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- Defini les types de contact d'un element sert de reference pour
+-- la table llx_element_contact
+--
+-- element est le nom de la table utilisant le type de contact.
+-- i.e. contact, facture, projet, societe (sans le llx_ devant).
+-- Libelle est un texte décrivant le type de contact.
+-- active précide si cette valeur est active ou 'archivé'.
+--
+-- ========================================================================
+
+
+ALTER TABLE llx_c_type_contact
+ ADD UNIQUE INDEX idx_c_type_contact_uk (element, source, code);
+
diff --git a/pgsql/tables/llx_c_type_contact.sql b/pgsql/tables/llx_c_type_contact.sql
index bb54146b7c6..d0843009792 100644
--- a/pgsql/tables/llx_c_type_contact.sql
+++ b/pgsql/tables/llx_c_type_contact.sql
@@ -1,45 +1,45 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2005 Patrick Rouillon
--- Copyright (C) 2005 Laurent Destailleur
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- Defini les types de contact d'un element sert de reference pour
--- la table llx_element_contact
---
--- element est le nom de la table utilisant le type de contact.
--- i.e. contact, facture, projet, societe (sans le llx_ devant).
--- Libelle est un texte décrivant le type de contact.
--- active précide si cette valeur est active ou 'archivé'.
---
--- ========================================================================
-
-
-create table llx_c_type_contact
-(
- rowid integer PRIMARY KEY,
- "element" varchar(30) NOT NULL,
- "source" varchar(8) DEFAULT 'external' NOT NULL,
- "code" varchar(16) NOT NULL,
- "libelle" varchar(64) NOT NULL,
- "active" smallint DEFAULT 1 NOT NULL
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2005 Patrick Rouillon
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- Defini les types de contact d'un element sert de reference pour
+-- la table llx_element_contact
+--
+-- element est le nom de la table utilisant le type de contact.
+-- i.e. contact, facture, projet, societe (sans le llx_ devant).
+-- Libelle est un texte décrivant le type de contact.
+-- active précide si cette valeur est active ou 'archivé'.
+--
+-- ========================================================================
+
+
+create table llx_c_type_contact
+(
+ rowid integer PRIMARY KEY,
+ "element" varchar(30) NOT NULL,
+ "source" varchar(8) DEFAULT 'external' NOT NULL,
+ "code" varchar(16) NOT NULL,
+ "libelle" varchar(64) NOT NULL,
+ "active" smallint DEFAULT 1 NOT NULL
+);
diff --git a/pgsql/tables/llx_c_typent.sql b/pgsql/tables/llx_c_typent.sql
index ed7289cc20b..445f2589cd1 100644
--- a/pgsql/tables/llx_c_typent.sql
+++ b/pgsql/tables/llx_c_typent.sql
@@ -1,34 +1,34 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
--- Copyright (C) 2004 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ========================================================================
-
-create table llx_c_typent
-(
- id integer PRIMARY KEY,
- "code" varchar(12) UNIQUE NOT NULL,
- "libelle" varchar(30),
- "active" smallint DEFAULT 1 NOT NULL
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2001-2002,2004 Rodolphe Quiedeville
+-- Copyright (C) 2004 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ========================================================================
+
+create table llx_c_typent
+(
+ id integer PRIMARY KEY,
+ "code" varchar(12) UNIQUE NOT NULL,
+ "libelle" varchar(30),
+ "active" smallint DEFAULT 1 NOT NULL
+);
diff --git a/pgsql/tables/llx_categorie.sql b/pgsql/tables/llx_categorie.sql
index 99011a28598..b9ee50bb4e2 100644
--- a/pgsql/tables/llx_categorie.sql
+++ b/pgsql/tables/llx_categorie.sql
@@ -1,35 +1,35 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2005 Brice Davoleau
--- Copyright (C) 2005 Matthieu Valleton
--- Copyright (C) 2005-2006 Regis Houssin
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ============================================================================
-
-create table llx_categorie
-(
- rowid SERIAL PRIMARY KEY,
- "label" VARCHAR(255), -- nom de la catégorie
- "description" text, -- description de la catégorie
- "visible" smallint DEFAULT 1 NOT NULL -- determine si les produits sont visible ou pas
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2005 Brice Davoleau
+-- Copyright (C) 2005 Matthieu Valleton
+-- Copyright (C) 2005-2006 Regis Houssin
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ============================================================================
+
+create table llx_categorie
+(
+ rowid SERIAL PRIMARY KEY,
+ "label" VARCHAR(255), -- nom de la catégorie
+ "description" text, -- description de la catégorie
+ "visible" smallint DEFAULT 1 NOT NULL -- determine si les produits sont visible ou pas
+);
diff --git a/pgsql/tables/llx_categorie_product.key.sql b/pgsql/tables/llx_categorie_product.key.sql
index fa83f2d6096..8807c987fd8 100644
--- a/pgsql/tables/llx_categorie_product.key.sql
+++ b/pgsql/tables/llx_categorie_product.key.sql
@@ -1,31 +1,31 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2005 Brice Davoleau
--- Copyright (C) 2005 Matthieu Valleton
--- Copyright (C) 2005 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ============================================================================
-
-
-ALTER TABLE llx_categorie_product ADD INDEX idx_categorie_product_fk_categorie (fk_categorie);
-ALTER TABLE llx_categorie_product ADD INDEX idx_categorie_product_fk_product (fk_product);
-
-ALTER TABLE llx_categorie_product ADD FOREIGN KEY (fk_categorie) REFERENCES llx_categorie (rowid);
-ALTER TABLE llx_categorie_product ADD FOREIGN KEY (fk_product) REFERENCES llx_product (rowid);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2005 Brice Davoleau
+-- Copyright (C) 2005 Matthieu Valleton
+-- Copyright (C) 2005 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ============================================================================
+
+
+ALTER TABLE llx_categorie_product ADD INDEX idx_categorie_product_fk_categorie (fk_categorie);
+ALTER TABLE llx_categorie_product ADD INDEX idx_categorie_product_fk_product (fk_product);
+
+ALTER TABLE llx_categorie_product ADD FOREIGN KEY (fk_categorie) REFERENCES llx_categorie (rowid);
+ALTER TABLE llx_categorie_product ADD FOREIGN KEY (fk_product) REFERENCES llx_product (rowid);
diff --git a/pgsql/tables/llx_chargesociales.sql b/pgsql/tables/llx_chargesociales.sql
index db0f52f8852..b098d057f41 100644
--- a/pgsql/tables/llx_chargesociales.sql
+++ b/pgsql/tables/llx_chargesociales.sql
@@ -1,40 +1,40 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ========================================================================
--- Copyright (C) 2001-2002 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ========================================================================
-
-create table llx_chargesociales
-(
- rowid SERIAL PRIMARY KEY,
- "date_ech" timestamp, -- date d'echeance
- "date_pai" timestamp, -- date de paiements
- "libelle" varchar(80),
- "fk_type" integer,
- "amount" real default 0 NOT NULL,
- "paye" smallint default 0 NOT NULL,
- "periode" date
-);
-
-
-
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ========================================================================
+-- Copyright (C) 2001-2002 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ========================================================================
+
+create table llx_chargesociales
+(
+ rowid SERIAL PRIMARY KEY,
+ "date_ech" timestamp, -- date d'echeance
+ "date_pai" timestamp, -- date de paiements
+ "libelle" varchar(80),
+ "fk_type" integer,
+ "amount" real default 0 NOT NULL,
+ "paye" smallint default 0 NOT NULL,
+ "periode" date
+);
+
+
+
diff --git a/pgsql/tables/llx_co_fa.sql b/pgsql/tables/llx_co_fa.sql
index bf081315f6a..d41490632d1 100644
--- a/pgsql/tables/llx_co_fa.sql
+++ b/pgsql/tables/llx_co_fa.sql
@@ -1,35 +1,35 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2003 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
--- ===================================================================
-
-
-create table llx_co_fa
-(
- rowid SERIAL PRIMARY KEY,
- "fk_commande" integer NOT NULL,
- "fk_facture" integer NOT NULL
-);
-
-CREATE INDEX idx_llx_co_fa_fk_commande ON llx_co_fa (fk_commande);
-CREATE INDEX idx_llx_co_fa_fk_facture ON llx_co_fa (fk_facture);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2003 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+-- ===================================================================
+
+
+create table llx_co_fa
+(
+ rowid SERIAL PRIMARY KEY,
+ "fk_commande" integer NOT NULL,
+ "fk_facture" integer NOT NULL
+);
+
+CREATE INDEX idx_llx_co_fa_fk_commande ON llx_co_fa (fk_commande);
+CREATE INDEX idx_llx_co_fa_fk_facture ON llx_co_fa (fk_facture);
diff --git a/pgsql/tables/llx_co_pr.sql b/pgsql/tables/llx_co_pr.sql
index c65e1826e6f..e7ebfbc928f 100644
--- a/pgsql/tables/llx_co_pr.sql
+++ b/pgsql/tables/llx_co_pr.sql
@@ -1,31 +1,31 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2003 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
--- ===================================================================
-
-create table llx_co_pr
-(
- rowid SERIAL PRIMARY KEY,
- "fk_commande" integer,
- "fk_propale" integer
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2003 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+-- ===================================================================
+
+create table llx_co_pr
+(
+ rowid SERIAL PRIMARY KEY,
+ "fk_commande" integer,
+ "fk_propale" integer
+);
diff --git a/pgsql/tables/llx_comfourn_facfourn.sql b/pgsql/tables/llx_comfourn_facfourn.sql
index e0ee1ff43df..0b4025c5481 100644
--- a/pgsql/tables/llx_comfourn_facfourn.sql
+++ b/pgsql/tables/llx_comfourn_facfourn.sql
@@ -1,36 +1,36 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2003 Rodolphe Quiedeville
--- Copyright (C) 2005-2006 Regis Houssin
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
--- ===================================================================
-
-
-create table llx_comfourn_facfourn
-(
- rowid SERIAL PRIMARY KEY,
- "fk_commande" integer NOT NULL,
- "fk_facture" integer NOT NULL
-);
-
-CREATE INDEX idx_llx_comfourn_facfourn_fk_commande ON llx_comfourn_facfourn (fk_commande);
-CREATE INDEX idx_llx_comfourn_facfourn_fk_facture ON llx_comfourn_facfourn (fk_facture);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2003 Rodolphe Quiedeville
+-- Copyright (C) 2005-2006 Regis Houssin
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+-- ===================================================================
+
+
+create table llx_comfourn_facfourn
+(
+ rowid SERIAL PRIMARY KEY,
+ "fk_commande" integer NOT NULL,
+ "fk_facture" integer NOT NULL
+);
+
+CREATE INDEX idx_llx_comfourn_facfourn_fk_commande ON llx_comfourn_facfourn (fk_commande);
+CREATE INDEX idx_llx_comfourn_facfourn_fk_facture ON llx_comfourn_facfourn (fk_facture);
diff --git a/pgsql/tables/llx_commande.key.sql b/pgsql/tables/llx_commande.key.sql
index 970a7a3d207..6854907c825 100644
--- a/pgsql/tables/llx_commande.key.sql
+++ b/pgsql/tables/llx_commande.key.sql
@@ -1,32 +1,32 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2006 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ============================================================================
-
-
--- Supprimme orphelins pour permettre montée de la clé
--- V4 DELETE llx_commande FROM llx_commande LEFT JOIN llx_societe ON llx_commande.fk_soc = llx_societe.idp WHERE llx_societe.idp IS NULL;
-
-ALTER TABLE llx_commande ADD INDEX idx_commande_fk_soc (fk_soc);
-ALTER TABLE llx_commande ADD CONSTRAINT fk_commande_societe FOREIGN KEY (fk_soc) REFERENCES llx_societe (idp);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2006 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ============================================================================
+
+
+-- Supprimme orphelins pour permettre montée de la clé
+-- V4 DELETE llx_commande FROM llx_commande LEFT JOIN llx_societe ON llx_commande.fk_soc = llx_societe.idp WHERE llx_societe.idp IS NULL;
+
+ALTER TABLE llx_commande ADD INDEX idx_commande_fk_soc (fk_soc);
+ALTER TABLE llx_commande ADD CONSTRAINT fk_commande_societe FOREIGN KEY (fk_soc) REFERENCES llx_societe (idp);
diff --git a/pgsql/tables/llx_commande.sql b/pgsql/tables/llx_commande.sql
index bf62edc0624..618caee44f1 100644
--- a/pgsql/tables/llx_commande.sql
+++ b/pgsql/tables/llx_commande.sql
@@ -1,65 +1,65 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2003 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
-
-
-
-
-create table llx_commande
-(
- rowid SERIAL PRIMARY KEY,
- "tms" timestamp,
- "fk_soc" integer NOT NULL,
- "fk_projet" integer DEFAULT 0, -- projet auquel est rattache la commande
- "ref" varchar(30) NOT NULL, -- order number
- "ref_client" varchar(30), -- customer order number
- "date_creation" timestamp, -- date de creation
- "date_valid" timestamp, -- date de validation
- "date_cloture" timestamp, -- date de cloture
- "date_commande" date, -- date de la commande
- "fk_user_author" integer, -- createur de la commande
- "fk_user_valid" integer, -- valideur de la commande
- "fk_user_cloture" integer, -- auteur cloture
- "source" smallint NOT NULL,
- "fk_statut" smallint default 0,
- "amount_ht" real default 0,
- "remise_percent" real default 0,
- "remise_absolue" real default 0,
- "remise" real default 0,
- "tva" real default 0,
- "total_ht" real default 0,
- "total_ttc" real default 0,
- "note" text,
- "note_public" text,
- "model_pdf" varchar(50),
- "facture" smallint default 0,
- "fk_cond_reglement" integer, -- condition de réglement
- "fk_mode_reglement" integer, -- mode de réglement
- "date_livraison" date default NULL,
- "fk_adresse_livraison" integer, -- adresse de livraison
- UNIQUE(ref)
-);
-
-CREATE INDEX idx_llx_commande_ref ON llx_commande (ref);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2003 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+
+
+
+
+create table llx_commande
+(
+ rowid SERIAL PRIMARY KEY,
+ "tms" timestamp,
+ "fk_soc" integer NOT NULL,
+ "fk_projet" integer DEFAULT 0, -- projet auquel est rattache la commande
+ "ref" varchar(30) NOT NULL, -- order number
+ "ref_client" varchar(30), -- customer order number
+ "date_creation" timestamp, -- date de creation
+ "date_valid" timestamp, -- date de validation
+ "date_cloture" timestamp, -- date de cloture
+ "date_commande" date, -- date de la commande
+ "fk_user_author" integer, -- createur de la commande
+ "fk_user_valid" integer, -- valideur de la commande
+ "fk_user_cloture" integer, -- auteur cloture
+ "source" smallint NOT NULL,
+ "fk_statut" smallint default 0,
+ "amount_ht" real default 0,
+ "remise_percent" real default 0,
+ "remise_absolue" real default 0,
+ "remise" real default 0,
+ "tva" real default 0,
+ "total_ht" real default 0,
+ "total_ttc" real default 0,
+ "note" text,
+ "note_public" text,
+ "model_pdf" varchar(50),
+ "facture" smallint default 0,
+ "fk_cond_reglement" integer, -- condition de réglement
+ "fk_mode_reglement" integer, -- mode de réglement
+ "date_livraison" date default NULL,
+ "fk_adresse_livraison" integer, -- adresse de livraison
+ UNIQUE(ref)
+);
+
+CREATE INDEX idx_llx_commande_ref ON llx_commande (ref);
diff --git a/pgsql/tables/llx_commande_fournisseur.key.sql b/pgsql/tables/llx_commande_fournisseur.key.sql
index 6065e0e134f..70b39addd12 100644
--- a/pgsql/tables/llx_commande_fournisseur.key.sql
+++ b/pgsql/tables/llx_commande_fournisseur.key.sql
@@ -1,32 +1,32 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2006 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ============================================================================
-
-
--- Supprimme orphelins pour permettre montée de la clé
--- V4 DELETE llx_commande_fournisseur FROM llx_commande_fournisseur LEFT JOIN llx_societe ON llx_commande_fournisseur.fk_soc = llx_societe.idp WHERE llx_societe.idp IS NULL;
-
-ALTER TABLE llx_commande_fournisseur ADD INDEX idx_commande_fournisseur_fk_soc (fk_soc);
-ALTER TABLE llx_commande_fournisseur ADD CONSTRAINT fk_commande_fournisseur_societe FOREIGN KEY (fk_soc) REFERENCES llx_societe (idp);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2006 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ============================================================================
+
+
+-- Supprimme orphelins pour permettre montée de la clé
+-- V4 DELETE llx_commande_fournisseur FROM llx_commande_fournisseur LEFT JOIN llx_societe ON llx_commande_fournisseur.fk_soc = llx_societe.idp WHERE llx_societe.idp IS NULL;
+
+ALTER TABLE llx_commande_fournisseur ADD INDEX idx_commande_fournisseur_fk_soc (fk_soc);
+ALTER TABLE llx_commande_fournisseur ADD CONSTRAINT fk_commande_fournisseur_societe FOREIGN KEY (fk_soc) REFERENCES llx_societe (idp);
diff --git a/pgsql/tables/llx_commande_fournisseur.sql b/pgsql/tables/llx_commande_fournisseur.sql
index c60e7567aa9..f645669dd5d 100644
--- a/pgsql/tables/llx_commande_fournisseur.sql
+++ b/pgsql/tables/llx_commande_fournisseur.sql
@@ -1,59 +1,59 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2004 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
-
-
-
-
-create table llx_commande_fournisseur
-(
- rowid SERIAL PRIMARY KEY,
- "tms" timestamp,
- "fk_soc" integer NOT NULL,
- "fk_projet" integer DEFAULT 0, -- projet auquel est rattache la commande
- "ref" varchar(30) NOT NULL, -- order number
- "date_creation" timestamp, -- date de creation
- "date_valid" timestamp, -- date de validation
- "date_cloture" timestamp, -- date de cloture
- "date_commande" date, -- date de la commande
- "fk_user_author" integer, -- createur de la commande
- "fk_user_valid" integer, -- valideur de la commande
- "fk_user_cloture" integer, -- auteur cloture
- "source" smallint NOT NULL,
- "fk_statut" smallint default 0,
- "amount_ht" real default 0,
- "remise_percent" real default 0,
- "remise" real default 0,
- "tva" real default 0,
- "total_ht" real default 0,
- "total_ttc" real default 0,
- "note" text,
- "note_public" text,
- "model_pdf" varchar(50),
- "fk_methode_commande" integer default 0,
- UNIQUE(ref)
-);
-
-CREATE INDEX idx_llx_commande_fournisseur_ref ON llx_commande_fournisseur (ref);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2004 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+
+
+
+
+create table llx_commande_fournisseur
+(
+ rowid SERIAL PRIMARY KEY,
+ "tms" timestamp,
+ "fk_soc" integer NOT NULL,
+ "fk_projet" integer DEFAULT 0, -- projet auquel est rattache la commande
+ "ref" varchar(30) NOT NULL, -- order number
+ "date_creation" timestamp, -- date de creation
+ "date_valid" timestamp, -- date de validation
+ "date_cloture" timestamp, -- date de cloture
+ "date_commande" date, -- date de la commande
+ "fk_user_author" integer, -- createur de la commande
+ "fk_user_valid" integer, -- valideur de la commande
+ "fk_user_cloture" integer, -- auteur cloture
+ "source" smallint NOT NULL,
+ "fk_statut" smallint default 0,
+ "amount_ht" real default 0,
+ "remise_percent" real default 0,
+ "remise" real default 0,
+ "tva" real default 0,
+ "total_ht" real default 0,
+ "total_ttc" real default 0,
+ "note" text,
+ "note_public" text,
+ "model_pdf" varchar(50),
+ "fk_methode_commande" integer default 0,
+ UNIQUE(ref)
+);
+
+CREATE INDEX idx_llx_commande_fournisseur_ref ON llx_commande_fournisseur (ref);
diff --git a/pgsql/tables/llx_commande_fournisseur_log.sql b/pgsql/tables/llx_commande_fournisseur_log.sql
index 3dc1d06a5ab..122fdfcd8de 100644
--- a/pgsql/tables/llx_commande_fournisseur_log.sql
+++ b/pgsql/tables/llx_commande_fournisseur_log.sql
@@ -1,35 +1,35 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2004 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
-
-create table llx_commande_fournisseur_log
-(
- rowid SERIAL PRIMARY KEY,
- "tms" timestamp,
- "datelog" timestamp,
- "fk_commande" integer NOT NULL,
- "fk_statut" smallint NOT NULL,
- "fk_user" integer NOT NULL
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2004 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+
+create table llx_commande_fournisseur_log
+(
+ rowid SERIAL PRIMARY KEY,
+ "tms" timestamp,
+ "datelog" timestamp,
+ "fk_commande" integer NOT NULL,
+ "fk_statut" smallint NOT NULL,
+ "fk_user" integer NOT NULL
+);
diff --git a/pgsql/tables/llx_commande_fournisseurdet.sql b/pgsql/tables/llx_commande_fournisseurdet.sql
index 83e5ccae71a..2c4d88d6915 100644
--- a/pgsql/tables/llx_commande_fournisseurdet.sql
+++ b/pgsql/tables/llx_commande_fournisseurdet.sql
@@ -1,40 +1,40 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2004 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
--- ===================================================================
-
-create table llx_commande_fournisseurdet
-(
- rowid SERIAL PRIMARY KEY,
- "fk_commande" integer,
- "fk_product" integer,
- "ref" varchar(50),
- "label" varchar(255),
- "description" text,
- "tva_tx" real DEFAULT 19.6, -- taux tva
- "qty" real, -- quantité
- "remise_percent" real DEFAULT 0, -- pourcentage de remise
- "remise" real DEFAULT 0, -- montant de la remise
- "subprice" real, -- prix avant remise
- "price" real -- prix final
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2004 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+-- ===================================================================
+
+create table llx_commande_fournisseurdet
+(
+ rowid SERIAL PRIMARY KEY,
+ "fk_commande" integer,
+ "fk_product" integer,
+ "ref" varchar(50),
+ "label" varchar(255),
+ "description" text,
+ "tva_tx" real DEFAULT 19.6, -- taux tva
+ "qty" real, -- quantité
+ "remise_percent" real DEFAULT 0, -- pourcentage de remise
+ "remise" real DEFAULT 0, -- montant de la remise
+ "subprice" real, -- prix avant remise
+ "price" real -- prix final
+);
diff --git a/pgsql/tables/llx_commandedet.sql b/pgsql/tables/llx_commandedet.sql
index a28e2326146..f9b69756dff 100644
--- a/pgsql/tables/llx_commandedet.sql
+++ b/pgsql/tables/llx_commandedet.sql
@@ -1,46 +1,46 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2003 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
--- ===================================================================
-
-create table llx_commandedet
-(
- rowid SERIAL PRIMARY KEY,
- "fk_commande" integer,
- "fk_product" integer,
- "label" varchar(255),
- "description" text,
- "tva_tx" real, -- taux tva
- "qty" real, -- quantité
- "remise_percent" real DEFAULT 0, -- pourcentage de remise
- "remise" real DEFAULT 0, -- montant de la remise
- "fk_remise_except" integer NULL, -- Lien vers table des remises fixes
- "subprice" real, -- prix avant remise
- "price" real, -- prix final
- "total_ht" real, -- Total HT de la ligne toute quantité et incluant remise ligne et globale
- "total_tva" real, -- Total TVA de la ligne toute quantité et incluant remise ligne et globale
- "total_ttc" real, -- Total TTC de la ligne toute quantité et incluant remise ligne et globale
- "info_bits" integer DEFAULT 0, -- TVA NPR ou non
- "coef" real, -- coefficient de marge
- "rang" integer DEFAULT 0
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2003 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+-- ===================================================================
+
+create table llx_commandedet
+(
+ rowid SERIAL PRIMARY KEY,
+ "fk_commande" integer,
+ "fk_product" integer,
+ "label" varchar(255),
+ "description" text,
+ "tva_tx" real, -- taux tva
+ "qty" real, -- quantité
+ "remise_percent" real DEFAULT 0, -- pourcentage de remise
+ "remise" real DEFAULT 0, -- montant de la remise
+ "fk_remise_except" integer NULL, -- Lien vers table des remises fixes
+ "subprice" real, -- prix avant remise
+ "price" real, -- prix final
+ "total_ht" real, -- Total HT de la ligne toute quantité et incluant remise ligne et globale
+ "total_tva" real, -- Total TVA de la ligne toute quantité et incluant remise ligne et globale
+ "total_ttc" real, -- Total TTC de la ligne toute quantité et incluant remise ligne et globale
+ "info_bits" integer DEFAULT 0, -- TVA NPR ou non
+ "coef" real, -- coefficient de marge
+ "rang" integer DEFAULT 0
+);
diff --git a/pgsql/tables/llx_compta.sql b/pgsql/tables/llx_compta.sql
index 5e58525e061..b5de8b70528 100644
--- a/pgsql/tables/llx_compta.sql
+++ b/pgsql/tables/llx_compta.sql
@@ -1,40 +1,40 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2000-2002 Rodolphe Quiedeville
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ===================================================================
-
-
-create table llx_compta
-(
- rowid SERIAL PRIMARY KEY,
- "datec" timestamp,
- "datev" date, -- date de valeur
- "amount" real DEFAULT 0 NOT NULL ,
- "label" varchar(255),
- "fk_compta_account" integer,
- "fk_user_author" integer,
- "fk_user_valid" integer,
- "valid" smallint DEFAULT 0,
- "note" text
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2000-2002 Rodolphe Quiedeville
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ===================================================================
+
+
+create table llx_compta
+(
+ rowid SERIAL PRIMARY KEY,
+ "datec" timestamp,
+ "datev" date, -- date de valeur
+ "amount" real DEFAULT 0 NOT NULL ,
+ "label" varchar(255),
+ "fk_compta_account" integer,
+ "fk_user_author" integer,
+ "fk_user_valid" integer,
+ "valid" smallint DEFAULT 0,
+ "note" text
+);
diff --git a/pgsql/tables/llx_compta_account.sql b/pgsql/tables/llx_compta_account.sql
index 4338b9ce630..82403ed14a4 100644
--- a/pgsql/tables/llx_compta_account.sql
+++ b/pgsql/tables/llx_compta_account.sql
@@ -1,36 +1,36 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2000-2002 Rodolphe Quiedeville
---
--- $Id$
--- $Source$
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- ===================================================================
-
-
-create table llx_compta_account
-(
- rowid SERIAL PRIMARY KEY,
- "datec" timestamp,
- "number" varchar(12),
- "label" varchar(255),
- "fk_user_author" integer,
- "note" text
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2000-2002 Rodolphe Quiedeville
+--
+-- $Id$
+-- $Source$
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- ===================================================================
+
+
+create table llx_compta_account
+(
+ rowid SERIAL PRIMARY KEY,
+ "datec" timestamp,
+ "number" varchar(12),
+ "label" varchar(255),
+ "fk_user_author" integer,
+ "note" text
+);
diff --git a/pgsql/tables/llx_compta_compte_generaux.sql b/pgsql/tables/llx_compta_compte_generaux.sql
index 7336b46c540..bfb6b718879 100644
--- a/pgsql/tables/llx_compta_compte_generaux.sql
+++ b/pgsql/tables/llx_compta_compte_generaux.sql
@@ -1,39 +1,39 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ===================================================================
--- Copyright (C) 2004 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===================================================================
-
-
-create table llx_compta_compte_generaux
-(
- rowid SERIAL PRIMARY KEY,
- "date_creation" timestamp,
- "numero" varchar(50),
- "intitule" varchar(255),
- "fk_user_author" integer,
- "note" text,
- UNIQUE(numero)
-);
-
-CREATE INDEX idx_llx_compta_compte_generaux_numero ON llx_compta_compte_generaux (numero);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ===================================================================
+-- Copyright (C) 2004 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===================================================================
+
+
+create table llx_compta_compte_generaux
+(
+ rowid SERIAL PRIMARY KEY,
+ "date_creation" timestamp,
+ "numero" varchar(50),
+ "intitule" varchar(255),
+ "fk_user_author" integer,
+ "note" text,
+ UNIQUE(numero)
+);
+
+CREATE INDEX idx_llx_compta_compte_generaux_numero ON llx_compta_compte_generaux (numero);
diff --git a/pgsql/tables/llx_cond_reglement.sql b/pgsql/tables/llx_cond_reglement.sql
index 71469d4da38..e8319caf8e1 100644
--- a/pgsql/tables/llx_cond_reglement.sql
+++ b/pgsql/tables/llx_cond_reglement.sql
@@ -1,38 +1,38 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2002-2003 Rodolphe Quiedeville
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ============================================================================
-
-create table llx_cond_reglement
-(
- rowid integer PRIMARY KEY,
- "code" varchar(16),
- "sortorder" smallint,
- "active" smallint DEFAULT 1,
- "libelle" varchar(255),
- "libelle_facture" text,
- "fdm" smallint, -- reglement fin de mois
- "nbjour" smallint,
- "decalage" smallint
-);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2002-2003 Rodolphe Quiedeville
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ============================================================================
+
+create table llx_cond_reglement
+(
+ rowid integer PRIMARY KEY,
+ "code" varchar(16),
+ "sortorder" smallint,
+ "active" smallint DEFAULT 1,
+ "libelle" varchar(255),
+ "libelle_facture" text,
+ "fdm" smallint, -- reglement fin de mois
+ "nbjour" smallint,
+ "decalage" smallint
+);
diff --git a/pgsql/tables/llx_const.sql b/pgsql/tables/llx_const.sql
index 90adee93c61..03fbd8ed91c 100644
--- a/pgsql/tables/llx_const.sql
+++ b/pgsql/tables/llx_const.sql
@@ -1,43 +1,43 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2001-2002 Rodolphe Quiedeville
--- Copyright (C) 2003 Jean-Louis Bergamo
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ===========================================================================
---
--- Definitions des constantes utilisés comme parametres de configuration
---
-
-
-create table llx_const
-(
- rowid SERIAL PRIMARY KEY,
- "name" varchar(255),
- "value" text, -- max 65535 caracteres
- "type" varchar(6) CHECK (type IN ('yesno','texte','chaine')) ,
- "visible" smallint DEFAULT 1 NOT NULL,
- "note" text,
- UNIQUE(name)
-);
-
-CREATE INDEX idx_llx_const_name ON llx_const (name);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2001-2002 Rodolphe Quiedeville
+-- Copyright (C) 2003 Jean-Louis Bergamo
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ===========================================================================
+--
+-- Definitions des constantes utilisés comme parametres de configuration
+--
+
+
+create table llx_const
+(
+ rowid SERIAL PRIMARY KEY,
+ "name" varchar(255),
+ "value" text, -- max 65535 caracteres
+ "type" varchar(6) CHECK (type IN ('yesno','texte','chaine')) ,
+ "visible" smallint DEFAULT 1 NOT NULL,
+ "note" text,
+ UNIQUE(name)
+);
+
+CREATE INDEX idx_llx_const_name ON llx_const (name);
diff --git a/pgsql/tables/llx_contrat.key.sql b/pgsql/tables/llx_contrat.key.sql
index 6be1985a301..f680c5430ae 100644
--- a/pgsql/tables/llx_contrat.key.sql
+++ b/pgsql/tables/llx_contrat.key.sql
@@ -1,38 +1,38 @@
--- Generated from dolibarr_mysql2pgsql
--- (c) 2004, PostgreSQL Inc.
--- (c) 2005, Laurent Destailleur.
-
--- ============================================================================
--- Copyright (C) 2002-2004 Rodolphe Quiedeville
--- Copyright (C) 2004-2005 Laurent Destailleur
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 2 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program; if not, write to the Free Software
--- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
---
--- $Id$
--- $Source$
---
--- ============================================================================
-
-
--- Supprimme orhpelins pour permettre montée de la clé
--- V4 DELETE llx_contratdet FROM llx_contratdet, llx_contrat LEFT JOIN llx_societe ON llx_contrat.fk_soc = llx_societe.idp WHERE llx_contratdet.fk_contrat = llx_contrat.rowid AND llx_societe.idp IS NULL;
--- V4 DELETE llx_contrat FROM llx_contrat LEFT JOIN llx_societe ON llx_contrat.fk_soc = llx_societe.idp WHERE llx_societe.idp IS NULL;
--- V4 DELETE llx_contrat FROM llx_contrat LEFT JOIN llx_user ON llx_contrat.fk_user_author = llx_user.rowid WHERE llx_user.rowid IS NULL;
-
-ALTER TABLE llx_contrat ADD INDEX idx_contrat_fk_soc (fk_soc);
-ALTER TABLE llx_contrat ADD INDEX idx_contrat_fk_user_author (fk_user_author);
-
-ALTER TABLE llx_contrat ADD CONSTRAINT fk_contrat_societe FOREIGN KEY (fk_soc) REFERENCES llx_societe (idp);
+-- Generated from dolibarr_mysql2pgsql
+-- (c) 2004, PostgreSQL Inc.
+-- (c) 2005, Laurent Destailleur.
+
+-- ============================================================================
+-- Copyright (C) 2002-2004 Rodolphe Quiedeville
+-- Copyright (C) 2004-2005 Laurent Destailleur
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+-- $Source$
+--
+-- ============================================================================
+
+
+-- Supprimme orhpelins pour permettre montée de la clé
+-- V4 DELETE llx_contratdet FROM llx_contratdet, llx_contrat LEFT JOIN llx_societe ON llx_contrat.fk_soc = llx_societe.idp WHERE llx_contratdet.fk_contrat = llx_contrat.rowid AND llx_societe.idp IS NULL;
+-- V4 DELETE llx_contrat FROM llx_contrat LEFT JOIN llx_societe ON llx_contrat.fk_soc = llx_societe.idp WHERE llx_societe.idp IS NULL;
+-- V4 DELETE llx_contrat FROM llx_contrat LEFT JOIN llx_user ON llx_contrat.fk_user_author = llx_user.rowid WHERE llx_user.rowid IS NULL;
+
+ALTER TABLE llx_contrat ADD INDEX idx_contrat_fk_soc (fk_soc);
+ALTER TABLE llx_contrat ADD INDEX idx_contrat_fk_user_author (fk_user_author);
+
+ALTER TABLE llx_contrat ADD CONSTRAINT fk_contrat_societe FOREIGN KEY (fk_soc) REFERENCES llx_societe (idp);
ALTER TABLE llx_contrat ADD CONSTRAINT fk_contrat_user_author FOREIGN KEY (fk_user_author) REFERENCES llx_user (rowid);
\ No newline at end of file