1/* EndpointInfo.cpp
2 * ----------------
3 * Implements the EndpointInfo object.
4 *
5 * Copyright 2013, Haiku, Inc. All rights reserved.
6 * Distributed under the terms of the MIT License.
7 *
8 * Revisions by Pete Goodeve
9 *
10 * Copyright 1999, Be Incorporated.   All Rights Reserved.
11 * This file may be used under the terms of the Be Sample Code License.
12 */
13#include "EndpointInfo.h"
14
15#include <Bitmap.h>
16#include <Debug.h>
17#include <IconUtils.h>
18#include <Message.h>
19#include <MidiRoster.h>
20#include <MidiEndpoint.h>
21
22const char* LARGE_ICON_NAME = "be:large_icon";
23const char* MINI_ICON_NAME = "be:mini_icon";
24const char* VECTOR_ICON_NAME = "icon";
25const uint32 LARGE_ICON_TYPE = 'ICON';
26const uint32 MINI_ICON_TYPE = 'MICN';
27const uint32 VECTOR_ICON_TYPE = 'VICN';
28extern const uint8 LARGE_ICON_SIZE = 32;
29extern const uint8 MINI_ICON_SIZE = 16;
30extern const icon_size DISPLAY_ICON_SIZE = B_LARGE_ICON;
31extern const color_space ICON_COLOR_SPACE = B_CMAP8;
32
33static BBitmap* CreateIcon(const BMessage* msg, icon_size which);
34
35
36EndpointInfo::EndpointInfo()
37	:
38	fId(-1),
39	fIcon(NULL)
40{}
41
42
43EndpointInfo::EndpointInfo(int32 id)
44	:
45	fId(id),
46	fIcon(NULL)
47{
48	BMidiRoster* roster = BMidiRoster::MidiRoster();
49	if (roster != NULL) {
50		BMidiEndpoint* endpoint = roster->FindEndpoint(id);
51		if (endpoint != NULL) {
52			printf("endpoint %" B_PRId32 " = %p\n", id, endpoint);
53			BMessage msg;
54			if (endpoint->GetProperties(&msg) == B_OK) {
55				fIcon = CreateIcon(&msg, DISPLAY_ICON_SIZE);
56			}
57			endpoint->Release();
58		}
59	}
60}
61
62
63EndpointInfo::EndpointInfo(const EndpointInfo& info)
64	:
65	fId(info.fId)
66{
67	fIcon = (info.fIcon) ? new BBitmap(info.fIcon) : NULL;
68}
69
70
71EndpointInfo&
72EndpointInfo::operator=(const EndpointInfo& info)
73{
74	if (&info != this) {
75		fId = info.fId;
76		delete fIcon;
77		fIcon = (info.fIcon) ? new BBitmap(info.fIcon) : NULL;
78	}
79	return *this;
80}
81
82
83EndpointInfo::~EndpointInfo()
84{
85	delete fIcon;
86}
87
88
89void
90EndpointInfo::UpdateProperties(const BMessage* props)
91{
92	delete fIcon;
93	fIcon = CreateIcon(props, DISPLAY_ICON_SIZE);
94}
95
96
97static BBitmap*
98CreateIcon(const BMessage* msg, icon_size which)
99{
100
101	const void* data;
102	ssize_t size;
103	BBitmap* bitmap = NULL;
104
105	// See if a Haiku Vector Icon available
106	if (msg->FindData(VECTOR_ICON_NAME, VECTOR_ICON_TYPE, &data,
107		&size) == B_OK)  {
108		BRect r(0, 0, LARGE_ICON_SIZE - 1, LARGE_ICON_SIZE - 1);
109		bitmap = new BBitmap(r, B_RGBA32);
110		if (BIconUtils::GetVectorIcon((const uint8*)data, size,
111			bitmap) == B_OK) {
112			printf("Created vector icon bitmap\n");
113			return bitmap;
114		} else {
115			delete bitmap;
116			bitmap = NULL;
117		}
118	}
119
120	// If not, look for BeOS style icon
121	float bmapSize;
122	uint32 iconType;
123	const char* iconName;
124
125	if (which == B_LARGE_ICON) {
126		bmapSize = LARGE_ICON_SIZE - 1;
127		iconType = LARGE_ICON_TYPE;
128		iconName = LARGE_ICON_NAME;
129	} else if (which == B_MINI_ICON) {
130		bmapSize = MINI_ICON_SIZE - 1;
131		iconType = MINI_ICON_TYPE;
132		iconName = MINI_ICON_NAME;
133	} else
134		return NULL;
135
136	if (msg->FindData(iconName, iconType, &data, &size) == B_OK) {
137		bitmap = new BBitmap(BRect(0, 0, bmapSize, bmapSize),
138			ICON_COLOR_SPACE);
139		ASSERT((bitmap->BitsLength() == size));
140		memcpy(bitmap->Bits(), data, size);
141	}
142	return bitmap;
143}
144