]> icculus.org git repositories - taylor/freespace2.git/blob - src/globalincs/version.cpp
add cfileutil for working with VP files
[taylor/freespace2.git] / src / globalincs / version.cpp
1 /*
2  * Copyright (C) Volition, Inc. 1999.  All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell 
5  * or otherwise commercially exploit the source or things you created based on
6  * the source.
7  */
8
9 /*
10  * $Logfile: /Freespace2/code/GlobalIncs/version.cpp $
11  * $Revision$
12  * $Date$
13  * $Author$
14  *
15  *
16  * $Log$
17  * Revision 1.3  2002/06/09 04:41:17  relnev
18  * added copyright header
19  *
20  * Revision 1.2  2002/05/07 03:16:45  theoddone33
21  * The Great Newline Fix
22  *
23  * Revision 1.1.1.1  2002/05/03 03:28:09  root
24  * Initial import.
25  *
26  * 
27  * 4     8/09/99 2:21p Andsager
28  * Fix patching from multiplayer direct to launcher update tab.
29  * 
30  * 3     8/06/99 3:32p Andsager
31  * Handle update when no registry is set
32  * 
33  * 2     5/19/99 4:07p Dave
34  * Moved versioning code into a nice isolated common place. Fixed up
35  * updating code on the pxo screen. Fixed several stub problems.
36  * 
37  * 1     5/18/99 4:28p Dave
38  * 
39  * $NoKeywords: $
40  */
41
42 #include <stdio.h>
43 #include <string.h>
44 #include "version.h"
45 #include "osregistry.h"
46 #include "pstypes.h"
47 #include "cfile.h"
48
49 // ----------------------------------------------------------------------------------------------------------------
50 // VERSION DEFINES/VARS
51 //
52
53 // Defines
54 #define VER(major, minor, build) (100*100*major+100*minor+build)
55 #define MAX_LINE_LENGTH 512
56
57
58 // ----------------------------------------------------------------------------------------------------------------
59 // VERSION FUNCTIONS
60 //
61
62 // compare version against the passed version file
63 // returns -1 on error 
64 // 0 if we are an earlier version
65 // 1 if same version
66 // 2 if higher version
67 // fills in user version and latest version values if non-NULL
68 int version_compare(const char *filename, int *u_major, int *u_minor, int *u_build, int *l_major, int *l_minor, int *l_build)
69 {       
70         int usr_major, usr_minor, usr_build;
71         int latest_major, latest_minor, latest_build;
72
73         // open file and try backup, if needed
74         CFILE *f = cfopen(filename, "rt", CFILE_NORMAL, CF_TYPE_DATA);
75         if (f == NULL) {
76                 return -1;              
77         }
78
79         // grab the last line in file which isn't empty and isn't a comment
80         char buffer[MAX_LINE_LENGTH+1], verbuffer[MAX_LINE_LENGTH+1];
81
82         SDL_strlcpy(verbuffer, "", SDL_arraysize(verbuffer));
83         SDL_strlcpy(buffer, "", SDL_arraysize(buffer));
84         while ( !cfeof(f) ) {
85                 // Read the line into a temporary buffer
86                 if ( cfgets(buffer, MAX_LINE_LENGTH, f) == NULL ) {
87                         break;
88                 }
89
90                 // take the \n off the end of it
91                 if (strlen(buffer)>0 && buffer[strlen(buffer) - 1] == '\n')
92                         buffer[strlen(buffer) - 1] = 0;
93
94                 // If the line is empty, go get another one
95                 if (strlen(buffer) == 0) continue;
96
97                 // If the line is a comment, go get another one
98                 if (buffer[0] == VERSION_FILE_COMMENT_CHAR) continue;
99
100                 // Line is a good one, so save it...
101                 SDL_strlcpy(verbuffer, buffer, SDL_arraysize(verbuffer));
102         }
103         cfclose(f);
104
105         // Make sure a version line was found
106         if (strlen(verbuffer) == 0) {
107                 // MessageBox(XSTR("Couldn't parse Version file!", 1205), XSTR("Error!", 1185), MB_OK|MB_ICONERROR);
108                 return -1;
109         }
110
111         // Get the most up to date Version number
112         latest_major = 0;
113         latest_minor = 0;
114         latest_build = 0;
115
116         if (sscanf(verbuffer, "%i %i %i", &latest_major, &latest_minor, &latest_build) != 3) {
117                 // MessageBox(XSTR("Couldn't parse Version file!", 1205), XSTR("Error!", 1185), MB_OK|MB_ICONERROR);
118                 return -1;
119         }
120
121         // retrieve the user's current version
122         usr_major = os_config_read_uint("Version", "Major", 0);
123         usr_minor = os_config_read_uint("Version", "Minor", 0);
124         usr_build = os_config_read_uint("Version", "Build", 0);
125         
126         // Make sure the user's Version was found!
127         if ( VER(usr_major, usr_minor, usr_build) == 0 ) {
128                 // MessageBox(XSTR("The Freespace 2 Auto-Update program could not find your current game Version in the system registry.\n\nThis should be corrected by starting up the game, exiting the game, and then running the Auto-Update program.", 1206), XSTR("Unable to Determine User's Version", 1207), MB_OK|MB_ICONERROR);
129                 return NO_VERSION_IN_REGISTRY;
130         }       
131
132         // stuff outgoing values
133         if(u_major != NULL){
134                 *u_major = usr_major;
135         }
136         if(u_minor != NULL){
137                 *u_minor = usr_minor;
138         }
139         if(u_build != NULL){
140                 *u_build = usr_build;
141         }
142         if(l_major != NULL){
143                 *l_major = latest_major;
144         }
145         if(l_minor != NULL){
146                 *l_minor = latest_minor;
147         }
148         if(l_build != NULL){
149                 *l_build = latest_build;
150         }
151
152         // check to see if the user's version is up to date
153         if (VER(usr_major, usr_minor, usr_build) < VER(latest_major, latest_minor, latest_build)) {             
154                 return 0;
155         }
156
157         // same version
158         return 1;
159 }
160