diff options
author | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-06-30 17:01:14 +0000 |
---|---|---|
committer | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-06-30 17:01:14 +0000 |
commit | b373944e48f169123847cfb4427a33d53a761fe3 (patch) | |
tree | 0c49b33476eb877b329937b77684ff318e17ff09 | |
parent | ad621c29997aff0bda961718de44f536d13213cf (diff) |
fix packet reading a bit (i think)
add login acks for login errors
git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@224 4f64403b-2f21-0410-a795-97e2b3489a10
-rw-r--r-- | MySpace/proto.cpp | 6 | ||||
-rw-r--r-- | MySpace/server_con.cpp | 72 | ||||
-rw-r--r-- | MySpace/server_con.h | 1 |
3 files changed, 67 insertions, 12 deletions
diff --git a/MySpace/proto.cpp b/MySpace/proto.cpp index 91fd26a..0b6cf6d 100644 --- a/MySpace/proto.cpp +++ b/MySpace/proto.cpp @@ -67,6 +67,12 @@ int LoadIcon(WPARAM wParam,LPARAM lParam) { }
int GetInfo(WPARAM wParam,LPARAM lParam) {
+ CCSDATA *ccs = ( CCSDATA* )lParam;
+ int uid;
+ if((uid = DBGetContactSettingDword(ccs->hContact, MODULE, "UID", 0)) == 0)
+ return 1; // fail
+
+ LookupUID(uid);
return 0;
}
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;
}
}
}
diff --git a/MySpace/server_con.h b/MySpace/server_con.h index bbc0566..e6856b6 100644 --- a/MySpace/server_con.h +++ b/MySpace/server_con.h @@ -14,6 +14,7 @@ void SetServerStatus(int st); HANDLE FindContact(int uid);
HANDLE CreateContact(int uid, char *nick, char *email);
+int LookupUID(int uid);
void SendMessage(ClientNetMessage &msg);
|