Ozkouseno na MS Windows XP Pro SP2 + MS Visual Studio 2005 (a pro php_imap.dll take MSVC 6.0)
Verze PHP byly pouzity 5.0.5 (A) a 5.2 (B), nektere sekce se vztahuji pouze ke jedne ze zminenych verzi (A)/(B)
IMAP klient (c-client) verze 2004g

1) Vytvorit (kdekoli) novou pracovni slozku, lets say 'myPHP'

2) Zdrojaky PHP5
   - stahnout zdrojaky PHP5(.x) z 'http://snaps.php.net/'
   - umistit do 'myPHP\PHP5\'

3) Pomocne funkce pro win32 build:
   - stahnout zdroje z 'http://www.php.net/extra/win32build.zip'
   - umistit do 'myPHP\php_build\'

4) Nakonfigurovat systemove promenne:
  i)  Zaregistrovat cesty MSVS budto spustenim %VSINSTALLDIR\Common7\Tools\vsvars32.bat nebo rucnim pridanim vsech v souboru uvedenych cest (na mych WinXP spusteni batka nic nepridalo).
  ii) Pridat cestu 
     - 'myPHP\php_build\bin' do promenne PATH
     - 'myPHP\php_build\include' do promenne INCLUDE
     - 'myPHP\php_build\lib' do promennych LIB a LIBPATH

5) Prekompilovat knihovnu 'resolv':
   - stahnout zdrojaky z 'http://www.php.net/extra/bindlib_w32.zip' 
   - otevrit 'myPHP\bindlib_w32\bindlib.dsw' ve VS
   - nastavit build na Release
   - zkompilovat
   - zkopirovat vzniklou resolv.lib knihovnu do 'myPHP\php_build\lib\' a premazat s ni puvodni

6) Volitelne extensions:
  i)   iconv
     - pokud neni treba, da se vynechat (viz nize)
     - stahnout z 'http://ctindustries.net/dom/libxml/' resp. 'http://ctindustries.net/dom/libxml/iconv-1.9.1.php.zip'
     - nakopirovat obsah archivu do 'myPHP\php_build\'
  ii)  libxml
     - pokud neni treba, da se vynechat (viz nize)
     - stahnout z 'http://ctindustries.net/dom/libxml/' resp. 'http://ctindustries.net/dom/libxml/libxml2-2.6.26.php.zip'
     - nakopirovat obsah archivu do 'myPHP\php_build\'
  iii) libjpeg (vynechame, jen kdyby bylo nekdy potreba)
     - dobry funkcni popis jejiho ziskani je na 'http://www.nevrax.org/tikiwiki/tiki-index.php?page=libJPEG'
 
>>>> (A)
7) c-client module pro IMAP
   - stahnout zdrojaky z 'ftp://ftp.cac.washington.edu/imap/c-client.tar.Z'
   - rozpakovat do podadresare myPHP, rekneme 'myPHP\myIMAP\'
   - spustit 'myPHP\myIMAP\nmake -f makefile.nt' (nejde jen o prekompilovani knihovny cclient.lib, ale take o ziskani spravnych verzi zdrojaku)
<<<< (A)
 
8) Editace zdrojaku
   (A) - v souboru 'myPHP\PHP5\regex\regerror.c' se musi zmenit hlavicka funkce 'regerror' z tzv. "old style" formatu do K&C syntaxe, tzn. radky 64-68 se nahradi jednim radkem: 'regerror(int errcode,const regex_t *preg,char *errbuf,size_t errbuf_size)'
   (B) - soubor 'myPHP\php_build\include\mysql_com.h' se musi kompletne nahradit prilozenym souborem (viz nize)
 
8) Priprava kompilace
   - vytvoreni kompilacniho skriptu prikazem 'myPHP\PHP5\buildconf.bat'
   - spusteni kompilacniho skriptu prikazem 
     (A) 'myPHP\PHP5\cscript /nologo configure.js --without-gd --with-imap=myIMAP'
     (B) 'myPHP\PHP5\cscript /nologo configure.js --without-gd --with-imap'
   - pokud skript nejde pustit, je to proto, ze neni nainstalovany Windows Script XY for windows AB -> stahnout tu 'http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=C717D943-7E4B-4622-86EB-95A22B832CAA'

9) Kompilace
   - pri trose stesti by ted melo stacit pustit 'myPHP\PHP5\nmake' a cekat az se vsechno zkompiluje
   - vysledek je v 'myPHP\PHP5\Release_TS', pripadne v jine podslozce podle volby modelu kompilace
   

-------------------------------------------------------------

Kompilace knihovny php_imap.dll (MSVS 2005):

1) Kroky 1) - 5) z navodu na kompilaci samotneho PHP

2) Kompilace c-client modulu pro IMAP (ROZDILNE!)
   - stahnout zdrojaky z 'ftp://ftp.cac.washington.edu/imap/c-client.tar.Z'
   - rozpakovat do podadresare myPHP, rekneme 'myPHP\myIMAP\'
   - otevrit 'myPHP\myIMAP\src\osdep\nt\makefile.nt' a '/MT' prepsat na '/MD'
   - spustit 'myPHP\myIMAP\nmake -f makefile.nt' (nejde jen o prekompilovani knihovny cclient.lib, ale take o ziskani spravnych verzi zdrojaku)

3) Konfigurace kompilace
   - otevrit 'myPHP\PHP5\win32\php_modules.dsw' ve Visual Studiu
   - vybrat konfiguraci kompilace 'Release TS'
   - pridat '..\..\..\myIMAP\c-client\' do cest pro kompilator i pro linker, nejlepe touto cestou:
      - Properties projektu 'imap' -> Configuration properties -> C/C++ -> General -> Additional Include Directories - pridat k uvedenym cestam, ale NASTAVIT JAKO PRVNI!
      - Properties projektu 'imap' -> Configuration properties -> Linker -> General -> Additional Library Directories - pridat k uvedenym cestam, ale NASTAVIT JAKO PRVNI!
   - pridat dve nova makra do nastaveni projektu 'imap' pres Properties -> Configuration properties -> C/C++ -> Preprocessor -> Preprocessor Definitions - pridat k uvedenym makrum 'PHP_EXPORTS' a 'PHP_IMAP_ONLY' (strednik jako oddelovac)

4) Editace zdrojaku
   - otevrit 'myPHP\PHP5\ext\imap\php_imap.c' soubor, najit funkci PHP_MINIT_FUNCTION a v ni volani funkce mail_parameters; v ni se treti parametr musi nahradit intovou hodnotou 64 pretypovanou na ukazatel na void

5) Kompilace IMAP knihovny (zkompilovat pouze 'imap' projekt)

   
-------------------------------------------------------------

Kompilace  knihovny php_imap.dll (MSVC 6.0): - pozor, je potreba mit PlatformSDK, ktere neni jeho implicitni soucasti

1) Kroky 1) - 3) z navodu kompilace imapu v MSVS 2005

2) (pro jistotu) Prejmenovat nebo presunout php_build\lib\cclient.lib, aby se nacital nove zkompilovany z myIMAP\c-client\

3) Pridat do %INCLUDE% promenne prostredi (pripadne do nastaveni projektu) cestu k 'PlatformSDK\include', obdobne pro %LIB% pridat 'PlatformSDK\lib'. Pozor, cesta musi byt nastavena jako prvni!!!

4) Kroky 4) a 5) jako pri kompilaci IMAP s MSVS 2005
   - Pridat PHP_EXPORTS do project compilation flags (C/C++ -> Preprocesor Macros)



========================================================================================================
========================================================================================================
========================================================================================================
//FILE myPHP\php_build\include\mysql_com.h:
/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
   This file is public domain and comes with NO WARRANTY of any kind */

/*
** Common definition between mysql server & client
*/

#ifndef _mysql_com_h
#define _mysql_com_h
#ifdef	__cplusplus
extern "C" {
#endif

#define NAME_LEN	64		/* Field/table name length */
#define LOCAL_HOST	"localhost"
#define LOCAL_HOST_NAMEDPIPE "."

#define MYSQL_PORT	3306		/* Alloced by ISI for MySQL */
#define MYSQL_UNIX_ADDR "/tmp/mysql.sock"
#ifdef WIN32
#define MYSQL_NAMEDPIPE "MySQL"
#endif

enum enum_server_command {COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY,
			  COM_FIELD_LIST,COM_CREATE_DB,COM_DROP_DB,COM_REFRESH,
			  COM_SHUTDOWN,COM_STATISTICS,
			  COM_PROCESS_INFO,COM_CONNECT,COM_PROCESS_KILL,
			  COM_DEBUG,COM_PING,COM_TIME};

#define NOT_NULL_FLAG	1		/* Field can't be NULL */
#define PRI_KEY_FLAG	2		/* Field is part of a primary key */
#define UNIQUE_KEY_FLAG 4		/* Field is part of a unique key */
#define MULTIPLE_KEY_FLAG 8		/* Field is part of a key */
#define BLOB_FLAG	16		/* Field is a blob */
#define UNSIGNED_FLAG	32		/* Field is unsigned */
#define ZEROFILL_FLAG	64		/* Field is zerofill */
#define BINARY_FLAG	128
/* The following are only sent to new clients */
#define ENUM_FLAG	256		/* field is an enum */
#define AUTO_INCREMENT_FLAG 512		/* field is a autoincrement field */
#define TIMESTAMP_FLAG	1024		/* Field is a timestamp */
#define PART_KEY_FLAG	16384		/* Intern; Part of some key */
#define GROUP_FLAG	32768		/* Intern group field */

#define REFRESH_GRANT		1	/* Refresh grant tables */
#define REFRESH_LOG		2	/* Start on new log file */
#define REFRESH_TABLES		4	/* close all tables */
#define REFRESH_HOSTS		8	/* Flush host cache */
#define REFRESH_FAST		32768	/* Intern flag */

#define CLIENT_LONG_PASSWORD	1	/* new more secure passwords */
#define CLIENT_FOUND_ROWS	2	/* Found instead of affected rows */
#define CLIENT_LONG_FLAG	4	/* Get all column flags */
#define CLIENT_CONNECT_WITH_DB	8	/* One can specify db on connect */
#define CLIENT_NO_SCHEMA	16	/* Don't allow database.table.column */
#define CLIENT_COMPRESS		32	/* Can use compression protcol */
#define CLIENT_ODBC		64	/* Odbc client */
#define CLIENT_LOCAL_FILES	128	/* Can use LOAD DATA LOCAL */
#define CLIENT_IGNORE_SPACE	256	/* Ignore spaces before '(' */

#define MYSQL_ERRMSG_SIZE 200
#define NET_READ_TIMEOUT 30			/* Timeout on read */
#define NET_WRITE_TIMEOUT 60			/* Timeout on write */
#define NET_WAIT_TIMEOUT 8*60*60		/* Wait for new query */

enum enum_net_type { NET_TYPE_TCPIP, NET_TYPE_SOCKET, NET_TYPE_NAMEDPIPE };

typedef struct st_net {
  enum enum_net_type nettype;
#ifdef WIN32
  HANDLE hPipe;
#endif
  Socket fd;
  int fcntl;
  unsigned char *buff,*buff_end,*write_pos,*read_pos;
  char last_error[MYSQL_ERRMSG_SIZE];
  unsigned int last_errno,max_packet,timeout,pkt_nr;
  my_bool error,return_errno,compress;

  unsigned long remain_in_buf,length, buf_length, where_b;
  my_bool more;
  char save_char;
} NET;

#define packet_error ((unsigned int) -1)

enum enum_field_types { FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY,
			FIELD_TYPE_SHORT,  FIELD_TYPE_LONG,
			FIELD_TYPE_FLOAT,  FIELD_TYPE_DOUBLE,
			FIELD_TYPE_NULL,   FIELD_TYPE_TIMESTAMP,
			FIELD_TYPE_LONGLONG,FIELD_TYPE_INT24,
			FIELD_TYPE_DATE,   FIELD_TYPE_TIME,
			FIELD_TYPE_DATETIME, FIELD_TYPE_YEAR,
			FIELD_TYPE_NEWDATE,
			FIELD_TYPE_ENUM=247,
			FIELD_TYPE_SET=248,
			FIELD_TYPE_TINY_BLOB=249,
			FIELD_TYPE_MEDIUM_BLOB=250,
			FIELD_TYPE_LONG_BLOB=251,
			FIELD_TYPE_BLOB=252,
			FIELD_TYPE_VAR_STRING=253,
			FIELD_TYPE_STRING=254
};

#define FIELD_TYPE_CHAR FIELD_TYPE_TINY		/* For compability */
#define FIELD_TYPE_INTERVAL FIELD_TYPE_ENUM	/* For compability */

extern unsigned long max_allowed_packet;
extern unsigned long net_buffer_length;

#define net_new_transaction(net) ((net)->pkt_nr=0)

int	my_net_init(NET *net,  enum enum_net_type nettype, Socket fd,
		    void* pipe);
void	net_end(NET *net);
void	net_clear(NET *net);
int	net_flush(NET *net);
int	my_net_write(NET *net,const char *packet,unsigned long len);
int	net_write_command(NET *net,unsigned char command,const char *packet,
			  unsigned long len);
int	net_real_write(NET *net,const char *packet,unsigned long len);
unsigned int	my_net_read(NET *net);

struct rand_struct {
  unsigned long seed,seed2,max_value;
  double max_value_dbl;
};

  /* The following is for user defined functions */

enum Item_result {STRING_RESULT,REAL_RESULT,INT_RESULT};

typedef struct st_udf_args
{
  unsigned int arg_count;		/* Number of arguments */
  enum Item_result *arg_type;		/* Pointer to item_results */
  char **args;				/* Pointer to argument */
  unsigned long *lengths;		/* Length of string arguments */
} UDF_ARGS;

  /* This holds information about the result */

typedef struct st_udf_init
{
  my_bool maybe_null;			/* 1 if function can return NULL */
  unsigned int decimals;		/* for real functions */
  unsigned int max_length;		/* For string functions */
  char	  *ptr;				/* free pointer for function data */
} UDF_INIT;

  /* Constants when using compression */
#define NET_HEADER_SIZE 4		/* standard header size */
#define COMP_HEADER_SIZE 3		/* compression header extra size */

  /* Prototypes to password functions */

void randominit(struct rand_struct *rand,unsigned long seed1,
		unsigned long seed2);
double rnd(struct rand_struct *rand);
void make_scrambled_password(char *to,const char *password);
void get_salt_from_password(unsigned long *res,const char *password);
char *scramble(char *to,const char *message,const char *password,
	       my_bool old_ver);
my_bool check_scramble(const char *scramble,const char *message,
		       unsigned long *salt,my_bool old_ver);
char *get_tty_password(char *opt_message);

#define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */

#ifdef WIN32
#define socket_errno WSAGetLastError()
#else
#define socket_errno errno
#endif

#ifdef	__cplusplus
}
#endif
#endif
========================================================================================================
========================================================================================================
========================================================================================================
