source: trunk/poppler/mypoppler/poppler/FileSpec.cc @ 461

Last change on this file since 461 was 277, checked in by rbri, 12 years ago

PDF plugin: Poppler library updated to version 0.12.3

File size: 3.6 KB
Line 
1//========================================================================
2//
3// FileSpec.cc
4//
5// All changes made under the Poppler project to this file are licensed
6// under GPL version 2 or later
7//
8// Copyright (C) 2008-2009 Carlos Garcia Campos <carlosgc@gnome.org>
9// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
10//
11// To see a description of the changes please see the Changelog file that
12// came with your tarball or type make ChangeLog if you are building from git
13//
14//========================================================================
15
16//========================================================================
17//
18// Most of the code from Link.cc and PSOutputDev.cc
19//
20// Copyright 1996-2003 Glyph & Cog, LLC
21//
22//========================================================================
23
24#include <config.h>
25
26#include "FileSpec.h"
27
28GBool getFileSpecName (Object *fileSpec, Object *fileName)
29{
30  if (fileSpec->isString()) {
31    fileSpec->copy(fileName);
32    return gTrue;
33  }
34 
35  if (fileSpec->isDict()) {
36    fileSpec->dictLookup("UF", fileName);
37    if (fileName->isString()) {
38      return gTrue;
39    }
40    fileName->free();
41    fileSpec->dictLookup("F", fileName);
42    if (fileName->isString()) {
43      return gTrue;
44    }
45    fileName->free();
46    fileSpec->dictLookup("DOS", fileName);
47    if (fileName->isString()) {
48      return gTrue;
49    }
50    fileName->free();
51    fileSpec->dictLookup("Mac", fileName);
52    if (fileName->isString()) {
53      return gTrue;
54    }
55    fileName->free();
56    fileSpec->dictLookup("Unix", fileName);
57    if (fileName->isString()) {
58      return gTrue;
59    }
60    fileName->free();
61  }
62  return gFalse;
63}
64
65GBool getFileSpecNameForPlatform (Object *fileSpec, Object *fileName)
66{
67  if (fileSpec->isString()) {
68    fileSpec->copy(fileName);
69    return gTrue;
70  }
71
72  if (fileSpec->isDict()) {
73    if (!fileSpec->dictLookup("UF", fileName)->isString ()) {
74      fileName->free();
75      if (!fileSpec->dictLookup("F", fileName)->isString ()) {
76        fileName->free();
77#ifdef _WIN32
78        char *platform = "DOS";
79#else
80        char *platform = "Unix";
81#endif
82        if (!fileSpec->dictLookup(platform, fileName)->isString ()) {
83          fileName->free();
84          error(-1, "Illegal file spec");
85          return gFalse;
86        }
87      }
88    }
89  } else {
90    error(-1, "Illegal file spec");
91    return gFalse;
92  }
93
94  // system-dependent path manipulation
95#ifdef _WIN32
96  int i, j;
97  GooString *name = fileName->getString();
98  // "//...."             --> "\...."
99  // "/x/...."            --> "x:\...."
100  // "/server/share/...." --> "\\server\share\...."
101  // convert escaped slashes to slashes and unescaped slashes to backslashes
102  i = 0;
103  if (name->getChar(0) == '/') {
104    if (name->getLength() >= 2 && name->getChar(1) == '/') {
105      name->del(0);
106      i = 0;
107    } else if (name->getLength() >= 2 &&
108               ((name->getChar(1) >= 'a' && name->getChar(1) <= 'z') ||
109                (name->getChar(1) >= 'A' && name->getChar(1) <= 'Z')) &&
110               (name->getLength() == 2 || name->getChar(2) == '/')) {
111      name->setChar(0, name->getChar(1));
112      name->setChar(1, ':');
113      i = 2;
114    } else {
115      for (j = 2; j < name->getLength(); ++j) {
116        if (name->getChar(j-1) != '\\' &&
117            name->getChar(j) == '/') {
118          break;
119        }
120      }
121      if (j < name->getLength()) {
122        name->setChar(0, '\\');
123        name->insert(0, '\\');
124        i = 2;
125      }
126    }
127  }
128  for (; i < name->getLength(); ++i) {
129    if (name->getChar(i) == '/') {
130      name->setChar(i, '\\');
131    } else if (name->getChar(i) == '\\' &&
132               i+1 < name->getLength() &&
133               name->getChar(i+1) == '/') {
134      name->del(i);
135    }
136  }
137#endif /* _WIN32 */
138
139  return gTrue;
140}
Note: See TracBrowser for help on using the repository browser.