void PipeReader::run (void)
{
	std::vector<deUint8>	tmpBuf		(FILEREADER_TMP_BUFFER_SIZE);
	deInt64					numRead		= 0;

	while (!m_buf->isCanceled())
	{
		deFileResult result = deFile_read(m_file, &tmpBuf[0], (deInt64)tmpBuf.size(), &numRead);

		if (result == DE_FILERESULT_SUCCESS)
		{
			// Write to buffer.
			try
			{
				m_buf->write((int)numRead, &tmpBuf[0]);
				m_buf->flush();
			}
			catch (const ThreadedByteBuffer::CanceledException&)
			{
				// Canceled.
				break;
			}
		}
		else if (result == DE_FILERESULT_END_OF_FILE ||
				 result == DE_FILERESULT_WOULD_BLOCK)
		{
			// Wait for more data.
			deSleep(FILEREADER_IDLE_SLEEP);
		}
		else
			break; // Error.
	}
}
// ---------------------------------------------------------------------------------
// CUpnpTmServerDeviceXmlParser::OnStartDocumentL
// Called when parser hits the start of the document
// ---------------------------------------------------------------------------------
//
void CUpnpTmServerDeviceXmlParser::OnStartDocumentL(const RDocumentParameters& /*aDocParam*/,
                                                                             TInt aErrorCode )
	{
	OstTraceFunctionEntry0( CUPNPTMSERVERDEVICEXMLPARSER_ONSTARTDOCUMENTL_ENTRY );
	User::LeaveIfError(aErrorCode);
    
    TBuf<KMaxBufLength> tmpBuf(iDeviceDir);
    tmpBuf.Append(KDeviceName());
    iDescFilePath.CreateL(tmpBuf);
    tmpBuf.Zero();
    
    // Create TmAppServer service xml
    tmpBuf.Copy(iDeviceDir);
    tmpBuf.Append(KAppServerSrvName());
    RFile appServerSrvFile;
    CleanupClosePushL(appServerSrvFile);
    TInt err(KErrNone);
    err = appServerSrvFile.Create(iFs, tmpBuf, EFileWrite);
    if ( err == KErrAlreadyExists )
        {
        User::LeaveIfError(appServerSrvFile.Open(iFs, tmpBuf, EFileWrite));
        }
    else
        {
        User::LeaveIfError(err);
        }
    User::LeaveIfError(appServerSrvFile.Write(iAppServerSrvDescription));
    CleanupStack::PopAndDestroy( &appServerSrvFile );
    iAppServerSrvFilePath.CreateL(tmpBuf);
    tmpBuf.Zero();
    
    // Create TmClientProfile service xml
    tmpBuf.Copy(iDeviceDir);
    tmpBuf.Append(KClientProfSrvName());
    RFile clientProfSrvFile;
    CleanupClosePushL(clientProfSrvFile);
    err = clientProfSrvFile.Create(iFs, tmpBuf, EFileWrite);
    if ( err == KErrAlreadyExists )
        {
        User::LeaveIfError(clientProfSrvFile.Open(iFs, tmpBuf, EFileWrite));
        }
    else
        {
        User::LeaveIfError(err);
        }
    User::LeaveIfError(clientProfSrvFile.Write(iClientProfSrvDescription));
    CleanupStack::PopAndDestroy( &clientProfSrvFile );
    iClientProfSrvFilePath.CreateL(tmpBuf);
    
    iDeviceDescription.Append(KStartLine());
    iDescriptionUri.CreateMaxL(UpnpString::KDefaultStringLength);
    iDescriptionUri.SetLength(KErrNone);
    iDescriptionUri.Append(KScpdUrl());
    iDescriptionUri.Append(KDeviceName());
	OstTraceFunctionExit0( CUPNPTMSERVERDEVICEXMLPARSER_ONSTARTDOCUMENTL_EXIT );
	}
Пример #3
0
static inline double StrToDSystem(const char* b, const char* e, char** se) {
    const size_t len = e - b;
    TTempBuf tmpBuf(len + 1);
    char* tmp = (char*)tmpBuf.Data();

    memcpy(tmp, b, len);
    tmp[len] = 0;
    char* ret = 0;
    const double res = strtod(tmp, &ret);

    if (se) {
        *se = (char*)(b + (ret - tmp));
    }

    return res;
}
Пример #4
0
/*===========================================================================
METHOD:
   EncodeTxData (Internal Method)

DESCRIPTION:
   Encode data for transmission

PARAMETERS:
   pBuffer        [ I ] - Data to be encoded
   bEncoded       [ O ] - Do we even encode data?

SEQUENCING:
   None (must be called from protocol server thread)

RETURN VALUE:
   sSharedBuffer * - Encoded data (0 upon error when encoding is indicated)
===========================================================================*/
sSharedBuffer * cQMIProtocolServer::EncodeTxData( 
   sSharedBuffer *            pBuffer,
   bool &                     bEncoded )
{
   WORD tid = ++mLastTID;
   if (tid == (WORD)INVALID_QMI_TRANSACTION_ID)
   {
      tid++;
   }

   sQMIServiceBuffer tmpBuf( pBuffer );
   tmpBuf.SetTransactionID( tid );
   
   // No actual encoding required as we alter the original request
   bEncoded = false;
   return 0;
};
Пример #5
0
/*===========================================================================
METHOD:
   DecodeRxData (Internal Method)

DESCRIPTION:
   Decode incoming data into QMI indications/responses

PARAMETERS:
   bytesReceived  [ I ] - Number of bytes to decoded
   rspIdx         [ O ] - Log index of last valid response (not used)
   bAbortTx       [ O ] - Response aborts current transmission? (not used)

SEQUENCING:
   None (must be called from protocol server thread)

RETURN VALUE:
   bool - Was a response received?
===========================================================================*/
bool cQMIProtocolServer::DecodeRxData( 
   ULONG                      bytesReceived,
   ULONG &                    rspIdx,
   bool &                     bAbortTx )
{
   // Assume failure
   bool bRC = false;

   rspIdx = INVALID_LOG_INDEX;
   bAbortTx = false;

   // Something to decode from?
   if (bytesReceived == 0)
   {
      return bRC;
   }

   // Set protocol type (we have to be dealing with a valid QMI service)
   eProtocolType pt = MapQMIServiceToProtocol( mService, false );
   if (pt == ePROTOCOL_ENUM_BEGIN)
   {
      return bRC;
   }

   sSharedBuffer * pTmp = 0;
   pTmp = new sSharedBuffer( mpRxBuffer, bytesReceived, pt );
   if (pTmp != 0)
   {
      sQMIServiceBuffer tmpBuf( pTmp );
      if (tmpBuf.IsValid() == true)
      {
         rspIdx = mLog.AddBuffer( tmpBuf );
         if (IsResponse( tmpBuf ) == true)
         {
            bRC = true;
         }
         else
         {
            rspIdx = INVALID_LOG_INDEX;
         }
      }
   }

   return bRC;
}
void
TileMapBufferHolder::updateAttributesIfNeeded()
{
   MC2_ASSERT( m_buf != NULL );
   if ( ! m_trustAttributes ) {
      // crc and empty attributes are not set.
      // Must have a mapdesc in order to be able to load the tilemap.
      MC2_ASSERT( m_mapDesc != NULL );
      TileMap tmap; 

      BitBuffer tmpBuf( m_buf->getBufferAddress(), 
                        m_buf->getBufferSize() );
      tmap.load( tmpBuf, *m_mapDesc, m_desc );
      m_crc = tmap.getCRC();
      TileMapParams param( m_desc );
      uint32 emptyImps = tmap.getEmptyImportances();
      m_empty = static_cast<bool>(emptyImps & (1 << param.getImportanceNbr()));

      // Attributes are now trusted!
      m_trustAttributes = true;
   }
}
void sendReply ( void *state ) {

	StateStatsdb *st = (StateStatsdb *)state;

	if ( g_errno ) {
		g_httpServer.sendErrorReply(st->m_socket,
					    500,mstrerror(g_errno));
		return;
	}

	TcpSocket *s = st->m_socket;

	SafeBuf buf( 1024*32 );
	SafeBuf tmpBuf( 1024 );

	//
	// take these out until we need them!
	//
	/*
	// print the top of the page
	tmpBuf.safePrintf( 
			  //"<style type=\"text/css\">"
			  //"@import url(/styles/statsdb.css);</style>\n"
		"<script type=\"text/javascript\" "
		"src=\"/scripts/statsdb.js\"></script>\n"
		"<!-- DHTML Calendar -->"
		"<style type=\"text/css\">"
		"@import url(/jsc/calendar-win2k-1.css);"
		"</style>\n"
		"<script type=\"text/javascript\" "
		"src=\"/jsc/calendar.js\"></script>\n"
		"<script type=\"text/javascript\" "
		"src=\"/jsc/lang/calendar-en.js\"></script>\n"
		"<script type=\"text/javascript\" "
		"src=\"/jsc/calendar-setup.js\"></script>\n"
	);
	*/

	// make the query string
	char qs[1024];
	sprintf(qs,"&date_period=%li&date_units=%li&samples=%li",
		st->m_datePeriod,
		st->m_dateUnits,
		st->m_samples);

	// print standard header
	g_pages.printAdminTop ( &buf , st->m_socket , &st->m_request ,
				qs );

	buf.cat ( tmpBuf );

	//g_pages.printAdminTop2 ( &buf , st->m_socket , &st->m_request, NULL ,
	//			 tmpBuf.getBufStart(), tmpBuf.length() ); 

	// write the controls section of the page
	writeControls( &buf, st );

	// Debug print of CGI parameters and errors
	char startTimeStr[30];
	char endTimeStr[30];

	strncpy( startTimeStr, ctime( &st->m_startDate ), 30 );
	strncpy( endTimeStr, ctime( &st->m_endDate ), 30 );

	buf.safePrintf("<center>\n");

	if ( ! g_conf.m_useStatsdb ) 
		buf.safePrintf("<font color=red><b>Statsdb disabled. "
			       "Turn on in the master controls.</b>"
			       "</font>\n" );

	buf.safePrintf("<table cellpadding=10 border=0>\n");

	buf.safePrintf("<tr><td>"
		       "<center>"
		       "<img src=\"/stats%li.gif\" height=%li width=%li "
		       "border=\"0px\">"
		       "</center>"
		       //"class=\"statsdb_image\">"
		       "</td></tr>\n",
		       st->m_hostId,
		       g_statsdb.getImgHeight(),
		       g_statsdb.getImgWidth());

	// the map key
	buf.safePrintf("<tr><td>");
	buf.cat ( st->m_sb2 );
	buf.safePrintf("</td></tr>\n");

	buf.safePrintf( "</table>\n" );

	buf.safePrintf("</center>");

	// print the bottom of the page
	g_pages.printAdminBottom2( &buf );
	
	g_errno = 0;
	mdelete ( st, sizeof(StateStatsdb), "PageStatsdb" );
	delete st;

	g_httpServer.sendDynamicPage ( s, buf.getBufStart(), buf.length() );
}
Пример #8
0
void newBufTest()
{
    std::cout << "*** Testing AsnBuf ****\n";
    try {
        SNACC::AsnBuf testBufExcept;
        testBufExcept.GetByte();
    } catch (SNACC::SnaccException &e) {
        std::cout << "Caught buffer exception as expected: " << e.what()
                  << "\n";
    }

    std::fstream fs("test.txt");

    unsigned char test[10000];
    int j;
    try {
        fillTestBuffer(&test[0], 10000);

        // file test
        std::filebuf fb;
        fb.open("test.txt", std::ios_base::out | std::ios_base::binary);
        fb.sputn((char *)&test[0], 10000);
        fb.close();

        SNACC::AsnBuf fileBuf("test.txt");
        if (fileBuf.length() != 10000) {
            std::cout << "ERROR: AsnBuf() file length check failed!\n";
        } else {
            char fileData[10000];
            try {
                fileBuf.GetSeg(&fileData[0], 10000);
                if (memcmp(fileData, test, 10000) != 0) {
                    std::cout << "ERROR: AsnBuf() file data check failed!\n";
                }
            } catch(...) {
                std::cout << "ERROR: AsnBuf() file GetSeg() failed!\n";
            }
        }

        SNACC::AsnBuf buf2[1000];

        for (j = 0; j < 1; j++) {

            SNACC::AsnBuf tmpBuf((char *)test,4200);
#ifdef _DEBUG
            tmpBuf.status(std::cout);
#endif
            tmpBuf.ResetMode();
            char ch = tmpBuf.GetByte();
            char ch2 = tmpBuf.GetByte();
            std::cout << "ch == " << (int)ch
                      << " ch2 == " << (int)ch2 << "\n";

            buf2[j].PutSegRvs((char *)test, 10000);

#ifdef _DEBUG
            buf2[j].status(std::cout);
#endif
            SNACC::AsnBuf buf;
            buf = buf2[j];
            buf.ResetMode();
            if (buf.length() != 10000) {
                std::cout << "length() after PutSegRvs() test FAILED!\n";
            }

            std::stringstream ss, ss2;

            ss << buf;
            buf.ResetMode();
            ss2 << buf;

#ifdef _DEBUG
            buf.status(std::cout);
#endif
            buf.ResetMode();
            const char *ps = ss.str().data(); // buf.GetSeg(10000)

            checkTestBuffer((unsigned char *) ps, 10000);

            if ((ss.str().length() == 10000) &&
                (memcmp(test, ps, 10000) == 0)) {
                std::cout << "ss is good!" << std::endl;
            } else {
                std::cout << "[" << j << "] ss is not good!" << std::endl;
            }

            const char *ps2 = ss2.str().data();
            if (ss2.str().length() == 10000 &&
                memcmp(test, ps2, 10000) == 0){
                std::cout << "ss2 is good!" << std::endl;
            } else{
                std::cout << "[" << j << "] ss2 is not good" << std::endl;
            }
        }
    } catch (std::exception &e) {
        std::cout << "Caught Standard Exception: " << e.what() << std::endl;
    } catch (...) {
        std::cout << "Caught un-handled exception!" << std::endl;
    }

    std::cout << "*** end of AsnBuf test ***\n";
}
Пример #9
0
int MVCToXML(
  mvc_t  *VC,
  mxml_t *VE,
  enum MVCAttrEnum *SAList,
  mbool_t FullXML)

  {
  const enum MVCAttrEnum DAList[] = {
    mvcaACL,         /* ACL */
    mvcaCreateTime,  /* time VC was created */
    mvcaCreator,     /* creator */
    mvcaDescription, /* description */
    mvcaFlags,       /* flags (from MVCFlagEnum) */
    mvcaJobs,        /* names of jobs in VC */
    mvcaMessages,    /* VC messages */
    mvcaName,        /* VC name */
    mvcaNodes,       /* names of nodes in VC */
    mvcaOwner,       /* VC owner */
    mvcaParentVCs,   /* names of parent VCs */
    mvcaReqStartTime,/* requested start time for guaranteed start time */
    mvcaRsvs,        /* names of rsvs in VC */
    mvcaVariables,   /* VC vars */
    mvcaVCs,         /* sub-VCs */
    mvcaVMs,         /* names of VMs in VC */
    mvcaThrottlePolicies, /* throttling policies attached to VC via mvcctl */
    mvcaNONE };

  int aindex;

  enum MVCAttrEnum *AList;
  mbool_t PrintACL = FALSE;

  if ((VC == NULL) || (VE == NULL))
    {
    return(FAILURE);
    }

  if (SAList != NULL)
    AList = SAList;
  else
    AList = (enum MVCAttrEnum *)DAList;

  mstring_t tmpBuf(MMAX_LINE);

  for (aindex = 0;AList[aindex] != mvcaNONE;aindex++)
    {
    if (AList[aindex] == mvcaACL)
      {
      PrintACL = TRUE;

      continue;
      }

    if ((FullXML == TRUE) && 
         ((AList[aindex] == mvcaJobs) ||
          (AList[aindex] == mvcaNodes) ||
          (AList[aindex] == mvcaRsvs) ||
          (AList[aindex] == mvcaVMs) ||
          (AList[aindex] == mvcaVCs) ||
          (AList[aindex] == mvcaParentVCs)))
      continue;

    if (AList[aindex] == mvcaVariables)
      {
      MUAddVarsToXML(VE,&VC->Variables);

      continue;
      }
    else if ((AList[aindex] == mvcaMessages) &&
              (VC->MB != NULL))
      {
      /* Use the already existing MMB to XML functionality */

      mxml_t *ME = NULL;

      MXMLCreateE(&ME,(char *)MVCAttr[mvcaMessages]);

      MMBPrintMessages(VC->MB,mfmXML,TRUE,-1,(char *)ME,0);

      MXMLAddE(VE,ME);

      continue;
      }

    MVCAToMString(VC,AList[aindex],&tmpBuf);

    if (!tmpBuf.empty())
      {
      MXMLSetAttr(VE,(char *)MVCAttr[AList[aindex]],tmpBuf.c_str(),mdfString);
      }
    }  /* END for (aindex) */

  if (FullXML)
    {
    /* If you specify FullXML, you get all of the children.  Don't check AList */

    mln_t *tmpL;
    mxml_t *CE;

    if (VC->Jobs != NULL)
      {
      mjob_t *J;

      enum MJobAttrEnum JAList[] = {
        mjaJobID,
        mjaAccount,
        mjaArgs,
        mjaClass,
        mjaCmdFile,
        mjaDescription,
        mjaFlags,
        mjaGroup,
        mjaPAL,
        mjaQOS,
        mjaRCL,
        mjaReqAWDuration,
        mjaReqHostList,    /**< requested hosts */
        mjaReqNodes,
        mjaReqReservation,
        mjaRM,
        mjaStatPSDed,
        mjaSysPrio,
        mjaTemplateFlags,
        mjaTrigger,
        mjaUser,
        mjaVMUsagePolicy,
        mjaNONE };

      for (tmpL = VC->Jobs;tmpL != NULL;tmpL = tmpL->Next)
        {
        CE = NULL;
        J = (mjob_t *)tmpL->Ptr;

        MJobToXML(J,&CE,JAList,NULL,NULL,FALSE,FALSE);

        MXMLAddE(VE,CE);
        }
      }  /* END if (VC->Jobs != NULL) */

    if (VC->Nodes != NULL)
      {
      mnode_t *N;

      enum MNodeAttrEnum NAList[] = {
        mnaNodeID,
        mnaArch,
        mnaAvlGRes,
        mnaCfgGRes,
        mnaAvlTime,      
        mnaFeatures,
        mnaHopCount,
        mnaLoad,
        mnaNodeState,
        mnaOS,
        mnaOSList,
        mnaProcSpeed,
        mnaRADisk,
        mnaRAMem,
        mnaRAProc,
        mnaRASwap,
        mnaRCDisk,
        mnaRCMem,
        mnaRCProc,
        mnaRCSwap,
        mnaSpeed,
        mnaVMOSList,
        mnaNONE };

      for (tmpL = VC->Nodes;tmpL != NULL;tmpL = tmpL->Next)
        {
        CE = NULL;
        N = (mnode_t *)tmpL->Ptr;

        MXMLCreateE(&CE,(char *)MXO[mxoNode]);
        MNodeToXML(N,CE,NAList,0,FALSE,FALSE,NULL,NULL);

        MXMLAddE(VE,CE);
        }
      }  /* END if (VC->Nodes != NULL) */

    if (VC->Rsvs != NULL)
      {
      mrsv_t *R;

      for (tmpL = VC->Rsvs;tmpL != NULL;tmpL = tmpL->Next)
        {
        CE = NULL;
        R = (mrsv_t *)tmpL->Ptr;

        MRsvToXML(R,&CE,NULL,NULL,FALSE,mcmNONE);

        MXMLAddE(VE,CE);
        }
      }  /* END if (VC->Rsvs != NULL) */

    if (VC->VMs != NULL)
      {
      mvm_t *V;

      for (tmpL = VC->VMs;tmpL != NULL;tmpL = tmpL->Next)
        {
        CE = NULL;
        V = (mvm_t *)tmpL->Ptr;

        MXMLCreateE(&CE,(char *)MXO[mxoxVM]);
        MVMToXML(V,CE,NULL);

        MXMLAddE(VE,CE);
        }
      }  /* END if (VC->VMs != NULL) */

    if (VC->VCs != NULL)
      {
      mvc_t *V;

      for (tmpL = VC->VCs;tmpL != NULL;tmpL = tmpL->Next)
        {
        CE = NULL;
        V = (mvc_t *)tmpL->Ptr;

        MXMLCreateE(&CE,(char *)MXO[mxoxVC]);
        MVCToXML(V,CE,SAList,FullXML);

        MXMLAddE(VE,CE);
        }
      }  /* END if (VC->VCs != NULL) */
    }  /* END if (FullXML) */

  if ((PrintACL == TRUE) && (!MACLIsEmpty(VC->ACL)))
    {
    macl_t *tACL;
    mxml_t *AE = NULL;

    for (tACL = VC->ACL;tACL != NULL;tACL = tACL->Next)
      {
      AE = NULL;

      MACLToXML(tACL,&AE,NULL,FALSE);

      MXMLAddE(VE,AE);
      }
    }  /* END if ((PrintACL == TRUE) && (!MACLIsEmpty(VC->ACL))) */

  return(SUCCESS);
  }  /* END MVCToXML() */
Пример #10
0
boost::optional<Codec::SDecodeContext>	Codec::Decode( mori::TcpConnBuffer& buf, mori::TcpConnectionSPtr& connPtr, const std::string& rsaPriKey, PreChecker& ftr )
{
	CodecProtocol::Codec decodeMsg;

	if ( buf.size() < sizeof(uint32_t) )
	{
		return boost::optional<Codec::SDecodeContext>();
	}

	uint32_t* pSize = reinterpret_cast<uint32_t*>(buf.data());
	*pSize = boost::asio::detail::socket_ops::network_to_host_long(*pSize);
	uint32_t msgSize = *pSize;

	if ( msgSize > buf.size()-sizeof(uint32_t) )
	{
		return boost::optional<Codec::SDecodeContext>();
	}

	if ( !decodeMsg.ParseFromArray(buf.data()+sizeof(uint32_t), msgSize) )
	{
		return boost::optional<SDecodeContext>();
	}

	std::copy(buf.begin()+sizeof(uint32_t)+msgSize, buf.end(), buf.begin());
	buf.resize(buf.size()-sizeof(uint32_t)-msgSize);

	SDecodeContext ret;
	ret.MsgName_	= decodeMsg.msgname();
	ret.ClientType_ = decodeMsg.clienttype();
	if ( decodeMsg.has_userid() )
	{
		ret.UserID_	= decodeMsg.userid();
	}
	
	if ( decodeMsg.has_verifycode() )
	{
		ret.VerifyCode_ = decodeMsg.verifycode();
	}

	if ( decodeMsg.has_rawsize() )
	{
		auto unCompSize = decodeMsg.rawsize();

		if ( 0 == unCompSize )
		{
			buf.resize(0);
		}
		else
		{
			mori::TcpConnBuffer tmpBuf(unCompSize);

			auto err = uncompress(reinterpret_cast<Bytef*>(tmpBuf.data()), reinterpret_cast<uLongf*>(&unCompSize),
				reinterpret_cast<const Bytef*>(buf.data()), buf.size());
			if ( Z_OK != err )
			{
				return boost::optional<SDecodeContext>();
			}

			buf.swap(tmpBuf);
		}		
	}

	bool useNewKey = false;
	std::string newKey;
	if ( ftr )
	{
		newKey = ftr(ret);
		if ( !newKey.empty() )
		{
			useNewKey = true;
		}
	}

	if ( decodeMsg.rsaencode() )
	{
		if ( !decodeMsg.has_aeskey() || rsaPriKey.empty() )
		{
			return boost::optional<SDecodeContext>();
		}

		auto aesDecode = FastEncrypt::RSA_PriDecrypt(useNewKey?newKey:rsaPriKey, decodeMsg.aeskey());
		if ( !aesDecode )
		{
			return boost::optional<SDecodeContext>();
		}

		decodeMsg.mutable_aeskey()->swap(*aesDecode);
	}

	if ( decodeMsg.has_aeskey() )
	{
		auto tmpBuf = std::move(FastEncrypt::AES_CBCDecrypt(decodeMsg.aeskey(), buf.data(), buf.size()));
		buf.resize(tmpBuf.size());
		std::copy(tmpBuf.begin(), tmpBuf.end(), buf.begin());
	}

	return ret;
}
Пример #11
0
//----------------------------------------------------------------------
//
//----------------------------------------------------------------------
ReferenceBuffer* Encoding::Convert(
	const void* src, size_t srcByteCount, const Encoding* srcEncoding,
	const Encoding* targetEncoding,
	size_t* bytesUsed, size_t* charsUsed, bool* usedDefaultChar)
{
	LN_THROW(src != NULL, ArgumentException);
	LN_THROW(srcEncoding != NULL, ArgumentException);
	LN_THROW(targetEncoding != NULL, ArgumentException);
	LN_THROW(srcByteCount >= srcEncoding->GetMinByteCount(), ArgumentException);	// バッファのバイト数は、そのバッファのエンコーディングの最低バイト数以上でなければならない

	/*	変換後に必要な最大のバイト数を求める
		例)
		pEncoding = UTF32 だったら
		変換後最大文字数 = uByteCount / 1文字最低バイト数(4)

		pEncoding = UTF16 だったら
		変換後最大文字数 = uByteCount / 1文字最低バイト数(2)

		pEncoding = UTF8 だったら
		変換後最大文字数 = uByteCount / 1文字最大バイト数(1)

		これに、pThisEncoding の1文字の最大バイト数を掛ける。
	*/
	int nConvertedMaxCharCount = srcByteCount / srcEncoding->GetMinByteCount();
	int nConvertedMaxBytes = nConvertedMaxCharCount * targetEncoding->GetMaxByteCount();
	nConvertedMaxBytes += targetEncoding->GetMinByteCount();	// 終端 \0 の分

	// 変換の中間フォーマットとして wchar_t を使用する。そのための一時バッファ確保
	int nWideMaxBytes = nConvertedMaxCharCount * Encoding::GetWideCharEncoding()->GetMaxByteCount();
	RefPtr<ReferenceBuffer> tmpBuf(LN_NEW ReferenceBuffer());
	tmpBuf->reserve(nWideMaxBytes + sizeof(wchar_t));	// 終端 \0 考慮 (mbstowcs_s は \0 を書き込もうとする)

	// 変換先バッファを、最大要素数で確保
	RefPtr<ReferenceBuffer> targetBuf(LN_NEW ReferenceBuffer());
	targetBuf->reserve(nConvertedMaxBytes/* / targetEncoding->GetMinByteCount()*/);

	// 変換実行
	bool bRes;
	size_t uBytesUsed;
	size_t uCharsUsed;
	bool bUsedDefaultChar;
#if defined(LNOTE_WCHAR_16)
	// ソースフォーマットから中間フォーマットへ
	bRes = srcEncoding->ConvertToUTF16(
		(const byte_t*)src,
		srcByteCount,
		tmpBuf->getPointer(),
		nWideMaxBytes,			// \0 強制格納に備え、1文字分余裕のあるサイズを指定する
		&uBytesUsed,
		&uCharsUsed);
	LN_THROW(bRes, InvalidFormatException);
	// 中間フォーマットからターゲットフォーマットへ
	bRes = targetEncoding->ConvertFromUTF16(
		(const byte_t*)tmpBuf->getPointer(),
		uBytesUsed,
		(byte_t*)targetBuf->getPointer(),
		targetBuf->getSize(),	// \0 強制格納に備え、1文字分余裕のあるサイズを指定する
		&uBytesUsed,
		&uCharsUsed,
		&bUsedDefaultChar);
	LN_THROW(bRes, InvalidFormatException);

#elif defined(LNOTE_WCHAR_32)

#else
#error "Invalid wchar_t size."
#endif

	*bytesUsed = uBytesUsed;
	*charsUsed = uCharsUsed;
	*usedDefaultChar = bUsedDefaultChar;
	targetBuf->resize(uBytesUsed);
	targetBuf.safeAddRef();
	return targetBuf;
}