12e5b6d6dSopenharmony_ci// © 2017 and later: Unicode, Inc. and others.
22e5b6d6dSopenharmony_ci// License & terms of use: http://www.unicode.org/copyright.html
32e5b6d6dSopenharmony_ci/*
42e5b6d6dSopenharmony_ci*******************************************************************************
52e5b6d6dSopenharmony_ci*
62e5b6d6dSopenharmony_ci*   Copyright (C) 2009-2012, International Business Machines
72e5b6d6dSopenharmony_ci*   Corporation and others.  All Rights Reserved.
82e5b6d6dSopenharmony_ci*
92e5b6d6dSopenharmony_ci*******************************************************************************
102e5b6d6dSopenharmony_ci*/
112e5b6d6dSopenharmony_ci
122e5b6d6dSopenharmony_ci#ifndef DATE_FE_DEBUG
132e5b6d6dSopenharmony_ci#define DATE_FE_DEBUG 0
142e5b6d6dSopenharmony_ci#endif
152e5b6d6dSopenharmony_ci
162e5b6d6dSopenharmony_ci#include <icuglue/icuglue.h>
172e5b6d6dSopenharmony_ci#include "unicode/udat.h"
182e5b6d6dSopenharmony_ci//#include <unicode/tblcoll.h>
192e5b6d6dSopenharmony_ci#include "unicode/datefmt.h"
202e5b6d6dSopenharmony_ci#include "unicode/smpdtfmt.h"
212e5b6d6dSopenharmony_ci#include <string.h>
222e5b6d6dSopenharmony_ci#include <stdio.h>
232e5b6d6dSopenharmony_ci#include "unicode/ustring.h"
242e5b6d6dSopenharmony_ci#include "unicode/gregocal.h"
252e5b6d6dSopenharmony_ci
262e5b6d6dSopenharmony_ci
272e5b6d6dSopenharmony_ci
282e5b6d6dSopenharmony_ci/**
292e5b6d6dSopenharmony_ci * Macro to define the Collator_glue_4_2 class
302e5b6d6dSopenharmony_ci */
312e5b6d6dSopenharmony_ci#ifdef GLUE_VER
322e5b6d6dSopenharmony_ci#error GLUE_VER is defined
332e5b6d6dSopenharmony_ci#endif
342e5b6d6dSopenharmony_ci
352e5b6d6dSopenharmony_ci#define GLUE_VER(x) class GLUE_SYM_V( DateFormat, x ) : public DateFormat {  \
362e5b6d6dSopenharmony_ci  public:  static DateFormat *create(UDateFormatStyle  timeStyle, \
372e5b6d6dSopenharmony_ci                                                    UDateFormatStyle  dateStyle, \
382e5b6d6dSopenharmony_ci                                                    const char        *locale, \
392e5b6d6dSopenharmony_ci                                                    const UChar       *tzID, \
402e5b6d6dSopenharmony_ci                                                    int32_t           tzIDLength, \
412e5b6d6dSopenharmony_ci                                                    const UChar       *pattern,  \
422e5b6d6dSopenharmony_ci                                                    int32_t           patternLength,  \
432e5b6d6dSopenharmony_ci                                                      UErrorCode        *status, const Locale &loc, const char *ver); \
442e5b6d6dSopenharmony_ci  private: UDateFormat *_this; GLUE_SYM_V( DateFormat, x ) ( UDateFormat* tn ); \
452e5b6d6dSopenharmony_ci    virtual ~ GLUE_SYM_V ( DateFormat, x) ();                             \
462e5b6d6dSopenharmony_ci  public:                                                               \
472e5b6d6dSopenharmony_ci    virtual void* getDynamicClassID() const;                            \
482e5b6d6dSopenharmony_ci    static void* getStaticClassID() ;                                   \
492e5b6d6dSopenharmony_ci    virtual UnicodeString& format(  Calendar& cal, UnicodeString& appendTo, FieldPosition& pos) const; \
502e5b6d6dSopenharmony_ci    virtual void parse( const UnicodeString& text, Calendar& cal, ParsePosition& pos) const; \
512e5b6d6dSopenharmony_ci    virtual Format* clone(void) const; \
522e5b6d6dSopenharmony_ci  public: static int32_t countAvailable();                              \
532e5b6d6dSopenharmony_cipublic: static int32_t appendAvailable(UnicodeString* strs, int32_t i, int32_t count); \
542e5b6d6dSopenharmony_ci  }; \
552e5b6d6dSopenharmony_ci
562e5b6d6dSopenharmony_ci
572e5b6d6dSopenharmony_ci
582e5b6d6dSopenharmony_ci/** ==================================== The following code runs inside the 'target' version (i.e. old ICU) ========== **/
592e5b6d6dSopenharmony_ci#if defined ( ICUGLUE_VER )
602e5b6d6dSopenharmony_ci
612e5b6d6dSopenharmony_ci
622e5b6d6dSopenharmony_ci
632e5b6d6dSopenharmony_ci/* code for some version */
642e5b6d6dSopenharmony_ci#include <icuglue/gluren.h>
652e5b6d6dSopenharmony_ci#include "oicu.h"
662e5b6d6dSopenharmony_ci
672e5b6d6dSopenharmony_ci#ifdef GLUE_VER
682e5b6d6dSopenharmony_ciGLUE_VER( ICUGLUE_VER )
692e5b6d6dSopenharmony_ci#endif
702e5b6d6dSopenharmony_ci
712e5b6d6dSopenharmony_ciGLUE_SYM (DateFormat ) :: GLUE_SYM(DateFormat) ( UDateFormat* tn) :
722e5b6d6dSopenharmony_ci _this(tn)
732e5b6d6dSopenharmony_ci{
742e5b6d6dSopenharmony_ci
752e5b6d6dSopenharmony_ci  UErrorCode status = U_ZERO_ERROR;
762e5b6d6dSopenharmony_ci  adoptCalendar(new GregorianCalendar(status));
772e5b6d6dSopenharmony_ci}
782e5b6d6dSopenharmony_ci
792e5b6d6dSopenharmony_ciGLUE_SYM ( DateFormat ) :: ~ GLUE_SYM(DateFormat) () {
802e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
812e5b6d6dSopenharmony_ci    fprintf(stderr, "VCF " ICUGLUE_VER_STR " udat_close");
822e5b6d6dSopenharmony_ci#endif
832e5b6d6dSopenharmony_ci    OICU_udat_close(_this);
842e5b6d6dSopenharmony_ci}
852e5b6d6dSopenharmony_ci
862e5b6d6dSopenharmony_ciDateFormat *
872e5b6d6dSopenharmony_ciGLUE_SYM ( DateFormat ) :: create(UDateFormatStyle  timeStyle,
882e5b6d6dSopenharmony_ci                                                    UDateFormatStyle  dateStyle,
892e5b6d6dSopenharmony_ci                                                    const char        *locale,
902e5b6d6dSopenharmony_ci                                                    const UChar       *tzID,
912e5b6d6dSopenharmony_ci                                                    int32_t           tzIDLength,
922e5b6d6dSopenharmony_ci                                                    const UChar       *pattern,
932e5b6d6dSopenharmony_ci                                                    int32_t           patternLength,
942e5b6d6dSopenharmony_ci                                                    UErrorCode        *status,
952e5b6d6dSopenharmony_ci                                  const Locale &loc, const char */*ver*/) {
962e5b6d6dSopenharmony_ci  // TODO: save version
972e5b6d6dSopenharmony_ci  //char locBuf[200];
982e5b6d6dSopenharmony_ci  //char kwvBuf[200];
992e5b6d6dSopenharmony_ci  UDateFormat * uc =  OICU_udat_open( timeStyle, dateStyle, locale,
1002e5b6d6dSopenharmony_ci                                      tzID,
1012e5b6d6dSopenharmony_ci                                      tzIDLength,
1022e5b6d6dSopenharmony_ci                                      pattern,
1032e5b6d6dSopenharmony_ci                                      patternLength,
1042e5b6d6dSopenharmony_ci                                      status);
1052e5b6d6dSopenharmony_ci    if(U_FAILURE(*status)) return NULL; // TODO: ERR?
1062e5b6d6dSopenharmony_ci    DateFormat *c =  new GLUE_SYM( DateFormat ) ( uc );
1072e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
1082e5b6d6dSopenharmony_ci    fprintf(stderr, "VCF " ICUGLUE_VER_STR " udat_open=%s ->> %p\n", loc.getName(), (void*)c);
1092e5b6d6dSopenharmony_ci#endif
1102e5b6d6dSopenharmony_ci    return c;
1112e5b6d6dSopenharmony_ci}
1122e5b6d6dSopenharmony_ci
1132e5b6d6dSopenharmony_ciUnicodeString& GLUE_SYM (DateFormat ) :: format(  Calendar& cal, UnicodeString& appendTo, FieldPosition& pos) const
1142e5b6d6dSopenharmony_ci{
1152e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
1162e5b6d6dSopenharmony_ci  fprintf(stderr, "VCF " ICUGLUE_VER_STR " - formatting. \n");
1172e5b6d6dSopenharmony_ci#endif
1182e5b6d6dSopenharmony_ci  int32_t len = appendTo.length();
1192e5b6d6dSopenharmony_ci
1202e5b6d6dSopenharmony_ci  UChar junk[200];
1212e5b6d6dSopenharmony_ci  UErrorCode status = U_ZERO_ERROR;
1222e5b6d6dSopenharmony_ci
1232e5b6d6dSopenharmony_ci  UFieldPosition pos2;
1242e5b6d6dSopenharmony_ci
1252e5b6d6dSopenharmony_ci  int32_t nlen = OICU_udat_format(_this,
1262e5b6d6dSopenharmony_ci                                  cal.getTime(status),
1272e5b6d6dSopenharmony_ci                                  junk,
1282e5b6d6dSopenharmony_ci                                  200,
1292e5b6d6dSopenharmony_ci                                  &pos2,
1302e5b6d6dSopenharmony_ci                                  &status);
1312e5b6d6dSopenharmony_ci
1322e5b6d6dSopenharmony_ci  // todo: use pos2
1332e5b6d6dSopenharmony_ci  pos.setBeginIndex(len);
1342e5b6d6dSopenharmony_ci  pos.setEndIndex(len += nlen);
1352e5b6d6dSopenharmony_ci  appendTo.append(junk, nlen);
1362e5b6d6dSopenharmony_ci
1372e5b6d6dSopenharmony_ci  return appendTo;
1382e5b6d6dSopenharmony_ci}
1392e5b6d6dSopenharmony_ci
1402e5b6d6dSopenharmony_civoid  GLUE_SYM (DateFormat ) :: parse( const UnicodeString& text, Calendar& cal, ParsePosition& pos) const
1412e5b6d6dSopenharmony_ci{
1422e5b6d6dSopenharmony_ci  return;
1432e5b6d6dSopenharmony_ci}
1442e5b6d6dSopenharmony_ci
1452e5b6d6dSopenharmony_ciFormat*  GLUE_SYM (DateFormat ) :: clone(void) const
1462e5b6d6dSopenharmony_ci{
1472e5b6d6dSopenharmony_ci  return NULL;
1482e5b6d6dSopenharmony_ci}
1492e5b6d6dSopenharmony_ci
1502e5b6d6dSopenharmony_ci
1512e5b6d6dSopenharmony_ci
1522e5b6d6dSopenharmony_ci int32_t GLUE_SYM ( DateFormat ) :: countAvailable() {
1532e5b6d6dSopenharmony_ci    int32_t count =  OICU_udat_countAvailable();
1542e5b6d6dSopenharmony_ci    return count;
1552e5b6d6dSopenharmony_ci }
1562e5b6d6dSopenharmony_ci
1572e5b6d6dSopenharmony_ci
1582e5b6d6dSopenharmony_ciint32_t GLUE_SYM ( DateFormat ) :: appendAvailable(UnicodeString* strs, int32_t i, int32_t /*count*/) {
1592e5b6d6dSopenharmony_ci   int avail = OICU_udat_countAvailable();
1602e5b6d6dSopenharmony_ci   UErrorCode status = U_ZERO_ERROR;
1612e5b6d6dSopenharmony_ci   OICU_u_init(&status);
1622e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
1632e5b6d6dSopenharmony_ci   fprintf(stderr,  "VCF " ICUGLUE_VER_STR " avail %d - init %s\n", avail, u_errorName(status));
1642e5b6d6dSopenharmony_ci#endif
1652e5b6d6dSopenharmony_ci    for(int j=0;j<avail;j++) {
1662e5b6d6dSopenharmony_ci         strs[i+j].append(OICU_udat_getAvailable(j));
1672e5b6d6dSopenharmony_ci         strs[i+j].append("@sp=icu");
1682e5b6d6dSopenharmony_ci         strs[i+j].append( ICUGLUE_VER_STR[0] );  // X_y
1692e5b6d6dSopenharmony_ci         strs[i+j].append( ICUGLUE_VER_STR[2] );  // x_Y
1702e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
1712e5b6d6dSopenharmony_ci         {
1722e5b6d6dSopenharmony_ci            char foo[999];
1732e5b6d6dSopenharmony_ci            const UChar *ss = strs[i+j].getTerminatedBuffer();
1742e5b6d6dSopenharmony_ci            u_austrcpy(foo, ss);
1752e5b6d6dSopenharmony_ci            //            fprintf(stderr,  "VCF " ICUGLUE_VER_STR " appending [%d+%d=%d] <<%s>>\n", i, j, i+j, foo);
1762e5b6d6dSopenharmony_ci        }
1772e5b6d6dSopenharmony_ci#endif
1782e5b6d6dSopenharmony_ci    }
1792e5b6d6dSopenharmony_ci    return OICU_ucol_countAvailable();
1802e5b6d6dSopenharmony_ci }
1812e5b6d6dSopenharmony_ci
1822e5b6d6dSopenharmony_ciUOBJECT_DEFINE_RTTI_IMPLEMENTATION( GLUE_SYM( DateFormat ) )
1832e5b6d6dSopenharmony_ci
1842e5b6d6dSopenharmony_ci
1852e5b6d6dSopenharmony_ci
1862e5b6d6dSopenharmony_ci
1872e5b6d6dSopenharmony_ci#else
1882e5b6d6dSopenharmony_ci/** ==================================== The following code runs inside the 'provider' version (i.e. current ICU) ========== **/
1892e5b6d6dSopenharmony_ci
1902e5b6d6dSopenharmony_ci#if (U_ICU_VERSION_MAJOR_NUM < 49)
1912e5b6d6dSopenharmony_ci#define DATE_PROVIDER_UNSUPPORTED
1922e5b6d6dSopenharmony_ci#endif
1932e5b6d6dSopenharmony_ci
1942e5b6d6dSopenharmony_ci#ifndef DATE_PROVIDER_UNSUPPORTED
1952e5b6d6dSopenharmony_ci// define Collator_XX
1962e5b6d6dSopenharmony_ci#include "icuglue/glver.h"
1972e5b6d6dSopenharmony_ci
1982e5b6d6dSopenharmony_ci// generate list of versions
1992e5b6d6dSopenharmony_cistatic
2002e5b6d6dSopenharmony_ci#include <icuglue/fe_verlist.h>
2012e5b6d6dSopenharmony_ci
2022e5b6d6dSopenharmony_ciclass VersionDateFormatFactory : public UObject  {
2032e5b6d6dSopenharmony_cipublic:
2042e5b6d6dSopenharmony_ci  virtual DateFormat *createFormat(UDateFormatStyle  timeStyle,
2052e5b6d6dSopenharmony_ci                                   UDateFormatStyle  dateStyle,
2062e5b6d6dSopenharmony_ci                                   const char        *locale,
2072e5b6d6dSopenharmony_ci                                   const UChar       *tzID,
2082e5b6d6dSopenharmony_ci                                   int32_t           tzIDLength,
2092e5b6d6dSopenharmony_ci                                   const UChar       *pattern,
2102e5b6d6dSopenharmony_ci                                   int32_t           patternLength,
2112e5b6d6dSopenharmony_ci                                   UErrorCode        *status);
2122e5b6d6dSopenharmony_ci  virtual const UnicodeString *getSupportedIDs(int32_t &count, UErrorCode &status);
2132e5b6d6dSopenharmony_ci  virtual void* getDynamicClassID() const;
2142e5b6d6dSopenharmony_ci  static void* getStaticClassID() ;
2152e5b6d6dSopenharmony_ci};
2162e5b6d6dSopenharmony_ci
2172e5b6d6dSopenharmony_ciUOBJECT_DEFINE_RTTI_IMPLEMENTATION( VersionDateFormatFactory )
2182e5b6d6dSopenharmony_ci
2192e5b6d6dSopenharmony_ciDateFormat *VersionDateFormatFactory::createFormat(UDateFormatStyle  timeStyle,
2202e5b6d6dSopenharmony_ci                                                    UDateFormatStyle  dateStyle,
2212e5b6d6dSopenharmony_ci                                                    const char        *locale,
2222e5b6d6dSopenharmony_ci                                                    const UChar       *tzID,
2232e5b6d6dSopenharmony_ci                                                    int32_t           tzIDLength,
2242e5b6d6dSopenharmony_ci                                                    const UChar       *pattern,
2252e5b6d6dSopenharmony_ci                                                    int32_t           patternLength,
2262e5b6d6dSopenharmony_ci                                                       UErrorCode        *status) {
2272e5b6d6dSopenharmony_ci    Locale loc(locale);
2282e5b6d6dSopenharmony_ci    // pull off provider #
2292e5b6d6dSopenharmony_ci    char provider[200];
2302e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
2312e5b6d6dSopenharmony_ci    fprintf(stderr,  "VCF:CC %s\n", loc.getName());
2322e5b6d6dSopenharmony_ci#endif
2332e5b6d6dSopenharmony_ci    int32_t len = loc.getKeywordValue("sp", provider, 200, *status);
2342e5b6d6dSopenharmony_ci    if(U_FAILURE(*status)||len==0) return NULL;
2352e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
2362e5b6d6dSopenharmony_ci    fprintf(stderr,  "VCF:KWV> %s/%d\n", u_errorName(*status), len);
2372e5b6d6dSopenharmony_ci#endif
2382e5b6d6dSopenharmony_ci    provider[len]=0;
2392e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
2402e5b6d6dSopenharmony_ci    fprintf(stderr,  "VCF:KWV %s\n", provider);
2412e5b6d6dSopenharmony_ci#endif
2422e5b6d6dSopenharmony_ci    if(strncmp(provider,"icu",3)) return NULL;
2432e5b6d6dSopenharmony_ci    const char *icuver=provider+3;
2442e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
2452e5b6d6dSopenharmony_ci    fprintf(stderr,  "VCF:ICUV %s\n", icuver);
2462e5b6d6dSopenharmony_ci#endif
2472e5b6d6dSopenharmony_ci
2482e5b6d6dSopenharmony_ci#if defined(GLUE_VER)
2492e5b6d6dSopenharmony_ci#undef GLUE_VER
2502e5b6d6dSopenharmony_ci#endif
2512e5b6d6dSopenharmony_ci#define GLUE_VER(x) /*printf("%c/%c|%c/%c\n", icuver[0],(#x)[0],icuver[1],(#x)[2]);*/  if(icuver[0]== (#x)[0] && icuver[1]==(#x)[2]) { DateFormat *c = glue ## DateFormat ## x :: create(timeStyle,dateStyle,locale,tzID,tzIDLength,pattern,patternLength,status,loc,icuver); /*fprintf(stderr, "VCF::CC %s -> %p\n", loc.getName(), c);*/ return c; }
2522e5b6d6dSopenharmony_ci#include "icuglue/glver.h"
2532e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
2542e5b6d6dSopenharmony_ci    fprintf(stderr,  "VCF:CC %s failed\n", loc.getName());
2552e5b6d6dSopenharmony_ci#endif
2562e5b6d6dSopenharmony_ci
2572e5b6d6dSopenharmony_ci    return NULL;
2582e5b6d6dSopenharmony_ci}
2592e5b6d6dSopenharmony_ci
2602e5b6d6dSopenharmony_ci
2612e5b6d6dSopenharmony_cistatic const UnicodeString *gLocalesDate = NULL;
2622e5b6d6dSopenharmony_cistatic  int32_t gLocCountDate = 0;
2632e5b6d6dSopenharmony_ci
2642e5b6d6dSopenharmony_ci
2652e5b6d6dSopenharmony_ciconst UnicodeString
2662e5b6d6dSopenharmony_ci*VersionDateFormatFactory::getSupportedIDs(int32_t &count, UErrorCode &/*status*/) {
2672e5b6d6dSopenharmony_ci  if(gLocalesDate==NULL) {
2682e5b6d6dSopenharmony_ci    count = 0;
2692e5b6d6dSopenharmony_ci
2702e5b6d6dSopenharmony_ci
2712e5b6d6dSopenharmony_ci    /* gather counts */
2722e5b6d6dSopenharmony_ci
2732e5b6d6dSopenharmony_ci#if defined(GLUE_VER)
2742e5b6d6dSopenharmony_ci#undef GLUE_VER
2752e5b6d6dSopenharmony_ci#endif
2762e5b6d6dSopenharmony_ci#define GLUE_VER(x) count += glue ## DateFormat ## x :: countAvailable();
2772e5b6d6dSopenharmony_ci#include "icuglue/glver.h"
2782e5b6d6dSopenharmony_ci
2792e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
2802e5b6d6dSopenharmony_ci    printf("VCF: count=%d\n", count);
2812e5b6d6dSopenharmony_ci#endif
2822e5b6d6dSopenharmony_ci    UnicodeString *strs = new  UnicodeString[count];
2832e5b6d6dSopenharmony_ci    int32_t i = 0;
2842e5b6d6dSopenharmony_ci
2852e5b6d6dSopenharmony_ci#if defined(GLUE_VER)
2862e5b6d6dSopenharmony_ci#undef GLUE_VER
2872e5b6d6dSopenharmony_ci#endif
2882e5b6d6dSopenharmony_ci#define GLUE_VER(x) i += glue ## DateFormat ## x :: appendAvailable(strs, i, count);
2892e5b6d6dSopenharmony_ci#include "icuglue/glver.h"
2902e5b6d6dSopenharmony_ci
2912e5b6d6dSopenharmony_ci#if DATE_FE_DEBUG
2922e5b6d6dSopenharmony_ci    printf("VCF: appended count=%d\n", count);
2932e5b6d6dSopenharmony_ci#endif
2942e5b6d6dSopenharmony_ci
2952e5b6d6dSopenharmony_ci    gLocCountDate = count;
2962e5b6d6dSopenharmony_ci    gLocalesDate = strs;
2972e5b6d6dSopenharmony_ci  }
2982e5b6d6dSopenharmony_ci  count = gLocCountDate;
2992e5b6d6dSopenharmony_ci  return gLocalesDate;
3002e5b6d6dSopenharmony_ci}
3012e5b6d6dSopenharmony_ci
3022e5b6d6dSopenharmony_ci
3032e5b6d6dSopenharmony_ci/* Plugin Code */
3042e5b6d6dSopenharmony_ci
3052e5b6d6dSopenharmony_ci#include <stdio.h>
3062e5b6d6dSopenharmony_ci#include <unicode/uversion.h>
3072e5b6d6dSopenharmony_ci
3082e5b6d6dSopenharmony_ci//static URegistryKey rkdate = NULL;
3092e5b6d6dSopenharmony_ci
3102e5b6d6dSopenharmony_cistatic VersionDateFormatFactory vdf;
3112e5b6d6dSopenharmony_ci
3122e5b6d6dSopenharmony_ciextern "C" UDateFormat *versionDateFormatOpener(UDateFormatStyle  timeStyle,
3132e5b6d6dSopenharmony_ci                                                    UDateFormatStyle  dateStyle,
3142e5b6d6dSopenharmony_ci                                                    const char        *locale,
3152e5b6d6dSopenharmony_ci                                                    const UChar       *tzID,
3162e5b6d6dSopenharmony_ci                                                    int32_t           tzIDLength,
3172e5b6d6dSopenharmony_ci                                                    const UChar       *pattern,
3182e5b6d6dSopenharmony_ci                                                    int32_t           patternLength,
3192e5b6d6dSopenharmony_ci                                                       UErrorCode        *status) {
3202e5b6d6dSopenharmony_ci  DateFormat *df = vdf.createFormat(timeStyle,dateStyle,locale,tzID,tzIDLength,pattern,patternLength,status);
3212e5b6d6dSopenharmony_ci  // printf("Hey! I got: %s -> %p\n", locale, df);
3222e5b6d6dSopenharmony_ci  return (UDateFormat*)df;
3232e5b6d6dSopenharmony_ci}
3242e5b6d6dSopenharmony_ci
3252e5b6d6dSopenharmony_civoid date_provider_register(UErrorCode &status) {
3262e5b6d6dSopenharmony_ci  udat_registerOpener(versionDateFormatOpener, &status);
3272e5b6d6dSopenharmony_ci  //   rkdate = DateFormat::registerFactory(new VersionDateFormatFactory(), status);
3282e5b6d6dSopenharmony_ci}
3292e5b6d6dSopenharmony_ci
3302e5b6d6dSopenharmony_civoid date_provider_unregister(UErrorCode &status) {
3312e5b6d6dSopenharmony_ci  udat_unregisterOpener(versionDateFormatOpener, &status);
3322e5b6d6dSopenharmony_ci}
3332e5b6d6dSopenharmony_ci
3342e5b6d6dSopenharmony_ci#else
3352e5b6d6dSopenharmony_ci
3362e5b6d6dSopenharmony_ci/* no op- this ICU doesn't support date providers */
3372e5b6d6dSopenharmony_ci
3382e5b6d6dSopenharmony_civoid date_provider_register(UErrorCode &) {
3392e5b6d6dSopenharmony_ci  // not supported
3402e5b6d6dSopenharmony_ci}
3412e5b6d6dSopenharmony_ci
3422e5b6d6dSopenharmony_civoid date_provider_unregister(UErrorCode &) {
3432e5b6d6dSopenharmony_ci  // not supported
3442e5b6d6dSopenharmony_ci}
3452e5b6d6dSopenharmony_ci
3462e5b6d6dSopenharmony_ci#endif
3472e5b6d6dSopenharmony_ci
3482e5b6d6dSopenharmony_ci/* Plugin- only ICU 4.4+ */
3492e5b6d6dSopenharmony_ci#if (U_ICU_VERSION_MAJOR_NUM > 4) || ((U_ICU_VERSION_MAJOR_NUM==4)&&(U_ICU_VERSION_MINOR_NUM>3))
3502e5b6d6dSopenharmony_ci#include "unicode/icuplug.h"
3512e5b6d6dSopenharmony_ci
3522e5b6d6dSopenharmony_ciU_CAPI UPlugTokenReturn U_EXPORT2 date_provider_plugin (UPlugData *data, UPlugReason reason, UErrorCode *status);
3532e5b6d6dSopenharmony_ci
3542e5b6d6dSopenharmony_ciU_CAPI UPlugTokenReturn U_EXPORT2 date_provider_plugin (UPlugData *data, UPlugReason reason, UErrorCode *status)
3552e5b6d6dSopenharmony_ci{
3562e5b6d6dSopenharmony_ci  switch(reason) {
3572e5b6d6dSopenharmony_ci  case UPLUG_REASON_QUERY:
3582e5b6d6dSopenharmony_ci    uplug_setPlugName(data, "Date Provider Plugin");
3592e5b6d6dSopenharmony_ci    uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH);
3602e5b6d6dSopenharmony_ci    break;
3612e5b6d6dSopenharmony_ci  case UPLUG_REASON_LOAD:
3622e5b6d6dSopenharmony_ci    date_provider_register(*status);
3632e5b6d6dSopenharmony_ci    break;
3642e5b6d6dSopenharmony_ci  case UPLUG_REASON_UNLOAD:
3652e5b6d6dSopenharmony_ci    date_provider_unregister(*status);
3662e5b6d6dSopenharmony_ci    break;
3672e5b6d6dSopenharmony_ci  default:
3682e5b6d6dSopenharmony_ci    break; /* not handled */
3692e5b6d6dSopenharmony_ci  }
3702e5b6d6dSopenharmony_ci  return UPLUG_TOKEN;
3712e5b6d6dSopenharmony_ci}
3722e5b6d6dSopenharmony_ci#else
3732e5b6d6dSopenharmony_ci
3742e5b6d6dSopenharmony_ci/*
3752e5b6d6dSopenharmony_ci   Note: this ICU version must explicitly call 'date_provider_plugin'
3762e5b6d6dSopenharmony_ci*/
3772e5b6d6dSopenharmony_ci
3782e5b6d6dSopenharmony_ci#endif /* plugin */
3792e5b6d6dSopenharmony_ci
3802e5b6d6dSopenharmony_ci#endif /* provider side (vs target) */
381