/*
* FILENAME: MsgAgent.h
*
*/
//Function Prototype Declaration
////////////////////////////////////////////////////////////////////////////
/*
ConnectReal 連線到 Push Server ,
*參數:
char* CompName 登錄資料:公司名
char* ProdName 登錄資料:產品名
char* UserName 登錄資料:使用者帳號
char* Password 登錄資料:使用者密碼
char* ProxyAddress 連線資料:PROXY位址,如果為空字串或為NULL,即為無PROXY
int ProxyPort 連線資料:PROXY PORT,如果無PROXY ADDRESS,本值無效
char* CoreAddress 連線資料:Core位址,不可為空字串或為NULL
int CorePort 連線資料:Core PORT,不可無效
HANDLE Handle 接收訊息的視窗的 Handle
*回傳值:
> 0 表建立Socket連線成功, 但不表示登入成功,
<= 0 表示無法建立連線
*/

typedef int (__stdcall *ConnectRealProc)(char* comp, char* prod, char* user, char* pass, char* proxy_addr, int proxy_port, char* server_addr, int server_port, HANDLE hWnd);

/////////////////////////////////////////////////////////////////////////////
/*
DisconnectReal 切斷連線
*參數:

*回傳值:

*/

typedef void (__stdcall *DisconnectRealProc)(void);

/////////////////////////////////////////////////////////////////////////////
/*
SubReal 訂閱頻道
*參數:
char* channel 為欲訂閱之頻道,該字串需以 '\0' 結束
*回傳值:
為送出字串的字數,若為0表示失敗
*/

typedef int (__stdcall *SubRealProc)(char* channel);

/////////////////////////////////////////////////////////////////////////////
/*
UnsubReal 取消訂閱頻道
*參數:
char* channel 為欲取消訂閱之頻道,該字串需以 '\0' 結束
*回傳值:
為送出字串的字數,若為0表示失敗
*/

typedef int (__stdcall *UnsubRealProc)(char* channel);

/////////////////////////////////////////////////////////////////////////////
/*
UnpackData 將資料解碼
*參數:
char* dest 目的資料區段位置
int maxsize 目的資料區段長度
char* src 來源資料位置
int len 來源資料區段長度
*回傳值:
-1表示目的資料區段長度不足,
otherwise解碼後實際長度
目的資料以'\0'結束,回傳值的長度不包含此'\0'
*/

typedef int (__stdcall *UnpackDataProc)(char* buf, int buf_len, char* src, int len);

/////////////////////////////////////////////////////////////////////////////
/*
PackData 將資料編碼
參數:
char* dest 目的資料區段位置
int maxsize 目的資料區段長度
char* src 來源資料位置
int len 來源資料區段長度
*回傳值:
-1表示目的資料區段長度不足,
otherwise解碼後實際長度
目的資料以'\0'結束,回傳值的長度不包含此'\0'
*/

typedef int (__stdcall *PackDataProc)(char* buf, int buf_len, char* src, int len);

/////////////////////////////////////////////////////////////////////////////
/*
UnpackBlock 將資料解碼(Block型態)
*參數:
char* dest 目的資料區段位置
char* msg 來源資料位置
int len 來源資料區段長度
*回傳值:
解碼後實際長度
目的資料以'\0'結束,回傳值的長度不包含此'\0'
*/

typedef int (__stdcall *UnpackBlockProc)(char *dest, char *msg, int len);

/////////////////////////////////////////////////////////////////////////////
/*
PackBlock 將資料編碼(Block型態)
*參數:
char* dest 目的資料區段位置
int size 目的資料區段長度
char* data 來源資料位置
int len 來源資料區段長度
*回傳值:
實際被編碼的資料長度
目的資料以'\0'結束,回傳值的長度不包含此'\0'
*/

typedef int (__stdcall *PackBlockProc)(char *dest, int size, char *msg, int len);

/////////////////////////////////////////////////////////////////////////////
/*
SubmitReal 上傳資料
*參數:
char* channel 頻道,以'\0'結束
char* data 欲上傳的資料,以'\0'結束
*回傳值:
全部送出的資料長度,應該為 channel+data+2
*/

typedef int (__stdcall *SubmitRealProc)(char* channel, char* data);

/////////////////////////////////////////////////////////////////////////////
/*
SubmitBlock 上傳 Block 型態資料(長度超過1020-Byte的資料)
*參數為:
char* ch 頻道,以'\0'結束
char* name 資料名稱,給AP利用來辨識資料,以'\0'結束
char* data 欲上傳的資料,以'\0'結束
int datalen 資料長度
*回傳值:
送出的資料長度,應該為 datalen
*/

typedef int (__stdcall *SubmitBlockProc)(char* ch, char* name, char* data, int datalen);

/////////////////////////////////////////////////////////////////////////////
/*
SetDelayTime 設定 SubmitBlock 發送資料延遲時間
*參數:
int delay 延遲時間,單位為千分之一秒,不得小於10
*回傳值:
設定後,系統的延遲時間
*/

typedef int (__stdcall *SetDelayTimeProc)(int delay);

/////////////////////////////////////////////////////////////////////////////
/*
SetBlockSize 設定 SubmitBlock 發送資料每一區段的最大長度
*參數為:
int size 資料長度,單位 byte,有效值為16∼1012
*回傳值:
設定後,系統的區段長度
*/

typedef int (__stdcall *SetBlockSizeProc)(int size);

/////////////////////////////////////////////////////////////////////////////
/*
SubmitSubject 上傳以subject作區別的資料
*參數為:
char* subject 主題字串
char* data 傳送資料
int len 資料長度
*回傳值:
送出的資料長度 
*/
typedef int (__stdcall *SubmitSubjectProc)(char* subject, char* data, int len);

//////////////////////////////////////////////////////////////////////////////
/*
SubSubject 訂閱主題
*參數:
char* subject 主題字串
*回傳值:

*/
typedef void (__stdcall *SubSubjectProc)(char* subject);

//////////////////////////////////////////////////////////////////////////////
/*
UnsubSubject 解除訂閱主題
*參數:
char* subject 主題字串
*回傳值:

*/
typedef void (__stdcall *UnsubSubjectProc)(char* subject);

//給 Client 端程式的訊息類別
//有資料進來,第一個參數是該資料頻道,第二參數是資料內容,兩參數皆有'\0'結束

#define WM_DATARECEIVED WM_USER+111
//連線完成,第一參數是目的 Server 的Address與Port如"210.244.30.100:8000"
#define WM_CONNECTION_READY WM_USER+112
//連線中斷,第一參數為斷線原因的 Code,Agent隨後做連線嘗試,若失敗則送出WM_CONNECT_FAIL
#define WM_CONNECTION_LOST WM_USER+113
//連線失敗,原因請參閱WM_CONNECTION_FAIL
#define WM_CONNECTION_FAIL WM_USER+114
//對於命令的回應,參數的意義參閱WM_COMMAND_MESSAGE
#define WM_COMMAND_MESSAGE WM_USER+115
//有 Block 資料進來,第一個參數是資料(資料結構請參閱 BlockDataStruct),第二參數無用
#define WM_BLOCKRECEIVED WM_USER+116
//資料接收錯誤
#define WM_DATARECEIVE_FAIL WM_USER+117
//接收到以subject區分的訊息
#define WM_SUBJECTRECEIVED WM_USER+118

//WM_CONNECTION_FAIL 訊息的第一個參數
#define CF_CONNECT_FAIL 0 //連線失敗,應嘗試下一個 iCore 位址
#define CF_LOGININFO_UNKNOWN 1 //尚未設定 login information
#define CF_CORE_UNKNOWN 2 //尚未設定 iCore 位址
#define CF_SOCKET_CREATE_FAIL 3 //無法 create socket
#define CF_PROXY_FAIL 4 //proxy 連線失敗
#define CF_CONNECT_UNREADY 5 //連線未完成,請稍後再作動作
#define CF_LOGIN_FAIL 6 //設定的 login information 無效
#define CF_PASSWORD_FAIL 7 //設定的 password 無效
#define CF_USER_UNKNOWN 8 //帳號無效
#define CF_CONNECT_LIMIT 9 //Connect Limit
#define CF_PROXY_USERDATA_REQUIRE 10//Proxy need account & password

//以下定義給 WM_COMMAND_MESSAGE 命令訊息類別作參數
#define CM_COMMAND_OK 0 //命令成功
#define CM_CHANNEL_INVALID 1 //頻道ID無效
#define CM_CHANNEL_OVERFLOW 2 //訂閱太多頻道
#define CM_CHANNEL_DUPLICATE 3 //頻道重複訂閱
#define CM_UNSUB_NONE 4 //欲取消訂閱的頻道並沒有訂閱
#define CM_CHANNEL_NOPERMISSION 5 //無權訂閱頻道
#define CM_SUBJECT_OK 20 //subject命令成功
#define CM_SUBJECT_INVALID 21 //subject無效
#define CM_SUBJECT_OVERFLOW 22 //訂閱太多subject
#define CM_SUBJECT_DUPLICATE 23 //subject重複訂閱
#define CM_SUBJECT_UNSUB_NONE 24 //欲取消訂閱的subject並沒有訂閱
#define CM_SUBJECT_NOPERMISSION 25 //無權訂閱subject

//以下定義給 WM_DATARECEIVE_FAIL 資料接收失敗做參數
#define DF_PARSE_ERROR 0
#define DF_PACKAGE_LOST 1

//Block 資料的結構
typedef struct {
unsigned long channel; // 頻道
char strName[64];// 名稱
char *pData; // 資料區塊
UINT nSize; // 原始大小
UINT nDataLen; // 已收到的 size
BYTE nNextCode; // 應收 Block Index ,Error 時使用
BYTE nRecvCode; // 收到的 Block Index,Error 使用
} BlockDataStruct;