1//------------------------------------------------------------------------------
2//	MessageRefItemTest.h
3//
4//------------------------------------------------------------------------------
5
6#ifndef MESSAGEREFITEMTEST_H
7#define MESSAGEREFITEMTEST_H
8
9// Standard Includes -----------------------------------------------------------
10
11// System Includes -------------------------------------------------------------
12#include <Entry.h>
13#include <Path.h>
14
15// Project Includes ------------------------------------------------------------
16
17// Local Includes --------------------------------------------------------------
18
19// Local Defines ---------------------------------------------------------------
20
21// Globals ---------------------------------------------------------------------
22
23struct TRefFuncPolicy
24{
25	static status_t Add(BMessage& msg, const char* name, entry_ref& val)
26	{
27		return msg.AddRef(name, &val);
28	}
29	static status_t AddData(BMessage& msg, const char* name, type_code type,
30							entry_ref* data, ssize_t size, bool);
31	static status_t Find(BMessage& msg, const char* name, int32 index,
32						 entry_ref* val)
33	{
34		return msg.FindRef(name, index, val);
35	}
36	static status_t ShortFind(BMessage& msg, const char* name, entry_ref* val)
37	{
38		return msg.FindRef(name, val);
39	}
40	static entry_ref QuickFind(BMessage& msg, const char* name, int32 index);
41	static bool Has(BMessage& msg, const char* name, int32 index)
42	{
43		return msg.HasRef(name, index);
44	}
45	static status_t Replace(BMessage& msg, const char* name, int32 index,
46							entry_ref& val)
47	{
48		return msg.ReplaceRef(name, index, &val);
49	}
50	static status_t FindData(BMessage& msg, const char* name, type_code type,
51							 int32 index, const void** data, ssize_t* size);
52
53	private:
54		static entry_ref sRef;
55};
56status_t TRefFuncPolicy::AddData(BMessage& msg, const char* name, type_code type,
57								 entry_ref* data, ssize_t size, bool)
58{
59	BPath Path(data);
60	status_t err = Path.InitCheck();
61	char* buf = NULL;
62//	if (!err)
63	{
64		buf = new char[size];
65		err = Path.Flatten(buf, size);
66	}
67
68	if (!err)
69	{
70		err = msg.AddData(name, type, buf, size, false);
71	}
72	delete[] buf;
73	return err;
74}
75
76entry_ref TRefFuncPolicy::QuickFind(BMessage &msg, const char *name, int32 index)
77{
78	//	TODO: make cooler
79	//	There must be some 1337 template voodoo way of making the inclusion
80	//	of this function conditional.  In the meantime, we offer this
81	//	cheesy hack
82	entry_ref ref;
83	msg.FindRef(name, index, &ref);
84	return ref;
85}
86
87status_t TRefFuncPolicy::FindData(BMessage& msg, const char* name,
88										 type_code type, int32 index,
89										 const void** data, ssize_t* size)
90{
91	*data = NULL;
92	char* ptr;
93	status_t err = msg.FindData(name, type, index, (const void**)&ptr, size);
94	if (!err)
95	{
96		BPath Path;
97		err = Path.Unflatten(type, ptr, *size);
98		if (!err)
99		{
100			if (Path.Path())
101			{
102				err = get_ref_for_path(Path.Path(), &sRef);
103				if (!err)
104				{
105					*(entry_ref**)data = &sRef;
106				}
107			}
108			else
109			{
110				sRef = entry_ref();
111				*(entry_ref**)data = &sRef;
112			}
113		}
114	}
115	return err;
116}
117entry_ref TRefFuncPolicy::sRef;
118//------------------------------------------------------------------------------
119struct TRefInitPolicy : public ArrayTypeBase<entry_ref>
120{
121	inline static entry_ref Zero()	{ return entry_ref(); }
122	static entry_ref Test1()
123	{
124		entry_ref ref;
125		get_ref_for_path("/boot/beos/apps/camera", &ref);
126		return ref;
127	}
128	static entry_ref Test2()
129	{
130		entry_ref ref;
131		get_ref_for_path("/boot/develop/headers/be/Be.h", &ref);
132		return ref;
133	}
134	static size_t SizeOf(const entry_ref& data)
135	{
136		BPath Path(&data);
137		return Path.FlattenedSize();
138	}
139	inline static ArrayType Array()
140	{
141		ArrayType array;
142		array.push_back(Zero());
143		array.push_back(Test1());
144		array.push_back(Test2());
145		return array;
146	}
147};
148//------------------------------------------------------------------------------
149struct TRefAssertPolicy
150{
151	inline static entry_ref Zero()		{ return TRefInitPolicy::Zero(); }
152	inline static entry_ref Invalid()	{ return TRefInitPolicy::Zero();}
153// TODO: fix
154	static bool		Size(size_t size, entry_ref& ref)
155	{
156		return size == TRefInitPolicy::SizeOf(ref);
157	}
158};
159//------------------------------------------------------------------------------
160typedef TMessageItemTest
161<
162	entry_ref,
163	B_REF_TYPE,
164	TRefFuncPolicy,
165	TRefInitPolicy,
166	TRefAssertPolicy
167>
168TMessageRefItemTest;
169
170#endif	// MESSAGEREFITEMTEST_H
171
172/*
173 * $Log $
174 *
175 * $Id  $
176 *
177 */
178
179