DraftTemplateLoader.cpp
Upload User: kairuinn
Upload Date: 2009-02-07
Package Size: 2922k
Code Size: 7k
Category:

Graph program

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "DraftTemplateLoader.h"
  3. #include "..//Solidgraph.h"
  4. typedef struct
  5. {
  6. char  szSign[16];
  7. int   nVersion;
  8. }DRAFT_TEMPLATE_HEADER;
  9. typedef struct
  10. {
  11. int           imageType;
  12. unsigned int  imageSize;
  13. BYTE*         imageBits;
  14. }THUMBNAIL_DESCRIPTOR;
  15. CxImage*  CDraftTemplateLoader::GetThumbnailFromFile(const char* filePath)
  16. {
  17. CFile  file;
  18. CFileException  fe;
  19. if (!file.Open(filePath, CFile::modeRead, &fe))
  20. {
  21. ASSERT(0);
  22. return NULL;
  23. }
  24. DRAFT_TEMPLATE_HEADER main_header;
  25. memset(&main_header,0,sizeof(DRAFT_TEMPLATE_HEADER));
  26. if (file.Read(&main_header,sizeof(DRAFT_TEMPLATE_HEADER))!=sizeof(DRAFT_TEMPLATE_HEADER)) 
  27. {
  28. ASSERT(0);
  29. file.Close();
  30. return NULL;
  31. }
  32. if(strcmp(main_header.szSign,"DRAFT_TEMPL"))
  33. {
  34. ASSERT(0);
  35. file.Close();
  36. return NULL;
  37. }
  38. THUMBNAIL_DESCRIPTOR  th_descr;
  39. memset(&th_descr,0,sizeof(THUMBNAIL_DESCRIPTOR));
  40. if (file.Read(&th_descr.imageType,sizeof(int))!=sizeof(int)) 
  41. {
  42. ASSERT(0);
  43. file.Close();
  44. return NULL;
  45. }
  46. if (file.Read(&th_descr.imageSize,sizeof(unsigned int))!=sizeof(unsigned int)) 
  47. {
  48. ASSERT(0);
  49. file.Close();
  50. return NULL;
  51. }
  52. try
  53. {
  54. th_descr.imageBits = new BYTE[th_descr.imageSize];
  55. }
  56. catch (std::bad_alloc)
  57. {
  58. AfxMessageBox("bad_alloc exception in GetThumbnailFromFile function");
  59. ASSERT(0);
  60. file.Close();
  61. return NULL;
  62. }
  63. if (file.Read(th_descr.imageBits,th_descr.imageSize*sizeof(BYTE))!=th_descr.imageSize*sizeof(BYTE))
  64. {
  65. delete[] th_descr.imageBits;
  66. ASSERT(0);
  67. file.Close();
  68. return NULL;
  69. }
  70. CxImage* img = new CxImage(th_descr.imageBits, th_descr.imageSize, th_descr.imageType);
  71. if (!img->IsValid())
  72. {
  73. AfxMessageBox(img->GetLastError());
  74. delete img;
  75. img = NULL;
  76. delete[] th_descr.imageBits;
  77. ASSERT(0);
  78. return NULL;
  79. }
  80. delete[] th_descr.imageBits;
  81. file.Close();
  82. return img;
  83. }
  84. typedef struct
  85. {
  86. int a_f;
  87. int b_f;
  88. int c_f;
  89. int d_f;
  90. int e_f;
  91. double A_f;
  92. double B_f;
  93. double C_f;
  94. double D_f;
  95. double E_f;
  96. } TEMPLATE_RESERVE_FIELDS;
  97. static TEMPLATE_RESERVE_FIELDS templ_reserve;
  98. bool  CDraftTemplateLoader::SaveDraftTemplateInFile(const char* thumbnailFile,CDiagramEntityContainer* obj_container,
  99. const char* targetFile)
  100. {
  101. CFile f;
  102. if( !f.Open( targetFile, CFile::modeCreate | CFile::modeWrite ) ) 
  103. {
  104. return false;
  105. }
  106. CArchive ar( &f, CArchive::store);
  107. DRAFT_TEMPLATE_HEADER main_header;
  108. memset(&main_header,0,sizeof(DRAFT_TEMPLATE_HEADER));
  109. strcpy(main_header.szSign,_T("DRAFT_TEMPL"));
  110. main_header.nVersion = 1;
  111. ar.Write(&main_header,sizeof(DRAFT_TEMPLATE_HEADER));
  112. // try to write image bits
  113. {
  114. THUMBNAIL_DESCRIPTOR  th_descr;
  115. memset(&th_descr,0,sizeof(THUMBNAIL_DESCRIPTOR));
  116. CFile Picfile;
  117. CFileException fe;
  118. if (!Picfile.Open(thumbnailFile, CFile::modeRead, &fe))
  119. {
  120. ASSERT(0);
  121. ar.Close();
  122. return false;
  123. }
  124. th_descr.imageSize = (unsigned int)Picfile.GetLength();
  125. th_descr.imageType = CXIMAGE_FORMAT_JPG;
  126. try
  127. {
  128. th_descr.imageBits = new BYTE[th_descr.imageSize];
  129. }
  130. catch (std::bad_alloc) 
  131. {
  132. AfxMessageBox("bad_alloc exception in AddNewTexture function");
  133. ASSERT(0);
  134. ar.Close();
  135. return false;
  136. }
  137. if (Picfile.Read(th_descr.imageBits,th_descr.imageSize*sizeof(BYTE))!=th_descr.imageSize*sizeof(BYTE))
  138. {
  139. delete[] th_descr.imageBits;
  140. ASSERT(0);
  141. ar.Close();
  142. return false;
  143. }
  144. ar.Write(&th_descr.imageType,sizeof(int));
  145. ar.Write(&th_descr.imageSize,sizeof(unsigned int));
  146. ar.Write(th_descr.imageBits,th_descr.imageSize*sizeof(BYTE));
  147. delete[] th_descr.imageBits;
  148. Picfile.Close();
  149. }
  150. memset(&templ_reserve,0,sizeof(TEMPLATE_RESERVE_FIELDS));
  151. ar.Write(&templ_reserve,sizeof(TEMPLATE_RESERVE_FIELDS));
  152. int tmpPrM = obj_container->GetPrinterMode();
  153. ar.Write(&tmpPrM,sizeof(int));// save page orient
  154. const CSize*  pS = obj_container->GetPageSizes();
  155. ASSERT(pS->cx>0);
  156. ASSERT(pS->cy>0);
  157. ar.Write(&(pS->cx),sizeof(INT));
  158. ar.Write(&(pS->cy),sizeof(INT));
  159. // objects
  160. {
  161. int objCnt = obj_container->GetSize();
  162. for (int j=0;j<objCnt;j++)
  163. {
  164. CDiagramEntity* de = obj_container->GetAt(j);
  165. DIAGRAM_OBJECT_TYPE dot = de->GetEntityType();
  166. switch(dot) 
  167. {
  168. case DIAGRAM_LINE:
  169. case DIAGRAM_RECT:
  170. case DIAGRAM_LABEL:
  171. case DIAGRAM_PICTURE:
  172. ar.Write(&dot,sizeof(int)); // save object type
  173. de->Serialize(ar);
  174. break;
  175. default:
  176. ASSERT(0);
  177. break;
  178. }
  179. }
  180. }
  181. ar.Close();
  182. return true;
  183. }
  184. #include "..//ReportEditor/ReportEntityLine.h"
  185. #include "..//ReportEditor/ReportEntityBox.h"
  186. #include "..//ReportEditor/ReportEntityLabel.h"
  187. #include "..//ReportEditor/ReportEntityPicture.h"
  188. CDiagramEntityContainer*  CDraftTemplateLoader::LoadDraftTemplate(const char* filePath)
  189. {
  190. CFile f;
  191. if( !f.Open( filePath, CFile::modeRead ) ) 
  192. {
  193. return NULL;
  194. }
  195. CArchive ar( &f, CArchive::load);
  196. DRAFT_TEMPLATE_HEADER main_header;
  197. memset(&main_header,0,sizeof(DRAFT_TEMPLATE_HEADER));
  198. if (ar.Read(&main_header,sizeof(DRAFT_TEMPLATE_HEADER))!=sizeof(DRAFT_TEMPLATE_HEADER)) 
  199. {
  200. ASSERT(0);
  201. ar.Close();
  202. return NULL;
  203. }
  204. if(strcmp(main_header.szSign,"DRAFT_TEMPL"))
  205. {
  206. ASSERT(0);
  207. ar.Close();
  208. return NULL;
  209. }
  210. THUMBNAIL_DESCRIPTOR  th_descr;
  211. memset(&th_descr,0,sizeof(THUMBNAIL_DESCRIPTOR));
  212. if (ar.Read(&th_descr.imageType,sizeof(int))!=sizeof(int)) 
  213. {
  214. ASSERT(0);
  215. ar.Close();
  216. return NULL;
  217. }
  218. if (ar.Read(&th_descr.imageSize,sizeof(unsigned int))!=sizeof(unsigned int)) 
  219. {
  220. ASSERT(0);
  221. ar.Close();
  222. return NULL;
  223. }
  224. try
  225. {
  226. th_descr.imageBits = new BYTE[th_descr.imageSize];
  227. }
  228. catch (std::bad_alloc)
  229. {
  230. AfxMessageBox("bad_alloc exception in GetThumbnailFromFile function");
  231. ASSERT(0);
  232. ar.Close();
  233. return NULL;
  234. }
  235. if (ar.Read(th_descr.imageBits,th_descr.imageSize*sizeof(BYTE))!=th_descr.imageSize*sizeof(BYTE))
  236. {
  237. delete[] th_descr.imageBits;
  238. ASSERT(0);
  239. ar.Close();
  240. return NULL;
  241. }
  242. delete[] th_descr.imageBits;
  243. ar.Read(&templ_reserve,sizeof(TEMPLATE_RESERVE_FIELDS));
  244. int tmpPrM;
  245. ar.Read(&tmpPrM,sizeof(int));// save page orient
  246. CSize nSz;
  247. ar.Read(&(nSz.cx),sizeof(INT));
  248. ar.Read(&(nSz.cy),sizeof(INT));
  249. ASSERT(nSz.cx>0);
  250. ASSERT(nSz.cy>0);
  251. CDiagramEntityContainer* newCont = new CDiagramEntityContainer(tmpPrM,&(nSz),&( theApp.m_clip ));
  252. int    obj_t = 0;
  253. while (ar.Read(&obj_t,sizeof(int))) 
  254. {
  255. switch(obj_t) 
  256. {
  257. case DIAGRAM_LINE:
  258. {
  259. CReportEntityLine* nL = new CReportEntityLine;
  260. nL->Serialize(ar);
  261. newCont->Add(nL);
  262. }
  263. break;
  264. case DIAGRAM_RECT:
  265. {
  266. CReportEntityBox* bx = new CReportEntityBox;
  267. bx->Serialize(ar);
  268. newCont->Add(bx);
  269. }
  270. break;
  271. case DIAGRAM_LABEL:
  272. {
  273. CReportEntityLabel* lb = new CReportEntityLabel;
  274. lb->Serialize(ar);
  275. newCont->Add(lb);
  276. }
  277. break;
  278. case DIAGRAM_PICTURE:
  279. {
  280. CReportEntityPicture* pic = new CReportEntityPicture;
  281. pic->Serialize(ar);
  282. newCont->Add(pic);
  283. }
  284. break;
  285. default:
  286. ASSERT(0);
  287. ar.Close();
  288. return NULL;
  289. }
  290. }
  291. ar.Close();
  292. return newCont;
  293. }