summaryrefslogtreecommitdiff
path: root/MySpace/server_con.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'MySpace/server_con.cpp')
-rw-r--r--MySpace/server_con.cpp374
1 files changed, 286 insertions, 88 deletions
diff --git a/MySpace/server_con.cpp b/MySpace/server_con.cpp
index 0aa577c..41aad7d 100644
--- a/MySpace/server_con.cpp
+++ b/MySpace/server_con.cpp
@@ -3,6 +3,7 @@
#include "net.h"
#include "arc4.h"
#include "options.h"
+#include "nick_dialog.h"
#define SERVER_READ_BUFFER_SIZE (1024 * 32)
@@ -22,10 +23,103 @@
#define NONCE_SIZE 0x20
int status = ID_STATUS_OFFLINE;
-bool server_running = false, server_stop = false;
+bool myspace_server_running = false, server_stop = false;
HANDLE server_connection = 0;
-int sesskey = 0, req_id = 1;
+int sesskey = 0, req_id = 1, my_uid = 0;
+int signon_status = ID_STATUS_ONLINE;
+
+int stat_mir_to_myspace(int mir_status) {
+ switch(mir_status) {
+ case ID_STATUS_INVISIBLE: return 0;
+ case ID_STATUS_AWAY: return 5;
+ case ID_STATUS_ONLINE: return 1;
+ }
+ return 0;
+}
+
+int stat_myspace_to_mir(int myspace_status) {
+ switch(myspace_status) {
+ case 0: return ID_STATUS_OFFLINE;
+ case 1: return ID_STATUS_ONLINE;
+ case 5: return ID_STATUS_AWAY;
+ }
+ return 0;
+}
+
+HANDLE FindContact(int uid) {
+ char *proto;
+ int cuid;
+ HANDLE hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 );
+ while ( hContact != NULL )
+ {
+ proto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )hContact,0 );
+ if ( proto && !strcmp( MODULE, proto)) {
+ cuid = DBGetContactSettingDword(hContact, MODULE, "UID", (DWORD)0);
+ if(cuid == uid) {
+ return hContact;
+ }
+ }
+ hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 );
+ }
+
+ return 0;
+}
+
+HANDLE CreateContact(int uid, char *nick, char *email) {
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_ADD, 0, 0);
+
+ if(hContact) {
+ DBWriteContactSettingDword(hContact, MODULE, "UID", uid);
+ if(nick && strlen(nick)) {
+ DBWriteContactSettingStringUtf(hContact, MODULE, "Nick", nick);
+ }
+ if(email && strlen(email)) {
+ DBWriteContactSettingStringUtf(hContact, MODULE, "email", email);
+ }
+
+ ClientNetMessage msg_add;
+ msg_add.add_string("addbuddy", "");
+ msg_add.add_int("sesskey", sesskey);
+ msg_add.add_int("newprofileid", uid);
+ msg_add.add_string("reason", "");
+
+ SendMessage(msg_add);
+
+ /*
+ ClientNetMessage msg_block;
+ msg_block.add_string("blocklist", "");
+ msg_block.add_int("sesskey", sesskey);
+
+ char idlist[1024];
+ mir_snprintf(idlist, 1024, "b-|%d|a+|%d", mpsr->uid, mpsr->uid);
+ msg_block.add_string("idlist", idlist);
+
+ SendMessage(msg_block);
+ */
+
+ /*
+ // update contact details?
+ ClientNetMessage msg_persist;
+ msg_persist.add_int("persist", 1);
+ msg_persist.add_int("sesskey", sesskey);
+
+ msg_persist.add_int("cmd", 514);
+ msg_persist.add_int("dsn", 0);
+ msg_persist.add_int("uid", DBGetContactSettingDword(0, MODULE, "UID", 0));
+ msg_persist.add_int("lid", 9);
+ msg_persist.add_int("rid", req_id++);
+ char body[4096];
+ mir_snprintf(body, 4096, "ContactID=%d\x1cGroupName=\x1cPosition=1000\x1cVisibility=2\x1cNickName=\x1cNameSelect=0", mpsr->uid);
+ msg_persist.add_string("body", body);
+ SendMessage(msg_persist);
+ */
+
+ CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)hContact, (LPARAM)MODULE);
+ }
+
+ return hContact;
+}
void SendMessage(ClientNetMessage &msg) {
char packet[4096];
@@ -121,7 +215,7 @@ void __cdecl ServerThreadFunc(void*) {
int conn_stat = ID_STATUS_CONNECTING;
QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat);
- server_running = true;
+ myspace_server_running = true;
char *recv_buffer = new char[SERVER_READ_BUFFER_SIZE];
int bytes = 0;
@@ -140,13 +234,13 @@ void __cdecl ServerThreadFunc(void*) {
bytes = Netlib_Recv(connection, (char *)recv_buffer, SERVER_READ_BUFFER_SIZE, MSG_DUMPASTEXT);
if(bytes == 0) {
- PUShowMessage("Connection closed", SM_NOTIFY);
+ //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);
+ //PUShowMessage("Socket ERROR", SM_NOTIFY);
if(login && tries < 9) {
conn_data.wPort = try_ports[tries++];
} else
@@ -159,129 +253,233 @@ void __cdecl ServerThreadFunc(void*) {
DBWriteContactSettingDword(0, MODULE, "LastPort", conn_data.wPort);
}
- //mir_snprintf(mt, 256, "recvd %d bytes", bytes);
- //PUShowMessage(mt, SM_NOTIFY);
+ char *pbuff = recv_buffer, *end;
+ while((end = strstr(pbuff, "\\final\\")) != 0) {
+ //mir_snprintf(mt, 256, "recvd %d bytes", bytes);
+ //PUShowMessage(mt, SM_NOTIFY);
+ if(pbuff != recv_buffer) {
+ PUShowMessage("Second packet", SM_NOTIFY);
+ }
+ end += 7;
+ *end = 0;
- NetMessage msg;
- msg.parse(recv_buffer, bytes);
- if(msg.exists(NMString("error"))) {
- char errmsg[256];
- if(msg.get_string("errmsg", errmsg, 256))
- PUShowMessage(errmsg, SM_WARNING);
- } else if(msg.get_int("lc") == 1) {
- QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat++);
- try_login(msg, server_connection);
- } else if(msg.get_int("lc") == 2) {
- sesskey = msg.get_int("sesskey");
- DBWriteContactSettingDword(0, MODULE, "UID", msg.get_int("userid"));
- char nick[256];
- if(msg.get_string("uniquenick", nick, 256))
- DBWriteContactSettingStringUtf(0, MODULE, "Nick", nick);
- QueueUserAPC(sttMainThreadStatusCallback, mainThread, ID_STATUS_ONLINE);
- } else if(msg.exists(NMString("persistr"))) {
-
- int cmd, dsn, lid, req;
- cmd = msg.get_int("cmd") & 255;
- dsn = msg.get_int("dsn");
- lid = msg.get_int("lid");
- req = msg.get_int("rid");
-
- mir_snprintf(mt, 256, "Peristr message: type is %d,%d,%d", cmd, dsn, lid);
- PUShowMessage(mt, SM_NOTIFY);
- if(cmd == 1 && dsn == 5 && lid == 7) {
- Dictionary body = msg.get_dict("body");
- char email[256], nick[256];
- int uid = body.get_int("UserID");
- if(uid != 0) {
- MYPROTOSEARCHRESULT mpsr = {sizeof(mpsr)};
-
- if(body.get_string("UserName", nick, 256))
- mpsr.psr.nick = nick;
- else if(body.get_string("DisplayName", nick, 256))
- mpsr.psr.nick = nick;
- if(body.get_string("Email", email, 256))
- mpsr.psr.email = email;
- mpsr.uid = uid;
-
- ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)req, (LPARAM)&mpsr);
- } else
- ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0);
- } else
- if(cmd == 1 && dsn == 4 && lid == 3) {
- Dictionary body = msg.get_dict("body");
+ NetMessage msg;
+ msg.parse(recv_buffer, bytes);
+ if(msg.exists(NMString("error"))) {
char errmsg[256];
- if(body.get_string("ErrorMessage", errmsg, 256)) {
+ if(msg.get_string("errmsg", errmsg, 256))
PUShowMessage(errmsg, SM_WARNING);
- ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0);
- } else {
+ } else if(msg.get_int("lc") == 1) {
+ QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat++);
+ try_login(msg, server_connection);
+ } else if(msg.get_int("lc") == 2) {
+ sesskey = msg.get_int("sesskey");
+ DBWriteContactSettingDword(0, MODULE, "UID", my_uid = msg.get_int("userid"));
+ char nick[256];
+ if(msg.get_string("uniquenick", nick, 256))
+ DBWriteContactSettingStringUtf(0, MODULE, "Nick", nick);
+ QueueUserAPC(sttMainThreadStatusCallback, mainThread, ID_STATUS_ONLINE);
+
+ if(my_uid == msg.get_int("uniquenick")) {
+ // need to pick a nick
+ ShowNickDialog();
+ }
+
+
+ // update our options on server
+ Dictionary d;
+ d.add_string("Sound", options.sound ? "True" : "False");
+ d.add_int("PrivacyMode", options.privacy_mode);
+ d.add_string("ShowOnlyToList", options.show_only_to_list ? "True" : "False");
+ d.add_int("OfflineMessageMode", options.offline_message_mode);
+ d.add_string("Headline", "");
+ d.add_int("Alert", 1);
+ d.add_string("ShowAvatar", options.show_avatar ? "True" : "False");
+ d.add_string("IMName", options.im_name);
+
+ ClientNetMessage cmsg;
+ cmsg.add_int("persist", 1);
+ cmsg.add_int("sesskey", sesskey);
+ cmsg.add_int("uid", DBGetContactSettingDword(0, MODULE, "UID", 0));
+ cmsg.add_int("cmd", 514);
+ cmsg.add_int("dsn", 1);
+ cmsg.add_int("lid", 10);
+ cmsg.add_int("rid", req_id++);
+ cmsg.add_dict("body", d);
+ SendMessage(cmsg);
+
+ // set blocklist
+ ClientNetMessage msg_block;
+ msg_block.add_string("blocklist", "");
+ msg_block.add_int("sesskey", sesskey);
+ msg_block.add_string("idlist", "w0|c0|a-|*|b-|*");
+ SendMessage(msg_block);
+
+ // set status
+ ClientNetMessage msg_status;
+ msg_status.add_int("status", stat_mir_to_myspace(signon_status));
+ msg_status.add_int("sesskey", sesskey);
+ msg_status.add_string("statstring", "");
+ msg_status.add_string("locstring", "");
+ SendMessage(msg_status);
+
+ /*
+ // set login time?
+ Dictionary ld;
+ ld.add_int("ContactType", 1);
+ ld.add_int("LastLogin", timestamp);
+ ClientNetMessage msg_setinfo;
+ msg_setinfo.add_string("setinfo", "");
+ msg_block.add_int("sesskey", sesskey);
+ msg_setinfo.add_dict("info", ld);
+ SendMessage(msg_setinfo);
+ */
+ } else if(msg.get_int("bm") == 100) { // status message
+ int uid = msg.get_int("f");
+ if(uid) {
+ HANDLE hContact = FindContact(uid);
+ if(!hContact) {
+ hContact = CreateContact(uid, 0, 0);
+ // lookup user?
+ }
+ char smsg[1024];
+ if(msg.get_string("msg", smsg, 1024)) {
+ DBWriteContactSettingWord(hContact, MODULE, "Status", stat_myspace_to_mir(smsg[3] - '0'));
+ }
+ }
+ } else if(msg.exists(NMString("persistr"))) {
+ int cmd, dsn, lid, req;
+ cmd = msg.get_int("cmd") & 255;
+ dsn = msg.get_int("dsn");
+ lid = msg.get_int("lid");
+ req = msg.get_int("rid");
+
+ mir_snprintf(mt, 256, "Peristr message: type is %d,%d,%d", cmd, dsn, lid);
+ PUShowMessage(mt, SM_NOTIFY);
+ if(cmd == 1 && dsn == 5 && lid == 7) { // userinfo (lookup by username/email)
+ Dictionary body = msg.get_dict("body");
char email[256], nick[256];
int uid = body.get_int("UserID");
+ if(nick_dialog) PostMessage(nick_dialog, WMU_NICKEXISTS, (WPARAM)(uid != 0), msg.get_int("rid"));
if(uid != 0) {
MYPROTOSEARCHRESULT mpsr = {sizeof(mpsr)};
- if(body.get_string("DisplayName", nick, 256))
+ if(body.get_string("UserName", nick, 256))
mpsr.psr.nick = nick;
- else if(body.get_string("UserName", nick, 256))
+ else if(body.get_string("DisplayName", nick, 256))
mpsr.psr.nick = nick;
-
if(body.get_string("Email", email, 256))
mpsr.psr.email = email;
mpsr.uid = uid;
ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)req, (LPARAM)&mpsr);
- } else
+ }
+ ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0);
+ } else
+ if(cmd == 1 && dsn == 4 && lid == 3) { // userinfo(lookup by userid)
+ Dictionary body = msg.get_dict("body");
+ char errmsg[256];
+ if(body.get_string("ErrorMessage", errmsg, 256)) {
+ PUShowMessage(errmsg, SM_WARNING);
ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0);
- }
- } else
- if(cmd == 2 && dsn == 0 && lid == 9) {
- Dictionary body = msg.get_dict("body");
- char errmsg[256];
- if(body.get_string("ErrorMessage", errmsg, 256)) {
- PUShowMessage(errmsg, SM_WARNING);
- } else {
- char nick[256];
- int uid = body.get_int("ContactID");
- if(uid != 0) {
- if(body.get_string("NickName", nick, 256)) {
- DBWriteContactSettingStringUtf(0, MODULE, "Nick", nick);
+ } else {
+ char email[256], nick[256];
+ int uid = body.get_int("UserID");
+ if(uid != 0) {
+ MYPROTOSEARCHRESULT mpsr = {sizeof(mpsr)};
+
+ if(body.get_string("DisplayName", nick, 256))
+ mpsr.psr.nick = nick;
+ else if(body.get_string("UserName", nick, 256))
+ mpsr.psr.nick = nick;
+
+ if(body.get_string("Email", email, 256))
+ mpsr.psr.email = email;
+ mpsr.uid = uid;
+
+ ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)req, (LPARAM)&mpsr);
}
+ ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0);
+ }
+ } else
+ if(cmd == 2 && dsn == 0 && lid == 9) {
+ Dictionary body = msg.get_dict("body");
+ char errmsg[256];
+ if(body.get_string("ErrorMessage", errmsg, 256)) {
+ PUShowMessage(errmsg, SM_WARNING);
+ } else {
+ char nick[256];
+ int uid = body.get_int("ContactID");
+ if(uid != 0) {
+ if(body.get_string("NickName", nick, 256)) {
+ DBWriteContactSettingStringUtf(0, MODULE, "Nick", nick);
+ }
+ }
+ }
+ } else
+ if(cmd == 2 && dsn == 9 && lid == 14) {
+ Dictionary body = msg.get_dict("body");
+ char errmsg[256];
+ if(body.get_string("ErrorMessage", errmsg, 256)) {
+ PUShowMessage(errmsg, SM_WARNING);
+ } else {
+ int code = body.get_int("Code");
+ if(nick_dialog) PostMessage(nick_dialog, WMU_CHANGEOK, (WPARAM)(code == 0), msg.get_int("rid"));
}
}
}
+ pbuff = end + 1;
}
}
}
if(server_connection) {
+ ClientNetMessage msg;
+ msg.add_string("logout", "");
+ msg.add_int("sesskey", sesskey);
+ SendMessage(msg);
Netlib_CloseHandle(server_connection);
server_connection = 0;
}
delete recv_buffer;
QueueUserAPC(sttMainThreadStatusCallback, mainThread, ID_STATUS_OFFLINE);
- server_running = false;
+ myspace_server_running = false;
+ SetAllOffline();
}
void StartThread() {
- if(!server_running) {
+ if(!myspace_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;
- }
+ if(myspace_server_running) {
+ ClientNetMessage msg;
+ msg.add_string("logout", "");
+ msg.add_int("sesskey", sesskey);
+ SendMessage(msg);
}
}
-void InitServerConnection() {
- StartThread();
-}
-
-void DeinitServerConnection() {
- StopThread();
+void SetServerStatus(int st) {
+ if(st == ID_STATUS_OFFLINE) {
+ StopThread();
+ } else {
+ if(myspace_server_running) {
+ // set status
+ ClientNetMessage msg_status;
+ msg_status.add_int("status", stat_mir_to_myspace(st));
+ msg_status.add_int("sesskey", sesskey);
+ msg_status.add_string("statstring", "");
+ msg_status.add_string("locstring", "");
+ SendMessage(msg_status);
+
+ QueueUserAPC(sttMainThreadStatusCallback, mainThread, st);
+ } else {
+ signon_status = st;
+ StartThread();
+ }
+ }
}