00001
00008 #define DKUTIL_C_TELECOM_CONFIRM_FILE_C
00009 #include "dkcTelecomConfirmFile.h"
00010 #include "dkcMath.h"
00011
00012
00013 #if 0
00014
00015
00016 DKC_INLINE DKC_TELECOM_CONFIRM_FILE* WINAPI dkcAllocTelecomConfirmFileGenerate(uint32 version,size_t lzw_output_block_size)
00017 {
00018 DKC_TELECOM_CONFIRM_FILE *p;
00019 if(dkcmTelecomConfirmFileVersionError(version)){return NULL;}
00020 p = dkcAllocate(sizeof(DKC_TELECOM_CONFIRM_FILE));
00021 if(NULL==p){return NULL;}
00022
00023
00024 p->mLZW = dkcAllocLZW(lzw_output_block_size);
00025
00026 p->mMD5 = dkcAllocMD5();
00027
00028
00029 p->mSHA512 = dkcAllocSHA512();
00030 p->mBuff = dkcAllocBuffer(NULL,dkcdTELECOM_CONFIRM_FILE_BEGIN_BUFFER_SIZE);
00031 if(NULL==p->mSHA512 || NULL==p->mMD5 || NULL==p->mLZW || NULL==p->mBuff){
00032 goto Error;
00033 }
00034 p->version = version;
00035 p->block_num = 0;
00036 p->lzw_output_block_size = lzw_output_block_size;
00037 return p;
00038 Error:
00039 dkcFreeTelecomConfirmFile(&p);
00040 return NULL;
00041 }
00042
00043 DKC_INLINE DKC_TELECOM_CONFIRM_FILE *WINAPI dkcAllocTelecomConfirmFileExtract(DKC_STREAM *input)
00044 {
00045
00046
00047 }
00048
00049 DKC_INLINE int WINAPI dkcFreeTelecomConfirmFile(DKC_TELECOM_CONFIRM_FILE **pp){
00050
00051 DKC_TELECOM_CONFIRM_FILE *p = *pp;
00052 if(NULL==pp || NULL==p) return edk_FAILED;
00053 if(p->mBuff){dkcFreeBuffer(&(p->mBuff));}
00054 if(p->mLZW){dkcFreeLZW(&(p->mLZW));}
00055 if(p->mMD5){dkcFreeMD5(&(p->mMD5));}
00056 if(p->mSHA512){dkcFreeSHA512(&(p->mSHA512));}
00057 return dkcFree(&p);
00058 }
00059
00060 DKC_INLINE int WINAPI dkcTelecomConfirmFileInit(DKC_TELECOM_CONFIRM_FILE *p,DKC_STREAM *pstream)
00061 {
00062 int r;
00063 dkcMD5Init(p->mMD5);
00064 dkcSHA512Init(p->mSHA512);
00065 r = dkcBufferResize(p->mBuff,dkcdTELECOM_CONFIRM_FILE_BEGIN_BUFFER_SIZE);
00066 if(DKUTIL_FAILED(r)) return r;
00067 if(pstream){
00068 dkcmFAILED_CHECK_RETURN(r,dkcStreamSeek(pstream,0,edkcStreamSeekSet));
00069 }
00070 p->block_num = 0;
00071 return edk_SUCCEEDED;
00072 }
00073
00074 DKC_INLINE int WINAPI dkcTelecomConfirmFileGenerateBegin(DKC_TELECOM_CONFIRM_FILE *p,DKC_STREAM *output)
00075 {
00076
00077 if(0 != dkcStreamTell(output)){
00078 return edk_LogicError;
00079 }
00080 r = dkcStreamSeek(output,sizeof(DKC_TELECOM_CONFIRM_FILE_HEADER01),edkcStreamCurrent);
00081 if(DKUTIL_FAILED(r)) return r;
00082 return r;
00083 }
00084
00085 static DKC_INLINE int tcpf_generate_output_block_version01(DKC_TELECOM_CONFIRM_FILE *p,DKC_STREAM *output,const uint8 *src,size_t ssize)
00086 {
00087 int r;
00088 DKC_LZW_HEADER lzw_header;
00089 DKC_TELECOM_CONFIRM_FILE_BLOCK01 block;
00090
00091 if(p->mBuff->mSize < ssize){
00092 r = dkcBufferResize(p->mBuff,ssize);
00093 if(DKUTIL_FAILED(r)){
00094 return r;
00095 }
00096 }
00097
00098 dkcSHA512Load(p->mSHA512,src,ssize);
00099
00100 {
00101
00102 dkcMD5Init(p->mMD5);
00103 dkcmFAILED_CHECK_RETURN(r,dkcMD5Load(p->mMD5,src,ssize));
00104 dkcmFAILED_CHECK_RETURN(r,dkcMD5FinalDigest(p->mMD5,block.origin_md5,sizeof(block.origin_md5)));
00105
00106
00107 }
00108
00109 r = dkcLZWEncode(p->mLZW,&lzw_header,p->mBuff->mBuff,p->mBuff->mSize,
00110 src,ssize,UINT_MAX,'LZW',edkcLZW_Default);
00111
00112 if(DKUTIL_FAILED(r)) return r;
00113
00114
00115 {
00116
00117 dkcMD5Init(p->mMD5);
00118 dkcmFAILED_CHECK_RETURN(r,dkcMD5Load(p->mMD5,p->mBuff->mBuff,lzw_header.mCompressedSize));
00119 dkcmFAILED_CHECK_RETURN(r,dkcMD5FinalDigest(p->mMD5,block.compress_md5,sizeof(block.compress_md5)));
00120
00121 }
00122 memcpy(&(block.lzw_header),&lzw_header,sizeof(block.lzw_header));
00123 dkcmFAILED_CHECK_RETURN(r,dkcStreamWrite(output,&block,sizeof(block)));
00124 dkcmFAILED_CHECK_RETURN(r,dkcStreamWrite(output,p->mBuff->mBuff,lzw_header.mCompressedSize);
00125
00126 p->block_num++;
00127 return edk_SUCCEEDED;
00128 }
00129
00130 DKC_INLINE int WINAPI dkcTelecomConfirmFileGenerateOutputBlock(DKC_TELECOM_CONFIRM_FILE *p,DKC_STREAM *output,const uint8 *src,size_t ssize)
00131 {
00132 int r;
00133 switch(p->version){
00134 case edkcTelecomConfirmFileVersion01:
00135 r = tcpf_generate_output_block_version01(p,output,src,ssize);
00136 break;
00137 default:
00138 return edk_LogicError;
00139 }
00140 return r;
00141 }
00142 static DKC_INLINE int tcpf_generate_final(DKC_TELECOM_CONFIRM_FILE *p,DKC_STREAM *output)
00143 {
00144 int r;
00145 DKC_TELECOM_CONFIRM_FILE_HEADER01 header;
00146 uint64 length = dkcStreamTell64(output);
00147 dkcmFAILED_CHECK_RETURN(r,dkcStreamSeek(output,0,edkcStreamSeekSet));
00148 dkcSHA512FinalDigest(p->mSHA512,header.origin_sig,sizeof(header.origin_sig));
00149 header.lzw_output_block_size = p->lzw_output_block_size;
00150 header.length
00151
00152 }
00153
00154 DKC_INLINE int WINAPI dkcTelecomConfirmFileGenerateFinal(DKC_TELECOM_CONFIRM_FILE *p,DKC_STREAM *output)
00155 {
00156 int r;
00157 switch(p->version){
00158 case edkcTelecomConfirmFileVersion01:
00159 r = tcpf_generate_final(p,output);
00160 break;
00161 default:
00162 return edk_LogicError;
00163 }
00164 return r;
00165
00166 }
00167
00168
00169 DKC_INLINE int WINAPI dkcTelecomConfirmFileGetHeader(DKC_STREAM *input,DKC_TELECOM_CONFIRM_FILE_HEADER *header);
00170
00171 DKC_INLINE int WINAPI dkcTelecomConfirmFileGetBlock(DKC_STREAM *input,DKC_TELECOM_CONFIRM_FILE_BLOCK *block);
00172
00173
00174 DKC_INLINE int WINAPI dkcTelecomConfirmFileExtractOutputBlock(
00175 DKC_TELECOM_CONFIRM_FILE *p,DKC_STREAM *input,const DKC_TELECOM_CONFIRM_FILE_BLOCK *block,
00176 uint8 *buff,size_t buffsize
00177 );
00178
00179
00180 DKC_INLINE int WINAPI dkcTelecomConfirmFileEncode(const char *dest_filename,const char *src_filename);
00181
00182
00183 DKC_INLINE int WINAPI dkcTelecomConfirmFileDecode(const char *dest_filename,const char *src_filename);
00184
00185
00186 DKC_INLINE size_t WINAPI dkcTelecomConfirmFileGetDecodeSize(const char *filename);
00187
00188 #endif