CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Core/HLE/proAdhocServer.h
Views: 1401
// Copyright (c) 2014- PPSSPP Project.12// This program is free software: you can redistribute it and/or modify3// it under the terms of the GNU General Public License as published by4// the Free Software Foundation, version 2.0 or later versions.56// This program is distributed in the hope that it will be useful,7// but WITHOUT ANY WARRANTY; without even the implied warranty of8// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9// GNU General Public License 2.0 for more details.1011// A copy of the GPL 2.0 should have been included with the program.12// If not, see http://www.gnu.org/licenses/1314// Official git repository and contact information can be found at15// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.161718// proAdhocServer1920// This is a direct port of Coldbird's code from http://code.google.com/p/aemu/21// All credit goes to him!2223#pragma once2425#include <cstdint>26#include <time.h>27#include "proAdhoc.h"2829// Server Listening Port30//#define SERVER_PORT 273123132// Listener Connection Backlog (aka. Max Concurrent Logins)33#define SERVER_LISTEN_BACKLOG 1283435// Server User Maximum36#define SERVER_USER_MAXIMUM 10243738// Server User Timeout (in seconds)39#define SERVER_USER_TIMEOUT 154041// Server SQLite3 Database42#define SERVER_DATABASE "database.db"4344// Server Status Logfile45#define SERVER_STATUS_XMLOUT "www/status.xml"4647// Server Shutdown Message48#define SERVER_SHUTDOWN_MESSAGE "ADHOC SERVER HUB IS SHUTTING DOWN!"4950typedef struct db_crosslink{51char id_from[PRODUCT_CODE_LENGTH + 1]; //SceNetAdhocctlProductCode id_from;52char id_to[PRODUCT_CODE_LENGTH + 1]; //SceNetAdhocctlProductCode id_to;53} db_crosslink;5455typedef struct db_productid {56char id[PRODUCT_CODE_LENGTH + 1]; //SceNetAdhocctlProductCode id;57char name[ADHOCCTL_NICKNAME_LEN]; //Title name58} db_productid;5960/* PSPSTRUCTS */6162// Ethernet Address (MAC)63/*#define ETHER_ADDR_LEN 664typedef struct SceNetEtherAddr {65uint8_t data[ETHER_ADDR_LEN];66} SceNetEtherAddr;6768// Adhoc Virtual Network Name (1234ABCD)69#define ADHOCCTL_GROUPNAME_LEN 870typedef struct SceNetAdhocctlGroupName {71uint8_t data[ADHOCCTL_GROUPNAME_LEN];72} SceNetAdhocctlGroupName;7374// Player Nickname75#define ADHOCCTL_NICKNAME_LEN 12876typedef struct SceNetAdhocctlNickname {77uint8_t data[ADHOCCTL_NICKNAME_LEN];78} SceNetAdhocctlNickname;*/7980/* PACKETS */8182/*#define OPCODE_PING 083#define OPCODE_LOGIN 184#define OPCODE_CONNECT 285#define OPCODE_DISCONNECT 386#define OPCODE_SCAN 487#define OPCODE_SCAN_COMPLETE 588#define OPCODE_CONNECT_BSSID 689#define OPCODE_CHAT 79091// PSP Product Code92#define PRODUCT_CODE_LENGTH 993typedef struct94{95// Game Product Code (ex. ULUS12345)96char data[PRODUCT_CODE_LENGTH];97} PACK SceNetAdhocctlProductCode; // __attribute__((packed))9899// Basic Packet100typedef struct101{102uint8_t opcode;103} PACK SceNetAdhocctlPacketBase;104105// C2S Login Packet106typedef struct107{108SceNetAdhocctlPacketBase base;109SceNetEtherAddr mac;110SceNetAdhocctlNickname name;111SceNetAdhocctlProductCode game;112} PACK SceNetAdhocctlLoginPacketC2S;113114// C2S Connect Packet115typedef struct116{117SceNetAdhocctlPacketBase base;118SceNetAdhocctlGroupName group;119} PACK SceNetAdhocctlConnectPacketC2S;120121// C2S Chat Packet122typedef struct123{124SceNetAdhocctlPacketBase base;125char message[64];126} PACK SceNetAdhocctlChatPacketC2S;127128// S2C Connect Packet129typedef struct130{131SceNetAdhocctlPacketBase base;132SceNetAdhocctlNickname name;133SceNetEtherAddr mac;134uint32_t ip;135} PACK SceNetAdhocctlConnectPacketS2C;136137// S2C Disconnect Packet138typedef struct139{140SceNetAdhocctlPacketBase base;141uint32_t ip;142} PACK SceNetAdhocctlDisconnectPacketS2C;143144// S2C Scan Packet145typedef struct146{147SceNetAdhocctlPacketBase base;148SceNetAdhocctlGroupName group;149SceNetEtherAddr mac;150} PACK SceNetAdhocctlScanPacketS2C;151152// S2C Connect BSSID Packet153typedef struct154{155SceNetAdhocctlPacketBase base;156SceNetEtherAddr mac;157} PACK SceNetAdhocctlConnectBSSIDPacketS2C;158159// S2C Chat Packet160typedef struct161{162SceNetAdhocctlChatPacketC2S base;163SceNetAdhocctlNickname name;164} PACK SceNetAdhocctlChatPacketS2C;*/165166/* USER */167168// User States169#define USER_STATE_WAITING 0170#define USER_STATE_LOGGED_IN 1171#define USER_STATE_TIMED_OUT 2172173// PSP Resolver Information174typedef struct175{176// PSP MAC Address177SceNetEtherAddr mac;178179// PSP Hotspot IP Address180uint32_t ip;181182// PSP Player Name183SceNetAdhocctlNickname name;184} SceNetAdhocctlResolverInfo;185186// Type Prototypes187typedef struct SceNetAdhocctlGameNode SceNetAdhocctlGameNode;188typedef struct SceNetAdhocctlGroupNode SceNetAdhocctlGroupNode;189190// Double-Linked User List191typedef struct SceNetAdhocctlUserNode {192// Next Element193struct SceNetAdhocctlUserNode * next;194195// Previous Element196struct SceNetAdhocctlUserNode * prev;197198// Next Element (Group)199struct SceNetAdhocctlUserNode * group_next;200201// Previous Element202struct SceNetAdhocctlUserNode * group_prev;203204// Resolver Information205SceNetAdhocctlResolverInfo resolver;206207// Game Link208SceNetAdhocctlGameNode * game;209210// Group Link211SceNetAdhocctlGroupNode * group;212213// TCP Socket214int stream;215216// Last Ping Update217time_t last_recv;218219// RX Buffer220uint8_t rx[1024];221uint32_t rxpos;222} SceNetAdhocctlUserNode;223224// Double-Linked Game List225struct SceNetAdhocctlGameNode {226// Next Element227struct SceNetAdhocctlGameNode * next;228229// Previous Element230struct SceNetAdhocctlGameNode * prev;231232// PSP Game Product Code233SceNetAdhocctlProductCode game;234235// Number of Players236uint32_t playercount;237238// Number of Groups239uint32_t groupcount;240241// Double-Linked Group List242SceNetAdhocctlGroupNode * group;243};244245// Double-Linked Group List246struct SceNetAdhocctlGroupNode {247// Next Element248struct SceNetAdhocctlGroupNode * next;249250// Previous Element251struct SceNetAdhocctlGroupNode * prev;252253// Game Link254SceNetAdhocctlGameNode * game;255256// PSP Adhoc Group Name257SceNetAdhocctlGroupName group;258259// Number of Players260uint32_t playercount;261262// Double-Linked Player List263SceNetAdhocctlUserNode * player;264};265266// User Count267extern uint32_t _db_user_count;268269// User Database270extern SceNetAdhocctlUserNode * _db_user;271272// Game Database273extern SceNetAdhocctlGameNode * _db_game;274275void __AdhocServerInit();276277/**278* Login User into Database (Stream)279* @param fd Socket280* @param ip IP Address (Network Order)281*/282void login_user_stream(int fd, uint32_t ip);283284/**285* Login User into Database (Login Data)286* @param user User Node287* @param data Login Packet288*/289void login_user_data(SceNetAdhocctlUserNode * user, SceNetAdhocctlLoginPacketC2S * data);290291/**292* Logout User from Database293* @param user User Node294*/295void logout_user(SceNetAdhocctlUserNode * user);296297/**298* Free Database Memory299*/300void free_database();301302/**303* Connect User to Game Group304* @param user User Node305* @param group Group Name306*/307void connect_user(SceNetAdhocctlUserNode * user, SceNetAdhocctlGroupName * group);308309/**310* Disconnect User from Game Group311* @param user User Node312*/313void disconnect_user(SceNetAdhocctlUserNode * user);314315/**316* Send Game Group List317* @param user User Node318*/319void send_scan_results(SceNetAdhocctlUserNode * user);320321/**322* Spread Chat Message in P2P Network323* @param user Sender User Node324* @param message Chat Message325*/326void spread_message(SceNetAdhocctlUserNode *user, const char *message);327328/**329* Get User State330* @param user User Node331*/332int get_user_state(SceNetAdhocctlUserNode * user);333334/**335* Clear RX Buffer336* @param user User Node337* @param clear Number of Bytes to clear (-1 for all)338*/339void clear_user_rxbuf(SceNetAdhocctlUserNode * user, int clear);340341/**342* Patch Game Product Code343* @param product To-be-patched Product Code344* @param from If the Product Code matches this...345* @param to ... then change it to this one.346*/347void game_product_relink(SceNetAdhocctlProductCode * product, char * from, char * to);348349/**350* Game Product Override (used for mixing multi-region games)351* @param product IN: Source Product OUT: Override Product352*/353void game_product_override(SceNetAdhocctlProductCode * product);354355/* STATUS */356357/**358* Update Status Logfile359*/360void update_status();361362/**363* Server Entry Point364* @param argc Number of Arguments365* @param argv Arguments366* @return OS Error Code367*/368int proAdhocServerThread(int port); // (int argc, char * argv[])369370//extern int _status;371extern std::atomic<bool> adhocServerRunning;372extern std::thread adhocServerThread;373374375