OSDN Git Service

セットアップの追加、ヘルプの修正
[seraphyscrtools/SeraphyScriptTools.git] / ProfileSection.cpp
index 13f405c..8f8bfb9 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
 // CProfileSection
 
-STDMETHODIMP CProfileSection::InterfaceSupportsErrorInfo(REFIID riid)
-{
-       static const IID* arr[] = 
-       {
-               &IID_ISeraphyScriptTools_ProfileSection
-       };
-       for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
-       {
-               if (IsEqualGUID(*arr[i],riid))
-                       return S_OK;
-       }
-       return S_FALSE;
-}
-
 STDMETHODIMP CProfileSection::get_Value(VARIANT idx, VARIANT *pVal)
 {
        ::VariantInit(pVal);
+
+       ATL::CString szKeyname;
        CComVariant varIdx;
-       CHAR szKeyname[MAX_PATH] = { 0 };
-       const int siz = 1024 * 8; // 8KBytes
-       LPSTR szReturn = new CHAR[siz];
-       if(varIdx.ChangeType(VT_BSTR,&idx) == S_OK){
-               WideCharToMultiByte(GetACP(),0,varIdx.bstrVal,-1,szKeyname,MAX_PATH,NULL,NULL);
+       if (SUCCEEDED(varIdx.ChangeType(VT_BSTR, &idx))) {
+               szKeyname = varIdx.bstrVal;
        }
-       if(GetPrivateProfileString(m_szSectionName,szKeyname,"",szReturn,siz,m_szProfilePath)){
-               CComVariant ret((LPCSTR)szReturn);
-               ret.Detach(pVal);
+
+       DWORD siz = 1024 * 8; // 8KBytes
+       while (siz < 10 * 1024 * 1024) { // 10MBytes\82Ü\82Å
+               ATL::CString buf;
+               LPTSTR szReturn = buf.GetBufferSetLength(siz);
+               DWORD rdsiz = GetPrivateProfileString(
+                       m_szSectionName, szKeyname, _TEXT(""), szReturn, siz, m_szProfilePath);
+               if (rdsiz >= siz - 2) {
+                       // \83o\83b\83t\83@\83I\81[\83o\81[\82µ\82Ä\82¢\82é\89Â\94\\90«\82ª\82 \82é\82½\82ß\83o\83b\83t\83@\82ð\91å\82«\82­\82µ\82Ä\8dÄ\8e\8e\8ds\82·\82é
+                       siz *= 2;
+                       continue;
+               }
+               CComVariant ret(szReturn);
+               return ret.Detach(pVal);
        }
-       delete[]szReturn;
-       return S_OK;
+       return E_OUTOFMEMORY;
 }
 
 STDMETHODIMP CProfileSection::put_Value(VARIANT idx, VARIANT newVal)
 {
        // \83f\83B\83t\83H\83\8b\83g\82Ì\92l\82Â\82«\8eæ\93¾
-       CComVariant varIdx,varNew;
-       CHAR szKeyname[MAX_PATH] = { 0 };
-       const int siz = 1024 * 8; // 8KBytes
-       LPSTR szWrite = new CHAR[siz+1];
-       if(varIdx.ChangeType(VT_BSTR,&idx) == S_OK){
-               WideCharToMultiByte(GetACP(),0,varIdx.bstrVal,-1,szKeyname,MAX_PATH,NULL,NULL);
+
+       ATL::CString szKeyname;
+       CComVariant varIdx;
+       if (SUCCEEDED(varIdx.ChangeType(VT_BSTR, &idx))) {
+               szKeyname = varIdx.bstrVal;
        }
-       if(varNew.ChangeType(VT_BSTR,&newVal) == S_OK){
-               int cnt = WideCharToMultiByte(GetACP(),0,varNew.bstrVal,-1,szWrite,siz,NULL,NULL);
-               szWrite[cnt] = 0;
+
+       ATL::CString szWrite;
+       CComVariant varNew;
+       if (SUCCEEDED(varNew.ChangeType(VT_BSTR, &newVal))) {
+               szWrite = varNew.bstrVal;
        }
-       WritePrivateProfileString(m_szSectionName,szKeyname,szWrite,m_szProfilePath);
-       delete[]szWrite;
+
+       WritePrivateProfileString(
+               m_szSectionName, szKeyname, szWrite, m_szProfilePath);
        return S_OK;
 }
 
-STDMETHODIMP CProfileSection::GetValue(VARIANT idx, VARIANT def,VARIANT* pVal)
+STDMETHODIMP CProfileSection::GetValue(VARIANT idx, VARIANT def, VARIANT* pVal)
 {
        // \83f\83B\83t\83H\83\8b\83g\82Ì\92l\82Â\82«\8eæ\93¾
        ::VariantInit(pVal);
-       CComVariant varIdx,varDef;
-       CHAR szKeyname[MAX_PATH] = { 0 };
-       CHAR szDefault[MAX_PATH] = { 0 };
-       const int siz = 1024 * 8; // 8KBytes
-       LPSTR szReturn = new CHAR[siz];
-       if(varIdx.ChangeType(VT_BSTR,&idx) == S_OK){
-               WideCharToMultiByte(GetACP(),0,varIdx.bstrVal,-1,szKeyname,MAX_PATH,NULL,NULL);
+
+       ATL::CString szKeyname;
+       CComVariant varIdx;
+       if (SUCCEEDED(varIdx.ChangeType(VT_BSTR, &idx))) {
+               szKeyname = varIdx.bstrVal;
        }
-       if(varDef.ChangeType(VT_BSTR,&def) == S_OK){
-               WideCharToMultiByte(GetACP(),0,varDef.bstrVal,-1,szDefault,MAX_PATH,NULL,NULL);
+
+       ATL::CString szDefault;
+       CComVariant varDef;
+       if (SUCCEEDED(varDef.ChangeType(VT_BSTR, &def))) {
+               szDefault = varDef.bstrVal;
        }
-       if(GetPrivateProfileString(m_szSectionName,szKeyname,szDefault,szReturn,siz,m_szProfilePath)){
-               CComVariant ret((LPCSTR)szReturn);
-               ret.Detach(pVal);
+
+       DWORD siz = 1024 * 8; // 8KBytes
+       while (siz < 10 * 1024 * 1024) { // 10MBytes\82Ü\82Å
+               ATL::CString buf;
+               LPTSTR szReturn = buf.GetBufferSetLength(siz);
+               DWORD rdsiz = GetPrivateProfileString(
+                       m_szSectionName, szKeyname, szDefault, szReturn, siz, m_szProfilePath);
+               if (rdsiz >= siz - 2) {
+                       // \83o\83b\83t\83@\83I\81[\83o\81[\82µ\82Ä\82¢\82é\89Â\94\\90«\82ª\82 \82é\82½\82ß\83o\83b\83t\83@\82ð\91å\82«\82­\82µ\82Ä\8dÄ\8e\8e\8ds\82·\82é
+                       siz *= 2;
+                       continue;
+               }
+               CComVariant ret(szReturn);
+               return ret.Detach(pVal);
        }
-       delete[]szReturn;
-       return S_OK;
+       return E_OUTOFMEMORY;
 }
 
 STDMETHODIMP CProfileSection::GetKeyNames(VARIANT *pVal)
 {
        // \83L\81[\96¼\82Ì\97ñ\8b\93\82ð\8ds\82¤
-       DWORD siz = 4096;
        DWORD oldsiz = 0;
        DWORD retsiz = 0;
-       LPSTR pBuf = new CHAR[siz];
-       while(  (retsiz  = GetPrivateProfileSection(m_szSectionName,pBuf,siz,m_szProfilePath)) &&
-                       (retsiz == (siz - 2)) && ( oldsiz != retsiz ) ){
-               oldsiz = siz;
-               siz *= 2;
-               delete []pBuf;
-               pBuf = new CHAR[siz];
+
+       ATL::CString buf;
+       LPTSTR pBuf = NULL;
+
+       DWORD siz = 4096;
+       while (siz < 10 * 1024 * 1024) { // 10MBytes\82Ü\82Å
+               pBuf = buf.GetBufferSetLength(siz);
+               DWORD rdsiz = retsiz = GetPrivateProfileSection(
+                       m_szSectionName, pBuf, siz, m_szProfilePath);
+               if (rdsiz >= siz - 2) {
+                       // \83o\83b\83t\83@\83I\81[\83o\81[\82µ\82Ä\82¢\82é\89Â\94\\90«\82ª\82 \82é\82½\82ß\83o\83b\83t\83@\82ð\91å\82«\82­\82µ\82Ä\8dÄ\8e\8e\8ds\82·\82é
+                       siz *= 2;
+                       continue;
+               }
+               break;
        }
-       // \83J\83E\83\93\83g\82·\82é
-       LPSTR p = pBuf;
+
+       // \83_\83u\83\8b\83k\83\8b\8fI\92[\95\8e\9a\97ñ\82©\82ç\81A\83A\83C\83e\83\80\90\94\82ð\83J\83E\83\93\83g\82·\82é
+       LPTSTR p = pBuf;
        long count = 0;
-       while(*p){
+       while (*p) {
                count++;
-               while(*p++);
+               while (*p++);
        }
+
        // \88ê\8e\9f\94z\97ñ\82Ì\90\90¬
-       SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT,0,count);
+       SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT, 0, count);
        long idx = 0;
        p = pBuf;
-       while(*p){
-               CComVariant tmp;
-               LPCSTR pb = p;
-               while(*p){
-                       if(*p == '='){
+       while (*p) {
+               LPCTSTR pb = p;
+               while (*p) {
+                       if (*p == '=') {
+                               // \83L\81[\96¼\82¾\82¯\82É\82·\82é(value\92l\82Í\96³\8e\8b)
                                *p = 0;
                        }
                        p++;
                }
-               p++;
-               tmp = (LPCSTR)pb;
-               SafeArrayPutElement(pArray,&idx,&tmp);
-               tmp.Clear();
+               p++; // \8e\9f\82Ì\83A\83C\83e\83\80\82Ì\90æ\93ª\82É\83A\83h\83\8c\83X\82·\82é
+
+               // \83L\81[\96¼\82ð\94z\97ñ\82É\93o\98^\82·\82é.
+               CComVariant tmp(pb);
+               SafeArrayPutElement(pArray, &idx, &tmp);
                idx++;
        }
-       delete[]pBuf;
+
        // \96ß\82è\92l
        ::VariantInit(pVal);
-       pVal->vt     = VT_VARIANT | VT_ARRAY;
+       pVal->vt = VT_VARIANT | VT_ARRAY;
        pVal->parray = pArray;
        return S_OK;
 }