SOL9 2.0 Class: StringConverter

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree  SOL9 ClassList 

Source code

/******************************************************************************
 *
 * Copyright (c) 1999-2008 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer.
 *  
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 *  StringConverter.h
 *
 *****************************************************************************/


#pragma once

#include <sol\Object.h>
#include <sol\StringT.h>

/**
 */
namespace SOL {

class StringConverter :public Object {

public:
  StringConverter() {
  }

public:
  // char -> char
  bool convert(const char* mbstring, __out StringT<char>& string)
  {
    bool rc = false;
    if (mbstring) {
      //return a copy of mbstring
      string = mbstring;
      rc = true;
    }
    return rc;
  }

public:
  // char -> wchar_t
  bool convert(const char* mbstring, __out StringT<wchar_t>& string)
  {
    return toWideChar(mbstring, string);
  }

public:
  // wchar_t -> char
  bool convert(const wchar_t* wcstring, __out StringT<char>& string)
  {
    return toMultiByte(wcstring, string);
  }

public:
  // wchar_t -> wchar_t
  bool convert(const wchar_t* wcstring, __out StringT<wchar_t>& string)
  {
    bool rc = false;
    if (wcstring) {
      //return a copy of mbstring
      string = wcstring;
      rc = true;
    }
    return rc;
  }


public:
  /**
   * MultiByteString -> WideCharString(Unicode)
   */
  wchar_t* toWideChar(const char* mbstring) {
    wchar_t* wcstring = NULL;

    if (mbstring == NULL) {
      return wcstring;
    }
    
    int cb = MultiByteToWideChar(CP_ACP, 0, mbstring, -1, NULL, 0); 
    if (cb >0) {
      wcstring = new wchar_t[cb];
      wcstring[0] = ZERO;
      MultiByteToWideChar(CP_ACP, 0, mbstring, -1, wcstring, cb); 
    }
    return wcstring;
  }

public:
  /**
   * WideCharString -> WideCharString(Unicode)
   */
  wchar_t* toWideChar(const wchar_t* wstring) {
    wchar_t* wcstring = NULL;

    if (wstring == NULL) {
      return wcstring;
    }

    //Simply return a duplicate wchar_t string.
    wcstring = _strdup(wstring);

    return wcstring;
  }

public:
  /**
   * MultiByteString -> WideCharString(Unicode)
   */
  //2009/10/10
  bool toWideChar(__in const char* mbstring, __out StringT<wchar_t>& stringw) {
    bool rc = false;

    if (mbstring == NULL) {
      return rc;
    }
    
    int cb = MultiByteToWideChar(CP_ACP, 0, mbstring, -1, NULL, 0); 
    if (cb >0) {
      wchar_t* wcstring = NULL;

      wcstring = new wchar_t[cb];
      wcstring[0] = ZERO;
      MultiByteToWideChar(CP_ACP, 0, mbstring, -1, wcstring, cb);
      stringw.shallowCopy(wcstring);
      rc = true;
    }
    return rc;
  }

public:
  /**
   * WideCharString(Unicode) -> MultiByteString 
   */
  char* toMultiByte(const wchar_t* wcstring) {

    char* mbstring = NULL;

    if (wcstring == NULL) {
      return mbstring;
    }
    
    int cb = WideCharToMultiByte(CP_ACP, 0, wcstring, -1, NULL, 0, NULL, NULL);
    
    if (cb > 0) {
      mbstring = new char[cb];
      mbstring[0] = ZERO;
      WideCharToMultiByte(CP_ACP, 0, wcstring, -1, mbstring, cb, NULL, NULL);
    }
    return mbstring;
  }

public:
  /**
   * MultiByteString(Unicode) -> MultiByteString 
   */
  char* toMultiByte(const char* cstring) {

    char* mbstring = NULL;

    if (cstring == NULL) {
      return mbstring;
    }

    //Simply return a duplicate char string.
    mbstring = _strdup(cstring);

    return mbstring;
  }



public:
  /**
   * WideCharString(Unicode) -> MultiByteString 
   */
  //2009/10/10
  bool toMultiByte(__in const wchar_t* wcstring, __out StringT<char>& stringt) {

    bool rc = false;

    if (wcstring == NULL) {
      return rc;
    }
    
    int cb = WideCharToMultiByte(CP_ACP, 0, wcstring, -1, NULL, 0, NULL, NULL);
    
    if (cb > 0) {
      char* mbstring = new char[cb];
      mbstring[0] = ZERO;
      WideCharToMultiByte(CP_ACP, 0, wcstring, -1, mbstring, cb, NULL, NULL);
      
      stringt.shallowCopy(mbstring);

      rc = true;
    }
    return rc;
  }


public:
  /**
   * MultiByteString -> BSTR
   */
  BSTR toBSTR(const char* mbstring) {
  
     BSTR bstring = NULL;
  
    if (mbstring == NULL) {
      return bstring;
    }

    int  cb = MultiByteToWideChar(CP_ACP, 0, mbstring, -1, NULL, NULL) -1;
     bstring = SysAllocStringLen(NULL, cb);
    if (bstring != NULL) {
      MultiByteToWideChar(CP_ACP, 0, mbstring, -1, bstring, cb);
    }
    return bstring;
  }

public:
  //2009/06/18
  BSTR toBSTR(const wchar_t* wcstring)
  {
    BSTR bstring = NULL;
    if (wcstring == NULL) {
      return bstring;
    }
  
    bstring = SysAllocStringLen(wcstring, (UINT)wcslen(wcstring));

    return bstring;
  }
};

}

Last modified: 5 May 2019

Copyright (c) 2009-2019 Antillia.com ALL RIGHTS RESERVED.