#ifndef __PZBC_HEADER_DEFINED__
#define __PZBC_HEADER_DEFINED__

#define PZB_PROTOCOL_TRANS_PTCP     1
#define PZB_PROTOCOL_FLV_HTTP       2
#define PZB_PROTOCOL_TCP_TRANS      3
#define PZB_PROTOCOL_FLV_RTMP       16

#define PZB_POWZAMEDIA_MODE       0
#define PZB_INKE_MODE             1
#define PZB_POWZAMEDIA_JP_MODE    2
#define PZB_POWZAMEDIA_TEST_MODE  3

#define	PZB_MAX_DOMAIN_COUNT	16
#define	PZB_MAX_ITEM_LIST		8
#define PZB_DOMAIN_LEN          64

class	PZBC_Item
{
public:
	char	Addr[256];
	DWORD	Port;
	DWORD	Protocol;
	DWORD	Retry;
	DWORD	Exec;
	char	Detail[256];
};

class    PZBC_Input
{
public:
    char    Domain[256];
    char    URI[1024];
    DWORD   Port;
    DWORD   Mode;
    DWORD   Owner;
    DWORD   Timeout;
    DWORD   NewFlag;
    long long  RefreshTime;
};

class    PZBC_Internal
{
public:
    PZBC_Item  List[PZB_MAX_ITEM_LIST];
    char   ActualDomain[PZB_DOMAIN_LEN];
    int    NowNo;
    DWORD  PreloadFlag;
    DWORD  Count;
    DWORD  Loop;
    DWORD  RPI;
    
    int     Running;//chenhd
};

class	PZBC
{
private:
	DWORD		PZBS_Port;
	char		CID[64];
    int         m_ipvxflag;
    void*       pPSNDSelector;
    PI_iLiveBase_Mutex		mutex;
    
    PZBC_Input      *m_input;
    PZBC_Internal   *m_internal;
    DWORD           m_saved;
    
    // Clear saved input and internal data
    int ClearSaved(int saved_no);
    
    // Save input data
    int SaveInput(int saved_no, char *domain, char *uri, DWORD port, DWORD mode, DWORD owner, DWORD timeout);
    
    // Find oldest saved input data
    int FindOldest();
    
    // Compare input params with saved params
    // Return value
    // 1, equal
    // 0, not equal
    int CompareInput(int saved_no, char *domain, char *uri, DWORD port, DWORD mode, DWORD owner);
    
    // Find available input space
    int FindAvailable(char *domain, char *uri, DWORD port, DWORD mode, DWORD owner, DWORD timeout);
    
    // Get ip address from node selector(do not update RefreshTime)
    int GetFromNDS(int no, char *ip, DWORD *port, DWORD *protocol);

public:
    
    PZBC();
    ~PZBC();
	
	void	Init(void*	pNDSelector);
    
    DWORD	Set(char *Set_Domain,DWORD Set_Port,char *Set_URI,DWORD Set_Mode, DWORD	Set_Time_Out,DWORD PZBOwner_Mode);
    
    DWORD	Preload(char *domain, DWORD port, char *uri, DWORD mode, DWORD owner);
    void*	Preload_Run(int no);
    
    /**
     * if the Domain in pzbc is same to your domain, return 0;
     * if difference, return -1;
     **/
    int     CheckDomain(char* domain);
    
    /**
     @param Addr the size of Addr should not less than 256
     **/
	DWORD	Get(char *domain, DWORD port, char *uri, DWORD mode, DWORD owner, char *get_addr, DWORD* get_port, DWORD* get_protocol, char *desired_domain, char *actual_domain, DWORD *rpi = 0);	//sizeof(desiredDomain) and sizeof(actualDomain) should not less than 64
    
	DWORD	Reset(int no);

	DWORD	Get_From_PZB(int no);

	DWORD	Http_Connect(DWORD sockfd, struct sockaddr*dstaddr, int addrlen, int timeout_ms);

	DWORD	Get_Info_From_PZB(int no, char* Host,DWORD Host_Count,DWORD Port,char* pURI,char* User_Agent, DWORD* pContent_Length,char* pContent, DWORD Time_Out);
    
    
    // synchronize, do not modify
    int m_sync;
    
    // preload number, do not modify
    int m_preload;
    
    //chenhd
    int m_stopflag;

};

DWORD	PZBC_Global_Init(void* pNDSelector);

#endif

