Ejemplo n.º 1
0
CValue CValueMetadata::Method(int iName,CValue **p)
{
	CMetadata *pMeta=0;
	if(bWasOpenZip==0 && iName!=enOpen && iName!=enClose && AfxGetModuleManager()==NULL)
	{
		Error("Конфигурация не инициализирована");
	}
	if(AfxGetModuleManager())
		pMeta=AfxGetModuleManager()->pMetadata; 


	CValue Ret;
	switch(iName)
	{
		case enOpen:
			{ 
				if(bWasOpenZip)
					Close();

				CString csFileName=p[0]->GetString();
				BOOL bReadOnly=p[1]->GetNumber();

				if(!bReadOnly)
				if(!FileExist(csFileName))
				{
					try 
					{
						m_zip.Open(csFileName, CZipArchive::create,0);//Новый архив
						m_zip.Close();	
					}
					catch(...)
					{
						Error("Ошибка при попытке создания нового файла: %s",csFileName);
						return 0;
					}

				}

				if(m_zip.FileExists(csFileName))
				{
					try 
					{
						if(bReadOnly)
							m_zip.Open(csFileName, CZipArchive::openReadOnly,0);
						else
							m_zip.Open(csFileName, CZipArchive::open,0);
					}
					catch(...)
					{
						Error("Ошибка открытия файла: %s",csFileName);
						return 0;
					}
				}
				else
					Error("Не найден файл: %s",csFileName);

				m_zip.EnableFindFast(1);
				bWasOpenZip=1;
				return 1;
			}

		case enSaveData3:
			{   
				CString csPath=GetFullMetaPath(csPathObject,p[0]->GetString());
				CString csFile=p[1]->GetString();
				int nSize=0;
				char *buf=LoadFromFileBin(csFile,nSize);
				if(buf)
				{
					if(bWasOpenZip)
					{
						return ::WriteFileFromStream(buf,nSize,csFile,m_zip,p[0]->GetString(),p[2]->GetString(),p[3]->GetString(),1);
					}
					else
					{
						return pMeta->WriteFileFromStream(buf,nSize,csFile,csPath,p[2]->GetString(),p[3]->GetString());
					}
				}
			}
		case enSaveData:
		case enSaveData2:
		case enSaveText:
			{
				CString csData;
				CString csPath=GetFullMetaPath(csPathObject,p[0]->GetString());
				if(enSaveText==iName)
				{
					csData=p[1]->GetString();
				}
				else
				{
					p[1]->SaveToString(csData);
				}
				if(bWasOpenZip)
				{
					return ::WriteFileFromString(csData,m_zip,p[0]->GetString(),p[2]->GetString(),p[3]->GetString(),1);
				}
				else
				{
					return pMeta->WriteFileFromString(csData,csPath,p[2]->GetString(),p[3]->GetString());
				}
			}
		case enLoadData3:
			{
				CString csAlias,csComment;
				CString csPath=GetFullMetaPath(csPathObject,p[0]->GetString());
				CString csFile=p[1]->GetString();
				
				if(bWasOpenZip)
				{
					if(!csPath.IsEmpty())
					{
						int nRes=m_zip.FindFile(csPath);
						if(nRes>=0)
						{
							bool bRes=m_zip.OpenFile(nRes);
							CZipFileHeader fhInfo;
							m_zip.GetFileInfo(fhInfo, nRes);
							CString csDescription=fhInfo.GetComment();
							int nIndex=csDescription.Find("\n");
							csAlias=csDescription.Left(nIndex);
							csComment=csDescription.Mid(nIndex+1);
							int nSize=fhInfo.m_uUncomprSize;
							char* pBuffer=new char [nSize+1];
							pBuffer[nSize]=0;
							DWORD nRez=m_zip.ReadFile(pBuffer,nSize);
							if(FILE *sFile=fopen(csFile,"w+b"))
							{
						
								fwrite(pBuffer,sizeof(char),nSize, sFile);
								fclose(sFile);
							}
							delete []pBuffer;
							m_zip.CloseFile();
						}
					}
				}
				Ret=1;
				p[2]->SetString(csAlias);
				p[3]->SetString(csComment);

				break;
			}
		case enLoadData:
		case enLoadData2:
		case enLoadText:
			{
				CString csAlias,csComment;
				CString csPath=GetFullMetaPath(csPathObject,p[0]->GetString());
				CString csData;
				if(bWasOpenZip)
				{
					csData=::ReadFileToString(m_zip,p[0]->GetString(),csAlias,csComment);
				}
				else
				{
					csData=pMeta->ReadFileToString(csPath,csAlias,csComment);
				}
				if(enLoadText==iName)
				{
					Ret=String(csData);
				}
				else
				{
					Ret.LoadFromString(csData);
				}
				*p[1]=Ret;
				p[2]->SetString(csAlias);
				p[3]->SetString(csComment);

				break;
			}
		case enDeleteData:
			{
				CString csPath=METADATANAME+"\\"+csPathObject+p[0]->GetString();
				if(bWasOpenZip)
				{
					if(m_zip.FindFile(p[0]->GetString()))
						return ::DeleteFile(m_zip,p[0]->GetString());
					else
						return ::DeleteFolder(m_zip,p[0]->GetString());
				}
				else
				{
					return pMeta->DeleteData(csPath);
				}
			}
		case enClose:
			{
				Close();
				break;
			}
		case enGetCountEntries:
			{
				if(!bWasOpenZip)
					Error("Внешний файл метаданных не открыт");

				return m_zip.GetNoEntries();
			}
		case enGetName:
			{
				if(!bWasOpenZip)
					Error("Внешний файл метаданных не открыт");

				int n=p[0]->GetNumber();
				if(n<1 || n>m_zip.GetNoEntries())
					Error("Значение индекса выходит за границу допустимых значений");

				CZipFileHeader fhInfo;
				m_zip.GetFileInfo(fhInfo, n-1);
				return String(fhInfo.GetFileName());
			}

	}
	return Ret;
}