1/*
2 * Copyright 2002 Marcus Overhagen. All Rights Reserved.
3 * This file may be used under the terms of the MIT License.
4 */
5
6
7/*!	The object returned by BMediaRoster's
8	MakeTimeSourceFor(const media_node& forNode);
9*/
10
11
12#include "TimeSourceObject.h"
13
14#include <stdio.h>
15#include <string.h>
16
17#include <MediaRoster.h>
18#include <OS.h>
19
20#include <MediaMisc.h>
21#include <debug.h>
22
23#include "TimeSourceObjectManager.h"
24
25
26TimeSourceObject::TimeSourceObject(const media_node& node)
27	:
28	BMediaNode("some timesource object", node.node, node.kind),
29	BTimeSource(node.node)
30{
31	TRACE("TimeSourceObject::TimeSourceObject enter, id = %ld\n", node.node);
32	if (fControlPort > 0)
33		delete_port(fControlPort);
34
35	// We use the control port of the real time source object.
36	// this way, all messages are send to the real time source,
37	// and this shadow object won't receive any.
38	fControlPort = node.port;
39
40	ASSERT(fNodeID == node.node);
41	ASSERT(fKinds == node.kind);
42
43	if (node.node == NODE_SYSTEM_TIMESOURCE_ID) {
44		strcpy(fName, "System clock");
45		fIsRealtime = true;
46	} else {
47		live_node_info liveNodeInfo;
48		if (BMediaRoster::Roster()->GetLiveNodeInfo(node, &liveNodeInfo)
49				== B_OK)
50			strlcpy(fName, liveNodeInfo.name, B_MEDIA_NAME_LENGTH);
51		else {
52			snprintf(fName, B_MEDIA_NAME_LENGTH, "timesource %" B_PRId32,
53				node.node);
54		}
55	}
56
57	AddNodeKind(NODE_KIND_SHADOW_TIMESOURCE);
58	AddNodeKind(NODE_KIND_NO_REFCOUNTING);
59
60	TRACE("TimeSourceObject::TimeSourceObject leave, node id %" B_PRId32 "\n",
61		fNodeID);
62}
63
64
65status_t
66TimeSourceObject::TimeSourceOp(const time_source_op_info& op, void* _reserved)
67{
68	// we don't get anything here
69	return B_OK;
70}
71
72
73BMediaAddOn*
74TimeSourceObject::AddOn(int32* _id) const
75{
76	if (_id != NULL)
77		*_id = 0;
78
79	return NULL;
80}
81
82
83status_t
84TimeSourceObject::DeleteHook(BMediaNode* node)
85{
86//	if (fIsRealtime) {
87//		ERROR("TimeSourceObject::DeleteHook: system time source clone delete hook called\n");
88//		return B_ERROR;
89//	}
90	PRINT(1, "TimeSourceObject::DeleteHook enter\n");
91	gTimeSourceObjectManager->ObjectDeleted(this);
92	status_t status = BTimeSource::DeleteHook(node);
93	PRINT(1, "TimeSourceObject::DeleteHook leave\n");
94	return status;
95}
96
97