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.cpp72
1 files changed, 60 insertions, 12 deletions
diff --git a/MySpace/server_con.cpp b/MySpace/server_con.cpp
index 47bfbcb..bd0d078 100644
--- a/MySpace/server_con.cpp
+++ b/MySpace/server_con.cpp
@@ -67,6 +67,25 @@ HANDLE FindContact(int uid) {
return 0;
}
+int LookupUID(int uid) {
+ int ret;
+ // lookup user
+ ClientNetMessage msg_lookup;
+ msg_lookup.add_int("persist", 1);
+ msg_lookup.add_int("sesskey", sesskey);
+ msg_lookup.add_int("uid", my_uid);
+ msg_lookup.add_int("cmd", 1);
+ msg_lookup.add_int("dsn", 4);
+ msg_lookup.add_int("lid", 3);
+ msg_lookup.add_int("rid", ret = req_id++);
+ char body[512];
+ mir_snprintf(body, 512, "UserID=%d", uid);
+ msg_lookup.add_string("body", body);
+ SendMessage(msg_lookup);
+
+ return ret;
+}
+
HANDLE CreateContact(int uid, char *nick, char *email) {
HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_ADD, 0, 0);
@@ -232,6 +251,14 @@ void __cdecl ServerThreadFunc(void*) {
if(connection) Netlib_CloseHandle(connection);
QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat++);
connection = (HANDLE)CallService(MS_NETLIB_OPENCONNECTION, (WPARAM)hNetlibUser, (LPARAM)&conn_data);
+ if(!connection) {
+ if(tries < 9) {
+ conn_data.wPort = try_ports[tries++];
+ } else {
+ ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_NOSERVER);
+ break;
+ }
+ }
}
bytes = Netlib_Recv(connection, (char *)recv_buffer, SERVER_READ_BUFFER_SIZE, MSG_DUMPASTEXT);
@@ -239,14 +266,18 @@ void __cdecl ServerThreadFunc(void*) {
//PUShowMessage("Connection closed", SM_NOTIFY);
if(login && tries < 9) {
conn_data.wPort = try_ports[tries++];
- } else
+ } else {
+ if(login) ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_NOSERVER);
break;
+ }
} else if(bytes == SOCKET_ERROR) {
//PUShowMessage("Socket ERROR", SM_NOTIFY);
if(login && tries < 9) {
conn_data.wPort = try_ports[tries++];
- } else
+ } else {
+ if(login) ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_NOSERVER);
break;
+ }
} else {
if(login) {
QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat++);
@@ -256,21 +287,28 @@ void __cdecl ServerThreadFunc(void*) {
}
char *pbuff = recv_buffer, *end;
- while((end = strstr(pbuff, "\\final\\")) != 0) {
+ while((end = strstr(pbuff, "\\final\\")) != 0 && (end - recv_buffer <= bytes)) {
//mir_snprintf(mt, 256, "recvd %d bytes", bytes);
//PUShowMessage(mt, SM_NOTIFY);
+ end += 7;
+ if(end - pbuff > bytes) {
+ //PUShowMessage("More than one packet", SM_NOTIFY);
+ }
if(pbuff != recv_buffer) {
- PUShowMessage("Second packet", SM_NOTIFY);
+ //PUShowMessage("Not first packet", SM_NOTIFY);
}
- end += 7;
- *end = 0;
NetMessage msg;
- msg.parse(recv_buffer, bytes);
+ msg.parse(pbuff, bytes);
if(msg.exists(NMString("error"))) {
char errmsg[256];
- if(msg.get_string("errmsg", errmsg, 256))
+ if(msg.get_string("errmsg", errmsg, 256)) {
PUShowMessage(errmsg, SM_WARNING);
+ int code = msg.get_int("Code");
+ if(code == 0) ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_OTHERLOCATION);
+ if(code == 259) ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_BADUSERID);
+ if(code == 260) ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_WRONGPASSWORD);
+ }
} else if(msg.get_int("lc") == 1) {
QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat++);
try_login(msg, server_connection);
@@ -342,7 +380,7 @@ void __cdecl ServerThreadFunc(void*) {
HANDLE hContact = FindContact(uid);
if(!hContact) {
hContact = CreateContact(uid, 0, 0);
- // lookup user?
+ LookupUID(uid);
}
char smsg[1024];
if(msg.get_string("msg", smsg, 1024)) {
@@ -355,6 +393,7 @@ void __cdecl ServerThreadFunc(void*) {
HANDLE hContact = FindContact(uid);
if(!hContact) {
hContact = CreateContact(uid, 0, 0);
+ LookupUID(uid);
}
char text[MAX_MESSAGE_SIZE];
if(msg.get_string("msg", text, MAX_MESSAGE_SIZE)) {
@@ -378,8 +417,8 @@ void __cdecl ServerThreadFunc(void*) {
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);
+ //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];
@@ -406,6 +445,7 @@ void __cdecl ServerThreadFunc(void*) {
if(body.get_string("ErrorMessage", errmsg, 256)) {
PUShowMessage(errmsg, SM_WARNING);
ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0);
+ ProtoBroadcastAck(MODULE, 0, ACKTYPE_GETINFO, ACKRESULT_FAILED, (HANDLE)0, 0);
} else {
char email[256], nick[256];
int uid = body.get_int("UserID");
@@ -421,7 +461,15 @@ void __cdecl ServerThreadFunc(void*) {
mpsr.psr.email = email;
mpsr.uid = uid;
+ HANDLE hContact = FindContact(uid);
+ if(hContact) {
+ if(mpsr.psr.nick) DBWriteContactSettingStringUtf(hContact, MODULE, "Nick", mpsr.psr.nick);
+ if(mpsr.psr.email) DBWriteContactSettingStringUtf(hContact, MODULE, "email", mpsr.psr.nick);
+ ProtoBroadcastAck(MODULE, hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE)1, 0);
+ }
+
ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)req, (LPARAM)&mpsr);
+
}
ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0);
}
@@ -452,7 +500,7 @@ void __cdecl ServerThreadFunc(void*) {
}
}
}
- pbuff = end + 1;
+ pbuff = end;
}
}
}