diff options
author | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-06-27 17:05:05 +0000 |
---|---|---|
committer | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-06-27 17:05:05 +0000 |
commit | cbd22101bcff041e598aba668412d0a4232b58e3 (patch) | |
tree | 984f7afe9ec9246719e185288f8a2e96f4bc0665 /MySpace/server_con.cpp | |
parent | 353f66dee3f468aaf7cc0d0ab314df89ae56c428 (diff) |
git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@217 4f64403b-2f21-0410-a795-97e2b3489a10
Diffstat (limited to 'MySpace/server_con.cpp')
-rw-r--r-- | MySpace/server_con.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/MySpace/server_con.cpp b/MySpace/server_con.cpp new file mode 100644 index 0000000..f3c6d79 --- /dev/null +++ b/MySpace/server_con.cpp @@ -0,0 +1,124 @@ +#include "common.h"
+#include "server_con.h"
+#include "net.h"
+
+#include "NetMessage.h"
+
+#define SERVER_READ_BUFFER_SIZE (1024 * 32)
+
+int status = ID_STATUS_OFFLINE;
+bool server_running = false, server_stop = false;
+HANDLE server_connection = 0;
+
+void CALLBACK sttMainThreadStatusCallback( ULONG dwParam ) {
+ if(status != dwParam) {
+ int previous_status = status;
+ status = dwParam;
+ ProtoBroadcastAck(MODULE,NULL,ACKTYPE_STATUS,ACKRESULT_SUCCESS, (HANDLE)previous_status, status);
+ }
+}
+
+int waitcallback(unsigned int *timeout) {
+ PUShowMessage("waitcallback", SM_NOTIFY);
+ return server_stop ? 0 : 1;
+}
+
+int try_ports[9] = {1863, 6660,6661,6662,6665,6668,6669,80,0443};
+
+void __cdecl ServerThreadFunc(void*) {
+ NETLIBOPENCONNECTION conn_data = {0};
+ conn_data.cbSize = sizeof(NETLIBOPENCONNECTION);
+ conn_data.flags = NLOCF_V2;
+ conn_data.szHost = "im.myspace.akadns.net";
+ conn_data.wPort = DBGetContactSettingDword(0, MODULE, "LastPort", try_ports[0]);
+ conn_data.timeout = 10;
+ conn_data.waitcallback = waitcallback;
+
+ QueueUserAPC(sttMainThreadStatusCallback, mainThread, ID_STATUS_CONNECTING);
+
+ server_running = true;
+
+ char *recv_buffer = new char[SERVER_READ_BUFFER_SIZE];
+ int bytes = 0;
+ char mt[256];
+ int tries = 0;
+ bool login = true;
+
+ while(!Miranda_Terminated() && !server_stop) {
+ if(login) {
+ if(server_connection) Netlib_CloseHandle(server_connection);
+ server_connection = (HANDLE)CallService(MS_NETLIB_OPENCONNECTION, (WPARAM)hNetlibUser, (LPARAM)&conn_data);
+ }
+ bytes = Netlib_Recv(server_connection, (char *)recv_buffer, SERVER_READ_BUFFER_SIZE, MSG_DUMPASTEXT);
+
+ if(bytes == 0) {
+ PUShowMessage("Connection closed", SM_NOTIFY);
+ if(login && tries < 9) {
+ conn_data.wPort = try_ports[tries++];
+ } else
+ break;
+ } else if(bytes == SOCKET_ERROR) {
+ PUShowMessage("Socket ERROR", SM_NOTIFY);
+ break;
+ } else {
+ if(login) {
+ login = false;
+ QueueUserAPC(sttMainThreadStatusCallback, mainThread, ID_STATUS_ONLINE);
+ }
+
+ mir_snprintf(mt, 256, "recvd %d bytes", bytes);
+ PUShowMessage(mt, SM_NOTIFY);
+
+ NetMessage msg;
+ msg.parse(recv_buffer, bytes);
+ if(msg.exists(NMString("lc"))) {
+ NMString val;
+ msg.get(NMString("lc"), val);
+ mir_snprintf(mt, 256, "Login message: type is %s", val.text);
+ PUShowMessage(mt, SM_NOTIFY);
+ // challenge/response:
+ //
+ } else if(msg.exists(NMString("persistr"))) {
+ NMString cmd, dsn, lid;
+ msg.get(NMString("cmd"), cmd);
+ msg.get(NMString("dsn"), dsn);
+ msg.get(NMString("lid"), lid);
+ mir_snprintf(mt, 256, "Perist message: type is %s,%s,%s", cmd.text, dsn.text, lid.text);
+ PUShowMessage(mt, SM_NOTIFY);
+ }
+ }
+ }
+ if(server_connection) {
+ Netlib_CloseHandle(server_connection);
+ server_connection = 0;
+ }
+ delete recv_buffer;
+
+ QueueUserAPC(sttMainThreadStatusCallback, mainThread, ID_STATUS_OFFLINE);
+ server_running = false;
+}
+
+void StartThread() {
+ if(!server_running) {
+ server_stop = false;
+ mir_forkthread(ServerThreadFunc, 0);
+ }
+}
+
+void StopThread() {
+ if(server_running) {
+ server_stop = true;
+ if(server_connection) {
+ Netlib_CloseHandle(server_connection);
+ server_connection = 0;
+ }
+ }
+}
+
+void InitServerConnection() {
+ StartThread();
+}
+
+void DeinitServerConnection() {
+ StopThread();
+}
|