int baseapp::update_device(uint dev, uint cpy, int state, app_connection*n){ if (state == em_offline){ std::map<uint, app_connection*>::iterator it = m_devmap.find(dev); if(it != m_devmap.end()){ server_info * s1 = (server_info*)it->second->get_context(); server_info * s2 = (server_info*)n->get_context(); //fixed bug if(s1->get_id() == s2->get_id()){ m_devmap.erase(it); } else{ log_out(log_warn, "update_device::from different server\n"); } } } else{ m_devmap[dev] = n; } ipaddr& peeraddr = n->get_peeraddr(); log_out(log_debug, "update_device::appid(%d) device(%u) company(%u) state(%u) count(%d) from(%s)\n", get_appid(), dev, cpy, state, m_devmap.size(), peeraddr.ip); return 0; }
int svrapp::cnt_disconnect(app_connection *n, int reason){ realplay_info * rpif = (realplay_info*)n->get_context(); m_cntmap.erase(rpif->get_id()); log_out(log_error, "cnt_disconnect::realplay(%08X) appid(%u)\n", rpif->get_id(), get_appid()); handle_stop_realplay(rpif, "88"); delete rpif; return 0; }
/* { "cmd":"realpaly_start_notify", "data":{ "token":"1234" } } */ int svrapp::dev_realplay_start_notify(param_list * pl){ log_out(log_debug, "dev_realplay_start_notify::appid(%u) %s\n", get_appid(), pl->content); //reset stream context; stream_info * stmif = (stream_info*)pl->n->get_context(); uint64 key64 = stmif->get_key64(); delete stmif; pl->n->set_context(NULL); std::map<uint64, stream_info*>::iterator it = m_realplaymap.find(key64); if(it == m_realplaymap.end()){ log_out(log_error, "dev_realplay_start_notify::no stream_info appid(%u) stmkey(%llX)\n", get_appid(), key64); return -1; } pl->n->set_context(it->second); it->second->start_all(); log_out(log_debug, "dev_realplay_start_notify::ok, starting\n"); return 0; }
Array Steam::get_recent_players() { if ( SteamFriends() == NULL ) { return Array(); } Array uList; int list_size = SteamFriends()->GetCoplayFriendCount(); for(int i=0;i<list_size;i++) { CSteamID uSteamID = SteamFriends()->GetCoplayFriend(i); if ( SteamFriends()->GetFriendCoplayGame(uSteamID) == get_appid() ) // played the same game { Ref<_SteamUser> nextUser = memnew( _SteamUser(uSteamID) ); uList.push_back(nextUser); } } return uList; }
void get_derived_permission(struct dentry *parent, struct dentry *dentry) { struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); struct sdcardfs_inode_info *info = SDCARDFS_I(dentry->d_inode); struct sdcardfs_inode_info *parent_info= SDCARDFS_I(parent->d_inode); appid_t appid; /* By default, each inode inherits from its parent. * the properties are maintained on its private fields * because the inode attributes will be modified with that of * its lower inode. * The derived state will be updated on the last * stage of each system call by fix_derived_permission(inode). */ inherit_derived_state(parent->d_inode, dentry->d_inode); /* Derive custom permissions based on parent and current node */ switch (parent_info->perm) { case PERM_INHERIT: /* Already inherited above */ break; case PERM_PRE_ROOT: /* Legacy internal layout places users at top level */ info->perm = PERM_ROOT; info->userid = simple_strtoul(dentry->d_name.name, NULL, 10); if (sbi->options.sdfs_gid == AID_SDCARD_RW) info->d_gid = sbi->options.sdfs_gid; else info->d_gid = multiuser_get_uid(info->userid, sbi->options.sdfs_gid); break; case PERM_ROOT: /* Assume masked off by default. */ if (!strcasecmp(dentry->d_name.name, "Android")) { /* App-specific directories inside; let anyone traverse */ info->perm = PERM_ANDROID; info->d_under_android = true; } break; case PERM_ANDROID: if (!strcasecmp(dentry->d_name.name, "data")) { /* App-specific directories inside; let anyone traverse */ info->perm = PERM_ANDROID_DATA; } else if (!strcasecmp(dentry->d_name.name, "obb")) { /* App-specific directories inside; let anyone traverse */ info->perm = PERM_ANDROID_OBB; // FIXME : this feature will be implemented later. /* Single OBB directory is always shared */ // ex. Fuse daemon.. // node->graft_path = fuse->obb_path; // node->graft_pathlen = strlen(fuse->obb_path); } else if (!strcasecmp(dentry->d_name.name, "media")) { /* App-specific directories inside; let anyone traverse */ info->perm = PERM_ANDROID_MEDIA; } break; /* same policy will be applied on PERM_ANDROID_DATA * and PERM_ANDROID_OBB */ case PERM_ANDROID_DATA: case PERM_ANDROID_OBB: case PERM_ANDROID_MEDIA: appid = get_appid(sbi->pkgl_id, dentry->d_name.name); if (appid != 0) { info->d_uid = multiuser_get_uid(parent_info->userid, appid); } break; } }
/* { "serial":"", "cmd":"start_realpaly_req", "data":{ "token":"", "channel":0, "sub_channel":0, } }*/ int svrapp::start_realplay_reqx(param_list * pl){ realplay_info * rpif = (realplay_info*)pl->n->get_context(); if(!rpif){ post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_NO_SUPPORT, "try again"); log_out(log_error, "start_realplay_reqx::unknow error\n"); return -1; } if(rpif->is_playing()){ rpif->post_ack(pl->ack_cmd, pl->serial, ERROR_NO_SUPPORT, "is playing"); log_out(log_error, "start_realplay_reqx::is playing\n"); return -1; } stream_key * stmkey = rpif->get_stream_key(); uint64 key64 = rpif->get_key64(); //find dev std::map<uint, app_connection*>::iterator it = m_devmap.find(stmkey->device_id); if(it == m_devmap.end()){ log_out(log_error, "start_realpaly_req::device(%u) off line\n", stmkey->device_id); rpif->post_ack(pl->ack_cmd, pl->serial, ERROR_DEV_OFFLINE, "device is offline"); return -1; } std::map<uint, app_connection*>::iterator it1 = m_cntmap.find(rpif->get_id()); if(it1 == m_cntmap.end() ){ m_cntmap[rpif->get_id()] = pl->n; } //判断是否已经在播放 std::map<uint64, stream_info*>::iterator it0 = m_realplaymap.find(key64); if(it0 != m_realplaymap.end()){ stream_info * stmif = it0->second; stmif->add(rpif->get_id(), pl->n); rpif->reset_resource(); rpif->set_playing(); rpif->post_ack(pl->ack_cmd, pl->serial, ERROR_OK, "ok"); log_out(log_debug, "start_realpaly_req::appid(%d) stream(%llX) already playing, clients(%u)\n", get_appid(), key64, stmif->client_number()); return 0; } else{ stream_info * stmif = new stream_info(stm_type, stmkey); m_realplaymap[key64] = stmif; stmif->add(rpif->get_id(), pl->n); } rpif->reset_resource(); rpif->set_playing(); ///add realplay server char serverAddr[64] = {0}; sprintf(serverAddr, "%s:%d",g_sdr->self_ipaddr.ip, g_sdr->self_ipaddr.port); cJSON_AddStringToObject(pl->jsdata, "server", serverAddr); cJSON_AddStringToObject(pl->jsdata, "transport_protocol", "tcp"); //generate token char token[128] = {0}; sprintf(token, "%08X%04X%04X", stmkey->device_id, stmkey->chn, stmkey->sub_chn); cJSON_DeleteItemFromObject(pl->jsdata, "token"); cJSON_AddStringToObject(pl->jsdata, "token", token); //send request to mgr char new_serial[128] = {0}; create_serial(rpif->get_id(), pl->serial, new_serial, sizeof(new_serial)); char * out = cJSON_PrintUnformatted(pl->jsdata); log_out(log_debug, "start_realpaly_req::appid(%d) %s\n",get_appid(), out); app_connection * dn = it->second; post_req(dn, pl->cmd, out, new_serial); free(out); return 0; }