00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <gtk/gtk.h>
00036 #include <time.h>
00037
00038 #include "FileManager.h"
00039 #include "ScribbleDefine.h"
00040 #include "ScribbleLog.h"
00041 #include "ScribbleUtils.h"
00042
00043
00044
00045 int getTemplName(char* sTmpl,int iSize,const char* sTmplPathName)
00046 {
00047 int iLenOfSuffix=strlen(".bmp");
00048 if( NULL==sTmplPathName || strlen(sTmplPathName)<=iLenOfSuffix )
00049 return -1;
00050
00051 GetFileNameFromFullName(sTmpl,iSize,sTmplPathName);
00052
00053 sTmpl[strlen(sTmpl)-iLenOfSuffix]=0;
00054 return 0;
00055 }
00056
00057 int getUniqNameForSCRIB(PFileManager pFM)
00058 {
00059 char sTmpl[MAX_FILENAME];
00060 if( 0!=getTemplName(sTmpl,sizeof(sTmpl),pFM->sTmplPathName) )
00061 {
00062 SB_ERRORPRINTF("invalid template name\n%s",pFM->sTmplPathName);
00063 return -1;
00064 }
00065
00066 char outstr[200];
00067 time_t iTime;
00068 time(&iTime);
00069
00070 char* sScribName=pFM->manifest.sScribbleName;
00071 int iSize=sizeof(pFM->manifest.sScribbleName);
00072
00073 unsigned int i=0;
00074 while(i++<60)
00075 {
00076 GetStrFromTime(outstr,sizeof(outstr),iTime);
00077 memset(sScribName,0,iSize);
00078 snprintf(sScribName,iSize,"%s_%s",sTmpl,outstr);
00079
00080 if(!FileExist2(sScribName,pFM->sDataDir))
00081 {
00082 SB_FMPRINTF("SCRIB=%s\n",sScribName);
00083 return 0;
00084 }
00085 iTime++;
00086 }
00087 return -1;
00088 }
00089
00090
00091 gboolean isPageNameExisted(Manifest *pManifest,const char* sPageName)
00092 {
00093 if( NULL==pManifest) return FALSE;
00094
00095 PScribPage pCurrPage=pManifest->pFirstScribPage;
00096 while(pCurrPage)
00097 {
00098 if( 0==strcmp(pCurrPage->sPageName,sPageName) )
00099 {
00100 return TRUE;
00101 }
00102 pCurrPage=pCurrPage->pNextPage;
00103 }
00104 return FALSE;
00105 }
00106
00107
00108 int getNewPageName(ScribPage *pScribPage,Manifest *pManifest)
00109 {
00110 char outstr[200];
00111 time_t iTime;
00112 unsigned int iSize=sizeof(pScribPage->sPageName);
00113
00114 if( NULL==pScribPage || NULL==pManifest) return -1;
00115
00116 memset(pScribPage->sPageName,0,iSize);
00117 time(&iTime);
00118
00119 int i=0;
00120 SB_FMPRINTF("start get spagename,time=%d\n",(unsigned int)iTime);
00121 while(i++<500)
00122 {
00123 GetStrFromTime(outstr,sizeof(outstr),iTime);
00124 if(!isPageNameExisted(pManifest,outstr))
00125 {
00126 strncpy(pScribPage->sPageName,outstr,iSize-1);
00127 SB_FMPRINTF("sPageName=%s\n",pScribPage->sPageName);
00128 return 0;
00129 }
00130 iTime++;
00131 }
00132 return -1;
00133 }
00134
00135
00136
00137 PScribPage getCurrScribPage(PFileManager pFM)
00138 {
00139 return pFM->pCurrPage;
00140 }
00141
00142
00143 const char* getCurrImgFileName(PFileManager pFM)
00144 {
00145 return getCurrScribPage(pFM)->sImgFileName;
00146 }
00147
00148 gboolean isPageNoValid(PFileManager pFM,const int iPageNo)
00149 {
00150 return ( iPageNo>0 && iPageNo<=getTotalPage(pFM));
00151 }
00152
00153
00154 PScribPage getScribPage(PFileManager pFM,const int iPageNo)
00155 {
00156
00157
00158 if( !isPageNoValid(pFM,iPageNo) ) return NULL;
00159 int iCurr=getCurrPageNo(pFM);
00160 if( iPageNo==iCurr && isPageNoValid(pFM,iCurr))
00161 {
00162 return pFM->pCurrPage;
00163 }
00164 PScribPage pCurr=pFM->pCurrPage;
00165 if( iCurr>iPageNo || iCurr<1)
00166 {
00167 pCurr=pFM->manifest.pFirstScribPage;
00168 iCurr=1;
00169 }
00170
00171 while( iCurr!=iPageNo && iCurr<=getTotalPage(pFM))
00172 {
00173 pCurr=pCurr->pNextPage;
00174 iCurr++;
00175 }
00176
00177 return pCurr;
00178 }
00179
00180
00181
00182 PScribPage jumptoScribPage(PFileManager pFM,int iPageNo)
00183 {
00184 SB_FMPRINTF("jumpto pageno:%d[total=%d,curropen=%d]\n",
00185 iPageNo,getTotalPage(pFM),getCurrPageNo(pFM));
00186
00187 if( iPageNo<1 ) iPageNo=1;
00188
00189 if( iPageNo>getTotalPage(pFM) ) iPageNo=getTotalPage(pFM);
00190
00191 PScribPage pPage=getScribPage(pFM,iPageNo);
00192
00193 if( NULL!=pPage )
00194 {
00195 pFM->iCurrOpenPage=iPageNo;
00196 pFM->pCurrPage=pPage;
00197 }
00198 SB_FMPRINTF("jump done.pageno=%d[pPage==NULL?%d]\n",
00199 iPageNo,NULL==pPage);
00200 return pPage;
00201 }
00202
00203
00204
00205
00206 int insertNewPage(PFileManager pFM,int iPageNo,const char* sImgName)
00207 {
00208 int iTotalPage=getTotalPage(pFM);
00209 SB_FMPRINTF("insert %d.current[total=%d,curropen=%d]\n",
00210 iPageNo,getTotalPage(pFM),getCurrPageNo(pFM));
00211 if( iPageNo<1 || iPageNo>(1+iTotalPage) )
00212 {
00213 SB_WARNPRINTF("invalid pageno:%d[total=%d,curropen=%d]\n",
00214 iPageNo,iTotalPage,getCurrPageNo(pFM));
00215 return -1;
00216 }
00217 ScribPage *pScribPage=(ScribPage *)malloc(sizeof(ScribPage));
00218 if( NULL==pScribPage)
00219 {
00220 SB_ERRORPRINTF("error when malloc space\n");
00221 return -1;
00222 }
00223 memset(pScribPage,0,sizeof(ScribPage));
00224 if( 0!=getNewPageName(pScribPage,&pFM->manifest) )
00225 {
00226 SB_ERRORPRINTF("error when get new page name\n");
00227 free(pScribPage);
00228 return -1;
00229 }
00230
00231 pScribPage->pink=construct_ink();
00232 assert(pScribPage->pink);
00233
00234 const char *sCurrImgName=sImgName;
00235 if( isStrEmpty(sImgName) )
00236 {
00237 sCurrImgName=pFM->sTmplPathName;
00238 }
00239
00240 strcpy( pScribPage->sImgFileName,sCurrImgName);
00241
00242
00243 ScribPage *pPrevScribPage=getScribPage(pFM,iPageNo-1);
00244 if( NULL==pPrevScribPage)
00245 {
00246 pScribPage->pNextPage=pFM->manifest.pFirstScribPage;
00247 pFM->manifest.pFirstScribPage=pScribPage;
00248 }
00249 else
00250 {
00251 pScribPage->pNextPage=pPrevScribPage->pNextPage;
00252 pPrevScribPage->pNextPage=pScribPage;
00253 }
00254
00255 pFM->manifest.iTotalPages++;
00256
00257 if( iPageNo<=getCurrPageNo(pFM))
00258 {
00259 pFM->iCurrOpenPage++;
00260 }
00261
00262 pFM->bNeedSaveManifest=TRUE;
00263 SB_FMPRINTF("insert %d done.current[total=%d,curropen=%d]\n",
00264 iPageNo,getTotalPage(pFM),getCurrPageNo(pFM));
00265 return 0;
00266 }
00267
00268
00269 int insertNewPageAfterCurr(PFileManager pFM)
00270 {
00271 return insertNewPage(pFM,pFM->iCurrOpenPage+1,getCurrImgFileName(pFM));
00272 }
00273
00274
00275 int deleteRelatedFiles(PFileManager pFM,ScribPage *pScribPage)
00276 {
00277 if( NULL==pScribPage) return -1;
00278
00279 char sFileName[MAX_PATHNAME+1];
00280
00281
00282 get_result_filename (sFileName, sizeof(sFileName),pFM,pScribPage );
00283 if( 0!=FileDel(sFileName) )
00284 {
00285 SB_ERRORPRINTF("del result file[%s] fail\n",sFileName);
00286 return -1;
00287 }
00288 return 0;
00289 }
00290
00291 void freeScribPage(PScribPage pPage)
00292 {
00293
00294 if(pPage->pink)
00295 {
00296 free(pPage->pink);
00297 pPage->pink=NULL;
00298 }
00299 free(pPage);
00300 }
00301
00302
00303
00304 int deletePage(PFileManager pFM, int iPageNo)
00305 {
00306
00307 int iTotalPage=getTotalPage(pFM);
00308 if( !isPageNoValid(pFM,iPageNo) )
00309 {
00310 SB_ERRORPRINTF("invalid pageno:%d[total=%d,curropen=%d]\n",
00311 iPageNo,iTotalPage,getCurrPageNo(pFM));
00312 return -1;
00313 }
00314 if( 1==iTotalPage )
00315 {
00316 SB_WARNPRINTF("only 1 page,resuse to del\n");
00317 return -1;
00318 }
00319
00320 ScribPage *pScribPage=getScribPage(pFM,iPageNo);
00321 if( NULL==pScribPage )
00322 {
00323 SB_ERRORPRINTF("sth error?[tobe del=%d,total=%d,curr=%d]\n",
00324 iPageNo,iTotalPage,getCurrPageNo(pFM));
00325 return -1;
00326 }
00327 ScribPage *pPrevScribPage=getScribPage(pFM,iPageNo-1);
00328 if( NULL==pPrevScribPage )
00329 {
00330 pFM->manifest.pFirstScribPage=pScribPage->pNextPage;
00331 }
00332 else
00333 {
00334 pPrevScribPage->pNextPage=pScribPage->pNextPage;
00335 }
00336
00337 deleteRelatedFiles(pFM,pScribPage);
00338
00339 fm_deleteOnePage(pFM,pScribPage);
00340
00341 freeScribPage(pScribPage);
00342 pScribPage=NULL;
00343
00344
00345 pFM->manifest.iTotalPages--;
00346
00347
00348 int iCurrPage=getCurrPageNo(pFM);
00349 if( iPageNo<iCurrPage )
00350 {
00351 pFM->iCurrOpenPage--;
00352 }
00353 if( iPageNo==iCurrPage )
00354 {
00355
00356 pFM->pCurrPage=pFM->manifest.pFirstScribPage;
00357 jumptoScribPage(pFM,1);
00358 }
00359 pFM->bNeedSaveManifest=TRUE;
00360
00361 return 0;
00362 }
00363
00364
00365
00366
00367 int deleteCurrPage(PFileManager pFM)
00368 {
00369 return deletePage( pFM,getCurrPageNo(pFM) );
00370 }
00371
00372
00373
00374 int getTotalPage(PFileManager pFM)
00375 {
00376 return pFM->manifest.iTotalPages;
00377 }
00378
00379 int getCurrPageNo(PFileManager pFM)
00380 {
00381 return pFM->iCurrOpenPage;
00382 }
00383
00384 void fm_setIrxInkDirty(PFileManager pFM,gboolean bDirty)
00385 {
00386 pFM->manifest.bNeedSaveIrx=bDirty;
00387 }
00388
00389 void setCurrentPageDirty(PFileManager pFM,gboolean bDirty)
00390 {
00391 getCurrScribPage(pFM)->bDirty=bDirty;
00392 if(bDirty)
00393 {
00394 fm_setIrxInkDirty(pFM,TRUE);
00395 }
00396 }