// Copyright (c) 2014- PPSSPP Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, version 2.0 or later versions. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License 2.0 for more details. // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. // proAdhocServer // This is a direct port of Coldbird's code from http://code.google.com/p/aemu/ // All credit goes to him! #pragma once #include #include #include "proAdhoc.h" /*#ifdef _MSC_VER #define PACK #undef errno #define errno WSAGetLastError() #else #define INVALID_SOCKET -1 #define SOCKET_ERROR -1 #define closesocket close #define PACK __attribute__((packed)) #endif*/ // Server Listening Port //#define SERVER_PORT 27312 // Listener Connection Backlog (aka. Max Concurrent Logins) #define SERVER_LISTEN_BACKLOG 128 // Server User Maximum #define SERVER_USER_MAXIMUM 1024 // Server User Timeout (in seconds) #define SERVER_USER_TIMEOUT 15 // Server SQLite3 Database #define SERVER_DATABASE "database.db" // Server Status Logfile #define SERVER_STATUS_XMLOUT "www/status.xml" // Server Shutdown Message #define SERVER_SHUTDOWN_MESSAGE "PROMETHEUS HUB IS SHUTTING DOWN!" typedef struct db_crosslink{ char id_from[PRODUCT_CODE_LENGTH + 1]; //SceNetAdhocctlProductCode id_from; char id_to[PRODUCT_CODE_LENGTH + 1]; //SceNetAdhocctlProductCode id_to; } db_crosslink; typedef struct db_productid { char id[PRODUCT_CODE_LENGTH + 1]; //SceNetAdhocctlProductCode id; char name[ADHOCCTL_NICKNAME_LEN]; //Title name } db_productid; /* PSPSTRUCTS */ // Ethernet Address (MAC) /*#define ETHER_ADDR_LEN 6 typedef struct SceNetEtherAddr { uint8_t data[ETHER_ADDR_LEN]; } SceNetEtherAddr; // Adhoc Virtual Network Name (1234ABCD) #define ADHOCCTL_GROUPNAME_LEN 8 typedef struct SceNetAdhocctlGroupName { uint8_t data[ADHOCCTL_GROUPNAME_LEN]; } SceNetAdhocctlGroupName; // Player Nickname #define ADHOCCTL_NICKNAME_LEN 128 typedef struct SceNetAdhocctlNickname { uint8_t data[ADHOCCTL_NICKNAME_LEN]; } SceNetAdhocctlNickname;*/ /* PACKETS */ /*#define OPCODE_PING 0 #define OPCODE_LOGIN 1 #define OPCODE_CONNECT 2 #define OPCODE_DISCONNECT 3 #define OPCODE_SCAN 4 #define OPCODE_SCAN_COMPLETE 5 #define OPCODE_CONNECT_BSSID 6 #define OPCODE_CHAT 7 // PSP Product Code #define PRODUCT_CODE_LENGTH 9 typedef struct { // Game Product Code (ex. ULUS12345) char data[PRODUCT_CODE_LENGTH]; } PACK SceNetAdhocctlProductCode; // __attribute__((packed)) // Basic Packet typedef struct { uint8_t opcode; } PACK SceNetAdhocctlPacketBase; // C2S Login Packet typedef struct { SceNetAdhocctlPacketBase base; SceNetEtherAddr mac; SceNetAdhocctlNickname name; SceNetAdhocctlProductCode game; } PACK SceNetAdhocctlLoginPacketC2S; // C2S Connect Packet typedef struct { SceNetAdhocctlPacketBase base; SceNetAdhocctlGroupName group; } PACK SceNetAdhocctlConnectPacketC2S; // C2S Chat Packet typedef struct { SceNetAdhocctlPacketBase base; char message[64]; } PACK SceNetAdhocctlChatPacketC2S; // S2C Connect Packet typedef struct { SceNetAdhocctlPacketBase base; SceNetAdhocctlNickname name; SceNetEtherAddr mac; uint32_t ip; } PACK SceNetAdhocctlConnectPacketS2C; // S2C Disconnect Packet typedef struct { SceNetAdhocctlPacketBase base; uint32_t ip; } PACK SceNetAdhocctlDisconnectPacketS2C; // S2C Scan Packet typedef struct { SceNetAdhocctlPacketBase base; SceNetAdhocctlGroupName group; SceNetEtherAddr mac; } PACK SceNetAdhocctlScanPacketS2C; // S2C Connect BSSID Packet typedef struct { SceNetAdhocctlPacketBase base; SceNetEtherAddr mac; } PACK SceNetAdhocctlConnectBSSIDPacketS2C; // S2C Chat Packet typedef struct { SceNetAdhocctlChatPacketC2S base; SceNetAdhocctlNickname name; } PACK SceNetAdhocctlChatPacketS2C;*/ /* USER */ // User States #define USER_STATE_WAITING 0 #define USER_STATE_LOGGED_IN 1 #define USER_STATE_TIMED_OUT 2 // PSP Resolver Information typedef struct { // PSP MAC Address SceNetEtherAddr mac; // PSP Hotspot IP Address uint32_t ip; // PSP Player Name SceNetAdhocctlNickname name; } SceNetAdhocctlResolverInfo; // Type Prototypes typedef struct SceNetAdhocctlGameNode SceNetAdhocctlGameNode; typedef struct SceNetAdhocctlGroupNode SceNetAdhocctlGroupNode; // Double-Linked User List typedef struct SceNetAdhocctlUserNode { // Next Element struct SceNetAdhocctlUserNode * next; // Previous Element struct SceNetAdhocctlUserNode * prev; // Next Element (Group) struct SceNetAdhocctlUserNode * group_next; // Previous Element struct SceNetAdhocctlUserNode * group_prev; // Resolver Information SceNetAdhocctlResolverInfo resolver; // Game Link SceNetAdhocctlGameNode * game; // Group Link SceNetAdhocctlGroupNode * group; // TCP Socket int stream; // Last Ping Update time_t last_recv; // RX Buffer uint8_t rx[1024]; uint32_t rxpos; } SceNetAdhocctlUserNode; // Double-Linked Game List struct SceNetAdhocctlGameNode { // Next Element struct SceNetAdhocctlGameNode * next; // Previous Element struct SceNetAdhocctlGameNode * prev; // PSP Game Product Code SceNetAdhocctlProductCode game; // Number of Players uint32_t playercount; // Number of Groups uint32_t groupcount; // Double-Linked Group List SceNetAdhocctlGroupNode * group; }; // Double-Linked Group List struct SceNetAdhocctlGroupNode { // Next Element struct SceNetAdhocctlGroupNode * next; // Previous Element struct SceNetAdhocctlGroupNode * prev; // Game Link SceNetAdhocctlGameNode * game; // PSP Adhoc Group Name SceNetAdhocctlGroupName group; // Number of Players uint32_t playercount; // Double-Linked Player List SceNetAdhocctlUserNode * player; }; // User Count extern uint32_t _db_user_count; // User Database extern SceNetAdhocctlUserNode * _db_user; // Game Database extern SceNetAdhocctlGameNode * _db_game; void __AdhocServerInit(); /** * Login User into Database (Stream) * @param fd Socket * @param ip IP Address (Network Order) */ void login_user_stream(int fd, uint32_t ip); /** * Login User into Database (Login Data) * @param user User Node * @param data Login Packet */ void login_user_data(SceNetAdhocctlUserNode * user, SceNetAdhocctlLoginPacketC2S * data); /** * Logout User from Database * @param user User Node */ void logout_user(SceNetAdhocctlUserNode * user); /** * Free Database Memory */ void free_database(void); /** * Connect User to Game Group * @param user User Node * @param group Group Name */ void connect_user(SceNetAdhocctlUserNode * user, SceNetAdhocctlGroupName * group); /** * Disconnect User from Game Group * @param user User Node */ void disconnect_user(SceNetAdhocctlUserNode * user); /** * Send Game Group List * @param user User Node */ void send_scan_results(SceNetAdhocctlUserNode * user); /** * Spread Chat Message in P2P Network * @param user Sender User Node * @param message Chat Message */ void spread_message(SceNetAdhocctlUserNode *user, const char *message); /** * Get User State * @param user User Node */ int get_user_state(SceNetAdhocctlUserNode * user); /** * Clear RX Buffer * @param user User Node * @param clear Number of Bytes to clear (-1 for all) */ void clear_user_rxbuf(SceNetAdhocctlUserNode * user, int clear); /** * Patch Game Product Code * @param product To-be-patched Product Code * @param from If the Product Code matches this... * @param to ... then change it to this one. */ void game_product_relink(SceNetAdhocctlProductCode * product, char * from, char * to); /** * Game Product Override (used for mixing multi-region games) * @param product IN: Source Product OUT: Override Product */ void game_product_override(SceNetAdhocctlProductCode * product); /* STATUS */ /** * Update Status Logfile */ void update_status(void); /** * Server Entry Point * @param argc Number of Arguments * @param argv Arguments * @return OS Error Code */ int proAdhocServerThread(int port); // (int argc, char * argv[]) //extern int _status; extern bool adhocServerRunning; extern std::thread adhocServerThread;