xref: /haiku/src/kits/locale/TimeUnitFormat.cpp (revision 1345706a9ff6ad0dc041339a02d4259998b0765d)
1 /*
2  * Copyright 2010, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  * 		Adrien Destugues <pulkomandy@gmail.com>
7  *		Oliver Tappe <zooey@hirschkaefer.de>
8  */
9 
10 
11 #include <TimeUnitFormat.h>
12 
13 #include <new>
14 
15 #include <unicode/format.h>
16 #include <unicode/tmutfmt.h>
17 #include <unicode/utypes.h>
18 #include <ICUWrapper.h>
19 
20 
21 // maps our unit element to the corresponding ICU unit
22 static const TimeUnit::UTimeUnitFields skUnitMap[] = {
23 	TimeUnit::UTIMEUNIT_YEAR,
24 	TimeUnit::UTIMEUNIT_MONTH,
25 	TimeUnit::UTIMEUNIT_WEEK,
26 	TimeUnit::UTIMEUNIT_DAY,
27 	TimeUnit::UTIMEUNIT_HOUR,
28 	TimeUnit::UTIMEUNIT_MINUTE,
29 	TimeUnit::UTIMEUNIT_SECOND,
30 };
31 
32 
33 status_t BTimeUnitFormat::Format(int32 value, time_unit_element unit,
34 	BString* buffer, time_unit_style style) const
35 {
36 	if (buffer == NULL || unit < 0 || unit > B_TIME_UNIT_LAST
37 		|| (style != B_TIME_UNIT_ABBREVIATED && style != B_TIME_UNIT_FULL))
38 		return B_BAD_VALUE;
39 
40 	UErrorCode icuStatus = U_ZERO_ERROR;
41 	TimeUnitFormat timeUnitFormatter(icuStatus);
42 
43 	if (!U_SUCCESS(icuStatus))
44 		return B_ERROR;
45 
46 	TimeUnitAmount* timeUnitAmount
47 		= new TimeUnitAmount((double)value, skUnitMap[unit], icuStatus);
48 	if (timeUnitAmount == NULL)
49 		return B_NO_MEMORY;
50 	if (!U_SUCCESS(icuStatus))
51 		return B_ERROR;
52 
53 	Formattable formattable;
54 	formattable.adoptObject(timeUnitAmount);
55 	FieldPosition pos(FieldPosition::DONT_CARE);
56 	UnicodeString unicodeResult;
57 	timeUnitFormatter.format(formattable, unicodeResult, pos, icuStatus);
58 	if (!U_SUCCESS(icuStatus))
59 		return B_ERROR;
60 
61 	BStringByteSink byteSink(buffer);
62 	unicodeResult.toUTF8(byteSink);
63 
64 	return B_OK;
65 }
66