Checkpoint.
Started adding support for persistent default nodes. System time source and BTimeSource are broken. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2306 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002, Marcus Overhagen. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#include <OS.h>
|
||||||
|
#include <MediaNode.h>
|
||||||
|
#include "DefaultManager.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
/* no locking used in this file, we assume that the caller (NodeManager) does it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
DefaultManager::DefaultManager()
|
||||||
|
: fSystemTimeSource(-1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultManager::~DefaultManager()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DefaultManager::LoadState()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DefaultManager::SaveState()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DefaultManager::Set(node_type type, const media_node *node, const dormant_node_info *info, const media_input *input)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case VIDEO_INPUT:
|
||||||
|
case AUDIO_INPUT:
|
||||||
|
case VIDEO_OUTPUT:
|
||||||
|
case AUDIO_MIXER:
|
||||||
|
case AUDIO_OUTPUT:
|
||||||
|
case AUDIO_OUTPUT_EX:
|
||||||
|
case TIME_SOURCE:
|
||||||
|
return B_OK;
|
||||||
|
|
||||||
|
case SYSTEM_TIME_SOURCE: //called by the media_server's ServerApp::StartSystemTimeSource()
|
||||||
|
{
|
||||||
|
ASSERT(fSystemTimeSource == -1);
|
||||||
|
ASSERT(node != 0);
|
||||||
|
fSystemTimeSource = node->node;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
FATAL("DefaultManager::Set Error: called with unknown type %d\n", type);
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DefaultManager::Get(media_node_id *nodeid, char *input_name, int32 *input_id, node_type type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case VIDEO_INPUT:
|
||||||
|
case AUDIO_INPUT:
|
||||||
|
case VIDEO_OUTPUT:
|
||||||
|
case AUDIO_MIXER:
|
||||||
|
case AUDIO_OUTPUT:
|
||||||
|
case AUDIO_OUTPUT_EX:
|
||||||
|
case TIME_SOURCE:
|
||||||
|
*nodeid = -1;
|
||||||
|
return B_OK;
|
||||||
|
|
||||||
|
case SYSTEM_TIME_SOURCE:
|
||||||
|
*nodeid = fSystemTimeSource;
|
||||||
|
return B_OK;
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
FATAL("DefaultManager::Get Error: called with unknown type %d\n", type);
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t
|
||||||
|
DefaultManager::Rescan()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DefaultManager::Dump()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DefaultManager::CleanupTeam(team_id team)
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002, Marcus Overhagen. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#include "TList.h"
|
||||||
|
#include "TMap.h"
|
||||||
|
#include "TStack.h"
|
||||||
|
#include "DataExchange.h"
|
||||||
|
|
||||||
|
class DefaultManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DefaultManager();
|
||||||
|
~DefaultManager();
|
||||||
|
|
||||||
|
status_t LoadState();
|
||||||
|
status_t SaveState();
|
||||||
|
|
||||||
|
status_t Set(node_type type, const media_node *node, const dormant_node_info *info, const media_input *input);
|
||||||
|
status_t Get(media_node_id *nodeid, char *input_name, int32 *input_id, node_type type);
|
||||||
|
status_t Rescan();
|
||||||
|
|
||||||
|
void Dump();
|
||||||
|
|
||||||
|
void CleanupTeam(team_id team);
|
||||||
|
|
||||||
|
private:
|
||||||
|
media_node_id fSystemTimeSource;
|
||||||
|
};
|
||||||
@@ -8,6 +8,7 @@ Server media_server :
|
|||||||
media_server.cpp
|
media_server.cpp
|
||||||
AppManager.cpp
|
AppManager.cpp
|
||||||
BufferManager.cpp
|
BufferManager.cpp
|
||||||
|
DefaultManager.cpp
|
||||||
NodeManager.cpp
|
NodeManager.cpp
|
||||||
NotificationManager.cpp
|
NotificationManager.cpp
|
||||||
Queue.cpp
|
Queue.cpp
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "NodeManager.h"
|
#include "NodeManager.h"
|
||||||
|
|
||||||
|
const char *get_node_type(node_type t);
|
||||||
|
|
||||||
NodeManager::NodeManager() :
|
NodeManager::NodeManager() :
|
||||||
nextaddonid(1),
|
nextaddonid(1),
|
||||||
nextnodeid(1)
|
nextnodeid(1)
|
||||||
@@ -22,6 +24,7 @@ NodeManager::NodeManager() :
|
|||||||
fDormantFlavorList = new List<dormant_flavor_info>;
|
fDormantFlavorList = new List<dormant_flavor_info>;
|
||||||
fAddonPathMap = new Map<media_addon_id, entry_ref>;
|
fAddonPathMap = new Map<media_addon_id, entry_ref>;
|
||||||
fRegisteredNodeMap = new Map<media_node_id, registered_node>;
|
fRegisteredNodeMap = new Map<media_node_id, registered_node>;
|
||||||
|
fDefaultManager = new DefaultManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -31,6 +34,7 @@ NodeManager::~NodeManager()
|
|||||||
delete fDormantFlavorList;
|
delete fDormantFlavorList;
|
||||||
delete fAddonPathMap;
|
delete fAddonPathMap;
|
||||||
delete fRegisteredNodeMap;
|
delete fRegisteredNodeMap;
|
||||||
|
delete fDefaultManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -175,13 +179,38 @@ NodeManager::GetCloneForId(media_node *node, media_node_id nodeid, team_id team)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* This function locates the default "node" for the requested "type" and returnes a clone.
|
||||||
|
* If the requested type is AUDIO_OUTPUT_EX, also "input_name" and "input_id" need to be set and returned,
|
||||||
|
* as this is required by BMediaRoster::GetAudioOutput(media_node *out_node, int32 *out_input_id, BString *out_input_name)
|
||||||
|
*/
|
||||||
status_t
|
status_t
|
||||||
NodeManager::GetClone(media_node *node, char *input_name, int32 *input_id, node_type type, team_id team)
|
NodeManager::GetClone(media_node *node, char *input_name, int32 *input_id, node_type type, team_id team)
|
||||||
{
|
{
|
||||||
BAutolock lock(fLocker);
|
BAutolock lock(fLocker);
|
||||||
FATAL("!!! NodeManager::GetClone not implemented\n");
|
status_t status;
|
||||||
*node = media_node::null;
|
media_node_id id;
|
||||||
return B_ERROR;
|
|
||||||
|
FATAL("NodeManager::GetClone enter: team %ld, type %d (%s)\n", team, type, get_node_type(type));
|
||||||
|
|
||||||
|
status = GetDefaultNode(&id, input_name, input_id, type);
|
||||||
|
if (status != B_OK) {
|
||||||
|
FATAL("NodeManager::GetClone Error: couldn't GetDefaultNode, team %ld, type %d (%s)\n", team, type, get_node_type(type));
|
||||||
|
*node = media_node::null;
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
ASSERT(id > 0);
|
||||||
|
|
||||||
|
status = GetCloneForId(node, id, team);
|
||||||
|
if (status != B_OK) {
|
||||||
|
FATAL("NodeManager::GetClone Error: couldn't GetCloneForId, id %ld, team %ld, type %d (%s)\n", id, team, type, get_node_type(type));
|
||||||
|
*node = media_node::null;
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
ASSERT(id == node->node);
|
||||||
|
|
||||||
|
FATAL("NodeManager::GetClone leave: node id %ld, node port %ld, node kind %Ld\n", node->node, node->port, node->kind);
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -560,11 +589,47 @@ NodeManager::GetDormantFlavorInfoFor(media_addon_id addon,
|
|||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status_t
|
||||||
|
NodeManager::SetDefaultNode(node_type type, const media_node *node, const dormant_node_info *info, const media_input *input)
|
||||||
|
{
|
||||||
|
BAutolock lock(fLocker);
|
||||||
|
return fDefaultManager->Set(type, node, info, input);
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t
|
||||||
|
NodeManager::GetDefaultNode(media_node_id *nodeid, char *input_name, int32 *input_id, node_type type)
|
||||||
|
{
|
||||||
|
BAutolock lock(fLocker);
|
||||||
|
return fDefaultManager->Get(nodeid, input_name, input_id, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t
|
||||||
|
NodeManager::RescanDefaultNodes()
|
||||||
|
{
|
||||||
|
BAutolock lock(fLocker);
|
||||||
|
return fDefaultManager->Rescan();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
NodeManager::CleanupTeam(team_id team)
|
NodeManager::CleanupTeam(team_id team)
|
||||||
{
|
{
|
||||||
BAutolock lock(fLocker);
|
BAutolock lock(fLocker);
|
||||||
FATAL("NodeManager::CleanupTeam: should cleanup team %ld\n", team);
|
FATAL("NodeManager::CleanupTeam: should cleanup team %ld\n", team);
|
||||||
|
fDefaultManager->CleanupTeam(team);
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t
|
||||||
|
NodeManager::LoadState()
|
||||||
|
{
|
||||||
|
BAutolock lock(fLocker);
|
||||||
|
return fDefaultManager->LoadState();
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t
|
||||||
|
NodeManager::SaveState()
|
||||||
|
{
|
||||||
|
BAutolock lock(fLocker);
|
||||||
|
return fDefaultManager->SaveState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -619,4 +684,23 @@ NodeManager::Dump()
|
|||||||
printf(" flavor-info \"%s\"\n", dfi->info);
|
printf(" flavor-info \"%s\"\n", dfi->info);
|
||||||
}
|
}
|
||||||
printf("NodeManager: list end\n");
|
printf("NodeManager: list end\n");
|
||||||
|
fDefaultManager->Dump();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
get_node_type(node_type t)
|
||||||
|
{
|
||||||
|
switch (t) {
|
||||||
|
#define CASE(c) case c: return #c;
|
||||||
|
CASE(VIDEO_INPUT)
|
||||||
|
CASE(AUDIO_INPUT)
|
||||||
|
CASE(VIDEO_OUTPUT)
|
||||||
|
CASE(AUDIO_MIXER)
|
||||||
|
CASE(AUDIO_OUTPUT)
|
||||||
|
CASE(AUDIO_OUTPUT_EX)
|
||||||
|
CASE(TIME_SOURCE)
|
||||||
|
CASE(SYSTEM_TIME_SOURCE)
|
||||||
|
default: "unknown";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "TMap.h"
|
#include "TMap.h"
|
||||||
#include "TStack.h"
|
#include "TStack.h"
|
||||||
#include "DataExchange.h"
|
#include "DataExchange.h"
|
||||||
|
#include "DefaultManager.h"
|
||||||
|
|
||||||
struct registered_node
|
struct registered_node
|
||||||
{
|
{
|
||||||
@@ -47,7 +48,12 @@ public:
|
|||||||
|
|
||||||
void Dump();
|
void Dump();
|
||||||
|
|
||||||
|
/* Management of system wide default nodes */
|
||||||
|
status_t SetDefaultNode(node_type type, const media_node *node, const dormant_node_info *info, const media_input *input);
|
||||||
|
status_t GetDefaultNode(media_node_id *nodeid, char *input_name, int32 *input_id, node_type type);
|
||||||
|
status_t RescanDefaultNodes();
|
||||||
|
|
||||||
|
/* Management of live nodes */
|
||||||
status_t RegisterNode(media_node_id *nodeid, media_addon_id addon_id, int32 addon_flavor_id, const char *name, uint64 kinds, port_id port, team_id team);
|
status_t RegisterNode(media_node_id *nodeid, media_addon_id addon_id, int32 addon_flavor_id, const char *name, uint64 kinds, port_id port, team_id team);
|
||||||
status_t UnregisterNode(media_addon_id *addon_id, media_node_id nodeid, team_id team);
|
status_t UnregisterNode(media_addon_id *addon_id, media_node_id nodeid, team_id team);
|
||||||
status_t GetCloneForId(media_node *node, media_node_id nodeid, team_id team);
|
status_t GetCloneForId(media_node *node, media_node_id nodeid, team_id team);
|
||||||
@@ -96,4 +102,5 @@ private:
|
|||||||
List<dormant_flavor_info> *fDormantFlavorList;
|
List<dormant_flavor_info> *fDormantFlavorList;
|
||||||
Map<media_addon_id,entry_ref> *fAddonPathMap;
|
Map<media_addon_id,entry_ref> *fAddonPathMap;
|
||||||
Map<media_node_id,registered_node> *fRegisteredNodeMap;
|
Map<media_node_id,registered_node> *fRegisteredNodeMap;
|
||||||
|
DefaultManager *fDefaultManager;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -14,6 +14,10 @@
|
|||||||
#include "media_server.h"
|
#include "media_server.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
#include "/boot/home/develop/openbeos/current/src/kits/media/SystemTimeSource.h"
|
||||||
|
#include <MediaRoster.h>
|
||||||
|
#include <MediaNode.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* An implementation of a new media_server for the OpenBeOS MediaKit
|
* An implementation of a new media_server for the OpenBeOS MediaKit
|
||||||
@@ -49,6 +53,7 @@ public:
|
|||||||
void HandleMessage(int32 code, void *data, size_t size);
|
void HandleMessage(int32 code, void *data, size_t size);
|
||||||
void ArgvReceived(int32 argc, char **argv);
|
void ArgvReceived(int32 argc, char **argv);
|
||||||
static int32 controlthread(void *arg);
|
static int32 controlthread(void *arg);
|
||||||
|
void StartSystemTimeSource();
|
||||||
|
|
||||||
/* functionality not yet implemented
|
/* functionality not yet implemented
|
||||||
00014a00 T _ServerApp::_ServerApp(void)
|
00014a00 T _ServerApp::_ServerApp(void)
|
||||||
@@ -85,9 +90,6 @@ ServerApp::ServerApp()
|
|||||||
: BApplication(NEW_MEDIA_SERVER_SIGNATURE),
|
: BApplication(NEW_MEDIA_SERVER_SIGNATURE),
|
||||||
fLocker(new BLocker("media server locker"))
|
fLocker(new BLocker("media server locker"))
|
||||||
{
|
{
|
||||||
//load volume settings from config file
|
|
||||||
//mVolumeLeft = ???;
|
|
||||||
//mVolumeRight = ???;
|
|
||||||
|
|
||||||
gNotificationManager = new NotificationManager;
|
gNotificationManager = new NotificationManager;
|
||||||
gBufferManager = new BufferManager;
|
gBufferManager = new BufferManager;
|
||||||
@@ -98,6 +100,8 @@ ServerApp::ServerApp()
|
|||||||
control_thread = spawn_thread(controlthread, "media_server control", 105, this);
|
control_thread = spawn_thread(controlthread, "media_server control", 105, this);
|
||||||
resume_thread(control_thread);
|
resume_thread(control_thread);
|
||||||
|
|
||||||
|
StartSystemTimeSource();
|
||||||
|
gNodeManager->LoadState();
|
||||||
gAppManager->StartAddonServer();
|
gAppManager->StartAddonServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,16 +143,51 @@ bool
|
|||||||
ServerApp::QuitRequested()
|
ServerApp::QuitRequested()
|
||||||
{
|
{
|
||||||
TRACE("ServerApp::QuitRequested()\n");
|
TRACE("ServerApp::QuitRequested()\n");
|
||||||
|
gNodeManager->SaveState();
|
||||||
gAppManager->TerminateAddonServer();
|
gAppManager->TerminateAddonServer();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ServerApp::StartSystemTimeSource()
|
||||||
|
{
|
||||||
|
printf("StartSystemTimeSource enter\n");
|
||||||
|
media_node node;
|
||||||
|
status_t rv;
|
||||||
|
BTimeSource *source;
|
||||||
|
|
||||||
|
printf("StartSystemTimeSource creating object\n");
|
||||||
|
|
||||||
|
source = new _SysTimeSource;
|
||||||
|
|
||||||
|
printf("StartSystemTimeSource registering\n");
|
||||||
|
|
||||||
|
BMediaRoster::Roster()->RegisterNode(source);
|
||||||
|
|
||||||
|
printf("StartSystemTimeSource getting Node()\n");
|
||||||
|
|
||||||
|
node = source->Node();
|
||||||
|
|
||||||
|
printf("StartSystemTimeSource setting as default\n");
|
||||||
|
|
||||||
|
rv = gNodeManager->SetDefaultNode(SYSTEM_TIME_SOURCE, &node, NULL, NULL);
|
||||||
|
ASSERT(rv == B_OK);
|
||||||
|
|
||||||
|
printf("StartSystemTimeSource leave\n");
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ServerApp::HandleMessage(int32 code, void *data, size_t size)
|
ServerApp::HandleMessage(int32 code, void *data, size_t size)
|
||||||
{
|
{
|
||||||
status_t rv;
|
status_t rv;
|
||||||
INFO("ServerApp::HandleMessage %#lx\n", code);
|
INFO("ServerApp::HandleMessage %#lx\n", code);
|
||||||
switch (code) {
|
switch (code) {
|
||||||
|
case SERVER_RESCAN_DEFAULTS:
|
||||||
|
{
|
||||||
|
gNodeManager->RescanDefaultNodes();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case SERVER_REGISTER_ADDONSERVER:
|
case SERVER_REGISTER_ADDONSERVER:
|
||||||
{
|
{
|
||||||
const server_register_addonserver_request *request = reinterpret_cast<const server_register_addonserver_request *>(data);
|
const server_register_addonserver_request *request = reinterpret_cast<const server_register_addonserver_request *>(data);
|
||||||
@@ -336,9 +375,8 @@ ServerApp::HandleMessage(int32 code, void *data, size_t size)
|
|||||||
{
|
{
|
||||||
const server_set_node_request *request = reinterpret_cast<const server_set_node_request *>(data);
|
const server_set_node_request *request = reinterpret_cast<const server_set_node_request *>(data);
|
||||||
server_set_node_reply reply;
|
server_set_node_reply reply;
|
||||||
// XXX do something here
|
rv = gNodeManager->SetDefaultNode(request->type, request->use_node ? &request->node : NULL, request->use_dni ? &request->dni : NULL, request->use_input ? &request->input : NULL);
|
||||||
debugger("SERVER_SET_NODE seems to be needed\n");
|
request->SendReply(rv, &reply, sizeof(reply));
|
||||||
request->SendReply(B_OK, &reply, sizeof(reply));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,10 +49,12 @@ public:
|
|||||||
ino_t DirNodeUser;
|
ino_t DirNodeUser;
|
||||||
port_id control_port;
|
port_id control_port;
|
||||||
thread_id control_thread;
|
thread_id control_thread;
|
||||||
|
bool fStartup;
|
||||||
};
|
};
|
||||||
|
|
||||||
MediaAddonServer::MediaAddonServer(const char *sig) :
|
MediaAddonServer::MediaAddonServer(const char *sig) :
|
||||||
BApplication(sig)
|
BApplication(sig),
|
||||||
|
fStartup(true)
|
||||||
{
|
{
|
||||||
mediaroster = BMediaRoster::Roster();
|
mediaroster = BMediaRoster::Roster();
|
||||||
filemap = new Map<ino_t, media_addon_id>;
|
filemap = new Map<ino_t, media_addon_id>;
|
||||||
@@ -140,6 +142,8 @@ MediaAddonServer::ReadyToRun()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fStartup = true;
|
||||||
|
|
||||||
// load dormant media nodes
|
// load dormant media nodes
|
||||||
node_ref nref;
|
node_ref nref;
|
||||||
BEntry e("/boot/beos/system/add-ons/media");
|
BEntry e("/boot/beos/system/add-ons/media");
|
||||||
@@ -155,6 +159,11 @@ MediaAddonServer::ReadyToRun()
|
|||||||
e2.GetNodeRef(&nref);
|
e2.GetNodeRef(&nref);
|
||||||
DirNodeUser = nref.node;
|
DirNodeUser = nref.node;
|
||||||
WatchDir(&e2);
|
WatchDir(&e2);
|
||||||
|
|
||||||
|
fStartup = false;
|
||||||
|
|
||||||
|
server_rescan_defaults_command cmd;
|
||||||
|
SendToServer(SERVER_RESCAN_DEFAULTS, &cmd, sizeof(cmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -318,6 +327,12 @@ flavor 0:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (!fStartup) {
|
||||||
|
server_rescan_defaults_command cmd;
|
||||||
|
SendToServer(SERVER_RESCAN_DEFAULTS, &cmd, sizeof(cmd));
|
||||||
|
}
|
||||||
|
|
||||||
_DormantNodeManager->PutAddon(id);
|
_DormantNodeManager->PutAddon(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user